diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index ca41668e53a..c77ea003196 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -122,6 +122,15 @@ var/list/uplink_items = list() cost = 5 job = list("Clown") +//mime +/datum/uplink_item/job_specific/caneshotgun + name = "Cane Shotgun + Assassination Darts" + desc = "A specialized, one shell shotgun with a built-in cloaking device to mimic a cane. The shotgun is capable of hiding it's contents and the pin alongside being supressed. Comes with 6 special darts and a preloaded shrapnel round." + reference = "MCS" + item = /obj/item/weapon/storage/box/syndie_kit/caneshotgun + cost = 15 + job = list("Mime") + //Chef /datum/uplink_item/jobspecific/specialsauce name = "Chef Excellence's Special Sauce" @@ -238,6 +247,45 @@ var/list/uplink_items = list() cost = 12 job = list("Research Director") +//Librarian +/datum/uplink_item/jobspecific/etwenty + name = "The E20" + desc = "A seemingly innocent die, those who are not afraid to roll for attack will find it's effects quite explosive. Has a four second timer." + reference = "ETW" + item = /obj/item/weapon/dice/d20/e20 + cost = 3 + job = list("Librarian") + + +//Botanist +/datum/uplink_item/jobspecific/ambrosiacruciatus + name = "Ambrosia Cruciatus Seeds" + desc = "Part of the notorious Ambrosia family, this species is nearly indistinguishable from Ambrosia Vulgaris- but its' branches contain a revolting toxin. Eight units are enough to drive victims insane." + reference = "BRO" + item = /obj/item/seeds/ambrosiavulgarisseed/cruciatus + cost = 2 + job = list("Botanist") + + +//Chemist + +/datum/uplink_item/jobspecific/antisocial + name = "Explosive Hug Chemical" + desc = "30 units of Bicarodyne, a chemical that causes a devastating explosion when exposed to endorphins released in the body by a hug. Metabolizes quite slowly." + reference = "HUG" + item = /obj/item/weapon/storage/box/syndie_kit/explosive_hug //Had to be put in a box because it didn't play well with reagent creation + cost = 4 + job = list("Chemist", "Chief Medical Officer") + +//Atmos Tech +/datum/uplink_item/jobspecific/contortionist + name = "Contortionist's Jumpsuit" + desc = "A highly flexible jumpsuit that will help you navigate the ventilation loops of the station internally. Comes with pockets and ID slot, but can't be used without stripping off most gear, including backpack, belt, helmet, and exosuit. Free hands are also necessary to crawl around inside." + reference = "AIRJ" + item = /obj/item/clothing/under/contortionist + cost = 6 + job = list("Atmospheric Technician") + //Stimulants /datum/uplink_item/jobspecific/stims @@ -448,6 +496,15 @@ var/list/uplink_items = list() excludefrom = list(/datum/game_mode/nuclear) cost = 12 +/datum/uplink_item/dangerous/sniper + name = "Sniper Rifle" + desc = "Ranged fury, syndicate style. guaranteed to cause shock and awe or your TC back!" + item = /obj/item/weapon/gun/projectile/sniper_rifle/syndicate + cost = 16 + reference = "SNIPE" + gamemodes = list(/datum/game_mode/nuclear) + surplus = 25 + // Ammunition /datum/uplink_item/ammo @@ -541,6 +598,36 @@ var/list/uplink_items = list() gamemodes = list(/datum/game_mode/nuclear) surplus = 0 +/datum/uplink_item/ammo/sniper + name = "Sniper Magazine - .50" + desc = "An additional 6-round .50 magazine for use in the syndicate sniper rifle." + item = /obj/item/ammo_box/magazine/sniper_rounds + cost = 4 //70dmg rounds are no joke + gamemodes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/ammo/sniper/soporific + name = "Sniper Magazine - Soporific Rounds" + desc = "A 3-round magazine of soporific ammo designed for use in the syndicate sniper rifle, put your enemies to sleep today!" + item = /obj/item/ammo_box/magazine/sniper_rounds/soporific + cost = 6 + +/datum/uplink_item/ammo/sniper/haemorrhage + name = "Sniper Magazine - Haemorrhage Rounds" + desc = "A 5-round magazine of haemorrhage ammo designed for use in the syndicate sniper rifle, causes heavy bleeding in the target." + item = /obj/item/ammo_box/magazine/sniper_rounds/haemorrhage + +/datum/uplink_item/ammo/sniper/penetrator + name = "Sniper Magazine - Penetrator Rounds" + desc = "A 5-round magazine of penetrator ammo designed for use in the syndicate sniper rifle. Can pierce walls and multiple enemies." + item = /obj/item/ammo_box/magazine/sniper_rounds/penetrator + cost = 5 + +/datum/uplink_item/ammo/sniper/accelerator + name = "Sniper Magazine - Accelerator Rounds" + desc = "A 5-round magazine of accelerator ammo designed for use in the syndicate sniper rifle. The shot is weak at close range, but gains more power the farther it flies." + item = /obj/item/ammo_box/magazine/sniper_rounds/accelerator + cost = 4 + // STEALTHY WEAPONS /datum/uplink_item/stealthy_weapons diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index 1378bdf7f69..210edd98c98 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -282,6 +282,7 @@ H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_or_collect(new /obj/item/toy/crayon/mime(H), slot_in_backpack) H.equip_or_collect(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_in_backpack) + H.equip_or_collect(new /obj/item/weapon/cane(H), slot_in_backpack) if(H.mind) H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null)) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index bea51ec4452..24fe5ebd97c 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -53,6 +53,9 @@ icon_state = "d20" sides = 20 +/obj/item/weapon/dice/d20/e20 + var/triggered = 0 + /obj/item/weapon/dice/attack_self(mob/user as mob) diceroll(user) @@ -84,6 +87,27 @@ H.apply_damage(4,BRUTE,(pick("l_leg", "r_leg"))) H.Weaken(3) *///ew. + + +/obj/item/weapon/dice/d20/e20/diceroll(mob/user as mob, thrown) + if(triggered) return + ..() + if(result == 1) + to_chat(user, "Rocks fall, you die.") + user.gib() + else + triggered = 1 + visible_message("You hear a quiet click.") + spawn(40) + var/cap = 0 + if(result > MAX_EX_LIGHT_RANGE && result != 20) + cap = 1 + result = min(result, MAX_EX_LIGHT_RANGE) //Apply the bombcap + else if(result == 20) //Roll a nat 20, screw the bombcap + result = 24 + var/turf/epicenter = get_turf(src) + explosion(epicenter, round(result*0.25), round(result*0.5), round(result), round(result*1.5), 1, cap) + /obj/item/weapon/dice/update_icon() overlays.Cut() overlays += "[src.icon_state][src.result]" diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 1ba5a6cb1d8..8c20759786b 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -172,4 +172,27 @@ new /obj/item/weapon/reagent_containers/syringe/bioterror(src) new /obj/item/weapon/reagent_containers/syringe/bioterror(src) new /obj/item/weapon/reagent_containers/syringe/bioterror(src) - return \ No newline at end of file + return + +/obj/item/weapon/storage/box/syndie_kit/caneshotgun + name = "cane gun kit" + + +/obj/item/weapon/storage/box/syndie_kit/caneshotgun/New() + ..() + new /obj/item/ammo_casing/shotgun/dart/assassination(src) + new /obj/item/ammo_casing/shotgun/dart/assassination(src) + new /obj/item/ammo_casing/shotgun/dart/assassination(src) + new /obj/item/ammo_casing/shotgun/dart/assassination(src) + new /obj/item/ammo_casing/shotgun/dart/assassination(src) + new /obj/item/ammo_casing/shotgun/dart/assassination(src) + new /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane(src) + +/obj/item/weapon/storage/box/syndie_kit/explosive_hug + name = "box" + +/obj/item/weapon/storage/box/syndie_kit/explosive_hug/New() + ..() + new /obj/item/weapon/reagent_containers/glass/bottle/antisocial(src) + new /obj/item/weapon/reagent_containers/syringe(src) + return \ No newline at end of file diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 59e9f96f95d..cb947519818 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -683,3 +683,19 @@ icon_state = "noble_clothes" item_color = "noble_clothes" item_state = "noble_clothes" + +/obj/item/clothing/under/contortionist + name = "Contortionist's Jumpsuit" + desc = "A light jumpsuit useful for squeezing through narrow vents." + icon_state = "atmos" + item_state = "atmos_suit" + item_color = "atmos" + +/obj/item/clothing/under/contortionist/proc/check_clothing(mob/user as mob) + //Allowed to wear: glasses, shoes, gloves, pockets, mask, and jumpsuit (obviously) + var/list/slot_must_be_empty = list(slot_back,slot_handcuffed,slot_legcuffed,slot_l_hand,slot_r_hand,slot_belt,slot_head,slot_wear_suit) + for(var/slot_id in slot_must_be_empty) + if(user.get_item_by_slot(slot_id)) + user << "You can't fit inside while wearing that \the [user.get_item_by_slot(slot_id)]." + return 0 + return 1 diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index e98c815a0f2..beadb53c4af 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -367,6 +367,26 @@ ..() set_trait(TRAIT_RARITY,40) +/datum/seed/ambrosia/cruciatus + name = "ambrosia" + seed_name = "ambrosia vulgaris" + display_name = "ambrosia vulgaris" + mutants = null + chems = list("plantmatter" = list(1), "thc" = list(1,8), "silver_sulfadiazine" = list(1,8,1), "styptic_powder" = list(1,10,1), "bath salts" = list(10)) + kitchen_tag = "ambrosia" + preset_icon = "ambrosiavulgaris" + +/datum/seed/ambrosia/cruciatus/New() + ..() + set_trait(TRAIT_HARVEST_REPEAT,1) + set_trait(TRAIT_MATURATION,6) + set_trait(TRAIT_PRODUCTION,6) + set_trait(TRAIT_YIELD,6) + set_trait(TRAIT_POTENCY,10) + set_trait(TRAIT_PRODUCT_ICON,"ambrosia") + set_trait(TRAIT_PRODUCT_COLOUR,"#9FAD55") + set_trait(TRAIT_PLANT_ICON,"ambrosia") + //Tobacco/varieties /datum/seed/tobacco name = "tobacco" diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index 2649b04c3e4..c97238b490d 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -221,6 +221,9 @@ var/global/list/plant_seed_sprites = list() /obj/item/seeds/ambrosiadeusseed seed_type = "ambrosiadeus" +/obj/item/seeds/ambrosiavulgarisseed/cruciatus + seed_type = "ambrosia" + /obj/item/seeds/whitebeetseed seed_type = "whitebeet" diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 117cf33ff52..f9023a97dd3 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -149,7 +149,7 @@ winset(src, "mapwindow.map", "icon-size=[src.reset_stretch]") viewingCanvas = 0 mob.reset_view() - if(mob.hud_used) + if(mob.hud_used) mob.hud_used.show_hud(HUD_STYLE_STANDARD) if(mob.control_object) Move_object(direct) @@ -181,12 +181,6 @@ if(L.incorporeal_move)//Move though walls Process_Incorpmove(direct) return - if(mob.client) - if(mob.client.view != world.view) - if(locate(/obj/item/weapon/gun/energy/sniperrifle, mob.contents)) // If mob moves while zoomed in with sniper rifle, unzoom them. - var/obj/item/weapon/gun/energy/sniperrifle/s = locate() in mob - if(s.zoom) - s.zoom() if(Process_Grab()) return diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index e337742549a..ea8d3f586d0 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -294,3 +294,11 @@ desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up." projectile_type = "/obj/item/projectile/bullet/reusable/foam_dart/riot" icon_state = "foamdart_riot" + +/obj/item/ammo_casing/shotgun/dart/assassination + desc = "A specialist shotgun dart designed to inncapacitate and kill the target over time, so you can get very far away from your target" + +/obj/item/ammo_casing/shotgun/dart/assassination/New() + ..() + reagents.add_reagent("neurotoxin", 6) + reagents.add_reagent("lexorin", 6) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index edb281616d2..e1590c47db4 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -50,6 +50,12 @@ var/burst_size = 1 + //Zooming + var/zoomable = FALSE //whether the gun generates a Zoom action on creation + var/zoomed = FALSE //Zoom toggle + var/zoom_amt = 3 //Distance in TURFs to move the user's screen forward (the "zoom" effect) + var/datum/action/toggle_scope_zoom/azoom + proc/ready_to_fire() if(world.time >= last_fired + fire_delay) last_fired = world.time @@ -81,6 +87,20 @@ proj.silenced = silenced return +/obj/item/weapon/gun/energy/New() + build_zooming() + +/obj/item/weapon/gun/pickup(mob/user) + + if(azoom) + azoom.Grant(user) + +/obj/item/weapon/gun/dropped(mob/user) + + zoom(user,FALSE) + if(azoom) + azoom.Remove(user) + /obj/item/weapon/gun/afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) if(flag) return //we're placing gun on a table or in backpack if(istype(target, /obj/machinery/recharger) && istype(src, /obj/item/weapon/gun/energy)) return//Shouldnt flag take care of this? @@ -381,3 +401,68 @@ else set_light(0) return + +///////////// +// ZOOMING // +///////////// + +/datum/action/toggle_scope_zoom + name = "Toggle Scope" + check_flags = AB_CHECK_ALIVE|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING + button_icon_state = "sniper_zoom" + var/obj/item/weapon/gun/gun = null + +/datum/action/toggle_scope_zoom/Trigger() + gun.zoom(owner) + +/datum/action/toggle_scope_zoom/IsAvailable() + . = ..() + if(!. && gun) + gun.zoom(owner, FALSE) + +/datum/action/toggle_scope_zoom/Remove(mob/living/L) + gun.zoom(L, FALSE) + ..() + + + +/obj/item/weapon/gun/proc/zoom(mob/living/user, forced_zoom) + if(!user || !user.client) + return + + switch(forced_zoom) + if(FALSE) + zoomed = FALSE + if(TRUE) + zoomed = TRUE + else + zoomed = !zoomed + + if(zoomed) + var/_x = 0 + var/_y = 0 + switch(user.dir) + if(NORTH) + _y = zoom_amt + if(EAST) + _x = zoom_amt + if(SOUTH) + _y = -zoom_amt + if(WEST) + _x = -zoom_amt + + user.client.pixel_x = world.icon_size*_x + user.client.pixel_y = world.icon_size*_y + else + user.client.pixel_x = 0 + user.client.pixel_y = 0 + + +//Proc, so that gun accessories/scopes/etc. can easily add zooming. +/obj/item/weapon/gun/proc/build_zooming() + if(azoom) + return + + if(zoomable) + azoom = new() + azoom.gun = src diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 6f92bc79fca..215749f553a 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -156,41 +156,8 @@ obj/item/weapon/gun/energy/staff/focus charge_cost = 2500 fire_delay = 50 w_class = 4.0 - var/zoom = 0 - -/obj/item/weapon/gun/energy/sniperrifle/dropped(mob/user) - user.client.view = world.view - - - -/* -This is called from -modules/mob/mob_movement.dm if you move you will be zoomed out -modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. -*/ - -/obj/item/weapon/gun/energy/sniperrifle/verb/zoom() - set category = "Object" - set name = "Use Sniper Scope" - set popup_menu = 0 - if(usr.stat || !(istype(usr,/mob/living/carbon/human))) - to_chat(usr, "You are unable to focus down the scope of the rifle.") - return - if(!zoom && usr.get_active_hand() != src) - to_chat(usr, "You are too distracted to look down the scope, perhaps if it was in your active hand this might work better") - return - - if(usr.client.view == world.view) - if(usr.hud_used) - usr.hud_used.show_hud(HUD_STYLE_NOHUD) - usr.client.view = 12 - zoom = 1 - else - usr.client.view = world.view - if(usr.hud_used) - usr.hud_used.show_hud(HUD_STYLE_STANDARD) - zoom = 0 - to_chat(usr, "Zoom mode [zoom?"en":"dis"]abled.") + zoomable = TRUE + zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. /obj/item/weapon/gun/energy/kinetic_accelerator diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 90402f0e57c..d524123375f 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -314,4 +314,30 @@ icon_state = "cshotgun" origin_tech = "combat=5;materials=2" mag_type = "/obj/item/ammo_box/magazine/internal/shotcom" - w_class = 5 \ No newline at end of file + w_class = 5 + +//caneshotgun + +/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane + name = "cane" + desc = "A cane used by a true gentlemen. Or a clown." + icon = 'icons/obj/weapons.dmi' + icon_state = "cane" + item_state = "stick" + sawn_state = SAWN_OFF + w_class = 2 + force = 10 + can_unsuppress = 0 + slot_flags = null + origin_tech = "" // NO GIVAWAYS + mag_type = "/obj/item/ammo_box/magazine/internal/cylinder/improvised" + sawn_desc = "I'm sorry, but why did you saw your cane in the first place?" + attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed") + fire_sound = 'sound/weapons/Gunshot_silenced.ogg' + silenced = 1 + needs_permit = 0 //its just a cane beepsky..... + +/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane/attackby(obj/item/A, mob/user, params) + ..() + if(istype(A, /obj/item/stack/cable_coil)) + return \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm new file mode 100644 index 00000000000..180862441f1 --- /dev/null +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -0,0 +1,178 @@ +/obj/item/weapon/gun/projectile/sniper_rifle + name = "sniper rifle" + desc = "the kind of gun that will leave you crying for mummy before you even realise your leg's missing" + icon_state = "snipertg" + item_state = "snipertg" + recoil = 2 + heavy_weapon = 1 + mag_type = "/obj/item/ammo_box/magazine/sniper_rounds" + fire_delay = 40 + origin_tech = "combat=8" + can_unsuppress = 1 + can_suppress = 1 + w_class = 3 + zoomable = TRUE + zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. + slot_flags = SLOT_BACK + +/obj/item/weapon/gun/projectile/sniper_rifle/update_icon() + if(magazine) + icon_state = "sniper-mag" + else + icon_state = "snipertg" + +/obj/item/weapon/gun/projectile/sniper_rifle/syndicate + name = "syndicate sniper rifle" + desc = "Syndicate flavoured sniper rifle, it packs quite a punch, a punch to your face" + origin_tech = "combat=8;illigal=4" + +//Normal Boolets +/obj/item/ammo_box/magazine/sniper_rounds + name = "sniper rounds (.50)" + icon_state = ".50mag" + origin_tech = "combat=6;illigal=2" + ammo_type = /obj/item/ammo_casing/point50 + max_ammo = 6 + caliber = ".50" + +/obj/item/ammo_casing/point50 + desc = "A .50 bullet casing." + caliber = ".50" + projectile_type = /obj/item/projectile/bullet/sniper + icon_state = ".50" + +/obj/item/ammo_box/magazine/sniper_rounds/update_icon() + if(ammo_count()) + icon_state = "[initial(icon_state)]-ammo" + else + icon_state = "[initial(icon_state)]" + +/obj/item/projectile/bullet/sniper + damage = 70 + stun = 5 + weaken = 5 + armour_penetration = 50 + var/breakthings = TRUE + +/obj/item/projectile/bullet/sniper/on_hit(atom/target, blocked = 0, hit_zone) + if((blocked != 100) && (!ismob(target) && breakthings)) + target.ex_act(rand(1,2)) + + return ..() + + +//Sleepy ammo +/obj/item/ammo_box/magazine/sniper_rounds/soporific + name = "sniper rounds (Zzzzz)" + desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..." + icon_state = "soporific" + origin_tech = "combat=6;illigal=3" + ammo_type = /obj/item/ammo_casing/soporific + max_ammo = 3 + caliber = ".50" + icon_state = ".50" + +/obj/item/ammo_casing/soporific + desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell." + caliber = ".50" + projectile_type = /obj/item/projectile/bullet/sniper/soporific + +/obj/item/projectile/bullet/sniper/soporific + nodamage = 1 + stun = 0 + weaken = 0 + armour_penetration = 0 + breakthings = FALSE + +/obj/item/projectile/bullet/sniper/soporific/on_hit(atom/target, blocked = 0, hit_zone) + if((blocked != 100) && istype(target, /mob/living)) + var/mob/living/L = target + L.SetSleeping(20) + + return ..() + + + +//hemorrhage ammo +/obj/item/ammo_box/magazine/sniper_rounds/haemorrhage + name = "sniper rounds (Bleed)" + desc = "Haemorrhage sniper rounds, leaves your target in a pool of crimson pain" + icon_state = "haemorrhage" + origin_tech = "combat=7;syndicate=5" + ammo_type = /obj/item/ammo_casing/haemorrhage + max_ammo = 5 + caliber = ".50" + icon_state = ".50" + +/obj/item/ammo_casing/haemorrhage + desc = "A .50 bullet casing, specialised in causing massive bloodloss" + caliber = ".50" + projectile_type = /obj/item/projectile/bullet/sniper/haemorrhage + +/obj/item/projectile/bullet/sniper/haemorrhage + damage = 15 + stun = 0 + weaken = 0 + breakthings = FALSE + armour_penetration = 15 + +/obj/item/projectile/bullet/sniper/haemorrhage/on_hit(atom/target, blocked = 0, hit_zone) + if((blocked != 100) && istype(target, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = target + H.drip(100) + + return ..() + +//penetrator ammo +/obj/item/ammo_box/magazine/sniper_rounds/penetrator + name = "sniper rounds (penetrator)" + desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it." + ammo_type = /obj/item/ammo_casing/penetrator + max_ammo = 5 + +/obj/item/ammo_casing/penetrator + desc = "A .50 caliber penetrator round casing." + caliber = ".50" + projectile_type = /obj/item/projectile/bullet/sniper/penetrator + icon_state = ".50" + +/obj/item/projectile/bullet/sniper/penetrator + icon_state = "gauss" + name = "penetrator round" + damage = 60 + forcedodge = 1 + stun = 0 + weaken = 0 + breakthings = FALSE + + +//Accelerator ammo + +/obj/item/ammo_box/magazine/sniper_rounds/accelerator + name = "sniper rounds (accelerator)" + desc = "An advanced round which gains more power the farther it flies." + ammo_type = /obj/item/ammo_casing/accelerator + max_ammo = 5 + +/obj/item/ammo_casing/accelerator + desc = "A .50 caliber accelerator round casing." + caliber = ".50" + projectile_type = /obj/item/projectile/bullet/sniper/accelerator + icon_state = ".50" + +/obj/item/projectile/bullet/sniper/accelerator + icon_state = "gaussweak" + name = "accelerator round" + damage = 5 + stun = 0 + weaken = 0 + breakthings = FALSE + +/obj/item/projectile/bullet/sniper/accelerator/Range() + ..() + damage += 5 + if(damage > 40) + icon_state = "gaussstrong" + breakthings = TRUE + else if(damage > 25) + icon_state = "gauss" \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm index dc4dbbfbd90..5b75f6aabf7 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm @@ -1,76 +1,88 @@ //Anything for harm or hostile intents go here (explosions, EMPs, thermite, mutagen) -/datum/chemical_reaction +/datum/chemical_reaction/explosion_potassium + name = "Explosion" + id = "explosion_potassium" + result = null + required_reagents = list("water" = 1, "potassium" = 1) + result_amount = 2 + mix_message = "The mixture explodes!" - explosion_potassium - name = "Explosion" - id = "explosion_potassium" - result = null - required_reagents = list("water" = 1, "potassium" = 1) - result_amount = 2 - mix_message = "The mixture explodes!" +/datum/chemical_reaction/explosion_potassium/on_reaction(var/datum/reagents/holder, var/created_volume) + var/datum/effect/system/reagents_explosion/e = new() + e.set_up(round (created_volume/10, 1), holder.my_atom, 0, 0) + e.start() + holder.clear_reagents() + return - on_reaction(var/datum/reagents/holder, var/created_volume) - var/datum/effect/system/reagents_explosion/e = new() - e.set_up(round (created_volume/10, 1), holder.my_atom, 0, 0) - e.start() - holder.clear_reagents() - return +/datum/chemical_reaction/emp_pulse + name = "EMP Pulse" + id = "emp_pulse" + result = null + required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense + result_amount = 2 - emp_pulse - name = "EMP Pulse" - id = "emp_pulse" - result = null - required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense - result_amount = 2 +/datum/chemical_reaction/emp_pulse/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. + // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. + empulse(location, round(created_volume / 24), round(created_volume / 14), 1) + holder.clear_reagents() + return - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. - // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. - empulse(location, round(created_volume / 24), round(created_volume / 14), 1) - holder.clear_reagents() - return +/datum/chemical_reaction/mutagen + name = "Unstable mutagen" + id = "mutagen" + result = "mutagen" + required_reagents = list("radium" = 1, "plasma" = 1, "chlorine" = 1) + result_amount = 3 + mix_message = "The substance turns neon green and bubbles unnervingly." - mutagen - name = "Unstable mutagen" - id = "mutagen" - result = "mutagen" - required_reagents = list("radium" = 1, "plasma" = 1, "chlorine" = 1) - result_amount = 3 - mix_message = "The substance turns neon green and bubbles unnervingly." +/datum/chemical_reaction/thermite + name = "Thermite" + id = "thermite" + result = "thermite" + required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1) + result_amount = 3 - thermite - name = "Thermite" - id = "thermite" - result = "thermite" - required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1) - result_amount = 3 +/datum/chemical_reaction/glycerol + name = "Glycerol" + id = "glycerol" + result = "glycerol" + required_reagents = list("cornoil" = 3, "sacid" = 1) + result_amount = 1 - glycerol - name = "Glycerol" - id = "glycerol" - result = "glycerol" - required_reagents = list("cornoil" = 3, "sacid" = 1) - result_amount = 1 +/datum/chemical_reaction/nitroglycerin + name = "Nitroglycerin" + id = "nitroglycerin" + result = "nitroglycerin" + required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1) + result_amount = 2 - nitroglycerin - name = "Nitroglycerin" - id = "nitroglycerin" - result = "nitroglycerin" - required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1) - result_amount = 2 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/datum/effect/system/reagents_explosion/e = new() - e.set_up(round (created_volume/2, 1), holder.my_atom, 0, 0) - e.start() +/datum/chemical_reaction/nitroglycerin/on_reaction(var/datum/reagents/holder, var/created_volume) + var/datum/effect/system/reagents_explosion/e = new() + e.set_up(round(created_volume/2, 1), holder.my_atom, 0, 0) + e.start() - holder.clear_reagents() - return + holder.clear_reagents() + return - condensedcapsaicin - name = "Condensed Capsaicin" - id = "condensedcapsaicin" - result = "condensedcapsaicin" - required_reagents = list("capsaicin" = 2) - required_catalysts = list("plasma" = 5) - result_amount = 1 \ No newline at end of file +/datum/chemical_reaction/condensedcapsaicin + name = "Condensed Capsaicin" + id = "condensedcapsaicin" + result = "condensedcapsaicin" + required_reagents = list("capsaicin" = 2) + required_catalysts = list("plasma" = 5) + result_amount = 1 + +/datum/chemical_reaction/explosion_bicarodyne + name = "Explosion" + id = "explosion_bicarodyne" + result = null + required_reagents = list("bicarodyne" = 1, "sal_acid" = 1) + result_amount = 1 + +/datum/chemical_reaction/explosion_bicarodyne/on_reaction(var/datum/reagents/holder, var/created_volume) + var/datum/effect/system/reagents_explosion/e = new() + e.set_up(created_volume, holder.my_atom, 0, 0) + e.start() + return \ No newline at end of file diff --git a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm index 9fc7592d346..6eb3c144e03 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm @@ -394,6 +394,13 @@ ..() return +/datum/reagent/bicarodyne + name = "Bicarodyne" + id = "bicarodyne" + description = "Not to be confused with the old chemical Bicaridine, Bicarodyne is a volatile chemical that reacts violently in the presence of most human endorphins." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + metabolization_rate = 0.01 /////////////////////////////////////////////////////////////////////////////////////////////////////////////// /datum/reagent/condensedcapsaicin diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index d37460b4949..57d5c8807ff 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -301,6 +301,14 @@ ..() reagents.add_reagent(pick("polonium","initropidril","concentrated_initro","pancuronium","sodium_thiopental","ketamine","sulfonal","amanitin","coniine","curare","sarin","histamine","venom","cyanide","spidereggs","nanomachines"), 40) +/obj/item/weapon/reagent_containers/glass/bottle/antisocial + desc = "It has a skull and heart on the bottle..what?" + possible_transfer_amounts = list(5,10,15,25,30) + volume = 30 + + New() + ..() + reagents.add_reagent("bicarodyne", 30) /obj/item/weapon/reagent_containers/glass/bottle/plasma name = "plasma dust bottle" diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 82f08fbb101..5adc3ed1509 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 988ebe78eea..b7149b63b04 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi index 08e806177e2..46b0465a719 100644 Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi index eb41182b61c..e57b8ad170a 100644 Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 7f5601497d6..7e588ec2210 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 11d212a0e55..2fbdf50fc3e 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 6ac5827dbef..23ee204e96a 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/paradise.dme b/paradise.dme index b9b84d17cef..db70b0e6819 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1775,6 +1775,7 @@ #include "code\modules\projectiles\guns\projectile\revolver.dm" #include "code\modules\projectiles\guns\projectile\rocket.dm" #include "code\modules\projectiles\guns\projectile\shotgun.dm" +#include "code\modules\projectiles\guns\projectile\sniper.dm" #include "code\modules\projectiles\guns\projectile\toy.dm" #include "code\modules\projectiles\projectile\beams.dm" #include "code\modules\projectiles\projectile\bullets.dm"