diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 527ea37bb14..4c63722a2ff 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -580,10 +580,22 @@ datum/mind new_objective.target_amount = target_number if("identity theft") + var/list/possible_targets = list("Free objective") + for(var/datum/mind/possible_target in ticker.minds) + if ((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human)) + possible_targets += possible_target.current + + var/new_target = input("Select target:", "Objective target") as null|anything in possible_targets + if (!new_target) + return + var/datum/mind/targ = new_target + if(!istype(targ)) + log_debug("Invalid target for identity theft objective, cancelling") + return new_objective = new /datum/objective/escape/escape_with_identity new_objective.owner = src - new_objective.find_target() - + new_objective.target = new_target + new_objective.explanation_text = "Escape on the shuttle or an escape pod with the identity of [targ.current.real_name], the [targ.assigned_role] while wearing their identification card." if ("custom") var/expl = sanitize(copytext(input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null,1,MAX_MESSAGE_LEN)) if (!expl) return diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 0795d4dca7e..e8dd34ff897 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -146,7 +146,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/weapon/grenade/smokebomb, /obj/item/weapon/grenade/smokebomb, /obj/item/weapon/grenade/smokebomb, - /obj/item/weapon/pen/paralysis, + /obj/item/weapon/pen/sleepy, /obj/item/weapon/grenade/chem_grenade/incendiary) cost = 20 containertype = /obj/structure/closet/crate diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 832749d6bcc..d0f18a140ca 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -323,18 +323,18 @@ var/list/uplink_items = list() cost = 18 gamemodes = list("nuclear emergency") -/datum/uplink_item/ammo/bullstun - name = "Drum Magazine - 12g Stun Slug" - desc = "An additional 8-round stun slug magazine for use in the Bulldog shotgun. Saying that they're non-lethal would be lying." +/datum/uplink_item/ammo/bullbuck + name = "Drum Magazine - 12g buckshot" + desc = "An additional 8-round buckshot magazine for use in the Bulldog shotgun. Front towards enemy." item = /obj/item/ammo_box/magazine/m12g cost = 2 gamemodes = list("nuclear emergency") -/datum/uplink_item/ammo/bullbuck - name = "Drum Magazine - 12g Buckshot" - desc = "An alternative 8-round buckshot magazine for use in the Bulldog shotgun. Front towards enemy." - item = /obj/item/ammo_box/magazine/m12g/buckshot - cost = 2 +/datum/uplink_item/ammo/bullstun + name = "Drum Magazine - 12g Stun Slug" + desc = "An alternative 8-round stun slug magazine for use in the Bulldog shotgun. Saying that they're completely non-lethal would be lying." + item = /obj/item/ammo_box/magazine/m12g/stun + cost = 3 gamemodes = list("nuclear emergency") /datum/uplink_item/ammo/bulldragon @@ -371,10 +371,11 @@ var/list/uplink_items = list() /datum/uplink_item/stealthy_weapons category = "Stealthy and Inconspicuous Weapons" -/datum/uplink_item/stealthy_weapons/para_pen - name = "Paralysis Pen" - desc = "A syringe disguised as a functional pen, filled with a neuromuscular-blocking drug that renders a target mute on injection that will eventually cause them to pass out. The pen holds one dose of paralyzing agent,though it can be refilled." - item = /obj/item/weapon/pen/paralysis +/datum/uplink_item/stealthy_weapons/sleepy_pen + name = "Sleepy Pen" + desc = "A syringe disguised as a functional pen, filled with a potent mix of drugs, including a strong anaesthetic and a chemical that is capable of blocking the movement of the vocal chords. \ + The pen holds one dose of the mixture. The pen can be refilled." + item = /obj/item/weapon/pen/sleepy cost = 8 excludefrom = list("nuclear emergency") diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index cc443ade3f0..0431d666c53 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -148,4 +148,14 @@ block=LISPBLOCK OnSay(var/mob/M, var/message) - return replacetext(message,"s","th") \ No newline at end of file + return replacetext(message,"s","th") + +/datum/dna/gene/disability/comic + name = "Comic" + desc = "This will only bring death and destruction." + activation_message = "Uh oh!" + deactivation_message = "Well thank god that's over with." + mutation=COMIC + + New() + block = COMICBLOCK diff --git a/code/game/dna/genes/vg_disabilities.dm b/code/game/dna/genes/vg_disabilities.dm index 7cccad7d6ee..6cb2c6f6ce8 100644 --- a/code/game/dna/genes/vg_disabilities.dm +++ b/code/game/dna/genes/vg_disabilities.dm @@ -17,7 +17,7 @@ message = replacetext(message,"!","!!") return uppertext(message) - +/* BROKEN WITH NEW SAYCODE /datum/dna/gene/disability/speech/whisper name = "Quiet" desc = "Damages the subjects vocal cords" @@ -36,7 +36,7 @@ OnSay(var/mob/M, var/message) M.whisper(message) - +*/ /datum/dna/gene/disability/dizzy name = "Dizzy" diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 5108beb041b..9b3bf73845c 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -120,9 +120,9 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/datum/objective/escape/escape_with_identity/identity_theft = new identity_theft.owner = changeling identity_theft.target = kill_objective.target + identity_theft.target_real_name = kill_objective.target.current.real_name //Whoops, forgot this. if(identity_theft.target && identity_theft.target.current) - var/target_real_name = identity_theft.target.current.real_name - identity_theft.explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [identity_theft.target.assigned_role] while wearing their identification card." + identity_theft.explanation_text = "Escape on the shuttle or an escape pod with the identity of [identity_theft.target_real_name], the [identity_theft.target.assigned_role] while wearing their identification card." else identity_theft.explanation_text = "Free objective" changeling.objectives += identity_theft @@ -310,4 +310,4 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" user << "We already have this DNA in storage!" return 1 - \ No newline at end of file + diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index a54d336c5dd..09453727f4b 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -42,7 +42,7 @@ /obj/item/weapon/storage/box/emps:3:5 EMP Grenades; Whitespace:Seperator; Stealthy and Inconspicuous Weapons; -/obj/item/weapon/pen/paralysis:3:Paralysis Pen; +/obj/item/weapon/pen/sleepy:3:Sleepy Pen; /obj/item/weapon/soap/syndie:1:Syndicate Soap; /obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; Whitespace:Seperator; diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 8c8974dcc02..47493adab52 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -278,9 +278,6 @@ proc/issyndicate(mob/living/M as mob) U.hidden_uplink.uses = 20 synd_mob.equip_to_slot_or_del(U, slot_in_backpack) - var/obj/item/clothing/suit/space/rig/syndi/new_suit = new(synd_mob) - var/obj/item/clothing/head/helmet/space/rig/syndi/new_helmet = new(synd_mob) - if(synd_mob.species) /* @@ -293,28 +290,12 @@ proc/issyndicate(mob/living/M as mob) var/race = synd_mob.species.name switch(race) - if("Unathi") - new_suit.species_restricted = list("Unathi") - new_helmet.species_restricted = list("Unathi") - if("Tajaran") - new_suit.species_restricted = list("Tajaran") - new_helmet.species_restricted = list("Tajaran") - if("Skrell") - new_suit.species_restricted = list("Skrell") - new_helmet.species_restricted = list("Skrell") if("Vox" || "Vox Armalis") - synd_mob.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(synd_mob), slot_wear_mask) + synd_mob.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(synd_mob), slot_wear_mask) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(synd_mob), slot_l_hand) synd_mob.internal = synd_mob.l_hand if (synd_mob.internals) synd_mob.internals.icon_state = "internal1" - new_suit.species_restricted = list ("Vox", "Vox Armalis") - new_helmet.species_restricted = list ("Vox", "Vox Armalis") - - - synd_mob.equip_to_slot_or_del(new_suit, slot_wear_suit) - synd_mob.equip_to_slot_or_del(new_helmet, slot_head) - var/obj/item/weapon/implant/dexplosive/E = new/obj/item/weapon/implant/dexplosive(synd_mob) E.imp_in = synd_mob diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 2a7d8b14368..d79a7f8b6ae 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -749,12 +749,14 @@ datum/objective/absorb return 0 datum/objective/destroy + var/target_real_name find_target() var/list/possible_targets = active_ais(1) var/mob/living/silicon/ai/target_ai = pick(possible_targets) target = target_ai.mind if(target && target.current) - explanation_text = "Destroy [target.current.real_name], the experimental AI." + target_real_name = target.current.real_name + explanation_text = "Destroy [target_real_name], the AI." else explanation_text = "Free Objective" return target diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index f32258c13db..9936afa1d9a 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -76,6 +76,7 @@ TOXICFARTBLOCK = getAssignedBlock("TOXICFART", numsToAssign, good=1) STRONGBLOCK = getAssignedBlock("STRONG", numsToAssign, good=1) HORNSBLOCK = getAssignedBlock("HORNS", numsToAssign) + COMICBLOCK = getAssignedBlock("COMIC", numsToAssign) // Powers SOBERBLOCK = getAssignedBlock("SOBER", numsToAssign, good=1) @@ -97,7 +98,7 @@ // Disabilities LOUDBLOCK = getAssignedBlock("LOUD", numsToAssign) - WHISPERBLOCK = getAssignedBlock("WHISPER", numsToAssign) + //WHISPERBLOCK = getAssignedBlock("WHISPER", numsToAssign) BROKEN WITH NEW SAYCODE DIZZYBLOCK = getAssignedBlock("DIZZY", numsToAssign) diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index 00d74b109e9..6ec4396464c 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -227,6 +227,8 @@ H.equip_or_collect(new /obj/item/weapon/storage/fancy/crayons(H), slot_in_backpack) H.equip_or_collect(new /obj/item/weapon/reagent_containers/spray/waterflower(H), slot_in_backpack) H.mutations.Add(CLUMSY) + H.dna.SetSEState(COMICBLOCK,1,1) + genemutcheck(H,COMICBLOCK,null,MUTCHK_FORCED) return 1 diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 1774a349e63..7eb1b51da9e 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -179,75 +179,6 @@ /obj/machinery/autolathe/Topic(href, href_list) if(..()) return 1 - if (!busy) - if(href_list["menu"]) - screen = text2num(href_list["menu"]) - - if(href_list["category"]) - selected_category = href_list["category"] - - if(href_list["make"]) - - var/turf/T = get_step(src.loc, get_dir(src,usr)) - - ///////////////// - //href protection - being_built = files.FindDesignByID(href_list["make"]) //check if it's a valid design - if(!being_built) - return - - //multiplier checks : only stacks can have one and its value is 1, 10 ,25 or max_multiplier - var/multiplier = text2num(href_list["multiplier"]) - var/max_multiplier = min(50, being_built.materials["$metal"] ?round(m_amount/being_built.materials["$metal"]):INFINITY,being_built.materials["$glass"]?round(g_amount/being_built.materials["$glass"]):INFINITY) - var/is_stack = ispath(being_built.build_path, /obj/item/stack) - - if(!is_stack && (multiplier > 1)) - return - if (!(multiplier in list(1,10,25,max_multiplier))) //"enough materials ?" is checked further down - return - ///////////////// - - var/coeff = (is_stack ? 1 : 2 ** prod_coeff) //stacks are unaffected by production coefficient - var/metal_cost = being_built.materials["$metal"] - var/glass_cost = being_built.materials["$glass"] - - var/power = max(2000, (metal_cost+glass_cost)*multiplier/5) - - if((m_amount >= metal_cost*multiplier/coeff) && (g_amount >= glass_cost*multiplier/coeff)) - busy = 1 - use_power(power) - icon_state = "autolathe" - flick("autolathe_n",src) - spawn(32/coeff) - use_power(power) - if(is_stack) - m_amount -= metal_cost*multiplier - g_amount -= glass_cost*multiplier - var/obj/item/stack/S = new being_built.build_path(T) - S.amount = multiplier - else - m_amount -= metal_cost/coeff - g_amount -= glass_cost/coeff - var/obj/item/new_item = new being_built.build_path(T) - new_item.m_amt /= coeff - new_item.g_amt /= coeff - if(m_amount < 0) - m_amount = 0 - if(g_amount < 0) - g_amount = 0 - busy = 0 - src.updateUsrDialog() - - if(href_list["search"]) - matching_designs.Cut() - - for(var/datum/design/D in files.known_designs) - if(findtext(D.name,href_list["to_search"])) - matching_designs.Add(D) - - else - usr << "The autolathe is busy. Please wait for completion of previous operation." - if(href_list["menu"]) screen = text2num(href_list["menu"]) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index f201cb9e772..13275b5f3c1 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -19,17 +19,13 @@ user << "You don't have the dexterity to do this!" return 1 + if (istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting) - if(affecting.display_name == "head") - if(H.head && istype(H.head,/obj/item/clothing/head/helmet/space)) - user << "You can't apply [src] through [H.head]!" - return 1 - else - if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space)) - user << "You can't apply [src] through [H.wear_suit]!" + if(isliving(M)) + if(!M.can_inject(user, 1)) return 1 if(affecting.status & ORGAN_ROBOT) @@ -48,7 +44,7 @@ use(1) M.updatehealth() - + /obj/item/stack/medical/bruise_pack name = "roll of gauze" singular_name = "gauze length" @@ -82,12 +78,12 @@ user.visible_message( "\blue [user] places a bandaid over \the [W.desc] on [M]'s [affecting.display_name].", \ "\blue You place a bandaid over \the [W.desc] on [M]'s [affecting.display_name]." ) - affecting.heal_damage(src.heal_brute, src.heal_burn, 0) + affecting.heal_damage(src.heal_brute, src.heal_burn, 0) use(1) else M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2)) use(1) - + /obj/item/stack/medical/ointment name = "ointment" desc = "Used to treat those nasty burns." @@ -112,7 +108,7 @@ else user.visible_message( "\blue [user] salves the wounds on [M]'s [affecting.display_name].", \ "\blue You salve the wounds on [M]'s [affecting.display_name]." ) - affecting.heal_damage(src.heal_brute, src.heal_burn, 0) + affecting.heal_damage(src.heal_brute, src.heal_burn, 0) use(1) else if (can_operate(H)) //Checks if mob is lying down on table for surgery diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 699cada546e..3e3b67fe6af 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -673,7 +673,7 @@ - + diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index e117cbaf0f2..27f233e75b3 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -50,7 +50,7 @@ edge = 1 /obj/item/weapon/melee/energy/sword/cyborg - var/hitcost = 500 + var/hitcost = 250 /obj/item/weapon/melee/energy/sword/cyborg/attack(mob/M, var/mob/living/silicon/robot/R) if(R.cell) diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index cbaa53c0b54..841a3c0c12b 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -119,3 +119,19 @@ rating = 3 m_amt = 0 g_amt = 0 + +/obj/item/weapon/stock_parts/cell/emproof + name = "\improper EMP-proof cell" + desc = "An EMP-proof cell." + maxcharge = 5000 + rating = 2 + +/obj/item/weapon/stock_parts/cell/emproof/empty/New() + ..() + charge = 0 + +/obj/item/weapon/stock_parts/cell/emproof/emp_act(severity) + return + +/obj/item/weapon/stock_parts/cell/emproof/corrupt() + return \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 6b4fc5a43bd..1d7e72fd1bc 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -12,7 +12,7 @@ if("stealth") new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow(src) - new /obj/item/weapon/pen/paralysis(src) + new /obj/item/weapon/pen/sleepy(src) new /obj/item/device/chameleon(src) return diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 01fceded7e6..09dcc02bafd 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -13,8 +13,7 @@ ..() sleep(2) new /obj/item/clothing/under/syndicate(src) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/head/helmet/swat/syndicate(src) + new /obj/item/clothing/shoes/black(src) new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/weapon/storage/belt/military(src) new /obj/item/weapon/crowbar/red(src) @@ -26,8 +25,10 @@ /obj/structure/closet/syndicate/suits/New() ..() sleep(2) - new /obj/item/weapon/tank/jetpack/oxygen/harness(src) + new /obj/item/clothing/head/helmet/space/rig/syndi(src) new /obj/item/clothing/mask/gas/syndicate(src) + new /obj/item/clothing/suit/space/rig/syndi(src) + new /obj/item/weapon/tank/jetpack/oxygen/harness(src) new /obj/item/clothing/shoes/magboots/syndie(src) /obj/structure/closet/syndicate/nuclear diff --git a/code/global.dm b/code/global.dm index 7871eb70493..1c292b17a2b 100644 --- a/code/global.dm +++ b/code/global.dm @@ -81,6 +81,7 @@ var/SCRAMBLEBLOCK = 0 var/TOXICFARTBLOCK = 0 var/STRONGBLOCK = 0 var/HORNSBLOCK = 0 +var/COMICBLOCK = 0 // Powers var/SOBERBLOCK = 0 @@ -100,7 +101,7 @@ var/POLYMORPHBLOCK = 0 // /vg/ Mutations /////////////////////////////// var/LOUDBLOCK = 0 -var/WHISPERBLOCK = 0 +//var/WHISPERBLOCK = 0 var/DIZZYBLOCK = 0 diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index e7ab656bfb4..53f887b425e 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -1,9 +1,10 @@ //admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless var/list/admin_verbs_default = list( // /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/ - /client/proc/deadmin_self /*destroys our own admin datum so we can play as a regular player*/ + /client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/ // /client/proc/check_antagonists, /*shows all antags*/ // /client/proc/deadchat /*toggles deadchat on/off*/ + /client/proc/cmd_mentor_check_new_players ) var/list/admin_verbs_admin = list( /client/proc/check_antagonists, /*shows all antags*/ @@ -176,8 +177,7 @@ var/list/admin_verbs_mod = list( var/list/admin_verbs_mentor = list( /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/ /client/proc/cmd_admin_pm_panel, /*admin-pm list*/ - /client/proc/cmd_admin_pm_by_key_panel, /*admin-pm list by key*/ - /client/proc/cmd_mentor_check_new_players + /client/proc/cmd_admin_pm_by_key_panel /*admin-pm list by key*/ ) /client/proc/add_admin_verbs() diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 4ca805ac35c..f259207dcc4 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -15,23 +15,9 @@ var/image/cross = image('icons/obj/storage.dmi',"bible") msg = "\blue \icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) (SC): [msg]" - var/list/eventholders = list() - var/list/banholders = list() - for(var/client/X in admins) if(R_EVENT & X.holder.rights) - eventholders += X - if(R_BAN & X.holder.rights) - banholders += X - - if(eventholders.len) - for(var/client/C in eventholders) - if(C.prefs.toggles & CHAT_PRAYER) - C << msg - else if (banholders.len) - for(var/client/C in banholders) - if(C.prefs.toggles & CHAT_PRAYER) - C << msg + X << msg usr << "Your prayers have been received by the gods." @@ -42,64 +28,22 @@ var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "\blue CENTCOMM:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" - var/list/eventholders = list() - var/list/banholders = list() - for(var/client/X in admins) if(R_EVENT & X.holder.rights) - eventholders += X - if(R_BAN & X.holder.rights) - banholders += X - - if(eventholders.len) - for(var/client/C in eventholders) - C << msg - return - else if (banholders.len) - for(var/client/C in banholders) - C << msg - return + X << msg /proc/Syndicate_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "\blue SYNDICATE: [key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (REPLY): [msg]" - var/list/eventholders = list() - var/list/banholders = list() - for(var/client/X in admins) if(R_EVENT & X.holder.rights) - eventholders += X - if(R_BAN & X.holder.rights) - banholders += X - - if(eventholders.len) - for(var/client/C in eventholders) - C << msg - return - else if (banholders.len) - for(var/client/C in banholders) - C << msg - return + X << msg /proc/HONK_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "\blue HONK:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" - var/list/eventholders = list() - var/list/banholders = list() - for(var/client/X in admins) if(R_EVENT & X.holder.rights) - eventholders += X - if(R_BAN & X.holder.rights) - banholders += X - - if(eventholders.len) - for(var/client/C in eventholders) - C << msg - return - else if (banholders.len) - for(var/client/C in banholders) - C << msg - return \ No newline at end of file + X << msg \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 86905b08b8a..fd68636f599 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -280,7 +280,7 @@ BLIND // can't see anything name = "Space helmet" icon_state = "space" desc = "A special helmet designed for work in a hazardous, low-pressure environment." - flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE + flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL item_state = "s_helmet" permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50) @@ -301,7 +301,7 @@ BLIND // can't see anything w_class = 4//bulky item gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 - flags = STOPSPRESSUREDMAGE + flags = STOPSPRESSUREDMAGE | THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit) slowdown = 2 diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index af296490df3..d93863276ec 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -365,44 +365,89 @@ //Syndicate rig /obj/item/clothing/head/helmet/space/rig/syndi name = "blood-red hardsuit helmet" - desc = "An advanced helmet designed for work in special operations. Property of Gorlex Marauders." - icon_state = "rig0-syndie" + desc = "A dual-mode advanced helmet designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." + icon_state = "hardsuit1-syndi" item_state = "syndie_helm" - _color = "syndie" + _color = "syndi" armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) - siemens_coefficient = 0.6 - var/obj/machinery/camera/camera - species_restricted = list("exclude","Unathi","Tajaran","Skrell","Vox") + on = 1 + action_button_name = "Toggle Helmet Mode" + icon_action_button = "Action_hardsuit1-syndi" + species_restricted = null + sprite_sheets = null +/obj/item/clothing/head/helmet/space/rig/syndi/update_icon() + icon_state = "hardsuit[on]-[_color]" /obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user) - if(camera) - ..(user) + if(!isturf(user.loc)) + user << "You cannot toggle your helmet while in this [user.loc]" //To prevent some lighting anomalities. + return + on = !on + if(on) + user << "You switch your helmet to travel mode." + name = "blood-red hardsuit helmet" + desc = "A dual-mode advanced helmet designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." + flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + cold_protection = HEAD + user.AddLuminosity(brightness_on) else - camera = new /obj/machinery/camera(src) - camera.network = list("NukeOps") - cameranet.removeCamera(camera) - camera.c_tag = user.name - user << "\blue User scanned as [camera.c_tag]. Camera activated." + user << "You switch your helmet to combat mode." + name = "blood-red hardsuit helmet (combat)" + desc = "A dual-mode advanced helmet designed for work in special operations. It is in combat mode. Property of Gorlex Marauders." + flags = BLOCKHAIR + flags_inv = HIDEEARS + cold_protection = null + user.AddLuminosity(-brightness_on) -/obj/item/clothing/head/helmet/space/rig/syndi/examine() - ..() - if(get_dist(usr,src) <= 1) - usr << "This helmet has a built-in camera. It's [camera ? "" : "in"]active." + update_icon() + playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) + user.update_inv_head() /obj/item/clothing/suit/space/rig/syndi - icon_state = "rig-syndie" name = "blood-red hardsuit" - desc = "An advanced suit that protects against injuries during special operations. Property of Gorlex Marauders." + desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." + icon_state = "hardsuit1-syndi" item_state = "syndie_hardsuit" + _color = "syndi" slowdown = 1 w_class = 3 + var/on = 1 + action_button_name = "Toggle Hardsuit Mode" + icon_action_button = "Action_hardsuit1-syndi" armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) - allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box/magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) - siemens_coefficient = 0.6 - species_restricted = list("exclude","Unathi","Tajaran","Skrell","Vox") + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) + species_restricted = null sprite_sheets = null +/obj/item/clothing/suit/space/rig/syndi/update_icon() + icon_state = "hardsuit[on]-[_color]" + +/obj/item/clothing/suit/space/rig/syndi/attack_self(mob/user) + on = !on + if(on) + user << "You switch your hardsuit to travel mode." + name = "blood-red hardsuit helmet" + desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." + slowdown = 1 + flags = STOPSPRESSUREDMAGE + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS + else + user << "You switch your hardsuit to combat mode." + name = "blood-red hardsuit helmet (combat)" + desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in combat mode. Property of Gorlex Marauders." + slowdown = 0 + flags = BLOCKHAIR + flags_inv = null + cold_protection = null + + update_icon() + playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) + user.update_inv_wear_suit() + user.update_inv_w_uniform() + //Wizard Rig /obj/item/clothing/head/helmet/space/rig/wizard name = "gem-encrusted hardsuit helmet" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index c642aed8b20..2995df68f1a 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -198,6 +198,7 @@ w_class = 4//bulky item body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/emergency_oxygen) + flags = THICKMATERIAL flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE @@ -210,6 +211,7 @@ item_state = "swat_suit" w_class = 4//bulky item gas_transfer_coefficient = 0.90 + flags = THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS slowdown = 3 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT @@ -218,6 +220,9 @@ /obj/item/clothing/suit/armor/tdome body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + flags = THICKMATERIAL + cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS + heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS /obj/item/clothing/suit/armor/tdome/red name = "Thunderdome suit (red)" diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 4527c6395c2..6764838430b 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -4,7 +4,7 @@ icon_state = "bio" desc = "A hood that protects the head and face from biological comtaminants." permeability_coefficient = 0.01 - flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR + flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR | THICKMATERIAL armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES siemens_coefficient = 0.9 @@ -18,7 +18,7 @@ w_class = 4//bulky item gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 - flags = ONESIZEFITSALL + flags = ONESIZEFITSALL | THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS slowdown = 1.0 allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen) diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index ca86eb92755..08d3757a95f 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -21,7 +21,7 @@ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/extinguisher) slowdown = 1.0 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL - flags = STOPSPRESSUREDMAGE + flags = STOPSPRESSUREDMAGE | THICKMATERIAL heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS @@ -55,7 +55,7 @@ name = "bomb hood" desc = "Use in case of bomb." icon_state = "bombsuit" - flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR + flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR | THICKMATERIAL armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES cold_protection = HEAD @@ -74,6 +74,7 @@ w_class = 4//bulky item gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 + flags = THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS slowdown = 2 armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0) @@ -102,7 +103,7 @@ name = "Radiation Hood" icon_state = "rad" desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation" - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR|THICKMATERIAL armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100) loose = 8 @@ -114,6 +115,7 @@ w_class = 4//bulky item gas_transfer_coefficient = 0.90 permeability_coefficient = 0.50 + flags = THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen) slowdown = 1.5 diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 3b4f1cc6f39..75ecbe0570d 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -215,7 +215,7 @@ var/new_name = "[pick(list("To Sleep Beneath","Wind Over","Embrace of","Dreams of","Witnessing","To Walk Beneath","Approaching the"))]" new_name += " [pick(list("the Void","the Sky","Encroaching Night","Planetsong","Starsong","the Wandering Star","the Empty Day","Daybreak","Nightfall","the Rain"))]" return new_name - + /datum/language/trinary name = "Trinary" desc = "A modification of binary to allow fuzzy logic. 0 is no, 1 is maybe, 2 is yes. Credited with giving Machine People the ability to think creatively." @@ -225,8 +225,8 @@ colour = "trinary" key = "5" flags = RESTRICTED | WHITELISTED - syllables = list("02011","01222","10100","10210","21012","02011","21200","1002","2001","0002","0012","0012","000","120","121","201","220","10","11","0") - + syllables = list("02011","01222","10100","10210","21012","02011","21200","1002","2001","0002","0012","0012","000","120","121","201","220","10","11","0") + /datum/language/kidan name = "Chittin" desc = "The noise made by rubbing its antennae together is actually a complex form of communication for Kidan." @@ -237,7 +237,7 @@ key = "4" flags = RESTRICTED | WHITELISTED syllables = list("click","clack") - + /datum/language/slime name = "Bubblish" desc = "The language of slimes. It's a mixture of bubbling noises and pops. Very difficult to speak without mechanical aid for humans." @@ -310,6 +310,16 @@ key = "3" syllables = list ("gra","ba","ba","breh","bra","rah","dur","ra","ro","gro","go","ber","bar","geh","heh", "gra") +/datum/language/clown + name = "Clownish" + desc = "The language of clown planet. Mother tongue of clowns throughout the Galaxy." + speech_verb = "honks" + ask_verb = "honks" + exclaim_verb = "honks" + colour = "clown" + key = "0" + syllables = list ("honk","squeak","bonk","toot","narf","zub","wee","wub","norf") + /datum/language/xenocommon name = "Xenomorph" colour = "alien" diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 6da5df8c9c4..fc7ef06d8ea 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -82,6 +82,23 @@ if (!species.name == "Machine") return + if("wag") + if(species.bodyflags & TAIL_WAGGING) + if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space)) + message = "[src] starts wagging \his tail." + src.start_tail_wagging(1) + else + return + else + return + + if("swag") + if(species.bodyflags & TAIL_WAGGING) + message = "[src] stops wagging \his tail." + src.stop_tail_wagging(1) + else + return + if ("airguitar") if (!src.restrained()) message = "[src] is strumming the air and headbanging like a safari chimp." diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b2d3d093792..8d9ba741425 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -42,7 +42,7 @@ // Set up DNA. if(!delay_ready_dna) dna.ready_dna(src) - + /mob/living/carbon/human/dummy real_name = "Test Dummy" status_flags = GODMODE|CANPUSH @@ -205,8 +205,8 @@ stat("Distribution Pressure", internal.distribute_pressure) if(mind) if(mind.changeling) - stat("Chemical Storage", mind.changeling.chem_charges) - stat("Genetic Damage Time", mind.changeling.geneticdamage) + stat("Chemical Storage", "[mind.changeling.chem_charges]/[mind.changeling.chem_storage]") + stat("Absorbed DNA", mind.changeling.absorbedcount) if (istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)&&wear_suit:s_initialized) stat("Energy Charge", (wear_suit:cell:charge)) @@ -539,8 +539,8 @@ if(id) return id.rank ? id.rank : if_no_job else - return if_no_id - + return if_no_id + //gets assignment from ID or ID inside PDA or PDA itself //Useful when player do something with computers /mob/living/carbon/human/proc/get_assignment(var/if_no_id = "No id", var/if_no_job = "No job") @@ -1073,6 +1073,21 @@ xylophone=0 return +/mob/living/carbon/human/can_inject(var/mob/user, var/error_msg, var/target_zone) + . = 1 // Default to returning true. + if(user && !target_zone) + target_zone = user.zone_sel.selecting + // If targeting the head, see if the head item is thin enough. + // If targeting anything else, see if the wear suit is thin enough. + if(above_neck(target_zone)) + if(head && head.flags & THICKMATERIAL) + . = 0 + else + if(wear_suit && wear_suit.flags & THICKMATERIAL) + . = 0 + if(!. && error_msg && user) + // Might need re-wording. + user << "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"]." /mob/living/carbon/human/proc/vomit(hairball=0) if(stat==2)return @@ -1301,7 +1316,7 @@ usr << "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]." /mob/living/carbon/human/proc/set_species(var/new_species, var/force_organs, var/default_colour) - + var/datum/species/oldspecies = species if(!dna) if(!new_species) @@ -1318,26 +1333,26 @@ if(species.language) remove_language(species.language) - + if(species.default_language) - remove_language(species.default_language) - + remove_language(species.default_language) + species = all_species[new_species] - + if(oldspecies) if(oldspecies.default_genes.len) oldspecies.handle_dna(src,1) // Remove any genes that belong to the old species if(force_organs || !organs || !organs.len) species.create_organs(src) - + if(vessel) vessel = null make_blood() if(species.language) add_language(species.language) - + if(species.default_language) add_language(species.default_language) @@ -1359,7 +1374,7 @@ r_skin = 0 g_skin = 0 b_skin = 0 - + if(!dna) dna = new /datum/dna(null) dna.species = species.name diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 47d551861ef..c805cd8a6d2 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -276,7 +276,7 @@ message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") verb = pick("whinnies","neighs", "says") handled = 1 - + if(dna) for(var/datum/dna/gene/gene in dna_genes) if(!gene.block) @@ -309,6 +309,8 @@ message = uppertext(message) verb = "yells loudly" + if(COMIC in mutations) + message = "[message]" returns[1] = message returns[2] = verb returns[3] = handled diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 8db3b6d6f59..1fa969883f0 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -596,7 +596,7 @@ proc/get_damage_icon_part(damage_state, body_part) if(FAT in mutations) if(w_uniform.flags&ONESIZEFITSALL) - standing.icon = 'icons/mob/uniforFAT.dmi' + standing.icon = 'icons/mob/uniform_fat.dmi' else src << "\red You burst out of \the [w_uniform]!" unEquip(w_uniform) @@ -1000,6 +1000,30 @@ proc/get_damage_icon_part(damage_state, body_part) update_icons() +/mob/living/carbon/human/proc/start_tail_wagging(var/update_icons=1) + overlays_standing[TAIL_LAYER] = null + + if(species.tail && species.bodyflags & HAS_TAIL) + var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]w_s") + tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + + overlays_standing[TAIL_LAYER] = image(tailw_s) + + if(update_icons) + update_icons() + +/mob/living/carbon/human/proc/stop_tail_wagging(var/update_icons=1) + overlays_standing[TAIL_LAYER] = null + + if(species.tail && species.bodyflags & HAS_TAIL) + var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s") + tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + + overlays_standing[TAIL_LAYER] = image(tail_s) + + if(update_icons) + update_icons() + //Adds a collar overlay above the helmet layer if the suit has one // Suit needs an identically named sprite in icons/mob/collar.dmi /mob/living/carbon/human/proc/update_collar(var/update_icons=1) diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 1e8f509978e..7693a1d1eb9 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -354,11 +354,15 @@ primitive = /mob/living/carbon/monkey/tajara flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT - bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR + bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING flesh_color = "#AFA59E" base_color = "#333333" +/datum/species/tajaran/handle_death(var/mob/living/carbon/human/H) + + H.stop_tail_wagging(1) + /datum/species/skrell name = "Skrell" icobase = 'icons/mob/human_races/r_skrell.dmi' diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index e83298a68eb..2ce2ab3022e 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -14,7 +14,7 @@ density = 1 req_access = list(access_engine, access_robotics) local_transmit = 1 - + // We need to keep track of a few module items so we don't need to do list operations // every time we need them. These get set in New() after the module is chosen. var/obj/item/stack/sheet/metal/cyborg/stack_metal = null @@ -25,12 +25,13 @@ //Used for self-mailing. var/mail_destination = 0 + var/sprite[0] /mob/living/silicon/robot/drone/New() ..() - + remove_language("Robot Talk") add_language("Drone Talk", 1) @@ -88,9 +89,83 @@ /mob/living/silicon/robot/drone/choose_icon() return + /mob/living/silicon/robot/drone/pick_module() return +//Drones can only use binary and say emotes. NOTHING else. +//TBD, fix up boilerplate. ~ Z +/mob/living/silicon/robot/drone/say(var/message) + if (!message) + return + + if (src.client) + if(client.prefs.muted & MUTE_IC) + src << "You cannot send IC messages (muted)." + return + if (src.client.handle_spam_prevention(message,MUTE_IC)) + return + + if (stat == 2) + message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) + return say_dead(message) + + //Must be concious to speak + if (stat) + return + + if(copytext(message,1,2) == "*") + return emote(copytext(message,2)) + + if (length(message) >= 2) + var/prefix = copytext(message, 1, 3) + if (department_radio_keys[prefix] == "drone") + message = copytext(message, 3) + message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) + + if(istype(src, /mob/living/silicon/robot/drone)) + var/mob/living/silicon/robot/drone/R = src + if(!R.is_component_functioning("comms")) + src << "\red Your drone communications component isn't functional." + return + drone_talk(message) + else + var/list/listeners = hearers(5,src) + listeners |= src + message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) + for(var/mob/living/silicon/D in listeners) + if(D.client) + D << "[src] transmits, \"[message]\"" + + for (var/mob/M in player_list) + if (!M.client) + continue + if (istype(M, /mob/new_player)) + continue + else if(M.stat == 2 && (M.client.prefs.toggles & CHAT_GHOSTEARS) && src.client) + M << "[src] (Follow) transmits, \"[message]\"" + else if(M.stat == 2 && src.client && M in listeners) + M << "[src] (Follow) transmits, \"[message]\"" + +/mob/living/proc/drone_talk(var/message) + log_say("[key_name(src)] : [message]") + message = trim(message) + + if (!message) + return + + var/message_a = say_quote(message) + var/rendered = "Drone Talk, [name] [message_a]" + + for (var/mob/living/S in living_mob_list) + if(istype(S, /mob/living/silicon/robot/drone)) + S.show_message(rendered, 2) + + for (var/mob/S in dead_mob_list) + if(!istype(S,/mob/new_player) && !istype(S,/mob/living/carbon/brain)) + var/rendered2 = "Drone Talk, [name] (Follow) [message_a]" + S.show_message(rendered2, 2) + //Drones cannot be upgraded with borg modules so we need to catch some items before they get used in ..(). /mob/living/silicon/robot/drone/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -137,12 +212,12 @@ return ..() - + /mob/living/silicon/robot/drone/emag_act(user as mob) if(!client || stat == 2) user << "\red There's not much point subverting this heap of junk." return - + if(!ishuman(user)) return var/mob/living/carbon/human/H = user @@ -273,6 +348,16 @@ src << "Don't invade their worksites, don't steal their resources, don't tell them about the changeling in the toilets." src << "If a crewmember has noticed you, you are probably breaking your first law." + sprite["Default"] = "repairbot" + sprite["Mk2 Mousedrone"] = "mk2" + sprite["Mk3 Monkeydrone"] = "mk3" + var/icontype + icontype = input(player,"Pick an icon") in sprite + icon_state = sprite[icontype] + updateicon() + + choose_icon(6,sprite) + /mob/living/silicon/robot/drone/Bump(atom/movable/AM as mob|obj, yes) if (!yes || ( \ !istype(AM,/obj/machinery/door) && \ diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 78fa731e685..0ac77e3d739 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -332,8 +332,7 @@ src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src) - src.modules += new /obj/item/weapon/gun/energy/printer(src) - src.modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi/cyborg(src) + src.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large/cyborg(src) src.modules += new /obj/item/weapon/card/emag(src) src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src) src.modules += new /obj/item/weapon/crowbar(src) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 1eb36aa0c19..9b46dbba82f 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -124,6 +124,11 @@ /mob/living/silicon/proc/damage_mob(var/brute = 0, var/fire = 0, var/tox = 0) return +/mob/living/silicon/can_inject(var/mob/user, var/error_msg) + if(error_msg) + user << "Their outer shell is too tough." + return 0 + /mob/living/silicon/IsAdvancedToolUser() return 1 @@ -207,7 +212,7 @@ show_emergency_shuttle_eta() show_system_integrity() show_malf_ai() - + //Silicon mob language procs /mob/living/silicon/can_speak(datum/language/speaking) @@ -290,7 +295,7 @@ set category = "IC" flavor_text = sanitize(copytext(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text, 1)) - + /mob/living/silicon/binarycheck() return 1 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f2f099f578a..be3b63ba2ab 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1340,4 +1340,4 @@ mob/proc/yank_out_object() if(G.mind == mind) if(G.can_reenter_corpse || even_if_they_cant_reenter) return G - break \ No newline at end of file + break diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 4c5a6d09372..74ebd7eeefc 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -213,6 +213,13 @@ proc/hassensorlevel(A, var/level) return zone +/proc/above_neck(zone) + var/list/zones = list("head", "mouth", "eyes") + if(zones.Find(zone)) + return 1 + else + return 0 + /proc/stars(n, pr) if (pr == null) pr = 25 @@ -491,4 +498,4 @@ var/list/intents = list("help","disarm","grab","harm") else // Everyone else (dead people who didn't ghost yet, etc.) lname = name lname = "[lname] " - M << "[lname][follow][message]" + M << "[lname][follow][message]" diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 3754199d222..d3a5dd1662a 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -261,7 +261,7 @@ datum/preferences var/icon/clothes_s = null var/uniform_dmi='icons/mob/uniform.dmi' if(disabilities&DISABILITY_FLAG_FAT) - uniform_dmi='icons/mob/uniforFAT.dmi' + uniform_dmi='icons/mob/uniform_fat.dmi' if(job_support_low & CIVILIAN)//This gives the preview icon clothes depending on which job(if any) is set to 'high' clothes_s = new /icon(uniform_dmi, "grey_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index 24bceb71e21..dc92c41d718 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -32,7 +32,7 @@ var/global/image/typing_indicator set_typing_indicator(1) hud_typing = 1 - var/message = input("","say (text)") as text + var/message = input("","say (text)") as null|text hud_typing = 0 set_typing_indicator(0) if(message) @@ -44,7 +44,7 @@ var/global/image/typing_indicator set_typing_indicator(1) hud_typing = 1 - var/message = input("","me (text)") as text + var/message = input("","me (text)") as null|text hud_typing = 0 set_typing_indicator(0) if(message) diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index d1de4684eb4..6d3b6ea8c21 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -8,7 +8,7 @@ var/list/alldepartments = list() icon = 'icons/obj/library.dmi' icon_state = "fax" insert_anim = "faxsend" - req_one_access = list(access_lawyer, access_heads, access_armory) + req_one_access = list(access_lawyer, access_heads, access_armory) use_power = 1 idle_power_usage = 30 @@ -31,7 +31,7 @@ var/list/alldepartments = list() /obj/machinery/photocopier/faxmachine/attack_hand(mob/user as mob) ui_interact(user) - + /obj/machinery/photocopier/faxmachine/attackby(obj/item/weapon/item, mob/user) if(istype(item,/obj/item/weapon/card/id) && !scan) scan(item) @@ -40,14 +40,14 @@ var/list/alldepartments = list() nanomanager.update_uis(src) else return ..() - + /obj/machinery/photocopier/faxmachine/emag_act(user as mob) if(!emagged) emagged = 1 user << "The transmitters realign to an unknown source!" else user << "You swipe the card through [src], but nothing happens." - + /obj/machinery/photocopier/faxmachine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] if(scan) @@ -74,23 +74,23 @@ var/list/alldepartments = list() else data["respectcooldown"] = 0 - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "faxmachine.tmpl", "Fax Machine UI", 540, 450) - ui.set_initial_data(data) + ui.set_initial_data(data) ui.open() /obj/machinery/photocopier/faxmachine/Topic(href, href_list) if(..()) return 1 - + if(href_list["send"]) if(copyitem && authenticated) if ((destination in admin_departments) || (destination in hidden_admin_departments)) send_admin_fax(usr, destination) else sendfax(destination,usr) - + if (sendcooldown) spawn(sendcooldown) // cooldown time sendcooldown = 0 @@ -121,7 +121,7 @@ var/list/alldepartments = list() if(emagged) combineddepartments += hidden_admin_departments destination = input(usr, "To which department?", "Choose a department", "") as null|anything in combineddepartments - if(!destination) + if(!destination) destination = lastdestination if(href_list["auth"]) @@ -130,21 +130,21 @@ var/list/alldepartments = list() authenticated = 1 else if(authenticated) authenticated = 0 - + if(href_list["rename"]) if(copyitem) var/n_name = sanitize(copytext(input(usr, "What would you like to label the fax?", "Fax Labelling", copyitem.name) as text, 1, MAX_MESSAGE_LEN)) if((copyitem && copyitem.loc == src && usr.stat == 0)) - if (istype(copyitem, /obj/item/weapon/paper)) - copyitem.name = "[(n_name ? text("[n_name]") : initial(copyitem.name))]" - copyitem.desc = "This is a paper titled '" + copyitem.name + "'." - else if(istype(copyitem, /obj/item/weapon/photo)) + if (istype(copyitem, /obj/item/weapon/paper)) + copyitem.name = "[(n_name ? text("[n_name]") : initial(copyitem.name))]" + copyitem.desc = "This is a paper titled '" + copyitem.name + "'." + else if(istype(copyitem, /obj/item/weapon/photo)) copyitem.name = "[(n_name ? text("[n_name]") : "photo")]" else if(istype(copyitem, /obj/item/weapon/paper_bundle)) - copyitem.name = "[(n_name ? text("[n_name]") : "paper")]" + copyitem.name = "[(n_name ? text("[n_name]") : "paper")]" nanomanager.update_uis(src) - + /obj/machinery/photocopier/faxmachine/proc/scan(var/obj/item/weapon/card/id/card = null) if(scan) // Card is in machine if(ishuman(usr)) @@ -172,14 +172,14 @@ var/list/alldepartments = list() /obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination,var/mob/sender) if(stat & (BROKEN|NOPOWER)) return - + use_power(200) - + var/success = 0 for(var/obj/machinery/photocopier/faxmachine/F in allfaxes) if( F.department == destination ) success = F.receivefax(copyitem) - + if (success) var/datum/fax/F = new /datum/fax() F.name = copyitem.name @@ -189,7 +189,7 @@ var/list/alldepartments = list() F.message = copyitem F.sent_by = sender F.sent_at = world.time - + visible_message("[src] beeps, \"Message transmitted successfully.\"") //sendcooldown = 600 else @@ -198,16 +198,16 @@ var/list/alldepartments = list() /obj/machinery/photocopier/faxmachine/proc/receivefax(var/obj/item/incoming) if(stat & (BROKEN|NOPOWER)) return 0 - + if(department == "Unknown") return 0 //You can't send faxes to "Unknown" flick("faxreceive", src) playsound(loc, "sound/items/polaroid1.ogg", 50, 1) - + // give the sprite some time to flick sleep(20) - + if (istype(incoming, /obj/item/weapon/paper)) copy(incoming) else if (istype(incoming, /obj/item/weapon/photo)) @@ -223,7 +223,7 @@ var/list/alldepartments = list() /obj/machinery/photocopier/faxmachine/proc/send_admin_fax(var/mob/sender, var/destination) if(stat & (BROKEN|NOPOWER)) return - + use_power(200) var/obj/item/rcvdcopy @@ -236,9 +236,9 @@ var/list/alldepartments = list() else visible_message("[src] beeps, \"Error transmitting message.\"") return - + rcvdcopy.loc = null //hopefully this shouldn't cause trouble - + var/datum/fax/admin/A = new /datum/fax/admin() A.name = rcvdcopy.name A.from_department = department @@ -247,7 +247,7 @@ var/list/alldepartments = list() A.message = rcvdcopy A.sent_by = sender A.sent_at = world.time - + //message badmins that a fax has arrived switch(destination) if ("Central Command") @@ -257,11 +257,11 @@ var/list/alldepartments = list() sendcooldown = 1800 sleep(50) visible_message("[src] beeps, \"Message transmitted successfully.\"") - + /obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/faxtype, var/obj/item/sent, font_colour="#006100") var/msg = "\blue [faxname]: [key_name(sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (REPLY): Receiving '[sent.name]' via secure connection... view message" for(var/client/C in admins) - if(R_ADMIN & C.holder.rights) + if(R_EVENT & C.holder.rights) C << msg diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 6c96b62a328..6a6ffdc2d55 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -18,8 +18,8 @@ slot_flags = SLOT_BELT | SLOT_EARS throwforce = 0 w_class = 1.0 - throw_speed = 7 - throw_range = 15 + throw_speed = 3 + throw_range = 7 m_amt = 10 var/colour = "black" //what colour the ink is! pressure_resistance = 2 @@ -41,72 +41,37 @@ colour = "white" -/obj/item/weapon/pen/attack(mob/M as mob, mob/user as mob) - if(!ismob(M)) +/obj/item/weapon/pen/attack(mob/living/M, mob/user) + if(!istype(M)) return - user << "You stab [M] with the pen." -// M << "\red You feel a tiny prick!" //That's a whole lot of meta! - M.attack_log += text("\[[time_stamp()]\] Has been stabbed with [name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [name] to stab [M.name] ([M.ckey])") - if(!iscarbon(user)) - M.LAssailant = null - else - M.LAssailant = user - return + if(M.can_inject(user, 1)) + user << "You stab [M] with the pen." +// M << "You feel a tiny prick!" + . = 1 + + add_logs(user, M, "stabbed", object="[name]") /* - * Sleepy Pens + * Sleepypens */ -/obj/item/weapon/pen/sleepypen - desc = "It's a black ink pen with a sharp point and a carefully engraved \"Waffle Co.\"" +/obj/item/weapon/pen/sleepy flags = OPENCONTAINER origin_tech = "materials=2;syndicate=5" -/obj/item/weapon/pen/sleepypen/New() - var/datum/reagents/R = new/datum/reagents(30) //Used to be 300 - reagents = R - R.my_atom = src - R.add_reagent("chloralhydrate", 22) //Used to be 100 sleep toxin//30 Chloral seems to be fatal, reducing it to 22./N +/obj/item/weapon/pen/sleepy/attack(mob/living/M, mob/user) + if(!istype(M)) return + + if(..()) + if(reagents.total_volume) + if(M.reagents) + reagents.trans_to(M, 55) + + +/obj/item/weapon/pen/sleepy/New() + create_reagents(55) + reagents.add_reagent("stoxin", 30) + reagents.add_reagent("mutetoxin", 15) + reagents.add_reagent("tirizene", 10) ..() - return - - -/obj/item/weapon/pen/sleepypen/attack(mob/M as mob, mob/user as mob) - if(!ismob(M)) - return - ..() - msg_admin_attack("[user.name] ([user.ckey]) Used the [name] to stab [M.name] ([M.ckey]) (JMP)") - if(reagents.total_volume) - if(M.reagents) reagents.trans_to(M, 50) //used to be 150 - return - - -/* - * Parapens - */ -/obj/item/weapon/pen/paralysis - flags = OPENCONTAINER - origin_tech = "materials=2;syndicate=5" - - -/obj/item/weapon/pen/paralysis/New() - var/datum/reagents/R = new/datum/reagents(55) - reagents = R - R.my_atom = src - R.add_reagent("stoxin", 30) - R.add_reagent("mutetoxin", 15) - R.add_reagent("tirizene", 10) - ..() - return - - -/obj/item/weapon/pen/paralysis/attack(mob/M as mob, mob/user as mob) - if(!ismob(M)) - return - ..() - msg_admin_attack("[user.name] ([user.ckey]) Used the [name] to stab [M.name] ([M.ckey]) (JMP)") - if(reagents.total_volume) - if(M.reagents) reagents.trans_to(M, 55) //used to be 150 - return \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 34d21554b07..bd1fcfe7db6 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -131,6 +131,11 @@ /obj/item/ammo_casing/shotgun/dart/attackby() return +/obj/item/ammo_casing/syringegun + name = "syringe gun spring" + desc = "A high-power spring that throws syringes." + projectile_type = null + /obj/item/ammo_casing/shotgun/fakebeanbag name = "beanbag shell" desc = "A weak beanbag shell." diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 9e333f5c82a..eaca720e21a 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -180,10 +180,10 @@ icon_state = "[initial(icon_state)]-[round(ammo_count(),10)]" /obj/item/ammo_box/magazine/m12g - name = "shotgun magazine (12g taser slugs)" - icon_state = "m12gs" + name = "shotgun magazine (12g buckshot)" + icon_state = "m12gb" + ammo_type = "/obj/item/ammo_casing/shotgun/buckshot" origin_tech = "combat=3;syndicate=1" - ammo_type = "/obj/item/ammo_casing/shotgun/stunslug" caliber = "shotgun" max_ammo = 8 @@ -192,10 +192,10 @@ icon_state = "[initial(icon_state)]-[Ceiling(ammo_count(0)/8)*8]" -/obj/item/ammo_box/magazine/m12g/buckshot - name = "shotgun magazine (12g buckshot)" - icon_state = "m12gb" - ammo_type = "/obj/item/ammo_casing/shotgun/buckshot" +/obj/item/ammo_box/magazine/m12g/stun + name = "shotgun magazine (12g taser slugs)" + icon_state = "m12gs" + ammo_type = "/obj/item/ammo_casing/shotgun/stunslug" /obj/item/ammo_box/magazine/m12g/dragon diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index b3bb07066e6..939304a4441 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -11,9 +11,8 @@ var/modifystate emp_act(severity) - power_supply.use(round(power_supply.maxcharge / severity)) + power_supply.use(round(power_supply.charge / severity)) update_icon() - ..() New() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index db58dedb0ea..c6dd42292d6 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -229,7 +229,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. projectile_type = "/obj/item/projectile/kinetic" fire_sound = 'sound/weapons/Kenetic_accel.ogg' charge_cost = 5000 - cell_type = "/obj/item/weapon/stock_parts/cell/crap" + cell_type = "/obj/item/weapon/stock_parts/cell/emproof" var/overheat = 0 var/recent_reload = 1 @@ -240,6 +240,9 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. recent_reload = 0 ..() +/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity) + return + /obj/item/weapon/gun/energy/kinetic_accelerator/attack_self(var/mob/living/user/L) if(overheat || recent_reload) return @@ -274,6 +277,11 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. silenced = 0 projectile_type = "/obj/item/projectile/energy/bolt/large" +/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large/cyborg + desc = "One and done!" + icon_state = "crossbowlarge" + origin_tech = null + m_amt = 0 /obj/item/weapon/gun/energy/disabler name = "disabler" diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index c45bb04a6b0..368ba27af2f 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -24,18 +24,24 @@ return -/obj/item/weapon/gun/projectile/process_chambered() +/obj/item/weapon/gun/projectile/process_chambered(var/eject_casing = 1, var/empty_chamber = 1) // if(in_chamber) // return 1 var/obj/item/ammo_casing/AC = chambered //Find chambered round if(isnull(AC) || !istype(AC)) return 0 - AC.loc = get_turf(src) //Eject casing onto ground. - AC.SpinAnimation(10, 1) //next gen special effects - chambered = null + if(eject_casing) + AC.loc = get_turf(src) //Eject casing onto ground. + AC.SpinAnimation(10, 1) //next gen special effects + if(empty_chamber) + chambered = null chamber_round() if(AC.BB) + if(AC.reagents && AC.BB.reagents) + var/datum/reagents/casting_reagents = AC.reagents + casting_reagents.trans_to(AC.BB, casting_reagents.total_volume) //For chemical darts/bullets + casting_reagents.delete() in_chamber = AC.BB //Load projectile into chamber. AC.BB.loc = src //Set projectile loc to gun. AC.update_icon() diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index d0dcee8fb2b..0e2c4d86611 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -12,18 +12,7 @@ return /obj/item/weapon/gun/projectile/revolver/process_chambered() - var/obj/item/ammo_casing/AC = chambered //Find chambered round - if(isnull(AC) || !istype(AC)) - return 0 - chambered = null - chamber_round() - if(AC.BB) - in_chamber = AC.BB //Load projectile into chamber. - AC.BB.loc = src //Set projectile loc to gun. - AC.BB = null - AC.update_icon() - return 1 - return 0 + return ..(0, 1) /obj/item/weapon/gun/projectile/revolver/attackby(var/obj/item/A as obj, mob/user as mob) var/num_loaded = 0 diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index a4c006512de..69ff0a8116a 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -36,21 +36,10 @@ /obj/item/weapon/gun/projectile/shotgun/process_chambered() - var/obj/item/ammo_casing/AC = chambered //Find chambered round - if(isnull(AC) || !istype(AC)) - return 0 - if(AC.BB) - if(AC.reagents && AC.BB.reagents) - var/datum/reagents/casting_reagents = AC.reagents - casting_reagents.trans_to(AC.BB, casting_reagents.total_volume) //For chemical darts - casting_reagents.delete() - in_chamber = AC.BB //Load projectile into chamber. - AC.BB.loc = src //Set projectile loc to gun. - AC.BB = null - AC.update_icon() - return 1 - return 0 + return ..(0, 0) +/obj/item/weapon/gun/projectile/shotgun/chamber_round() + return /obj/item/weapon/gun/projectile/shotgun/attack_self(mob/living/user as mob) if(recentpump) return diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index a7a02867871..af9d5338d42 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -75,7 +75,7 @@ proj_hit = 1 qdel(src) - proc/on_hit(var/atom/target, var/blocked = 0) + proc/on_hit(var/atom/target, var/blocked = 0, var/hit_zone) if(!isliving(target)) return 0 if(isanimal(target)) return 0 var/mob/living/L = target @@ -107,6 +107,12 @@ loc = A.loc return 0// nope.avi + var/reagent_note + if(reagents && reagents.reagent_list) + reagent_note = " REAGENTS:" + for(var/datum/reagent/R in reagents.reagent_list) + reagent_note += R.id + " (" + reagent_note += num2text(R.volume) + ") " //Lower accurancy/longer range tradeoff. Distance matters a lot here, so at // close distance, actually RAISE the chance to hit. var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. @@ -124,18 +130,18 @@ playsound(loc, hitsound, 20, 1, -1) visible_message("\red [A.name] is hit by the [src.name] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter if(istype(firer, /mob)) - M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type]" - firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type]" + M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type][reagent_note]" + firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type][reagent_note]" if(M.ckey && chatlog_attacks) - msg_admin_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src] (JMP)") //BS12 EDIT ALG + msg_admin_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src][reagent_note] (JMP)") //BS12 EDIT ALG if(!iscarbon(firer)) M.LAssailant = null else M.LAssailant = firer else - M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src]" + M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src][reagent_note]" if(M.ckey && chatlog_attacks) - msg_admin_attack("UNKNOWN shot [M] ([M.ckey]) with a [src] (JMP)") //BS12 EDIT ALG + msg_admin_attack("UNKNOWN shot [M] ([M.ckey]) with a [src][reagent_note] (JMP)") //BS12 EDIT ALG spawn(0) if(A) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 0c8fb7ec0fe..0cf1a336331 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -144,6 +144,8 @@ name = "dart" icon_state = "cbbolt" damage = 6 + embed = 0 + sharp = 0 New() ..() diff --git a/code/modules/reagents/dartgun.dm b/code/modules/reagents/dartgun.dm index 1381fa5b6d7..7760654c715 100644 --- a/code/modules/reagents/dartgun.dm +++ b/code/modules/reagents/dartgun.dm @@ -297,4 +297,17 @@ starting_chems = list("kelotane","bicaridine","anti_toxin") /obj/item/weapon/gun/dartgun/vox/raider - starting_chems = list("space_drugs","stoxin","impedrezene") \ No newline at end of file + starting_chems = list("space_drugs","stoxin","impedrezene") + +/obj/effect/syringe_gun_dummy //moved this shitty thing here + name = "" + desc = "" + icon = 'icons/obj/chemical.dmi' + icon_state = "null" + anchored = 1 + density = 0 + + New() + var/datum/reagents/R = new/datum/reagents(15) + reagents = R + R.my_atom = src \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 4d19e402f3d..e690f0ac52e 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -14,18 +14,19 @@ possible_transfer_amounts = list(1,2,3,4,5,10,15,20,25,30) flags = OPENCONTAINER slot_flags = SLOT_BELT + var/ignore_flags = 0 /obj/item/weapon/reagent_containers/hypospray/attack_paw(mob/user as mob) return src.attack_hand(user) -/obj/item/weapon/reagent_containers/hypospray/attack(mob/M as mob, mob/user as mob) +/obj/item/weapon/reagent_containers/hypospray/attack(mob/living/M, mob/user) if(!reagents.total_volume) user << "\red [src] is empty." return - if (!( istype(M, /mob) )) + if(!istype(M)) return - if (reagents.total_volume) + if(reagents.total_volume && (ignore_flags || M.can_inject(user, 1))) user << "\blue You inject [M] with [src]." M << "\red You feel a tiny prick!" @@ -61,6 +62,7 @@ possible_transfer_amounts = list(10) icon_state = "combat_hypo" volume = 60 + ignore_flags = 1 // So they can heal their comrades. /obj/item/weapon/reagent_containers/hypospray/combat/New() ..() @@ -75,6 +77,7 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = list(10) volume = 10 + ignore_flags = 1 //so you can medipen through hardsuits flags = null /obj/item/weapon/reagent_containers/hypospray/autoinjector/New() diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 79063ea4205..17ee7531069 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -55,6 +55,11 @@ if(!proximity) return if(!target.reagents) return + if(isliving(target)) + var/mob/living/M = target + if(!M.can_inject(user, 1)) + return + if(mode == SYRINGE_BROKEN) user << "\red This syringe is broken!" return diff --git a/code/modules/reagents/syringe_gun.dm b/code/modules/reagents/syringe_gun.dm index d869c2b4899..7192eaf1c12 100644 --- a/code/modules/reagents/syringe_gun.dm +++ b/code/modules/reagents/syringe_gun.dm @@ -1,136 +1,67 @@ - - - /obj/item/weapon/gun/syringe name = "syringe gun" - desc = "A spring loaded rifle designed to fit syringes, designed to incapacitate unruly patients from a distance." - icon = 'icons/obj/gun.dmi' + desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance." icon_state = "syringegun" item_state = "syringegun" - w_class = 3.0 + w_class = 3 throw_speed = 2 throw_range = 10 - force = 4.0 - var/list/syringes = new/list() - var/max_syringes = 1 + force = 4 m_amt = 2000 + clumsy_check = 0 + fire_sound = 'sound/items/syringeproj.ogg' + var/list/syringes = list() + var/max_syringes = 1 + +/obj/item/weapon/gun/syringe/process_chambered() + if(!syringes.len) return 0 + + var/obj/item/weapon/reagent_containers/syringe/S = syringes[1] + + if(!S) return 0 + + in_chamber = new /obj/item/projectile/bullet/dart/syringe(src) + S.reagents.trans_to(in_chamber, S.reagents.total_volume) + in_chamber.name = S.name + syringes.Remove(S) + + del(S) + return 1 /obj/item/weapon/gun/syringe/examine() - set src in view() ..() - if (!(usr in view(2)) && usr!=src.loc) return - usr << "\blue [syringes.len] / [max_syringes] syringes." + usr << "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining." + return -/obj/item/weapon/gun/syringe/attackby(obj/item/I as obj, mob/user as mob) - if(istype(I, /obj/item/weapon/reagent_containers/syringe)) - var/obj/item/weapon/reagent_containers/syringe/S = I - if(S.mode != 2)//SYRINGE_BROKEN in syringes.dm - if(syringes.len < max_syringes) - user.drop_item() - I.loc = src - syringes += I - user << "\blue You put the syringe in [src]." - user << "\blue [syringes.len] / [max_syringes] syringes." - else - usr << "\red [src] cannot hold more syringes." +/obj/item/weapon/gun/syringe/attack_self(mob/living/user as mob) + if(!syringes.len) + user << "[src] is empty." + return 0 + + var/obj/item/weapon/reagent_containers/syringe/S = syringes[syringes.len] + + if(!S) return 0 + S.loc = user.loc + + syringes.Remove(S) + user << "You unload [S] from \the [src]!" + + return 1 + +/obj/item/weapon/gun/syringe/attackby(var/obj/item/A as obj, mob/user as mob, var/show_msg = 1) + if(istype(A, /obj/item/weapon/reagent_containers/syringe)) + if(syringes.len < max_syringes) + user.drop_item() + user << "You load [A] into \the [src]!" + syringes.Add(A) + A.loc = src + return 1 else - usr << "\red This syringe is broken!" - - -/obj/item/weapon/gun/syringe/afterattack(obj/target, mob/user , flag) - if(!isturf(target.loc) || target == user) return - ..() - -/obj/item/weapon/gun/syringe/can_fire() - return syringes.len - -/obj/item/weapon/gun/syringe/can_hit(var/mob/living/target as mob, var/mob/living/user as mob) - return 1 //SHOOT AND LET THE GOD GUIDE IT (probably will hit a wall anyway) - -/obj/item/weapon/gun/syringe/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0) - if(syringes.len) - spawn(0) fire_syringe(target,user) - else - usr << "\red [src] is empty." - -/obj/item/weapon/gun/syringe/proc/fire_syringe(atom/target, mob/user) - if (locate (/obj/structure/table, src.loc)) - return - else - var/turf/trg = get_turf(target) - var/obj/effect/syringe_gun_dummy/D = new/obj/effect/syringe_gun_dummy(get_turf(src)) - var/obj/item/weapon/reagent_containers/syringe/S = syringes[1] - if((!S) || (!S.reagents)) //ho boy! wot runtimes! - return - S.reagents.trans_to(D, S.reagents.total_volume) - syringes -= S - del(S) - D.icon_state = "syringeproj" - D.name = "syringe" - playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1) - - for(var/i=0, i<6, i++) - if(!D) break - if(D.loc == trg) break - step_towards(D,trg) - - if(D) - for(var/mob/living/carbon/M in D.loc) - if(!istype(M,/mob/living/carbon)) continue - if(M == user) continue - //Syringe gun attack logging by Yvarov - var/R - if(D.reagents) - for(var/datum/reagent/A in D.reagents.reagent_list) - R += A.id + " (" - R += num2text(A.volume) + ")," - if (istype(M, /mob)) - M.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])" - user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])" - if(M.ckey) - msg_admin_attack("[user] ([user.ckey]) shot [M] ([M.ckey]) with a syringegun ([R]) (JMP)") - if(!iscarbon(user)) - M.LAssailant = null - else - M.LAssailant = user - - else - M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a syringegun ([R])" - msg_admin_attack("UNKNOWN shot [M] ([M.ckey]) with a syringegun ([R]) (JMP)") - - if(D.reagents) - D.reagents.trans_to(M, 15) - M.visible_message("[M] is hit by the syringe!") - - del(D) - break - if(D) - for(var/atom/A in D.loc) - if(A == user) continue - if(A.density) del(D) - - sleep(1) - - if (D) spawn(10) del(D) - - return + usr << "[src] cannot hold more syringes." + return 0 /obj/item/weapon/gun/syringe/rapidsyringe name = "rapid syringe gun" - desc = "A modification of the syringe gun design, using a rotating cylinder to store up to four syringes." + desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes." icon_state = "rapidsyringegun" - max_syringes = 4 - - -/obj/effect/syringe_gun_dummy - name = "" - desc = "" - icon = 'icons/obj/chemical.dmi' - icon_state = "null" - anchored = 1 - density = 0 - - New() - var/datum/reagents/R = new/datum/reagents(15) - reagents = R - R.my_atom = src \ No newline at end of file + max_syringes = 6 \ No newline at end of file diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/research/xenoarchaeology/finds/finds.dm index 6b07fbb16a9..f657b006ccf 100644 --- a/code/modules/research/xenoarchaeology/finds/finds.dm +++ b/code/modules/research/xenoarchaeology/finds/finds.dm @@ -250,7 +250,7 @@ if(prob(75)) new_item = new /obj/item/weapon/pen(src.loc) else - new_item = new /obj/item/weapon/pen/sleepypen(src.loc) + new_item = new /obj/item/weapon/pen/sleepy(src.loc) if(prob(30)) apply_image_decorations = 1 if(16) diff --git a/code/setup.dm b/code/setup.dm index fccb9aee1b4..925bb130761 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -216,6 +216,7 @@ var/MAX_EX_FLASH_RANGE = 14 #define HEADBANGPROTECT 4096 #define EARBANGPROTECT 1024 +#define THICKMATERIAL 1024 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with NOSLIP) #define NOSLIP 1024 //prevents from slipping on wet floors, in space etc #define OPENCONTAINER 4096 // is an open container for chemistry purposes @@ -404,10 +405,11 @@ var/MAX_EX_FLASH_RANGE = 14 #define PSY_RESIST 204 // Block remoteview #define SUPER_FART 205 // Duh #define EMPATH 206 //Read minds +#define COMIC 207 //Comic Sans // /vg/ muts #define LOUD 208 // CAUSES INTENSE YELLING -#define WHISPER 209 // causes quiet whispering +//#define WHISPER 209 // causes quiet whispering #define DIZZY 210 // Trippy. //disabilities @@ -843,6 +845,7 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse #define HAS_TAIL 8 #define HAS_SKIN_TONE 16 #define HAS_SKIN_COLOR 32 +#define TAIL_WAGGING 64 //Language flags. #define WHITELISTED 1 // Language is available if the speaker is whitelisted. diff --git a/code/stylesheet.dm b/code/stylesheet.dm index b7111e1e5a1..9752c68e886 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -77,8 +77,10 @@ h1.alert, h2.alert {color: #000000;} .trinary {color: #727272;} .kidan {color: #664205;} .slime {color: #0077AA;} +.clown {color: #ff0000;} .rough {font-family: "Trebuchet MS", cursive, sans-serif;} .say_quote {font-family: Georgia, Verdana, sans-serif;} +.sans {font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .say_quote {font-family: Georgia, Verdana, sans-serif;} diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi index d5405066ab9..a4562fd8d75 100644 Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ diff --git a/icons/misc/fullscreen.dmi b/icons/misc/fullscreen.dmi index ec847597fd2..6f9e7d29635 100644 Binary files a/icons/misc/fullscreen.dmi and b/icons/misc/fullscreen.dmi differ diff --git a/icons/misc/fullscreen_544.dmi b/icons/misc/fullscreen_544.dmi new file mode 100644 index 00000000000..ec847597fd2 Binary files /dev/null and b/icons/misc/fullscreen_544.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 944bd928e1e..84fca7e8f90 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index f0ddc3b8170..39053002542 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index b111df54f9d..520624e3903 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index e0e70b2736a..584ee26023e 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index dd1bcd3e70f..d2eafbe18e3 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 943095ad7b0..7fd23898498 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index 52f9a07309c..43b7d523b66 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -581,7 +581,7 @@ macro "macro" is-disabled = false elem name = "F3" - command = "say" + command = ".say" is-disabled = false elem name = "F4" @@ -783,7 +783,7 @@ macro "hotkeymode" is-disabled = false elem name = "T" - command = "say" + command = ".say" is-disabled = false elem "w_key" name = "W+REP" @@ -839,7 +839,7 @@ macro "hotkeymode" is-disabled = false elem name = "F3" - command = "say" + command = ".say" is-disabled = false elem name = "F4" diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm index 10a846a3a90..6cb4b27d292 100644 --- a/maps/cyberiad.dmm +++ b/maps/cyberiad.dmm @@ -9059,7 +9059,7 @@ "dsk" = (/obj/item/weapon/storage/box/syringes,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/gun/syringe/rapidsyringe,/obj/item/weapon/reagent_containers/spray/chemsprayer,/obj/structure/closet,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) "dsl" = (/turf/space,/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) "dsm" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/pistol,/obj/item/weapon/gun/projectile/automatic/pistol{pixel_x = 3; pixel_y = -3},/obj/item/weapon/suppressor,/obj/item/weapon/suppressor{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"dsn" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m12g,/obj/item/ammo_box/magazine/m12g,/obj/item/ammo_box/magazine/m12g/buckshot,/obj/item/ammo_box/magazine/m12g/buckshot,/obj/item/ammo_box/magazine/m12g/dragon,/obj/item/ammo_box/magazine/m12g/dragon,/obj/item/weapon/gun/projectile/automatic/bulldog,/obj/item/weapon/gun/projectile/automatic/bulldog{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"dsn" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m12g,/obj/item/ammo_box/magazine/m12g,/obj/item/ammo_box/magazine/m12g/stun,/obj/item/ammo_box/magazine/m12g/stun,/obj/item/ammo_box/magazine/m12g/dragon,/obj/item/ammo_box/magazine/m12g/dragon,/obj/item/weapon/gun/projectile/automatic/bulldog,/obj/item/weapon/gun/projectile/automatic/bulldog{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) "dso" = (/obj/structure/rack,/obj/item/ammo_box/magazine/smgm45,/obj/item/ammo_box/magazine/smgm45,/obj/item/ammo_box/magazine/smgm45,/obj/item/ammo_box/magazine/smgm45,/obj/item/ammo_box/magazine/smgm45,/obj/item/ammo_box/magazine/smgm45,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) "dsp" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/weapon/gun/projectile/automatic/gyropistol,/obj/item/weapon/gun/projectile/automatic/gyropistol{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) "dsq" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/weapon/gun/projectile/automatic/deagle,/obj/item/weapon/gun/projectile/automatic/deagle{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)