diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index d3f4abef037..2c5c77ffa9c 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -36,7 +36,7 @@ #define NO_BLOOD 1 #define NO_BREATHE 2 -#define NO_DNA_RAD 4 +#define NO_DNA 4 #define RAD_ABSORB 8 #define NO_SCAN 16 #define NO_PAIN 32 @@ -48,6 +48,7 @@ #define IS_RESTRICTED 2048 #define NO_INTORGANS 4096 #define NO_POISON 8192 +#define RADIMMUNE 16384 //Species clothing flags #define HAS_UNDERWEAR 1 diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 0aa113b0f68..756ae54765f 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -27,12 +27,6 @@ #define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station #define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure. -//Shuttle moving status -#define SHUTTLE_IDLE 0 -#define SHUTTLE_WARMUP 1 -#define SHUTTLE_INTRANSIT 2 -#define SHUTTLE_STRANDED 3 - //Ferry shuttle processing status #define IDLE_STATE 0 #define WAIT_LAUNCH 1 diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index be1a3f918e7..790cbd305bc 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -221,7 +221,7 @@ adding += using //Shuttle - using = new /obj/screen/ai/announcement() + using = new /obj/screen/ai/call_shuttle() using.name = "Call Emergency Shuttle" using.icon = 'icons/mob/screen_ai.dmi' using.icon_state = "call_shuttle" diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm index c7ef656bff2..f16d5b1c396 100644 --- a/code/controllers/Processes/shuttles.dm +++ b/code/controllers/Processes/shuttles.dm @@ -120,7 +120,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 var/area/signal_origin = get_area(user) var/emergency_reason = "\nNature of emergency:\n\n[call_reason]" - if(seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. + if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. emergency.request(null, 0.5, signal_origin, html_decode(emergency_reason), 1) else emergency.request(null, 1, signal_origin, html_decode(emergency_reason), 0) @@ -142,7 +142,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 return if(ticker.mode.name == "meteor") return - if(seclevel2num(get_security_level()) == SEC_LEVEL_RED) + if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) if(emergency.timeLeft(1) < emergencyCallTime * 0.25) return else diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 30b12c88e81..e65ced5c08c 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -36,7 +36,7 @@ var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard var/traitor_scaling = 0 //if amount of traitors scales based on amount of players var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other - var/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. + var/continuous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. var/allow_Metadata = 0 // Metadata is supported. var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. var/Ticklag = 0.9 @@ -449,7 +449,7 @@ config.gateway_delay = text2num(value) if("continuous_rounds") - config.continous_rounds = 1 + config.continuous_rounds = 1 if("ghost_interaction") config.ghost_interaction = 1 diff --git a/code/datums/spell.dm b/code/datums/spell.dm index ec1c34fee60..236b7c8e9b1 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -65,7 +65,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin caster.reset_view(0) return 0 - if((user.z in config.admin_levels) && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel + if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel + return 0 + if(user.z == ZLEVEL_CENTCOMM && ticker.mode.name == "ragin' mages") return 0 if(!skipcharge) diff --git a/code/datums/spells/charge.dm b/code/datums/spells/charge.dm index e7225997815..36e253f8e91 100644 --- a/code/datums/spells/charge.dm +++ b/code/datums/spells/charge.dm @@ -1,6 +1,6 @@ /obj/effect/proc_holder/spell/targeted/charge name = "Charge" - desc = "This spell can be used to charge up spent magical artifacts, among other things." + desc = "This spell can be used to recharge a variety of things in your hands, from magical artifacts to electrical components. A creative wizard can even use it to grant magical power to a fellow magic user." school = "transmutation" charge_max = 600 @@ -8,38 +8,45 @@ invocation = "DIRI CEL" invocation_type = "whisper" range = -1 -// cooldown_min = 400 //50 deciseconds reduction per rank + cooldown_min = 400 //50 deciseconds reduction per rank include_user = 1 -/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets) - for(var/mob/living/user in targets) - var/list/hand_items = list(user.get_active_hand(),user.get_inactive_hand()) +/obj/effect/proc_holder/spell/targeted/charge/cast(list/targets,mob/user = usr) + for(var/mob/living/L in targets) + var/list/hand_items = list(L.get_active_hand(),L.get_inactive_hand()) var/charged_item = null var/burnt_out = 0 + + if(L.pulling && (istype(L.pulling, /mob/living))) + var/mob/living/M = L.pulling + if(M.spell_list.len != 0 || (M.mind && M.mind.spell_list.len != 0)) + for(var/obj/effect/proc_holder/spell/S in M.spell_list) + S.charge_counter = S.charge_max + if(M.mind) + for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list) + S.charge_counter = S.charge_max + M <<"you feel raw magic flowing through you, it feels good!" + else + M <<"you feel very strange for a moment, but then it passes." + burnt_out = 1 + charged_item = M + break for(var/obj/item in hand_items) - if(istype(item, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = item - if(G.affecting) - var/mob/M = G.affecting - if(M.spell_list.len != 0) - for(var/obj/effect/proc_holder/spell/S in M.spell_list) - S.charge_counter = S.charge_max - M <<"you feel raw magic flowing through you, it feels good!" + if(istype(item, /obj/item/weapon/spellbook)) + if(istype(item, /obj/item/weapon/spellbook/oneuse)) + var/obj/item/weapon/spellbook/oneuse/I = item + if(prob(80)) + L.visible_message("[I] catches fire!") + qdel(I) else - M <<"you feel very strange for a moment, but then it passes." - burnt_out = 1 - charged_item = M - break - else if(istype(item, /obj/item/weapon/spellbook/oneuse)) - var/obj/item/weapon/spellbook/oneuse/I = item - if(prob(80)) - user.visible_message("[I] catches fire!") - qdel(I) + I.used = 0 + charged_item = I + break else - I.used = 0 - charged_item = I - break + L << "Glowing red letters appear on the front cover..." + L << "[pick("NICE TRY BUT NO!","CLEVER BUT NOT CLEVER ENOUGH!", "SUCH FLAGRANT CHEESING IS WHY WE ACCEPTED YOUR APPLICATION!", "CUTE!", "YOU DIDN'T THINK IT'D BE THAT EASY, DID YOU?")]" + burnt_out = 1 else if(istype(item, /obj/item/weapon/gun/magic)) var/obj/item/weapon/gun/magic/I = item if(prob(80) && !I.can_charge) @@ -78,8 +85,8 @@ charged_item = item break if(!charged_item) - user << "you feel magical power surging to your hands, but the feeling rapidly fades..." + L << "you feel magical power surging to your hands, but the feeling rapidly fades..." else if(burnt_out) - user << "[charged_item] doesn't seem to be reacting to the spell..." + L << "[charged_item] doesn't seem to be reacting to the spell..." else - user << "[charged_item] suddenly feels very warm!" + L << "[charged_item] suddenly feels very warm!" \ No newline at end of file diff --git a/code/datums/spells/genetic.dm b/code/datums/spells/genetic.dm index 07d8c55f059..d4a9d1d1d8e 100644 --- a/code/datums/spells/genetic.dm +++ b/code/datums/spells/genetic.dm @@ -2,7 +2,7 @@ name = "Genetic" desc = "This spell inflicts a set of mutations and disabilities upon the target." - var/disabilities = 0 //bits + var/sdisabilities = 0 //bits var/list/mutations = list() //mutation strings var/duration = 100 //deciseconds /* @@ -22,11 +22,11 @@ target.mutations.Add(x) /* if(x == HULK && ishuman(target)) target:hulk_time=world.time + duration */ - target.disabilities |= disabilities + target.sdisabilities |= sdisabilities target.update_mutations() //update target's mutation overlays spawn(duration) target.mutations.Remove(mutations) - target.disabilities &= ~disabilities + target.sdisabilities &= ~sdisabilities target.update_mutations() return \ No newline at end of file diff --git a/code/datums/spells/infinite_guns.dm b/code/datums/spells/infinite_guns.dm new file mode 100644 index 00000000000..10b8612c858 --- /dev/null +++ b/code/datums/spells/infinite_guns.dm @@ -0,0 +1,22 @@ +/obj/effect/proc_holder/spell/targeted/infinite_guns + name = "Lesser Summon Guns" + desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles. Requires both hands free to use." + invocation_type = "none" + include_user = 1 + range = -1 + + school = "conjuration" + charge_max = 750 + clothes_req = 1 + cooldown_min = 10 //Gun wizard + action_icon_state = "bolt_action" + + + +/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr) + for(var/mob/living/carbon/C in targets) + C.drop_item() + C.swap_hand() + C.drop_item() + var/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/GUN = new + C.put_in_hands(GUN) diff --git a/code/datums/spells/knock.dm b/code/datums/spells/knock.dm index cd02d85c90b..e2be52fb7db 100644 --- a/code/datums/spells/knock.dm +++ b/code/datums/spells/knock.dm @@ -22,4 +22,11 @@ var/obj/machinery/door/airlock/A = door A.unlock(1) //forced because it's magic! door.open() + for(var/obj/structure/closet/C in T.contents) + spawn(1) + if(istype(C, /obj/structure/closet/secure_closet)) + var/obj/structure/closet/secure_closet/SC = C + SC.locked = 0 + C.open() + return \ No newline at end of file diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm new file mode 100644 index 00000000000..a115406548c --- /dev/null +++ b/code/datums/spells/lichdom.dm @@ -0,0 +1,130 @@ +/obj/effect/proc_holder/spell/targeted/lichdom + name = "Bind Soul" + desc = "A dark necromantic pact that can forever bind your soul to an item of your choosing. So long as both your body and the item remain intact and on the same plane you can revive from death, though the time between reincarnations grows steadily with use." + school = "necromancy" + charge_max = 10 + clothes_req = 0 + centcom_cancast = 0 + invocation = "NECREM IMORTIUM!" + invocation_type = "shout" + range = -1 + level_max = 0 //cannot be improved + cooldown_min = 10 + include_user = 1 + + var/obj/marked_item + var/mob/living/current_body + var/resurrections = 0 + var/existence_stops_round_end = 0 + + action_icon_state = "skeleton" + +/obj/effect/proc_holder/spell/targeted/lichdom/New() + if(!config.continuous_rounds) + existence_stops_round_end = 1 + config.continuous_rounds = 1 + ..() + +/obj/effect/proc_holder/spell/targeted/lichdom/Destroy() + for(var/datum/mind/M in ticker.mode.wizards) //Make sure no other bones are about + for(var/obj/effect/proc_holder/spell/S in M.spell_list) + if(istype(S,/obj/effect/proc_holder/spell/targeted/lichdom) && S != src) + return ..() + if(existence_stops_round_end) + config.continuous_rounds = 0 + return ..() + +/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets,mob/user = usr) + for(var/mob/M in targets) + var/list/hand_items = list() + if(iscarbon(M)) + hand_items = list(M.get_active_hand(),M.get_inactive_hand()) + + if(marked_item && !stat_allowed) //sanity, shouldn't happen without badminry + marked_item = null + return + + if(stat_allowed) //Death is not my end! + if(M.stat == CONSCIOUS && iscarbon(M)) + M << "You aren't dead enough to revive!" //Usually a good problem to have + charge_counter = charge_max + return + + if(!marked_item || qdeleted(marked_item)) //Wait nevermind + M << "Your phylactery is gone!" + return + + var/turf/user_turf = get_turf(M) + var/turf/item_turf = get_turf(marked_item) + + if(user_turf.z != item_turf.z) + M << "Your phylactery is out of range!" + return + + if(isobserver(M)) + var/mob/dead/observer/O = M + O.reenter_corpse() + + var/mob/living/carbon/human/lich = new /mob/living/carbon/human(item_turf) + + lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(lich), slot_shoes) + lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), slot_w_uniform) + lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), slot_wear_suit) + lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), slot_head) + + lich.real_name = M.mind.name + M.mind.transfer_to(lich) + lich.set_species("Skeleton") + lich << "Your bones clatter and shutter as they're pulled back into this world!" + charge_max += 600 + var/mob/old_body = current_body + var/turf/body_turf = get_turf(old_body) + current_body = lich + lich.Weaken(10+10*resurrections) + ++resurrections + if(old_body && old_body.loc) + if(iscarbon(old_body)) + var/mob/living/carbon/C = old_body + for(var/obj/item/W in C) + C.unEquip(W) + var/wheres_wizdo = dir2text(get_dir(body_turf, item_turf)) + if(wheres_wizdo) + old_body.visible_message("Suddenly [old_body.name]'s corpse falls to pieces! You see a strange energy rise from the remains, and speed off towards the [wheres_wizdo]!") + body_turf.Beam(item_turf,icon_state="lichbeam",icon='icons/effects/effects.dmi',time=10+10*resurrections,maxdistance=INFINITY) + old_body.dust() + + if(!marked_item) //linking item to the spell + message = "" + for(var/obj/item in hand_items) + if(ABSTRACT in item.flags || NODROP in item.flags) + continue + marked_item = item + M << "You begin to focus your very being into the [item.name]..." + break + + if(!marked_item) + M << "You must hold an item you wish to make your phylactery..." + return + + spawn(50) + if(marked_item.loc != M) //I changed my mind I don't want to put my soul in a cheeseburger! + M << "Your soul snaps back to your body as you drop the [marked_item.name]!" + marked_item = null + return + name = "RISE!" + desc = "Rise from the dead! You will reform at the location of your phylactery and your old body will crumble away." + charge_max = 1800 //3 minute cooldown, if you rise in sight of someone and killed again, you're probably screwed. + charge_counter = 1800 + stat_allowed = 1 + marked_item.name = "Ensouled [marked_item.name]" + marked_item.desc = "A terrible aura surrounds this item, its very existence is offensive to life itself..." + marked_item.color = "#003300" + M << "With a hideous feeling of emptiness you watch in horrified fascination as skin sloughs off bone! Blood boils, nerves disintegrate, eyes boil in their sockets! As your organs crumble to dust in your fleshless chest you come to terms with your choice. You're a lich!" + current_body = M.mind.current + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.set_species("Skeleton") + H.unEquip(H.wear_suit) + H.unEquip(H.head) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), slot_head) diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index b8a8b12a997..4a12b4bb9f9 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -7,7 +7,7 @@ invocation = "GAR YOK" invocation_type = "whisper" range = -1 - level_max = 1 //cannot be improved + level_max = 0 //cannot be improved cooldown_min = 100 include_user = 1 diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index 03aa46653a9..904b7d54e63 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -3,12 +3,12 @@ desc = "This spell fires several, slow moving, magic projectiles at nearby targets." school = "evocation" - charge_max = 150 + charge_max = 200 clothes_req = 1 invocation = "FORTI GY AMA" invocation_type = "shout" range = 7 - cooldown_min = 90 //15 deciseconds reduction per rank + cooldown_min = 60 //35 deciseconds reduction per rank max_targets = 0 @@ -28,7 +28,6 @@ /obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile amt_weakened = 3 - amt_dam_fire = 10 /obj/effect/proc_holder/spell/noclothes name = "No Clothes" @@ -225,7 +224,7 @@ amt_eye_blurry = 20 /obj/effect/proc_holder/spell/targeted/genetic/blind - disabilities = 1 + sdisabilities = BLIND duration = 300 /obj/effect/proc_holder/spell/dumbfire/fireball @@ -261,6 +260,7 @@ ex_severe = -1 ex_heavy = -1 ex_light = 2 + ex_flash = 5 /obj/effect/proc_holder/spell/aoe_turf/repulse name = "Repulse" diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index c393a1d91cc..0234fb2c076 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1228,8 +1228,8 @@ var/list/ghostteleportlocs = list() /area/holodeck/source_space name = "\improper Holodeck - Space" - - +/area/holodeck/source_knightarena + name = "\improper Holodeck - Knight Arena" //Embassies diff --git a/code/game/dna/dna2_domutcheck.dm b/code/game/dna/dna2_domutcheck.dm index 745af66ac15..8bf993f43eb 100644 --- a/code/game/dna/dna2_domutcheck.dm +++ b/code/game/dna/dna2_domutcheck.dm @@ -5,7 +5,7 @@ // flags: See below, bitfield. #define MUTCHK_FORCED 1 /proc/domutcheck(var/mob/living/M, var/connected=null, var/flags=0) - + for(var/datum/dna/gene/gene in dna_genes) if(!M || !M.dna) return @@ -52,7 +52,7 @@ /proc/genemutcheck(var/mob/living/M, var/block, var/connected=null, var/flags=0) if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure. var/mob/living/carbon/human/H = M - if(H.species.flags & NO_DNA_RAD) + if(H.species.flags & NO_DNA) return if(!M) return @@ -76,12 +76,12 @@ var/gene_active = (gene.flags & GENE_ALWAYS_ACTIVATE) if(!gene_active) gene_active = M.dna.GetSEState(gene.block) - + var/defaultgenes // Do not mutate inherent species abilities if(ishuman(M)) var/mob/living/carbon/human/H = M defaultgenes = H.species.default_genes - + if((gene in defaultgenes) && gene_active) return diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index bf5e661b299..3e3a3d4287a 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -326,7 +326,7 @@ if(ishuman(occupant)) var/mob/living/carbon/human/H = occupant - if((H.species.flags & NO_DNA_RAD)) + if((H.species.flags & NO_DNA)) return 1 var/radiation_protection = occupant.run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm.") @@ -518,7 +518,7 @@ occupantData["structuralEnzymes"] = null occupantData["radiationLevel"] = null else - occupantData["name"] = connected.occupant.name + occupantData["name"] = connected.occupant.dna.real_name occupantData["stat"] = connected.occupant.stat occupantData["isViableSubject"] = 1 if ((NOCLONE in connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna) @@ -853,7 +853,7 @@ databuf.types = DNA2_BUF_UI|DNA2_BUF_UE databuf.dna = src.connected.occupant.dna.Clone() if(ishuman(connected.occupant)) - databuf.dna.real_name=connected.occupant.name + databuf.dna.real_name=connected.occupant.dna.real_name databuf.name = "Unique Identifier + Unique Enzymes" src.buffers[bufferId] = databuf return 1 @@ -864,7 +864,7 @@ databuf.types = DNA2_BUF_SE databuf.dna = src.connected.occupant.dna.Clone() if(ishuman(connected.occupant)) - databuf.dna.real_name=connected.occupant.name + databuf.dna.real_name=connected.occupant.dna.real_name databuf.name = "Structural Enzymes" src.buffers[bufferId] = databuf return 1 diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index 01c0b9ed535..e5ebf16975c 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -385,7 +385,7 @@ // playsound(H.loc, 'male_fallscream.ogg', 50, 0) //playsound(H.loc, 'bubbles.ogg', 50, 0) //playsound(H.loc, 'loudcrunch2.ogg', 50, 0) - var/mob/living/carbon/human/skellington/nH = new /mob/living/carbon/human/skellington(H.loc, delay_ready_dna=1) + var/mob/living/carbon/human/skeleton/nH = new /mob/living/carbon/human/skeleton(H.loc, delay_ready_dna=1) nH.real_name = H.real_name nH.name = "[H.name]'s skeleton" //H.decomp_stage = 4 diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index bc323d14c3c..324fa636740 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -316,7 +316,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" user << "DNA of [target] is ruined beyond usability!" return - if(T.species.flags & NO_DNA_RAD) + if(T.species.flags & NO_DNA) user << "This creature does not have DNA!" return diff --git a/code/game/gamemodes/changeling/powers/swap_form.dm b/code/game/gamemodes/changeling/powers/swap_form.dm index be5df7d9a67..09ecf7029bb 100644 --- a/code/game/gamemodes/changeling/powers/swap_form.dm +++ b/code/game/gamemodes/changeling/powers/swap_form.dm @@ -17,7 +17,7 @@ if((NOCLONE || SKELETON || HUSK) in target.mutations) user << "DNA of [target] is ruined beyond usability!" return - if(!istype(target) || issmall(target) || target.species.flags & NO_DNA_RAD || target.species.flags & NO_SCAN || target.species.flags & NO_BLOOD) + if(!istype(target) || issmall(target) || target.species.flags & NO_DNA || target.species.flags & NO_SCAN || target.species.flags & NO_BLOOD) user << "[target] is not compatible with this ability." return return 1 diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index bbdbea1c724..69403bc5d8e 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -7,7 +7,6 @@ var/round_start_time = 0 var/hide_mode = 0 // leave here at 0 ! setup() will take care of it when needed for Secret mode -walter0o var/datum/game_mode/mode = null - var/post_game = 0 var/event_time = null var/event = 0 @@ -386,16 +385,13 @@ var/round_start_time = 0 //emergency_shuttle.process() DONE THROUGH PROCESS SCHEDULER - var/game_finished = 0 - var/mode_finished = 0 - if (config.continous_rounds) - game_finished = (mode.station_was_nuked) - mode_finished = (!post_game && mode.check_finished()) + var/game_finished = shuttle_master.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked + if (config.continuous_rounds) + mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result else - game_finished = (mode.check_finished()) - mode_finished = game_finished + game_finished |= mode.check_finished() - if(!mode.explosion_in_progress && game_finished && (mode_finished || post_game)) + if(!mode.explosion_in_progress && game_finished) current_state = GAME_STATE_FINISHED auto_toggle_ooc(1) // Turn it on spawn @@ -409,18 +405,6 @@ var/round_start_time = 0 else world.Reboot("Round ended.", "end_proper", "proper completion") - else if (mode_finished) - post_game = 1 - - mode.cleanup() - - //call a transfer shuttle vote - spawn(50) - if(!round_end_announced) // Spam Prevention. Now it should announce only once. - world << "\red The round has ended!" - round_end_announced = 1 - vote.autotransfer() - return 1 proc/getfactionbyname(var/name) diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 4d436e29ca9..cc38ef0ef9f 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -148,7 +148,7 @@ if (station_captured && !to_nuke_or_not_to_nuke) return 1 if (is_malf_ai_dead()) - if(config.continous_rounds) + if(config.continuous_rounds) if(shuttle_master && shuttle_master.emergencyNoEscape) shuttle_master.emergencyNoEscape = 0 malf_mode_declared = 0 diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 34ec44a4245..6926c7f6067 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -111,10 +111,7 @@ ..() statpanel("Status") - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + show_stat_emergency_shuttle_eta() if (client.statpanel == "Status") stat("Chemicals", chemicals) diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 99f0f98e256..7b056987953 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -262,6 +262,9 @@ /obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S << "Attempting to dismantle this machine would result in an immediate counterattack. Aborting." +/obj/spacepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Destroying this vehicle would destroy us. Aborting." + /mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisperseTarget(src) diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm index 6d3190aa424..6737ee8b8f4 100644 --- a/code/game/gamemodes/nations/nations.dm +++ b/code/game/gamemodes/nations/nations.dm @@ -102,7 +102,7 @@ datum/game_mode/nations H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" continue - if(H.mind.assigned_role in support_positions) + if(H.mind.assigned_role in (support_positions + command_positions)) H.mind.nation = all_nations["People's Republic of Commandzakstan"] update_nations_icons_added(H,"hudcommand") H.mind.nation.membership += H.mind.current @@ -113,16 +113,6 @@ datum/game_mode/nations H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" continue - if(H.mind.assigned_role in command_positions) - H.mind.nation = all_nations["People's Republic of Commandzakstan"] - update_nations_icons_added(H,"hudcommand") - H.mind.nation.membership += H.mind.current - if(H.mind.assigned_role == H.mind.nation.default_leader) - H.mind.nation.current_leader = H.mind.current - H << "You have been chosen to lead the nation of [H.mind.nation.default_name]!" - continue - H << "You are now part of the great sovereign nation of [H.mind.nation.default_name]!" - continue if(H.mind.assigned_role in civilian_positions) H << "You do not belong to any nation and are free to sell your services to the highest bidder." continue @@ -182,8 +172,6 @@ datum/game_mode/nations if(!mode.kickoff) return 1 - var/list/cargonians = list("Quartermaster","Cargo Technician","Shaft Miner") - var/list/servicion = list("Clown", "Mime", "Bartender", "Chef", "Botanist") if(H.mind) if(H.mind.assigned_role in engineering_positions) H.mind.nation = all_nations["Atmosia"] @@ -213,33 +201,27 @@ datum/game_mode/nations H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" return 1 - if(H.mind.assigned_role in cargonians) + if(H.mind.assigned_role in mode.cargonians) H.mind.nation = all_nations["Cargonia"] mode.update_nations_icons_added(H,"hudcargonia") H.mind.nation.membership += H.mind.current H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" return 1 - if(H.mind.assigned_role in servicion) + if(H.mind.assigned_role in mode.servicion) H.mind.nation = all_nations["Servicion"] mode.update_nations_icons_added(H,"hudservice") H.mind.nation.membership += H.mind.current H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" return 1 - if(H.mind.assigned_role in support_positions) - H.mind.nation = all_nations["People's Republic of Commandzakstan"] - mode.update_nations_icons_added(H,"hudcommand") - H.mind.nation.membership += H.mind.current - H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" - return 1 - - if(H.mind.assigned_role in command_positions) + if(H.mind.assigned_role in (support_positions + command_positions)) H.mind.nation = all_nations["People's Republic of Commandzakstan"] mode.update_nations_icons_added(H,"hudcommand") H.mind.nation.membership += H.mind.current H << "You are now part of the great sovereign nation of [H.mind.nation.current_name]!" return 1 + if(H.mind.assigned_role in civilian_positions) H << "You do not belong to any nation and are free to sell your services to the highest bidder." return 1 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 345114a4088..74e81484c97 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -203,15 +203,11 @@ //Checks if the round is over// /////////////////////////////// /datum/game_mode/revolution/check_finished() - if(config.continous_rounds) + if(config.continuous_rounds) if(finished != 0) if(shuttle_master && shuttle_master.emergencyNoEscape) shuttle_master.emergencyNoEscape = 0 - return ..() - if(finished != 0) - return 1 - else - return 0 + return finished != 0 /////////////////////////////////////////////////// //Deals with converting players to the revolution// diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index 7092469efd1..77703c53715 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -1,5 +1,5 @@ /datum/game_mode/wizard/raginmages - name = "Ragin' Mages" + name = "ragin' mages" config_tag = "raginmages" required_players = 1 required_players_secret = 15 diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index d0c6f059f26..b6052320615 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -1,15 +1,19 @@ /mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic - var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg") - var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo") + var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","hyperkinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam") + var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special") var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic") + usr << "You summoned [summon_type ? "magic" : "guns"]!" message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]!") + for(var/mob/living/carbon/human/H in player_list) - if(H.stat == 2 || !(H.client)) continue + if(H.stat == 2 || !(H.client)) + continue if(H.mind) - if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice") continue + if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice") + continue var/randomizeguns = pick(gunslist) var/randomizemagic = pick(magiclist) var/randomizemagicspecial = pick(magicspeciallist) @@ -25,43 +29,65 @@ new /obj/item/weapon/gun/projectile/revolver(get_turf(H)) if("detective") new /obj/item/weapon/gun/projectile/revolver/detective(get_turf(H)) - if("c20r") - new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H)) - if("nuclear") - new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H)) if("deagle") new /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo(get_turf(H)) if("gyrojet") new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H)) if("pulse") new /obj/item/weapon/gun/energy/pulse_rifle(get_turf(H)) - if("silenced") + if("suppressed") new /obj/item/weapon/gun/projectile/automatic/pistol(get_turf(H)) new /obj/item/weapon/suppressor(get_turf(H)) - if("cannon") - new /obj/item/weapon/gun/energy/lasercannon(get_turf(H)) if("doublebarrel") new /obj/item/weapon/gun/projectile/revolver/doublebarrel(get_turf(H)) if("shotgun") - new /obj/item/weapon/gun/projectile/shotgun/(get_turf(H)) + new /obj/item/weapon/gun/projectile/shotgun(get_turf(H)) if("combatshotgun") new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(H)) - if("bulldog") - new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H)) if("arg") new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H)) if("mateba") new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(H)) + if("boltaction") + new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H)) + if("uzi") + new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H)) + if("cannon") + new /obj/item/weapon/gun/energy/lasercannon(get_turf(H)) + if("crossbow") + new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large(get_turf(H)) + if("nuclear") + new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H)) if("sabr") new /obj/item/weapon/gun/projectile/automatic/proto(get_turf(H)) - if("crossbow") - new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow(get_turf(H)) + if("bulldog") + new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H)) + if("c20r") + new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H)) if("saw") new /obj/item/weapon/gun/projectile/automatic/l6_saw(get_turf(H)) if("car") new /obj/item/weapon/gun/projectile/automatic/m90(get_turf(H)) - if("boltaction") - new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H)) + if("turret") + new /obj/item/weapon/gun/energy/gun/turret(get_turf(H)) + if("pulsecarbine") + new /obj/item/weapon/gun/energy/pulse_rifle/carbine(get_turf(H)) + if("decloner") + new /obj/item/weapon/gun/energy/decloner(get_turf(H)) + if("mindflayer") + new /obj/item/weapon/gun/energy/mindflayer(get_turf(H)) + if("hyperkinetic") + new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper(get_turf(H)) + if("advplasmacutter") + new /obj/item/weapon/gun/energy/plasmacutter/adv(get_turf(H)) + if("wormhole") + new /obj/item/weapon/gun/energy/wormhole_projector(get_turf(H)) + if("wt550") + new /obj/item/weapon/gun/projectile/automatic/wt550(get_turf(H)) + if("grenadelauncher") + new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(get_turf(H)) + if("medibeam") + new /obj/item/weapon/gun/medbeam(get_turf(H)) else switch (randomizemagic) if("fireball") @@ -80,6 +106,8 @@ new /obj/item/weapon/spellbook/oneuse/horsemask(get_turf(H)) if("charge") new /obj/item/weapon/spellbook/oneuse/charge(get_turf(H)) + if("summonitem") + new /obj/item/weapon/spellbook/oneuse/summonitem(get_turf(H)) if("wandnothing") new /obj/item/weapon/gun/magic/wand(get_turf(H)) if("wanddeath") @@ -109,10 +137,8 @@ H.see_in_dark = 8 H.see_invisible = SEE_INVISIBLE_LEVEL_TWO H << "The walls suddenly disappear." - if("voodoo") new /obj/item/voodoo(get_turf(H)) - if("special") magiclist -= "special" //only one super OP item per summoning max switch (randomizemagicspecial) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index c8d64fb1b27..83c23311297 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -3,9 +3,9 @@ var/spell_type = null var/desc = "" - var/category = "Offensive Spells" + var/category = "Offensive" var/log_name = "XX" //What it shows up as in logs - var/cost = 1 + var/cost = 2 var/refundable = 1 var/surplus = -1 // -1 for infinite, not used by anything atm var/obj/effect/proc_holder/spell/S = null //Since spellbooks can be used by only one person anyway we can track the actual spell @@ -99,6 +99,7 @@ name = "Remove Clothes Requirement" spell_type = /obj/effect/proc_holder/spell/noclothes log_name = "NC" + category = "Defensive" /datum/spellbook_entry/fireball name = "Fireball" @@ -109,6 +110,7 @@ name = "Magic Missile" spell_type = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile log_name = "MM" + category = "Defensive" /datum/spellbook_entry/disintegrate name = "Disintegrate" @@ -119,12 +121,14 @@ name = "Disable Tech" spell_type = /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech log_name = "DT" - category = "Utility Spells" + category = "Defensive" + cost = 1 /datum/spellbook_entry/repulse name = "Repulse" spell_type = /obj/effect/proc_holder/spell/aoe_turf/repulse log_name = "RP" + category = "Defensive" /datum/spellbook_entry/timestop name = "Time Stop" @@ -136,59 +140,57 @@ name = "Smoke" spell_type = /obj/effect/proc_holder/spell/targeted/smoke log_name = "SM" - category = "Utility Spells" + category = "Defensive" + cost = 1 /datum/spellbook_entry/blind name = "Blind" spell_type = /obj/effect/proc_holder/spell/targeted/trigger/blind log_name = "BD" + cost = 1 /datum/spellbook_entry/mindswap name = "Mindswap" spell_type = /obj/effect/proc_holder/spell/targeted/mind_transfer log_name = "MT" - category = "Utility Spells" + category = "Mobility" /datum/spellbook_entry/forcewall name = "Force Wall" spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall log_name = "FW" - category = "Utility Spells" + category = "Defensive" + cost = 1 /datum/spellbook_entry/blink name = "Blink" spell_type = /obj/effect/proc_holder/spell/targeted/turf_teleport/blink log_name = "BL" - category = "Utility Spells" + category = "Mobility" /datum/spellbook_entry/teleport name = "Teleport" spell_type = /obj/effect/proc_holder/spell/targeted/area_teleport/teleport log_name = "TP" - category = "Utility Spells" + category = "Mobility" /datum/spellbook_entry/mutate name = "Mutate" spell_type = /obj/effect/proc_holder/spell/targeted/genetic/mutate log_name = "MU" - category = "Utility Spells" /datum/spellbook_entry/jaunt name = "Ethereal Jaunt" spell_type = /obj/effect/proc_holder/spell/targeted/ethereal_jaunt log_name = "EJ" - category = "Utility Spells" + category = "Mobility" /datum/spellbook_entry/knock name = "Knock" spell_type = /obj/effect/proc_holder/spell/aoe_turf/knock log_name = "KN" - category = "Utility Spells" - -/datum/spellbook_entry/horseman - name = "Curse of The Horseman" - spell_type = /obj/effect/proc_holder/spell/targeted/horsemask - log_name = "HH" + category = "Mobility" + cost = 1 /datum/spellbook_entry/fleshtostone name = "Flesh to Stone" @@ -199,20 +201,45 @@ name = "Summon Item" spell_type = /obj/effect/proc_holder/spell/targeted/summonitem log_name = "IS" - category = "Utility Spells" + category = "Assistance" + cost = 1 + +/datum/spellbook_entry/lichdom + name = "Bind Soul" + spell_type = /obj/effect/proc_holder/spell/targeted/lichdom + log_name = "LD" + category = "Defensive" /datum/spellbook_entry/lightningbolt name = "Lightning Bolt" spell_type = /obj/effect/proc_holder/spell/targeted/lightning log_name = "LB" +/datum/spellbook_entry/infinite_guns + name = "Lesser Summon Guns" + spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns + log_name = "IG" + cost = 4 + +/datum/spellbook_entry/horseman + name = "Curse of The Horseman" + spell_type = /obj/effect/proc_holder/spell/targeted/horsemask + log_name = "HH" + +/datum/spellbook_entry/charge + name = "Charge" + spell_type = /obj/effect/proc_holder/spell/targeted/charge + log_name = "CH" + category = "Assistance" + cost = 1 + /datum/spellbook_entry/item name = "Buy Item" - category = "Artifacts" refundable = 0 buy_word = "Summon" var/item_path= null + /datum/spellbook_entry/item/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) new item_path(get_turf(user)) feedback_add_details("wizard_spell_learned",log_name) @@ -238,6 +265,7 @@ desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines." item_path = /obj/item/weapon/gun/magic/staff/animate log_name = "SA" + category = "Assistance" /datum/spellbook_entry/item/staffchaos name = "Staff of Chaos" @@ -250,26 +278,23 @@ desc = "A particular staff that can mold solid metal into ornate wooden doors. Useful for getting around in the absence of other transportation. Does not work on glass." item_path = /obj/item/weapon/gun/magic/staff/door log_name = "SD" + cost = 1 + category = "Mobility" + +/datum/spellbook_entry/item/staffhealing + name = "Staff of Healing" + desc = "An altruistic staff that can heal the lame and raise the dead." + item_path = /obj/item/weapon/gun/magic/staff/healing + log_name = "SH" + cost = 1 + category = "Defensive" /datum/spellbook_entry/item/scryingorb name = "Scrying Orb" desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision." item_path = /obj/item/weapon/scrying log_name = "SO" - -/datum/spellbook_entry/item/bloodbottle - name = "Bottle of Blood" - desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim." - item_path = /obj/item/weapon/antag_spawner/slaughter_demon - log_name = "BB" - limit = 3 - -/datum/spellbook_entry/item/tarotdeck - name = "Tarot Deck" - desc = "A deck of tarot cards that can be used to summon a spirit companion for the wizard." - item_path = /obj/item/weapon/guardiancreator - log_name = "TD" - limit = 1 + category = "Defensive" /datum/spellbook_entry/item/scryingorb/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) if(..()) @@ -287,6 +312,7 @@ desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot." item_path = /obj/item/weapon/storage/belt/soulstone/full log_name = "SS" + category = "Assistance" /datum/spellbook_entry/item/soulstones/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) . =..() @@ -299,18 +325,21 @@ desc = "A Necromantic stone is able to resurrect three dead individuals as skeletal thralls for you to command." item_path = /obj/item/device/necromantic_stone log_name = "NS" + category = "Assistance" /datum/spellbook_entry/item/wands name = "Wand Assortment" desc = "A collection of wands that allow for a wide variety of utility. Wands do not recharge, so be conservative in use. Comes in a handy belt." item_path = /obj/item/weapon/storage/belt/wands/full log_name = "WA" + category = "Defensive" /datum/spellbook_entry/item/armor name = "Mastercrafted Armor Set" desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space." item_path = /obj/item/clothing/suit/space/rig/wizard log_name = "HS" + category = "Defensive" /datum/spellbook_entry/item/armor/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) . = ..() @@ -324,6 +353,35 @@ desc = "A magical contract binding an apprentice wizard to your service, using it will summon them to your side." item_path = /obj/item/weapon/contract log_name = "CT" + category = "Assistance" + +/datum/spellbook_entry/item/bloodbottle + name = "Bottle of Blood" + desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim." + item_path = /obj/item/weapon/antag_spawner/slaughter_demon + log_name = "BB" + limit = 3 + category = "Assistance" + +/datum/spellbook_entry/item/tarotdeck + name = "Tarot Deck" + desc = "A deck of tarot cards that can be used to summon a spirit companion for the wizard." + item_path = /obj/item/weapon/guardiancreator + log_name = "TD" + limit = 1 + category = "Assistance" + +/datum/spellbook_entry/item/mjolnir + name = "Mjolnir" + desc = "A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power." + item_path = /obj/item/weapon/twohanded/mjollnir + log_name = "MJ" + +/datum/spellbook_entry/item/singularity_hammer + name = "Singularity Hammer" + desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everthing nearby to the point of impact." + item_path = /obj/item/weapon/twohanded/singularityhammer + log_name = "SI" /datum/spellbook_entry/summon name = "Summon Stuff" @@ -349,11 +407,17 @@ /datum/spellbook_entry/summon/guns name = "Summon Guns" - category = "Challenges" + category = "Rituals" desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!" cost = 0 log_name = "SG" +/datum/spellbook_entry/summon/guns/IsAvailible() + if(ticker.mode.name == "ragin' mages") + return 0 + else + return 1 + /datum/spellbook_entry/summon/guns/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) feedback_add_details("wizard_spell_learned",log_name) user.rightandwrong(0) @@ -369,6 +433,12 @@ cost = 0 log_name = "SU" +/datum/spellbook_entry/summon/magic/IsAvailible() + if(ticker.mode.name == "ragin' mages") + return 0 + else + return 1 + /datum/spellbook_entry/summon/magic/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) feedback_add_details("wizard_spell_learned",log_name) user.rightandwrong(1) @@ -384,8 +454,8 @@ icon_state ="book" throw_speed = 2 throw_range = 5 - w_class = 1.0 - var/uses = 5 + w_class = 1 + var/uses = 10 var/temp = null var/op = 1 var/tab = null @@ -429,17 +499,26 @@ /obj/item/weapon/spellbook/proc/GetCategoryHeader(var/category) var/dat = "" switch(category) - if("Offensive Spells") - dat += "Spells that can be reused endlessly.
" - dat += "The number after the spell name is the cooldown time.
" + if("Offensive") + dat += "Spells and items geared towards debilitating and destroying.

" + dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" + dat += "For spells: the number after the spell name is the cooldown time.
" dat += "You can reduce this number by spending more points on the spell.
" - if("Utility Spells") - dat += "Spells that can be reused endlessly.
" - dat += "The number after the spell name is the cooldown time.
" + if("Defensive") + dat += "Spells and items geared towards improving your survivabilty or reducing foes ability to attack.

" + dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" + dat += "For spells: the number after the spell name is the cooldown time.
" + dat += "You can reduce this number by spending more points on the spell.
" + if("Mobility") + dat += "Spells and items geared towards improving your ability to move. It is a good idea to take at least one.

" + dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" + dat += "For spells: the number after the spell name is the cooldown time.
" + dat += "You can reduce this number by spending more points on the spell.
" + if("Assistance") + dat += "Spells and items geared towards bringing in outside forces to aid you or improving upon your other items and abilties.

" + dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" + dat += "For spells: the number after the spell name is the cooldown time.
" dat += "You can reduce this number by spending more points on the spell.
" - if("Artifacts") - dat += "Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of uses.
" - dat += "These items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" if("Challenges") dat += "The Wizard Federation typically has hard limits on the potency and number of spells brought to the station based on risk.
" dat += "Arming the station against you will increases the risk, but will grant you one more charge for your spellbook.
" @@ -484,7 +563,7 @@ cat_dat[category] = "
" dat += "
  • [category]
  • " - dat += "
  • Uses remaining : [uses]
  • " + dat += "
  • Points remaining : [uses]
  • " dat += "" var/datum/spellbook_entry/E @@ -508,7 +587,7 @@ dat += cat_dat[category] dat += "" - user << browse(wrap(dat), "window=spellbook;size=700x300") + user << browse(wrap(dat), "window=spellbook;size=700x500") onclose(user, "spellbook") return diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 2d690cdbb17..37a6c801573 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -203,10 +203,6 @@ /datum/game_mode/wizard/check_finished() - - if(config.continous_rounds) - return ..() - var/wizards_alive = 0 var/traitors_alive = 0 for(var/datum/mind/wizard in wizards) @@ -292,10 +288,12 @@ //OTHER PROCS //To batch-remove wizard spells. Linked to mind.dm. -/mob/proc/spellremove(var/mob/M as mob, var/removeallspells=1) - for(var/obj/effect/proc_holder/spell/spell_to_remove in src.spell_list) - if (spell_to_remove.name == "Artificer" && !removeallspells) continue +/mob/proc/spellremove(mob/M) + if(!mind) + return + for(var/obj/effect/proc_holder/spell/spell_to_remove in src.mind.spell_list) qdel(spell_to_remove) + mind.spell_list -= spell_to_remove /datum/mind/proc/remove_spell(var/obj/effect/proc_holder/spell/spell) //To remove a specific spell from a mind if(!spell) return diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm index f30debb7e98..4ae05c7dd21 100644 --- a/code/game/gamemodes/xenos/xenos.dm +++ b/code/game/gamemodes/xenos/xenos.dm @@ -135,15 +135,7 @@ return ..() /datum/game_mode/xenos/check_finished() - if(config.continous_rounds) - if(result) - return ..() - if(shuttle_master && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) - return ..() - if(result || station_was_nuked) - return 1 - else - return 0 + return result != 0 /datum/game_mode/xenos/proc/xenos_alive() var/list/livingxenos = list() diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index 420993746d0..748ffcd5d85 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -116,6 +116,15 @@ var/list/support_positions = list( "Blueshield" ) +var/list/supply_positions = list( + "Head of Personnel", + "Quartermaster", + "Cargo Technician", + "Shaft Miner" +) + +var/list/service_positions = support_positions - supply_positions + list("Head of Personnel") + var/list/security_positions = list( "Head of Security", diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 7cedc40f8a7..2ad0eba3a81 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -37,6 +37,7 @@ dat += "((Snow Field))
    " dat += "((Theatre))
    " dat += "((Meeting Hall))
    " + dat += "((Knight Arena))
    " // dat += "((Shutdown System))
    " dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
    " @@ -120,6 +121,11 @@ if(target) loadProgram(target) + else if(href_list["knightarena"]) + target = locate(/area/holodeck/source_knightarena) + if(target) + loadProgram(target) + else if(href_list["turnoff"]) target = locate(/area/holodeck/source_plating) if(target) @@ -142,7 +148,7 @@ emagged = !emagged if(emagged) message_admins("[key_name_admin(usr)] overrode the holodeck's safeties") - log_game("[key_name(usr)] overrided the holodeck's safeties") + log_game("[key_name(usr)] overrode the holodeck's safeties") else message_admins("[key_name_admin(usr)] restored the holodeck's safeties") log_game("[key_name(usr)] restored the holodeck's safeties") @@ -290,7 +296,7 @@ holographic_items = A.copy_contents_to(linkedholodeck , 1) if(emagged) - for(var/obj/item/weapon/holo/esword/H in linkedholodeck) + for(var/obj/item/weapon/holo/H in linkedholodeck) H.damtype = BRUTE spawn(30) @@ -407,6 +413,28 @@ /obj/item/weapon/holo damtype = STAMINA +/obj/item/weapon/holo/claymore + name = "claymore" + desc = "What are you standing around staring at this for? Get to killing!" + icon_state = "claymore" + item_state = "claymore" + hitsound = 'sound/weapons/bladeslice.ogg' + force = 40 + throwforce = 10 + w_class = 4 + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + +/obj/item/weapon/holo/claymore/blue + icon_state = "claymoreblue" + item_state = "claymoreblue" + +/obj/item/weapon/holo/claymore/red + icon_state = "claymorered" + item_state = "claymorered" + +/obj/item/weapon/holo/claymore/IsShield() + return 1 + /obj/item/weapon/holo/esword desc = "May the force be within you. Sorta" icon_state = "sword0" diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 9dede30f469..ea2dadda3b4 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -437,7 +437,7 @@ user << "Under directive 7-10, [station_name()] is quarantined until further notice." return - if(seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. + if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. shuttle_master.emergency.request(null, 0.5, null, " Automatic Crew Transfer", 1) else shuttle_master.emergency.request(null, 1, null, " Automatic Crew Transfer", 0) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index a211c7d0fda..83e1f3f723e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -882,8 +882,8 @@ About the new airlock wires panel: src.closeOther.close() return ..() -/obj/machinery/door/airlock/close(var/forced=0) - if(operating || welded || locked) +/obj/machinery/door/airlock/close(var/forced=0, var/override = 0) + if((operating & !override) || welded || locked) return if(!forced) //despite the name, this wire is for general door control. @@ -918,11 +918,11 @@ About the new airlock wires panel: operating = 1 do_animate("closing") src.layer = 3.1 - sleep(5) + if (!override) sleep(5) src.density = 1 if(!safe) crush() - sleep(5) + if(!override) sleep(5) update_icon() if(visible && !glass) set_opacity(1) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index c3f43ce7968..0939b189eb1 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1042,7 +1042,7 @@ /obj/item/clothing/suit/poncho/green = 1, /obj/item/clothing/suit/poncho/red = 1, /obj/item/clothing/accessory/blue = 1, /obj/item/clothing/accessory/red = 1, /obj/item/clothing/accessory/black = 1, /obj/item/clothing/accessory/horrible = 1, /obj/item/clothing/under/maid = 1, /obj/item/clothing/under/janimaid = 1, /obj/item/clothing/under/pants/camo = 1, /obj/item/clothing/mask/bandana = 1, /obj/item/clothing/mask/bandana/black = 1) contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1, /obj/item/clothing/mask/balaclava=1, /obj/item/clothing/mask/horsehead = 2) - premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1) + premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/weapon/shield/riot/roman = 1) refill_canister = /obj/item/weapon/vending_refill/autodrobe /obj/machinery/vending/autodrobe/New() diff --git a/code/game/objects/effects/datacore-effect.dm b/code/game/objects/effects/datacore-effect.dm index cd3dd60011f..f50be441414 100644 --- a/code/game/objects/effects/datacore-effect.dm +++ b/code/game/objects/effects/datacore-effect.dm @@ -18,7 +18,8 @@ var/list/eng = new() var/list/med = new() var/list/sci = new() - var/list/supp = new() + var/list/ser = new() + var/list/sup = new() var/list/bot = new() var/list/misc = new() var/list/isactive = new() @@ -67,8 +68,11 @@ if(real_rank in science_positions) sci[name] = rank department = 1 - if(real_rank in support_positions) - supp[name] = rank + if(real_rank in service_positions) + ser[name] = rank + department = 1 + if(real_rank in supply_positions) + sup[name] = rank department = 1 if(real_rank in nonhuman_positions) bot[name] = rank @@ -100,10 +104,15 @@ for(name in sci) dat += "[name][sci[name]][isactive[name]]" even = !even - if(supp.len > 0) - dat += "Support" - for(name in supp) - dat += "[name][supp[name]][isactive[name]]" + if(ser.len > 0) + dat += "Service" + for(name in ser) + dat += "[name][ser[name]][isactive[name]]" + even = !even + if(sup.len > 0) + dat += "Supply" + for(name in sup) + dat += "[name][sup[name]][isactive[name]]" even = !even // in case somebody is insane and added them to the manifest, why not if(bot.len > 0) @@ -142,7 +151,8 @@ var/global/ManifestJSON var/eng[0] var/med[0] var/sci[0] - var/supp[0] + var/ser[0] + var/sup[0] var/bot[0] var/misc[0] for(var/datum/data/record/t in data_core.general) @@ -183,11 +193,17 @@ var/global/ManifestJSON if(depthead && sci.len != 1) sci.Swap(1,sci.len) - if(real_rank in support_positions) - supp[++supp.len] = list("name" = name, "rank" = rank, "active" = isactive) + if(real_rank in service_positions) + ser[++ser.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 - if(depthead && supp.len != 1) - supp.Swap(1,supp.len) + if(depthead && ser.len != 1) + ser.Swap(1,ser.len) + + if(real_rank in supply_positions) + sup[++sup.len] = list("name" = name, "rank" = rank, "active" = isactive) + department = 1 + if(depthead && sup.len != 1) + sup.Swap(1,sup.len) if(real_rank in nonhuman_positions) bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive) @@ -203,7 +219,8 @@ var/global/ManifestJSON "eng" = eng,\ "med" = med,\ "sci" = sci,\ - "supp" = supp,\ + "ser" = ser,\ + "sup" = sup,\ "bot" = bot,\ "misc" = misc\ ) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 17e35850d8c..d0477eead0d 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -271,7 +271,7 @@ singular_name = "glass sheet" icon_state = "sheet-plasmaglass" materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2) - origin_tech = "materials=3;plasma=2" + origin_tech = "materials=3;plasmatech=2" var/created_window = /obj/structure/window/plasmabasic var/full_window = /obj/structure/window/full/plasmabasic @@ -360,7 +360,7 @@ singular_name = "reinforced plasma glass sheet" icon_state = "sheet-plasmarglass" materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2) - origin_tech = "materials=3;plasma=2" + origin_tech = "materials=3;plasmatech=2" var/created_window = /obj/structure/window/plasmareinforced var/full_window = /obj/structure/window/full/plasmareinforced diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 6eb61f4d41e..11db68ec671 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -152,6 +152,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("apiary", /obj/item/apiary, 10, time = 25, one_per_turf = 0, on_floor = 0), \ new/datum/stack_recipe("easel", /obj/structure/easel, 3, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("wooden buckler", /obj/item/weapon/shield/riot/buckler, 20, time = 40), \ ) /obj/item/stack/sheet/wood diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ecdb2ac28ad..6a3493fc0ea 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1753,4 +1753,33 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/figure/warden name = "Warden action figure" icon_state = "warden" - toysay = "Execute him for breaking in!" \ No newline at end of file + toysay = "Execute him for breaking in!" + +////////////////////////////////////////////////////// +// Magic 8-Ball / Conch // +////////////////////////////////////////////////////// + +/obj/item/toy/eight_ball + name = "Magic 8-Ball" + desc = "Mystical! Magical! Ages 8+!" + icon = 'icons/obj/toy.dmi' + icon_state = "eight-ball" + var/use_action = "shakes the ball" + var/cooldown = 0 + var/list/possible_answers = list("Definitely", "All signs point to yes.", "Most likely.", "Yes.", "Ask again later.", "Better not tell you now.", "Future Unclear.", "Maybe.", "Doubtful.", "No.", "Don't count on it.", "Never.") + +/obj/item/toy/eight_ball/attack_self(mob/user as mob) + if(!cooldown) + var/answer = pick(possible_answers) + user.visible_message("[user] focuses on their question and [use_action]...") + user.visible_message("\icon[src] The [src] says \"[answer]\"") + spawn(30) + cooldown = 0 + return + +/obj/item/toy/eight_ball/conch + name = "Magic Conch Shell" + desc = "All hail the Magic Conch!" + icon_state = "conch" + use_action = "pulls the string" + possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.") \ No newline at end of file diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 29442b10525..940634e6b0b 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -30,6 +30,14 @@ LIGHTERS ARE IN LIGHTERS.DM var/lastHolder = null var/smoketime = 300 var/chem_volume = 30 + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' + ) + /obj/item/clothing/mask/cigarette/New() ..() diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index eae015b09e7..8a522c08f3b 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -99,7 +99,7 @@ if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure. var/mob/living/carbon/human/H = M - if(H.species.flags & NO_DNA_RAD) + if(H.species.flags & NO_DNA) return 0 if (!user.IsAdvancedToolUser()) diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 5c414831bf7..222960e9a5a 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/weapons.dmi' icon_state = "riot" slot_flags = SLOT_BACK - force = 8 + force = 10 throwforce = 5 throw_speed = 2 throw_range = 3 @@ -35,6 +35,19 @@ icon_state = "roman_shield" item_state = "roman_shield" +/obj/item/weapon/shield/riot/buckler + name = "wooden buckler" + desc = "A medieval wooden buckler." + icon_state = "buckler" + item_state = "buckler" + materials = list() + +/obj/item/weapon/shield/riot/buckler/IsShield() + if(prob(60)) + return 1 + else + return 0 + /obj/item/weapon/shield/energy name = "energy combat shield" desc = "A shield capable of stopping most melee attacks. Protects user from almost all energy projectiles. It can be retracted, expanded, and stored anywhere." diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index e2efe3edba4..29bc5bd5861 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -461,7 +461,7 @@ max_fuel = 40 w_class = 3.0 materials = list(MAT_METAL=70, MAT_GLASS=120) - origin_tech = "engineering=4;plasma=3" + origin_tech = "engineering=4;plasmatech=3" var/last_gen = 0 change_icons = 0 can_off_process = 1 diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 2cc2f739dcc..61164a45298 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -466,7 +466,7 @@ vortex(target,user) /obj/item/weapon/twohanded/mjollnir - name = "Mjollnir" + name = "Mjolnir" desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy." icon_state = "mjollnir0" flags = CONDUCT @@ -474,7 +474,7 @@ no_embed = 1 force = 5 force_unwielded = 5 - force_wielded = 20 + force_wielded = 25 throwforce = 30 throw_range = 7 w_class = 5 @@ -485,25 +485,30 @@ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread() s.set_up(5, 1, target.loc) s.start() - target.take_organ_damage(0,30) target.visible_message("[target.name] was shocked by the [src.name]!", \ "You feel a powerful shock course through your body sending you flying!", \ - "You hear a heavy electrical crack.") + "You hear a heavy electrical crack!") var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) target.throw_at(throw_target, 200, 4) return /obj/item/weapon/twohanded/mjollnir/attack(mob/M as mob, mob/user as mob) ..() - spawn(0) if(wielded) //if(charged == 5) //charged = 0 playsound(src.loc, "sparks", 50, 1) if(istype(M, /mob/living)) - M.Stun(10) + M.Stun(3) shock(M) +/obj/item/weapon/twohanded/mjollnir/throw_impact(atom/target) + . = ..() + if(istype(target, /mob/living)) + var/mob/living/L = target + L.Stun(3) + shock(L) + /obj/item/weapon/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons. icon_state = "mjollnir[wielded]" return 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 7b81a5b6460..26cd421133e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -115,7 +115,7 @@ new /obj/item/clothing/glasses/hud/security/sunglasses(src) new /obj/item/weapon/storage/lockbox/loyalty(src) new /obj/item/weapon/storage/box/flashbangs(src) - new /obj/item/clothing/mask/gas/sechailer/swat(src) + new /obj/item/clothing/mask/gas/sechailer/hos(src) new /obj/item/weapon/shield/riot/tele(src) new /obj/item/weapon/melee/baton/loaded(src) new /obj/item/weapon/storage/belt/security/sec(src) @@ -152,7 +152,7 @@ new /obj/item/clothing/under/rank/warden/formal(src) new /obj/item/clothing/under/rank/warden/corp(src) new /obj/item/clothing/glasses/hud/security/sunglasses(src) - new /obj/item/clothing/mask/gas/sechailer(src) + new /obj/item/clothing/mask/gas/sechailer/warden(src) new /obj/item/taperoll/police(src) new /obj/item/weapon/storage/box/zipties(src) new /obj/item/weapon/storage/box/flashbangs(src) diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index fa525e22e1f..cca76f4b42b 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -1,5 +1,54 @@ /mob/var/suiciding = 0 +/mob/living/carbon/human/proc/do_suicide(damagetype, byitem) + var/threshold = (config.health_threshold_crit + config.health_threshold_dead) / 2 + var/dmgamt = maxHealth - threshold + + var/damage_mod = 1 + switch(damagetype) //Sorry about the magic numbers. + //brute = 1, burn = 2, tox = 4, oxy = 8 + if(15) //4 damage types + damage_mod = 4 + + if(6, 11, 13, 14) //3 damage types + damage_mod = 3 + + if(3, 5, 7, 9, 10, 12) //2 damage types + damage_mod = 2 + + if(1, 2, 4, 8) //1 damage type + damage_mod = 1 + + else //This should not happen, but if it does, everything should still work + damage_mod = 1 + + //Do dmgamt damage divided by the number of damage types applied. + if(damagetype & BRUTELOSS) + adjustBruteLoss(dmgamt / damage_mod) + + if(damagetype & FIRELOSS) + adjustFireLoss(dmgamt / damage_mod) + + if(damagetype & TOXLOSS) + adjustToxLoss(dmgamt / damage_mod) + + if(damagetype & OXYLOSS) + adjustOxyLoss(dmgamt / damage_mod) + + // Failing that... + if(!(damagetype & BRUTELOSS) && !(damagetype & FIRELOSS) && !(damagetype & TOXLOSS) && !(damagetype & OXYLOSS)) + if(species.flags & NO_BREATHE) + // the ultimate fallback + take_overall_damage(max(dmgamt - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0), 0) + else + adjustOxyLoss(max(dmgamt - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + + var/obj/item/organ/external/affected = get_organ("head") + if(affected) + affected.add_autopsy_data(byitem ? "Suicide by [byitem]" : "Suicide", dmgamt) + + updatehealth() + /mob/living/carbon/human/verb/suicide() set hidden = 1 @@ -24,56 +73,11 @@ if(held_item) var/damagetype = held_item.suicide_act(src) if(damagetype) - var/damage_mod = 1 - switch(damagetype) //Sorry about the magic numbers. - //brute = 1, burn = 2, tox = 4, oxy = 8 - if(15) //4 damage types - damage_mod = 4 - - if(6, 11, 13, 14) //3 damage types - damage_mod = 3 - - if(3, 5, 7, 9, 10, 12) //2 damage types - damage_mod = 2 - - if(1, 2, 4, 8) //1 damage type - damage_mod = 1 - - else //This should not happen, but if it does, everything should still work - damage_mod = 1 - - //Do 175 damage divided by the number of damage types applied. - if(damagetype & BRUTELOSS) - adjustBruteLoss(175/damage_mod) - - if(damagetype & FIRELOSS) - adjustFireLoss(175/damage_mod) - - if(damagetype & TOXLOSS) - adjustToxLoss(175/damage_mod) - - if(damagetype & OXYLOSS) - adjustOxyLoss(175/damage_mod) - - //If something went wrong, just do normal oxyloss - if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS)) - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - - var/obj/item/organ/external/affected = get_organ("head") - affected.add_autopsy_data("Suicide by [held_item]", 175) - - updatehealth() + do_suicide(damagetype, held_item) return - - viewers(src) << pick("\red [src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \ - "\red [src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \ - "\red [src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \ - "\red [src] is holding \his breath! It looks like \he's trying to commit suicide.") - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - - var/obj/item/organ/external/affected = get_organ("head") - affected.add_autopsy_data("Suicide", 175) + viewers(src) << "[src] [pick(species.suicide_messages)] It looks like they're trying to commit suicide." + do_suicide(0) updatehealth() diff --git a/code/modules/arcade/arcade_prize.dm b/code/modules/arcade/arcade_prize.dm index 30374d31a52..960ead4a0b6 100644 --- a/code/modules/arcade/arcade_prize.dm +++ b/code/modules/arcade/arcade_prize.dm @@ -17,7 +17,7 @@ playsound(src.loc, 'sound/items/bubblewrap.ogg', 30, 1, extrarange = -4, falloff = 10) icon_state = "prizeconfetti" src.color = pick(random_color_list) - var/prize_inside = pick(/obj/random/carp_plushie, /obj/random/plushie, /obj/random/figure) //will add ticket bundles later + var/prize_inside = pick(/obj/random/carp_plushie, /obj/random/plushie, /obj/random/figure, /obj/item/toy/eight_ball) //will add ticket bundles later spawn(10) user.unEquip(src) new prize_inside(user.loc) diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index d1376bf3b8a..977a3969a93 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -58,9 +58,12 @@ desc = "A Collectable Welding Helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this Helmet is done so at the owner's own risk!" icon_state = "welding" item_state = "welding" - species_fit = list("Vox") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/helmet.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) /obj/item/clothing/head/collectable/slime diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 4112164f0e3..3d138a29ab0 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -68,7 +68,7 @@ /obj/item/clothing/head/cueball name = "cueball helmet" - desc = "A large, featureless white orb mean to be worn on your head. How do you even see out of this thing?" + desc = "A large, featureless white orb meant to be worn on your head. How do you even see out of this thing?" icon_state = "cueball" flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR item_state="cueball" @@ -99,7 +99,7 @@ /obj/item/clothing/head/justice name = "justice hat" - desc = "fight for what's righteous!" + desc = "Fight for what's righteous!" icon_state = "justicered" item_state = "justicered" flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR @@ -122,7 +122,7 @@ /obj/item/clothing/head/rabbitears name = "rabbit ears" - desc = "Wearing these makes you looks useless, and only good for your sex appeal." + desc = "Wearing these makes you look useless, and only good for your sex appeal." icon_state = "bunny" /obj/item/clothing/head/flatcap diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 494a1a99171..d822d76329c 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -24,9 +24,12 @@ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) action_button_name = "flip welding helmet" - species_fit = list("Vox") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/head.dmi' + "Vox" = 'icons/mob/species/vox/head.dmi', + "Unathi" = 'icons/mob/species/unathi/helmet.dmi', + "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi' ) /obj/item/clothing/head/welding/flamedecal diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 0e317845cdf..c12fddfc884 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -8,9 +8,12 @@ w_class = 2 action_button_name = "Adjust Balaclava" ignore_maskadjust = 0 - species_fit = list("Vox") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/mask.dmi' + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) /obj/item/clothing/mask/balaclava/attack_self(var/mob/user) @@ -24,9 +27,12 @@ flags = BLOCKHAIR flags_inv = HIDEFACE w_class = 2 - species_fit = list("Vox") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/mask.dmi' + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) /obj/item/clothing/mask/luchador/tecnicos @@ -34,11 +40,9 @@ desc = "Worn by robust fighters who uphold justice and fight honorably." icon_state = "luchador" item_state = "luchador" - species_fit = list("Vox") /obj/item/clothing/mask/luchador/rudos name = "Rudos Mask" desc = "Worn by robust fighters who are willing to do anything to win." icon_state = "luchar" - item_state = "luchar" - species_fit = list("Vox") \ No newline at end of file + item_state = "luchar" \ No newline at end of file diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 2155923b8f1..a9af66abd16 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -7,13 +7,15 @@ w_class = 2 gas_transfer_coefficient = 0.10 permeability_coefficient = 0.50 - species_fit = list("Vox") action_button_name = "Adjust Breath Mask" ignore_maskadjust = 0 - species_fit = list("Vox", "Vox Armalis") + species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Vox Armalis" = 'icons/mob/species/armalis/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) /obj/item/clothing/mask/breath/attack_self(var/mob/user) @@ -26,7 +28,7 @@ item_state = "medical" permeability_coefficient = 0.01 put_on_delay = 10 - species_fit = list("Vox") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") /obj/item/clothing/mask/breath/vox desc = "A weirdly-shaped breath mask." diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 3dec1a52609..5debb427f99 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -8,9 +8,12 @@ item_state = "gas_alt" gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 - species_fit = list("Vox") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/mask.dmi' + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) // **** Welding gas mask **** @@ -25,7 +28,6 @@ flash_protect = 2 tint = 2 armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - species_fit = list("Vox") origin_tech = "materials=2;engineering=2" action_button_name = "Toggle Welding Helmet" @@ -77,27 +79,23 @@ icon_state = "plaguedoctor" item_state = "gas_mask" armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 75, rad = 0) - species_fit = list("Vox") /obj/item/clothing/mask/gas/swat name = "\improper SWAT mask" desc = "A close-fitting tactical mask that can be connected to an air supply." icon_state = "swat" - species_fit = list("Vox") /obj/item/clothing/mask/gas/syndicate name = "syndicate mask" desc = "A close-fitting tactical mask that can be connected to an air supply." icon_state = "swat" strip_delay = 60 - species_fit = list("Vox") /obj/item/clothing/mask/gas/clown_hat name = "clown wig and mask" desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask." icon_state = "clown" item_state = "clown_hat" - species_fit = list("Vox") flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR /obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user) @@ -128,53 +126,45 @@ desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask." icon_state = "clown" item_state = "clown_hat" - species_fit = list("Vox") /obj/item/clothing/mask/gas/sexyclown name = "sexy-clown wig and mask" desc = "A feminine clown mask for the dabbling crossdressers or female entertainers." icon_state = "sexyclown" item_state = "sexyclown" - species_fit = list("Vox") /obj/item/clothing/mask/gas/mime name = "mime mask" desc = "The traditional mime's mask. It has an eerie facial posture." icon_state = "mime" item_state = "mime" - species_fit = list("Vox") /obj/item/clothing/mask/gas/monkeymask name = "monkey mask" desc = "A mask used when acting as a monkey." icon_state = "monkeymask" item_state = "monkeymask" - species_fit = list("Vox") /obj/item/clothing/mask/gas/sexymime name = "sexy mime mask" desc = "A traditional female mime's mask." icon_state = "sexymime" item_state = "sexymime" - species_fit = list("Vox") /obj/item/clothing/mask/gas/death_commando name = "Death Commando Mask" icon_state = "death_commando_mask" item_state = "death_commando_mask" - species_fit = list("Vox") /obj/item/clothing/mask/gas/cyborg name = "cyborg visor" desc = "Beep boop" icon_state = "death" - species_fit = list("Vox") /obj/item/clothing/mask/gas/owl_mask name = "owl mask" desc = "Twoooo!" icon_state = "owl" - species_fit = list("Vox") flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | NODROP var/cooldown = 0 action_button_name = "Hoot" @@ -207,10 +197,23 @@ var/aggressiveness = 2 var/safety = 1 ignore_maskadjust = 0 - species_fit = list() - species_fit = list("Vox") action_button_name = "HALT!" +/obj/item/clothing/mask/gas/sechailer/hos + name = "\improper HOS SWAT mask" + desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a tan stripe." + icon_state = "hosmask" + aggressiveness = 3 + ignore_maskadjust = 1 + +/obj/item/clothing/mask/gas/sechailer/warden + name = "\improper Warden SWAT mask" + desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a blue stripe." + icon_state = "wardenmask" + aggressiveness = 3 + ignore_maskadjust = 1 + + /obj/item/clothing/mask/gas/sechailer/swat name = "\improper SWAT mask" desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000." diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 64435727738..e9da678a45b 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -36,11 +36,15 @@ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0) action_button_name = "Adjust Sterile Mask" ignore_maskadjust = 0 - species_fit = list("Vox") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/mask.dmi' + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) + /obj/item/clothing/mask/surgical/attack_self(var/mob/user) adjustmask(user) @@ -49,9 +53,12 @@ desc = "moustache is totally real." icon_state = "fake-moustache" flags_inv = HIDEFACE - species_fit = list("Vox") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/mask.dmi' + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) /obj/item/clothing/mask/fakemoustache/verb/pontificate() @@ -175,9 +182,12 @@ ignore_maskadjust = 0 adjusted_flags = SLOT_HEAD icon_state = "bandbotany" - species_fit = list("Vox") + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/mask.dmi' + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) action_button_name = "Adjust Bandana" @@ -187,37 +197,30 @@ obj/item/clothing/mask/bandana/red name = "red bandana" icon_state = "bandred" - species_fit = list("Vox") obj/item/clothing/mask/bandana/blue name = "blue bandana" icon_state = "bandblue" - species_fit = list("Vox") obj/item/clothing/mask/bandana/gold name = "gold bandana" icon_state = "bandgold" - species_fit = list("Vox") obj/item/clothing/mask/bandana/green name = "green bandana" icon_state = "bandgreen" - species_fit = list("Vox") /obj/item/clothing/mask/bandana/botany name = "botany bandana" desc = "It's a green bandana with some fine nanotech lining." icon_state = "bandbotany" - species_fit = list("Vox") /obj/item/clothing/mask/bandana/skull name = "skull bandana" desc = "It's a black bandana with a skull pattern." icon_state = "bandskull" - species_fit = list("Vox") /obj/item/clothing/mask/bandana/black name = "black bandana" desc = "It's a black bandana." - icon_state = "bandblack" - species_fit = list("Vox") \ No newline at end of file + icon_state = "bandblack" \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 1dfe1b68fc5..ca4d59fbe6a 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -1,5 +1,5 @@ // PLASMEN SHIT -// CAN'T WEAR UNLESS YOU'RE A PINK SKELLINGTON +// CAN'T WEAR UNLESS YOU'RE A PINK SKELETON /obj/item/clothing/suit/space/eva/plasmaman name = "plasmaman suit" desc = "A special containment suit designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies." diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 23d2bcb7bdf..44bb65e9e10 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -57,13 +57,6 @@ else integrated_ai.get_rig_stats = 0 -/mob/living/Stat() - . = ..() - if(. && get_rig_stats) - var/obj/item/weapon/rig/rig = get_rig() - if(rig) - SetupStat(rig) - /obj/item/rig_module/ai_container/proc/update_verb_holder() if(!verb_holder) verb_holder = new(src) diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 183255ca635..6e19fab742c 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -225,13 +225,6 @@ /obj/item/rig_module/proc/accepts_item(var/obj/item/input_device) return 0 -/mob/living/carbon/human/Stat() - . = ..() - - if(. && istype(back,/obj/item/weapon/rig)) - var/obj/item/weapon/rig/R = back - SetupStat(R) - /mob/proc/SetupStat(var/obj/item/weapon/rig/R) if(R && (R.flags & NODROP) && R.installed_modules.len && statpanel("Hardsuit Modules")) var/cell_status = R.cell ? "[R.cell.charge]/[R.cell.maxcharge]" : "ERROR" diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 8b204b399a6..c36a3f3ecea 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -15,6 +15,12 @@ desc = "Strange-looking, red, hat-wear that most certainly belongs to a real magic user." icon_state = "redwizard" +/obj/item/clothing/head/wizard/black + name = "black wizard hat" + desc = "Strange-looking black hat-wear that most certainly belongs to a real skeleton. Spooky." + icon_state = "blackwizard" + + /obj/item/clothing/head/wizard/clown name = "purple wizard hat" desc = "Strange-looking purple hat-wear that most certainly belongs to a real magic user." @@ -66,6 +72,12 @@ icon_state = "redwizard" item_state = "redwizrobe" +/obj/item/clothing/suit/wizrobe/black + name = "black wizard robe" + desc = "An unnerving black gem-lined robe that reeks of death and decay." + icon_state = "blackwizard" + item_state = "blackwizrobe" + /obj/item/clothing/suit/wizrobe/clown name = "Clown Robe" desc = "A set of armoured robes that seem to radiate a dark power. That, and bad fashion decisions." diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index 1d5ac326517..d7877676b21 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -4,7 +4,7 @@ /datum/event/mass_hallucination/start() for(var/mob/living/carbon/human/H in living_mob_list) var/armor = H.getarmor(type = "rad") - if((H.species.flags & NO_DNA_RAD) || armor >= 75) // Leave DNA-less species/rad armored players completely unaffected + if((H.species.flags & RADIMMUNE) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected continue H.hallucination += rand(50, 100) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index b297f898feb..f798e9984d4 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -37,7 +37,7 @@ for(var/i = 0, i < 10, i++) for(var/mob/living/carbon/human/H in living_mob_list) 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 + if((H.species.flags & RADIMMUNE) || armor >= 100) // Leave radiation-immune species/fully rad armored players completely unaffected continue var/turf/T = get_turf(H) if(!T) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 2dbedafa353..896eb886060 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -145,6 +145,8 @@ /datum/seed/proc/do_sting(var/mob/living/carbon/human/target, var/obj/item/fruit, var/target_limb) if(!get_trait(TRAIT_STINGS)) return + if(!istype(target)) + return if(!target_limb) //if we weren't given a target_limb, pick a random one to try stinging target_limb = pick("l_foot","r_foot","l_leg","r_leg","l_hand","r_hand","l_arm", "r_arm","head","chest","groin") if(chems && chems.len) diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index 0f991a56bfc..fbdc534c4e4 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -20,6 +20,8 @@ /obj/effect/plant/Crossed(var/mob/living/victim) if(!is_mature()) return + if(!istype(victim)) + return var/target_limb = pick("r_foot","l_foot","r_leg","l_leg") if(ishuman(victim)) var/mob/living/carbon/human/H = victim diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 014c0623c84..90b568110b3 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -210,7 +210,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ..() statpanel("Status") if (client.statpanel == "Status") - stat(null, "Station Time: [worldtime2text()]") + show_stat_station_time() if(ticker) if(ticker.mode) //world << "DEBUG: ticker not null" @@ -218,10 +218,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //world << "DEBUG: malf mode ticker test" if(ticker.mode:malf_mode_declared) stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]") - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + show_stat_emergency_shuttle_eta() /mob/dead/observer/verb/reenter_corpse() set category = "Ghost" @@ -237,10 +234,17 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp usr << "Another consciousness is in your body...It is resisting you." return if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). - var/obj/effect/rune/R = locate() in mind.current.loc //whilst corpse is alive, we can only reenter the body if it's on the rune - if(!(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"])) //astral journeying rune + var/turf/T = get_turf(mind.current) + var/found_astral_rune = 0 + if(T) + for(var/obj/effect/rune/R in T.contents) //whilst corpse is alive, we can only reenter the body if it's on the rune + if(R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) //astral journeying rune + found_astral_rune = 1 + break + if(!found_astral_rune) usr << "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you." return + mind.current.ajourn=0 mind.current.key = key diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index f083a419713..a9597b7b470 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -182,10 +182,7 @@ //if (client.statpanel == "Status")//ORGANS // stat(null, "Plasma Stored: [getPlasma()]/[max_plasma]") - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + show_stat_emergency_shuttle_eta() /mob/living/carbon/alien/Stun(amount) if(status_flags & CANSTUN) diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 3fe57ec2acc..8e6da1eca78 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -83,12 +83,8 @@ I'm using this for Stat to give it a more nifty interface to work with ..() if(has_synthetic_assistance()) statpanel("Status") - stat(null, "Station Time: [worldtime2text()]") - - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + show_stat_station_time() + show_stat_emergency_shuttle_eta() if(client.statpanel == "Status") //Knowing how well-off your mech is doing is really important as an MMI diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 99b65376aa1..edf31db3577 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -26,6 +26,7 @@ qdel(guts) for(var/atom/movable/food in stomach_contents) qdel(food) + remove_from_all_data_huds() return ..() /mob/living/carbon/blob_act() diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 132965764c4..93b57850974 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -32,9 +32,19 @@ else //Everyone else fails, skip the emote attempt return if("squish") + var/found_slime_bodypart = 0 + if(species.name == "Slime People") //Only Slime People can squish - on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm - else //Everyone else fails, skip the emote attempt + on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm' + found_slime_bodypart = 1 + else + for(var/obj/item/organ/external/L in organs) // if your limbs are squishy you can squish too! + if(L.dna.species in list("Slime People")) + on_CD = handle_emote_CD() + found_slime_bodypart = 1 + break + + if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt return if("scream", "fart", "flip", "snap") on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1d864e8172e..5da1d072d4a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -95,9 +95,9 @@ h_style = "Bald" ..(new_loc, "Vox Armalis") -/mob/living/carbon/human/skellington/New(var/new_loc) +/mob/living/carbon/human/skeleton/New(var/new_loc) h_style = "Bald" - ..(new_loc, "Skellington") + ..(new_loc, "Skeleton") /mob/living/carbon/human/kidan/New(var/new_loc) ..(new_loc, "Kidan") @@ -252,15 +252,13 @@ stat(null, "Intent: [a_intent]") stat(null, "Move Mode: [m_intent]") - stat(null, "Station Time: [worldtime2text()]") + show_stat_station_time() if(ticker && ticker.mode && ticker.mode.name == "AI malfunction") if(ticker.mode:malf_mode_declared) stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]") - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + + show_stat_emergency_shuttle_eta() if(client.statpanel == "Status") if(locate(/obj/item/device/assembly/health) in src) @@ -384,33 +382,7 @@ if(prob(50) && !shielded) Paralyse(10) - var/update = 0 - var/weapon_message = "Explosive Blast" - for(var/obj/item/organ/external/temp in organs) - switch(temp.limb_name) - if("head") - update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message) - if("chest") - update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message) - if("groin") - update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message) - if("l_arm") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) - if("r_arm") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) - if("l_leg") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) - if("r_leg") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) - if("r_foot") - update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message) - if("l_foot") - update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message) - if("r_hand") - update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message) - if("l_hand") - update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message) - if(update) UpdateDamageIcon() + take_overall_damage(b_loss,f_loss, used_weapon = "Explosive Blast") ..() @@ -1504,6 +1476,10 @@ maxHealth = species.total_health + toxins_alert = 0 + oxygen_alert = 0 + fire_alert = 0 + if(species.language) add_language(species.language) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 9efca385489..293a4fe2903 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -142,7 +142,7 @@ /mob/living/carbon/human/adjustCloneLoss(var/amount) ..() - if(species.flags & (NO_DNA_RAD)) + if(species.flags & (NO_DNA)) cloneloss = 0 return diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index c22740efe95..d7b6301a61d 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -17,6 +17,9 @@ has_organ = list( "brain" = /obj/item/organ/internal/brain/golem ) + suicide_messages = list( + "is crumbling into dust!", + "is smashing their body apart!") /datum/species/golem/handle_post_spawn(var/mob/living/carbon/human/H) if(H.mind) diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index 7b7bf1c8096..f0e724f0f10 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -20,6 +20,11 @@ bodyflags = FEET_NOSLIP dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race reagent_tag = PROCESS_ORG + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is staring into the closest light source!") /datum/species/shadow/handle_death(var/mob/living/carbon/human/H) H.dust() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm new file mode 100644 index 00000000000..7c813b4b1be --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/skeleton.dm @@ -0,0 +1,38 @@ +/datum/species/skeleton + name = "Skeleton" + name_plural = "Skeletons" + + blurb = "Spoopy and scary." + + icobase = 'icons/mob/human_races/r_skeleton.dmi' + deform = 'icons/mob/human_races/r_skeleton.dmi' + path = /mob/living/carbon/human/skeleton + default_language = "Galactic Common" + unarmed_type = /datum/unarmed_attack/punch + + blood_color = "#FFFFFF" + flesh_color = "#E6E6C6" + + flags = NO_BREATHE | NO_BLOOD | RADIMMUNE + virus_immune = 1 //why is this a var and not a flag? + dietflags = DIET_OMNI + reagent_tag = PROCESS_ORG + + warning_low_pressure = -1 + hazard_low_pressure = -1 + hazard_high_pressure = 999999999 + warning_high_pressure = 999999999 + + cold_level_1 = -1 + cold_level_2 = -1 + cold_level_3 = -1 + + heat_level_1 = 999999999 + heat_level_2 = 999999999 + heat_level_3 = 999999999 + heat_level_3_breathe = 999999999 + + suicide_messages = list( + "is snapping their own bones!", + "is collapsing into a pile!", + "is twisting their skull off!") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index e532d0acc1d..decbf8975a5 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -88,6 +88,11 @@ //Death vars. var/death_message = "seizes up and falls limp, their eyes dead and lifeless..." + var/list/suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their thumbs into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") // Language/culture vars. var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers. diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 631e78f3234..43afd4e1e77 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -55,6 +55,12 @@ flesh_color = "#34AF10" reagent_tag = PROCESS_ORG base_color = "#066000" + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") /datum/species/unathi/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) @@ -100,6 +106,12 @@ reagent_tag = PROCESS_ORG flesh_color = "#AFA59E" base_color = "#333333" + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") /datum/species/tajaran/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) @@ -135,6 +147,12 @@ reagent_tag = PROCESS_ORG flesh_color = "#966464" base_color = "#B43214" + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") /datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) @@ -206,6 +224,13 @@ flesh_color = "#808D11" reagent_tag = PROCESS_ORG + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!", + "is deeply inhaling oxygen!") /datum/species/vox/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) @@ -292,6 +317,13 @@ "eyes" = /obj/item/organ/internal/eyes, "stack" = /obj/item/organ/internal/stack/vox ) + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!", + "is huffing oxygen!") /datum/species/kidan name = "Kidan" @@ -311,6 +343,12 @@ dietflags = DIET_HERB blood_color = "#FB9800" reagent_tag = PROCESS_ORG + + suicide_messages = list( + "is attempting to bite their antenna off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") /datum/species/slime name = "Slime People" @@ -333,6 +371,10 @@ has_organ = list( "brain" = /obj/item/organ/internal/brain/slime ) + + suicide_messages = list( + "is melting into a puddle!", + "is turning a dull, brown color and melting into a puddle!") /datum/species/grey name = "Grey" @@ -433,6 +475,10 @@ "l_foot" = list("path" = /obj/item/organ/external/diona/foot), "r_foot" = list("path" = /obj/item/organ/external/diona/foot/right) ) + + suicide_messages = list( + "is losing branches!", + "is pulling themselves apart!") /datum/species/diona/can_understand(var/mob/other) var/mob/living/simple_animal/diona/D = other @@ -496,7 +542,7 @@ passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment. - flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD | NO_POISON + flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE clothing_flags = HAS_SOCKS bodyflags = HAS_SKIN_COLOR dietflags = 0 //IPCs can't eat, so no diet @@ -526,6 +572,12 @@ "l_foot" = list("path" = /obj/item/organ/external/foot/ipc), "r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc) ) + + suicide_messages = list( + "is powering down!", + "is smashing their own monitor!", + "is twisting their own neck!", + "is blocking their ventilation port!") /datum/species/machine/handle_death(var/mob/living/carbon/human/H) H.h_style = "" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 5a77a7a51c4..58c6cb3b650 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -330,6 +330,8 @@ var/global/list/damage_icon_parts = list() stand_icon.Blend(base_icon,ICON_OVERLAY) if(src.species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs... overlays_standing[LIMBS_LAYER] = image(stand_icon) // Diverts limbs to their own layer so they can overlay things (i.e. tails). + else + overlays_standing[LIMBS_LAYER] = null // So we don't get the old species' sprite splatted on top of the new one's //Underwear overlays_standing[UNDERWEAR_LAYER] = null diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 999ebacb58d..a19572f67a2 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -78,7 +78,7 @@ return 1 /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)) + if((effecttype == IRRADIATE) && (species.flags & RADIMMUNE)) return 0 return ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9931ce04305..a1e9496080d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -2,6 +2,13 @@ /mob/living/Destroy() ..() return QDEL_HINT_HARDDEL_NOW + +/mob/living/Stat() + . = ..() + if(. && get_rig_stats) + var/obj/item/weapon/rig/rig = get_rig() + if(rig) + SetupStat(rig) //mob verbs are a lot faster than object verbs //for more info on why this is not atom/pull, see examinate() in mob.dm diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 83f12db46dd..f1f5f7862b3 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -142,25 +142,11 @@ return 0 -// this function displays the station time in the status panel -/mob/living/silicon/proc/show_station_time() - stat(null, "Station Time: [worldtime2text()]") - - -// this function displays the shuttles ETA in the status panel if the shuttle has been called -/mob/living/silicon/proc/show_emergency_shuttle_eta() - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") - - - // This adds the basic clock, shuttle recall timer, and malf_ai info to all silicon lifeforms /mob/living/silicon/Stat() if(statpanel("Status")) - show_station_time() - show_emergency_shuttle_eta() + show_stat_station_time() + show_stat_emergency_shuttle_eta() show_system_integrity() show_malf_ai() ..() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index e91719c5915..6c4986541a6 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -258,7 +258,7 @@ if(spawnees & 128) C = new(src.loc) C.name = "Drone plasma overcharge counter" - C.origin_tech = "plasma=[rand(3,6)]" + C.origin_tech = "plasmatech=[rand(3,6)]" if(spawnees & 256) C = new(src.loc) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 623905c75e7..e1b2ce1477d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -990,6 +990,36 @@ var/list/slot_equipment_priority = list( \ statpanel("Status") // Switch to the Status panel again, for the sake of the lazy Stat procs +// this function displays the station time in the status panel +/mob/proc/show_stat_station_time() + stat(null, "Station Time: [worldtime2text()]") + +// this function displays the shuttles ETA in the status panel if the shuttle has been called +/mob/proc/show_stat_emergency_shuttle_eta() + var/obj/docking_port/mobile/emergency/E = shuttle_master.emergency + + if(E.mode >= SHUTTLE_RECALL) + var/message = "" + + var/timeleft = E.timeLeft() + message = "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" + + switch(E.mode) + if(SHUTTLE_RECALL, SHUTTLE_ESCAPE) + message = "ETR-[message]" + if(SHUTTLE_CALL) + message = "ETA-[message]" + if(SHUTTLE_DOCKED) + if(timeleft < 5) + message = "Departing..." + else + message = "ETD-[message]" + if(SHUTTLE_STRANDED) + message = "ETA-ERR" + if(SHUTTLE_ENDGAME) + return + + stat(null, message) /mob/proc/add_stings_to_statpanel(var/list/stings) for(var/obj/effect/proc_holder/changeling/S in stings) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index ce2a34259ea..4643974d0eb 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -64,7 +64,7 @@ name = "Bald" icon_state = "bald" gender = MALE - species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skellington") + species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skeleton") short name = "Short Hair" // try to capatilize the names please~ @@ -1069,7 +1069,7 @@ /datum/sprite_accessory/underwear icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skellington") + species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skeleton") nude name = "Nude" @@ -1217,7 +1217,7 @@ /datum/sprite_accessory/undershirt icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skellington") + species_allowed = list("Human","Unathi","Vox","Diona","Vulpkanin","Kidan","Grey","Plasmaman","Skeleton") /datum/sprite_accessory/undershirt/nude name = "Nude" @@ -1503,13 +1503,13 @@ /////////////////////// /datum/sprite_accessory/socks icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington") + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton") /datum/sprite_accessory/socks/nude name = "Nude" icon_state = null gender = NEUTER - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington","Vox") + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton","Vox") /datum/sprite_accessory/socks/white_norm @@ -1681,7 +1681,7 @@ /datum/sprite_accessory/head_accessory/none name = "None" - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington","Vox") + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton","Vox") icon_state = "accessory_none" /datum/sprite_accessory/head_accessory/simple @@ -1773,7 +1773,7 @@ /datum/sprite_accessory/body_markings/none name = "None" - species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington","Vox") + species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skeleton","Vox") icon_state = "accessory_none" /datum/sprite_accessory/body_markings/stripe diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm index ae999cbcf03..bd5ba3ee0c8 100644 --- a/code/modules/nano/interaction/default.dm +++ b/code/modules/nano/interaction/default.dm @@ -30,21 +30,6 @@ return STATUS_INTERACTIVE // interactive (green visibility) return STATUS_DISABLED // no updates, completely disabled (red visibility) -/mob/living/silicon/robot/syndicate/default_can_use_topic(var/src_object) - . = ..() - if(. != STATUS_INTERACTIVE) - return - - if(z in config.admin_levels) // Syndicate borgs can interact with everything on the admin level - return STATUS_INTERACTIVE - if(istype(get_area(src), /area/syndicate_station)) // If elsewhere, they can interact with everything on the syndicate shuttle - return STATUS_INTERACTIVE - if(istype(src_object, /obj/machinery)) // Otherwise they can only interact with emagged machinery - var/obj/machinery/Machine = src_object - if(Machine.emagged) - return STATUS_INTERACTIVE - return STATUS_UPDATE - /mob/living/silicon/ai/default_can_use_topic(var/src_object) . = shared_nano_interaction() if(. != STATUS_INTERACTIVE) diff --git a/code/modules/ninja/suit/mask.dm b/code/modules/ninja/suit/mask.dm index 4db00b78091..910ccbc953c 100644 --- a/code/modules/ninja/suit/mask.dm +++ b/code/modules/ninja/suit/mask.dm @@ -11,4 +11,11 @@ Contents: desc = "A close-fitting mask that acts both as an air filter and a post-modern fashion statement." icon_state = "s-ninja(norm)" item_state = "s-ninja_mask" - unacidable = 1 \ No newline at end of file + unacidable = 1 + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' + ) diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index d73f7ffee1a..8e057695b3a 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -125,6 +125,38 @@ ..(user) user << "The bolt is [bolt_open ? "open" : "closed"]." +/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted + name = "enchanted bolt action rifle" + desc = "Careful not to lose your head." + var/guns_left = 30 + mag_type = "/obj/item/ammo_box/magazine/internal/boltaction/enchanted" + +/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/New() + ..() + bolt_open = 1 + pump() + +/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/dropped() + guns_left = 0 + +/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/Fire(atom/target as mob|obj|turf|area, mob/living/carbon/user as mob|obj, params, reflex = 0) + ..() + if(guns_left) + var/obj/item/weapon/gun/projectile/shotgun/boltaction/enchanted/GUN = new + GUN.guns_left = src.guns_left - 1 + user.drop_item() + user.swap_hand() + user.put_in_hands(GUN) + else + user.drop_item() + spawn(0) + throw_at(pick(oview(7,get_turf(user))),1,1) + user.visible_message("[user] tosses aside the spent rifle!") + + +/obj/item/ammo_box/magazine/internal/boltaction/enchanted + max_ammo =1 + ///////////////////////////// // DOUBLE BARRELED SHOTGUN // ///////////////////////////// diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm index f4ed6c222ef..726916c9d4c 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -36,7 +36,8 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species && (H.species.name == "Skrell" || H.species.name =="Neara")) //Skrell and Neara get very drunk very quickly. + var/obj/item/organ/liver/L = H.internal_organs_by_name["liver"] + if(!L || (istype(L) && L.dna.species in list("Skrell", "Neara"))) d*=5 M.dizziness += dizzy_adj. diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 09bde9c9fe2..67d7ca2b2fb 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -357,34 +357,4 @@ datum/design/AAC req_tech = list("programming" = 4, "magnets" = 2) build_type = IMPRINTER materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/atmos_automation - - -//Shield Generators// - -/datum/design/shield_gen_ex - name = "Circuit Design (Experimental hull shield generator)" - desc = "Allows for the construction of circuit boards used to build an experimental hull shield generator." - id = "shield_gen_ex" - req_tech = list("bluespace" = 4, "plasmatech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 2000, "sacid" = 20, MAT_DIAMOND = 10000, MAT_GOLD = 10000) - build_path = /obj/item/weapon/circuitboard/shield_gen_ex - -/datum/design/shield_gen - name = "Circuit Design (Experimental shield generator)" - desc = "Allows for the construction of circuit boards used to build an experimental shield generator." - id = "shield_gen" - req_tech = list("bluespace" = 4, "plasmatech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 2000, "sacid" = 20, MAT_DIAMOND = 10000, MAT_GOLD = 10000) - build_path = /obj/item/weapon/circuitboard/shield_gen - -/datum/design/shield_cap - name = "Circuit Design (Experimental shield capacitor)" - desc = "Allows for the construction of circuit boards used to build an experimental shielding capacitor." - id = "shield_cap" - req_tech = list("magnets" = 3, "powerstorage" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 2000, "sacid" = 20, MAT_DIAMOND = 10000, MAT_GOLD = 10000) - build_path = /obj/item/weapon/circuitboard/shield_cap \ No newline at end of file + build_path = /obj/item/weapon/circuitboard/atmos_automation \ No newline at end of file diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_forcefield.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_forcefield.dm deleted file mode 100644 index 82848156023..00000000000 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_forcefield.dm +++ /dev/null @@ -1,80 +0,0 @@ - -/datum/artifact_effect/forcefield - effecttype = "forcefield" - var/list/created_field = list() - effect_type = 4 - -/datum/artifact_effect/forcefield/New() - ..() - trigger = TRIGGER_TOUCH - -/datum/artifact_effect/forcefield/ToggleActivate() - ..() - if(created_field.len) - for(var/obj/effect/energy_field/F in created_field) - created_field.Remove(F) - qdel(F) - else if(holder) - var/turf/T = get_turf(holder) - while(created_field.len < 16) - var/obj/effect/energy_field/E = new (locate(T.x,T.y,T.z)) - created_field.Add(E) - E.strength = 1 - E.density = 1 - E.anchored = 1 - E.invisibility = 0 - spawn(10) - UpdateMove() - return 1 - -/datum/artifact_effect/forcefield/process() - ..() - for(var/obj/effect/energy_field/E in created_field) - if(E.strength < 1) - E.Strengthen(0.15) - else if(E.strength < 5) - E.Strengthen(0.25) - -/datum/artifact_effect/forcefield/UpdateMove() - if(created_field.len && holder) - var/turf/T = get_turf(holder) - while(created_field.len < 16) - //for now, just instantly respawn the fields when they get destroyed - var/obj/effect/energy_field/E = new (locate(T.x,T.y,T)) - created_field.Add(E) - E.anchored = 1 - E.density = 1 - E.invisibility = 0 - - var/obj/effect/energy_field/E = created_field[1] - E.loc = locate(T.x + 2,T.y + 2,T.z) - E = created_field[2] - E.loc = locate(T.x + 2,T.y + 1,T.z) - E = created_field[3] - E.loc = locate(T.x + 2,T.y,T.z) - E = created_field[4] - E.loc = locate(T.x + 2,T.y - 1,T.z) - E = created_field[5] - E.loc = locate(T.x + 2,T.y - 2,T.z) - E = created_field[6] - E.loc = locate(T.x + 1,T.y + 2,T.z) - E = created_field[7] - E.loc = locate(T.x + 1,T.y - 2,T.z) - E = created_field[8] - E.loc = locate(T.x,T.y + 2,T.z) - E = created_field[9] - E.loc = locate(T.x,T.y - 2,T.z) - E = created_field[10] - E.loc = locate(T.x - 1,T.y + 2,T.z) - E = created_field[11] - E.loc = locate(T.x - 1,T.y - 2,T.z) - E = created_field[12] - E.loc = locate(T.x - 2,T.y + 2,T.z) - E = created_field[13] - E.loc = locate(T.x - 2,T.y + 1,T.z) - E = created_field[14] - E.loc = locate(T.x - 2,T.y,T.z) - E = created_field[15] - E.loc = locate(T.x - 2,T.y - 1,T.z) - E = created_field[16] - E.loc = locate(T.x - 2,T.y - 2,T.z) diff --git a/code/modules/shieldgen/circuits_and_designs.dm b/code/modules/shieldgen/circuits_and_designs.dm deleted file mode 100644 index ad4740d65fa..00000000000 --- a/code/modules/shieldgen/circuits_and_designs.dm +++ /dev/null @@ -1,51 +0,0 @@ - -//////////////////////////////////////// -// External Shield Generator - -/obj/item/weapon/circuitboard/shield_gen_ex - name = "Circuit board (Experimental hull shield generator)" - board_type = "machine" - build_path = "/obj/machinery/shield_gen/external" - origin_tech = "bluespace=4;plasmatech=3" - frame_desc = "Requires 2 Pico Manipulators, 1 Subspace Transmitter, 5 Pieces of cable, 1 Subspace Crystal, 1 Subspace Amplifier and 1 Console Screen." - req_components = list( - "/obj/item/weapon/stock_parts/manipulator/pico" = 2, - "/obj/item/weapon/stock_parts/subspace/transmitter" = 1, - "/obj/item/weapon/stock_parts/subspace/crystal" = 1, - "/obj/item/weapon/stock_parts/subspace/amplifier" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 1, - "/obj/item/stack/cable_coil" = 5) - -//////////////////////////////////////// -// Shield Generator - -/obj/item/weapon/circuitboard/shield_gen - name = "Circuit board (Experimental shield generator)" - board_type = "machine" - build_path = "/obj/machinery/shield_gen/external" - origin_tech = "bluespace=4;plasmatech=3" - frame_desc = "Requires 2 Pico Manipulators, 1 Subspace Transmitter, 5 Pieces of cable, 1 Subspace Crystal, 1 Subspace Amplifier and 1 Console Screen." - req_components = list( - "/obj/item/weapon/stock_parts/manipulator/pico" = 2, - "/obj/item/weapon/stock_parts/subspace/transmitter" = 1, - "/obj/item/weapon/stock_parts/subspace/crystal" = 1, - "/obj/item/weapon/stock_parts/subspace/amplifier" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 1, - "/obj/item/stack/cable_coil" = 5) - -//////////////////////////////////////// -// Shield Capacitor - -/obj/item/weapon/circuitboard/shield_cap - name = "Circuit board (Experimental shield capacitor)" - board_type = "machine" - build_path = "/obj/machinery/shield_capacitor" - origin_tech = "magnets=3;powerstorage=4" - frame_desc = "Requires 2 Pico Manipulators, 1 Subspace Filter, 5 Pieces of cable, 1 Subspace Treatment disk, 1 Subspace Analyzer and 1 Console Screen." - req_components = list( - "/obj/item/weapon/stock_parts/manipulator/pico" = 2, - "/obj/item/weapon/stock_parts/subspace/filter" = 1, - "/obj/item/weapon/stock_parts/subspace/treatment" = 1, - "/obj/item/weapon/stock_parts/subspace/analyzer" = 1, - "/obj/item/weapon/stock_parts/console_screen" = 1, - "/obj/item/stack/cable_coil" = 5) diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm deleted file mode 100644 index 8eaa0b168b8..00000000000 --- a/code/modules/shieldgen/energy_field.dm +++ /dev/null @@ -1,50 +0,0 @@ - -//---------- actual energy field - -/obj/effect/energy_field - name = "energy field" - desc = "Impenetrable field of energy, capable of blocking anything as long as it's active." - icon = 'code/modules/shieldgen/shielding.dmi' - icon_state = "shieldsparkles" - anchored = 1 - layer = 4.1 //just above mobs - density = 0 - invisibility = 101 - var/strength = 0 - -/obj/effect/energy_field/ex_act(var/severity) - Stress(0.5 + severity) - -/obj/effect/energy_field/bullet_act(var/obj/item/projectile/Proj) - Stress(Proj.damage / 10) - -/obj/effect/energy_field/proc/Stress(var/severity) - strength -= severity - - //if we take too much damage, drop out - the generator will bring us back up if we have enough power - if(strength < 1) - invisibility = 101 - density = 0 - else if(strength >= 1) - invisibility = 0 - density = 1 - -/obj/effect/energy_field/proc/Strengthen(var/severity) - strength += severity - - //if we take too much damage, drop out - the generator will bring us back up if we have enough power - if(strength >= 1) - invisibility = 0 - density = 1 - else if(strength < 1) - invisibility = 101 - density = 0 - -/obj/effect/energy_field/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0) - //Purpose: Determines if the object (or airflow) can pass this atom. - //Called by: Movement, airflow. - //Inputs: The moving atom (optional), target turf, "height" and air group - //Outputs: Boolean if can pass. - - //return (!density || !height || air_group) - return !density diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm deleted file mode 100644 index a63802e458c..00000000000 --- a/code/modules/shieldgen/shield_capacitor.dm +++ /dev/null @@ -1,168 +0,0 @@ - -//---------- shield capacitor -//pulls energy out of a power net and charges an adjacent generator - -/obj/machinery/shield_capacitor - name = "shield capacitor" - desc = "Machine that charges a shield generator." - icon = 'code/modules/shieldgen/shielding.dmi' - icon_state = "capacitor" - var/active = 1 - density = 1 - anchored = 1 - var/stored_charge = 0 - var/time_since_fail = 100 - var/max_charge = 1000000 - var/max_charge_rate = 100000 - var/min_charge_rate = 0 - var/locked = 0 - // - use_power = 1 //0 use nothing - //1 use idle power - //2 use active power - idle_power_usage = 10 - active_power_usage = 100 - var/charge_rate = 100 - -/obj/machinery/shield_capacitor/New() - spawn(10) - for(var/obj/machinery/shield_gen/possible_gen in range(1, src)) - if(get_dir(src, possible_gen) == src.dir) - possible_gen.owned_capacitor = src - break - ..() - -/obj/machinery/shield_capacitor/attackby(obj/item/W, mob/user, params) - - if(istype(W, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/C = W - if(access_captain in C.access || access_security in C.access || access_engine in C.access) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" - updateDialog() - else - user << "\red Access denied." - else if(istype(W, /obj/item/weapon/card/emag)) - if(prob(75)) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" - updateDialog() - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - - else if(istype(W, /obj/item/weapon/wrench)) - src.anchored = !src.anchored - src.visible_message("\blue \icon[src] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].") - - spawn(0) - for(var/obj/machinery/shield_gen/gen in range(1, src)) - if(get_dir(src, gen) == src.dir) - if(!src.anchored && gen.owned_capacitor == src) - gen.owned_capacitor = null - break - else if(src.anchored && !gen.owned_capacitor) - gen.owned_capacitor = src - break - gen.updateDialog() - updateDialog() - else - ..() - -/obj/machinery/shield_capacitor/attack_ai(user as mob) - return src.attack_hand(user) - -/obj/machinery/shield_capacitor/attack_hand(mob/user) - if(stat & (NOPOWER|BROKEN)) - return - interact(user) - -/obj/machinery/shield_capacitor/interact(mob/user) - if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) ) - if (!istype(user, /mob/living/silicon)) - user.unset_machine() - user << browse(null, "window=shield_capacitor") - return - var/t = "Shield Capacitor Control Console

    " - if(locked) - t += "Swipe your ID card to begin." - else - t += "This capacitor is: [active ? "Online" : "Offline" ] [active ? "\[Deactivate\]" : "\[Activate\]"]
    " - t += "[time_since_fail > 2 ? "Charging stable." : "Warning, low charge!"]
    " - t += "Charge: [stored_charge] Watts ([100 * stored_charge/max_charge]%)
    " - t += "Charge rate: \ - \[min\] \ - \[--\] \ - \[-\][charge_rate] Watts/sec \ - \[+\] \ - \[++\] \ - \[max\]
    " - t += "
    " - t += "Refresh " - t += "Close
    " - - user << browse(t, "window=shield_capacitor;size=500x800") - user.set_machine(src) - -/obj/machinery/shield_capacitor/process() - // - if(active) - use_power = 2 - if(stored_charge + charge_rate > max_charge) - active_power_usage = max_charge - stored_charge - else - active_power_usage = charge_rate - stored_charge += active_power_usage - else - use_power = 1 - - time_since_fail++ - if(stored_charge < active_power_usage * 1.5) - time_since_fail = 0 - -/obj/machinery/shield_capacitor/Topic(href, href_list[]) - ..() - if( href_list["close"] ) - usr << browse(null, "window=shield_capacitor") - usr.unset_machine() - return - if( href_list["toggle"] ) - active = !active - if(active) - use_power = 2 - else - use_power = 1 - if( href_list["charge_rate"] ) - charge_rate += text2num(href_list["charge_rate"]) - if(charge_rate > max_charge_rate) - charge_rate = max_charge_rate - else if(charge_rate < min_charge_rate) - charge_rate = min_charge_rate - // - updateDialog() - -/obj/machinery/shield_capacitor/power_change() - if(stat & BROKEN) - icon_state = "broke" - else - if( powered() ) - if (src.active) - icon_state = "capacitor" - else - icon_state = "capacitor" - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - src.icon_state = "capacitor" - stat |= NOPOWER - -/obj/machinery/shield_capacitor/verb/rotate() - set name = "Rotate capacitor clockwise" - set category = "Object" - set src in oview(1) - - if (src.anchored) - usr << "It is fastened to the floor!" - return - src.dir = turn(src.dir, 270) - return diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm deleted file mode 100644 index 51be7d4519b..00000000000 --- a/code/modules/shieldgen/shield_gen.dm +++ /dev/null @@ -1,280 +0,0 @@ -//renwicks: fictional unit to describe shield strength -//a small meteor hit will deduct 1 renwick of strength from that shield tile -//light explosion range will do 1 renwick's damage -//medium explosion range will do 2 renwick's damage -//heavy explosion range will do 3 renwick's damage -//explosion damage is cumulative. if a tile is in range of light, medium and heavy damage, it will take a hit from all three - -/obj/machinery/shield_gen - name = "shield generator" - desc = "Machine that generates an impenetrable field of energy when activated." - icon = 'code/modules/shieldgen/shielding.dmi' - icon_state = "generator0" - var/active = 0 - var/field_radius = 3 - var/list/field - density = 1 - anchored = 1 - var/locked = 0 - var/average_field_strength = 0 - var/strengthen_rate = 0.2 - var/max_strengthen_rate = 0.2 - var/powered = 0 - var/check_powered = 1 - var/obj/machinery/shield_capacitor/owned_capacitor - var/max_field_strength = 10 - var/time_since_fail = 100 - var/energy_conversion_rate = 0.01 //how many renwicks per watt? - // - use_power = 1 //0 use nothing - //1 use idle power - //2 use active power - idle_power_usage = 20 - active_power_usage = 100 - -/obj/machinery/shield_gen/New() - spawn(10) - for(var/obj/machinery/shield_capacitor/possible_cap in range(1, src)) - if(get_dir(possible_cap, src) == possible_cap.dir) - owned_capacitor = possible_cap - break - field = new/list() - ..() - -/obj/machinery/shield_gen/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/C = W - if(access_captain in C.access || access_security in C.access || access_engine in C.access) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" - updateDialog() - else - user << "\red Access denied." - else if(istype(W, /obj/item/weapon/card/emag)) - if(prob(75)) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" - updateDialog() - var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - - else if(istype(W, /obj/item/weapon/wrench)) - src.anchored = !src.anchored - src.visible_message("\blue \icon[src] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].") - - spawn(0) - for(var/obj/machinery/shield_gen/gen in range(1, src)) - if(get_dir(src, gen) == src.dir) - if(!src.anchored && gen.owned_capacitor == src) - gen.owned_capacitor = null - break - else if(src.anchored && !gen.owned_capacitor) - gen.owned_capacitor = src - break - gen.updateDialog() - updateDialog() - else - ..() - -/obj/machinery/shield_gen/attack_ai(user as mob) - return src.attack_hand(user) - -/obj/machinery/shield_gen/attack_hand(mob/user) - if(stat & (NOPOWER|BROKEN)) - return - interact(user) - -/obj/machinery/shield_gen/interact(mob/user) - if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) ) - if (!istype(user, /mob/living/silicon)) - user.unset_machine() - user << browse(null, "window=shield_generator") - return - var/t = "Shield Generator Control Console

    " - if(locked) - t += "Swipe your ID card to begin." - else - t += "[owned_capacitor ? "Charge capacitor connected." : "Unable to locate charge capacitor!"]
    " - t += "This generator is: [active ? "Online" : "Offline" ] [active ? "\[Deactivate\]" : "\[Activate\]"]
    " - t += "[time_since_fail > 2 ? "Field is stable." : "Warning, field is unstable!"]
    " - t += "Coverage radius (restart required): \ - -- \ - - \ - [field_radius * 2]m \ - + \ - ++
    " - t += "Overall field strength: [average_field_strength] Renwicks ([max_field_strength ? 100 * average_field_strength / max_field_strength : "NA"]%)
    " - t += "Charge rate: -- \ - - \ - [strengthen_rate] Renwicks/sec \ - + \ - ++
    " - t += "Upkeep energy: [field.len * average_field_strength / energy_conversion_rate] Watts/sec
    " - t += "Additional energy required to charge: [field.len * strengthen_rate / energy_conversion_rate] Watts/sec
    " - t += "Maximum field strength: \ - \[min\] \ - -- \ - - \ - [max_field_strength] Renwicks \ - + \ - ++ \ - \[max\]
    " - t += "
    " - t += "Refresh " - t += "Close
    " - user << browse(t, "window=shield_generator;size=500x800") - user.set_machine(src) - -/obj/machinery/shield_gen/process() - - if(active && field.len) - var/stored_renwicks = 0 - var/target_field_strength = min(strengthen_rate + max(average_field_strength, 0), max_field_strength) - if(owned_capacitor) - var/required_energy = field.len * target_field_strength / energy_conversion_rate - var/assumed_charge = min(owned_capacitor.stored_charge, required_energy) - stored_renwicks = assumed_charge * energy_conversion_rate - owned_capacitor.stored_charge -= assumed_charge - - time_since_fail++ - - average_field_strength = 0 - target_field_strength = stored_renwicks / field.len - - for(var/obj/effect/energy_field/E in field) - if(stored_renwicks) - var/strength_change = target_field_strength - E.strength - if(strength_change > stored_renwicks) - strength_change = stored_renwicks - if(E.strength < 0) - E.strength = 0 - else - E.Strengthen(strength_change) - - stored_renwicks -= strength_change - - average_field_strength += E.strength - else - E.Strengthen(-E.strength) - - average_field_strength /= field.len - if(average_field_strength < 0) - time_since_fail = 0 - else - average_field_strength = 0 - -/obj/machinery/shield_gen/Topic(href, href_list[]) - ..() - if( href_list["close"] ) - usr << browse(null, "window=shield_generator") - usr.unset_machine() - return - else if( href_list["toggle"] ) - toggle() - else if( href_list["change_radius"] ) - field_radius += text2num(href_list["change_radius"]) - if(field_radius > 200) - field_radius = 200 - else if(field_radius < 0) - field_radius = 0 - else if( href_list["strengthen_rate"] ) - strengthen_rate += text2num(href_list["strengthen_rate"]) - if(strengthen_rate > 1) - strengthen_rate = 1 - else if(strengthen_rate < 0) - strengthen_rate = 0 - else if( href_list["max_field_strength"] ) - max_field_strength += text2num(href_list["max_field_strength"]) - if(max_field_strength > 1000) - max_field_strength = 1000 - else if(max_field_strength < 0) - max_field_strength = 0 - // - updateDialog() - -/obj/machinery/shield_gen/power_change() - if(stat & BROKEN) - icon_state = "broke" - else - if( powered() ) - if (src.active) - icon_state = "generator1" - else - icon_state = "generator0" - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - src.icon_state = "generator0" - stat |= NOPOWER - if (src.active) - toggle() - -/obj/machinery/shield_gen/ex_act(var/severity) - - if(active) - toggle() - return ..() - -/* -/obj/machinery/shield_gen/proc/check_powered() - check_powered = 1 - if(!anchored) - powered = 0 - return 0 - var/turf/T = src.loc - var/obj/structure/cable/C = T.get_cable_node() - var/net - if (C) - net = C.netnum // find the powernet of the connected cable - - if(!net) - powered = 0 - return 0 - var/datum/powernet/PN = powernets[net] // find the powernet. Magic code, voodoo code. - - if(!PN) - powered = 0 - return 0 - var/surplus = max(PN.avail-PN.load, 0) - var/shieldload = min(rand(50,200), surplus) - if(shieldload==0 && !storedpower) // no cable or no power, and no power stored - powered = 0 - return 0 - else - powered = 1 - if(PN) - storedpower += shieldload - PN.load += shieldload //uses powernet power. - */ - -/obj/machinery/shield_gen/proc/toggle() - active = !active - power_change() - if(active) - var/list/covered_turfs = get_shielded_turfs() - var/turf/T = get_turf(src) - if(T in covered_turfs) - covered_turfs.Remove(T) - for(var/turf/O in covered_turfs) - var/obj/effect/energy_field/E = new(O) - field.Add(E) - qdel(covered_turfs) - - for(var/mob/M in view(5,src)) - M << "\icon[src] You hear heavy droning start up." - else - for(var/obj/effect/energy_field/D in field) - field.Remove(D) - qdel(D) - - for(var/mob/M in view(5,src)) - M << "\icon[src] You hear heavy droning fade out." - -//grab the border tiles in a circle around this machine -/obj/machinery/shield_gen/proc/get_shielded_turfs() - var/list/out = list() - for(var/turf/T in range(field_radius, src)) - if(get_dist(src,T) == field_radius) - out.Add(T) - return out diff --git a/code/modules/shieldgen/shield_gen_external.dm b/code/modules/shieldgen/shield_gen_external.dm deleted file mode 100644 index f239dc9dac0..00000000000 --- a/code/modules/shieldgen/shield_gen_external.dm +++ /dev/null @@ -1,42 +0,0 @@ - -//---------- external shield generator -//generates an energy field that loops around any built up area in space (is useless inside) halts movement and airflow, is blocked by walls, windows, airlocks etc - -/obj/machinery/shield_gen/external/New() - ..() - -/obj/machinery/shield_gen/external/get_shielded_turfs() - var - list - open = list(get_turf(src)) - closed = list() - - while(open.len) - for(var/turf/T in open) - for(var/turf/O in orange(1, T)) - if(get_dist(O,src) > field_radius) - continue - var/add_this_turf = 0 - if(istype(O,/turf/space)) - for(var/turf/simulated/G in orange(1, O)) - add_this_turf = 1 - break - - //uncomment this for structures (but not lattices) to be surrounded by shield as well - /*if(!add_this_turf) - for(var/obj/structure/S in orange(1, O)) - if(!istype(S, /obj/structure/lattice)) - add_this_turf = 1 - break - if(add_this_turf) - for(var/obj/structure/S in O) - if(!istype(S, /obj/structure/lattice)) - add_this_turf = 0 - break*/ - - if(add_this_turf && !(O in open) && !(O in closed)) - open += O - open -= T - closed += T - - return closed diff --git a/code/modules/shieldgen/shielding.dmi b/code/modules/shieldgen/shielding.dmi deleted file mode 100644 index 58dd98641bc..00000000000 Binary files a/code/modules/shieldgen/shielding.dmi and /dev/null differ diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 1808e62ed11..260438fbed8 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -402,12 +402,14 @@ var/obj/machinery/door/Door = O spawn(-1) if(Door) - Door.close() if(istype(Door, /obj/machinery/door/airlock)) var/obj/machinery/door/airlock/A = Door + A.close(0,1) if(A.id_tag == "s_docking_airlock") A.lock() door_unlock_list += A + else + Door.close() else if (istype(AM,/mob)) var/mob/M = AM if(!M.move_on_shuttle) diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 873028d83ef..0ce20640940 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -348,14 +348,14 @@ E.droplimb(0,DROPLIMB_EDGE) if(3) if(ishuman(mob)) - if(H.species.name != "Skellington") + if(H.species.name != "Skeleton") mob << " Your necrotic skin ruptures!" for (var/obj/item/organ/external/E in H.organs) if(pick(1,0) && !(E.status & ORGAN_ROBOT)) E.createwound(CUT, pick(2,4)) if(prob(30)) - if(H.species.name != "Skellington") - if(H.set_species("Skellington")) + if(H.species.name != "Skeleton") + if(H.set_species("Skeleton")) mob << " A massive amount of flesh sloughs off your bones!" H.regenerate_icons() else diff --git a/config/example/game_options.txt b/config/example/game_options.txt index 9ccb4871aef..69847e0a6b6 100644 --- a/config/example/game_options.txt +++ b/config/example/game_options.txt @@ -69,8 +69,7 @@ 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 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. +## 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. -DEFAULT_LAWS 2 \ No newline at end of file +DEFAULT_LAWS 1 \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 5b3b5c496a2..56172c88974 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,100 @@ -->
    +

    31 January 2016

    +

    Crazylemon64 updated:

    +
      +
    • Syndicate borgs can now interact with station machinery
    • +
    • People with slime people limbs can now *squish
    • +
    • Skrell's vulnerability to alcohol is checked on their liver, now - a liver transplant will let them take alcohol like a champ - lacking a liver will have the same effect as being a skrell, when drinking
    • +
    +

    FalseIncarnate updated:

    +
      +
    • Adds in the Magic Eight Ball toy, found in Claw Game prize orbs.
    • +
    • Adds in the Magic Conch Shell, an admin-only shell of power.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Updates Summon Guns and Magic to include many of the new guns
    • +
    • Summon Guns/Magic can no longer be used during Ragin' Mages
    • +
    +

    Tastyfish updated:

    +
      +
    • The emergency shuttle status in the Status tab now has ETA/ETD/etc like before.
    • +
    • Code Gamma+ now has a 5 minute emergency shuttle call, like Red.
    • +
    +

    pinatacolada updated:

    +
      +
    • Adds NanoUI to the operating computer
    • +
    • Adds health announcing, critical and oxygen damage aural alerts to the computer, with a menu to selectively turn them on and off
    • +
    + +

    29 January 2016

    +

    Crazylemon updated:

    +
      +
    • The DNA scanner has now undergone a seminar to recognize fake identities; It will now scan the actual person's identity, rather than their disguise (read: wearing a mask with or without someone else's ID).
    • +
    • Matter eater now allows you to eat humans as if you were fat.
    • +
    • Eating mobs with an aggressive grab now generates attack logs.
    • +
    +

    Crazylemon64 updated:

    +
      +
    • For a short while, there was a clerical error where all AI communications equipment was replaced with bananas. This has now been fixed.
    • +
    • Ghosts can now see the contents of smartfridges and look at the drone console
    • +
    • Humans now only produce one message when shaken while SSD
    • +
    • The supermatter no longer will irradiate everyone, everywhere, when it explodes.
    • +
    • Writing on paper will now add hidden admin fingerprints, so that you can't forge mean notes in someone else's name.
    • +
    • Brains are no longer able to escape their brain by being a sorcerer.
    • +
    • Astral projecting with other runes on the same tile will now no longer prevent you from re-entering
    • +
    • Voxxy that is become ex-voxxy no longer carry voxxy appearance! yaya!
    • +
    +

    FalseIncarnate updated:

    +
      +
    • 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)
    • +
    +

    Fox McCloud updated:

    +
      +
    • Fixes mutadone not working with some genetic mutations
    • +
    • Fixes banana honk and silencer being alcoholic
    • +
    • Fixes Kahlua being non-alcoholic
    • +
    • Fixes polonium not metabolizing
    • +
    • Fixes being able to receive free unlimited boxes from the Merchandise store
    • +
    • Adds in wooden bucklers
    • +
    • Re-adds roman shield to the costume vendor
    • +
    • Buffs Riot shield damage from 8 to 10
    • +
    • Adds in a Skeleton race
    • +
    • Tweaks the skeletons colors to be more realistic and to blend in less with the floor
    • +
    • Adds in lichdom spell for the wizard
    • +
    • Adds in lesser summon guns spell for wizard
    • +
    • adds in Mjolnir and the singularity hammer as weapons the wizard can purchase
    • +
    • Wizard can purchase the charge spell from the spell book
    • +
    • Wizard can purchase a healing staff from the spell book
    • +
    • Tweaks and lowers spell costs of utility spells for wizard
    • +
    • Re-organizes the spellbook to be better divided into categories and have a better window size
    • +
    • Knock now opens+unlocks lockers
    • +
    • Magic Missile has a slightly longer cooldown and no longer deals damage, but has a lower cooldown is upgraded
    • +
    +

    KasparoVy updated:

    +
      +
    • Navy blue Centcom Officer's beret for use by the Blueshield.
    • +
    • Adds the new navy blue beret to the Blueshield's locker.
    • +
    • Gives the Blueshield's berets (black and navy blue) the exact same strip delay and armour as the Security Officer's beret.
    • +
    • Adds TG energy katana back and belt sprite.
    • +
    • Bo staff back sprite.
    • +
    • Adjusts energy katana sprites to make the weapon stand out a bit more from the regular katana.
    • +
    • Cutting open the toes of footwear so species with feet-claws can wear them.
    • +
    • Toeless jackboots.
    • +
    • Cleans up glovesnipping and lighting a match with a shoe.
    • +
    • Lighting a match with a shoe produces a more appropriate message, handled at the same standard as glove-snippingboot-cutting.
    • +
    +

    Tastyfish updated:

    +
      +
    • Cargonia now has its own section in the manifest.
    • +
    +

    TheDZD updated:

    +
      +
    • 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.
    • +
    +

    24 January 2016

    KasparoVy updated:

      @@ -87,7 +181,7 @@
    • 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
    • +
    • 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
    • diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f4354614ba6..70cedd14768 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -286,3 +286,96 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 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. +2016-01-29: + Crazylemon: + - bugfix: 'The DNA scanner has now undergone a seminar to recognize fake identities; + It will now scan the actual person''s identity, rather than their disguise (read: + wearing a mask with or without someone else''s ID).' + - 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. + Crazylemon64: + - bugfix: For a short while, there was a clerical error where all AI communications + equipment was replaced with bananas. This has now been fixed. + - tweak: Ghosts can now see the contents of smartfridges and look at the drone console + - tweak: Humans now only produce one message when shaken while SSD + - bugfix: The supermatter no longer will irradiate everyone, everywhere, when it + explodes. + - tweak: Writing on paper will now add hidden admin fingerprints, so that you can't + forge mean notes in someone else's name. + - bugfix: Brains are no longer able to escape their brain by being a sorcerer. + - bugfix: Astral projecting with other runes on the same tile will now no longer + prevent you from re-entering + - bugfix: Voxxy that is become ex-voxxy no longer carry voxxy appearance! yaya! + FalseIncarnate: + - 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) + Fox McCloud: + - bugfix: Fixes mutadone not working with some genetic mutations + - bugfix: Fixes banana honk and silencer being alcoholic + - bugfix: Fixes Kahlua being non-alcoholic + - bugfix: Fixes polonium not metabolizing + - bugfix: Fixes being able to receive free unlimited boxes from the Merchandise + store + - rscadd: Adds in wooden bucklers + - tweak: Re-adds roman shield to the costume vendor + - tweak: Buffs Riot shield damage from 8 to 10 + - rscadd: Adds in a Skeleton race + - tweak: Tweaks the skeletons colors to be more realistic and to blend in less with + the floor + - rscadd: Adds in lichdom spell for the wizard + - rscadd: Adds in lesser summon guns spell for wizard + - rscadd: adds in Mjolnir and the singularity hammer as weapons the wizard can purchase + - rscadd: Wizard can purchase the charge spell from the spell book + - rscadd: Wizard can purchase a healing staff from the spell book + - tweak: Tweaks and lowers spell costs of utility spells for wizard + - tweak: Re-organizes the spellbook to be better divided into categories and have + a better window size + - tweak: Knock now opens+unlocks lockers + - tweak: Magic Missile has a slightly longer cooldown and no longer deals damage, + but has a lower cooldown is upgraded + KasparoVy: + - 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. + - 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. + - 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. + Tastyfish: + - rscadd: Cargonia now has its own section in the manifest. + TheDZD: + - 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. +2016-01-31: + Crazylemon64: + - bugfix: Syndicate borgs can now interact with station machinery + - rscadd: People with slime people limbs can now *squish + - tweak: Skrell's vulnerability to alcohol is checked on their liver, now - a liver + transplant will let them take alcohol like a champ - lacking a liver will have + the same effect as being a skrell, when drinking + FalseIncarnate: + - rscadd: Adds in the Magic Eight Ball toy, found in Claw Game prize orbs. + - rscadd: Adds in the Magic Conch Shell, an admin-only shell of power. + Fox McCloud: + - rscadd: Updates Summon Guns and Magic to include many of the new guns + - tweak: Summon Guns/Magic can no longer be used during Ragin' Mages + Tastyfish: + - rscadd: The emergency shuttle status in the Status tab now has ETA/ETD/etc like + before. + - tweak: Code Gamma+ now has a 5 minute emergency shuttle call, like Red. + pinatacolada: + - rscadd: Adds NanoUI to the operating computer + - rscadd: Adds health announcing, critical and oxygen damage aural alerts to the + computer, with a menu to selectively turn them on and off diff --git a/html/changelogs/AutoChangeLog-pr-3379.yml b/html/changelogs/AutoChangeLog-pr-3379.yml deleted file mode 100644 index da3c4446cee..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3379.yml +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index d8a87e2e37f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3384.yml +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100644 index 3cce520a211..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3385.yml +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index 0c6b51358df..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3386.yml +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100644 index 60d649a344c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3388.yml +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index 3b57dd7fc1c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3392.yml +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index f56462f155a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3394.yml +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index fd7104d3e0b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3395.yml +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index ca3b753840d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3397.yml +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index 3e184cf978c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3400.yml +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index e5ab05752a6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3403.yml +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index d90bc2756fc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3404.yml +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index d9b908950b6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3405.yml +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 55798dff397..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3408.yml +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index 3fe83d8fac6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3409.yml +++ /dev/null @@ -1,4 +0,0 @@ -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/AutoChangeLog-pr-3455.yml b/html/changelogs/AutoChangeLog-pr-3455.yml new file mode 100644 index 00000000000..404b0cc887f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3455.yml @@ -0,0 +1,6 @@ +author: Glorken +delete-after: True +changes: + - rscadd: "Added a Knight Arena for Holodeck." + - imageadd: "Added red and blue claymore sprites." + - spellcheck: "Changed overrided to overrode when emagging Holodeck computer." diff --git a/html/changelogs/AutoChangeLog-pr-3461.yml b/html/changelogs/AutoChangeLog-pr-3461.yml new file mode 100644 index 00000000000..ca27ae1f755 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3461.yml @@ -0,0 +1,5 @@ +author: Tastyfish +delete-after: True +changes: + - bugfix: "Species that don't breathe can kill themselves now!" + - rscadd: "Suicide messages are now catered to your species." diff --git a/html/changelogs/AutoChangeLog-pr-3462.yml b/html/changelogs/AutoChangeLog-pr-3462.yml new file mode 100644 index 00000000000..be27197c72a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3462.yml @@ -0,0 +1,9 @@ +author: KasparoVy +delete-after: True +changes: + - rscadd: "Vox versions of the Officer SWAT sechailer + HOS SWAT sechailer + Warden SWAT sechailer." + - rscadd: "Resprited versions of most Human masks to fit Unathi, Tajara and Vulpkanin." + - rscadd: "Warden now gets their own version of the SWAT sechailer in their locker." + - tweak: "HOS now gets the appropriate version of the SWAT sechailer in their locker." + - tweak: "Repositioned smokeables now available for Vox, Unathi, Tajara and Vulpkanin." + - tweak: "Properly shades Vox bandana down-state sprites." diff --git a/html/changelogs/crazylemon-mateat_tweak.yml b/html/changelogs/crazylemon-mateat_tweak.yml deleted file mode 100644 index 21d1b4b136d..00000000000 --- a/html/changelogs/crazylemon-mateat_tweak.yml +++ /dev/null @@ -1,5 +0,0 @@ -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/effects/effects.dmi b/icons/effects/effects.dmi index 8b9f2af61ae..7d87c3d7557 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 8b1add2756b..57d17caaa46 100644 Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 534a839f306..6f24676144a 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 67f9603ece6..185168a1933 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/human_races/r_skeleton.dmi b/icons/mob/human_races/r_skeleton.dmi index f67639aa96b..a350c3f4c4d 100644 Binary files a/icons/mob/human_races/r_skeleton.dmi and b/icons/mob/human_races/r_skeleton.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index db12504dfc7..6eb4d6ef4e9 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index fdbfca0615c..d4b4197bab8 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi index daee56b2e14..1b0e1213dab 100644 Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi new file mode 100644 index 00000000000..0b046910f48 Binary files /dev/null and b/icons/mob/species/tajaran/mask.dmi differ diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi index 165fe68157d..267e6653449 100644 Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi new file mode 100644 index 00000000000..80b212e9008 Binary files /dev/null and b/icons/mob/species/unathi/mask.dmi differ diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi index 5616404917d..632ffe24c6f 100644 Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ diff --git a/icons/mob/species/vulpkanin/helmet.dmi b/icons/mob/species/vulpkanin/helmet.dmi index 06dc34ff68e..599f248db03 100644 Binary files a/icons/mob/species/vulpkanin/helmet.dmi and b/icons/mob/species/vulpkanin/helmet.dmi differ diff --git a/icons/mob/species/vulpkanin/mask.dmi b/icons/mob/species/vulpkanin/mask.dmi new file mode 100644 index 00000000000..86c84471a08 Binary files /dev/null and b/icons/mob/species/vulpkanin/mask.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index a30a79e335d..0ac8cffa837 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index a7cc00338f5..7b7e657e629 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 1bb43439df7..988f0153964 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 39b795fdc04..6e6d268c9bd 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index c14150ae21e..892dfe2a64e 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/nano/README.md b/nano/README.md index f5aac99d748..b83661fbac7 100644 --- a/nano/README.md +++ b/nano/README.md @@ -8,6 +8,35 @@ template engine. This README is not yet complete, but gives a basic rundown of how the folder structure works. I'll get around to finishing it one day. +## Contributors + +This section is for listing the contributors to NanoUI. + + - -tg-station/Neersighted + - Special thanks goes to Neersighted for creating most of the newest and best features + of NanoUI. Everything between using the Gulp build system to switching to LESS styles + has been directly adapated and/or copied from his original work for -tg-station and + their UI system, tgui. + + Systems ported/adapted from -tg-station and Neersighted include, but are not limited + to: + + - NanoUI's JavaScript controlling the "fancy" borderless window mode. + - The NanoTrasen.svg logo (Licensed under CC 3.0 BY-SA). + - The Gulp buildscript concept, as well as a large amount of the actual + Gulpfile.coffee. + - The packages in bower.json and packages.json files were hand-picked by Neersighted + for usage in compiling NanoUI. + - A considerable amount of this README is adapated from Neersighted's documentation. + - The concepts following: Using FontAwesome instead of icon16, Using LESS to expand + NanoUI's CSS style. + +NanoUI is licensed under AGPLv3. This applies to it's serverside `DM` code as well as it's +clientside `JavaScript` and `LESS` code. The file `nano/images/nanotrasen.svg` is licensed +under CC 3.0 BY-SA, and was created by Neersighted. All other image files in the +`nano/images/` directory are subject to the standard image license applied to the Paradise +repository icons. + ## Folder Rundown ### /assets diff --git a/nano/assets/nanoui.css b/nano/assets/nanoui.css index 4bfc846a64d..e99b2f94fd5 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}.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 +.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.sci,th.ser{font-weight:700;color:#fff}th.ser{background:#7100aa}th.sup{background:#666621}th.civ,th.sup{font-weight:700;color:#fff}th.civ{background:#a32800}th.misc{background:#666;font-weight:700;color:#fff}span.qm-job{color:#b77a41;font-weight:700}.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/styles/_bars.less b/nano/styles/_bars.less index f79c2d05fd6..f154274f596 100644 --- a/nano/styles/_bars.less +++ b/nano/styles/_bars.less @@ -33,7 +33,7 @@ .displayBarFill.good { color: #ffffff; - background: #4f7529; + background: @good-color; } .displayBarFill.notgood { @@ -43,15 +43,15 @@ .displayBarFill.average { color: #ffffff; - background: #cd6500; + background: @average-color; } .displayBarFill.bad { color: #ffffff; - background: #ee0000; + background: @bad-color; } .displayBarFill.highlight { color: #ffffff; - background: #8BA5C4; + background: @highlight-color; } \ No newline at end of file diff --git a/nano/styles/_color.less b/nano/styles/_color.less index fe10a74a5d3..6194a96ac2b 100644 --- a/nano/styles/_color.less +++ b/nano/styles/_color.less @@ -1,25 +1,32 @@ +@good-color: #4f7529; +@average-color: #cd6500; +@bad-color: #ee0000; + +@highlight-color: #8BA5C4; +@dark-color: #272727; + .white { color: white; font-weight: bold; } .good { - color: #4f7529; + color: @good-color; font-weight: bold; } .average { - color: #cd6500; + color: @average-color; font-weight: bold; } .bad { - color: #ee0000; + color: @bad-color; font-weight: bold; } .idle { - color: #272727; + color: @dark-color; font-weight: bold; } @@ -32,11 +39,11 @@ } .highlight { - color: #8BA5C4; + color: @highlight-color; } .dark { - color: #272727; + color: @dark-color; } /* Damage colors for crew monitoring computer */ diff --git a/nano/styles/_lists.less b/nano/styles/_lists.less index 5dff836c223..75ec81911bd 100644 --- a/nano/styles/_lists.less +++ b/nano/styles/_lists.less @@ -27,46 +27,51 @@ table.pmon td, table.pmon th { } /* Table styling for the crew manifest */ -th.command { - background: #3333FF; +.manifest-header(@color: #666) { + background: @color; font-weight: bold; color: #ffffff; } +th.command { + .manifest-header(#3333FF); +} + th.sec { - background: #8e0000; - font-weight: bold; - color: #ffffff; + .manifest-header(#8e0000); } th.med { - background: #006600; - font-weight: bold; - color: #ffffff; + .manifest-header(#006600); } th.eng { - background: #b27300; - font-weight: bold; - color: #ffffff; + .manifest-header(#b27300); } th.sci { - background: #a65ba6; - font-weight: bold; - color: #ffffff; + .manifest-header(#a65ba6); +} + +th.ser { + .manifest-header(#7100AA); +} + +th.sup { + .manifest-header(#666621); } th.civ { - background: #a32800; - font-weight: bold; - color: #ffffff; + .manifest-header(#a32800); } th.misc { - background: #666666; + .manifest-header; +} + +span.qm-job { + color: mix(@highlight-color, @average-color, 33%); font-weight: bold; - color: #ffffff; } /* Striped lines for tables and divs */ diff --git a/nano/templates/op_computer.tmpl b/nano/templates/op_computer.tmpl new file mode 100644 index 00000000000..027fdf3443b --- /dev/null +++ b/nano/templates/op_computer.tmpl @@ -0,0 +1,208 @@ + +

      Patient Monitor

      + +
      + {{if data.choice==0}} + {{if !data.hasOccupant}} +
      No Patient Detected
      + {{else}} +
      + {{:data.occupant.name}} =>  + {{if data.occupant.stat == 0}} + Conscious + {{else data.occupant.stat == 1}} + Unconscious + {{else}} + DEAD + {{/if}} +
      + +
      +
      Health:
      + {{if data.occupant.health >= data.occupant.maxHealth}} + {{:helper.displayBar(data.occupant.health, 0, data.occupant.maxHealth, 'good')}} + {{else data.occupant.health > 0}} + {{:helper.displayBar(data.occupant.health, 0, data.occupant.maxHealth, 'average')}} + {{else data.occupant.health >= data.minhealth}} + {{:helper.displayBar(data.occupant.health, 0, data.occupant.minHealth, 'average alignRight')}} + {{else}} + {{:helper.displayBar(data.occupant.health, 0, data.occupant.minHealth, 'bad alignRight')}} + {{/if}} +
      {{:helper.round(data.occupant.health)}}
      +
      + +
      +
      Brute Damage:
      + {{:helper.displayBar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad')}} +
      {{:helper.round(data.occupant.bruteLoss)}}
      +
      + +
      +
      Resp. Damage:
      + {{:helper.displayBar(data.occupant.oxyLoss, 0, data.occupant.maxHealth, 'bad')}} +
      {{:helper.round(data.occupant.oxyLoss)}}
      +
      + +
      +
      Toxin Damage:
      + {{:helper.displayBar(data.occupant.toxLoss, 0, data.occupant.maxHealth, 'bad')}} +
      {{:helper.round(data.occupant.toxLoss)}}
      +
      + +
      +
      Burn Severity:
      + {{:helper.displayBar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad')}} +
      {{:helper.round(data.occupant.fireLoss)}}
      +
      + +
      +
      Patient Temperature:
      + {{if data.occupant.temperatureSuitability == -3}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'bad')}} +
      {{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
      + {{else data.occupant.temperatureSuitability == -2}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'average')}} +
      {{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
      + {{else data.occupant.temperatureSuitability == -1}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'average')}} +
      {{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
      + {{else data.occupant.temperatureSuitability == 0}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'good')}} +
      {{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
      + {{else data.occupant.temperatureSuitability == 1}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'average')}} +
      {{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
      + {{else data.occupant.temperatureSuitability == 2}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'average')}} +
      {{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
      + {{else data.occupant.temperatureSuitability == 3}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'bad')}} +
      {{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
      + {{/if}} +
      + {{if data.occupant.hasBlood}} +
      +
      +
      Blood Level:
      + {{if data.occupant.bloodPercent <= 60}} + {{:helper.displayBar(data.occupant.bloodLevel, 0, data.occupant.bloodMax, 'bad')}} +
      + {{:data.occupant.bloodPercent}}%, {{:data.occupant.bloodLevel}}cl +
      + {{else data.occupant.bloodPercent <= 90}} + {{:helper.displayBar(data.occupant.bloodLevel, 0, data.occupant.bloodMax, 'average')}} +
      + {{:data.occupant.bloodPercent}}%, {{:data.occupant.bloodLevel}}cl +
      + {{else}} + {{:helper.displayBar(data.occupant.bloodLevel, 0, data.occupant.bloodMax, 'good')}} +
      + {{:data.occupant.bloodPercent}}%, {{:data.occupant.bloodLevel}}cl +
      + {{/if}} +
      +
      Blood Type:
      {{:data.occupant.bloodType}}
      +
      +
      +
      +
      Pulse:
      {{:data.occupant.pulse}} bpm
      +
      + {{/if}} + +
      +
      + {{/if}} +
      +
      + {{:helper.link('Options', 'gear', {'choiceOn' : 1})}} +
      +
      + {{else}} +
      +
      + Loudspeaker: +
      +
      + {{:helper.link('On', 'power-off', {'verboseOn' : 1}, data.verbose ? 'selected' : null)}} + {{:helper.link('Off', 'close', {'verboseOff' : 1}, data.verbose ? null : 'selected')}} +
      +
      +
      +
      +
      + Health Announcer: +
      +
      + {{:helper.link('On', 'power-off', {'healthOn' : 1}, data.health ? 'selected' : null)}} + {{:helper.link('Off', 'close', {'healthOff' : 1}, data.health ? null : 'selected')}} +
      +
      + +
      +
      +
      Health Announcer Threshold:
      + {{:helper.link('-', null, {'health_adj' : -100}, (data.healthAlarm >= 0) ? null : 'disabled')}} + {{:helper.link('-', null, {'health_adj' : -10}, (data.healthAlarm >= -90) ? null : 'disabled')}} + {{:helper.link('-', null, {'health_adj' : -1}, (data.healthAlarm > -100) ? null : 'disabled')}} + + {{if data.healthAlarm >= 100}} + {{:helper.displayBar(data.healthAlarm, 0, 100, 'good')}} + {{else data.healthAlarm > 0}} + {{:helper.displayBar(data.healthAlarm, 0, 100, 'average')}} + {{else data.healthAlarm >= -100}} + {{:helper.displayBar(data.healthAlarm, 0, -100, 'average alignRight')}} + {{else}} + {{:helper.displayBar(data.healthAlarm, 0, -100, 'bad alignRight')}} + {{/if}} + + {{:helper.link('+', null, {'health_adj' : 1}, (data.healthAlarm < 100) ? null : 'disabled')}} + {{:helper.link('+', null, {'health_adj' : 10}, (data.healthAlarm <= 90) ? null : 'disabled')}} + {{:helper.link('+', null, {'health_adj' : 100}, (data.healthAlarm <= 0) ? null : 'disabled')}} +
       {{: data.healthAlarm }}  
      +
      +
      +
      +
      +
      + Oxygen Alarm: +
      +
      + {{:helper.link('On', 'power-off', {'oxyOn' : 1}, data.oxy ? 'selected' : null)}} + {{:helper.link('Off', 'close', {'oxyOff' : 1}, data.oxy ? null : 'selected')}} +
      +
      + +
      +
      +
      Oxygen Alert Threshold:
      + {{:helper.link('-', null, {'oxy_adj' : -100}, (data.oxyAlarm >= 100) ? null : 'disabled')}} + {{:helper.link('-', null, {'oxy_adj' : -10}, (data.oxyAlarm >= 10) ? null : 'disabled')}} + {{:helper.link('-', null, {'oxy_adj' : -1}, (data.oxyAlarm >= 0) ? null : 'disabled')}} + {{:helper.displayBar( data.oxyAlarm, 0, 200, 'good')}} + {{:helper.link('+', null, {'oxy_adj' : 1}, (data.oxyAlarm < 200) ? null : 'disabled')}} + {{:helper.link('+', null, {'oxy_adj' : 10}, (data.oxyAlarm <= 190) ? null : 'disabled')}} + {{:helper.link('+', null, {'oxy_adj' : 100}, (data.oxyAlarm <= 100) ? null : 'disabled')}} +
       {{: data.oxyAlarm }}  
      +
      +
      +
      +
      +
      + Critical Alert: +
      +
      + {{:helper.link('On', 'power-off', {'critOn' : 1}, data.crit ? 'selected' : null)}} + {{:helper.link('Off', 'close', {'critOff' : 1}, data.crit ? null : 'selected')}} +
      +
      +
      +
      +
      + {{:helper.link('Return', 'arrow-left', {'choiceOff' : 1})}} +
      +
      + {{/if}} +
      diff --git a/nano/templates/pai_manifest.tmpl b/nano/templates/pai_manifest.tmpl index 77de9e3cad1..447f7ede7c5 100644 --- a/nano/templates/pai_manifest.tmpl +++ b/nano/templates/pai_manifest.tmpl @@ -45,27 +45,39 @@ Copy-pasted from pda.tmpl {{:value.name}}{{:value.rank}}{{:value.active}} {{/if}} {{/for}} - {{/if}} - {{if data.manifest.sci}} - Science - {{for data.manifest["sci"]}} - {{if value.rank == "Research Director"}} - {{:value.name}}{{:value.rank}}{{:value.active}} - {{else}} - {{:value.name}}{{:value.rank}}{{:value.active}} - {{/if}} - {{/for}} - {{/if}} - {{if data.manifest.supp}} - Support - {{for data.manifest["supp"]}} - {{if value.rank == "Head of Personnel"}} - {{:value.name}}{{:value.rank}}{{:value.active}} - {{else}} - {{:value.name}}{{:value.rank}}{{:value.active}} - {{/if}} - {{/for}} - {{/if}} + {{/if}} + {{if data.manifest.sci}} + Science + {{for data.manifest["sci"]}} + {{if value.rank == "Research Director"}} + {{:value.name}}{{:value.rank}}{{:value.active}} + {{else}} + {{:value.name}}{{:value.rank}}{{:value.active}} + {{/if}} + {{/for}} + {{/if}} + {{if data.manifest.ser}} + Service + {{for data.manifest["ser"]}} + {{if value.rank == "Head of Personnel"}} + {{:value.name}}{{:value.rank}}{{:value.active}} + {{else}} + {{:value.name}}{{:value.rank}}{{:value.active}} + {{/if}} + {{/for}} + {{/if}} + {{if data.manifest.sup}} + Supply + {{for data.manifest["sup"]}} + {{if value.rank == "Head of Personnel"}} + {{:value.name}}{{:value.rank}}{{:value.active}} + {{else value.rank == "Quartermaster"}} + {{:value.name}}{{:value.rank}}{{:value.active}} + {{else}} + {{:value.name}}{{:value.rank}}{{:value.active}} + {{/if}} + {{/for}} + {{/if}} {{if data.manifest.civ}} Civilian {{for data.manifest["civ"]}} diff --git a/nano/templates/pda.tmpl b/nano/templates/pda.tmpl index 032600dc832..54ab77a9be6 100644 --- a/nano/templates/pda.tmpl +++ b/nano/templates/pda.tmpl @@ -428,9 +428,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.manifest.supp}} - Support - {{for data.manifest["supp"]}} + {{if data.manifest.ser}} + Service + {{for data.manifest["ser"]}} {{if value.rank == "Head of Personnel"}} {{:value.name}}{{:value.rank}}{{:value.active}} {{else}} @@ -438,6 +438,18 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} + {{if data.manifest.sup}} + Supply + {{for data.manifest["sup"]}} + {{if value.rank == "Head of Personnel"}} + {{:value.name}}{{:value.rank}}{{:value.active}} + {{else value.rank == "Quartermaster"}} + {{:value.name}}{{:value.rank}}{{:value.active}} + {{else}} + {{:value.name}}{{:value.rank}}{{:value.active}} + {{/if}} + {{/for}} + {{/if}} {{if data.manifest.civ}} Civilian {{for data.manifest["civ"]}} diff --git a/paradise.dme b/paradise.dme index 30364ed4ef5..915019f91ef 100644 --- a/paradise.dme +++ b/paradise.dme @@ -215,8 +215,10 @@ #include "code\datums\spells\fake_gib.dm" #include "code\datums\spells\genetic.dm" #include "code\datums\spells\horsemask.dm" +#include "code\datums\spells\infinite_guns.dm" #include "code\datums\spells\inflict_handler.dm" #include "code\datums\spells\knock.dm" +#include "code\datums\spells\lichdom.dm" #include "code\datums\spells\lightning.dm" #include "code\datums\spells\magnet.dm" #include "code\datums\spells\mind_transfer.dm" @@ -1396,6 +1398,7 @@ #include "code\modules\mob\living\carbon\human\species\monkey.dm" #include "code\modules\mob\living\carbon\human\species\plasmaman.dm" #include "code\modules\mob\living\carbon\human\species\shadow.dm" +#include "code\modules\mob\living\carbon\human\species\skeleton.dm" #include "code\modules\mob\living\carbon\human\species\species.dm" #include "code\modules\mob\living\carbon\human\species\station.dm" #include "code\modules\mob\living\carbon\slime\death.dm" @@ -1777,7 +1780,6 @@ #include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_celldrain.dm" #include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_dnaswitch.dm" #include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_emp.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_forcefield.dm" #include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_goodfeeling.dm" #include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heal.dm" #include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heat.dm" @@ -1833,11 +1835,6 @@ #include "code\modules\scripting\Scanner\Tokens.dm" #include "code\modules\security_levels\keycard authentication.dm" #include "code\modules\security_levels\security levels.dm" -#include "code\modules\shieldgen\circuits_and_designs.dm" -#include "code\modules\shieldgen\energy_field.dm" -#include "code\modules\shieldgen\shield_capacitor.dm" -#include "code\modules\shieldgen\shield_gen.dm" -#include "code\modules\shieldgen\shield_gen_external.dm" #include "code\modules\shuttle\shuttle.dm" #include "code\modules\space_transition\space_transition.dm" #include "code\modules\store\items.dm"