diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index 1f94610f046..76a9f4b2a78 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -311,7 +311,7 @@ var/datum/subsystem/shuttle/SSshuttle O.orderedbyRank = _orderedbyRank O.comment = _comment - shoppinglist += O + requestlist += O return O diff --git a/code/controllers/subsystem/shuttles/supply.dm b/code/controllers/subsystem/shuttles/supply.dm index 9986e892808..5afbc4b3508 100644 --- a/code/controllers/subsystem/shuttles/supply.dm +++ b/code/controllers/subsystem/shuttles/supply.dm @@ -263,7 +263,7 @@ return //Find the correct supply_pack datum - if(!SSshuttle.supply_packs[href_list["doorder"]]) return + if(!SSshuttle.supply_packs["[href_list["doorder"]]"]) return var/timeout = world.time + 600 var/reason = stripped_input(usr,"Reason:","Why do you require this item?","") diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 2e34238fe2c..36f97bc43c2 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -288,7 +288,10 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine name = "Combat Shotguns Crate" contains = list(/obj/item/weapon/gun/projectile/shotgun/combat, /obj/item/weapon/gun/projectile/shotgun/combat, - /obj/item/weapon/gun/projectile/shotgun/combat) + /obj/item/weapon/gun/projectile/shotgun/combat, + /obj/item/weapon/storage/belt/bandolier, + /obj/item/weapon/storage/belt/bandolier, + /obj/item/weapon/storage/belt/bandolier) cost = 20 containername = "combat shotgun crate" diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index e3fb6cd6a5a..781f3ff9009 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -120,10 +120,10 @@ var/list/uplink_items = list() gamemodes = list(/datum/game_mode/nuclear) surplus = 40 -/datum/uplink_item/dangerous/car - name = "C-90gl Compact Assault Rifle" - desc = "A fully-loaded Zashchita Industriya toploading bullpup assault rifle that uses 30-round 5.45x39mm magazines with a togglable underslung 40mm grenade launcher." - item = /obj/item/weapon/gun/projectile/automatic/c90gl +/datum/uplink_item/dangerous/carbine + name = "M-90gl Carbine" + desc = "A fully-loaded three-round burst carbine that uses 30-round 5.56mm magazines with a togglable underslung 40mm grenade launcher." + item = /obj/item/weapon/gun/projectile/automatic/m90 cost = 18 gamemodes = list(/datum/game_mode/nuclear) surplus = 50 @@ -137,11 +137,10 @@ var/list/uplink_items = list() surplus = 0 /datum/uplink_item/dangerous/crossbow - name = "Miniature Energy Crossbow" - desc = "A short bow mounted across a tiller in miniature. Small enough to fit into a pocket or slip into a bag unnoticed. It fires bolts tipped with a paralyzing toxin collected from a rare organism. \ - Its bolts stun enemies for short periods, and replenish automatically." - item = /obj/item/weapon/gun/energy/crossbow - cost = 12 + name = "Miniature Auto Crossbow" + desc = "A short bow mounted across a tiller in miniature. Small enough to fit into a pocket or slip into a bag unnoticed. It fires bolts tipped with a paralyzing toxin collected from a rare organism." + item = /obj/item/weapon/gun/projectile/automatic/crossbow + cost = 10 excludefrom = list(/datum/game_mode/nuclear) surplus = 50 @@ -226,11 +225,18 @@ var/list/uplink_items = list() surplus = 40 /datum/uplink_item/ammo/pistol - name = "Magazine - 10mm" + name = "Handgun Magazine - 10mm" desc = "An additional 8-round 10mm magazine for use in the syndicate pistol. These subsonic rounds are dirt cheap but are half as effective as .357 rounds." item = /obj/item/ammo_box/magazine/m10mm cost = 1 +/datum/uplink_item/ammo/crossbow + name = "Poison-tipped Crossbow Bolts (x4)" + desc = "A four pack of paralyzing crossbow bolts, for hunting big game." + item = /obj/item/ammo_box/crossbow + cost = 2 + excludefrom = list(/datum/game_mode/nuclear) + /datum/uplink_item/ammo/revolver name = "Speed Loader - .357" desc = "A speed loader that contains seven additional .357 Magnum rounds for the syndicate revolver. For when you really need a lot of things dead." @@ -238,7 +244,7 @@ var/list/uplink_items = list() cost = 4 /datum/uplink_item/ammo/smg - name = "Magazine - .45" + name = "SMG Magazine - .45" desc = "An additional 20-round .45 magazine for use in the C-20r submachine gun. These bullets pack a lot of punch that can knock most targets down, but do limited overall damage." item = /obj/item/ammo_box/magazine/smgm45 cost = 2 @@ -265,16 +271,16 @@ var/list/uplink_items = list() cost = 3 gamemodes = list(/datum/game_mode/nuclear) -/datum/uplink_item/ammo/car - name = "Box Magazine - 5.45x39mm" - desc = "An additional 30-round 5.45x39mm magazine for use in the C-90gl assault rifle. These bullets don't have the punch to knock most targets down, but dish out higher overall damage." - item = /obj/item/ammo_box/magazine/m545 +/datum/uplink_item/ammo/carbine + name = "Toploader Magazine - 5.56" + desc = "An additional 30-round 5.56 magazine for use in the M-90gl carbine. These bullets don't have the punch to knock most targets down, but dish out higher overall damage." + item = /obj/item/ammo_box/magazine/m556 cost = 2 gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/a40mm name = "Ammo Box - 40mm grenades" - desc = "A box of 4 additional 40mm HE grenades for use the C-90gl's underbarrel grenade launcher. Your teammates will thank you to not shoot these down small hallways." + desc = "A box of 4 additional 40mm HE grenades for use the M-90gl's underbarrel grenade launcher. Your teammates will thank you to not shoot these down small hallways." item = /obj/item/ammo_box/a40mm cost = 4 gamemodes = list(/datum/game_mode/nuclear) diff --git a/code/game/gamemodes/changeling/powers/epinephrine.dm b/code/game/gamemodes/changeling/powers/epinephrine.dm index 973f01f9b54..107bf5a96f8 100644 --- a/code/game/gamemodes/changeling/powers/epinephrine.dm +++ b/code/game/gamemodes/changeling/powers/epinephrine.dm @@ -8,7 +8,7 @@ req_stat = UNCONSCIOUS //Recover from stuns. -/obj/effect/proc_holder/changeling/epinephrine/sting_action(var/mob/user) +/obj/effect/proc_holder/changeling/epinephrine/sting_action(var/mob/living/user) if(user.lying) user << "We arise." @@ -21,6 +21,7 @@ user.lying = 0 user.update_canmove() user.reagents.add_reagent("synaptizine", 20) + user.adjustStaminaLoss(-75) feedback_add_details("changeling_powers","UNS") return 1 diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index d6d3aadad1a..66df7456ab2 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -68,11 +68,11 @@ if("sabr") new /obj/item/weapon/gun/projectile/automatic(get_turf(H)) if("crossbow") - new /obj/item/weapon/gun/energy/crossbow(get_turf(H)) + new /obj/item/weapon/gun/projectile/automatic/crossbow(get_turf(H)) if("saw") new /obj/item/weapon/gun/projectile/automatic/l6_saw(get_turf(H)) if("car") - new /obj/item/weapon/gun/projectile/automatic/c90gl(get_turf(H)) + new /obj/item/weapon/gun/projectile/automatic/m90(get_turf(H)) else switch (randomizemagic) if("fireball") diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 86dedcc03d2..972279415d7 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -143,6 +143,7 @@ Detective else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_in_backpack) + H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack) var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) L.imp_in = H diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 3599732cc6b..ad61bfe4ece 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -45,6 +45,9 @@ var/const/HOLOPAD_MODE = RANGE_BASED if(!istype(user)) return if(alert(user,"Would you like to request an AI's presence?",,"Yes","No") == "Yes") + if(!Adjacent(user)) //also prevents request spam! + user << "You are too far from the holopad." + return if(last_request + 200 < world.time) //don't spam the AI with requests you jerk! last_request = world.time user << "You request an AI's presence." diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 4cffd8b367f..1e0c73fbfca 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -22,7 +22,7 @@ user << "[src] blinks red as you try to insert [G]." return - if (istype(G, /obj/item/weapon/gun/energy/gun/nuclear) || istype(G, /obj/item/weapon/gun/energy/crossbow)) + if (istype(G, /obj/item/weapon/gun/energy/gun/nuclear)) user << "Your gun's recharge port was removed to make room for a miniaturized reactor." return user.drop_item() diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index f1084796a6b..531f9fecfd2 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -266,7 +266,7 @@ desc = "A weapon for combat exosuits. Shoots a rapid, three shot burst." icon_state = "mecha_uac2" equip_cooldown = 10 - projectile = /obj/item/projectile/bullet/weakbullet + projectile = /obj/item/projectile/bullet/weakbullet3 projectiles = 300 projectile_energy_cost = 20 var/projectiles_per_shot = 3 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 378e96ba819..71c38367882 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -44,6 +44,21 @@ var/suittoggled = 0 var/hooded = 0 + var/list/can_be_placed_into = list( + /obj/structure/table, + /obj/structure/rack, + /obj/structure/closet, + /obj/item/weapon/storage, + /obj/structure/safe, + /obj/machinery/disposal + ) +/obj/item/proc/check_allowed_items(atom/target, not_inside) + if((src in target) || ((!istype(target.loc, /turf)) && (!istype(target, /turf)) && (not_inside)) || is_type_in_list(target, can_be_placed_into)) + return 0 + else + return 1 + + var/attackback = 0 //calls calls attackby() when you hit an obj with an item with this var set to 1. /obj/item/device icon = 'icons/obj/device.dmi' diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index af34671bef5..cd048e95adb 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -5,7 +5,7 @@ action_button_is_hands_free = 1 var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like loyalty implants var/implanted = null - var/mob/imp_in = null + var/mob/living/imp_in = null item_color = "b" var/allow_reagents = 0 @@ -190,6 +190,7 @@ imp_in.SetStunned(0) imp_in.SetWeakened(0) imp_in.SetParalysis(0) + imp_in.adjustStaminaLoss(-75) imp_in.lying = 0 imp_in.update_canmove() diff --git a/code/game/objects/items/weapons/janisigns.dm b/code/game/objects/items/weapons/janisigns.dm index fa781dec768..56977c086f9 100644 --- a/code/game/objects/items/weapons/janisigns.dm +++ b/code/game/objects/items/weapons/janisigns.dm @@ -12,9 +12,19 @@ origin_tech = "programming=3" var/list/signs = list() var/max_signs = 10 + can_be_placed_into = list( + /obj/machinery/r_n_d/destructive_analyzer, + /obj/structure/table, + /obj/structure/rack, + /obj/structure/closet, + /obj/item/weapon/storage, + /obj/structure/safe, + /obj/machinery/disposal + ) /obj/item/weapon/holosign_creator/afterattack(atom/target, mob/user, flag) if(flag) + if(!check_allowed_items(target, 1)) return var/turf/T = get_turf(target) var/obj/effect/overlay/holograph/H = locate() in T if(H) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 9830904022d..0f13d3db284 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -173,4 +173,14 @@ /obj/item/weapon/reagent_containers/spray, /obj/item/weapon/soap, /obj/item/weapon/holosign_creator - ) \ No newline at end of file + ) + +/obj/item/weapon/storage/belt/bandolier + name = "bandolier" + desc = "A bandolier for holding shotgun ammunition." + icon_state = "bandolier" + item_state = "bandolier" + storage_slots = 6 + can_hold = list( + /obj/item/ammo_casing/shotgun + ) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 1f73247bd5e..0858856ab77 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -276,7 +276,7 @@ add_fingerprint(usr) - if(!prevent_warning && !istype(W, /obj/item/weapon/gun/energy/crossbow)) + if(!prevent_warning && !istype(W, /obj/item/weapon/gun/projectile/automatic/crossbow)) for(var/mob/M in viewers(usr, null)) if(M == usr) usr << "You put [W] [preposition]to [src]." diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 7ce4e7b6e37..95318319f48 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -13,7 +13,7 @@ return if("stealth") - new /obj/item/weapon/gun/energy/crossbow(src) + new /obj/item/weapon/gun/projectile/automatic/crossbow(src) new /obj/item/weapon/pen/sleepy(src) new /obj/item/device/chameleon(src) return diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index c7458b10969..87b694983c7 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -25,12 +25,12 @@ user.visible_message("[user] is loosening the [name]'s bolts...", \ "You are loosening the [name]'s bolts...") if(do_after(user,40)) - if(!src) return - if(!anchored) return + if(!src.loc || !anchored) + return user.visible_message("[user] loosened the [name]'s bolts!", \ "You loosened the [name]'s bolts!") anchored = 0 - else if(!anchored) + else if (!istype(src.loc, /turf/simulated/floor)) user.visible_message("A floor must be present to secure the [name]!") return @@ -38,8 +38,8 @@ user.visible_message("[user] is securing the [name]'s bolts...", \ "You are securing the [name]'s bolts...") if(do_after(user, 40)) - if(!src) return - if(anchored) return + if(!src.loc || anchored) + return user.visible_message("[user] has secured the [name]'s bolts!", \ "You have secured the [name]'s bolts!") anchored = 1 @@ -48,7 +48,8 @@ user.visible_message("[user] is slicing apart the [name]...", \ "You are slicing apart the [name]...") if(do_after(user,30)) - if(!src.loc) return + if(!src.loc) + return user.visible_message("[user] slices apart the [name]!", \ "You slice apart the [name]!") Dismantle(1) @@ -57,20 +58,23 @@ user.visible_message("[user] begins to drill apart the [name]!", \ "You begin to drill apart the [name]!") if(do_after(user,5)) - if(!src.loc) return + if(!src.loc) + return user.visible_message("[user] destroys the [name]!", \ "You destroy the [name]!") qdel(src) - else if(istype(W, /obj/item/weapon/weldingtool)) - if(!anchored) - user.visible_message("[user] is slicing apart the [name]...", \ - "You are slicing apart the [name]...") - if(do_after(user, 40)) - if(!src.loc) return - user.visible_message("[user] slices apart the [name]!", \ - "You slice apart the [name]!") - Dismantle(1) + else if(istype(W, /obj/item/weapon/weldingtool) && !anchored) + playsound(loc, 'sound/items/Welder.ogg', 40, 1) + user.visible_message("[user] is slicing apart the [name]...", \ + "You are slicing apart the [name]...") + if(do_after(user, 40)) + if(!src.loc) + return + playsound(loc, 'sound/items/Welder2.ogg', 50, 1) + user.visible_message("[user] slices apart the [name]!", \ + "You slice apart the [name]!") + Dismantle(1) else hardness -= W.force/100 diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 94bf8673290..4936f59d7dd 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -172,11 +172,12 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," if(istype(A,/mob/living/carbon)) var/mob/living/carbon/M = A if(M.lying) return - dirt++ + if(prob(50)) + dirt++ var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, src) - if (dirt >= 30) - if (!dirtoverlay) + if(dirt >= 100) + if(!dirtoverlay) dirtoverlay = new/obj/effect/decal/cleanable/dirt(src) - dirtoverlay.alpha = 15 - else if (dirt > 30) - dirtoverlay.alpha = min(dirtoverlay.alpha+20, 255) \ No newline at end of file + dirtoverlay.alpha = 10 + else if(dirt > 100) + dirtoverlay.alpha = min(dirtoverlay.alpha+10, 200) \ No newline at end of file diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 377ca974516..9faa2aa5dd7 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -796,7 +796,7 @@ var/global/list/g_fancy_list_of_types = null qdel(briefcase_item) for(var/i=3, i>0, i--) sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000 - sec_briefcase.contents += new /obj/item/weapon/gun/energy/crossbow + sec_briefcase.contents += new /obj/item/weapon/gun/projectile/automatic/crossbow sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba sec_briefcase.contents += new /obj/item/ammo_box/a357 sec_briefcase.contents += new /obj/item/weapon/c4 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 652416808d3..521b6595861 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -342,7 +342,7 @@ mob/living/carbon/proc/handle_hallucinations() return var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/item/ammo_box/a357,\ - /obj/item/weapon/gun/energy/crossbow, /obj/item/weapon/melee/energy/sword/saber,\ + /obj/item/weapon/gun/projectile/automatic/crossbow, /obj/item/weapon/melee/energy/sword/saber,\ /obj/item/weapon/storage/box/syndicate, /obj/item/weapon/storage/box/emps,\ /obj/item/weapon/cartridge/syndicate, /obj/item/clothing/under/chameleon,\ /obj/item/clothing/shoes/syndigaloshes, /obj/item/weapon/card/id/syndicate,\ diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 9f4857c18af..718de5d9c87 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -471,13 +471,6 @@ force = 10 throwforce = 10 var/cooldown = 0 - var/list/can_be_placed_into = list( - /obj/structure/table, - /obj/structure/closet, - /obj/item/weapon/storage, - /obj/structure/safe, - /obj/machinery/disposal - ) /obj/item/weapon/resonator/proc/CreateResonance(var/target, var/creator) if(cooldown <= 0) @@ -493,12 +486,8 @@ ..() /obj/item/weapon/resonator/afterattack(atom/target, mob/user, proximity_flag) - if(target in user.contents) - return if(proximity_flag) - for(var/type in can_be_placed_into) - if(istype(target, type)) - return + if(!check_allowed_items(target, 1)) return CreateResonance(target, user) /obj/effect/resonance diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 704477039ca..30005f3060b 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -313,11 +313,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp dat += "

Crew Manifest

" dat += data_core.get_manifest() - src << browse(dat, "window=manifest;size=370x420;can_close=1") - -/mob/dead/observer/Topic(href, href_list) - if(href_list["follow"]) - var/atom/movable/target = locate(href_list["follow"]) - if((usr == src) && istype(target) && (target != src)) //for safety against href exploits - ManualFollow(target) - + src << browse(dat, "window=manifest;size=387x420;can_close=1") + +/mob/dead/observer/Topic(href, href_list) + if(href_list["follow"]) + var/atom/movable/target = locate(href_list["follow"]) + if((usr == src) && istype(target) && (target != src)) //for safety against href exploits + ManualFollow(target) + diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 77be370abf8..6e8e72682ed 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -248,9 +248,9 @@ ..() modules += new /obj/item/device/flashlight(src) modules += new /obj/item/weapon/melee/energy/sword/cyborg(src) - modules += new /obj/item/weapon/gun/energy/crossbow/cyborg(src) + modules += new /obj/item/weapon/gun/energy/printer(src) + modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/cyborg(src) modules += new /obj/item/weapon/card/emag(src) - modules += new /obj/item/weapon/gun/energy/laser/cyborg(src) modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src) modules += new /obj/item/weapon/crowbar(src) emag = null diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d4a893f0e17..cf55c2dee00 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -82,24 +82,37 @@ var/next_mob_id = 0 // blind_message (optional) is what blind people will hear e.g. "You hear something!" /mob/visible_message(var/message, var/self_message, var/blind_message) - var/list/atom_viewers = list() - for(var/atom/movable/A in view(src)) - atom_viewers |= recursive_hear_check(A) - atom_viewers |= src - for(var/mob/M in atom_viewers) + var/list/mob_viewers = list() + var/list/possible_viewers = list() + mob_viewers |= src + mob_viewers |= viewers(src) + var/heard = get_hear(7, src) + for(var/atom/movable/A in heard) + possible_viewers |= recursive_hear_check(A) + for(var/mob/B in possible_viewers) + if(B in mob_viewers) + continue + if(isturf(B.loc)) + continue + var/turf/T = get_turf(B) + if(src in view(T)) + mob_viewers |= B + + for(var/mob/M in mob_viewers) if(M.see_invisible < invisibility) continue //can't view the invisible var/msg = message if(self_message && M==src) msg = self_message - M.show_message( msg, 1) + M.show_message(msg, 1) + if(blind_message) - var/list/atom_hearers = list() - for(var/atom/movable/O in get_hearers_in_view(7, src)) - if(O in atom_viewers) + var/list/mob_hearers = list() + for(var/mob/C in get_hearers_in_view(7, src)) + if(C in mob_viewers) continue - atom_hearers |= O - for(var/mob/MOB in atom_hearers) + mob_hearers |= C + for(var/mob/MOB in mob_hearers) MOB.show_message(blind_message, 2) // Show a message to all mobs who sees this atom @@ -108,18 +121,31 @@ var/next_mob_id = 0 // blind_message (optional) is what blind people will hear e.g. "You hear something!" /atom/proc/visible_message(var/message, var/blind_message) - var/list/atom_viewers = list() - for(var/atom/movable/A in view(src)) - atom_viewers |= recursive_hear_check(A) - for(var/mob/M in atom_viewers) - M.show_message( message, 1) + var/list/mob_viewers = list() + var/list/possible_viewers = list() + mob_viewers |= viewers(src) + var/heard = get_hear(7, src) + for(var/atom/movable/A in heard) + possible_viewers |= recursive_hear_check(A) + for(var/mob/B in possible_viewers) + if(B in mob_viewers) + continue + if(isturf(B.loc)) + continue + var/turf/T = get_turf(B) + if(src in view(T)) + mob_viewers |= B + + for(var/mob/M in mob_viewers) + M.show_message(message, 1) + if(blind_message) - var/list/atom_hearers = list() - for(var/atom/movable/O in get_hearers_in_view(7, src)) - if(O in atom_viewers) + var/list/mob_hearers = list() + for(var/mob/C in get_hearers_in_view(7, src)) + if(C in mob_viewers) continue - atom_hearers |= O - for(var/mob/MOB in atom_hearers) + mob_hearers |= C + for(var/mob/MOB in mob_hearers) MOB.show_message(blind_message, 2) // Show a message to all mobs in earshot of this one diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 95b21dde54e..6af82653cfc 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -29,7 +29,7 @@ output += "

\[ Ready | Not Ready \]

" else - output += "View the Crew Manifest

" + output += "

View the Crew Manifest

" output += "

Join Game!

" output += "

Observe

" @@ -56,7 +56,7 @@ output += "" //src << browse(output,"window=playersetup;size=210x240;can_close=0") - var/datum/browser/popup = new(src, "playersetup", "
New Player Options
", 220, 250) + var/datum/browser/popup = new(src, "playersetup", "
New Player Options
", 220, 265) popup.set_window_options("can_close=0") popup.set_content(output) popup.open(0) @@ -370,7 +370,7 @@ dat += "

Crew Manifest

" dat += data_core.get_manifest(OOC = 1) - src << browse(dat, "window=manifest;size=370x420;can_close=1") + src << browse(dat, "window=manifest;size=387x420;can_close=1") /mob/new_player/Move() return 0 diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 0f85597e0ec..608522f5e19 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -34,8 +34,6 @@ BB = new projectile_type(src) return - - //Boxes of ammo /obj/item/ammo_box name = "ammo box (null_reference_exception)" diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 4cf1351fbf1..0234f53051d 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -136,9 +136,9 @@ caliber = "a762" projectile_type = /obj/item/projectile/bullet -/obj/item/ammo_casing/a545 - desc = "A 5.45mm bullet casing." - caliber = "a545" +/obj/item/ammo_casing/a556 + desc = "A 5.56mm bullet casing." + caliber = "a556" projectile_type = /obj/item/projectile/bullet/heavybullet /obj/item/ammo_casing/caseless @@ -164,3 +164,11 @@ caliber = "40mm" icon_state = "40mmHE" projectile_type = /obj/item/projectile/bullet/a40mm + +/obj/item/ammo_casing/caseless/bolt //xbow + name = "poison crossbow bolt" + desc = "A reusable crossbow bolt tipped with specialized carpotoxin." + projectile_type = /obj/item/projectile/energy/bolt + caliber = "crossbow" + icon = 'icons/obj/projectiles.dmi' + icon_state = "cbbolt" \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 8f05c92eaa4..f9d940c3bfb 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -38,4 +38,10 @@ icon_state = "40mm" ammo_type = /obj/item/ammo_casing/a40mm max_ammo = 4 - multiple_sprites = 1 \ No newline at end of file + multiple_sprites = 1 + +/obj/item/ammo_box/crossbow + name = "ammo box (crossbow bolts)" + icon_state = "xbow" + ammo_type = /obj/item/ammo_casing/caseless/bolt + max_ammo = 4 \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index 092d19a6881..143e8833546 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -64,15 +64,6 @@ projectile_type = /obj/item/projectile/lasertag/redtag select_name = "redtag" -/obj/item/ammo_casing/energy/bolt - projectile_type = /obj/item/projectile/energy/bolt - select_name = "bolt" - fire_sound = 'sound/weapons/Genhit.ogg' - -/obj/item/ammo_casing/energy/bolt/large - projectile_type = /obj/item/projectile/energy/bolt/large - select_name = "heavy bolt" - /obj/item/ammo_casing/energy/xray projectile_type = /obj/item/projectile/beam/xray e_cost = 50 @@ -82,9 +73,11 @@ projectile_type = /obj/item/projectile/energy/electrode select_name = "stun" fire_sound = 'sound/weapons/taser.ogg' + e_cost = 200 /obj/item/ammo_casing/energy/electrode/gun fire_sound = 'sound/weapons/gunshot.ogg' + e_cost = 100 /obj/item/ammo_casing/energy/ion projectile_type = /obj/item/projectile/ion @@ -149,5 +142,4 @@ /obj/item/ammo_casing/energy/wormhole/orange projectile_type = /obj/item/projectile/beam/wormhole/orange - select_name = "orange" - + select_name = "orange" diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index f9d3c7410a0..ff130fc53ae 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -90,6 +90,15 @@ ammo_type = /obj/item/ammo_casing/a40mm max_ammo = 6 +/obj/item/ammo_box/magazine/internal/cylinder/crossbow + name = "autocrossbow internal magazine" + ammo_type = /obj/item/ammo_casing/caseless/bolt + caliber = "crossbow" + max_ammo = 10 + +/obj/item/ammo_box/magazine/internal/cylinder/crossbow/large + max_ammo = 15 + ///////////EXTERNAL MAGAZINES//////////////// /obj/item/ammo_box/magazine/m10mm @@ -159,17 +168,14 @@ obj/item/ammo_box/magazine/tommygunm45 multiple_sprites = 2 max_ammo = 8 -/obj/item/ammo_box/magazine/m545 - name = "box magazine (5.45mm)" - icon_state = "5.45m" +/obj/item/ammo_box/magazine/m556 + name = "toploader magazine (5.56mm)" + icon_state = "5.56m" origin_tech = "combat=5;syndicate=1" - ammo_type = /obj/item/ammo_casing/a545 - caliber = "a545" + ammo_type = /obj/item/ammo_casing/a556 + caliber = "a556" max_ammo = 30 - -/obj/item/ammo_box/magazine/m545/update_icon() - ..() - icon_state = "[initial(icon_state)]-[round(ammo_count(),10)]" + multiple_sprites = 2 /obj/item/ammo_box/magazine/m762 name = "box magazine (7.62mm)" diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm index fb68b624499..77987f9ef59 100644 --- a/code/modules/projectiles/ammunition/special.dm +++ b/code/modules/projectiles/ammunition/special.dm @@ -34,4 +34,10 @@ /obj/item/ammo_casing/syringegun name = "syringe gun spring" desc = "A high-power spring that throws syringes." - projectile_type = null \ No newline at end of file + projectile_type = null + +/obj/item/ammo_casing/energy/c3dbullet + projectile_type = /obj/item/projectile/bullet/midbullet3 + select_name = "spraydown" + fire_sound = 'sound/weapons/gunshot_smg.ogg' + e_cost = 20 \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index b3c855e71da..5d64fe6e093 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -30,6 +30,8 @@ var/sawn_state = SAWN_INTACT var/burst_size = 1 var/fire_delay = 0 + var/obj/item/device/flashlight/F = null + var/can_flashlight = 0 /obj/item/weapon/gun/proc/process_chamber() return 0 @@ -145,4 +147,83 @@ if(user.a_intent == "harm") //Flogging ..() else - return \ No newline at end of file + return + +/obj/item/weapon/gun/attackby(var/obj/item/A as obj, mob/user as mob) + if(istype(A, /obj/item/device/flashlight/seclite)) + var/obj/item/device/flashlight/seclite/S = A + if(can_flashlight) + if(!F) + if(user.l_hand != src && user.r_hand != src) + user << "You'll need [src] in your hands to do that." + return + user.drop_item() + user << "You click [S] into place on [src]." + if(S.on) + SetLuminosity(0) + F = S + A.loc = src + update_icon() + update_gunlight(user) + if(istype(A, /obj/item/weapon/screwdriver)) + if(F) + if(user.l_hand != src && user.r_hand != src) + user << "You'll need [src] in your hands to do that." + return + for(var/obj/item/device/flashlight/seclite/S in src) + user << "You unscrew the seclite from [src]." + F = null + S.loc = get_turf(user) + update_gunlight(user) + S.update_brightness(user) + update_icon() + ..() + return + +/obj/item/weapon/gun/verb/toggle_gunlight() + set name = "Toggle Gunlight" + set category = "Object" + set desc = "Click to toggle your weapon's attached flashlight." + var/mob/living/carbon/human/user = usr + if(!isturf(user.loc)) + user << "You cannot turn the light on while in this [user.loc]." + F.on = !F.on + user << "You toggle the gunlight [F.on ? "on":"off"]." + + playsound(user, 'sound/weapons/empty.ogg', 100, 1) + update_gunlight(user) + return + +/obj/item/weapon/gun/proc/update_gunlight(var/mob/user = null) + if(F) + action_button_name = "Toggle Gunlight" + if(F.on) + if(loc == user) + user.AddLuminosity(F.brightness_on) + else if(isturf(loc)) + SetLuminosity(F.brightness_on) + else + if(loc == user) + user.AddLuminosity(-F.brightness_on) + else if(isturf(loc)) + SetLuminosity(0) + update_icon() + else + action_button_name = null + if(loc == user) + user.AddLuminosity(-5) + else if(isturf(loc)) + SetLuminosity(0) + return + +/obj/item/weapon/gun/pickup(mob/user) + if(F) + if(F.on) + user.AddLuminosity(F.brightness_on) + SetLuminosity(0) + +/obj/item/weapon/gun/dropped(mob/user) + if(F) + if(F.on) + user.AddLuminosity(-F.brightness_on) + SetLuminosity(F.brightness_on) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 4c407cd5a20..c1a6700caba 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -79,4 +79,13 @@ icon_state = "[initial(icon_state)][shot.mod_name][ratio]" if (2) icon_state = "[initial(icon_state)][shot.select_name][ratio]" - return \ No newline at end of file + overlays.Cut() + if(F) + if(F.on) + overlays += "flight-on" + else + overlays += "flight" + return + +/obj/item/weapon/gun/energy/ui_action_click() + toggle_gunlight() \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index a22dd334186..53c9644f6a3 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -6,6 +6,7 @@ ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) origin_tech = "combat=3;magnets=2" modifystate = 2 + can_flashlight = 1 /obj/item/weapon/gun/energy/gun/attack_self(mob/living/user as mob) select_fire(user) @@ -20,6 +21,7 @@ var/charge_tick = 0 modifystate = 0 ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) + can_flashlight = 0 /obj/item/weapon/gun/energy/gun/nuclear/New() ..() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 561e8a15f5e..69b5049f25e 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -134,7 +134,6 @@ icon_state = "disabler" item_state = null ammo_type = list(/obj/item/ammo_casing/energy/disabler) - cell_type = "/obj/item/weapon/stock_parts/cell" /obj/item/weapon/gun/energy/wormhole_projector @@ -180,3 +179,42 @@ if(orange && blue) blue.target = get_turf(orange) orange.target = get_turf(blue) + + +/* 3d printer 'pseudo guns' for borgs */ + +/obj/item/weapon/gun/energy/printer + name = "cyborg lmg" + desc = "A machinegun that fires 3d-printed flachettes slowly regenerated using a cyborg's internal power source." + icon_state = "l6closed0" + cell_type = "/obj/item/weapon/stock_parts/cell/secborg" + ammo_type = list(/obj/item/ammo_casing/energy/c3dbullet) + var/charge_tick = 0 + var/recharge_time = 5 + +/obj/item/weapon/gun/energy/printer/update_icon() + return + +/obj/item/weapon/gun/energy/printer/New() + ..() + SSobj.processing.Add(src) + + +/obj/item/weapon/gun/energy/printer/Destroy() + SSobj.processing.Remove(src) + ..() + +/obj/item/weapon/gun/energy/printer/process() + charge_tick++ + if(charge_tick < recharge_time) return 0 + charge_tick = 0 + + if(!power_supply) return 0 //sanity + if(isrobot(src.loc)) + var/mob/living/silicon/robot/R = src.loc + if(R && R.cell) + var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot + if(R.cell.use(shot.e_cost)) //Take power from the borg... + power_supply.give(shot.e_cost) //...to recharge the shot + + return 1 diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index f79e0b24d0c..a3ef4c2623b 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -5,30 +5,29 @@ icon_state = "taser" item_state = null //so the human update icon uses the icon_state instead. ammo_type = list(/obj/item/ammo_casing/energy/electrode) - cell_type = "/obj/item/weapon/stock_parts/cell/crap" /obj/item/weapon/gun/energy/stunrevolver name = "stun revolver" - desc = "A high-tech revolver that fires internal, reusable stun cartidges in a revolving cylinder." + desc = "A high-tech revolver that fires internal, reusable stun cartidges in a revolving cylinder. Holds twice as many electrodes as a standard taser." icon_state = "stunrevolver" origin_tech = "combat=3;materials=3;powerstorage=2" ammo_type = list(/obj/item/ammo_casing/energy/electrode/gun) - cell_type = "/obj/item/weapon/stock_parts/cell" + can_flashlight = 0 /obj/item/weapon/gun/energy/gun/advtaser - name = "advanced taser" - desc = "A hybrid taser designed to fire both short-range high-power electrodes and long-range disabler beams." + name = "hybrid taser" + desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams." icon_state = "advtaser" ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler) cell_type = "/obj/item/weapon/stock_parts/cell/crap" origin_tech = null /obj/item/weapon/gun/energy/gun/advtaser/cyborg - name = "advanced taser" - desc = "An integrated advanced taser that draws directly from a cyborg's power cell. The weapon contains a limiter to prevent the cyborg's power cell from overheating." - cell_type = "/obj/item/weapon/stock_parts/cell/secborg" + name = "cyborg taser" + desc = "An integrated hybrid taser that draws directly from a cyborg's power cell. The weapon contains a limiter to prevent the cyborg's power cell from overheating." var/charge_tick = 0 var/recharge_time = 10 + can_flashlight = 0 /obj/item/weapon/gun/energy/gun/advtaser/cyborg/New() ..() @@ -54,59 +53,3 @@ update_icon() return 1 - - -/obj/item/weapon/gun/energy/crossbow - name = "mini energy crossbow" - desc = "A weapon favored by syndicate stealth specialists." - icon_state = "crossbow" - item_state = "crossbow" - w_class = 2.0 - m_amt = 2000 - origin_tech = "combat=2;magnets=2;syndicate=5" - suppressed = 1 - ammo_type = list(/obj/item/ammo_casing/energy/bolt) - cell_type = "/obj/item/weapon/stock_parts/cell/crap" - var/charge_tick = 0 - - -/obj/item/weapon/gun/energy/crossbow/New() - ..() - SSobj.processing.Add(src) - - -/obj/item/weapon/gun/energy/crossbow/Destroy() - SSobj.processing.Remove(src) - ..() - - -/obj/item/weapon/gun/energy/crossbow/process() - charge_tick++ - if(charge_tick < 4) return 0 - charge_tick = 0 - if(!power_supply) return 0 - power_supply.give(100) - return 1 - - -/obj/item/weapon/gun/energy/crossbow/update_icon() - return - -/obj/item/weapon/gun/energy/crossbow/cyborg/newshot() - if(isrobot(src.loc)) - var/mob/living/silicon/robot/R = src.loc - if(R && R.cell) - var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot - if(R.cell.use(shot.e_cost)) - chambered = shot - chambered.newshot() - return - -/obj/item/weapon/gun/energy/crossbow/largecrossbow - name = "energy crossbow" - desc = "A weapon favored by syndicate carp hunters." - icon_state = "crossbowlarge" - w_class = 3.0 - force = 10 - m_amt = 4000 - suppressed = 0 \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index b5f2c3033c1..52fafa9fa6e 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -9,8 +9,8 @@ can_suppress = 1 burst_size = 3 fire_delay = 1 - var/select = 0 - action_button_name = "Toggle Fire Mode" + var/select = 1 + action_button_name = "Toggle Firemode" /obj/item/weapon/gun/projectile/automatic/update_icon() ..() @@ -23,28 +23,40 @@ return /obj/item/weapon/gun/projectile/automatic/attackby(var/obj/item/A as obj, mob/user as mob) - if(..() && chambered) - alarmed = 0 + if(istype(A, /obj/item/ammo_box/magazine)) + var/obj/item/ammo_box/magazine/AM = A + if(istype(AM, mag_type)) + if(magazine) + user << "You perform a tactical reload on \the [src], replacing the magazine." + magazine.loc = get_turf(src.loc) + magazine.update_icon() + magazine = null + else + user << "You insert the magazine into \the [src]." + user.remove_from_mob(AM) + magazine = AM + magazine.loc = src + chamber_round() + A.update_icon() + update_icon() + return 1 /obj/item/weapon/gun/projectile/automatic/ui_action_click() burst_select() -/obj/item/weapon/gun/projectile/automatic/verb/burst_select() - set name = "Toggle Fire Mode" - set category = "Object" - set desc = "Click to switch fire modes." +/obj/item/weapon/gun/projectile/automatic/proc/burst_select() var/mob/living/carbon/human/user = usr + select = !select if(select) - select = 0 burst_size = 1 fire_delay = 0 user << "You switch to semi-automatic." else - select = 1 burst_size = initial(burst_size) fire_delay = initial(fire_delay) user << "You switch to [burst_size]-rnd burst." + playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() return @@ -98,12 +110,8 @@ fire_sound = 'sound/weapons/Gunshot_smg.ogg' var/cover_open = 0 can_suppress = 0 - burst_size = 1 - fire_delay = 0 - -/obj/item/weapon/gun/projectile/automatic/l6_saw/burst_select() - return - + burst_size = 5 + fire_delay = 3 /obj/item/weapon/gun/projectile/automatic/l6_saw/attack_self(mob/user as mob) cover_open = !cover_open @@ -145,71 +153,70 @@ return ..() -/obj/item/weapon/gun/projectile/automatic/c90gl - name = "syndicate assault rifle" - desc = "A bullpup three-round burst 5.45x39 assault rifle with a unique toploading design, designated 'C-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off." - icon_state = "c90gl" - item_state = "c90gl" +/obj/item/weapon/gun/projectile/automatic/m90 + name = "syndicate carbine" + desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off." + icon_state = "m90" + item_state = "m90" origin_tech = "combat=5;materials=2;syndicate=8" - mag_type = /obj/item/ammo_box/magazine/m545 + mag_type = /obj/item/ammo_box/magazine/m556 fire_sound = 'sound/weapons/Gunshot_smg.ogg' - action_button_name = "Toggle Grenade Launcher" can_suppress = 0 var/obj/item/weapon/gun/projectile/revolver/grenadelauncher/underbarrel burst_size = 3 fire_delay = 2 -/obj/item/weapon/gun/projectile/automatic/c90gl/New() +/obj/item/weapon/gun/projectile/automatic/m90/New() ..() underbarrel = new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(src) update_icon() return -/obj/item/weapon/gun/projectile/automatic/c90gl/afterattack(var/atom/target, var/mob/living/user, flag, params) +/obj/item/weapon/gun/projectile/automatic/m90/afterattack(var/atom/target, var/mob/living/user, flag, params) if(select == 2) underbarrel.afterattack(target, user, flag, params) else ..() - empty_alarm() return -/obj/item/weapon/gun/projectile/automatic/c90gl/attackby(var/obj/item/A, mob/user) - if(select == 2) - underbarrel.attackby(A, user) - else - ..() -/obj/item/weapon/gun/projectile/automatic/c90gl/attack_self(var/mob/living/user) - if(select == 2) - underbarrel.attack_self(user) + +/obj/item/weapon/gun/projectile/automatic/m90/attackby(var/obj/item/A, mob/user) + if(istype(A, /obj/item/ammo_casing)) + if(istype(A, underbarrel.magazine.ammo_type)) + underbarrel.attack_self() + underbarrel.attackby(A, user) else ..() -/obj/item/weapon/gun/projectile/automatic/c90gl/update_icon() +/obj/item/weapon/gun/projectile/automatic/m90/update_icon() ..() overlays.Cut() - if(!select) - overlays += "[initial(icon_state)]semi" - if(select == 1) - overlays += "[initial(icon_state)]burst" - if(select == 2) - overlays += "[initial(icon_state)]gren" - icon_state = "c90gl[magazine ? "-[Ceiling(get_ammo(0)/6)*6]" : ""][chambered ? "" : "-e"]" + switch(select) + if(0) + overlays += "[initial(icon_state)]semi" + if(1) + overlays += "[initial(icon_state)]burst" + if(2) + overlays += "[initial(icon_state)]gren" + icon_state = "[initial(icon_state)][magazine ? "" : "-e"]" return -/obj/item/weapon/gun/projectile/automatic/c90gl/burst_select() +/obj/item/weapon/gun/projectile/automatic/m90/burst_select() var/mob/living/carbon/human/user = usr - if(!select) - select = 1 - burst_size = initial(burst_size) - fire_delay = initial(fire_delay) - user << "You switch to [burst_size]-rnd burst." - if(select == 1) - select = 2 - user << "You switch to grenades." - if(select == 2) - select = 0 - burst_size = 1 - fire_delay = 0 - user << "You switch to semi-auto." + switch(select) + if(0) + select = 1 + burst_size = initial(burst_size) + fire_delay = initial(fire_delay) + user << "You switch to [burst_size]-rnd burst." + if(1) + select = 2 + user << "You switch to grenades." + if(2) + select = 0 + burst_size = 1 + fire_delay = 0 + user << "You switch to semi-auto." + playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() return @@ -217,7 +224,7 @@ name = "tommy gun" desc = "A genuine 'Chicago Typewriter'." icon_state = "tommygun" - item_state = "tommygun" + item_state = "shotgun" slot_flags = 0 origin_tech = "combat=5;materials=1;syndicate=2" mag_type = /obj/item/ammo_box/magazine/tommygunm45 diff --git a/code/modules/projectiles/guns/projectile/launchers.dm b/code/modules/projectiles/guns/projectile/launchers.dm index 31773285919..50220780acd 100644 --- a/code/modules/projectiles/guns/projectile/launchers.dm +++ b/code/modules/projectiles/guns/projectile/launchers.dm @@ -7,6 +7,7 @@ icon_state = "dshotgun-sawn" item_state = "gun" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/grenadelauncher + fire_sound = 'sound/weapons/grenadelaunch.ogg' w_class = 3 /obj/item/weapon/gun/projectile/revolver/grenadelauncher/attackby(var/obj/item/A, mob/user) @@ -14,22 +15,26 @@ if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing)) chamber_round() -/obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi - desc = "A revolving 6-shot grenade launcher." +/obj/item/weapon/gun/projectile/revolver/grenadelauncher/cyborg + desc = "A 6-shot grenade launcher." name = "multi grenade launcher" - icon_state = "bulldog" - item_state = "bulldog" + icon = 'icons/mecha/mecha_equipment.dmi' + icon_state = "mecha_grenadelnchr" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/grenadelauncher/multi +/obj/item/weapon/gun/projectile/revolver/grenadelauncher/cyborg/attack_self() + return + /obj/item/weapon/gun/projectile/automatic/gyropistol name = "gyrojet pistol" desc = "A prototype pistol designed to fire self propelled rockets." icon_state = "gyropistol" - fire_sound = 'sound/effects/Explosion1.ogg' + fire_sound = 'sound/weapons/grenadelaunch.ogg' origin_tech = "combat=3" mag_type = /obj/item/ammo_box/magazine/m75 burst_size = 1 fire_delay = 0 + action_button_name = null /obj/item/weapon/gun/projectile/automatic/gyropistol/process_chamber(var/eject_casing = 0, var/empty_chamber = 1) ..() @@ -37,4 +42,46 @@ /obj/item/weapon/gun/projectile/automatic/gyropistol/update_icon() ..() icon_state = "[initial(icon_state)][magazine ? "loaded" : ""]" - return \ No newline at end of file + return + +/obj/item/weapon/gun/projectile/automatic/crossbow + name = "mini auto-crossbow" + desc = "A weapon favored by syndicate stealth specialists. Fires specialized poison bolts." + icon_state = "crossbow" + item_state = "crossbow" + w_class = 2 + m_amt = 2000 + origin_tech = "combat=2;magnets=2;syndicate=5" + suppressed = 1 + mag_type = /obj/item/ammo_box/magazine/internal/cylinder/crossbow + fire_sound = 'sound/weapons/genhit.ogg' + burst_size = 1 + fire_delay = 0 + select = 0 + action_button_name = null + +/obj/item/weapon/gun/projectile/automatic/crossbow/update_icon() + return + +/obj/item/weapon/gun/projectile/automatic/crossbow/attack_self() + return + +/obj/item/weapon/gun/projectile/automatic/crossbow/process_chamber(var/eject_casing = 0, var/empty_chamber = 1) + ..() + +/obj/item/weapon/gun/projectile/automatic/crossbow/attackby(var/obj/item/A, mob/user) + var/num_loaded = magazine.attackby(A, user, 1) + if(num_loaded) + user << "You load [num_loaded] bolt\s into \the [src]." + update_icon() + chamber_round() + +/obj/item/weapon/gun/projectile/automatic/crossbow/large //holds twice the ammo of mini crossbows but can't be pocketed + name = "auto crossbow" + desc = "A weapon favored by carp hunters. Fires specialized poison bolts." + icon_state = "crossbowlarge" + w_class = 3 + force = 10 + m_amt = 4000 + suppressed = 0 + mag_type = /obj/item/ammo_box/magazine/internal/cylinder/crossbow/large \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 4ed58eba2c9..11c7bc823d8 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -8,6 +8,7 @@ can_suppress = 1 burst_size = 1 fire_delay = 0 + action_button_name = null /obj/item/weapon/gun/projectile/automatic/pistol/update_icon() ..() diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index ba4ccfcd30f..cef3dcdd269 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -204,8 +204,9 @@ mag_type = /obj/item/ammo_box/magazine/m12g fire_sound = 'sound/weapons/Gunshot.ogg' can_suppress = 0 - burst_size = 2 - fire_delay = 1 + burst_size = 1 + fire_delay = 0 + /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/New() ..() update_icon() diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 6008adc5aee..64aefc4b49d 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -41,6 +41,7 @@ icon_state = "omnilaser" damage = 36 damage_type = STAMINA + flag = "energy" hitsound = 'sound/weapons/tap.ogg' eyeblur = 0 diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 8b9d357efe8..e70257da428 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -7,14 +7,15 @@ flag = "bullet" -/obj/item/projectile/bullet/weakbullet +/obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage damage = 5 - stamina = 33 + stamina = 80 -/obj/item/projectile/bullet/weakbullet2 +/obj/item/projectile/bullet/weakbullet2 //detective revolver instastuns, but multiple shots are better for keeping punks down damage = 15 - stamina = 75 //the detective can't shoot in bursts and will get yelled at if he sinks 50 rounds into perps to stun 'em + weaken = 3 + stamina = 50 /obj/item/projectile/bullet/weakbullet3 damage = 20 @@ -28,7 +29,8 @@ /obj/item/projectile/bullet/midbullet damage = 20 - stamina = 50 //two round bursts from the c20r + stamina = 65 //two round bursts from the c20r knocks people down + /obj/item/projectile/bullet/midbullet2 damage = 25 @@ -40,10 +42,16 @@ damage = 35 -/obj/item/projectile/bullet/stunshot +/obj/item/projectile/bullet/stunshot //taser slugs for shotguns, nothing special name = "stunshot" damage = 5 - stamina = 50 //two round bursts from the bulldog + stun = 5 + weaken = 5 + stutter = 5 + jitter = 20 + range = 7 + icon_state = "spark" + color = "#FFFF00" /obj/item/projectile/bullet/incendiary/on_hit(var/atom/target, var/blocked = 0) ..() diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index f89f265115f..6ff5d42fc22 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -4,18 +4,18 @@ damage = 0 damage_type = BURN flag = "energy" - color = "#FFFF00" /obj/item/projectile/energy/electrode name = "electrode" icon_state = "spark" + color = "#FFFF00" nodamage = 1 stun = 5 weaken = 5 stutter = 5 jitter = 20 - hitsound = "sparks" + hitsound = 'sound/weapons/taserhit.ogg' range = 7 /obj/item/projectile/energy/electrode/on_hit(var/atom/target, var/blocked = 0) @@ -51,7 +51,7 @@ weaken = 5 range = 7 -/obj/item/projectile/energy/bolt //ebow bolts +/obj/item/projectile/energy/bolt //xbow bolts name = "bolt" icon_state = "cbbolt" damage = 15 @@ -59,8 +59,15 @@ nodamage = 0 weaken = 5 stutter = 5 - range = 10 + range = 7 -/obj/item/projectile/energy/bolt/large - name = "largebolt" - damage = 20 +/obj/item/projectile/energy/bolt/on_hit(var/atom/target, var/blocked = 0) //drop a bolt on hitting basically anything + if(!proj_hit) + proj_hit = 1 + new /obj/item/ammo_casing/caseless/bolt(src.loc) + ..() + +/obj/item/projectile/energy/bolt/on_range() //drop a bolt after 7 tiles + if(!proj_hit) + new /obj/item/ammo_casing/caseless/bolt(src.loc) + ..() \ No newline at end of file diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 65a0c7c1451..7b78b6ad120 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -28,7 +28,6 @@ icon_state= "bolter" damage = 60 flag = "bullet" - range = 7 /obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = 0) explosion(target, -1, 0, 2, 1, 0, flame_range = 3) @@ -178,4 +177,4 @@ obj/item/projectile/kinetic/New() /obj/item/projectile/bullet/frag12 name ="explosive slug" damage = 25 - weaken = 5 + weaken = 5 diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 0022664d00f..46b6ccc971b 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -17,6 +17,7 @@ var/beaker = null var/recharged = 0 var/recharge_delay = 15 //Time it game ticks between recharges + var/image/icon_beaker = null //cached overlay var/list/dispensable_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine", "sodium","aluminium","silicon","phosphorus","sulfur","chlorine","potassium","iron", "copper","mercury","radium","water","ethanol","sugar","sacid") @@ -138,7 +139,7 @@ var/obj/item/weapon/reagent_containers/glass/B = beaker B.loc = loc beaker = null - overlays -= "disp_beaker" + overlays.Cut() add_fingerprint(usr) return 1 // update UIs attached to this object @@ -159,7 +160,11 @@ B.loc = src user << "You add the beaker to the machine!" SSnano.update_uis(src) // update all UIs attached to src - overlays += "disp_beaker" + + if(!icon_beaker) + icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. + icon_beaker.pixel_x = rand(-10,5) + overlays += icon_beaker /obj/machinery/chem_dispenser/attack_ai(mob/user as mob) return src.attack_hand(user) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index ab30aa772f6..2521b8c4f28 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -12,11 +12,13 @@ volume = 50 flags = OPENCONTAINER - var/list/can_be_placed_into = list( + can_be_placed_into = list( /obj/machinery/chem_master/, /obj/machinery/chem_dispenser/, /obj/machinery/reagentgrinder, + /obj/machinery/biogenerator, /obj/structure/table, + /obj/structure/rack, /obj/structure/closet, /obj/structure/sink, /obj/item/weapon/storage, @@ -35,10 +37,7 @@ /obj/item/weapon/reagent_containers/glass/afterattack(obj/target, mob/user, proximity) - if(!proximity) return // not adjacent - for(var/type in can_be_placed_into) - if(istype(target, type)) - return + if((!proximity) || !check_allowed_items(target)) return if(ismob(target) && target.reagents && reagents.total_volume) var/mob/M = target diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index ce8256a3d34..83e0f65a320 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -14,6 +14,7 @@ possible_transfer_amounts = null //list(5, 10, 15) volume = 15 var/mode = SYRINGE_DRAW + var/busy = 0 // needed for delayed drawing of blood g_amt = 20 m_amt = 10 @@ -43,6 +44,8 @@ return /obj/item/weapon/reagent_containers/syringe/afterattack(obj/target, mob/user , proximity) + if(busy) + return if(!proximity) return if(!target.reagents) return @@ -81,8 +84,11 @@ if(target != user) target.visible_message("[user] is trying to take a blood sample from [target]!", \ "[user] is trying to take a blood sample from [target]!") + busy = 1 if(!do_mob(user, target)) + busy = 0 return + busy = 0 B.holder = src B.volume = amount //set reagent data diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index fa35c34bacf..fd90822a838 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -75,7 +75,7 @@ req_tech = list("combat" = 5, "materials" = 5, "engineering" = 3, "biotech" = 4, "syndicate" = 3) build_type = PROTOLATHE materials = list("$metal" = 5000, "$glass" = 1500, "$uranium" = 1500, "$silver" = 1500) - build_path = /obj/item/weapon/gun/energy/crossbow/largecrossbow + build_path = /obj/item/weapon/gun/projectile/automatic/crossbow/large locked = 1 category = list("Weapons") diff --git a/config/admins.txt b/config/admins.txt index f71ed183fde..3f0751218d5 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -75,3 +75,4 @@ wjohnston = Game Master mandurrh = Game Master thurgatar = Game Master xerux = Game Master +dannno = Game Master diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 0a170f70789..d4a27a2387c 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index c74d023f04c..5acb3cbf1e1 100644 Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi index 4980f8af635..137450b21ce 100644 Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 4e5a9f42d54..51f41fcf948 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index df6f3a4ba10..33726c6de7c 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 605c08c4590..fafb6639e3f 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 1a05967f90c..5b720a85380 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 6f8513e7862..023f6de8438 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 4efc2e40adf..4094a0ff640 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/sound/weapons/taserhit.ogg b/sound/weapons/taserhit.ogg new file mode 100644 index 00000000000..d3e15129400 Binary files /dev/null and b/sound/weapons/taserhit.ogg differ