diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index de74ad13308..757c51a23ab 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -86,6 +86,21 @@ //#define WHISPER 209 // causes quiet whispering #define DIZZY 210 // Trippy. +#define LISP 300 +#define RADIOACTIVE 301 +#define CHAV 302 +#define SWEDISH 303 +#define SCRAMBLED 304 +#define HORNS 305 +#define IMMOLATE 306 +#define CLOAK 307 +#define CHAMELEON 308 +#define CRYO 309 +#define EATER 310 + +#define JUMPY 400 +#define POLYMORPH 401 + //disabilities #define NEARSIGHTED 1 #define EPILEPSY 2 diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index f2bbb5df6c1..63cf67b20e6 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -19,6 +19,10 @@ //Lower left, persistant menu #define ui_inventory "WEST:6,SOUTH:5" +//Middle left indicators +#define ui_lingchemdisplay "WEST:6,CENTER-1:15" +#define ui_lingstingdisplay "WEST:6,CENTER-3:11" + //Lower center, persistant menu #define ui_sstore1 "CENTER-5:10,SOUTH:5" #define ui_id "CENTER-4:12,SOUTH:5" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 7c1e933bfcd..f78bfd929a1 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -94,6 +94,8 @@ var/datum/global_hud/global_hud = new() var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) var/obj/screen/lingchemdisplay + var/obj/screen/lingstingdisplay + var/obj/screen/blobpwrdisplay var/obj/screen/blobhealthdisplay var/obj/screen/vampire_blood_display @@ -234,6 +236,8 @@ datum/hud/New(mob/owner) src.client.screen -= src.internals src.client.screen -= src.healthdoll src.client.screen -= src.gun_setting_icon + src.client.screen -= src.hud_used.lingstingdisplay + src.client.screen -= src.hud_used.lingchemdisplay //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. src.client.screen -= src.zone_sel //zone_sel is a mob variable for some reason. @@ -254,6 +258,10 @@ datum/hud/New(mob/owner) src.client.screen |= src.internals if(src.gun_setting_icon) src.client.screen |= src.gun_setting_icon + if(src.hud_used.lingstingdisplay) + src.client.screen |= src.hud_used.lingstingdisplay + if(src.hud_used.lingchemdisplay) + src.client.screen |= src.hud_used.lingchemdisplay src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position src.client.screen += src.zone_sel //This one is a special snowflake diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 0c36b29db06..7236feb439f 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -25,6 +25,20 @@ var/mob/living/carbon/human/H = usr H.quick_equip() +/obj/screen/ling + invisibility = 101 + +/obj/screen/ling/sting + name = "current sting" + +/obj/screen/ling/sting/Click() + var/mob/living/carbon/U = usr + U.unset_sting() + +/obj/screen/ling/chems + name = "chemical storage" + icon_state = "power_display" + /datum/hud/proc/human_hud(var/ui_style='icons/mob/screen1_White.dmi', var/ui_color = "#ffffff", var/ui_alpha = 255) src.adding = list() @@ -404,6 +418,12 @@ mymob.pullin.screen_loc = ui_pull_resist src.hotkeybuttons += mymob.pullin + lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay.screen_loc = ui_lingchemdisplay + + lingstingdisplay = new /obj/screen/ling/sting() + lingstingdisplay.screen_loc = ui_lingstingdisplay + mymob.blind = new /obj/screen() mymob.blind.icon = 'icons/mob/screen1_full.dmi' mymob.blind.icon_state = "blackimageoverlay" @@ -460,7 +480,7 @@ mymob.client.screen = list() - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, mymob.gun_setting_icon, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) mymob.client.screen += src.adding + src.hotkeybuttons mymob.client.screen += mymob.client.void inventory_shown = 0; diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index 85f91e53e30..18b45befa88 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -239,6 +239,12 @@ mymob.pullin.screen_loc = ui_pull_resist src.hotkeybuttons += mymob.pullin + lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay.screen_loc = ui_lingchemdisplay + + lingstingdisplay = new /obj/screen/ling/sting() + lingstingdisplay.screen_loc = ui_lingstingdisplay + mymob.blind = new /obj/screen() mymob.blind.icon = 'icons/mob/screen1_full.dmi' mymob.blind.icon_state = "blackimageoverlay" @@ -296,7 +302,7 @@ mymob.client.screen = list() - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, mymob.gun_setting_icon, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach ) mymob.client.screen += src.adding + src.hotkeybuttons mymob.client.screen += mymob.client.void diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm index cbb074b8d24..5d2bdf58bf6 100644 --- a/code/datums/cargoprofile.dm +++ b/code/datums/cargoprofile.dm @@ -255,9 +255,9 @@ id = "weapons" blacklist = null //This one is hard since 'weapon contains a lot of things better categorized as devices - whitelist = list(/obj/item/weapon/banhammer,/obj/item/weapon/sord,/obj/item/weapon/butch,/obj/item/weapon/claymore,/obj/item/weapon/holo/esword, + whitelist = list(/obj/item/weapon/banhammer,/obj/item/weapon/sord,/obj/item/weapon/claymore,/obj/item/weapon/holo/esword, /obj/item/weapon/flamethrower,/obj/item/weapon/grenade,/obj/item/weapon/gun,/obj/item/weapon/hatchet,/obj/item/weapon/katana, - /obj/item/weapon/kitchenknife,/obj/item/weapon/melee,/obj/item/weapon/nullrod,/obj/item/weapon/pickaxe,/obj/item/weapon/twohanded, + /obj/item/weapon/kitchen/knife,/obj/item/weapon/melee,/obj/item/weapon/nullrod,/obj/item/weapon/pickaxe,/obj/item/weapon/twohanded, /obj/item/weapon/c4,/obj/item/weapon/scalpel,/obj/item/weapon/shield,/obj/item/weapon/grown/nettle/death) /datum/cargoprofile/tools diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm index c2a5d938f78..867eb048903 100644 --- a/code/datums/spells/ethereal_jaunt.dm +++ b/code/datums/spells/ethereal_jaunt.dm @@ -19,6 +19,9 @@ /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded for(var/mob/living/target in targets) + if(!target.can_safely_leave_loc()) // No more brainmobs hopping out of their brains + target << "You are somehow too bound to your current location to abandon it." + continue spawn(0) if(target.buckled) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 1570dccdafa..3523a69bf9c 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -289,6 +289,21 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine cost = 15 containername = "tactical armor crate" +/datum/supply_packs/security/armory/swat + name = "SWAT gear crate" + contains = list(/obj/item/clothing/head/helmet/swat, + /obj/item/clothing/head/helmet/swat, + /obj/item/clothing/suit/space/swat, + /obj/item/clothing/suit/space/swat, + /obj/item/weapon/kitchen/knife/combat, + /obj/item/weapon/kitchen/knife/combat, + /obj/item/clothing/mask/gas/sechailer/swat, + /obj/item/clothing/mask/gas/sechailer/swat, + /obj/item/weapon/storage/belt/military/assault, + /obj/item/weapon/storage/belt/military/assault) + cost = 60 + containername = "assault armor crate" + /datum/supply_packs/security/armory/laserarmor name = "Ablative Armor Crate" contains = list(/obj/item/clothing/suit/armor/laserproof, @@ -532,9 +547,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/engineering/engine/spacesuit name = "Space Suit Crate" contains = list(/obj/item/clothing/suit/space, + /obj/item/clothing/suit/space, /obj/item/clothing/head/helmet/space, + /obj/item/clothing/head/helmet/space, + /obj/item/clothing/mask/breath, /obj/item/clothing/mask/breath,) - cost = 80 + cost = 30 containertype = /obj/structure/closet/crate/secure containername = "space suit crate" access = access_eva diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 9c30b3305f0..16d00449a55 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -135,7 +135,7 @@ var/list/uplink_items = list() name = "Meat Cleaver" desc = "A mean looking meat cleaver that does damage comparable to an Energy Sword but with the added benefit of chopping your victim into hunks of meat after they've died and the chance to stun when thrown." reference = "MC" - item = /obj/item/weapon/butch/meatcleaver + item = /obj/item/weapon/kitchen/knife/butcher/meatcleaver cost = 10 job = list("Chef") diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index 0431d666c53..cc957a94c34 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -142,6 +142,7 @@ desc = "I wonder wath thith doeth." activation_message = "Thomething doethn't feel right." deactivation_message = "You now feel able to pronounce consonants." + mutation = LISP New() ..() diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index 2db8f3e08f0..01c0b9ed535 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -31,6 +31,7 @@ activation_message = "You feel a strange sickness permeate your whole body." deactivation_message = "You no longer feel awful and sick all over." instability=5 + mutation = RADIOACTIVE New() ..() @@ -130,6 +131,7 @@ desc = "Forces the language center of the subject's brain to construct sentences in a more rudimentary manner." activation_message = "Ye feel like a reet prat like, innit?" deactivation_message = "You no longer feel like being rude and sassy." + mutation = CHAV New() ..() @@ -168,6 +170,7 @@ desc = "Forces the language center of the subject's brain to construct sentences in a vaguely norse manner." activation_message = "You feel Swedish, however that works." deactivation_message = "The feeling of Swedishness passes." + mutation = SWEDISH New() ..() @@ -186,6 +189,7 @@ desc = "Heavily corrupts the part of the brain responsible for forming spoken sentences." activation_message = "You can't seem to form any coherent thoughts!" deactivation_message = "Your mind feels more clear." + mutation = SCRAMBLED New() ..() @@ -252,6 +256,7 @@ desc = "Enables the growth of a compacted keratin formation on the subject's head." activation_message = "A pair of horns erupt from your head." deactivation_message = "Your horns crumble away into nothing." + mutation = HORNS New() ..() @@ -297,6 +302,7 @@ activation_messages = list("You suddenly feel rather hot.") deactivation_messages = list("You no longer feel uncomfortably hot.") instability=5 + mutation = IMMOLATE spelltype=/obj/effect/proc_holder/spell/targeted/immolate diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index e9e07437350..300074bfa54 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -48,6 +48,7 @@ activation_messages = list("You begin to fade into the shadows.") deactivation_messages = list("You become fully visible.") activation_prob=10 + mutation = CLOAK New() block=SHADOWBLOCK @@ -74,6 +75,7 @@ activation_messages = list("You feel one with your surroundings.") deactivation_messages = list("You feel oddly exposed.") activation_prob=10 + mutation = CHAMELEON New() block=CHAMELEONBLOCK @@ -120,6 +122,7 @@ activation_messages = list("You notice a strange cold tingle in your fingertips.") deactivation_messages = list("Your fingers feel warmer.") instability=10 + mutation = CRYO spelltype = /obj/effect/proc_holder/spell/targeted/cryokinesis @@ -217,6 +220,7 @@ activation_messages = list("You feel hungry.") deactivation_messages = list("You don't feel quite so hungry anymore.") instability=3 + mutation = EATER spelltype=/obj/effect/proc_holder/spell/targeted/eat @@ -359,6 +363,7 @@ activation_messages = list("Your leg muscles feel taut and strong.") deactivation_messages = list("Your leg muscles shrink back to normal.") instability=2 + mutation = JUMPY spelltype =/obj/effect/proc_holder/spell/targeted/leap @@ -460,6 +465,7 @@ activation_messages = list("You don't feel entirely like yourself somehow.") deactivation_messages = list("You feel secure in your identity.") instability=5 + mutation = POLYMORPH New() ..() diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm index 26e5ffc27e2..65b6ae36acf 100644 --- a/code/game/dna/genes/powers.dm +++ b/code/game/dna/genes/powers.dm @@ -158,6 +158,7 @@ if ((HULK in M.mutations) && M.health <= 0) M.mutations.Remove(HULK) M.dna.SetSEState(HULKBLOCK,0) + genemutcheck(M, HULKBLOCK,null,MUTCHK_FORCED) M.update_mutations() //update our mutation overlays M.update_body() M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH //temporary fix until the problem can be solved. diff --git a/code/game/dna/genes/vg_disabilities.dm b/code/game/dna/genes/vg_disabilities.dm index 6cb2c6f6ce8..fe35349e6d4 100644 --- a/code/game/dna/genes/vg_disabilities.dm +++ b/code/game/dna/genes/vg_disabilities.dm @@ -4,6 +4,7 @@ desc = "Forces the speaking centre of the subjects brain to yell every sentence." activation_message = "YOU FEEL LIKE YELLING!" deactivation_message = "You feel like being quiet.." + mutation = LOUD New() ..() @@ -43,6 +44,7 @@ desc = "Causes the cerebellum to shut down in some places." activation_message = "You feel very dizzy..." deactivation_message = "You regain your balance." + mutation = DIZZY New() ..() diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index ee6c6f50645..86fd12a5069 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -411,6 +411,9 @@ var/list/sting_paths mind.changeling.purchasedpowers -= p p.on_refund(src) remove_language("Changeling") + if(hud_used) + hud_used.lingstingdisplay.icon_state = null + hud_used.lingstingdisplay.invisibility = 101 /datum/changeling/proc/has_sting(obj/effect/proc_holder/changeling/power) for(var/obj/effect/proc_holder/changeling/P in purchasedpowers) diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index 050f9a74b8e..dbfb14f66d7 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -16,10 +16,14 @@ /obj/effect/proc_holder/changeling/sting/proc/set_sting(var/mob/user) user << "We prepare our sting, use alt+click or middle mouse button on target to sting them." user.mind.changeling.chosen_sting = src + user.hud_used.lingstingdisplay.icon_state = sting_icon + user.hud_used.lingstingdisplay.invisibility = 0 /obj/effect/proc_holder/changeling/sting/proc/unset_sting(var/mob/user) user << "We retract our sting, we can't sting anyone for now." user.mind.changeling.chosen_sting = null + user.hud_used.lingstingdisplay.icon_state = null + user.hud_used.lingstingdisplay.invisibility = 101 /mob/living/carbon/proc/unset_sting() if(mind && mind.changeling && mind.changeling.chosen_sting) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 87cc9c46b58..a1a5d646544 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -276,6 +276,9 @@ var/area/A = get_area(cult_mind.current ) if ( is_type_in_list(A, centcom_areas)) acolytes_survived++ + else if(A == shuttle_master.emergency.areaInstance && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) //snowflaked into objectives because shitty bay shuttles had areas to auto-determine this + acolytes_survived++ + if(acolytes_survived>=acolytes_needed) return 0 else diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 3b5127c10c6..af6961bae99 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -300,6 +300,8 @@ proc/issyndicate(mob/living/M as mob) for(var/obj/item/weapon/disk/nuclear/D in world) var/disk_area = get_area(D) if(!is_type_in_list(disk_area, centcom_areas)) + if(disk_area == shuttle_master.emergency.areaInstance && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) //snowflaked into objectives because shitty bay shuttles had areas to auto-determine this + break disk_rescued = 0 break var/crew_evacuated = (shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) diff --git a/code/game/gamemodes/vampire/hud.dm b/code/game/gamemodes/vampire/hud.dm index 8df7e893273..727ae3bdc25 100644 --- a/code/game/gamemodes/vampire/hud.dm +++ b/code/game/gamemodes/vampire/hud.dm @@ -1,8 +1,8 @@ /datum/hud/proc/vampire_hud(ui_style = 'icons/mob/screen1_Midnight.dmi') vampire_blood_display = new /obj/screen() - vampire_blood_display.name = "Vampire Blood" - vampire_blood_display.icon_state = "dark128" + vampire_blood_display.name = "Usable Blood" + vampire_blood_display.icon_state = "power_display" vampire_blood_display.screen_loc = "WEST:6,CENTER-1:15" vampire_blood_display.layer = 20 diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 3cdcab84d17..40da7a5bca3 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -431,9 +431,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha if(hud_used) if(!hud_used.vampire_blood_display) hud_used.vampire_hud() - hud_used.vampire_blood_display.maptext_width = 64 - hud_used.vampire_blood_display.maptext_height = 26 - hud_used.vampire_blood_display.maptext = "
U:[mind.vampire.bloodusable]
T:[mind.vampire.bloodtotal]
" + hud_used.vampire_blood_display.maptext = "
[mind.vampire.bloodusable]
" handle_vampire_cloak() if(istype(loc, /turf/space)) check_sun() diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 7510a400e16..f23ef05ad57 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -520,7 +520,7 @@ var/global/list/multiverse = list() M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head) M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/utensil/knife(M), slot_l_store) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store) M.equip_to_slot_or_del(sword, slot_r_hand) for(var/obj/item/carried_item in M.contents) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 22d33684c4a..0b34638ef44 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -208,6 +208,7 @@ active_power_usage = 500 var/printing = null var/printing_text = null + var/known_implants = list(/obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking) /obj/machinery/body_scanconsole/power_change() if(stat & BROKEN) @@ -345,6 +346,15 @@ bloodData["bloodMax"] = H.max_blood occupantData["blood"] = bloodData + var/implantData[0] + for(var/obj/item/weapon/implant/I in H) + if(I.implanted && is_type_in_list(I, known_implants)) + var/implantSubData[0] + implantSubData["name"] = sanitize(I.name) + implantData.Add(list(implantSubData)) + occupantData["implant"] = implantData + occupantData["implant_len"] = implantData.len + var/extOrganData[0] for(var/obj/item/organ/external/E in H.organs) var/organData[0] @@ -358,15 +368,15 @@ organData["bruised"] = E.min_bruised_damage organData["broken"] = E.min_broken_damage - var/implantData[0] + var/shrapnelData[0] for(var/obj/I in E.implants) - var/implantSubData[0] - implantSubData["name"] = I.name + var/shrapnelSubData[0] + shrapnelSubData["name"] = I.name - implantData.Add(list(implantSubData)) + shrapnelData.Add(list(shrapnelSubData)) - organData["implants"] = implantData - organData["implants_len"] = implantData.len + organData["shrapnel"] = shrapnelData + organData["shrapnel_len"] = shrapnelData.len var/organStatus[0] if(E.status & ORGAN_DESTROYED) diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index fcc683646cd..517b96be864 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -249,6 +249,9 @@ /obj/machinery/smartfridge/attack_ai(mob/user as mob) return 0 +/obj/machinery/smartfridge/attack_ghost(mob/user as mob) + return src.attack_hand(user) + /obj/machinery/smartfridge/attack_hand(mob/user as mob) if(stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 687032011b1..d9d766e9787 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -547,6 +547,9 @@ var/list/turret_icons if(!istype(L)) return TURRET_NOT_TARGET + if(get_turf(L) == get_turf(src)) + return TURRET_NOT_TARGET + if(L.invisibility >= INVISIBILITY_LEVEL_ONE) // Cannot see him. see_invisible is a mob-var return TURRET_NOT_TARGET diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index f754155d7c7..2e99d634d60 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -242,9 +242,7 @@ badcount++ for(var/obj/item/device/transfer_valve/B in src.loc) badcount++ - for(var/obj/item/weapon/kitchen/utensil/knife/K in src.loc) - badcount++ - for(var/obj/item/weapon/kitchenknife/KK in src.loc) + for(var/obj/item/weapon/kitchen/knife/K in src.loc) badcount++ for(var/obj/item/weapon/c4/KK in src.loc) badcount++ diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 0a1e3a1c1b5..c3f43ce7968 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1061,7 +1061,7 @@ product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." icon_state = "dinnerware" products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6, - /obj/item/weapon/kitchenknife = 3,/obj/item/weapon/kitchen/rollingpin = 2, + /obj/item/weapon/kitchen/knife = 3,/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8, /obj/item/clothing/suit/chef/classic = 2, /obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5, /obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5, @@ -1069,7 +1069,7 @@ /obj/item/weapon/kitchen/mould/bean = 1, /obj/item/weapon/kitchen/mould/ball = 1, /obj/item/weapon/kitchen/mould/cane = 1, /obj/item/weapon/kitchen/mould/cash = 1, /obj/item/weapon/kitchen/mould/coin = 1, /obj/item/weapon/kitchen/mould/loli = 1) - contraband = list(/obj/item/weapon/kitchen/utensil/spoon = 2,/obj/item/weapon/kitchen/utensil/knife = 2,/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2) + contraband = list(/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/kitchen/knife/butcher = 2) /obj/machinery/vending/sovietsoda name = "\improper BODA" @@ -1146,7 +1146,7 @@ products = list(/obj/item/weapon/reagent_containers/food/snacks/tofu = 24, /obj/item/weapon/reagent_containers/food/drinks/ice = 12, /obj/item/weapon/reagent_containers/food/snacks/candy_corn = 6) - contraband = list(/obj/item/weapon/kitchen/utensil/knife = 6) + contraband = list(/obj/item/weapon/kitchen/knife = 6) /obj/machinery/vending/hatdispenser name = "\improper Hatlord 9000" diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 3ea7afe0b8d..c482eac5412 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -434,8 +434,8 @@ P.failchance = 0 P.icon_state = "anom" P.name = "wormhole" - message_admins("[key_name_admin(chassis.occupant, chassis.occupant.client)](?) (FLW) used a Wormhole Generator in ([T.x],[T.y],[T.z] - JMP)",0,1) - log_game("[key_name(chassis.occupant)] used a Wormhole Generator in ([T.x],[T.y],[T.z])") + message_admins("[key_name_admin(chassis.occupant, chassis.occupant.client)](?) (FLW) used a Wormhole Generator in ([loc.x],[loc.y],[loc.z] - JMP)",0,1) + log_game("[key_name(chassis.occupant)] used a Wormhole Generator in ([loc.x],[loc.y],[loc.z])") do_after_cooldown() src = null spawn(rand(150,300)) @@ -1088,9 +1088,7 @@ return var/list/occupant = list() occupant |= mecha.occupant - mecha.occupant.sight |= SEE_TURFS scanning = 1 mineral_scan_pulse(occupant,get_turf(loc)) spawn(equip_cooldown) - scanning = 0 - mecha.occupant.sight -= SEE_TURFS + scanning = 0 \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index b984cc86719..e1c1994556e 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -57,7 +57,9 @@ return ..() -/obj/item/device/radio/headset/receive_range(freq, level) +/obj/item/device/radio/headset/receive_range(freq, level, aiOverride = 0) + if(aiOverride) + return ..(freq, level) if(ishuman(loc)) var/mob/living/carbon/human/H = loc if(H.l_ear == src || H.r_ear == src) diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index 28c573be0bb..47efe52d21f 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -20,13 +20,13 @@ var/list/world_uplinks = list() var/purchase_log = "" var/uplink_owner = null//text-only var/used_TC = 0 - + var/job = null var/show_descriptions = 0 /obj/item/device/uplink/nano_host() - return loc - + return loc + /obj/item/device/uplink/New() ..() welcome = ticker.mode.uplink_welcome @@ -48,7 +48,7 @@ var/list/world_uplinks = list() /obj/item/device/uplink/proc/generate_menu(mob/user as mob) if(!job) job = user.mind.assigned_role - + var/dat = "[src.welcome]
" dat += "Telecrystals left: [src.uses]
" dat += "
" @@ -82,7 +82,7 @@ var/list/world_uplinks = list() /obj/item/device/uplink/proc/generate_item_lists(mob/user as mob) if(!job) job = user.mind.assigned_role - + var/list/nano = new var/list/reference = new @@ -92,7 +92,7 @@ var/list/world_uplinks = list() if(I.job && I.job.len) if(!(I.job.Find(job))) continue - nano[nano.len]["items"] += list(list("Name" = I.name, "Description" = I.description(),"Cost" = I.cost, "obj_path" = I.reference)) + nano[nano.len]["items"] += list(list("Name" = sanitize(I.name), "Description" = sanitize(I.description()),"Cost" = I.cost, "obj_path" = I.reference)) reference[I.reference] = I var/datum/nano_item_lists/result = new @@ -130,7 +130,7 @@ var/list/world_uplinks = list() return UI.buy(src,usr) nanomanager.update_uis(src) - + /* var/list/L = UI.spawn_item(get_turf(usr),src) if(ishuman(usr)) var/mob/living/carbon/human/A = usr @@ -244,7 +244,7 @@ var/list/world_uplinks = list() update_nano_data(href_list["id"]) if(href_list["descriptions"]) show_descriptions = !show_descriptions - update_nano_data() + update_nano_data() nanomanager.update_uis(src) return 1 @@ -253,7 +253,7 @@ var/list/world_uplinks = list() if(nanoui_menu == 1) var/permanentData[0] for(var/datum/data/record/L in sortRecord(data_core.general)) - permanentData[++permanentData.len] = list(Name = L.fields["name"],"id" = L.fields["id"]) + permanentData[++permanentData.len] = list(Name = sanitize(L.fields["name"]),"id" = L.fields["id"]) nanoui_data["exploit_records"] = permanentData if(nanoui_menu == 11) @@ -283,7 +283,7 @@ var/list/world_uplinks = list() src.hidden_uplink.trigger(user) return 1 return 0 - + //Refund proc for the borg teleporter (later I'll make a general refund proc if there is demand for it) /obj/item/device/radio/uplink/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/antag_spawner/borg_tele)) @@ -293,8 +293,8 @@ var/list/world_uplinks = list() qdel(S) user << "Teleporter refunded." else - user << "This teleporter is already used, or is currently being used." - + user << "This teleporter is already used, or is currently being used." + // PRESET UPLINKS // A collection of preset uplinks. // diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index bac1cdb68f5..b1659d8f2f2 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -91,8 +91,7 @@ //Step one - dehairing. /obj/item/stack/sheet/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if( istype(W, /obj/item/weapon/kitchenknife) || \ - istype(W, /obj/item/weapon/kitchen/utensil/knife) || \ + if( istype(W, /obj/item/weapon/kitchen/knife) || \ istype(W, /obj/item/weapon/twohanded/fireaxe) || \ istype(W, /obj/item/weapon/hatchet) ) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 47e90245760..9c508c07966 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -45,7 +45,7 @@ var/global/list/datum/stack_recipe/plastic_recipes = list ( \ new/datum/stack_recipe("plastic ashtray", /obj/item/ashtray/plastic, 2, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("plastic fork", /obj/item/weapon/kitchen/utensil/pfork, 1, on_floor = 1), \ new/datum/stack_recipe("plastic spoon", /obj/item/weapon/kitchen/utensil/pspoon, 1, on_floor = 1), \ - new/datum/stack_recipe("plastic knife", /obj/item/weapon/kitchen/utensil/pknife, 1, on_floor = 1), \ + new/datum/stack_recipe("plastic knife", /obj/item/weapon/kitchen/knife/plastic, 1, on_floor = 1), \ new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1), \ new/datum/stack_recipe("bear mould", /obj/item/weapon/kitchen/mould/bear, 1, on_floor = 1), \ new/datum/stack_recipe("worm mould", /obj/item/weapon/kitchen/mould/worm, 1, on_floor = 1), \ diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index d6d0c8cf000..e738b7e6d60 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -92,110 +92,73 @@ /* * Knives */ -/obj/item/weapon/kitchen/utensil/knife - name = "knife" - desc = "Can cut through any food." - icon_state = "knife" - force = 10.0 - throwforce = 10.0 - sharp = 1 - edge = 1 - - suicide_act(mob/user) - viewers(user) << pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \ - "[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \ - "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.") - return (BRUTELOSS) - -/obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob) - if ((CLUMSY in user.mutations) && prob(50)) - user << "\red You accidentally cut yourself with the [src]." - user.take_organ_damage(20) - playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - return - return ..() - -/obj/item/weapon/kitchen/utensil/pknife - name = "plastic knife" - desc = "The bluntest of blades." - icon_state = "pknife" - force = 10.0 - throwforce = 10.0 - -/* - * Kitchen knives - */ -/obj/item/weapon/kitchenknife +/obj/item/weapon/kitchen/knife name = "kitchen knife" - icon = 'icons/obj/kitchen.dmi' icon_state = "knife" desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come." flags = CONDUCT - sharp = 1 - edge = 1 - force = 10.0 - w_class = 3.0 - throwforce = 6.0 + force = 10 + w_class = 2 + throwforce = 10 + hitsound = 'sound/weapons/bladeslice.ogg' throw_speed = 3 throw_range = 6 materials = list(MAT_METAL=12000) origin_tech = "materials=1" attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - hitsound = 'sound/weapons/bladeslice.ogg' + no_embed = 1 + sharp = 1 + edge = 1 - suicide_act(mob/user) - viewers(user) << pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \ - "[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \ - "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.") - return (BRUTELOSS) +/obj/item/weapon/kitchen/knife/suicide_act(mob/user) + user.visible_message(pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \ + "[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \ + "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")) + return (BRUTELOSS) -/obj/item/weapon/kitchenknife/combat - name = "combat knife" - force = 15.0 - throwforce = 10.0 - w_class = 2 - origin_tech = "materials=2;combat=2" - desc = "A razor sharp knife, built from advanced alloys, designed for quick, melee killing. Also not half bad as a kitchen knife." - slot_flags = SLOT_BELT - icon = 'icons/obj/weapons.dmi' - icon_state = "combatknife" +/obj/item/weapon/kitchen/knife/plastic + name = "plastic knife" + desc = "The bluntest of blades." + icon_state = "pknife" + item_state = "knife" + sharp = 0 + edge = 0 - -/obj/item/weapon/kitchenknife/ritual +/obj/item/weapon/kitchen/knife/ritual name = "ritual knife" desc = "The unearthly energies that once powered this blade are now dormant." icon = 'icons/obj/wizard.dmi' icon_state = "render" + w_class = 3 -/* - * Bucher's cleaver - */ -/obj/item/weapon/butch - name = "butcher's Cleaver" - icon = 'icons/obj/kitchen.dmi' +/obj/item/weapon/kitchen/knife/butcher + name = "butcher's cleaver" icon_state = "butch" desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products." flags = CONDUCT - force = 15.0 - w_class = 3.0 - throwforce = 8.0 - throw_speed = 3 - throw_range = 6 - materials = list(MAT_METAL=12000) - origin_tech = "materials=1" + force = 15 + throwforce = 8 attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - hitsound = 'sound/weapons/bladeslice.ogg' - sharp = 1 - edge = 1 + w_class = 3 -/obj/item/weapon/butch/meatcleaver +/obj/item/weapon/kitchen/knife/butcher/meatcleaver name = "Meat Cleaver" icon_state = "mcleaver" item_state = "butch" desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products." force = 25.0 throwforce = 15.0 - no_embed = 1 + +/obj/item/weapon/kitchen/knife/combat + name = "combat knife" + icon_state = "combatknife" + item_state = "knife" + desc = "A military combat utility survival knife." + force = 20 + throwforce = 20 + origin_tech = "materials=2;combat=4" + attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut") + /* * Rolling Pins */ diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index ffa9cfdb1cd..f727326b3f1 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -159,6 +159,7 @@ "/obj/item/ammo_box", "/obj/item/weapon/reagent_containers/food/snacks/donut/normal", "/obj/item/weapon/reagent_containers/food/snacks/donut/jelly", + "/obj/item/weapon/kitchen/knife/combat", "/obj/item/weapon/melee/baton", "/obj/item/weapon/melee/classic_baton", "/obj/item/device/flashlight/seclite", @@ -172,7 +173,7 @@ /obj/item/weapon/storage/belt/security/response_team/New() ..() - new /obj/item/weapon/kitchenknife/combat(src) + new /obj/item/weapon/kitchen/knife/combat(src) new /obj/item/weapon/melee/baton/loaded(src) new /obj/item/device/flash(src) new /obj/item/weapon/melee/classic_baton/telescopic(src) @@ -215,6 +216,13 @@ icon_state = "militarybelt" item_state = "military" +/obj/item/weapon/storage/belt/military/assault + name = "assault belt" + desc = "A tactical assault belt." + icon_state = "assaultbelt" + item_state = "assault" + storage_slots = 6 + /obj/item/weapon/storage/belt/janitor name = "janibelt" desc = "A belt used to hold most janitorial supplies." @@ -245,7 +253,7 @@ desc = "A bandolier for holding shotgun ammunition." icon_state = "bandolier" item_state = "bandolier" - storage_slots = 6 + storage_slots = 8 can_hold = list( "/obj/item/ammo_casing/shotgun" ) @@ -258,6 +266,8 @@ new /obj/item/ammo_casing/shotgun/beanbag(src) new /obj/item/ammo_casing/shotgun/beanbag(src) new /obj/item/ammo_casing/shotgun/beanbag(src) + new /obj/item/ammo_casing/shotgun/beanbag(src) + new /obj/item/ammo_casing/shotgun/beanbag(src) /obj/item/weapon/storage/belt/holster name = "shoulder holster" diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 520de21301c..bb6b10cf730 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -26,6 +26,7 @@ throw_range = 4 throwforce = 10 w_class = 1 + var/transformed = 0 suicide_act(mob/user) viewers(user) << "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide." @@ -57,6 +58,28 @@ M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2) ..() +/obj/item/weapon/nullrod/afterattack(var/obj/item/I as obj, mob/user as mob, proximity) + if(!proximity) + return + if(istype(I, /obj/item/clothing/suit/armor/riot/knight/templar)) //Only the Chaplain's holy armor is capable fo performing this feat. + if(!transformed) // can't turn a sword into a sword. + user << "You sheath the [src] into the [I]'s scabbard, transforming it into a holy sword." + user.unEquip(src) + qdel(src) + var/obj/item/weapon/nullrod/sword/S = new /obj/item/weapon/nullrod/sword + user.put_in_hands(S) + +/obj/item/weapon/nullrod/sword + name = "holy sword" + desc = "A sword imbued with holy power, its very presence disrupts and dampens the powers of paranormal phenomenae." + icon_state = "claymore" + item_state = "claymore" + hitsound = 'sound/weapons/bladeslice.ogg' + w_class = 3 //transforming it is not without its downsides. + sharp = 1 + edge = 1 + transformed = 1 + /obj/item/weapon/sord name = "\improper SORD" desc = "This thing is so unspeakably shitty you are having a hard time even holding it." @@ -159,7 +182,7 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params) ..() if(istype(I, /obj/item/weapon/shard)) var/obj/item/weapon/twohanded/spear/S = new /obj/item/weapon/twohanded/spear - + if(!remove_item_from_storage(user)) user.unEquip(src) user.unEquip(I) @@ -173,7 +196,7 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params) var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod if(!remove_item_from_storage(user)) - user.unEquip(src) + user.unEquip(src) user.unEquip(I) user.put_in_hands(P) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm new file mode 100644 index 00000000000..d8577c53e27 --- /dev/null +++ b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm @@ -0,0 +1,33 @@ +/obj/structure/closet/secure_closet/chaplain + name = "chapel wardrobe" + desc = "A lockable storage unit for Nanotrasen-approved religious attire." + req_access = list(access_chapel_office) + icon_state = "chaplainsecure1" + icon_closed = "chaplainsecure" + icon_locked = "chaplainsecure1" + icon_opened = "chaplainsecureopen" + icon_broken = "chaplainsecurebroken" + icon_off = "chaplainsecureoff" + +/obj/structure/closet/secure_closet/chaplain/New() + ..() + sleep(2) + new /obj/item/clothing/under/rank/chaplain(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/suit/nun(src) + new /obj/item/clothing/head/nun_hood(src) + new /obj/item/clothing/suit/chaplain_hoodie(src) + new /obj/item/clothing/head/chaplain_hood(src) + new /obj/item/clothing/suit/holidaypriest(src) + new /obj/item/clothing/under/wedding/bride_white(src) + new /obj/item/weapon/storage/backpack/cultpack (src) + new /obj/item/clothing/head/helmet/knight/templar(src) + new /obj/item/clothing/suit/armor/riot/knight/templar(src) + new /obj/item/weapon/storage/fancy/candle_box/eternal(src) + new /obj/item/weapon/storage/fancy/candle_box/eternal(src) + new /obj/item/weapon/storage/fancy/candle_box/eternal(src) + new /obj/item/clothing/gloves/ring/silver(src) + new /obj/item/clothing/gloves/ring/silver(src) + new /obj/item/clothing/gloves/ring/gold(src) + new /obj/item/clothing/gloves/ring/gold(src) + return \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index be567173078..7b81a5b6460 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -249,6 +249,7 @@ new /obj/item/clothing/glasses/sunglasses(src) new /obj/item/clothing/glasses/hud/health/health_advanced new /obj/item/clothing/head/beret/centcom/officer(src) + new /obj/item/clothing/head/beret/centcom/officer/navy(src) new /obj/item/clothing/suit/armor/vest/blueshield(src) new /obj/item/clothing/suit/storage/blueshield(src) new /obj/item/clothing/shoes/centcom(src) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 1cd91b7c9a4..c5e3c92848b 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -111,35 +111,6 @@ new /obj/item/clothing/head/soft/black(src) return - -/obj/structure/closet/wardrobe/chaplain_black - name = "chapel wardrobe" - desc = "It's a storage unit for Nanotrasen-approved religious attire." - icon_state = "black" - icon_closed = "black" - -/obj/structure/closet/wardrobe/chaplain_black/New() - ..() - sleep(2) - new /obj/item/clothing/under/rank/chaplain(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/suit/nun(src) - new /obj/item/clothing/head/nun_hood(src) - new /obj/item/clothing/suit/chaplain_hoodie(src) - new /obj/item/clothing/head/chaplain_hood(src) - new /obj/item/clothing/suit/holidaypriest(src) - new /obj/item/clothing/under/wedding/bride_white(src) - new /obj/item/weapon/storage/backpack/cultpack (src) - new /obj/item/weapon/storage/fancy/candle_box/eternal(src) - new /obj/item/weapon/storage/fancy/candle_box/eternal(src) - new /obj/item/weapon/storage/fancy/candle_box/eternal(src) - new /obj/item/clothing/gloves/ring/silver(src) - new /obj/item/clothing/gloves/ring/silver(src) - new /obj/item/clothing/gloves/ring/gold(src) - new /obj/item/clothing/gloves/ring/gold(src) - return - - /obj/structure/closet/wardrobe/green name = "green wardrobe" icon_state = "green" diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 1afa2d95504..fabaf4c63f0 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -314,6 +314,7 @@ if(dir != NORTH) layer = 5 flipped = 1 + smooth = SMOOTH_FALSE flags |= ON_BORDER for(var/D in list(turn(direction, 90), turn(direction, -90))) if(locate(/obj/structure/table,get_step(src,D))) @@ -339,6 +340,7 @@ layer = initial(layer) flipped = 0 + smooth = initial(smooth) flags &= ~ON_BORDER for(var/D in list(turn(dir, 90), turn(dir, -90))) if(locate(/obj/structure/table,get_step(src,D))) diff --git a/code/game/response_team.dm b/code/game/response_team.dm index b17e51fef19..a8f5a8bba79 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -605,7 +605,7 @@ var/send_emergency_team new /obj/item/clothing/mask/breath( src ) new /obj/item/weapon/tank/emergency_oxygen/engi( src ) new /obj/item/device/flashlight/flare( src ) - new /obj/item/weapon/kitchenknife/combat( src ) + new /obj/item/weapon/kitchen/knife/combat( src ) new /obj/item/device/radio/centcom( src ) new /obj/item/weapon/reagent_containers/pill/salicylic( src ) new /obj/item/weapon/reagent_containers/pill/patch/synthflesh( src ) diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index f40506230e9..25694f28fc3 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -232,13 +232,12 @@ CW.update_icon(0) playsound(src, 'sound/items/Screwdriver.ogg', 80, 1) -/turf/simulated/floor/airless - icon_state = "floor" +/turf/simulated/floor/plasteel/airless name = "airless floor" oxygen = 0.01 nitrogen = 0.01 temperature = TCMB -/turf/simulated/floor/airless/New() +/turf/simulated/floor/plasteel/airless/New() ..() name = "floor" \ No newline at end of file diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index ba1c8872937..db488c84649 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -194,21 +194,37 @@ var/list/admin_verbs_proccall = list ( /client/proc/add_admin_verbs() if(holder) verbs += admin_verbs_default - if(holder.rights & R_BUILDMODE) verbs += /client/proc/togglebuildmodeself - if(holder.rights & R_ADMIN) verbs += admin_verbs_admin - if(holder.rights & R_BAN) verbs += admin_verbs_ban - if(holder.rights & R_EVENT) verbs += admin_verbs_event - if(holder.rights & R_SERVER) verbs += admin_verbs_server - if(holder.rights & R_DEBUG) verbs += admin_verbs_debug - if(holder.rights & R_POSSESS) verbs += admin_verbs_possess - if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions - if(holder.rights & R_STEALTH) verbs += /client/proc/stealth - if(holder.rights & R_REJUVINATE) verbs += admin_verbs_rejuv - if(holder.rights & R_SOUNDS) verbs += admin_verbs_sounds - if(holder.rights & R_SPAWN) verbs += admin_verbs_spawn - if(holder.rights & R_MOD) verbs += admin_verbs_mod - if(holder.rights & R_MENTOR) verbs += admin_verbs_mentor - if(holder.rights & R_PROCCALL) verbs += admin_verbs_proccall + if(holder.rights & R_BUILDMODE) + verbs += /client/proc/togglebuildmodeself + if(holder.rights & R_ADMIN) + verbs += admin_verbs_admin + control_freak = 0 + if(holder.rights & R_BAN) + verbs += admin_verbs_ban + if(holder.rights & R_EVENT) + verbs += admin_verbs_event + if(holder.rights & R_SERVER) + verbs += admin_verbs_server + if(holder.rights & R_DEBUG) + verbs += admin_verbs_debug + if(holder.rights & R_POSSESS) + verbs += admin_verbs_possess + if(holder.rights & R_PERMISSIONS) + verbs += admin_verbs_permissions + if(holder.rights & R_STEALTH) + verbs += /client/proc/stealth + if(holder.rights & R_REJUVINATE) + verbs += admin_verbs_rejuv + if(holder.rights & R_SOUNDS) + verbs += admin_verbs_sounds + if(holder.rights & R_SPAWN) + verbs += admin_verbs_spawn + if(holder.rights & R_MOD) + verbs += admin_verbs_mod + if(holder.rights & R_MENTOR) + verbs += admin_verbs_mentor + if(holder.rights & R_PROCCALL) + verbs += admin_verbs_proccall /client/proc/remove_admin_verbs() verbs.Remove( diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 4b862a69453..c3489499058 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -670,7 +670,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand) M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store) @@ -694,9 +694,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head) M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/rollingpin(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_hand) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_r_store) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_s_store) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_s_store) if ("tournament janitor") M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform) @@ -773,7 +773,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit) - M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_store) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store) var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M) diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index 1144513f058..d609b5f8ac7 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -144,8 +144,7 @@ var/global/sent_syndicate_strike_team = 0 equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses) equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(src), slot_back) - equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m762/buckshot, slot_in_backpack) - equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m762/he, slot_in_backpack) + equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m762, slot_in_backpack) equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m45(src), slot_in_backpack) equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack) @@ -163,7 +162,7 @@ var/global/sent_syndicate_strike_team = 0 equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store) equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol/m2411(src), slot_belt) - equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/l6_saw/devastator(src), slot_r_hand) + equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/l6_saw(src), slot_r_hand) var/obj/item/weapon/card/id/syndicate/W = new(src) //Untrackable by AI W.name = "[real_name]'s ID Card" diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 8b315661a34..4d9237bd11c 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -78,4 +78,6 @@ var/reset_stretch = 0 //Used by things that fiddle with client's stretch-to-fit. - var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier \ No newline at end of file + var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier + + control_freak = CONTROL_FREAK_ALL | CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 856106ba48f..0c3c59595b2 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -178,19 +178,20 @@ BLIND // can't see anything /obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/wirecutters)) - if(clipped == 0) + if(!clipped) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - user.visible_message("\red [user] snips the fingertips off [src].","\red You snip the fingertips off [src].") + user.visible_message("[user] snips the fingertips off [src].","You snip the fingertips off [src].") clipped = 1 + name = "mangled [name]" + desc = "[desc] They have had the fingertips cut off of them." if("exclude" in species_restricted) - name = "mangled [name]" - desc = "[desc] They have had the fingertips cut off of them." species_restricted -= "Unathi" species_restricted -= "Tajaran" - else if(clipped == 1) - user << "[src] have already been clipped!" update_icon() + else + user << "[src] have already been clipped!" return + else ..() /obj/item/clothing/gloves/proc/Touch() @@ -317,6 +318,8 @@ BLIND // can't see anything desc = "Comfortable-looking shoes." gender = PLURAL //Carn: for grammarically correct text-parsing var/chained = 0 + var/can_cut_open = 0 + var/cut_open = 0 body_parts_covered = FEET slot_flags = SLOT_FEET @@ -333,16 +336,36 @@ BLIND // can't see anything /obj/item/clothing/shoes/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/match) && src.loc == user) var/obj/item/weapon/match/M = I - if(M.lit == 0) + if(!M.lit) // Match isn't lit, but isn't burnt. M.lit = 1 M.icon_state = "match_lit" processing_objects.Add(M) M.update_icon() - user << "You strike the [M] along your [src] to light it." - else if(M.lit == 1) + user.visible_message("[user] strikes a [M] on the bottom of [src], lighting it.","You strike the [M] on the bottom of [src] to light it.") + else if(M.lit == 1) // Match is lit, not extinguished. M.dropped() - user << "You crush the [M] into the bottom of your [src], extinguishing it." + user.visible_message("[user] crushes the [M] into the bottom of [src]. extinguishing it.","You crush the [M] into the bottom of [src], extinguishing it.") + else // Match has been previously lit and extinguished. + user << "The [M] has already been extinguished." return + + if(istype(I, /obj/item/weapon/wirecutters)) + if(can_cut_open) + if(!cut_open) + playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) + user.visible_message("[user] cuts open the toes of [src].","You cut open the toes of [src].") + cut_open = 1 + icon_state = "[icon_state]_opentoe" + item_state = "[item_state]_opentoe" + name = "mangled [name]" + desc = "[desc] They have had their toes opened up." + if("exclude" in species_restricted) + species_restricted -= "Unathi" + species_restricted -= "Tajaran" + update_icon() + else + user << "[src] have already had their toes cut open!" + return else ..() diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 062aa169075..d079005087c 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -154,6 +154,35 @@ obj/item/clothing/head/blob flags = HEADCOVERSEYES|HEADCOVERSMOUTH flags_inv = HIDEMASK|HIDEEARS|HIDEEYES +/obj/item/clothing/head/helmet/knight + name = "medieval helmet" + desc = "A classic metal helmet." + icon_state = "knight_green" + item_state = "knight_green" + armor = list(melee = 41, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0) + flags = BLOCKHAIR|HEADCOVERSEYES|HEADCOVERSMOUTH + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + strip_delay = 80 + +/obj/item/clothing/head/helmet/knight/blue + icon_state = "knight_blue" + item_state = "knight_blue" + +/obj/item/clothing/head/helmet/knight/yellow + icon_state = "knight_yellow" + item_state = "knight_yellow" + +/obj/item/clothing/head/helmet/knight/red + icon_state = "knight_red" + item_state = "knight_red" + +/obj/item/clothing/head/helmet/knight/templar + name = "crusader helmet" + desc = "Deus Vult." + icon_state = "knight_templar" + item_state = "knight_templar" + + //Commander /obj/item/clothing/head/helmet/ert/command name = "emergency response team commander helmet" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 7c353ed8c82..4112164f0e3 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -284,6 +284,15 @@ name = "officers beret" desc = "A black beret adorned with the shield—a silver kite shield with an engraved sword—of the Nanotrasen security forces, announcing to the world that the wearer is a defender of Nanotrasen." icon_state = "beret_centcom_officer" + armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0) + strip_delay = 60 + +/obj/item/clothing/head/beret/centcom/officer/navy + name = "navy blue officers beret" + desc = "A navy blue beret adorned with the shield—a silver kite shield with an engraved sword—of the Nanotrasen security forces, announcing to the world that the wearer is a defender of Nanotrasen." + icon_state = "beret_centcom_officer_navy" + armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0) + strip_delay = 60 /obj/item/clothing/head/beret/centcom/captain name = "captains beret" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 3200c0edcad..9f334a658f8 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -93,6 +93,7 @@ /obj/item/clothing/shoes/jackboots name = "jackboots" desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." + can_cut_open = 1 icon_state = "jackboots" item_state = "jackboots" item_color = "hosred" diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index e54327b0e50..d4c0d3838f8 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -155,6 +155,9 @@ /obj/item/clothing/under/vox has_sensor = 0 species_restricted = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/uniform.dmi' + ) /obj/item/clothing/under/vox/vox_casual name = "alien clothing" diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm index 06d2b8a87ac..669c10d34c3 100644 --- a/code/modules/clothing/spacesuits/ert.dm +++ b/code/modules/clothing/spacesuits/ert.dm @@ -100,4 +100,25 @@ /obj/item/clothing/suit/space/rig/ert/janitor name = "emergency response team janitor suit" desc = "A suit worn by the janitorial of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured, space ready, and fire resistant." - icon_state = "ert_janitor" \ No newline at end of file + icon_state = "ert_janitor" + +/obj/item/clothing/head/helmet/space/rig/ert/paranormal + name = "paranormal response unit helmet" + desc = "A helmet worn by those who deal with paranormal threats for a living." + icon_state = "rig0-ert_paranormal" + item_color = "ert_paranormal" + max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + sprite_sheets = null + +/obj/item/clothing/suit/space/rig/ert/paranormal + name = "paranormal response team suit" + desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats." + icon_state = "knight_grey" + item_state = "knight_grey" + max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + sprite_sheets = null + + +/obj/item/clothing/suit/space/rig/ert/paranormal/New() + ..() + new /obj/item/weapon/nullrod(src) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index bfa2b3232b3..7d59f828643 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -53,13 +53,23 @@ desc = "A heavily armored, advanced space suit that protects against most forms of damage." icon_state = "deathsquad" item_state = "swat_suit" - allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/kitchen/knife/combat) armor = list(melee = 80, bullet = 80, laser = 50,energy = 50, bomb = 100, bio = 100, rad = 100) slowdown = 1 max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT unacidable = 1 strip_delay = 130 + //NEW SWAT suit +/obj/item/clothing/suit/space/swat + name = "SWAT armor" + desc = "Space-proof tactical SWAT armor." + icon_state = "heavy" + item_state = "swat_suit" + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/kitchen/knife/combat) + armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) + strip_delay = 120 + /obj/item/clothing/head/helmet/space/deathsquad/beret name = "officer's beret" desc = "An armored beret commonly used by special operations officers." diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index ccce69fe661..a6a8ad4b244 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -1,6 +1,6 @@ /obj/item/clothing/suit/armor - allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic) + allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/kitchen/knife/combat) body_parts_covered = UPPER_TORSO|LOWER_TORSO cold_protection = UPPER_TORSO|LOWER_TORSO min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT @@ -253,6 +253,33 @@ icon_state = "tdgreen" item_state = "tdgreen" +/obj/item/clothing/suit/armor/riot/knight + name = "plate armour" + desc = "A classic suit of plate armour, highly effective at stopping melee attacks." + icon_state = "knight_green" + item_state = "knight_green" + slowdown = 0 + armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0) + +/obj/item/clothing/suit/armor/riot/knight/yellow + icon_state = "knight_yellow" + item_state = "knight_yellow" + +/obj/item/clothing/suit/armor/riot/knight/blue + icon_state = "knight_blue" + item_state = "knight_blue" + +/obj/item/clothing/suit/armor/riot/knight/red + icon_state = "knight_red" + item_state = "knight_red" + +/obj/item/clothing/suit/armor/riot/knight/templar + name = "crusader armour" + desc = "God wills it!" + icon_state = "knight_templar" + item_state = "knight_templar" + allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/nullrod/sword) + //Non-hardsuit ERT armor. /obj/item/clothing/suit/armor/vest/ert name = "emergency response team armor" diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 097955805c2..78820a130dc 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -104,7 +104,7 @@ gas_transfer_coefficient = 0.90 permeability_coefficient = 0.50 body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - allowed = list (/obj/item/weapon/kitchenknife,/obj/item/weapon/butch) + allowed = list (/obj/item/weapon/kitchen/knife) species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' @@ -118,7 +118,7 @@ item_state = "apronchef" blood_overlay_type = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO - allowed = list(/obj/item/weapon/kitchenknife,/obj/item/weapon/butch) + allowed = list(/obj/item/weapon/kitchen/knife) species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 0bf75d5911b..bd69d9776d6 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -100,10 +100,7 @@ ..() hold.max_combined_w_class = 4 hold.can_hold = list("/obj/item/weapon/hatchet/unathiknife",\ - "/obj/item/weapon/kitchen/utensil/knife",\ - "/obj/item/weapon/kitchen/utensil/pknife",\ - "/obj/item/weapon/kitchenknife",\ - "/obj/item/weapon/kitchenknife/ritual") + "/obj/item/weapon/kitchen/knife") new /obj/item/weapon/hatchet/unathiknife(hold) new /obj/item/weapon/hatchet/unathiknife(hold) \ No newline at end of file diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 6304c606300..632dcff8d32 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -116,12 +116,13 @@ name = "royal marines commando beret" desc = "Dark Green beret with an old insignia on it." icon_state = "sparkyninja_beret" + item_state = "sparkyninja_beret" /obj/item/clothing/head/beret/fluff/sigholt //sigholtstarsong: Sigholt Starsong name = "Lieutenant Starsong's beret" desc = "This beret bears insignia of the SOLGOV Marine Corps 417th Regiment, 2nd Battalion, Bravo Company. It looks meticulously maintained." - icon_state = "hosberet" - item_state = "hosberet" + icon_state = "beret_hos" + item_state = "beret_hos" //////////// Suits //////////// /obj/item/clothing/suit/storage/labcoat/fluff/aeneas_rinil //Socialsystem: Lynn Fea diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index 0ed99cb5698..1d5ac326517 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -3,10 +3,10 @@ /datum/event/mass_hallucination/start() for(var/mob/living/carbon/human/H in living_mob_list) - var/armor = H.getarmor(attack_flag = "rad") + var/armor = H.getarmor(type = "rad") if((H.species.flags & NO_DNA_RAD) || armor >= 75) // Leave DNA-less species/rad armored players completely unaffected continue H.hallucination += rand(50, 100) - + /datum/event/mass_hallucination/announce() command_announcement.Announce("It seems that station [station_name()] is passing through a minor radiation field, this may cause some hallucination, but no further damage") \ No newline at end of file diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 9562e51c385..b297f898feb 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -36,7 +36,7 @@ for(var/i = 0, i < 10, i++) for(var/mob/living/carbon/human/H in living_mob_list) - var/armor = H.getarmor(attack_flag = "rad") + var/armor = H.getarmor(type = "rad") if((H.species.flags & NO_DNA_RAD) || armor >= 100) // Leave DNA-less species/fully rad armored players completely unaffected continue var/turf/T = get_turf(H) diff --git a/code/modules/examine/descriptions/stacks.dm b/code/modules/examine/descriptions/stacks.dm index 431e5c37b9a..6b47c1ab421 100644 --- a/code/modules/examine/descriptions/stacks.dm +++ b/code/modules/examine/descriptions/stacks.dm @@ -9,10 +9,10 @@ description_info = "Use in your hand to build a window. Can be upgraded to reinforced glass by adding metal rods, which are made from metal sheets.
\ As a synthetic, you can acquire more sheets of glass by recharging." -/obj/item/stack/sheet/glass/reinforced +/obj/item/stack/sheet/rglass description_info = "Use in your hand to build a window. Reinforced glass is much stronger against damage." -/obj/item/stack/sheet/glass/reinforced/cyborg +/obj/item/stack/sheet/rglass/cyborg description_info = "Use in your hand to build a window. Reinforced glass is much stronger against damage.
\ As a synthetic, you can gain more reinforced glass by recharging." diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index 95c6e9350f4..c806bf0b8c1 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -117,7 +117,7 @@ /obj/item/weapon/corncob/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() - if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/utensil/knife) || istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/kitchenknife/ritual)) + if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/knife)) user << "You use [W] to fashion a pipe out of the corn cob!" new /obj/item/clothing/mask/cigarette/pipe/cobpipe (user.loc) qdel(src) diff --git a/code/modules/hydroponics/hydro_reagents.dm b/code/modules/hydroponics/hydro_reagents.dm new file mode 100644 index 00000000000..5e5cb819b98 --- /dev/null +++ b/code/modules/hydroponics/hydro_reagents.dm @@ -0,0 +1,126 @@ + +/obj/item/weapon/plantspray + icon = 'icons/obj/hydroponics_machines.dmi' + item_state = "spray" + flags = OPENCONTAINER | NOBLUDGEON + slot_flags = SLOT_BELT + throwforce = 4 + w_class = 2.0 + throw_speed = 2 + throw_range = 10 + var/toxicity = 4 + var/pest_kill_str = 0 + var/weed_kill_str = 0 + +/obj/item/weapon/plantspray/weeds // -- Skie + + name = "weed-spray" + desc = "It's a toxic mixture, in spray form, to kill small weeds." + icon_state = "weedspray" + weed_kill_str = 6 + +/obj/item/weapon/plantspray/pests + name = "pest-spray" + desc = "It's some pest eliminator spray! Do not inhale!" + icon_state = "pestspray" + pest_kill_str = 6 + +/obj/item/weapon/plantspray/pests/old + name = "bottle of pestkiller" + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle16" + +/obj/item/weapon/plantspray/pests/old/carbaryl + name = "bottle of carbaryl" + icon_state = "bottle16" + toxicity = 4 + pest_kill_str = 2 + +/obj/item/weapon/plantspray/pests/old/lindane + name = "bottle of lindane" + icon_state = "bottle18" + toxicity = 6 + pest_kill_str = 4 + +/obj/item/weapon/plantspray/pests/old/phosmet + name = "bottle of phosmet" + icon_state = "bottle15" + toxicity = 8 + pest_kill_str = 7 + + +// ************************************* +// Weedkiller defines for hydroponics +// ************************************* + +/obj/item/weedkiller + name = "bottle of weedkiller" + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle16" + flags = OPENCONTAINER | NOBLUDGEON + var/toxicity = 0 + var/weed_kill_str = 0 + +/obj/item/weedkiller/triclopyr + name = "bottle of glyphosate" + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle16" + toxicity = 4 + weed_kill_str = 2 + +/obj/item/weedkiller/lindane + name = "bottle of triclopyr" + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle18" + toxicity = 6 + weed_kill_str = 4 + +/obj/item/weedkiller/D24 + name = "bottle of 2,4-D" + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle15" + toxicity = 8 + weed_kill_str = 7 + +// ************************************* +// Nutrient defines for hydroponics +// ************************************* + +/obj/item/weapon/reagent_containers/glass/fertilizer + name = "fertilizer bottle" + desc = "A small glass bottle. Can hold up to 10 units." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle16" + flags = OPENCONTAINER + possible_transfer_amounts = null + w_class = 2.0 + + var/fertilizer //Reagent contained, if any. + + //Like a shot glass! + amount_per_transfer_from_this = 10 + volume = 10 + +/obj/item/weapon/reagent_containers/glass/fertilizer/New() + ..() + + src.pixel_x = rand(-5.0, 5) + src.pixel_y = rand(-5.0, 5) + + if(fertilizer) + reagents.add_reagent(fertilizer,10) + +/obj/item/weapon/reagent_containers/glass/fertilizer/ez + name = "bottle of E-Z-Nutrient" + icon_state = "bottle16" + fertilizer = "eznutrient" + +/obj/item/weapon/reagent_containers/glass/fertilizer/l4z + name = "bottle of Left 4 Zed" + icon_state = "bottle18" + fertilizer = "left4zed" + +/obj/item/weapon/reagent_containers/glass/fertilizer/rh + name = "bottle of Robust Harvest" + icon_state = "bottle15" + fertilizer = "robustharvest" diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 86a4f19630d..2dbedafa353 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -771,7 +771,7 @@ // When the seed in this machine mutates/is modified, the tray seed value // is set to a new datum copied from the original. This datum won't actually // be put into the global datum list until the product is harvested, though. -/datum/seed/proc/diverge(var/modified) +/datum/seed/proc/diverge(var/modified = 0) if(get_trait(TRAIT_IMMUTABLE) > 0) return @@ -793,8 +793,17 @@ new_seed.modular_icon = modular_icon new_seed.preset_icon = preset_icon - new_seed.seed_name = "[(roundstart ? "[(modified ? "modified" : "mutant")] " : "")][seed_name]" - new_seed.display_name = "[(roundstart ? "[(modified ? "modified" : "mutant")] " : "")][display_name]" + switch(modified) + if(0) //Mutant (default) + new_seed.seed_name = "mutant [seed_name]" + new_seed.display_name = "mutant [seed_name]" + if(1) //Modified + new_seed.seed_name = "modified [seed_name]" + new_seed.display_name = "modified [seed_name]" + if(2) //Enhanced + new_seed.seed_name = "enhanced [seed_name]" + new_seed.display_name = "enhanced [seed_name]" + new_seed.seed_noun = seed_noun new_seed.traits = traits.Copy() new_seed.update_growth_stages() diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index d4155f44dad..4eda71ebfd1 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -47,101 +47,14 @@ // Construction var/unwrenchable = 1 - // Reagent information for process(), consider moving this to a controller along - // with cycle information under 'mechanical concerns' at some point. - var/global/list/toxic_reagents = list( - "charcoal" = -2, - "toxin" = 2, - "fluorine" = 2.5, - "chlorine" = 1.5, - "sacid" = 1.5, - "facid" = 3, - "atrazine" = 3, - "cryoxadone" = -3, - "radium" = 2 - ) - var/global/list/nutrient_reagents = list( - "milk" = 0.1, - "beer" = 0.25, - "phosphorus" = 0.1, - "sugar" = 0.1, - "sodawater" = 0.1, - "ammonia" = 1, - "diethylamine" = 2, - "nutriment" = 1, - "protein" = 1.75, - "plantmatter" = 1.25, - "adminordrazine" = 1, - "eznutrient" = 1, - "robustharvest" = 1, - "left4zed" = 1, - "fishwater" = 0.75, - ) - var/global/list/weedkiller_reagents = list( - "fluorine" = -4, - "chlorine" = -3, - "phosphorus" = -2, - "sugar" = 2, - "sacid" = -2, - "facid" = -4, - "atrazine" = -8, - "adminordrazine" = -5 - ) - var/global/list/pestkiller_reagents = list( - "sugar" = 2, - "diethylamine" = -2, - "adminordrazine" = -5 - ) - var/global/list/water_reagents = list( - "water" = list(1, 0), - "adminordrazine" = list(1, 0), - "milk" = list(0.9, 0), - "beer" = list(0.7, 0), - "fluorine" = list(-0.5, 0), - "chlorine" = list(-0.5, 0), - "phosphorus" = list(-0.5, 0), - "water" = list(1, 0), - "sodawater" = list(1, 0), - "fishwater" = list(1, 0), - "holywater" = list(1, 0.1), - ) - - // Beneficial reagents also have values for modifying yield_mod and mut_mod (in that order). - var/global/list/beneficial_reagents = list( - // "reagent" = list(health, yield_Mod, mut_mod, production, potency), - "beer" = list( -0.05, 0, 0, 0, 0), - "fluorine" = list( -2, 0, 0, 0, 0), - "chlorine" = list( -1, 0, 0, 0, 0), - "phosphorus" = list( -0.75, 0, 0, 0, 0), - "sodawater" = list( 0.1, 0, 0, 0, 0), - "sacid" = list( -1, 0, 0, 0, 0), - "facid" = list( -2, 0, 0, 0, 0), - "atrazine" = list( -2, 0, 0.2, 0, 0), - "cryoxadone" = list( 3, 0, 0, 0, 0), - "ammonia" = list( 0.5, 0, 0, 0, 0), - "diethylamine" = list( 1, 0, 0, 0, 0), - "nutriment" = list( 0.25, 0.15, 0, 0, 0), - "protein" = list( 0.25, 0.15, 0, 0, 0), - "plantmatter" = list( 0.25, 0.15, 0, 0, 0), - "radium" = list( -1.5, 0, 0.2, 0, 0), - "adminordrazine" = list( 1, 1, 1, 0, 0), - "robustharvest" = list( 0, 0.2, 0, 0, 0), - "left4zed" = list( 0, 0, 0.2, 0, 0), - "saltpetre" = list( 0.25, 0, 0, -0.02, 0.01), - ) - - //--FalseIncarnate - // Mutagen list specifies reagent_min_value and reagent_step - // Reagent_min_value (value 1) is the minimum number of units needed to begin mutations - // Reagent_step (value 2) is the number of units between each mutation threshold - var/global/list/mutagenic_reagents = list( - "radium" = list(10,10), - "mutagen" = list(1,5) - ) - //--FalseIncarnate - var/last_plant_ikey //This is for debugging reference, and is otherwise useless. --FalseIncarnate +/* +* process() can be found in \code\modules\hydroponics\tray\tray_process.dm +* reagent handling can be found in \code\modules\hydroponics\tray\tray_reagents.dm +* icon handling can be found in \code\modules\hydroponics\tray\tray_update_icons.dm +*/ + /obj/machinery/portable_atmospherics/hydroponics/AltClick() if(mechanical && !usr.stat && !usr.lying && Adjacent(usr)) close_lid(usr) @@ -242,86 +155,6 @@ weedlevel += 1 * HYDRO_SPEED_MULTIPLIER pestlevel = 0 -//Process reagents being input into the tray. -/obj/machinery/portable_atmospherics/hydroponics/proc/process_reagents() - - if(!reagents) return - - if(reagents.total_volume <= 0) - return - -/* I have plans for this at a later date, so it's just being commented out for now --FalseIncarnate - - reagents.trans_to(temp_chem_holder, min(reagents.total_volume,rand(1,3))) - - for(var/datum/reagent/R in temp_chem_holder.reagents.reagent_list) - - var/reagent_total = temp_chem_holder.reagents.get_reagent_amount(R.id) -*/ - - for(var/datum/reagent/R in reagents.reagent_list) - - var/reagent_total = reagents.get_reagent_amount(R.id) - - if(seed && !dead) - //Handle some general level adjustments. - if(toxic_reagents[R.id]) - toxins += toxic_reagents[R.id] * reagent_total - if(weedkiller_reagents[R.id]) - weedlevel -= weedkiller_reagents[R.id] * reagent_total - if(pestkiller_reagents[R.id]) - pestlevel += pestkiller_reagents[R.id] * reagent_total - - // Beneficial reagents have a few impacts along with health buffs. - if(beneficial_reagents[R.id]) - health += beneficial_reagents[R.id][1] * reagent_total - yield_mod = min(100, yield_mod + (beneficial_reagents[R.id][2] * reagent_total)) - mutation_mod += beneficial_reagents[R.id][3] * reagent_total - if(seed.get_trait(TRAIT_PRODUCTION) > 1) - seed.set_trait(TRAIT_PRODUCTION, max(2, seed.get_trait(TRAIT_PRODUCTION) + beneficial_reagents[R.id][4] * reagent_total)) - seed.set_trait(TRAIT_POTENCY, min(100, seed.get_trait(TRAIT_POTENCY) + beneficial_reagents[R.id][5] * reagent_total)) - - // Mutagen is distinct from the previous types and mostly has a chance of proccing a mutation. - - //--FalseIncarnate - // Mutation rework, will now use "thresholds" for proccing types of mutations and their respective chances. - // This should make it easier to avoid species shifts when trying to only affect stats like potency. - // Additionally, the chance of mutations will vary depending on the amount of mutagenic reagents added. - if(mutagenic_reagents[R.id]) - var/reagent_min_value = mutagenic_reagents[R.id][1] //10 for radium, 1 for unstable mutagen - var/reagent_step = mutagenic_reagents[R.id][2] //10 for radium, 5 for unstable mutagen - - if(reagent_total >= reagent_min_value + (3 * reagent_step)) //31+ for radium, 16+ for unstable mutagen - mutate(4) - else if(reagent_total >= reagent_min_value + (2 * reagent_step)) //21-30 for radium, 11-15 for unstable mutagen - mutate(3) - else if(reagent_total >= reagent_min_value + reagent_step) //11-20 for radium, 6-10 for unstable mutagen - mutate(2) - else if(reagent_total >= reagent_min_value) //1-10 for radium, 1-5 for unstable mutagen - mutate(1) - - //--FalseIncarnate - - // Handle nutrient refilling. - if(nutrient_reagents[R.id]) - nutrilevel += nutrient_reagents[R.id] * reagent_total - - // Handle water and water refilling. - var/water_added = 0 - if(water_reagents[R.id]) - var/water_input = water_reagents[R.id][1] * reagent_total - water_added += water_input - waterlevel += water_input - health += water_reagents[R.id][2] * reagent_total - - // Water dilutes toxin level. - if(water_added > 0) - toxins -= round(water_added/4) - -// temp_chem_holder.reagents.clear_reagents() - reagents.clear_reagents() - check_health() - //Harvests the product of a plant. /obj/machinery/portable_atmospherics/hydroponics/proc/harvest(var/mob/user) @@ -528,11 +361,12 @@ health = 0 dead = 0 - nutrilevel = max(0,min(nutrilevel,maxnutri)) - waterlevel = max(0,min(waterlevel,maxwater)) - pestlevel = max(0,min(pestlevel,10)) - weedlevel = max(0,min(weedlevel,10)) - toxins = max(0,min(toxins,10)) + nutrilevel = max(0,min(nutrilevel,maxnutri)) + waterlevel = max(0,min(waterlevel,maxwater)) + pestlevel = max(0,min(pestlevel,10)) + weedlevel = max(0,min(weedlevel,10)) + toxins = max(0,min(toxins,10)) + yield_mod = min(100, yield_mod) /obj/machinery/portable_atmospherics/hydroponics/proc/mutate_species() diff --git a/code/modules/hydroponics/trays/tray_reagents.dm b/code/modules/hydroponics/trays/tray_reagents.dm index 5e5cb819b98..a2f308f9e33 100644 --- a/code/modules/hydroponics/trays/tray_reagents.dm +++ b/code/modules/hydroponics/trays/tray_reagents.dm @@ -1,126 +1,213 @@ -/obj/item/weapon/plantspray - icon = 'icons/obj/hydroponics_machines.dmi' - item_state = "spray" - flags = OPENCONTAINER | NOBLUDGEON - slot_flags = SLOT_BELT - throwforce = 4 - w_class = 2.0 - throw_speed = 2 - throw_range = 10 - var/toxicity = 4 - var/pest_kill_str = 0 - var/weed_kill_str = 0 +//Process reagents being put into the tray. +/obj/machinery/portable_atmospherics/hydroponics/proc/process_reagents() -/obj/item/weapon/plantspray/weeds // -- Skie + if(!reagents) return - name = "weed-spray" - desc = "It's a toxic mixture, in spray form, to kill small weeds." - icon_state = "weedspray" - weed_kill_str = 6 + if(reagents.total_volume <= 0) + return -/obj/item/weapon/plantspray/pests - name = "pest-spray" - desc = "It's some pest eliminator spray! Do not inhale!" - icon_state = "pestspray" - pest_kill_str = 6 + for(var/datum/reagent/R in reagents.reagent_list) -/obj/item/weapon/plantspray/pests/old - name = "bottle of pestkiller" - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle16" + var/reagent_total = reagents.get_reagent_amount(R.id) -/obj/item/weapon/plantspray/pests/old/carbaryl - name = "bottle of carbaryl" - icon_state = "bottle16" - toxicity = 4 - pest_kill_str = 2 - -/obj/item/weapon/plantspray/pests/old/lindane - name = "bottle of lindane" - icon_state = "bottle18" - toxicity = 6 - pest_kill_str = 4 - -/obj/item/weapon/plantspray/pests/old/phosmet - name = "bottle of phosmet" - icon_state = "bottle15" - toxicity = 8 - pest_kill_str = 7 + //These are here because they have checks that would clutter up the switch statement cases, and thus get handled after the switch (readability) + var/water_value = 0 + var/health_value = 0 + var/production_stat_value = 0 + var/potency_stat_value = 0 -// ************************************* -// Weedkiller defines for hydroponics -// ************************************* + switch(R.id) + /* EXAMPLE: + * + * if("example") + * //Nutrients + * nutrilevel += reagent_total * + * + * //Water + * water_value = + * + * //Toxins + * toxins += reagent_total * + * + * //Weeds and Pests + * weedlevel += reagent_total * + * pestlevel += reagent_total * + * + * //Mutagens + * handle_mutagens(reagent_total, , ) + * + * //Modifiers + * yield_mod += reagent_total * + * mutation_mod += reagent_total * + * + * //Health + * health_value = + * + * //Production Stat + * production_stat_value = + * + * //Potency Stat + * potency_stat_value = + * + */ -/obj/item/weedkiller - name = "bottle of weedkiller" - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle16" - flags = OPENCONTAINER | NOBLUDGEON - var/toxicity = 0 - var/weed_kill_str = 0 + if("adminordrazine") + nutrilevel += reagent_total * 1 + water_value = 1 + weedlevel += reagent_total * -5 + pestlevel += reagent_total * -5 + yield_mod += reagent_total * 1 + mutation_mod += reagent_total * 1 + health_value = 1 + if("ammonia") + nutrilevel += reagent_total * 1 + health_value = 0.5 + if("atrazine") + toxins += reagent_total * 3 + weedlevel += reagent_total * -8 + mutation_mod += reagent_total * 0.2 + health_value = -2 + if("beer") + nutrilevel += reagent_total * 0.25 + water_value = 0.7 + health_value = -0.05 + if("charcoal") + toxins += reagent_total * -2 + if("chlorine") + water_value = -0.5 + toxins += reagent_total * 1.5 + weedlevel += reagent_total * -3 + health_value = -1 + if("cryoxadone") + toxins += reagent_total * -3 + if(seed && !dead) + health += reagent_total * 3 + if("diethylamine") + nutrilevel += reagent_total * 2 + pestlevel += reagent_total * -2 + health_value = 1 + if("eznutrient") + nutrilevel += reagent_total * 1 + if("facid") + toxins += reagent_total * 3 + weedlevel += reagent_total * -4 + health_value = -2 + if("fishwater") + nutrilevel += reagent_total * 0.75 + water_value = 1 + if("fluorine") + water_value = -0.5 + toxins = reagent_total * 2.5 + weedlevel += reagent_total * -4 + health_value = -2 + if("holywater") + water_value = 1 + health_value = 0.1 + if("left4zed") + nutrilevel += reagent_total * 1 + mutation_mod += reagent_total * 0.2 + if("milk") + nutrilevel += reagent_total * 0.1 + water_value = 0.9 + if("mutagen") + handle_mutagens(reagent_total, 1, 5) + if("nutriment") + nutrilevel += reagent_total * 1 + yield_mod += reagent_total * 0.15 + health_value = 0.25 + if("phosphorus") + nutrilevel += reagent_total * 0.1 + water_value = -0.5 + weedlevel += reagent_total * -2 + health_value = -0.75 + if("plantmatter") + nutrilevel += reagent_total * 1.25 + yield_mod += reagent_total * 0.15 + health_value = 0.25 + if("protein") + nutrilevel += reagent_total * 1.75 + yield_mod += reagent_total * 0.15 + health_value = 0.25 + if("radium") + toxins += reagent_total * 2 + handle_mutagens(reagent_total, 10, 10) + mutation_mod += reagent_total * 0.2 + health_value = -1.5 + if("robustharvest") + nutrilevel += reagent_total * 1 + yield_mod += reagent_total * 0.2 + if("sacid") + toxins += reagent_total * 1.5 + weedlevel += reagent_total * -2 + health_value = -1 + if("saltpetre") + health_value = 0.25 + production_stat_value = -0.02 + potency_stat_value = 0.01 + if("sodawater") + nutrilevel += reagent_total * 0.1 + water_value = 1 + health_value = 0.1 + if("sugar") + nutrilevel += reagent_total * 0.1 + weedlevel += reagent_total * 2 + pestlevel += reagent_total * 2 + if("toxin") + toxins += reagent_total * 2 + if("water") + water_value = 1 -/obj/item/weedkiller/triclopyr - name = "bottle of glyphosate" - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle16" - toxicity = 4 - weed_kill_str = 2 + //END SWITCH -/obj/item/weedkiller/lindane - name = "bottle of triclopyr" - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle18" - toxicity = 6 - weed_kill_str = 4 + //Handle water changes + if(water_value) + var/water_change = 0 + water_change = reagent_total * water_value + waterlevel += water_change + if(water_value > 0) //adding water dilutes toxins + toxins -= round(water_change/4) -/obj/item/weedkiller/D24 - name = "bottle of 2,4-D" - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle15" - toxicity = 8 - weed_kill_str = 7 + //Handle health and stat changes (these require a non-dead seed to be present) + if(seed && !dead) + //Health + if(health_value) + health += reagent_total * health_value + //Stats + if(seed.get_trait(TRAIT_IMMUTABLE) <= 0) + //Production + if(production_stat_value && seed.get_trait(TRAIT_PRODUCTION) > 2) + if(!isnull(plant_controller.seeds[seed.name])) //This is so we don't affect plants in other trays unintentionally + seed = seed.diverge(2) //ENHANCE! + var/new_production = seed.get_trait(TRAIT_PRODUCTION) + (reagent_total * production_stat_value) + seed.set_trait(TRAIT_PRODUCTION, max(2, new_production)) //can't drop below 2 with this method + //Potency + if(potency_stat_value) + if(!isnull(plant_controller.seeds[seed.name])) //This is so we don't affect plants in other trays unintentionally + seed = seed.diverge(2) //ENHANCE! + var/new_potency = seed.get_trait(TRAIT_POTENCY) + (reagent_total * potency_stat_value) + seed.set_trait(TRAIT_POTENCY, max(0, min(100, new_potency))) //can't go above 100 or below 0 with this method -// ************************************* -// Nutrient defines for hydroponics -// ************************************* + //END FOR LOOP -/obj/item/weapon/reagent_containers/glass/fertilizer - name = "fertilizer bottle" - desc = "A small glass bottle. Can hold up to 10 units." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle16" - flags = OPENCONTAINER - possible_transfer_amounts = null - w_class = 2.0 + reagents.clear_reagents() + check_health() //This calls check_level_sanity, which is why it's not called from here directly - var/fertilizer //Reagent contained, if any. +/obj/machinery/portable_atmospherics/hydroponics/proc/handle_mutagens(var/amount, var/min_amount, var/step_amount) + //shouldn't be getting called without having reagent values supplied + if(!amount || !step_amount || !step_amount) + return + //shouldn't be getting called with negative values + if(amount < 0 || min_amount < 0 || step_amount < 0) + return - //Like a shot glass! - amount_per_transfer_from_this = 10 - volume = 10 - -/obj/item/weapon/reagent_containers/glass/fertilizer/New() - ..() - - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) - - if(fertilizer) - reagents.add_reagent(fertilizer,10) - -/obj/item/weapon/reagent_containers/glass/fertilizer/ez - name = "bottle of E-Z-Nutrient" - icon_state = "bottle16" - fertilizer = "eznutrient" - -/obj/item/weapon/reagent_containers/glass/fertilizer/l4z - name = "bottle of Left 4 Zed" - icon_state = "bottle18" - fertilizer = "left4zed" - -/obj/item/weapon/reagent_containers/glass/fertilizer/rh - name = "bottle of Robust Harvest" - icon_state = "bottle15" - fertilizer = "robustharvest" + if(amount > min_amount) + if(amount >= min_amount + (3 * step_amount)) + mutate(4) + else if(amount >= min_amount + (2 * step_amount)) + mutate(3) + else if(amount >= min_amount + step_amount) + mutate(2) + else if(amount >= min_amount) + mutate(1) diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index 147f02f69c1..0c08ca44949 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -297,15 +297,6 @@ icon_state = "unathiknife" attack_verb = list("ripped", "torn", "cut") -/obj/item/weapon/hatchet/tacknife - name = "tactical knife" - desc = "You'd be killing loads of people if this was Medal of Valor: Heroes of Nyx." - icon = 'icons/obj/weapons.dmi' - icon_state = "tacknife" - item_state = "knife" - attack_verb = list("stabbed", "chopped", "cut") - - /obj/item/weapon/scythe icon_state = "scythe0" name = "scythe" diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 0b4375964eb..962470c4cf1 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -248,7 +248,7 @@ return scanner.computer.inventory.Add(src) user << "[W]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'" - else if(istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/wirecutters)) + else if(istype(W, /obj/item/weapon/kitchen/knife) || istype(W, /obj/item/weapon/wirecutters)) if(carved) return user << "You begin to carve out [title]." if(do_after(user, 30, target = src)) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 6e4defb9477..be291902af4 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -530,6 +530,9 @@ var/global/list/rockTurfEdgeCache /turf/simulated/mineral/updateMineralOverlays() return +/turf/simulated/wall/updateMineralOverlays() + return + /turf/proc/fullUpdateMineralOverlays() for (var/turf/t in range(1,src)) t.updateMineralOverlays() diff --git a/code/modules/mining/surprises/vg.dm b/code/modules/mining/surprises/vg.dm index cd5b7eddf59..79905da7e6b 100644 --- a/code/modules/mining/surprises/vg.dm +++ b/code/modules/mining/surprises/vg.dm @@ -62,7 +62,7 @@ /mining_surprise/human name="Hidden Complex" floortypes = list( - /turf/simulated/floor/airless=95, + /turf/simulated/floor/plasteel/airless=95, /turf/simulated/floor/plating/airless=5 ) walltypes = list( diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index ea350268792..3fe57ec2acc 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -95,4 +95,7 @@ I'm using this for Stat to give it a more nifty interface to work with if(istype(src.loc, /obj/mecha)) var/obj/mecha/M = src.loc stat("Exosuit Charge:", "[istype(M.cell) ? "[M.cell.charge] / [M.cell.maxcharge]" : "No cell detected"]") - stat("Exosuit Integrity", "[!M.health ? "0" : "[(M.health / initial(M.health)) * 100]"]%") \ No newline at end of file + stat("Exosuit Integrity", "[!M.health ? "0" : "[(M.health / initial(M.health)) * 100]"]%") + +/mob/living/carbon/brain/can_safely_leave_loc() + return 0 //You're not supposed to be ethereal jaunting, brains \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 72970927dfe..99b65376aa1 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -261,10 +261,11 @@ AdjustStunned(-3) AdjustWeakened(-3) playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - M.visible_message( \ - "\blue [M] shakes [src] trying to wake [t_him] up!", \ - "\blue You shake [src] trying to wake [t_him] up!", \ - ) + if(!player_logged) + M.visible_message( \ + "\blue [M] shakes [src] trying to wake [t_him] up!", \ + "\blue You shake [src] trying to wake [t_him] up!", \ + ) // BEGIN HUGCODE - N3X else if (istype(src,/mob/living/carbon/human) && src:w_uniform) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c69f902c85a..1d864e8172e 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -45,6 +45,10 @@ dna.ready_dna(src) dna.real_name = real_name sync_organ_dna() //this shouldn't be necessaaaarrrryyyyyyyy + + if(species) + species.handle_dna(src) + UpdateAppearance() /mob/living/carbon/human/prepare_data_huds() @@ -281,6 +285,10 @@ stat("Chemical Storage", "[mind.changeling.chem_charges]/[mind.changeling.chem_storage]") stat("Absorbed DNA", mind.changeling.absorbedcount) + if(mind.vampire) + stat("Total Blood", "[mind.vampire.bloodtotal]") + stat("Usable Blood", "[mind.vampire.bloodusable]") + if(mind.nation) stat("Nation Name", "[mind.nation.current_name ? "[mind.nation.current_name]" : "[mind.nation.default_name]"]") stat("Nation Leader", "[mind.nation.current_leader ? "[mind.nation.current_leader]" : "None"]") diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index a5dc8f87f3b..d088720050f 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -189,7 +189,7 @@ emp_act /mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone) if(!I || !user) return 0 - if((istype(I, /obj/item/weapon/butch/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == I_HARM) + if((istype(I, /obj/item/weapon/kitchen/knife/butcher/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == I_HARM) var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(src.loc)) newmeat.name = src.real_name + newmeat.name newmeat.subjectname = src.real_name diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1decdb70bfd..5d53136a230 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1059,8 +1059,15 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc return /mob/living/carbon/human/handle_changeling() - if(mind && mind.changeling) - mind.changeling.regenerate() + if(mind) + if(mind.changeling) + mind.changeling.regenerate() + if(hud_used) + hud_used.lingchemdisplay.invisibility = 0 + hud_used.lingchemdisplay.maptext = "
[round(mind.changeling.chem_charges)]
" + else + if(hud_used) + hud_used.lingchemdisplay.invisibility = 101 /mob/living/carbon/human/handle_shock() ..() diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index 72d1a3a0e52..63806936e43 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -51,6 +51,7 @@ /datum/species/monkey/handle_dna(var/mob/living/carbon/human/H) H.dna.SetSEState(MONKEYBLOCK,1) + genemutcheck(H, MONKEYBLOCK) /datum/species/monkey/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user) switch(slot) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 79b5908ae8a..39a93731acb 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -312,10 +312,9 @@ return /datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment. - handle_dna(C) return -/datum/species/proc/handle_dna(var/mob/living/carbon/C, var/remove) //Handles DNA mutations, as that doesn't work at init. +/datum/species/proc/handle_dna(var/mob/living/carbon/C, var/remove) //Handles DNA mutations, as that doesn't work at init. Make sure you call genemutcheck on any blocks changed here return // Used for species-specific names (Vox, etc) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e4f2e957394..5a77a7a51c4 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -109,32 +109,33 @@ Please contact me on #coderbus IRC. ~Carn x #define TAIL_UNDERLIMBS_LAYER 2 #define LIMBS_LAYER 3 #define MARKINGS_LAYER 4 -#define MUTATIONS_LAYER 5 -#define DAMAGE_LAYER 6 -#define UNIFORM_LAYER 7 -#define ID_LAYER 8 -#define SHOES_LAYER 9 -#define GLOVES_LAYER 10 -#define EARS_LAYER 11 -#define SUIT_LAYER 12 -#define GLASSES_LAYER 13 -#define BELT_LAYER 14 //Possible make this an overlay of somethign required to wear a belt? -#define SUIT_STORE_LAYER 15 -#define BACK_LAYER 16 -#define TAIL_LAYER 17 //bs12 specific. this hack is probably gonna come back to haunt me -#define HAIR_LAYER 18 //TODO: make part of head layer? -#define HEAD_ACCESSORY_LAYER 19 -#define FHAIR_LAYER 20 -#define FACEMASK_LAYER 21 -#define HEAD_LAYER 22 -#define COLLAR_LAYER 23 -#define HANDCUFF_LAYER 24 -#define LEGCUFF_LAYER 25 -#define L_HAND_LAYER 26 -#define R_HAND_LAYER 27 -#define TARGETED_LAYER 28 //BS12: Layer for the target overlay from weapon targeting system -#define FIRE_LAYER 29 //If you're on fire -#define TOTAL_LAYERS 29 +#define UNDERWEAR_LAYER 5 +#define MUTATIONS_LAYER 6 +#define DAMAGE_LAYER 7 +#define UNIFORM_LAYER 8 +#define ID_LAYER 9 +#define SHOES_LAYER 10 +#define GLOVES_LAYER 11 +#define EARS_LAYER 12 +#define SUIT_LAYER 13 +#define GLASSES_LAYER 14 +#define BELT_LAYER 15 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 16 +#define BACK_LAYER 17 +#define TAIL_LAYER 18 //bs12 specific. this hack is probably gonna come back to haunt me +#define HAIR_LAYER 19 //TODO: make part of head layer? +#define HEAD_ACCESSORY_LAYER 20 +#define FHAIR_LAYER 21 +#define FACEMASK_LAYER 22 +#define HEAD_LAYER 23 +#define COLLAR_LAYER 24 +#define HANDCUFF_LAYER 25 +#define LEGCUFF_LAYER 26 +#define L_HAND_LAYER 27 +#define R_HAND_LAYER 28 +#define TARGETED_LAYER 29 //BS12: Layer for the target overlay from weapon targeting system +#define FIRE_LAYER 30 //If you're on fire +#define TOTAL_LAYERS 30 @@ -274,6 +275,8 @@ var/global/list/damage_icon_parts = list() icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]" if(part.s_col) icon_key += "[rgb(part.s_col[1], part.s_col[2], part.s_col[3])]" + if(part.s_tone) + icon_key += "[part.s_tone]" icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" @@ -329,21 +332,27 @@ var/global/list/damage_icon_parts = list() overlays_standing[LIMBS_LAYER] = image(stand_icon) // Diverts limbs to their own layer so they can overlay things (i.e. tails). //Underwear + overlays_standing[UNDERWEAR_LAYER] = null + var/icon/underwear_standing = new/icon('icons/mob/underwear.dmi',"nude") + if(underwear && species.clothing_flags & HAS_UNDERWEAR) var/datum/sprite_accessory/underwear/U = underwear_list[underwear] if(U) - stand_icon.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY) + underwear_standing.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY) if(undershirt && species.clothing_flags & HAS_UNDERSHIRT) var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt] if(U2) - stand_icon.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY) + underwear_standing.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY) if(socks && species.clothing_flags & HAS_SOCKS) var/datum/sprite_accessory/socks/U3 = socks_list[socks] if(U3) - stand_icon.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY) + underwear_standing.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY) + + if(underwear_standing) + overlays_standing[UNDERWEAR_LAYER] = image(underwear_standing) if(update_icons) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index dd514743aff..999ebacb58d 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -46,7 +46,7 @@ /mob/living/proc/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0, var/negate_armor = 0) blocked = (100-blocked)/100 - if(!effect || (blocked <= 0)) + if(!effect || (blocked <= 0)) return 0 switch(effecttype) if(STUN) @@ -77,7 +77,7 @@ updatehealth() return 1 -/mob/living/carbon/human/apply_effect(var/effect = 0, var/effecttype = STUN, var/blocked = 0) +/mob/living/carbon/human/apply_effect(var/effect = 0, var/effecttype = STUN, var/blocked = 0, var/negate_armor = 0) if((effecttype == IRRADIATE) && (species.flags & NO_DNA_RAD)) return 0 return ..() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index 34f98cb5893..7717834b7bb 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -23,6 +23,13 @@ user << "\red Access denied." return + interact(user) + +/obj/machinery/computer/drone_control/attack_ghost(mob/user as mob) + interact(user) + +/obj/machinery/computer/drone_control/interact(mob/user) + user.set_machine(src) var/dat dat += "Maintenance Units
" diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 638853c223c..5e65c6d75b8 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -26,11 +26,11 @@ return else if (is_component_functioning("power cell") && cell) if(module) - for(var/obj/item/borg/B in module.modules) + for(var/obj/item/borg/B in get_all_slots()) if(B.powerneeded) if((cell.charge * 100 / cell.maxcharge) < B.powerneeded) src << "Deactivating [B.name] due to lack of power!" - unEquip(B) + uneq_module(B) if(cell.charge <= 0) uneq_all() update_headlamp(1) diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index 219eaf59801..1c32975d5e8 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -20,7 +20,7 @@ attack_sound = 'sound/weapons/punch1.ogg' a_intent = I_HARM var/corpse = /obj/effect/landmark/mobcorpse/russian - var/weapon1 = /obj/item/weapon/kitchenknife + var/weapon1 = /obj/item/weapon/kitchen/knife min_oxy = 5 max_oxy = 0 min_tox = 0 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 399ae068586..61a94e883c3 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -412,7 +412,7 @@ user << "\blue [src] is dead, medical items won't bring it back to life." return else if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead. - if(istype(O, /obj/item/weapon/kitchenknife) || istype(O, /obj/item/weapon/butch)) + if(istype(O, /obj/item/weapon/kitchen/knife)) harvest() else user.changeNext_move(CLICK_CD_MELEE) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index ce81f116920..623905c75e7 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1436,4 +1436,8 @@ mob/proc/yank_out_object() //Can the mob see reagents inside of containers? /mob/proc/can_see_reagents() - return 0 \ No newline at end of file + return 0 + +//Can this mob leave its location without breaking things terrifically? +/mob/proc/can_safely_leave_loc() + return 1 // Yes, you can \ No newline at end of file diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index d1d05c3b7ac..a33e45b7544 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -394,12 +394,19 @@ if(!do_after(user, checktime(user, affecting), target = affecting)) return user.visible_message("[user] devours \the [affecting]!") + if(affecting.mind) + affecting.attack_log += "\[[time_stamp()]\] Has been devoured by [attacker.name] ([attacker.ckey])" + attacker.attack_log += "\[[time_stamp()]\] Devoured [affecting.name] ([affecting.ckey])" + msg_admin_attack("[key_name(attacker)] devoured [key_name(affecting)]") affecting.loc = user attacker.stomach_contents.Add(affecting) qdel(src) /obj/item/weapon/grab/proc/checkvalid(var/mob/attacker, var/mob/prey) //does all the checking for the attack proc to see if a mob can eat another with the grab + if(ishuman(attacker) && (/datum/dna/gene/basic/grant_spell/mattereater in attacker.active_genes)) // MATTER EATER CARES NOT OF YOUR FORM + return 1 + if(ishuman(attacker) && (FAT in attacker.mutations) && iscarbon(prey) && !isalien(prey)) //Fat people eating carbon mobs but not xenos return 1 diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 7eb20df76ea..c6105863622 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -627,7 +627,7 @@ datum/preferences clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "hosberet"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "beret_hos"), ICON_OVERLAY) switch(backbag) if(2) clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) @@ -668,7 +668,7 @@ datum/preferences clothes_s = new /icon(uniform_dmi, "secred_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/head.dmi', "officerberet"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "beret_officer"), ICON_OVERLAY) switch(backbag) if(2) clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 76128dae463..98c50af7dad 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -322,6 +322,7 @@ var/t = input("Enter what you want to write:", "Write", null, null) as message var/obj/item/i = usr.get_active_hand() // Check to see if he still got that darn pen, also check if he's using a crayon or pen. var/iscrayon = 0 + add_hiddenprint(usr) // No more forging nasty documents as someone else, you jerks if(!istype(i, /obj/item/weapon/pen)) if(!istype(i, /obj/item/toy/crayon)) return diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index ef5b764e7ad..af1e065bd91 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -114,13 +114,17 @@ lastwarning = world.timeofday if(damage > explosion_point) - for(var/mob/living/mob in living_mob_list) - if(istype(mob, /mob/living/carbon/human)) - //Hilariously enough, running into a closet should make you get hit the hardest. - var/mob/living/carbon/human/H = mob - H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) - var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) ) - mob.apply_effect(rads, IRRADIATE) + if(get_turf(src)) + var/turf/position = get_turf(src) + for(var/mob/living/mob in living_mob_list) + var/turf/mob_pos = get_turf(mob) + if(mob_pos && mob_pos.z == position.z) + if(ishuman(mob)) + //Hilariously enough, running into a closet should make you get hit the hardest. + var/mob/living/carbon/human/H = mob + H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) + var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) ) + mob.apply_effect(rads, IRRADIATE) explode() diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm index 40915270cd1..f4ed6c222ef 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -663,40 +663,6 @@ ..() return -/datum/reagent/ethanol/bananahonk - name = "Banana Mama" - id = "bananahonk" - description = "A drink from Clown Heaven." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#664300" // rgb: 102, 67, 0 - -/datum/reagent/ethanol/bananahonk/on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - if(istype(M, /mob/living/carbon/human) && M.job in list("Clown")) - if(!M) M = holder.my_atom - M.heal_organ_damage(1,1) - M.nutrition += nutriment_factor - ..() - return - ..() - -/datum/reagent/ethanol/silencer - name = "Silencer" - id = "silencer" - description = "A drink from Mime Heaven." - nutriment_factor = 1 * FOOD_METABOLISM - color = "#664300" // rgb: 102, 67, 0 - -/datum/reagent/ethanol/silencer/on_mob_life(var/mob/living/M as mob) - M.nutrition += nutriment_factor - if(istype(M, /mob/living/carbon/human) && M.job in list("Mime")) - if(!M) M = holder.my_atom - M.heal_organ_damage(1,1) - M.nutrition += nutriment_factor - ..() - return - ..() - /datum/reagent/ethanol/changelingsting name = "Changeling Sting" id = "changelingsting" @@ -753,4 +719,18 @@ M.confused = max(M.confused+15,15) ..() - return \ No newline at end of file + return + +/datum/reagent/ethanol/kahlua + name = "Kahlua" + id = "kahlua" + description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" + color = "#664300" // rgb: 102, 67, 0 + +/datum/reagent/ethanol/kahlua/on_mob_life(var/mob/living/M as mob) + M.dizziness = max(0,M.dizziness-5) + M.drowsyness = max(0,M.drowsyness-3) + M.sleeping = max(0,M.sleeping-2) + M.Jitter(5) + ..() + return diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm index 2e26dd2ce83..dc43ffb54b4 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm @@ -264,16 +264,36 @@ color = "#104038" // rgb: 16, 64, 56 adj_temp = -5 -/datum/reagent/drink/kahlua - name = "Kahlua" - id = "kahlua" - description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" +/datum/reagent/drink/bananahonk + name = "Banana Mama" + id = "bananahonk" + description = "A drink from Clown Heaven." + nutriment_factor = 1 * FOOD_METABOLISM color = "#664300" // rgb: 102, 67, 0 - adj_dizzy = -5 - adj_drowsy = -3 - adj_sleepy = -2 -/datum/reagent/drink/kahlua/on_mob_life(var/mob/living/M as mob) +/datum/reagent/drink/bananahonk/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + if(istype(M, /mob/living/carbon/human) && M.job in list("Clown")) + if(!M) M = holder.my_atom + M.heal_organ_damage(1,1) + M.nutrition += nutriment_factor + ..() + return ..() - M.Jitter(5) - return \ No newline at end of file + +/datum/reagent/drink/silencer + name = "Silencer" + id = "silencer" + description = "A drink from Mime Heaven." + nutriment_factor = 1 * FOOD_METABOLISM + color = "#664300" // rgb: 102, 67, 0 + +/datum/reagent/drink/silencer/on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + if(istype(M, /mob/living/carbon/human) && M.job in list("Mime")) + if(!M) M = holder.my_atom + M.heal_organ_damage(1,1) + M.nutrition += nutriment_factor + ..() + return + ..() \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index b632503f012..f9d0f1136a8 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -142,45 +142,41 @@ ..() // -> item/attackby(, params) if(istype(W,/obj/item/weapon/kitchen/utensil)) - //This will allow forks/spoons/plastic cutlery to pick up sliceables, but requires it to be unsliceable for the knife to pick it up - if((istype(W, /obj/item/weapon/kitchen/utensil/knife) && !slice_path) || !istype(W, /obj/item/weapon/kitchen/utensil/knife)) - var/obj/item/weapon/kitchen/utensil/U = W + var/obj/item/weapon/kitchen/utensil/U = W - if(!U.reagents) - U.create_reagents(5) + if(!U.reagents) + U.create_reagents(5) - if (U.reagents.total_volume > 0) - user << "\red You already have something on your [U]." - return - - user.visible_message( \ - "[user] scoops up some [src] with \the [U]!", \ - "\blue You scoop up some [src] with \the [U]!" \ - ) - - src.bitecount++ - U.overlays.Cut() - U.loaded = "[src]" - var/image/I = new(U.icon, "loadedfood") - I.color = src.filling_color - U.overlays += I - - reagents.trans_to(U,min(reagents.total_volume,5)) - - if (reagents.total_volume <= 0) - qdel(src) + if (U.reagents.total_volume > 0) + user << "\red You already have something on your [U]." return + user.visible_message( \ + "[user] scoops up some [src] with \the [U]!", \ + "\blue You scoop up some [src] with \the [U]!" \ + ) + + src.bitecount++ + U.overlays.Cut() + U.loaded = "[src]" + var/image/I = new(U.icon, "loadedfood") + I.color = src.filling_color + U.overlays += I + + reagents.trans_to(U,min(reagents.total_volume,5)) + + if (reagents.total_volume <= 0) + qdel(src) + return + if((slices_num <= 0 || !slices_num) || !slice_path) return 0 var/inaccurate = 0 if( \ - istype(W, /obj/item/weapon/kitchenknife) || \ - istype(W, /obj/item/weapon/butch) || \ - istype(W, /obj/item/weapon/scalpel) || \ - istype(W, /obj/item/weapon/kitchen/utensil/knife) \ + istype(W, /obj/item/weapon/kitchen/knife) || \ + istype(W, /obj/item/weapon/scalpel) \ ) else if( \ istype(W, /obj/item/weapon/circular_saw) || \ @@ -3328,7 +3324,7 @@ // potato + knife = raw sticks /obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W,/obj/item/weapon/kitchen/utensil/knife)) + if(istype(W,/obj/item/weapon/kitchen/knife)) new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(src) user << "You cut the potato." qdel(src) diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm index 8c1e8544014..12fb6f6db69 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm @@ -11,10 +11,8 @@ /obj/item/weapon/reagent_containers/food/snacks/meat/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if( \ - istype(W, /obj/item/weapon/kitchenknife) || \ - istype(W, /obj/item/weapon/butch) || \ - istype(W, /obj/item/weapon/scalpel) || \ - istype(W, /obj/item/weapon/kitchen/utensil/knife) \ + istype(W, /obj/item/weapon/kitchen/knife) || \ + istype(W, /obj/item/weapon/scalpel) \ ) new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index a09f058629c..6e5bcf0389b 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -183,7 +183,7 @@ id = "kitchen_knife" build_type = AUTOLATHE materials = list(MAT_METAL = 12000) - build_path = /obj/item/weapon/kitchenknife + build_path = /obj/item/weapon/kitchen/knife category = list("initial","Miscellaneous") /datum/design/pipe_painter diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm index a4d33d1b4b2..b32bc190aee 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm +++ b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm @@ -43,7 +43,7 @@ /obj/item/weapon/autopsy_scanner,\ /obj/item/weapon/bikehorn,\ /obj/item/weapon/bonesetter,\ - /obj/item/weapon/butch,\ + /obj/item/weapon/kitchen/knife/butcher,\ /obj/item/weapon/caution,\ /obj/item/clothing/head/cone,\ /obj/item/weapon/crowbar,\ @@ -53,7 +53,7 @@ /obj/item/weapon/hatchet,\ /obj/item/weapon/restraints/handcuffs,\ /obj/item/weapon/hemostat,\ - /obj/item/weapon/kitchenknife,\ + /obj/item/weapon/kitchen/knife,\ /obj/item/weapon/lighter,\ /obj/item/weapon/lighter,\ /obj/item/weapon/light/bulb,\ diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/research/xenoarchaeology/finds/finds.dm index 01ce550c045..6cbe31a7ed9 100644 --- a/code/modules/research/xenoarchaeology/finds/finds.dm +++ b/code/modules/research/xenoarchaeology/finds/finds.dm @@ -138,7 +138,7 @@ if(prob(25)) new_item = new /obj/item/weapon/kitchen/utensil/fork(src.loc) else if(prob(50)) - new_item = new /obj/item/weapon/kitchen/utensil/knife(src.loc) + new_item = new /obj/item/weapon/kitchen/knife(src.loc) else new_item = new /obj/item/weapon/kitchen/utensil/spoon(src.loc) additional_desc = "[pick("It's like no [item_type] you've ever seen before",\ @@ -164,7 +164,7 @@ "You wonder what kind of music was made with it")]." if(6) item_type = "[pick("bladed knife","serrated blade","sharp cutting implement")]" - new_item = new /obj/item/weapon/kitchenknife(src.loc) + new_item = new /obj/item/weapon/kitchen/knife(src.loc) additional_desc = "[pick("It doesn't look safe.",\ "It looks wickedly jagged",\ "There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains along the edges")]." diff --git a/code/modules/store/items.dm b/code/modules/store/items.dm index aec8a45cc2c..489caa96a91 100644 --- a/code/modules/store/items.dm +++ b/code/modules/store/items.dm @@ -105,73 +105,73 @@ typepath = /obj/item/weapon/toddler cost = 1000 -/datum/storeitem/flag/slime +/datum/storeitem/flag_slime name = "Slime People flag" desc = "A flag proudly proclaiming the superior heritage of Slime People." typepath = /obj/item/flag/species/slime cost = 1000 -/datum/storeitem/flag/skrell +/datum/storeitem/flag_skrell name = "Skrell flag" desc = "A flag proudly proclaiming the superior heritage of Skrell." typepath = /obj/item/flag/species/skrell cost = 1000 -/datum/storeitem/flag/vox +/datum/storeitem/flag_vox name = "Vox flag" desc = "A flag proudly proclaiming the superior heritage of Vox." typepath = /obj/item/flag/species/vox cost = 1000 -/datum/storeitem/flag/machine +/datum/storeitem/flag_machine name = "Synthetics flag" desc = "A flag proudly proclaiming the superior heritage of Synthetics." typepath = /obj/item/flag/species/machine cost = 1000 -/datum/storeitem/flag/diona +/datum/storeitem/flag_diona name = "Diona flag" desc = "A flag proudly proclaiming the superior heritage of Dionae." typepath = /obj/item/flag/species/diona cost = 1000 -/datum/storeitem/flag/human +/datum/storeitem/flag_human name = "Human flag" desc = "A flag proudly proclaiming the superior heritage of Humans." typepath = /obj/item/flag/species/human cost = 1000 -/datum/storeitem/flag/greys +/datum/storeitem/flag_greys name = "Greys flag" desc = "A flag proudly proclaiming the superior heritage of Greys." typepath = /obj/item/flag/species/greys cost = 1000 -/datum/storeitem/flag/kidan +/datum/storeitem/flag_kidan name = "Kidan flag" desc = "A flag proudly proclaiming the superior heritage of Kidan." typepath = /obj/item/flag/species/kidan cost = 1000 -/datum/storeitem/flag/taj +/datum/storeitem/flag_taj name = "Tajaran flag" desc = "A flag proudly proclaiming the superior heritage of Tajara." typepath = /obj/item/flag/species/taj cost = 1000 -/datum/storeitem/flag/unathi +/datum/storeitem/flag_unathi name = "Unathi flag" desc = "A flag proudly proclaiming the superior heritage of Unathi." typepath = /obj/item/flag/species/unathi cost = 1000 -/datum/storeitem/flag/vulp +/datum/storeitem/flag_vulp name = "Vulpkanin flag" desc = "A flag proudly proclaiming the superior heritage of Vulpkanin." typepath = /obj/item/flag/species/vulp cost = 1000 -/datum/storeitem/flag/ian +/datum/storeitem/flag_ian name = "Ian flag" desc = "The banner of Ian, because SQUEEEEE." typepath = /obj/item/flag/ian diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index 3ab54efc376..1b48f015dd5 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -27,7 +27,7 @@ /obj/item/weapon/scalpel/laser1 = 105, \ /obj/item/weapon/scalpel/manager = 120, \ /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchenknife = 75, \ + /obj/item/weapon/kitchen/knife = 75, \ /obj/item/weapon/shard = 50, \ ) diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index f07cef38b97..fd49360815f 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -30,7 +30,7 @@ /obj/item/weapon/scalpel/laser1 = 105, \ /obj/item/weapon/scalpel/manager = 120, \ /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchenknife = 75, \ + /obj/item/weapon/kitchen/knife = 75, \ /obj/item/weapon/shard = 50, \ /obj/item/weapon/scissors = 10, \ /obj/item/weapon/twohanded/chainsaw = 1, \ diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 1121810b837..da775298e29 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -59,7 +59,7 @@ name = "remove dead tissue" allowed_tools = list( /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchenknife = 75, \ + /obj/item/weapon/kitchen/knife = 75, \ /obj/item/weapon/shard = 50, \ ) diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 9a1460d98f2..cc3a6abeafb 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -52,7 +52,7 @@ allowed_tools = list( /obj/item/weapon/screwdriver = 100, /obj/item/weapon/coin = 50, - /obj/item/weapon/kitchen/utensil/knife = 50 + /obj/item/weapon/kitchen/knife = 50 ) max_duration = 110 diff --git a/code/modules/surgery/slime.dm b/code/modules/surgery/slime.dm index c822dc0d8b4..198fc54effc 100644 --- a/code/modules/surgery/slime.dm +++ b/code/modules/surgery/slime.dm @@ -17,7 +17,7 @@ /datum/surgery_step/slime/cut_flesh allowed_tools = list( /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchenknife = 75, \ + /obj/item/weapon/kitchen/knife = 75, \ /obj/item/weapon/shard = 50, \ ) @@ -45,7 +45,7 @@ /datum/surgery_step/slime/cut_innards allowed_tools = list( /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchenknife = 75, \ + /obj/item/weapon/kitchen/knife = 75, \ /obj/item/weapon/shard = 50, \ ) diff --git a/config/example/config.txt b/config/example/config.txt index 835edc66e4d..c21bbcec76e 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -70,23 +70,27 @@ KICK_INACTIVE ## ## default probablity is 1, increase to make that mode more likely to be picked ## set to 0 to disable that mode -PROBABILITY EXTENDED 1 -PROBABILITY MALFUNCTION 4 -PROBABILITY NUCLEAR 4 -PROBABILITY CHANGELING 4 +PROBABILITY EXTENDED 2 +PROBABILITY MALFUNCTION 2 +PROBABILITY NUCLEAR 3 +PROBABILITY CHANGELING 3 PROBABILITY CULT 4 -PROBABILITY EXTEND-A-TRAITORMONGOUS 6 +PROBABILITY EXTEND-A-TRAITORMONGOUS 5 PROBABILITY TRAITORCHAN 4 -PROBABILITY BLOB 4 -PROBABILITY REVOLUTION 2 -PROBABILITY HEIST 4 +PROBABILITY BLOB 2 +PROBABILITY REVOLUTION 0 +PROBABILITY HEIST 1 PROBABILITY WIZARD 2 -PROBABILITY VAMPIRE 4 +PROBABILITY VAMPIRE 3 PROBABILITY RAGINMAGES 0 PROBABILITY BORER 0 -PROBABILITY XENOS 2 -PROBABILITY MUTINY 1 -PROBABILITY METEOR 0 +PROBABILITY XENOS 0 +PROBABILITY MUTINY 0 +PROBABILITY METEOR 1 +PROBABILITY TRAITOR 0 +PROBABILITY SHADOWLING 2 +PROBABILITY NATIONS 1 +PROBABILITY RP-REVOLUTION 0 ## Hash out to disable random events during the round. ALLOW_RANDOM_EVENTS @@ -196,10 +200,10 @@ LOAD_JOBS_FROM_TXT ## Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR ALLOW_HOLIDAYS ##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother. -TICKLAG 0.9 +TICKLAG 0.5 ## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered. -TICKCOMP 0 +TICKCOMP 1 ## Whether the server will talk to other processes through socket_talk SOCKET_TALK 0 diff --git a/config/example/game_options.txt b/config/example/game_options.txt index 69847e0a6b6..9ccb4871aef 100644 --- a/config/example/game_options.txt +++ b/config/example/game_options.txt @@ -69,7 +69,8 @@ BOMBCAP 20 ### ROUNDSTART SILICON LAWS ### ## This controls what the AI's laws are at the start of the round. -## Set to 0/commented for "off", silicons will just start with Crewsimov. -## Set to 1 for "random", silicons will start with a random lawset picked from (at the time of writing): Nanotrasen Default, P.A.L.A.D.I.N., Corporate, Robop and Crewsimov. More can be added by changing the law datum "default" variable in ai_laws.dm. +## Set to 0/commented for "off", silicons will just start with Asimov. +## Set to 1 for "custom", silicons will start with the custom laws defined in silicon_laws.txt. (If silicon_laws.txt is empty, the AI will spawn with asimov and Custom boards will auto-delete.) +## Set to 2 for "random", silicons will start with a random lawset picked from (at the time of writing): P.A.L.A.D.I.N., Corporate, Asimov. More can be added by changing the law datum paths in ai_laws.dm. -DEFAULT_LAWS 1 \ No newline at end of file +DEFAULT_LAWS 2 \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 909ef42baf8..5b3b5c496a2 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,57 @@ -->
+

24 January 2016

+

KasparoVy updated:

+
    +
  • Fixes markings overlaying underwear.
  • +
  • Nude icon in underwear.dmi
  • +
  • Fixes Vox robes not using the correct on-mob sprites.
  • +
  • Fixes unreported bug where there was a slim chance during character preview icon generation that a character with Security Officer set to high would get rendered with either the wrong beret sprite or no beret sprite at all.
  • +
  • Fixes an issue where Sigholt's fluff beret wasn't using the correct sprites.
  • +
+

Tastyfish updated:

+
    +
  • Passively power-consuming borg modules, such as the peacekeeper movement and shield module, won't spam the user infinitely if they're low on power anymore.
  • +
+ +

23 January 2016

+

Fox McCloud updated:

+
    +
  • Removes Vampire HUD
  • +
  • moves the Vampire blood counter to a more easy to see location
  • +
  • Adds in a Changeling chemical counter display
  • +
  • Adds in a Changeling sting counter display
  • +
  • Vampire total blood and usable blood will now appear under status
  • +
  • Changes vampire blood display to be similar to ling chemical counter
  • +
  • Fixes unnecessary toxin damage being dealt on severe bloodloss
  • +
  • Fixes human mobs not receiving proper random names
  • +
  • Adds in knight armor
  • +
  • Grants the chaplain a set of crusader knight armor
  • +
  • Adds in cult-resistant ERT paranormal space suit
  • +
  • Allows the Chaplain to convert his null rod into a holy sword with crusader knight armor
  • +
  • Chaplain's closet is now a secure closet
  • +
  • Adds in Assault Gear crate to cargo
  • +
  • Adds in military assault belt
  • +
  • Adds in spaceworthy swat suits
  • +
  • tweaks bandolier to hold 2 additional shotgun shells
  • +
  • bartender starts off with +2 additional shells
  • +
  • Reduces the cost of the space suit crate and doubles its contents
  • +
  • Refactors knives so their behavior is more universal
  • +
  • Fixes Hulk not properly being removed when your health drops below a threshold
  • +
  • Fixes flickering vision in a mining mech
  • +
+

Tastyfish updated:

+
    +
  • Poly has taken a seminar on the latest trends in engine operations.
  • +
  • Player-controller parrots can now hear their headsets.
  • +
+

Tigerbat2000 updated:

+
    +
  • The nuclear disk escaping on the shuttle no longer counts as a syndicate minor victory.
  • +
  • Cultists can once again actually greentext the escape objective.
  • +
+

20 January 2016

DarkPyrolord updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f880e8a82b7..f4354614ba6 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -242,3 +242,47 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. TheDZD: - rscadd: Adds world.Topic() handling so that users are notified in-game when pull requests are opened, closed, or merged on the Github repo. +2016-01-23: + Fox McCloud: + - rscdel: Removes Vampire HUD + - tweak: moves the Vampire blood counter to a more easy to see location + - rscadd: Adds in a Changeling chemical counter display + - rscadd: Adds in a Changeling sting counter display + - rscadd: Vampire total blood and usable blood will now appear under status + - tweak: Changes vampire blood display to be similar to ling chemical counter + - bugfix: Fixes unnecessary toxin damage being dealt on severe bloodloss + - bugfix: Fixes human mobs not receiving proper random names + - rscadd: Adds in knight armor + - rscadd: Grants the chaplain a set of crusader knight armor + - rscadd: Adds in cult-resistant ERT paranormal space suit + - rscadd: Allows the Chaplain to convert his null rod into a holy sword with crusader + knight armor + - tweak: Chaplain's closet is now a secure closet + - rscadd: Adds in Assault Gear crate to cargo + - rscadd: Adds in military assault belt + - rcsadd: Adds in spaceworthy swat suits + - tweak: tweaks bandolier to hold 2 additional shotgun shells + - tweak: bartender starts off with +2 additional shells + - tweak: Reduces the cost of the space suit crate and doubles its contents + - rscadd: Refactors knives so their behavior is more universal + - bugfix: Fixes Hulk not properly being removed when your health drops below a threshold + - bugfix: Fixes flickering vision in a mining mech + Tastyfish: + - rscadd: Poly has taken a seminar on the latest trends in engine operations. + - rscadd: Player-controller parrots can now hear their headsets. + Tigerbat2000: + - bugfix: The nuclear disk escaping on the shuttle no longer counts as a syndicate + minor victory. + - bugfix: Cultists can once again actually greentext the escape objective. +2016-01-24: + KasparoVy: + - bugfix: Fixes markings overlaying underwear. + - rscadd: Nude icon in underwear.dmi + - bugfix: Fixes Vox robes not using the correct on-mob sprites. + - bugfix: Fixes unreported bug where there was a slim chance during character preview + icon generation that a character with Security Officer set to high would get + rendered with either the wrong beret sprite or no beret sprite at all. + - bugfix: Fixes an issue where Sigholt's fluff beret wasn't using the correct sprites. + Tastyfish: + - bugfix: Passively power-consuming borg modules, such as the peacekeeper movement + and shield module, won't spam the user infinitely if they're low on power anymore. diff --git a/html/changelogs/AutoChangeLog-pr-3297.yml b/html/changelogs/AutoChangeLog-pr-3297.yml deleted file mode 100644 index 6ec85f85392..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3297.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Tastyfish -delete-after: True -changes: - - rscadd: "Poly has taken a seminar on the latest trends in engine operations." - - rscadd: "Player-controller parrots can now hear their headsets." diff --git a/html/changelogs/AutoChangeLog-pr-3305.yml b/html/changelogs/AutoChangeLog-pr-3305.yml deleted file mode 100644 index 8dd8c60a9a9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3305.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscdel: "Removes Vampire HUD" - - tweak: "moves the Vampire blood counter to a more easy to see location" diff --git a/html/changelogs/AutoChangeLog-pr-3314.yml b/html/changelogs/AutoChangeLog-pr-3314.yml deleted file mode 100644 index 0e2e2aab2e6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3314.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes unnecessary toxin damage being dealt on severe bloodloss" diff --git a/html/changelogs/AutoChangeLog-pr-3318.yml b/html/changelogs/AutoChangeLog-pr-3318.yml deleted file mode 100644 index 4ef10030f9a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3318.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes human mobs not receiving proper random names" diff --git a/html/changelogs/AutoChangeLog-pr-3379.yml b/html/changelogs/AutoChangeLog-pr-3379.yml new file mode 100644 index 00000000000..da3c4446cee --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3379.yml @@ -0,0 +1,4 @@ +author: TheDZD +delete-after: True +changes: + - rscdel: "Due to budget cuts and reports of operatives accidentally firing enough bullets to reach a state of what our scientists refer to as \"enough dakka,\" Syndicate High Command has decided to restore the Syndicate Strike Team arsenal to using standard-issue L6 SAW ammunition." diff --git a/html/changelogs/AutoChangeLog-pr-3384.yml b/html/changelogs/AutoChangeLog-pr-3384.yml new file mode 100644 index 00000000000..d8a87e2e37f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3384.yml @@ -0,0 +1,6 @@ +author: KasparoVy +delete-after: True +changes: + - rscadd: "Navy blue Centcom Officer's beret for use by the Blueshield." + - rscadd: "Adds the new navy blue beret to the Blueshield's locker." + - tweak: "Gives the Blueshield's berets (black and navy blue) the exact same strip delay and armour as the Security Officer's beret." diff --git a/html/changelogs/AutoChangeLog-pr-3385.yml b/html/changelogs/AutoChangeLog-pr-3385.yml new file mode 100644 index 00000000000..3cce520a211 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3385.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes mutadone not working with some genetic mutations" diff --git a/html/changelogs/AutoChangeLog-pr-3386.yml b/html/changelogs/AutoChangeLog-pr-3386.yml new file mode 100644 index 00000000000..0c6b51358df --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3386.yml @@ -0,0 +1,6 @@ +author: KasparoVy +delete-after: True +changes: + - rscadd: "Adds TG energy katana back and belt sprite." + - rscadd: "Bo staff back sprite." + - tweak: "Adjusts energy katana sprites to make the weapon stand out a bit more from the regular katana." diff --git a/html/changelogs/AutoChangeLog-pr-3388.yml b/html/changelogs/AutoChangeLog-pr-3388.yml new file mode 100644 index 00000000000..60d649a344c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3388.yml @@ -0,0 +1,4 @@ +author: FalseIncarnate +delete-after: True +changes: + - tweak: "Allows plants to be identified as enhanced*. Enhancing plants results from using reagents (like saltpetre) that affect the stats of a seed instead of using mutagens/machines. *May not meet standards for being classified as \"organic produce\". (This was already possible, just renames enhanced plants for easier differentiation)" diff --git a/html/changelogs/AutoChangeLog-pr-3392.yml b/html/changelogs/AutoChangeLog-pr-3392.yml new file mode 100644 index 00000000000..3b57dd7fc1c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3392.yml @@ -0,0 +1,7 @@ +author: KasparoVy +delete-after: True +changes: + - rscadd: "Cutting open the toes of footwear so species with feet-claws can wear them." + - rscadd: "Toeless jackboots." + - tweak: "Cleans up glovesnipping and lighting a match with a shoe." + - tweak: "Lighting a match with a shoe produces a more appropriate message, handled at the same standard as glove-snippingboot-cutting." diff --git a/html/changelogs/AutoChangeLog-pr-3394.yml b/html/changelogs/AutoChangeLog-pr-3394.yml new file mode 100644 index 00000000000..f56462f155a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3394.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - bugfix: "For a short while, there was a clerical error where all AI communications equipment was replaced with bananas. This has now been fixed." diff --git a/html/changelogs/AutoChangeLog-pr-3395.yml b/html/changelogs/AutoChangeLog-pr-3395.yml new file mode 100644 index 00000000000..fd7104d3e0b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3395.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - tweak: "Ghosts can now see the contents of smartfridges and look at the drone console" diff --git a/html/changelogs/AutoChangeLog-pr-3397.yml b/html/changelogs/AutoChangeLog-pr-3397.yml new file mode 100644 index 00000000000..ca3b753840d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3397.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - tweak: "Humans now only produce one message when shaken while SSD" diff --git a/html/changelogs/AutoChangeLog-pr-3400.yml b/html/changelogs/AutoChangeLog-pr-3400.yml new file mode 100644 index 00000000000..3e184cf978c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3400.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - bugfix: "The supermatter no longer will irradiate everyone, everywhere, when it explodes." diff --git a/html/changelogs/AutoChangeLog-pr-3403.yml b/html/changelogs/AutoChangeLog-pr-3403.yml new file mode 100644 index 00000000000..e5ab05752a6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3403.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - tweak: "Writing on paper will now add hidden admin fingerprints, so that you can't forge mean notes in someone else's name." diff --git a/html/changelogs/AutoChangeLog-pr-3404.yml b/html/changelogs/AutoChangeLog-pr-3404.yml new file mode 100644 index 00000000000..d90bc2756fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3404.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - bugfix: "Brains are no longer able to escape their brain by being a sorcerer." diff --git a/html/changelogs/AutoChangeLog-pr-3405.yml b/html/changelogs/AutoChangeLog-pr-3405.yml new file mode 100644 index 00000000000..d9b908950b6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3405.yml @@ -0,0 +1,5 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes banana honk and silencer being alcoholic" + - bugfix: "Fixes Kahlua being non-alcoholic" diff --git a/html/changelogs/AutoChangeLog-pr-3408.yml b/html/changelogs/AutoChangeLog-pr-3408.yml new file mode 100644 index 00000000000..55798dff397 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3408.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes polonium not metabolizing" diff --git a/html/changelogs/AutoChangeLog-pr-3409.yml b/html/changelogs/AutoChangeLog-pr-3409.yml new file mode 100644 index 00000000000..3fe83d8fac6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3409.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes being able to receive free unlimited boxes from the Merchandise store" diff --git a/html/changelogs/crazylemon-mateat_tweak.yml b/html/changelogs/crazylemon-mateat_tweak.yml new file mode 100644 index 00000000000..21d1b4b136d --- /dev/null +++ b/html/changelogs/crazylemon-mateat_tweak.yml @@ -0,0 +1,5 @@ +author: Crazylemon +delete-after: True +changes: + - rscadd: "Matter eater now allows you to eat humans as if you were fat." + - tweak: "Eating mobs with an aggressive grab now generates attack logs." diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 0866d0b0879..534a839f306 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 24e7f335be8..38b7f17c679 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index b9cccb43949..e13cab2b876 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index a1abbab88fa..67f9603ece6 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/screen1.dmi b/icons/mob/screen1.dmi index b6a84df335a..27f7a09e530 100644 Binary files a/icons/mob/screen1.dmi and b/icons/mob/screen1.dmi differ diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi index a5db2fc5295..5df540c49bf 100644 Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 4086b325986..a30a79e335d 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi index ad2327aab2d..928163c75ec 100644 Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index 3d536e76369..0f36e755b78 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index a55b4a75ae2..85d9cffdbfc 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index a7c70887251..a7cc00338f5 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index cab7cc16e7c..56a2195ad69 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 41ba51b9107..1bb43439df7 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 8dfce143f65..68ccb9f003e 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 46c2cfdb9f4..c14150ae21e 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/nano/assets/nano.js b/nano/assets/nano.js index ec4d919ebd1..9ae1ecc460a 100644 --- a/nano/assets/nano.js +++ b/nano/assets/nano.js @@ -1 +1 @@ -function NanoStateDefaultClass(){this.key="default",this.key=this.key.toLowerCase(),NanoStateManager.addState(this)}function NanoStateClass(){}var NanoUtility=function(){var e={};return{init:function(){var t=$("body");e=t.data("urlParameters")},generateHref:function(t){var n="?";for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);for(var a in t)t.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+t[a]);return n},winset:function(e,t,n){var a,r;return null==n&&(n=NanoStateManager.getData().config.window.ref),a={},a[n+"."+e]=t,r=a,location.href=NanoUtility.href("winset",r)},extend:function(e,t){return Object.keys(t).forEach(function(n){var a;return a=t[n],a&&"[object Object]"===Object.prototype.toString.call(a)?(e[n]=e[n]||{},NanoUtility.extend(e[n],a)):e[n]=a}),e},href:function(e,t){return null==e&&(e=""),null==t&&(t={}),e=new Url("byond://"+e),NanoUtility.extend(e.query,t),e},close:function(){var t;return t={command:"nanoclose "+e.src},this.winset("is-visible","false"),location.href=NanoUtility.href("winset",t)}}}();"undefined"==typeof jQuery&&reportError("ERROR: Javascript library failed to load!"),"undefined"==typeof doT&&reportError("ERROR: Template engine failed to load!");var reportError=function(e){window.location="byond://?nano_err="+encodeURIComponent(e),alert(e)};$(document).ready(function(){NanoUtility.init(),NanoStateManager.init(),NanoTemplate.init(),NanoWindow.init()}),Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var t=this.length,n=Number(arguments[1])||0;for(n=0>n?Math.ceil(n):Math.floor(n),0>n&&(n+=t);t>n;n++)if(n in this&&this[n]===e)return n;return-1}),String.prototype.format||(String.prototype.format=function(e){var t=this;return t.replace(String.prototype.format.regex,function(t){var n,a=parseInt(t.substring(1,t.length-1));return n=a>=0?e[a]:-1===a?"{":-2===a?"}":""})},String.prototype.format.regex=new RegExp("{-?[0-9]+}","g")),Object.size=function(e){var t,n=0;for(var t in e)e.hasOwnProperty(t)&&n++;return n},window.console||(window.console={log:function(e){return!1}}),String.prototype.toTitleCase=function(){var e=/^(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|vs?\.?|via)$/i;return this.replace(/([^\W_]+[^\s-]*) */g,function(t,n,a,r){return a>0&&a+n.length!==r.length&&n.search(e)>-1&&":"!==r.charAt(a-2)&&r.charAt(a-1).search(/[^\s-]/)<0?t.toLowerCase():n.substr(1).search(/[A-Z]|\../)>-1?t:t.charAt(0).toUpperCase()+t.substr(1)})},$.ajaxSetup({cache:!1}),Function.prototype.inheritsFrom=function(e){return this.prototype=new e,this.prototype.constructor=this,this.prototype.parent=e.prototype,this},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),String.prototype.ckey||(String.prototype.ckey=function(){return this.replace(/\W/g,"").toLowerCase()}),NanoStateManager=function(){var e=!1,t=null,n={},a={},r={},o=null,i=function(){t=$("body").data("initialData"),null!=t&&t.hasOwnProperty("config")&&t.hasOwnProperty("data")||reportError("Error: Initial data did not load correctly.");var n="default";t.config.hasOwnProperty("stateKey")&&t.config.stateKey&&(n=t.config.stateKey.toLowerCase()),NanoStateManager.setCurrentState(n),$(document).on("templatesLoaded",function(){l(t),e=!0})},s=function(n){var a;try{a=jQuery.parseJSON(n)}catch(r){return void reportError("recieveUpdateData failed.
    Error name: "+r.name+"
    Error Message: "+r.message)}a.hasOwnProperty("data")||(t&&t.hasOwnProperty("data")?a.data=t.data:a.data={}),e?l(a):t=a},l=function(e){if(null!=o){if(e=o.onBeforeUpdate(e),e===!1)return void reportError("data is false, return");t=e,o.onUpdate(t),o.onAfterUpdate(t)}},c=function(e,t){for(var n in e)e.hasOwnProperty(n)&&jQuery.isFunction(e[n])&&(t=e[n].call(this,t));return t};return{init:function(){i()},receiveUpdateData:function(e){s(e)},addBeforeUpdateCallback:function(e,t){n[e]=t},addBeforeUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addBeforeUpdateCallback(t,e[t])},removeBeforeUpdateCallback:function(e){n.hasOwnProperty(e)&&delete n[e]},executeBeforeUpdateCallbacks:function(e){return c(n,e)},addAfterUpdateCallback:function(e,t){a[e]=t},addAfterUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addAfterUpdateCallback(t,e[t])},removeAfterUpdateCallback:function(e){a.hasOwnProperty(e)&&delete a[e]},executeAfterUpdateCallbacks:function(e){return c(a,e)},addState:function(e){return e instanceof NanoStateClass?e.key?void(r[e.key]=e):void reportError("ERROR: Attempted to add a state with an invalid stateKey"):void reportError("ERROR: Attempted to add a state which is not instanceof NanoStateClass")},setCurrentState:function(e){if("undefined"==typeof e||!e)return reportError("ERROR: No state key was passed!"),!1;if(!r.hasOwnProperty(e))return reportError("ERROR: Attempted to set a current state which does not exist: "+e),!1;var t=o;return o=r[e],null!=t&&t.onRemove(o),o.onAdd(t),!0},getCurrentState:function(){return o},getData:function(){return t}}}(),NanoBaseCallbacks=function(){var e=!0,t={},n={status:function(t){var n;return 2==t.config.status?(n="good",$(".linkActive").removeClass("inactive")):1==t.config.status?(n="average",$(".linkActive").addClass("inactive")):(n="bad",$(".linkActive").addClass("inactive")),$(".statusicon").each(function(e,t){t.className=t.className.replace(/good|bad|average/g,""),t.classList.add(n)}),$(".linkActive").stopTime("linkPending"),$(".linkActive").removeClass("linkPending"),$(".linkActive").off("click").on("click",function(n){n.preventDefault();var a=$(this).data("href");null!=a&&e&&(e=!1,$("body").oneTime(300,"enableClick",function(){e=!0}),2==t.config.status&&$(this).oneTime(300,"linkPending",function(){$(this).addClass("linkPending")}),window.location.href=a)}),t},nanomap:function(e){return $(".mapIcon").off("mouseenter mouseleave").on("mouseenter",function(e){$("#uiMapTooltip").html($(this).children(".tooltip").html()).show().stopTime().oneTime(5e3,"hideTooltip",function(){$(this).fadeOut(500)})}),$(".zoomLink").off("click").on("click",function(e){e.preventDefault();var t=$(this).data("zoomLevel"),n=$("#uiMap"),a=n.width()*t,r=n.height()*t;n.css({zoom:t,left:"50%",top:"50%",marginLeft:"-"+Math.floor(a/2)+"px",marginTop:"-"+Math.floor(r/2)+"px"})}),$("#uiMapImage").attr("src","nanomap_z"+e.config.mapZLevel+".png"),e}};return{addCallbacks:function(){NanoStateManager.addBeforeUpdateCallbacks(t),NanoStateManager.addAfterUpdateCallbacks(n)},removeCallbacks:function(){for(var e in t)t.hasOwnProperty(e)&&NanoStateManager.removeBeforeUpdateCallback(e);for(var e in n)n.hasOwnProperty(e)&&NanoStateManager.removeAfterUpdateCallback(e)}}}(),NanoBaseHelpers=function(){var e={syndicateMode:function(){return $("body").css("background-color","#8f1414"),$("body").css("background-image","url('uiBackground-Syndicate.png')"),$("body").css("background-position","50% 0"),$("body").css("background-repeat","repeat-x"),$("#uiTitleFluff").css("background-image","url('uiTitleFluff-Syndicate.png')"),$("#uiTitleFluff").css("background-position","50% 50%"),$("#uiTitleFluff").css("background-repeat","no-repeat"),""},combine:function(e,t){return e&&t?e.concat(t):e||t},dump:function(e){return JSON.stringify(e)},link:function(e,t,n,a,r,o){var i="",s="noIcon";"undefined"!=typeof t&&t&&(i='
    ',s="hasIcon"),"undefined"!=typeof r&&r||(r="link");var l="";return"undefined"!=typeof o&&o&&(l='id="'+o+'"'),"undefined"!=typeof a&&a?'":'
    "+i+e+"
    "},xor:function(e,t){return e^t},precisionRound:function(e,t){if(0==t)return Math.round(number);var n=Math.pow(10,t);return Math.round(e*n)/n},round:function(e){return Math.round(e)},fixed:function(e){return Math.round(10*e)/10},floor:function(e){return Math.floor(e)},ceil:function(e){return Math.ceil(e)},string:function(){if(0==arguments.length)return"";if(1==arguments.length)return arguments[0];if(arguments.length>1){stringArgs=[];for(var e=1;et?t>e?e=t:e>n&&(e=n):e>t?e=t:n>e&&(e=n),"undefined"!=typeof a&&a||(a=""),"undefined"!=typeof r&&r||(r="");var o=Math.round((e-t)/(n-t)*100);return'
    '+r+"
    "},dangerToClass:function(e){return 0==e?"good":1==e?"average":"bad"},dangerToSpan:function(e){return 0==e?'"Good"':1==e?'"Minor Alert"':'"Major Alert"'},generateHref:function(e){var t=$("body");_urlParameters=t.data("urlParameters");var n="?";for(var a in _urlParameters)_urlParameters.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+_urlParameters[a]);for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);return n},displayDNABlocks:function(e,t,n,a,r){if(!e)return'
    Please place a valid subject into the DNA modifier.
    ';var o=e.split(""),i='
    ',s=1,l=1;for(var c in o)if(o.hasOwnProperty(c)&&"object"!=typeof o[c]){var u;u="UI"==r.toUpperCase()?{selectUIBlock:s,selectUISubblock:l}:{selectSEBlock:s,selectSESubblock:l};var d="linkActive";s==t&&l==n&&(d="selected"),i+='",c++,c%a==0&&c
    "):l++}return i+="
    "},cMirror:function(e){CodeMirror.fromTextArea(document.getElementById(e),{lineNumbers:!0,indentUnit:4,indentWithTabs:!0,theme:"lesser-dark"})}};return{addHelpers:function(){NanoTemplate.addHelpers(e)},removeHelpers:function(){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.removeHelper(t)}}}(),NanoStateDefaultClass.inheritsFrom(NanoStateClass);var NanoStateDefault=new NanoStateDefaultClass;NanoStateClass.prototype.key=null,NanoStateClass.prototype.layoutRendered=!1,NanoStateClass.prototype.contentRendered=!1,NanoStateClass.prototype.mapInitialised=!1,NanoStateClass.prototype.isCurrent=function(){return NanoStateManager.getCurrentState()==this},NanoStateClass.prototype.onAdd=function(e){NanoBaseCallbacks.addCallbacks(),NanoBaseHelpers.addHelpers()},NanoStateClass.prototype.onRemove=function(e){NanoBaseCallbacks.removeCallbacks(),NanoBaseHelpers.removeHelpers()},NanoStateClass.prototype.onBeforeUpdate=function(e){return e=NanoStateManager.executeBeforeUpdateCallbacks(e)},NanoStateClass.prototype.onUpdate=function(e){try{(!this.layoutRendered||e.config.hasOwnProperty("autoUpdateLayout")&&e.config.autoUpdateLayout)&&($("#uiLayout").html(NanoTemplate.parse("layout",e)),this.layoutRendered=!0),(!this.contentRendered||e.config.hasOwnProperty("autoUpdateContent")&&e.config.autoUpdateContent)&&($("#uiContent").html(NanoTemplate.parse("main",e)),this.contentRendered=!0),NanoTemplate.templateExists("mapContent")&&(this.mapInitialised||($("#uiMap").draggable(),$("#uiMapTooltip").off("click").on("click",function(e){e.preventDefault(),$(this).fadeOut(400)}),this.mapInitialised=!0),$("#uiMapContent").html(NanoTemplate.parse("mapContent",e)),e.config.hasOwnProperty("showMap")&&e.config.showMap?($("#uiContent").addClass("hidden"),$("#uiMapWrapper").removeClass("hidden")):($("#uiMapWrapper").addClass("hidden"),$("#uiContent").removeClass("hidden"))),NanoTemplate.templateExists("mapHeader")&&$("#uiMapHeader").html(NanoTemplate.parse("mapHeader",e)),NanoTemplate.templateExists("mapFooter")&&$("#uiMapFooter").html(NanoTemplate.parse("mapFooter",e))}catch(t){return void reportError("ERROR: An error occurred while rendering the UI: "+t.message)}},NanoStateClass.prototype.onAfterUpdate=function(e){NanoStateManager.executeAfterUpdateCallbacks(e)},NanoStateClass.prototype.alertText=function(e){alert(e)};var NanoTemplate=function(){var e={},t={},n={},a={},r=function(){e=$("body").data("templateData"),null==e&&reportError("Error: Template data did not load correctly."),o()},o=function(){var t=Object.size(e);if(!t)return void $(document).trigger("templatesLoaded");for(var n in e)if(e.hasOwnProperty(n))return void $.when($.ajax({url:e[n],cache:!1,dataType:"text"})).done(function(t){t+='
    ';try{NanoTemplate.addTemplate(n,t)}catch(a){return void reportError("ERROR: An error occurred while loading the UI: "+a.message)}delete e[n],o()}).fail(function(){reportError("ERROR: Loading template "+n+"("+e[n]+") failed!")})},i=function(){for(var e in t)try{n[e]=doT.template(t[e],null,t)}catch(a){reportError(a.message)}};return{init:function(){r()},addTemplate:function(e,n){t[e]=n},templateExists:function(e){return t.hasOwnProperty(e)},parse:function(e,r){if(!n.hasOwnProperty(e)||!n[e]){if(!t.hasOwnProperty(e))return reportError('ERROR: Template "'+e+'" does not exist in _compiledTemplates!'),"

    Template error (does not exist)

    ";i()}return"function"!=typeof n[e]?(reportError(n[e]),reportError('ERROR: Template "'+e+'" failed to compile!'),"

    Template error (failed to compile)

    "):n[e].call(this,r.data,r.config,a)},addHelper:function(e,t){return jQuery.isFunction(t)?void(a[e]=t):void reportError("NanoTemplate.addHelper failed to add "+e+" as it is not a function.")},addHelpers:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.addHelper(t,e[t])},removeHelper:function(e){helpers.hasOwnProperty(e)&&delete a[e]}}}(),NanoWindow=function(){var e,t,n,a,r,o,i=function(e,t){NanoUtility.winset("pos",e+","+t)},s=function(e,t){NanoUtility.winset("size",e+","+t)},l=function(){NanoStateManager.getData().config.user.fancy&&(c(),u(),d(),f())},c=function(){NanoUtility.winset("titlebar",0),NanoUtility.winset("can-resize",0),$(".fancy").show(),$("#uiTitleFluff").css("right","65px")},u=function(){var e=function(){return NanoUtility.close()},t=function(){return NanoUtility.winset("is-minimized","true")};$(".close").on("click",function(t){e()}),$(".minimize").on("click",function(e){t()})},d=function(){$("#uiTitleWrapper").on("mousemove",function(e){p()}),$("#uiTitleWrapper").on("mousedown",function(t){e=!0}),$("#uiTitleWrapper").on("mouseup",function(a){e=!1,t=null,n=null})},p=function(a){var r,o;null==a&&(a=window.event),e&&(null==t&&(t=a.screenX),null==n&&(n=a.screenY),r=a.screenX-t+window.screenLeft,o=a.screenY-n+window.screenTop,i(r,o),t=a.screenX,n=a.screenY)},f=function(){$("#resize").on("mousemove",function(e){m()}),$("#resize").on("mousedown",function(e){a=!0}),$("#resize").on("mouseup",function(e){a=!1})},m=function(){var e,t;null==event&&(event=window.event),a&&(null==r&&(r=event.screenX),null==o&&(o=event.screenY),e=Math.max(150,event.screenX-r+window.innerWidth),t=Math.max(150,event.screenY-o+window.innerHeight),s(e,t),r=event.screenX,o=event.screenY)};return{init:function(){$(document).on("templatesLoaded",function(){l()})}}}(); \ No newline at end of file +function NanoStateDefaultClass(){this.key="default",this.key=this.key.toLowerCase(),NanoStateManager.addState(this)}function NanoStateClass(){}var NanoUtility=function(){var e={};return{init:function(){var t=$("body");e=t.data("urlParameters")},generateHref:function(t){var n="?";for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);for(var a in t)t.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+t[a]);return n},winset:function(e,t,n){var a,r;return null==n&&(n=NanoStateManager.getData().config.window.ref),a={},a[n+"."+e]=t,r=a,location.href=NanoUtility.href("winset",r)},extend:function(e,t){return Object.keys(t).forEach(function(n){var a;return a=t[n],a&&"[object Object]"===Object.prototype.toString.call(a)?(e[n]=e[n]||{},NanoUtility.extend(e[n],a)):e[n]=a}),e},href:function(e,t){return null==e&&(e=""),null==t&&(t={}),e=new Url("byond://"+e),NanoUtility.extend(e.query,t),e},close:function(){var t;return t={command:"nanoclose "+e.src},this.winset("is-visible","false"),location.href=NanoUtility.href("winset",t)}}}();"undefined"==typeof jQuery&&reportError("ERROR: Javascript library failed to load!"),"undefined"==typeof doT&&reportError("ERROR: Template engine failed to load!");var reportError=function(e){window.location="byond://?nano_err="+encodeURIComponent(e),alert(e)};$(document).ready(function(){NanoUtility.init(),NanoStateManager.init(),NanoTemplate.init(),NanoWindow.init()}),Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var t=this.length,n=Number(arguments[1])||0;for(n=0>n?Math.ceil(n):Math.floor(n),0>n&&(n+=t);t>n;n++)if(n in this&&this[n]===e)return n;return-1}),String.prototype.format||(String.prototype.format=function(e){var t=this;return t.replace(String.prototype.format.regex,function(t){var n,a=parseInt(t.substring(1,t.length-1));return n=a>=0?e[a]:-1===a?"{":-2===a?"}":""})},String.prototype.format.regex=new RegExp("{-?[0-9]+}","g")),Object.size=function(e){var t,n=0;for(var t in e)e.hasOwnProperty(t)&&n++;return n},window.console||(window.console={log:function(e){return!1}}),String.prototype.toTitleCase=function(){var e=/^(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|vs?\.?|via)$/i;return this.replace(/([^\W_]+[^\s-]*) */g,function(t,n,a,r){return a>0&&a+n.length!==r.length&&n.search(e)>-1&&":"!==r.charAt(a-2)&&r.charAt(a-1).search(/[^\s-]/)<0?t.toLowerCase():n.substr(1).search(/[A-Z]|\../)>-1?t:t.charAt(0).toUpperCase()+t.substr(1)})},$.ajaxSetup({cache:!1}),Function.prototype.inheritsFrom=function(e){return this.prototype=new e,this.prototype.constructor=this,this.prototype.parent=e.prototype,this},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),String.prototype.ckey||(String.prototype.ckey=function(){return this.replace(/\W/g,"").toLowerCase()}),NanoStateManager=function(){var e=!1,t=null,n={},a={},r={},o=null,i=function(){t=$("body").data("initialData"),null!=t&&t.hasOwnProperty("config")&&t.hasOwnProperty("data")||reportError("Error: Initial data did not load correctly.");var n="default";t.config.hasOwnProperty("stateKey")&&t.config.stateKey&&(n=t.config.stateKey.toLowerCase()),NanoStateManager.setCurrentState(n),$(document).on("templatesLoaded",function(){l(t),e=!0})},s=function(n){var a;try{a=jQuery.parseJSON(n)}catch(r){return void reportError("recieveUpdateData failed.
    Error name: "+r.name+"
    Error Message: "+r.message)}a.hasOwnProperty("data")||(t&&t.hasOwnProperty("data")?a.data=t.data:a.data={}),e?l(a):t=a},l=function(e){if(null!=o){if(e=o.onBeforeUpdate(e),e===!1)return void reportError("data is false, return");t=e,o.onUpdate(t),o.onAfterUpdate(t)}},c=function(e,t){for(var n in e)e.hasOwnProperty(n)&&jQuery.isFunction(e[n])&&(t=e[n].call(this,t));return t};return{init:function(){i()},receiveUpdateData:function(e){s(e)},addBeforeUpdateCallback:function(e,t){n[e]=t},addBeforeUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addBeforeUpdateCallback(t,e[t])},removeBeforeUpdateCallback:function(e){n.hasOwnProperty(e)&&delete n[e]},executeBeforeUpdateCallbacks:function(e){return c(n,e)},addAfterUpdateCallback:function(e,t){a[e]=t},addAfterUpdateCallbacks:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoStateManager.addAfterUpdateCallback(t,e[t])},removeAfterUpdateCallback:function(e){a.hasOwnProperty(e)&&delete a[e]},executeAfterUpdateCallbacks:function(e){return c(a,e)},addState:function(e){return e instanceof NanoStateClass?e.key?void(r[e.key]=e):void reportError("ERROR: Attempted to add a state with an invalid stateKey"):void reportError("ERROR: Attempted to add a state which is not instanceof NanoStateClass")},setCurrentState:function(e){if("undefined"==typeof e||!e)return reportError("ERROR: No state key was passed!"),!1;if(!r.hasOwnProperty(e))return reportError("ERROR: Attempted to set a current state which does not exist: "+e),!1;var t=o;return o=r[e],null!=t&&t.onRemove(o),o.onAdd(t),!0},getCurrentState:function(){return o},getData:function(){return t}}}(),NanoBaseCallbacks=function(){var e=!0,t={},n={status:function(t){var n;return 2==t.config.status?(n="good",$(".linkActive").removeClass("inactive")):1==t.config.status?(n="average",$(".linkActive").addClass("inactive")):(n="bad",$(".linkActive").addClass("inactive")),$(".statusicon").removeClass("good bad average").addClass(n),$(".linkActive").stopTime("linkPending"),$(".linkActive").removeClass("linkPending"),$(".linkActive").off("click").on("click",function(n){n.preventDefault();var a=$(this).data("href");null!=a&&e&&(e=!1,$("body").oneTime(300,"enableClick",function(){e=!0}),2==t.config.status&&$(this).oneTime(300,"linkPending",function(){$(this).addClass("linkPending")}),window.location.href=a)}),t},nanomap:function(e){return $(".mapIcon").off("mouseenter mouseleave").on("mouseenter",function(e){$("#uiMapTooltip").html($(this).children(".tooltip").html()).show().stopTime().oneTime(5e3,"hideTooltip",function(){$(this).fadeOut(500)})}),$(".zoomLink").off("click").on("click",function(e){e.preventDefault();var t=$(this).data("zoomLevel"),n=$("#uiMap"),a=n.width()*t,r=n.height()*t;n.css({zoom:t,left:"50%",top:"50%",marginLeft:"-"+Math.floor(a/2)+"px",marginTop:"-"+Math.floor(r/2)+"px"})}),$("#uiMapImage").attr("src","nanomap_z"+e.config.mapZLevel+".png"),e}};return{addCallbacks:function(){NanoStateManager.addBeforeUpdateCallbacks(t),NanoStateManager.addAfterUpdateCallbacks(n)},removeCallbacks:function(){for(var e in t)t.hasOwnProperty(e)&&NanoStateManager.removeBeforeUpdateCallback(e);for(var e in n)n.hasOwnProperty(e)&&NanoStateManager.removeAfterUpdateCallback(e)}}}(),NanoBaseHelpers=function(){var e={syndicateMode:function(){return $("body").css("background-color","#8f1414"),$("body").css("background-image","url('uiBackground-Syndicate.png')"),$("body").css("background-position","50% 0"),$("body").css("background-repeat","repeat-x"),$("#uiTitleFluff").css("background-image","url('uiTitleFluff-Syndicate.png')"),$("#uiTitleFluff").css("background-position","50% 50%"),$("#uiTitleFluff").css("background-repeat","no-repeat"),""},combine:function(e,t){return e&&t?e.concat(t):e||t},dump:function(e){return JSON.stringify(e)},link:function(e,t,n,a,r,o){var i="",s="noIcon";"undefined"!=typeof t&&t&&(i='
    ',s="hasIcon"),"undefined"!=typeof r&&r||(r="link");var l="";return"undefined"!=typeof o&&o&&(l='id="'+o+'"'),"undefined"!=typeof a&&a?'":'
    "+i+e+"
    "},xor:function(e,t){return e^t},precisionRound:function(e,t){if(0==t)return Math.round(number);var n=Math.pow(10,t);return Math.round(e*n)/n},round:function(e){return Math.round(e)},fixed:function(e){return Math.round(10*e)/10},floor:function(e){return Math.floor(e)},ceil:function(e){return Math.ceil(e)},string:function(){if(0==arguments.length)return"";if(1==arguments.length)return arguments[0];if(arguments.length>1){stringArgs=[];for(var e=1;et?t>e?e=t:e>n&&(e=n):e>t?e=t:n>e&&(e=n),"undefined"!=typeof a&&a||(a=""),"undefined"!=typeof r&&r||(r="");var o=Math.round((e-t)/(n-t)*100);return'
    '+r+"
    "},dangerToClass:function(e){return 0==e?"good":1==e?"average":"bad"},dangerToSpan:function(e){return 0==e?'"Good"':1==e?'"Minor Alert"':'"Major Alert"'},generateHref:function(e){var t=$("body");_urlParameters=t.data("urlParameters");var n="?";for(var a in _urlParameters)_urlParameters.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+_urlParameters[a]);for(var a in e)e.hasOwnProperty(a)&&("?"!==n&&(n+=";"),n+=a+"="+e[a]);return n},displayDNABlocks:function(e,t,n,a,r){if(!e)return'
    Please place a valid subject into the DNA modifier.
    ';var o=e.split(""),i='
    ',s=1,l=1;for(var c in o)if(o.hasOwnProperty(c)&&"object"!=typeof o[c]){var u;u="UI"==r.toUpperCase()?{selectUIBlock:s,selectUISubblock:l}:{selectSEBlock:s,selectSESubblock:l};var d="linkActive";s==t&&l==n&&(d="selected"),i+='",c++,c%a==0&&c
    "):l++}return i+="
    "},cMirror:function(e){CodeMirror.fromTextArea(document.getElementById(e),{lineNumbers:!0,indentUnit:4,indentWithTabs:!0,theme:"lesser-dark"})}};return{addHelpers:function(){NanoTemplate.addHelpers(e)},removeHelpers:function(){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.removeHelper(t)}}}(),NanoStateDefaultClass.inheritsFrom(NanoStateClass);var NanoStateDefault=new NanoStateDefaultClass;NanoStateClass.prototype.key=null,NanoStateClass.prototype.layoutRendered=!1,NanoStateClass.prototype.contentRendered=!1,NanoStateClass.prototype.mapInitialised=!1,NanoStateClass.prototype.isCurrent=function(){return NanoStateManager.getCurrentState()==this},NanoStateClass.prototype.onAdd=function(e){NanoBaseCallbacks.addCallbacks(),NanoBaseHelpers.addHelpers()},NanoStateClass.prototype.onRemove=function(e){NanoBaseCallbacks.removeCallbacks(),NanoBaseHelpers.removeHelpers()},NanoStateClass.prototype.onBeforeUpdate=function(e){return e=NanoStateManager.executeBeforeUpdateCallbacks(e)},NanoStateClass.prototype.onUpdate=function(e){try{(!this.layoutRendered||e.config.hasOwnProperty("autoUpdateLayout")&&e.config.autoUpdateLayout)&&($("#uiLayout").html(NanoTemplate.parse("layout",e)),this.layoutRendered=!0),(!this.contentRendered||e.config.hasOwnProperty("autoUpdateContent")&&e.config.autoUpdateContent)&&($("#uiContent").html(NanoTemplate.parse("main",e)),this.contentRendered=!0),NanoTemplate.templateExists("mapContent")&&(this.mapInitialised||($("#uiMap").draggable(),$("#uiMapTooltip").off("click").on("click",function(e){e.preventDefault(),$(this).fadeOut(400)}),this.mapInitialised=!0),$("#uiMapContent").html(NanoTemplate.parse("mapContent",e)),e.config.hasOwnProperty("showMap")&&e.config.showMap?($("#uiContent").addClass("hidden"),$("#uiMapWrapper").removeClass("hidden")):($("#uiMapWrapper").addClass("hidden"),$("#uiContent").removeClass("hidden"))),NanoTemplate.templateExists("mapHeader")&&$("#uiMapHeader").html(NanoTemplate.parse("mapHeader",e)),NanoTemplate.templateExists("mapFooter")&&$("#uiMapFooter").html(NanoTemplate.parse("mapFooter",e))}catch(t){return void reportError("ERROR: An error occurred while rendering the UI: "+t.message)}},NanoStateClass.prototype.onAfterUpdate=function(e){NanoStateManager.executeAfterUpdateCallbacks(e)},NanoStateClass.prototype.alertText=function(e){alert(e)};var NanoTemplate=function(){var e={},t={},n={},a={},r=function(){e=$("body").data("templateData"),null==e&&reportError("Error: Template data did not load correctly."),o()},o=function(){var t=Object.size(e);if(!t)return void $(document).trigger("templatesLoaded");for(var n in e)if(e.hasOwnProperty(n))return void $.when($.ajax({url:e[n],cache:!1,dataType:"text"})).done(function(t){t+='
    ';try{NanoTemplate.addTemplate(n,t)}catch(a){return void reportError("ERROR: An error occurred while loading the UI: "+a.message)}delete e[n],o()}).fail(function(){reportError("ERROR: Loading template "+n+"("+e[n]+") failed!")})},i=function(){for(var e in t)try{n[e]=doT.template(t[e],null,t)}catch(a){reportError(a.message)}};return{init:function(){r()},addTemplate:function(e,n){t[e]=n},templateExists:function(e){return t.hasOwnProperty(e)},parse:function(e,r){if(!n.hasOwnProperty(e)||!n[e]){if(!t.hasOwnProperty(e))return reportError('ERROR: Template "'+e+'" does not exist in _compiledTemplates!'),"

    Template error (does not exist)

    ";i()}return"function"!=typeof n[e]?(reportError(n[e]),reportError('ERROR: Template "'+e+'" failed to compile!'),"

    Template error (failed to compile)

    "):n[e].call(this,r.data,r.config,a)},addHelper:function(e,t){return jQuery.isFunction(t)?void(a[e]=t):void reportError("NanoTemplate.addHelper failed to add "+e+" as it is not a function.")},addHelpers:function(e){for(var t in e)e.hasOwnProperty(t)&&NanoTemplate.addHelper(t,e[t])},removeHelper:function(e){helpers.hasOwnProperty(e)&&delete a[e]}}}(),NanoWindow=function(){var e,t,n,a,r,o,i=function(e,t){NanoUtility.winset("pos",e+","+t)},s=function(e,t){NanoUtility.winset("size",e+","+t)},l=function(){NanoStateManager.getData().config.user.fancy&&(c(),u(),d(),f())},c=function(){NanoUtility.winset("titlebar",0),NanoUtility.winset("can-resize",0),$(".fancy").show(),$("#uiTitleFluff").css("right","65px")},u=function(){var e=function(){return NanoUtility.close()},t=function(){return NanoUtility.winset("is-minimized","true")};$(".close").on("click",function(t){e()}),$(".minimize").on("click",function(e){t()})},d=function(){$("#uiTitleWrapper").on("mousemove",function(e){p()}),$("#uiTitleWrapper").on("mousedown",function(t){e=!0}),$("#uiTitleWrapper").on("mouseup",function(a){e=!1,t=null,n=null})},p=function(a){var r,o;null==a&&(a=window.event),e&&(null==t&&(t=a.screenX),null==n&&(n=a.screenY),r=a.screenX-t+window.screenLeft,o=a.screenY-n+window.screenTop,i(r,o),t=a.screenX,n=a.screenY)},f=function(){$("#resize").on("mousemove",function(e){m()}),$("#resize").on("mousedown",function(e){a=!0}),$("#resize").on("mouseup",function(e){a=!1})},m=function(){var e,t;null==event&&(event=window.event),a&&(null==r&&(r=event.screenX),null==o&&(o=event.screenY),e=Math.max(150,event.screenX-r+window.innerWidth),t=Math.max(150,event.screenY-o+window.innerHeight),s(e,t),r=event.screenX,o=event.screenY)};return{init:function(){$(document).on("templatesLoaded",function(){l()})}}}(); \ No newline at end of file diff --git a/nano/assets/nanoui.css b/nano/assets/nanoui.css index 8cf64c80f9e..4bfc846a64d 100644 --- a/nano/assets/nanoui.css +++ b/nano/assets/nanoui.css @@ -1,2 +1,2 @@ @font-face{font-family:FontAwesome;src:url(fontawesome-webfont.eot?v=4.5.0);src:url(fontawesome-webfont.eot?#iefix&v=4.5.0) format('embedded-opentype'),url(fontawesome-webfont.woff2?v=4.5.0) format('woff2'),url(fontawesome-webfont.woff?v=4.5.0) format('woff'),url(fontawesome-webfont.ttf?v=4.5.0) format('truetype'),url(fontawesome-webfont.svg?v=4.5.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:a 2s infinite linear;animation:a 2s infinite linear}.fa-pulse{-webkit-animation:a 1s infinite steps(8);animation:a 1s infinite steps(8)}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"} -.displayBar{position:relative;width:236px;height:16px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000}.displayBarText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}.displayBarFill{width:0;height:100%;background:#40628a;overflow:hidden;float:left}.displayBarFill.alignRight{float:right}.displayBarFill.good{color:#fff;background:#4f7529}.displayBarFill.notgood{color:#fff;background:#ffb400}.displayBarFill.average{color:#fff;background:#cd6500}.displayBarFill.bad{color:#fff;background:#e00}.displayBarFill.highlight{color:#fff;background:#8ba5c4}.white{color:#fff}.good,.white{font-weight:700}.good{color:#4f7529}.average{color:#cd6500}.average,.bad{font-weight:700}.bad{color:#e00}.idle{color:#272727;font-weight:700}.redButton{background:#ea0000}.yellowButton{background:#cacc00}.highlight{color:#8ba5c4}.dark{color:#272727}.burn{color:orange}.brute{color:red}.toxin{color:green}.toxin_light{color:#3adf00}.oxyloss{color:blue}.oxyloss_light{color:#6698ff}.Red{color:red}.Blue{color:#00f}.Green{color:#0f0}.Marigold{color:#fda505}.Fuschia{color:#ff0080}.Black{color:#000}.Pearl{color:#c6cacb}.cold1{color:#94b8ff}.cold2{color:#69f}.cold3{color:#293d66}.hot1{color:#f96}.hot2{color:#993d00}.hot3{color:#f60}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px;clear:both}.item{width:100%;margin:4px 0 0;clear:both;overflow:auto}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.block{padding:8px;margin:10px 4px 4px;border:1px solid #40628a;background-color:#202020}.block h3{padding:0}.clearBoth{clear:both}.clearLeft{clear:left}.clearRight{clear:right}.line{width:100%;clear:both}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.floatRight{float:right}.floatLeft{float:left}.hidden{display:none}.statusDisplay{overflow:hidden}.statusDisplay,.statusDisplayRecords{background:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background:rgba(0,0,0,.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0}.statusDisplayRecords{overflow-x:hidden;overflow-y:auto}.statusLabel{width:138px;float:left;overflow:hidden;color:#98b0c3}.statusValue{float:left}.fancy{display:none}.minimize{color:#e9c183;position:absolute;top:6px;right:46px}.minimize:hover{color:#b8c9d6}.close{color:#e9c183;position:absolute;top:4px;right:12px}.close:hover{color:#b8c9d6}div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 30px 30px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);transform:rotate(1turn)}.uiLinkPendingIcon{display:none;float:left;width:16px;height:16px;margin:2px 2px 0;background-image:url(uiLinkPendingIcon.gif)}.linkPending .fa{display:none}.linkPending .uiLinkPendingIcon{display:block}.mapIcon16{position:absolute;width:16px;height:16px;background-image:url(uiIcons16Green.png);background-position:-144px -96px;background-repeat:no-repeat;zoom:.125;margin-left:-1px}.mapIcon16.bad,.mapIcon16.dead{background-image:url(uiIcons16Red.png)}.mapIcon16.average{background-image:url(uiIcons16Orange.png)}.mapIcon16.good{background-image:url(uiIcons16Green.png)}.mapIcon16.icon-airalarm{background-position:0 -144px}.mapIcon16.rank-captain{background-position:-224px -112px}.mapIcon16.rank-headofpersonnel{background-position:-112px -96px}.mapIcon16.rank-headofsecurity{background-position:-112px -128px}.mapIcon16.rank-chiefengineer{background-position:-176px -112px}.mapIcon16.rank-researchdirector{background-position:-128px -128px}.mapIcon16.rank-chiefmedicalofficer{background-position:-32px -128px}.mapIcon16.rank-atmospherictechnician,.mapIcon16.rank-stationengineer{background-position:-176px -112px}.mapIcon16.rank-chemist,.mapIcon16.rank-geneticist,.mapIcon16.rank-medicaldoctor,.mapIcon16.rank-psychiatrist{background-position:-32px -128px}.mapIcon16.rank-geneticist,.mapIcon16.rank-roboticist,.mapIcon16.rank-scientist,.mapIcon16.rank-xenobiologist{background-position:-128px -128px}.mapIcon16.rank-detective,.mapIcon16.rank-securityofficer,.mapIcon16.rank-warden{background-position:-112px -128px}.disabled,.link,.linkOff,.linkOn,.redButton,.selected,.yellowButton{float:left;min-width:15px;height:16px;text-align:center;color:#fff;text-decoration:none;background:#40628a;border:1px solid #161616;padding:0 4px 4px;margin:0 2px 2px 0;cursor:default;white-space:nowrap}.hasIcon{padding:0 4px 4px 0}.linkActive:hover,.zoomLink:hover,a:hover{background:#507aac}.linkPending,.linkPending:hover{color:#fff;background:#507aac}a.white,a.white:active,a.white:link,a.white:visited{color:#40628a;text-decoration:none;background:#fff;border:1px solid #161616;padding:1px 4px;margin:0 2px 0 0;cursor:default}a.white:hover{color:#fff;background:#40628a}.linkOn,.selected,a.linkOn:active,a.linkOn:hover,a.linkOn:link,a.linkOn:visited,a.selected:active,a.selected:hover,a.selected:link,a.selected:visited{color:#fff;background:#2f943c}.disabled,.linkOff,a.disabled:active,a.disabled:hover,a.disabled:link,a.disabled:visited,a.linkOff:active,a.linkOff:hover,a.linkOff:link,a.linkOff:visited{color:#fff;background:#999;border-color:#666}.disabled.icon,.linkOff.icon,.linkOn.icon,.selected.icon,a.icon{position:relative;padding:1px 4px 2px 20px}.disabled.icon img,.linkOff.icon img,.linkOn.icon img,.selected.icon img,a.icon img{position:absolute;top:0;left:0;width:18px;height:18px}.linkDanger,a.linkDanger:active,a.linkDanger:link,a.linkDanger:visited{color:#fff;background-color:red;border-color:#a00}.linkDanger:hover{background-color:#f66}.inactive,a.inactive:active,a.inactive:hover,a.inactive:link,a.inactive:visited{color:#fff;background:#999;border-color:#666}ul{padding:4px 0 0 10px;margin:0;list-style-type:none}li{padding:0 0 2px}table.fixed{table-layout:fixed}table.fixed td{overflow:hidden}table.pmon{border:2px solid #4169e1}table.pmon td,table.pmon th{border-bottom:1px dotted #000;padding:0 5px}th.command{background:#33f}th.command,th.sec{font-weight:700;color:#fff}th.sec{background:#8e0000}th.med{background:#060}th.eng,th.med{font-weight:700;color:#fff}th.eng{background:#b27300}th.sci{background:#a65ba6}th.civ,th.sci{font-weight:700;color:#fff}th.civ{background:#a32800}th.misc{background:#666;font-weight:700;color:#fff}.striped:not(table)>:nth-child(even),.striped tr:nth-child(even){background-color:#404040}#uiNoScript{position:fixed;top:50%;left:50%;margin:-60px 0 0 -150px;width:280px;height:120px;background:#fff;border:2px solid red;color:#000;font-size:10px;font-weight:700;z-index:1;padding:0 10px;text-align:center}.notice{background:url(uiNoticeBackground.jpg) 50% 50%;color:#000}.notice,.noticePlaceholder{position:relative;font-size:12px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0}.notice.icon{padding:2px 4px 0 20px}.notice img{position:absolute;top:0;left:0;width:16px;height:16px}div.notice{clear:both}.wholeScreen{position:absolute;color:#517087;font-size:16px;font-weight:700;text-align:center}.pdalink{float:left;white-space:nowrap}.pdanote{color:#cd6500;font-weight:700}.dnaBlock{float:left;width:90px;padding:0 0 5px}.dnaBlockNumber{color:#fff;background:#363636;min-width:20px}.dnaBlockNumber,.dnaSubBlock{font-family:Fixed,monospace;float:left;height:20px;padding:0;text-align:center}.dnaSubBlock{min-width:16px}.mask{position:fixed;left:0;top:0;width:100%;height:100%;background:url(uiMaskBackground.png)}.maskContent{width:100%;height:200px;margin:200px 0;text-align:center}body{background:#272727;color:#fff;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;margin:0;padding:0}hr{background-color:#40628a;height:1px;border:none}a img,img{border-style:none}h1,h2,h3,h4,h5,h6{margin:0;padding:12px 0 6px;color:#fff;clear:both}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 425 200' opacity='.25'%3E%3Cpath d='M178.004.04H106.8a6.76 6.026 0 0 0-6.76 6.024v187.872a6.76 6.026 0 0 0 6.76 6.025h53.107a6.76 6.026 0 0 0 6.762-6.024V92.392l72.215 104.7a6.76 6.026 0 0 0 5.76 2.87H318.2a6.76 6.026 0 0 0 6.76-6.026V6.064A6.76 6.026 0 0 0 318.2.04h-54.717a6.76 6.026 0 0 0-6.76 6.024v102.62L183.762 2.91a6.76 6.026 0 0 0-5.76-2.87zM4.845 22.11A13.412 12.502 0 0 1 13.478.04h66.118a5.365 5 0 0 1 5.365 5v79.88zM420.155 177.89a13.412 12.502 0 0 1-8.633 22.07h-66.118a5.365 5 0 0 1-5.365-5v-79.88z'/%3E%3C/svg%3E") no-repeat fixed center/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020) no-repeat fixed center/100% 100%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff000000',GradientType=0)}#uiWrapper{width:100%;height:100%;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}#uiTitleWrapper{position:relative;height:30px}#uiTitleText{position:absolute;top:6px;left:44px;width:66%;overflow:hidden;color:#e9c183;font-size:16px}#uiTitle.icon{padding:6px 8px 6px 42px;background-position:2px 50%;background-repeat:no-repeat}#uiTitleFluff{position:absolute;top:4px;right:12px;width:42px;height:24px;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 425 200' opacity='.25'%3E%3Cpath d='M178.004.04H106.8a6.76 6.026 0 0 0-6.76 6.024v187.872a6.76 6.026 0 0 0 6.76 6.025h53.107a6.76 6.026 0 0 0 6.762-6.024V92.392l72.215 104.7a6.76 6.026 0 0 0 5.76 2.87H318.2a6.76 6.026 0 0 0 6.76-6.026V6.064A6.76 6.026 0 0 0 318.2.04h-54.717a6.76 6.026 0 0 0-6.76 6.024v102.62L183.762 2.91a6.76 6.026 0 0 0-5.76-2.87zM4.845 22.11A13.412 12.502 0 0 1 13.478.04h66.118a5.365 5 0 0 1 5.365 5v79.88zM420.155 177.89a13.412 12.502 0 0 1-8.633 22.07h-66.118a5.365 5 0 0 1-5.365-5v-79.88z'/%3E%3C/svg%3E") 50% 50% no-repeat}.statusicon{position:absolute;top:4px;left:12px}#uiMapWrapper{clear:both;padding:8px}#uiMapHeader{position:relative;clear:both}#uiMapContainer{position:relative;width:100%;height:600px;overflow:hidden;border:1px solid #40628a;background:url(nanomapBackground.png)}#uiMap{top:50%;left:50%;margin:-512px 0 0 -512px;overflow:hidden;zoom:4}#uiMap,#uiMapImage{position:absolute;width:256px;height:256px}#uiMapImage{bottom:1px;left:1px}#uiMapContent{position:absolute;bottom:-13.5px;left:0;width:256px;height:256px}#uiMapFooter{position:relative;clear:both}#uiContent{clear:both;padding:8px}#uiMapTooltip{position:absolute;right:10px;top:10px;border:1px solid #40628a;background-color:#272727;padding:8px;display:none;z-index:1}#uiLoadingNotice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:14px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0} \ No newline at end of file +.displayBar{position:relative;width:236px;height:16px;border:1px solid #666;float:left;margin:0 5px 0 0;overflow:hidden;background:#000}.displayBarText{position:absolute;top:-2px;left:5px;width:100%;height:100%;color:#fff;font-weight:400}.displayBarFill{width:0;height:100%;background:#40628a;overflow:hidden;float:left}.displayBarFill.alignRight{float:right}.displayBarFill.good{color:#fff;background:#4f7529}.displayBarFill.notgood{color:#fff;background:#ffb400}.displayBarFill.average{color:#fff;background:#cd6500}.displayBarFill.bad{color:#fff;background:#e00}.displayBarFill.highlight{color:#fff;background:#8ba5c4}.disabled,.link,.linkOff,.linkOn,.redButton,.selected,.yellowButton{float:left;min-width:15px;height:16px;text-align:center;color:#fff;text-decoration:none;background:#40628a;border:1px solid #161616;padding:0 4px 4px;margin:0 2px 2px 0;cursor:default;white-space:nowrap}.hasIcon{padding:0 4px 4px 0}.linkActive:hover,.zoomLink:hover,a:hover{background:#507aac}.linkPending,.linkPending:hover{color:#fff;background:#507aac}a.white,a.white:active,a.white:link,a.white:visited{color:#40628a;text-decoration:none;background:#fff;border:1px solid #161616;padding:1px 4px;margin:0 2px 0 0;cursor:default}a.white:hover{color:#fff;background:#40628a}.linkOn,.selected,a.linkOn:active,a.linkOn:hover,a.linkOn:link,a.linkOn:visited,a.selected:active,a.selected:hover,a.selected:link,a.selected:visited{color:#fff;background:#2f943c}.disabled,.linkOff,a.disabled:active,a.disabled:hover,a.disabled:link,a.disabled:visited,a.linkOff:active,a.linkOff:hover,a.linkOff:link,a.linkOff:visited{color:#fff;background:#999;border-color:#666}.disabled.icon,.linkOff.icon,.linkOn.icon,.selected.icon,a.icon{position:relative;padding:1px 4px 2px 20px}.disabled.icon img,.linkOff.icon img,.linkOn.icon img,.selected.icon img,a.icon img{position:absolute;top:0;left:0;width:18px;height:18px}.linkDanger,a.linkDanger:active,a.linkDanger:link,a.linkDanger:visited{color:#fff;background-color:red;border-color:#a00}.linkDanger:hover{background-color:#f66}.inactive,a.inactive:active,a.inactive:hover,a.inactive:link,a.inactive:visited{color:#fff;background:#999;border-color:#666}.white{color:#fff}.good,.white{font-weight:700}.good{color:#4f7529}.average{color:#cd6500}.average,.bad{font-weight:700}.bad{color:#e00}.idle{color:#272727;font-weight:700}.redButton{background:#ea0000}.yellowButton{background:#cacc00}.highlight{color:#8ba5c4}.dark{color:#272727}.burn{color:orange}.brute{color:red}.toxin{color:green}.toxin_light{color:#3adf00}.oxyloss{color:blue}.oxyloss_light{color:#6698ff}.Red{color:red}.Blue{color:#00f}.Green{color:#0f0}.Marigold{color:#fda505}.Fuschia{color:#ff0080}.Black{color:#000}.Pearl{color:#c6cacb}.cold1{color:#94b8ff}.cold2{color:#69f}.cold3{color:#293d66}.hot1{color:#f96}.hot2{color:#993d00}.hot3{color:#f60}.itemGroup{border:1px solid #e9c183;background:#2c2c2c;padding:4px;clear:both}.item{width:100%;margin:4px 0 0;clear:both;overflow:auto}.itemContent,.itemContentNarrow{float:left}.itemContentNarrow{width:30%}.itemContent{width:69%}.itemLabel,.itemLabelNarrow,.itemLabelWide,.itemLabelWider,.itemLabelWidest{float:left;color:#e9c183}.itemLabelNarrow{width:20%}.itemLabel{width:30%}.itemLabelWide{width:45%}.itemLabelWider{width:69%}.itemLabelWidest{width:100%}.itemContentWide{float:left;width:79%}.itemContentSmall{float:left;width:33%}.itemContentMedium{float:left;width:55%}.block{padding:8px;margin:10px 4px 4px;border:1px solid #40628a;background-color:#202020}.block h3{padding:0}.clearBoth{clear:both}.clearLeft{clear:left}.clearRight{clear:right}.line{width:100%;clear:both}.fixedLeft{width:110px;float:left}.fixedLeftWide{width:165px;float:left}.fixedLeftWider{width:220px;float:left}.fixedLeftWidest{width:250px;float:left}.floatRight{float:right}.floatLeft{float:left}.hidden{display:none}.statusDisplay{overflow:hidden}.statusDisplay,.statusDisplayRecords{background:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background:rgba(0,0,0,.5);color:#fff;border:1px solid #40628a;padding:4px;margin:3px 0}.statusDisplayRecords{overflow-x:hidden;overflow-y:auto}.statusLabel{width:138px;float:left;overflow:hidden;color:#98b0c3}.statusValue{float:left}.fancy{display:none}.minimize{color:#e9c183;position:absolute;top:6px;right:46px}.minimize:hover{color:#b8c9d6}.close{color:#e9c183;position:absolute;top:4px;right:12px}.close:hover{color:#b8c9d6}div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 30px 30px;border-color:transparent transparent #363636;-webkit-transform:rotate(1turn);transform:rotate(1turn)}.uiLinkPendingIcon{display:none;float:left;width:16px;height:16px;margin:2px 2px 0;background-image:url(uiLinkPendingIcon.gif)}.linkPending .fa{display:none}.linkPending .uiLinkPendingIcon{display:block}.mapIcon16{position:absolute;width:16px;height:16px;background-image:url(uiIcons16Green.png);background-position:-144px -96px;background-repeat:no-repeat;zoom:.125;margin-left:-1px}.mapIcon16.bad,.mapIcon16.dead{background-image:url(uiIcons16Red.png)}.mapIcon16.average{background-image:url(uiIcons16Orange.png)}.mapIcon16.good{background-image:url(uiIcons16Green.png)}.mapIcon16.icon-airalarm{background-position:0 -144px}.mapIcon16.rank-captain{background-position:-224px -112px}.mapIcon16.rank-headofpersonnel{background-position:-112px -96px}.mapIcon16.rank-headofsecurity{background-position:-112px -128px}.mapIcon16.rank-chiefengineer{background-position:-176px -112px}.mapIcon16.rank-researchdirector{background-position:-128px -128px}.mapIcon16.rank-chiefmedicalofficer{background-position:-32px -128px}.mapIcon16.rank-atmospherictechnician,.mapIcon16.rank-stationengineer{background-position:-176px -112px}.mapIcon16.rank-chemist,.mapIcon16.rank-geneticist,.mapIcon16.rank-medicaldoctor,.mapIcon16.rank-psychiatrist{background-position:-32px -128px}.mapIcon16.rank-geneticist,.mapIcon16.rank-roboticist,.mapIcon16.rank-scientist,.mapIcon16.rank-xenobiologist{background-position:-128px -128px}.mapIcon16.rank-detective,.mapIcon16.rank-securityofficer,.mapIcon16.rank-warden{background-position:-112px -128px}ul{padding:4px 0 0 10px;margin:0;list-style-type:none}li{padding:0 0 2px}table.fixed{table-layout:fixed}table.fixed td{overflow:hidden}table.pmon{border:2px solid #4169e1}table.pmon td,table.pmon th{border-bottom:1px dotted #000;padding:0 5px}th.command{background:#33f}th.command,th.sec{font-weight:700;color:#fff}th.sec{background:#8e0000}th.med{background:#060}th.eng,th.med{font-weight:700;color:#fff}th.eng{background:#b27300}th.sci{background:#a65ba6}th.civ,th.sci{font-weight:700;color:#fff}th.civ{background:#a32800}th.misc{background:#666;font-weight:700;color:#fff}.striped:not(table)>:nth-child(even),.striped tr:nth-child(even){background-color:#404040}#uiNoScript{position:fixed;top:50%;left:50%;margin:-60px 0 0 -150px;width:280px;height:120px;background:#fff;border:2px solid red;color:#000;font-size:10px;font-weight:700;z-index:1;padding:0 10px;text-align:center}.notice{background:url(uiNoticeBackground.jpg) 50% 50%;color:#000}.notice,.noticePlaceholder{position:relative;font-size:12px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0}.notice.icon{padding:2px 4px 0 20px}.notice img{position:absolute;top:0;left:0;width:16px;height:16px}div.notice{clear:both}.wholeScreen{position:absolute;color:#517087;font-size:16px;font-weight:700;text-align:center}.pdalink{float:left;white-space:nowrap}.pdanote{color:#cd6500;font-weight:700}.dnaBlock{float:left;width:90px;padding:0 0 5px}.dnaBlockNumber{color:#fff;background:#363636;min-width:20px}.dnaBlockNumber,.dnaSubBlock{font-family:Fixed,monospace;float:left;height:20px;padding:0;text-align:center}.dnaSubBlock{min-width:16px}.mask{position:fixed;left:0;top:0;width:100%;height:100%;background:url(uiMaskBackground.png)}.maskContent{width:100%;height:200px;margin:200px 0;text-align:center}body{background:#272727;color:#fff;font-family:Verdana,Geneva,sans-serif;font-size:12px;line-height:170%;margin:0;padding:0}hr{background-color:#40628a;height:1px;border:none}a img,img{border-style:none}h1,h2,h3,h4,h5,h6{margin:0;padding:12px 0 6px;color:#fff;clear:both}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 425 200' opacity='.25'%3E%3Cpath d='M178.004.04H106.8a6.76 6.026 0 0 0-6.76 6.024v187.872a6.76 6.026 0 0 0 6.76 6.025h53.107a6.76 6.026 0 0 0 6.762-6.024V92.392l72.215 104.7a6.76 6.026 0 0 0 5.76 2.87H318.2a6.76 6.026 0 0 0 6.76-6.026V6.064A6.76 6.026 0 0 0 318.2.04h-54.717a6.76 6.026 0 0 0-6.76 6.024v102.62L183.762 2.91a6.76 6.026 0 0 0-5.76-2.87zM4.845 22.11A13.412 12.502 0 0 1 13.478.04h66.118a5.365 5 0 0 1 5.365 5v79.88zM420.155 177.89a13.412 12.502 0 0 1-8.633 22.07h-66.118a5.365 5 0 0 1-5.365-5v-79.88z'/%3E%3C/svg%3E") no-repeat fixed center/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020) no-repeat fixed center/100% 100%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff000000',GradientType=0)}#uiWrapper{width:100%;height:100%;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}#uiTitleWrapper{position:relative;height:30px}#uiTitleText{position:absolute;top:6px;left:44px;width:66%;overflow:hidden;color:#e9c183;font-size:16px}#uiTitle.icon{padding:6px 8px 6px 42px;background-position:2px 50%;background-repeat:no-repeat}#uiTitleFluff{position:absolute;top:4px;right:12px;width:42px;height:24px;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1' viewBox='0 0 425 200' opacity='.25'%3E%3Cpath d='M178.004.04H106.8a6.76 6.026 0 0 0-6.76 6.024v187.872a6.76 6.026 0 0 0 6.76 6.025h53.107a6.76 6.026 0 0 0 6.762-6.024V92.392l72.215 104.7a6.76 6.026 0 0 0 5.76 2.87H318.2a6.76 6.026 0 0 0 6.76-6.026V6.064A6.76 6.026 0 0 0 318.2.04h-54.717a6.76 6.026 0 0 0-6.76 6.024v102.62L183.762 2.91a6.76 6.026 0 0 0-5.76-2.87zM4.845 22.11A13.412 12.502 0 0 1 13.478.04h66.118a5.365 5 0 0 1 5.365 5v79.88zM420.155 177.89a13.412 12.502 0 0 1-8.633 22.07h-66.118a5.365 5 0 0 1-5.365-5v-79.88z'/%3E%3C/svg%3E") 50% 50% no-repeat}.statusicon{position:absolute;top:4px;left:12px}#uiMapWrapper{clear:both;padding:8px}#uiMapHeader{position:relative;clear:both}#uiMapContainer{position:relative;width:100%;height:600px;overflow:hidden;border:1px solid #40628a;background:url(nanomapBackground.png)}#uiMap{top:50%;left:50%;margin:-512px 0 0 -512px;overflow:hidden;zoom:4}#uiMap,#uiMapImage{position:absolute;width:256px;height:256px}#uiMapImage{bottom:1px;left:1px}#uiMapContent{position:absolute;bottom:-13.5px;left:0;width:256px;height:256px}#uiMapFooter{position:relative;clear:both}#uiContent{clear:both;padding:8px}#uiMapTooltip{position:absolute;right:10px;top:10px;border:1px solid #40628a;background-color:#272727;padding:8px;display:none;z-index:1}#uiLoadingNotice{position:relative;background:url(uiNoticeBackground.jpg) 50% 50%;color:#000;font-size:14px;font-style:italic;font-weight:700;padding:3px 4px;margin:4px 0} \ No newline at end of file diff --git a/nano/scripts/nano/nano_base_callbacks.js b/nano/scripts/nano/nano_base_callbacks.js index 5e2df8d2fad..42a901c4783 100644 --- a/nano/scripts/nano/nano_base_callbacks.js +++ b/nano/scripts/nano/nano_base_callbacks.js @@ -24,11 +24,7 @@ NanoBaseCallbacks = function () uiStatusClass = 'bad'; $('.linkActive').addClass('inactive'); } - $('.statusicon').each( function(i, obj) { - obj.className = obj.className.replace(/good|bad|average/g, ""); - obj.classList.add(uiStatusClass); - }); - + $('.statusicon').removeClass("good bad average").addClass(uiStatusClass); $('.linkActive').stopTime('linkPending'); $('.linkActive').removeClass('linkPending'); diff --git a/nano/styles/nanoui.less b/nano/styles/nanoui.less index c8768bd24ca..a90b819c9fe 100644 --- a/nano/styles/nanoui.less +++ b/nano/styles/nanoui.less @@ -1,11 +1,11 @@ @charset "utf-8"; @import "_bars"; +@import "_link"; @import "_color"; @import "_config"; @import "_formatting"; @import "_icon"; -@import "_link"; @import "_lists"; @import "_misc"; @import "_native"; diff --git a/nano/templates/adv_med.tmpl b/nano/templates/adv_med.tmpl index 3c19d742c20..017abaad0cb 100644 --- a/nano/templates/adv_med.tmpl +++ b/nano/templates/adv_med.tmpl @@ -59,7 +59,7 @@ Used In File(s): \code\game\machinery\adv_med.dm {{/if}}
    - {{:helper.link('Print', 'document', {'print_p' : 1, 'name' : data.occupant.name})}} + {{:helper.link('Print', 'print', {'print_p' : 1, 'name' : data.occupant.name})}} {{:helper.link('Eject Occupant', 'arrow-circle-o-down', {'ejectify' : 1}, data.occupied ? null : 'disabled')}}

    @@ -99,7 +99,6 @@ Used In File(s): \code\game\machinery\adv_med.dm - {{if data.occupant.blood.hasBlood}}
    Blood: @@ -111,7 +110,6 @@ Used In File(s): \code\game\machinery\adv_med.dm {{:helper.displayBar(data.occupant.blood.bloodLevel, 0, data.occupant.blood.bloodMax, (data.occupant.blood.percent <= 60) ? 'bad' : (data.occupant.blood.percent <= 90) ? 'average' : 'good' )}}
    {{:data.occupant.blood.percent}}%, {{:data.occupant.blood.bloodLevel}}cl
    - {{/if}}
    {{if data.occupant.hasVirus}} @@ -119,6 +117,18 @@ Used In File(s): \code\game\machinery\adv_med.dm Viral pathogen detected in blood stream.
    {{/if}} + {{if data.occupant.implant_len}} +
    + Implants + + + {{for data.occupant.implant}} + + {{/for}} + +
    {{:value.name}}
    +
    + {{/if}} External Organs @@ -164,9 +174,9 @@ Used In File(s): \code\game\machinery\adv_med.dm {{if value.status.splinted}} splinted
    {{/if}} {{if value.status.robotic}} robotic
    {{/if}} - {{if value.implants_len}} - {{for value.implants : impValue:impindex}} - {{:impValue.known ? impValue.name : "unknown object"}}
    + {{if value.shrapnel_len}} + {{for value.shrapnel : shrapValue:shrapindex}} + {{:shrapValue.known ? shrapValue.name : "unknown object"}}
    {{/for}} {{/if}} diff --git a/nano/templates/cloning_console.tmpl b/nano/templates/cloning_console.tmpl index 71b2487cdb3..ffb9502d181 100644 --- a/nano/templates/cloning_console.tmpl +++ b/nano/templates/cloning_console.tmpl @@ -6,7 +6,7 @@ Used In File(s): \code\game\machinery\computer\cloning.dm
    Menu
    - {{:helper.link('Main', 'home', {'menu' : 1}, data.menu == 1 ? 'selected' : '')}}{{:helper.link('Records', 'document', {'menu' : 2}, data.menu == 2 ? 'selected' : '')}} + {{:helper.link('Main', 'home', {'menu' : 1}, data.menu == 1 ? 'selected' : '')}}{{:helper.link('Records', 'folder-open', {'menu' : 2}, data.menu == 2 ? 'selected' : '')}}
    diff --git a/nano/templates/helm.tmpl b/nano/templates/helm.tmpl index 1e56dc5802c..615d4ab46d0 100644 --- a/nano/templates/helm.tmpl +++ b/nano/templates/helm.tmpl @@ -96,7 +96,7 @@

    Navigation data

    {{:helper.link('Save current position', 'floppy-o', { 'add' : 'current' }, null)}} - {{:helper.link('Add new entry', 'document', { 'add' : 'new' }, null)}} + {{:helper.link('Add new entry', 'file', { 'add' : 'new' }, null)}}
    diff --git a/nano/templates/song.tmpl b/nano/templates/song.tmpl index 894344a7812..4b4d6669b8f 100644 --- a/nano/templates/song.tmpl +++ b/nano/templates/song.tmpl @@ -7,7 +7,7 @@ Used In File(s): \code\game\objects\structures\musician.dm
    Playback
    - {{:helper.link('New', 'document', {'newsong': 1})}} + {{:helper.link('New', 'file', {'newsong': 1})}} {{:helper.link('Import', 'folder-open', {'import': 1})}} {{:helper.link('Play', 'play', {'play': 1}, data.lines.length > 0 ? (data.playing ? 'selected' : null) : 'disabled')}} {{:helper.link('Stop', 'stop', {'stop': 1}, !data.playing ? 'selected' : null)}} diff --git a/paradise.dme b/paradise.dme index e564b458d43..30364ed4ef5 100644 --- a/paradise.dme +++ b/paradise.dme @@ -864,6 +864,7 @@ #include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\chaplain.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" @@ -1235,6 +1236,7 @@ #include "code\modules\hydroponics\grown.dm" #include "code\modules\hydroponics\grown_inedible.dm" #include "code\modules\hydroponics\grown_predefined.dm" +#include "code\modules\hydroponics\hydro_reagents.dm" #include "code\modules\hydroponics\seed.dm" #include "code\modules\hydroponics\seed_controller.dm" #include "code\modules\hydroponics\seed_datums.dm"