Gun Refactors and Changes

- The Protector is now a minature energy gun, it has 3 lethal, 6 standard stun, and no special stun shot anymore. It retains the alert level lock, there is a version without the lock.
- The energy net gun now gets 3 net shots, but loses its stun alternate fire. It also gets a new sprite from baystation.
- Refactors all Vorestation weapons in vore/fluffstuff to be in their appropriate directories.
- Removes all personalized custom weapons.
- KHI is no longer the manufacturer for the Protector, Net Gun, and AR Glasses. I wanted to make KHI a bit rarer, and their specialty mainly ultra high tech equipment.
- Refactors Expedition Phasers. No practical change, but now there are unlocked versions of all three phaser variants.
This commit is contained in:
Unknown
2020-04-11 19:39:49 -04:00
parent e3b39a56af
commit 323d5f838b
29 changed files with 800 additions and 972 deletions

View File

@@ -0,0 +1,115 @@
//RD 'gun'
/obj/item/weapon/bluespace_harpoon
name = "bluespace harpoon"
desc = "For climbing on bluespace mountains!"
icon = 'icons/obj/gun_vr.dmi'
icon_state = "harpoon-2"
w_class = ITEMSIZE_NORMAL
throw_speed = 4
throw_range = 20
origin_tech = list(TECH_BLUESPACE = 5)
var/mode = 1 // 1 mode - teleport you to turf 0 mode teleport turf to you
var/last_fire = 0
var/transforming = 0
/obj/item/weapon/bluespace_harpoon/afterattack(atom/A, mob/user as mob)
var/current_fire = world.time
if(!user || !A)
return
if(transforming)
to_chat(user,"<span class = 'warning'>You can't fire while \the [src] transforming!</span>")
return
if(!(current_fire - last_fire >= 30 SECONDS))
to_chat(user,"<span class = 'warning'>\The [src] is recharging...</span>")
return
if(is_jammed(A) || is_jammed(user))
to_chat(user,"<span class = 'warning'>\The [src] shot fizzles due to interference!</span>")
last_fire = current_fire
playsound(user, 'sound/weapons/wave.ogg', 60, 1)
return
var/turf/T = get_turf(A)
if(!T || (T.check_density() && mode == 1))
to_chat(user,"<span class = 'warning'>That's a little too solid to harpoon into!</span>")
return
var/turf/ownturf = get_turf(src)
if(ownturf.z != T.z || get_dist(T,ownturf) > world.view)
to_chat(user, "<span class='warning'>The target is out of range!</span>")
return
if(get_area(A).flags & BLUE_SHIELDED)
to_chat(user, "<span class='warning'>The target area protected by bluespace shielding!</span>")
return
if(!(A in view(user, world.view)))
to_chat(user, "<span class='warning'>Harpoon fails to lock on the obstructed target!</span>")
return
last_fire = current_fire
playsound(user, 'sound/weapons/wave.ogg', 60, 1)
user.visible_message("<span class='warning'>[user] fires \the [src]!</span>","<span class='warning'>You fire \the [src]!</span>")
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(4, 1, A)
s.start()
s = new /datum/effect/effect/system/spark_spread
s.set_up(4, 1, user)
s.start()
var/turf/FromTurf = mode ? get_turf(user) : get_turf(A)
var/turf/ToTurf = mode ? get_turf(A) : get_turf(user)
var/recievefailchance = 5
var/sendfailchance = 5
if(istype(user, /mob/living))
var/mob/living/L = user
if(LAZYLEN(L.buckled_mobs))
for(var/rider in L.buckled_mobs)
sendfailchance += 15
if(mode)
if(user in FromTurf)
if(prob(sendfailchance))
user.forceMove(pick(trange(24,user)))
else
user.forceMove(ToTurf)
else
for(var/obj/O in FromTurf)
if(O.anchored) continue
if(prob(recievefailchance))
O.forceMove(pick(trange(24,user)))
else
O.forceMove(ToTurf)
for(var/mob/living/M in FromTurf)
if(prob(recievefailchance))
M.forceMove(pick(trange(24,user)))
else
M.forceMove(ToTurf)
/obj/item/weapon/bluespace_harpoon/attack_self(mob/living/user as mob)
return chande_fire_mode(user)
/obj/item/weapon/bluespace_harpoon/verb/chande_fire_mode(mob/user as mob)
set name = "Change fire mode"
set category = "Object"
set src in oview(1)
if(transforming) return
mode = !mode
transforming = 1
to_chat(user,"<span class = 'info'>You change \the [src]'s mode to [mode ? "transmiting" : "receiving"].</span>")
update_icon()
/obj/item/weapon/bluespace_harpoon/update_icon()
if(transforming)
switch(mode)
if(0)
flick("harpoon-2-change", src)
icon_state = "harpoon-1"
if(1)
flick("harpoon-1-change",src)
icon_state = "harpoon-2"
transforming = 0

View File

@@ -0,0 +1,282 @@
// The Gun //
/obj/item/weapon/gun/projectile/cell_loaded //this one can load both medical and security cells! for ERT/admin use.
name = "multipurpose cell-loaded revolver"
desc = "Variety is the spice of life! This weapon is a hybrid of the KHI-102b 'Nanotech Selectable-Fire Weapon' and the Vey-Med ML-3 'Medigun', dubbed the 'NSFW-ML3M'. \
It can fire both harmful and healing cells with an internal nanite fabricator and energy weapon cell loader. Up to three combinations of \
energy beams can be configured at once. Ammo not included."
catalogue_data = list(/datum/category_item/catalogue/information/organization/khi)
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "nsfw"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = "gun"
caliber = "nsfw"
origin_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 6, TECH_MAGNETS = 4)
fire_sound = 'sound/weapons/Taser.ogg'
load_method = MAGAZINE //Nyeh heh hehhh.
magazine_type = null
allowed_magazines = list(/obj/item/ammo_magazine/cell_mag)
handle_casings = HOLD_CASINGS //Don't eject batteries!
recoil = 0
var/charge_left = 0
var/max_charge = 0
charge_sections = 5
/obj/item/weapon/gun/projectile/cell_loaded/consume_next_projectile()
if(chambered && ammo_magazine)
var/obj/item/ammo_casing/microbattery/batt = chambered
if(batt.shots_left)
return new chambered.projectile_type()
else
for(var/B in ammo_magazine.stored_ammo)
var/obj/item/ammo_casing/microbattery/other_batt = B
if(istype(other_batt,chambered.type) && other_batt.shots_left)
switch_to(other_batt)
return new chambered.projectile_type()
break
return null
/obj/item/weapon/gun/projectile/cell_loaded/proc/update_charge()
charge_left = 0
max_charge = 0
if(!chambered)
return
var/obj/item/ammo_casing/microbattery/batt = chambered
charge_left = batt.shots_left
max_charge = initial(batt.shots_left)
if(ammo_magazine) //Crawl to find more
for(var/B in ammo_magazine.stored_ammo)
var/obj/item/ammo_casing/microbattery/bullet = B
if(istype(bullet,batt.type))
charge_left += bullet.shots_left
max_charge += initial(bullet.shots_left)
/obj/item/weapon/gun/projectile/cell_loaded/proc/switch_to(obj/item/ammo_casing/microbattery/new_batt)
if(ishuman(loc))
if(chambered && new_batt.type == chambered.type)
to_chat(loc,"<span class='warning'>\The [src] is now using the next [new_batt.type_name] power cell.</span>")
else
to_chat(loc,"<span class='warning'>\The [src] is now firing [new_batt.type_name].</span>")
chambered = new_batt
update_charge()
update_icon()
/obj/item/weapon/gun/projectile/cell_loaded/attack_self(mob/user)
if(!chambered)
return
var/list/stored_ammo = ammo_magazine.stored_ammo
if(stored_ammo.len == 1)
return //silly you.
//Find an ammotype that ISN'T the same, or exhaust the list and don't change.
var/our_slot = stored_ammo.Find(chambered)
for(var/index in 1 to stored_ammo.len)
var/true_index = ((our_slot + index - 1) % stored_ammo.len) + 1 // Stupid ONE BASED lists!
var/obj/item/ammo_casing/microbattery/next_batt = stored_ammo[true_index]
if(chambered != next_batt && !istype(next_batt, chambered.type))
switch_to(next_batt)
break
/*
/obj/item/weapon/gun/projectile/cell_loaded/special_check(mob/user)
if(!chambered)
return
var/obj/item/ammo_casing/microbattery/batt = chambered
if(!batt.shots_left)
return FALSE
return TRUE
*/
/obj/item/weapon/gun/projectile/cell_loaded/load_ammo(var/obj/item/A, mob/user)
. = ..()
if(ammo_magazine && ammo_magazine.stored_ammo.len)
switch_to(ammo_magazine.stored_ammo[1])
/obj/item/weapon/gun/projectile/cell_loaded/unload_ammo(mob/user, var/allow_dump=1)
chambered = null
return ..()
/obj/item/weapon/gun/projectile/cell_loaded/update_icon()
update_charge()
cut_overlays()
if(!chambered)
return
var/obj/item/ammo_casing/microbattery/batt = chambered
var/batt_color = batt.type_color //Used many times
//Mode bar
var/image/mode_bar = image(icon, icon_state = "[initial(icon_state)]_type")
mode_bar.color = batt_color
add_overlay(mode_bar)
//Barrel color
var/image/barrel_color = image(icon, icon_state = "[initial(icon_state)]_barrel")
barrel_color.alpha = 150
barrel_color.color = batt_color
add_overlay(barrel_color)
//Charge bar
var/ratio = CEILING(((charge_left / max_charge) * charge_sections), 1)
for(var/i = 0, i < ratio, i++)
var/image/charge_bar = image(icon, icon_state = "[initial(icon_state)]_charge")
charge_bar.pixel_x = i
charge_bar.color = batt_color
add_overlay(charge_bar)
// The Magazine //
/obj/item/ammo_magazine/cell_mag
name = "microbattery magazine"
desc = "A microbattery holder for a cell-based variable weapon."
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "cell_mag"
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_MAGNETS = 3)
caliber = "nsfw"
ammo_type = /obj/item/ammo_casing/microbattery
initial_ammo = 0
max_ammo = 3
var/x_offset = 5 //for update_icon() shenanigans- moved here so it can be adjusted for bigger mags
var/capname = "nsfw_mag" //as above
var/chargename = "nsfw_mag" //as above
mag_type = MAGAZINE
var/list/modes = list()
/obj/item/ammo_magazine/cell_mag/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/ammo_casing/microbattery))
var/obj/item/ammo_casing/microbattery/B = W
if(!istype(B, ammo_type))
to_chat(user, "<span class='warning'>[B] does not fit into [src].</span>")
return
if(stored_ammo.len >= max_ammo)
to_chat(user, "<span class='warning'>[src] is full!</span>")
return
user.remove_from_mob(B)
B.loc = src
stored_ammo.Add(B)
update_icon()
playsound(user.loc, 'sound/weapons/flipblade.ogg', 50, 1)
update_icon()
/obj/item/ammo_magazine/cell_mag/update_icon()
cut_overlays()
if(!stored_ammo.len)
return //Why bother
var/current = 0
for(var/B in stored_ammo)
var/obj/item/ammo_casing/microbattery/batt = B
var/image/cap = image(icon, icon_state = "[capname]_cap")
cap.color = batt.type_color
cap.pixel_x = current * x_offset //Caps don't need a pixel_y offset
add_overlay(cap)
if(batt.shots_left)
var/ratio = CEILING(((batt.shots_left / initial(batt.shots_left)) * 4), 1) //4 is how many lights we have a sprite for
var/image/charge = image(icon, icon_state = "[chargename]_charge-[ratio]")
charge.color = "#29EAF4" //Could use battery color but eh.
charge.pixel_x = current * x_offset
add_overlay(charge)
current++ //Increment for offsets
/obj/item/ammo_magazine/cell_mag/advanced
name = "advanced microbattery magazine"
desc = "A microbattery holder for a cell-based variable weapon. This one has much more cell capacity!"
max_ammo = 6
x_offset = 3
icon_state = "cell_mag_extended"
// The Casing //
/obj/item/ammo_casing/microbattery
name = "\'NSFW\' microbattery - UNKNOWN"
desc = "A miniature battery for an energy weapon."
catalogue_data = list(/datum/category_item/catalogue/information/organization/khi)
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "nsfw_batt"
slot_flags = SLOT_BELT | SLOT_EARS
throwforce = 1
w_class = ITEMSIZE_TINY
var/shots_left = 4
leaves_residue = 0
caliber = "nsfw"
var/type_color = null
var/type_name = null
projectile_type = /obj/item/projectile/beam
/obj/item/ammo_casing/microbattery/Initialize()
. = ..()
pixel_x = rand(-10, 10)
pixel_y = rand(-10, 10)
update_icon()
/obj/item/ammo_casing/microbattery/update_icon()
cut_overlays()
var/image/ends = image(icon, icon_state = "[initial(icon_state)]_ends")
ends.color = type_color
add_overlay(ends)
/obj/item/ammo_casing/microbattery/expend()
shots_left--
// The Pack //
/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hybrid
name = "hybrid cell-loaded gun kit"
desc = "A storage case for a multi-purpose handgun. Variety hour!"
w_class = ITEMSIZE_NORMAL
max_w_class = ITEMSIZE_NORMAL
/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hybrid/New()
..()
new /obj/item/weapon/gun/projectile/cell_loaded(src)
new /obj/item/ammo_magazine/cell_mag/advanced(src)
new /obj/item/ammo_casing/microbattery/combat/stun(src)
new /obj/item/ammo_casing/microbattery/combat/stun(src)
new /obj/item/ammo_casing/microbattery/combat/stun(src)
new /obj/item/ammo_casing/microbattery/combat/net(src)
new /obj/item/ammo_casing/microbattery/combat/net(src)
new /obj/item/ammo_casing/microbattery/medical/brute3(src)
new /obj/item/ammo_casing/microbattery/medical/burn3(src)
new /obj/item/ammo_casing/microbattery/medical/stabilize2(src)
new /obj/item/ammo_casing/microbattery/medical/toxin3(src)
new /obj/item/ammo_casing/microbattery/medical/omni3(src)
/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hybrid_combat
name = "military cell-loaded gun kit"
desc = "A storage case for a multi-purpose handgun. Variety hour!"
w_class = ITEMSIZE_NORMAL
max_w_class = ITEMSIZE_NORMAL
/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hybrid_combat/New()
..()
new /obj/item/weapon/gun/projectile/cell_loaded(src)
new /obj/item/ammo_magazine/cell_mag/advanced(src)
new /obj/item/ammo_casing/microbattery/combat/shotstun(src)
new /obj/item/ammo_casing/microbattery/combat/shotstun(src)
new /obj/item/ammo_casing/microbattery/combat/lethal(src)
new /obj/item/ammo_casing/microbattery/combat/lethal(src)
new /obj/item/ammo_casing/microbattery/combat/lethal(src)
new /obj/item/ammo_casing/microbattery/combat/ion(src)
new /obj/item/ammo_casing/microbattery/combat/xray(src)
new /obj/item/ammo_casing/microbattery/medical/stabilize2(src)
new /obj/item/ammo_casing/microbattery/medical/haste(src)
new /obj/item/ammo_casing/microbattery/medical/resist(src)

View File

@@ -0,0 +1,72 @@
// The Gun //
/obj/item/weapon/gun/projectile/cell_loaded/medical
name = "cell-loaded medigun"
desc = "The ML-3 'Medigun', or ML3M for short, is a powerful cell-based ranged healing device based on the KHI-102b NSFW. \
It uses an internal nanite fabricator, powered and controlled by discrete cells, to deliver a variety of effects at range. Up to six combinations of \
healing beams can be configured at once, depending on cartridge used. Ammo not included."
catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med)
icon_state = "ml3m"
description_info = "This is a ranged healing device that uses interchangable nanite discharge cells in a magazine. Each cell is a different healing beam type, and up to three can be loaded in the magazine. Each battery usually provides four discharges of that beam type, and multiple from the same type may be loaded to increase the number of shots for that type."
description_fluff = "The Vey-Med ML-3 'Medigun' allows one to customize their loadout in the field, or before deploying, to allow emergency response personnel to deliver a variety of ranged healing options."
description_antag = ""
origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 2, TECH_BIO = 5)
allowed_magazines = list(/obj/item/ammo_magazine/cell_mag/medical)
/obj/item/weapon/gun/projectile/cell_loaded/medical/cmo
name = "advanced cell-loaded medigun"
desc = "This is a variation on the ML-3 'Medigun', a powerful cell-based ranged healing device based on the KHI-102b NSFW. \
It has an extended sight for increased accuracy, and much more comfortable grip. Ammo not included."
icon_state = "ml3m_cmo"
// The Magazine //
/obj/item/ammo_magazine/cell_mag/medical //medical
name = "nanite magazine"
desc = "A nanite fabrication magazine for the \'ML-3/M\'"
catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med)
description_info = "This magazine holds self-charging nanite fabricators to power the ML-3 'Medigun'. Up to three can be loaded at once, and each provides four shots of their respective healing type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger."
ammo_type = /obj/item/ammo_casing/microbattery/medical
icon_state = "ml3m_mag"
origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 3)
/obj/item/ammo_magazine/cell_mag/medical/advanced
name = "advanced nanite magazine"
desc = "A nanite discharge cell for the \'ML-3/M\'. This one is a more advanced version which can hold six individual nanite discharge cells."
max_ammo = 6
x_offset = 3
icon_state = "ml3m_mag_extended"
origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 5)
// The Pack //
/obj/item/weapon/storage/secure/briefcase/ml3m_pack_med
name = "\improper ML-3 \'Medigun\' kit"
desc = "A storage case for a multi-purpose healing gun. Variety hour!"
w_class = ITEMSIZE_NORMAL
max_w_class = ITEMSIZE_NORMAL
/obj/item/weapon/storage/secure/briefcase/ml3m_pack_med/New()
..()
new /obj/item/weapon/gun/projectile/cell_loaded/medical(src)
new /obj/item/ammo_magazine/cell_mag/medical(src)
new /obj/item/ammo_casing/microbattery/medical/brute(src)
new /obj/item/ammo_casing/microbattery/medical/burn(src)
new /obj/item/ammo_casing/microbattery/medical/stabilize(src)
/obj/item/weapon/storage/secure/briefcase/ml3m_pack_cmo
name = "\improper Advanced ML-3 \'Medigun\' kit"
desc = "A storage case for a multi-purpose healing gun. Variety hour!"
w_class = ITEMSIZE_NORMAL
max_w_class = ITEMSIZE_NORMAL
/obj/item/weapon/storage/secure/briefcase/ml3m_pack_cmo/New()
..()
new /obj/item/weapon/gun/projectile/cell_loaded/medical/cmo(src)
new /obj/item/ammo_magazine/cell_mag/medical(src)
new /obj/item/ammo_casing/microbattery/medical/brute(src)
new /obj/item/ammo_casing/microbattery/medical/burn(src)
new /obj/item/ammo_casing/microbattery/medical/stabilize(src)
new /obj/item/ammo_casing/microbattery/medical/toxin(src)
new /obj/item/ammo_casing/microbattery/medical/omni(src)

View File

@@ -0,0 +1,340 @@
// The Casing //
/obj/item/ammo_casing/microbattery/medical
name = "\'ML-3/M\' nanite cell - UNKNOWN"
desc = "A miniature nanite fabricator for a medigun."
catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med)
icon_state = "ml3m_batt"
origin_tech = list(TECH_BIO = 2, TECH_MATERIAL = 1, TECH_MAGNETS = 2)
/obj/item/projectile/beam/medical_cell
name = "\improper healing beam"
icon_state = "medbeam"
nodamage = 1
damage = 0
check_armour = "laser"
light_color = "#80F5FF"
combustion = FALSE
muzzle_type = /obj/effect/projectile/muzzle/medigun
tracer_type = /obj/effect/projectile/tracer/medigun
impact_type = /obj/effect/projectile/impact/medigun
/obj/item/projectile/beam/medical_cell/on_hit(var/mob/living/carbon/human/target) //what does it do when it hits someone?
return
/obj/item/ammo_casing/microbattery/medical/brute
name = "\'ML-3/M\' nanite cell - BRUTE"
type_color = "#BF0000"
type_name = "<span style='color:#BF0000;font-weight:bold;'>BRUTE</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/brute
/obj/item/projectile/beam/medical_cell/brute/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustBruteLoss(-5)
else
return 1
/obj/item/ammo_casing/microbattery/medical/burn
name = "\'ML-3/M\' nanite cell - BURN"
type_color = "#FF8000"
type_name = "<span style='color:#FF8000;font-weight:bold;'>BURN</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/burn
/obj/item/projectile/beam/medical_cell/burn/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustFireLoss(-5)
else
return 1
/obj/item/ammo_casing/microbattery/medical/stabilize
name = "\'ML-3/M\' nanite cell - STABILIZE" //Disinfects all open wounds, cures oxy damage
type_color = "#0080FF"
type_name = "<span style='color:#0080FF;font-weight:bold;'>STABILIZE</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/stabilize
/obj/item/projectile/beam/medical_cell/stabilize/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustOxyLoss(-30)
for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO))
var/obj/item/organ/external/O = target.organs_by_name[name]
for (var/datum/wound/W in O.wounds)
if (W.internal)
continue
W.disinfect()
target.add_modifier(/datum/modifier/stabilize, 20 SECONDS)
else
return 1
/datum/modifier/stabilize
name = "stabilize"
desc = "Your injuries are stabilized and your pain abates!"
mob_overlay_state = "cyan_sparkles"
stacks = MODIFIER_STACK_EXTEND
pain_immunity = TRUE
bleeding_rate_percent = 0.1 //only a little
incoming_oxy_damage_percent = 0
/obj/item/ammo_casing/microbattery/medical/toxin
name = "\'ML-3/M\' nanite cell - TOXIN"
type_color = "#00A000"
type_name = "<span style='color:#00A000;font-weight:bold;'>TOXIN</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/toxin
/obj/item/projectile/beam/medical_cell/toxin/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustToxLoss(-5)
else
return 1
/obj/item/ammo_casing/microbattery/medical/omni
name = "\'ML-3/M\' nanite cell - OMNI"
type_color = "#8040FF"
type_name = "<span style='color:#8040FF;font-weight:bold;'>OMNI</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/omni
/obj/item/projectile/beam/medical_cell/omni/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustBruteLoss(-2.5)
target.adjustFireLoss(-2.5)
target.adjustToxLoss(-2.5)
target.adjustOxyLoss(-10)
else
return 1
/obj/item/ammo_casing/microbattery/medical/antirad
name = "\'ML-3/M\' nanite cell - ANTIRAD"
type_color = "#008000"
type_name = "<span style='color:#008000;font-weight:bold;'>ANTIRAD</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/antirad
/obj/item/projectile/beam/medical_cell/antirad/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustToxLoss(-2.5)
target.radiation = max(target.radiation - 150, 0) //same as 5 units of arithrazine, sans the brute damage
else
return 1
/obj/item/ammo_casing/microbattery/medical/brute2
name = "\'ML-3/M\' nanite cell - BRUTE-II"
type_color = "#BF0000"
type_name = "<span style='color:#BF0000;font-weight:bold;'>BRUTE-II</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/brute2
/obj/item/projectile/beam/medical_cell/brute2/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustBruteLoss(-10)
else
return 1
/obj/item/ammo_casing/microbattery/medical/burn2
name = "\'ML-3/M\' nanite cell - BURN-II"
type_color = "#FF8000"
type_name = "<span style='color:#FF8000;font-weight:bold;'>BURN-II</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/burn2
/obj/item/projectile/beam/medical_cell/burn2/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustFireLoss(-10)
else
return 1
/obj/item/ammo_casing/microbattery/medical/stabilize2
name = "\'ML-3/M\' nanite cell - STABILIZE-II" //Disinfects and bandages all open wounds, cures all oxy damage
type_color = "#0080FF"
type_name = "<span style='color:#0080FF;font-weight:bold;'>STABILIZE-II</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/stabilize2
/obj/item/projectile/beam/medical_cell/stabilize2/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustOxyLoss(-200)
for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO))
var/obj/item/organ/external/O = target.organs_by_name[name]
for (var/datum/wound/W in O.wounds)
if(W.internal)
continue
if(O.is_bandaged() == FALSE)
W.bandage()
if(O.is_salved() == FALSE)
W.salve()
W.disinfect()
target.add_modifier(/datum/modifier/stabilize, 20 SECONDS)
else
return 1
/obj/item/ammo_casing/microbattery/medical/omni2
name = "\'ML-3/M\' nanite cell - OMNI-II"
type_color = "#8040FF"
type_name = "<span style='color:#8040FF;font-weight:bold;'>OMNI-II</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/omni2
/obj/item/projectile/beam/medical_cell/omni2/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustBruteLoss(-5)
target.adjustFireLoss(-5)
target.adjustToxLoss(-5)
target.adjustOxyLoss(-30)
else
return 1
/obj/item/ammo_casing/microbattery/medical/toxin2
name = "\'ML-3/M\' nanite cell - TOXIN-II"
type_color = "#00A000"
type_name = "<span style='color:#00A000;font-weight:bold;'>TOXIN-II</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/toxin2
/obj/item/projectile/beam/medical_cell/toxin2/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustToxLoss(-20)
else
return 1
/obj/item/ammo_casing/microbattery/medical/haste
name = "\'ML-3/M\' nanite cell - HASTE"
type_color = "#FF3300"
type_name = "<span style='color:#FF3300;font-weight:bold;'>HASTE</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/haste
/obj/item/projectile/beam/medical_cell/haste/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.add_modifier(/datum/modifier/ml3mhaste, 20 SECONDS)
else
return 1
/datum/modifier/ml3mhaste
name = "haste"
desc = "You can move much faster!"
mob_overlay_state = "haste"
stacks = MODIFIER_STACK_EXTEND
slowdown = -0.5 //a little faster!
evasion = 1.15 //and a little harder to hit!
/obj/item/ammo_casing/microbattery/medical/resist
name = "\'ML-3/M\' nanite cell - RESIST"
type_color = "#555555"
type_name = "<span style='color:#555555;font-weight:bold;'>RESIST</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/resist
/obj/item/projectile/beam/medical_cell/resist/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.add_modifier(/datum/modifier/resistance, 20 SECONDS)
else
return 1
/datum/modifier/resistance
name = "resistance"
desc = "You resist 15% of all incoming damage and stuns!"
mob_overlay_state = "repel_missiles"
stacks = MODIFIER_STACK_EXTEND
disable_duration_percent = 0.85
incoming_damage_percent = 0.85
/obj/item/ammo_casing/microbattery/medical/corpse_mend
name = "\'ML-3/M\' nanite cell - CORPSE MEND"
type_color = "#669900"
type_name = "<span style='color:#669900;font-weight:bold;'>CORPSE MEND</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/corpse_mend
/obj/item/projectile/beam/medical_cell/corpse_mend/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
if(target.stat == DEAD)
target.adjustBruteLoss(-50)
target.adjustFireLoss(-50)
target.adjustToxLoss(-50)
target.adjustOxyLoss(-200)
else
return 1
/obj/item/ammo_casing/microbattery/medical/brute3
name = "\'ML-3/M\' nanite cell - BRUTE-III"
type_color = "#BF0000"
type_name = "<span style='color:#BF0000;font-weight:bold;'>BRUTE-III</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/brute3
/obj/item/projectile/beam/medical_cell/brute3/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustBruteLoss(-20)
else
return 1
/obj/item/ammo_casing/microbattery/medical/burn3
name = "\'ML-3/M\' nanite cell - BURN-III"
type_color = "#FF8000"
type_name = "<span style='color:#FF8000;font-weight:bold;'>BURN-III</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/burn3
/obj/item/projectile/beam/medical_cell/burn3/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustFireLoss(-20)
else
return 1
/obj/item/ammo_casing/microbattery/medical/toxin3
name = "\'ML-3/M\' nanite cell - TOXIN-III"
type_color = "#00A000"
type_name = "<span style='color:#00A000;font-weight:bold;'>TOXIN-III</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/toxin3
/obj/item/projectile/beam/medical_cell/toxin3/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustToxLoss(-20)
else
return 1
/obj/item/ammo_casing/microbattery/medical/omni3
name = "\'ML-3/M\' nanite cell - OMNI-III"
type_color = "#8040FF"
type_name = "<span style='color:#8040FF;font-weight:bold;'>OMNI-III</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/omni3
/obj/item/projectile/beam/medical_cell/omni3/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.adjustBruteLoss(-10)
target.adjustFireLoss(-10)
target.adjustToxLoss(-10)
target.adjustOxyLoss(-60)
else
return 1
// Illegal cells!
/obj/item/ammo_casing/microbattery/medical/shrink
name = "\'ML-3/M\' nanite cell - SHRINK"
type_color = "#910ffc"
type_name = "<span style='color:#910ffc;font-weight:bold;'>SHRINK</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/shrink
/obj/item/projectile/beam/medical_cell/shrink/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.resize(0.5)
target.show_message("<font color='blue'>The beam fires into your body, changing your size!</font>")
target.updateicon()
else
return 1
/obj/item/ammo_casing/microbattery/medical/grow
name = "\'ML-3/M\' nanite cell - GROW"
type_color = "#fc0fdc"
type_name = "<span style='color:#fc0fdc;font-weight:bold;'>GROW</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/grow
/obj/item/projectile/beam/medical_cell/grow/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.resize(2.0)
target.show_message("<font color='blue'>The beam fires into your body, changing your size!</font>")
target.updateicon()
else
return 1
/obj/item/ammo_casing/microbattery/medical/normalsize
name = "\'ML-3/M\' nanite cell - NORMALSIZE"
type_color = "#C70FEC"
type_name = "<span style='color:#C70FEC;font-weight:bold;'>NORMALSIZE</span>"
projectile_type = /obj/item/projectile/beam/medical_cell/normalsize
/obj/item/projectile/beam/medical_cell/normalsize/on_hit(var/mob/living/carbon/human/target)
if(istype(target, /mob/living/carbon/human))
target.resize(1)
target.show_message("<font color='blue'>The beam fires into your body, changing your size!</font>")
target.updateicon()
else
return 1

View File

@@ -0,0 +1,75 @@
// The Gun //
/obj/item/weapon/gun/projectile/cell_loaded/combat
name = "cell-loaded revolver"
desc = "Variety is the spice of life! The KHI-102b 'Nanotech Selectable-Fire Weapon', or NSFW for short, is an unholy hybrid of an ammo-driven \
energy weapon that allows the user to mix and match their own fire modes. Up to four combinations of \
energy beams can be configured at once. Ammo not included."
catalogue_data = list(/datum/category_item/catalogue/information/organization/khi)
description_fluff = "The Kitsuhana 'Nanotech Selectable Fire Weapon' allows one to customize their loadout in the field, or before deploying, to achieve various results in a weapon they are already familiar with wielding."
allowed_magazines = list(/obj/item/ammo_magazine/cell_mag/combat)
/obj/item/weapon/gun/projectile/cell_loaded/combat/prototype
name = "prototype cell-loaded revolver"
desc = "Variety is the spice of life! A prototype based on KHI-102b 'Nanotech Selectable-Fire Weapon', or NSFW for short, is an unholy hybrid of an ammo-driven \
energy weapon that allows the user to mix and match their own fire modes. Up to two combinations of \
energy beams can be configured at once. Ammo not included."
description_info = "This gun is an energy weapon that uses interchangable microbatteries in a magazine. Each battery is a different beam type, and up to three can be loaded in the magazine. Each battery usually provides four discharges of that beam type, and multiple from the same type may be loaded to increase the number of shots for that type."
description_antag = ""
allowed_magazines = list(/obj/item/ammo_magazine/cell_mag/combat/prototype)
origin_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 4, TECH_MAGNETS = 3)
// The Magazine //
/obj/item/ammo_magazine/cell_mag/combat
name = "microbattery magazine"
desc = "A microbattery holder for the \'NSFW\'"
icon_state = "nsfw_mag"
max_ammo = 4
x_offset = 4
catalogue_data = list(/datum/category_item/catalogue/information/organization/khi)
description_info = "This magazine holds NSFW microbatteries to power the NSFW handgun. Up to three can be loaded at once, and each provides four shots of their respective energy type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger."
ammo_type = /obj/item/ammo_casing/microbattery/combat
/obj/item/ammo_magazine/cell_mag/combat/prototype
name = "prototype microbattery magazine"
icon_state = "nsfw_mag_prototype"
max_ammo = 2
x_offset = 6
catalogue_data = null
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_MAGNETS = 2)
// The Pack //
/obj/item/weapon/storage/secure/briefcase/nsfw_pack
name = "\improper KHI-102b \'NSFW\' gun kit"
desc = "A storage case for a multi-purpose handgun. Variety hour!"
w_class = ITEMSIZE_NORMAL
max_w_class = ITEMSIZE_NORMAL
/obj/item/weapon/storage/secure/briefcase/nsfw_pack/New()
..()
new /obj/item/weapon/gun/projectile/cell_loaded/combat(src)
new /obj/item/ammo_magazine/cell_mag/combat(src)
for(var/path in subtypesof(/obj/item/ammo_casing/microbattery/combat))
new path(src)
/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos
name = "\improper KHI-102b \'NSFW\' gun kit"
desc = "A storage case for a multi-purpose handgun. Variety hour!"
w_class = ITEMSIZE_NORMAL
max_w_class = ITEMSIZE_NORMAL
/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos/New()
..()
new /obj/item/weapon/gun/projectile/cell_loaded/combat(src)
new /obj/item/ammo_magazine/cell_mag/combat(src)
new /obj/item/ammo_casing/microbattery/combat/lethal(src)
new /obj/item/ammo_casing/microbattery/combat/lethal(src)
new /obj/item/ammo_casing/microbattery/combat/stun(src)
new /obj/item/ammo_casing/microbattery/combat/stun(src)
new /obj/item/ammo_casing/microbattery/combat/stun(src)
new /obj/item/ammo_casing/microbattery/combat/net(src)
new /obj/item/ammo_casing/microbattery/combat/ion(src)

View File

@@ -0,0 +1,115 @@
// The Casing //
/obj/item/ammo_casing/microbattery/combat
name = "\'NSFW\' microbattery - UNKNOWN"
desc = "A miniature battery for an energy weapon."
catalogue_data = list(/datum/category_item/catalogue/information/organization/khi)
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 1, TECH_MAGNETS = 2)
/obj/item/ammo_casing/microbattery/combat/lethal
name = "\'NSFW\' microbattery - LETHAL"
type_color = "#bf3d3d"
type_name = "<span style='color:#bf3d3d;font-weight:bold;'>LETHAL</span>"
projectile_type = /obj/item/projectile/beam
/obj/item/ammo_casing/microbattery/combat/stun
name = "\'NSFW\' microbattery - STUN"
type_color = "#0f81bc"
type_name = "<span style='color:#0f81bc;font-weight:bold;'>STUN</span>"
projectile_type = /obj/item/projectile/beam/stun/blue
/obj/item/ammo_casing/microbattery/combat/net
name = "\'NSFW\' microbattery - NET"
type_color = "#43f136"
type_name = "<span style='color:#43d136;font-weight:bold;'>NET</span>"
projectile_type = /obj/item/projectile/beam/energy_net
/obj/item/ammo_casing/microbattery/combat/xray
name = "\'NSFW\' microbattery - XRAY"
type_color = "#32c025"
type_name = "<span style='color:#32c025;font-weight:bold;'>XRAY</span>"
projectile_type = /obj/item/projectile/beam/xray
/obj/item/ammo_casing/microbattery/combat/shotstun
name = "\'NSFW\' microbattery - SCATTERSTUN"
type_color = "#88ffff"
type_name = "<span style='color:#88ffff;font-weight:bold;'>SCATTERSTUN</span>"
projectile_type = /obj/item/projectile/bullet/pellet/e_shot_stun
/obj/item/projectile/bullet/pellet/e_shot_stun
icon_state = "spell"
damage = 2
agony = 20
pellets = 6 //number of pellets
range_step = 2 //projectile will lose a fragment each time it travels this distance. Can be a non-integer.
base_spread = 90 //lower means the pellets spread more across body parts. If zero then this is considered a shrapnel explosion instead of a shrapnel cone
spread_step = 10
embed_chance = 0
sharp = 0
check_armour = "melee"
/obj/item/ammo_casing/microbattery/combat/ion
name = "\'NSFW\' microbattery - ION"
type_color = "#d084d6"
type_name = "<span style='color:#d084d6;font-weight:bold;'>ION</span>"
projectile_type = /obj/item/projectile/ion/small
/obj/item/ammo_casing/microbattery/combat/stripper
name = "\'NSFW\' microbattery - STRIPPER"
type_color = "#fc8d0f"
type_name = "<span style='color:#fc8d0f;font-weight:bold;'>STRIPPER</span>"
projectile_type = /obj/item/projectile/bullet/stripper
/obj/item/projectile/bullet/stripper
icon_state = "magicm"
nodamage = 1
agony = 5
embed_chance = 0
sharp = 0
check_armour = "melee"
/obj/item/projectile/bullet/stripper/on_hit(var/atom/stripped)
if(ishuman(stripped))
var/mob/living/carbon/human/H = stripped
if(H.wear_suit)
H.unEquip(H.wear_suit)
if(H.w_uniform)
H.unEquip(H.w_uniform)
if(H.back)
H.unEquip(H.back)
if(H.shoes)
H.unEquip(H.shoes)
if(H.gloves)
H.unEquip(H.gloves)
//Hats can stay! Most other things fall off with removing these.
..()
/obj/item/ammo_casing/microbattery/combat/final
name = "\'NSFW\' microbattery - FINAL OPTION"
type_color = "#fcfc0f"
type_name = "<span style='color:#000000;font-weight:bold;'>FINAL OPTION</span>" //Doesn't look good in yellow in chat
projectile_type = /obj/item/projectile/beam/final_option
/obj/item/projectile/beam/final_option
name = "final option beam"
icon_state = "omnilaser"
nodamage = 1
agony = 5
damage_type = HALLOSS
light_color = "#00CC33"
muzzle_type = /obj/effect/projectile/muzzle/laser_omni
tracer_type = /obj/effect/projectile/tracer/laser_omni
impact_type = /obj/effect/projectile/impact/laser_omni
/obj/item/projectile/beam/final_option/on_hit(var/atom/impacted)
if(isliving(impacted))
var/mob/living/L = impacted
if(L.mind)
var/nif
if(ishuman(L))
var/mob/living/carbon/human/H = L
nif = H.nif
SStranscore.m_backup(L.mind,nif,one_time = TRUE)
L.gib()
..()

View File

@@ -0,0 +1,40 @@
/obj/item/weapon/gun/projectile/automatic/fluff/crestrose
name = "Crescent Rose"
desc = "Can you match my resolve? If so then you will succeed. I believe that the human spirit is indomitable. Keep Moving Forward. Uses 7.62mm rounds."
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "crestrose_fold"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = "laser" //placeholder
w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 4)
slot_flags = null
fire_sound = 'sound/weapons/Gunshot_light.ogg'
load_method = MAGAZINE
force = 3
recoil = 2
auto_eject = 1
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
hitsound = null
caliber = "s762"
magazine_type = /obj/item/ammo_magazine/m762
allowed_magazines = list(/obj/item/ammo_magazine/m762)
firemodes = list(
list(mode_name="fold", icon_state="crestrose_fold",item_state = "laser",force=3),
list(mode_name="scythe", icon_state="crestrose",item_state = "crestrose",force=15),
)
/obj/item/weapon/gun/projectile/automatic/fluff/crestrose/switch_firemodes(mob/user)
if(..())
update_icon()
update_held_icon()
/obj/item/weapon/gun/projectile/automatic/fluff/crestrose/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(default_parry_check(user, attacker, damage_source) && prob(50))
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1)
return 1
return 0

View File

@@ -0,0 +1,50 @@
// -------------- Dominator -------------
/obj/item/weapon/gun/energy/gun/fluff/dominator
name = "bulky energy gun"
desc = "A MWPSB Dominator from the Federation. Like the basic Energy Gun, this gun has two settings. It is used by the United Federation Public Safety Bureau's Criminal Investigation Division. The weapon can only be fired by the owner and is alert-level locked."
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "dominatorstun100"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = null
item_icons = null
fire_sound = 'sound/weapons/Taser.ogg'
projectile_type = /obj/item/projectile/beam/stun
modifystate = "dominatorstun"
dna_lock = 1
firemodes = list(
list(mode_name="stun", charge_cost=240,projectile_type=/obj/item/projectile/beam/stun, modifystate="dominatorstun", fire_sound='sound/weapons/Taser.ogg'),
list(mode_name="lethal", charge_cost=480,projectile_type=/obj/item/projectile/beam/dominator, modifystate="dominatorkill", fire_sound='sound/weapons/gauss_shoot.ogg'),
)
var/emagged = FALSE
/obj/item/weapon/gun/energy/gun/fluff/dominator/special_check(mob/user)
if(!emagged && mode_name == "lethal" && get_security_level() == "green")
to_chat(user,"<span class='warning'>The trigger refuses to depress while on the lethal setting under security level green!</span>")
return FALSE
return ..()
/obj/item/weapon/gun/energy/gun/fluff/dominator/emag_act(var/remaining_charges,var/mob/user)
..()
if(!emagged)
emagged = TRUE
to_chat(user,"<span class='warning'>You disable the alert level locking mechanism on \the [src]!</span>")
return TRUE
// Dominator Ammo
/obj/item/projectile/beam/dominator
name = "dominator lethal beam"
icon_state = "xray"
muzzle_type = /obj/effect/projectile/muzzle/xray
tracer_type = /obj/effect/projectile/tracer/xray
impact_type = /obj/effect/projectile/impact/xray

View File

@@ -0,0 +1,127 @@
/obj/item/weapon/gun/energy/gun/fluff/gunsword
name = "Sword Buster"
desc = "The Sword Buster gun is custom built using the science behind a Golden Empire pistol. The cell can be removed in close range and used as energy shortsword."
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "gbuster100"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = null
item_icons = null
w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 4)
slot_flags = null
projectile_type = /obj/item/projectile/beam/stun
fire_sound = 'sound/weapons/gauss_shoot.ogg'
charge_meter = 1
cell_type = /obj/item/weapon/cell/device/weapon/gunsword
modifystate = "gbuster"
firemodes = list(
list(mode_name="stun", charge_cost=240,projectile_type=/obj/item/projectile/beam/stun, modifystate="gbuster", fire_sound='sound/weapons/Taser.ogg'),
list(mode_name="lethal", charge_cost=480,projectile_type=/obj/item/projectile/beam, modifystate="gbuster", fire_sound='sound/weapons/gauss_shoot.ogg'),
)
// -----------------gunsword battery--------------------------
/obj/item/weapon/cell/device/weapon/gunsword
name = "Buster Cell"
desc = "The Buster Cell. It doubles as a sword when activated outside the gun housing."
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "gsaberoff"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = "gsaberoff"
maxcharge = 2400
charge_amount = 20
force = 3
throwforce = 5
throw_speed = 1
throw_range = 5
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 5)
var/active = 0
var/active_force = 30
var/active_throwforce = 20
var/active_w_class = ITEMSIZE_LARGE
var/active_embed_chance = 0 //In the off chance one of these is supposed to embed, you can just tweak this var
sharp = 0
edge = 0
armor_penetration = 50
flags = NOBLOODY
var/lrange = 2
var/lpower = 2
var/lcolor = "#800080"
/obj/item/weapon/cell/device/weapon/gunsword/proc/activate(mob/living/user)
if(active)
return
icon_state = "gsaber"
item_state = "gsaber"
active = 1
embed_chance = active_embed_chance
force = active_force
throwforce = active_throwforce
sharp = 1
edge = 1
w_class = active_w_class
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
set_light(lrange, lpower, lcolor)
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
/obj/item/weapon/cell/device/weapon/gunsword/proc/deactivate(mob/living/user)
if(!active)
return
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
icon_state = "gsaberoff"
item_state = "gsaberoff"
active = 0
embed_chance = initial(embed_chance)
force = initial(force)
throwforce = initial(throwforce)
sharp = initial(sharp)
edge = initial(edge)
w_class = initial(w_class)
set_light(0,0)
attack_verb = list()
/obj/item/weapon/cell/device/weapon/gunsword/attack_self(mob/living/user as mob)
var/datum/gender/TU = gender_datums[user.get_visible_gender()]
if (active)
if ((CLUMSY in user.mutations) && prob(50))
user.visible_message("<span class='danger'>\The [user] accidentally cuts [TU.himself] with \the [src].</span>",\
"<span class='danger'>You accidentally cut yourself with \the [src].</span>")
user.take_organ_damage(5,5)
deactivate(user)
update_icon()
update_held_icon()
else
activate(user)
update_icon()
update_held_icon()
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.update_inv_l_hand()
H.update_inv_r_hand()
add_fingerprint(user)
return
/obj/item/weapon/cell/device/weapon/gunsword/suicide_act(mob/user)
var/datum/gender/TU = gender_datums[user.get_visible_gender()]
if(active)
user.visible_message(pick("<span class='danger'>\The [user] is slitting [TU.his] stomach open with \the [src]! It looks like [TU.he] [TU.is] trying to commit seppuku.</span>",\
"<span class='danger'>\The [user] is falling on \the [src]! It looks like [TU.he] [TU.is] trying to commit suicide.</span>"))
return (BRUTELOSS|FIRELOSS)
/obj/item/weapon/cell/device/weapon/gunsword/update_icon()
overlays.Cut()

View File

@@ -0,0 +1,304 @@
/* TUTORIAL
"icon" is the file with the HUD/ground icon for the item
"icon_state" is the iconstate in this file for the item
"icon_override" is the file with the on-mob icons, can be the same file
"item_state" is the iconstate for the on-mob icons:
item_state_s is used for worn uniforms on mobs
item_state_r and item_state_l are for being held in each hand
"item_state_slots" can replace "item_state", it is a list:
item_state_slots["slotname1"] = "item state for that slot"
item_state_slots["slotname2"] = "item state for that slot"
on guns, in particular:
item_state being null makes it look for exactly the icon_state in the on-mob file,
including any 0,75,etc appended from the energy bar setting
item_state being present prevents different mode sprites, sadly, but you may
be able to override this on the gun itself with a proc
*/
/* TEMPLATE
//ckey:Character Name
/obj/item/weapon/gun/type/fluff/charactername
name = ""
desc = ""
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "myicon"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = "myicon"
*/
// For general use
/obj/item/weapon/gun/energy/imperial
name = "imperial energy pistol"
desc = "An elegant weapon developed by the Imperium Auream. Their weaponsmiths have cleverly found a way to make a gun that is only about the size of an average energy pistol, yet with the fire power of a laser carbine."
icon_state = "ge_pistol"
item_state = "ge_pistol"
fire_sound = 'sound/weapons/mandalorian.ogg'
icon = 'icons/obj/gun_vr.dmi'
item_icons = list(slot_r_hand_str = 'icons/obj/gun_vr.dmi', slot_l_hand_str = 'icons/obj/gun_vr.dmi') // WORK YOU FUCKING CUNT PIECE OF SHIT BASTARD STUPID BITCH ITEM ICON AAAAHHHH
item_state_slots = list(slot_r_hand_str = "ge_pistol_r", slot_l_hand_str = "ge_pistol_l")
slot_flags = SLOT_BELT
w_class = ITEMSIZE_NORMAL
force = 10
origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2)
matter = list(DEFAULT_WALL_MATERIAL = 2000)
projectile_type = /obj/item/projectile/beam/imperial
// Removed because gun64_vr.dmi guns don't work.
/*
//-----------------------G44 Energy Variant--------------------
/obj/item/weapon/gun/energy/gun/burst/g44e
name = "G44 Energy Rifle"
desc = "The G44 Energy is a laser variant of the G44 lightweight assault rifle manufactured by the National Armory of Gaia. Though almost exclusively to the United Federation's Military Assault Command Operations Department (MACOs) and Starfleet, it is occassionally sold to security departments for their stun capabilities."
icon = 'icons/obj/gun64_vr.dmi'
icon_state = "g44estun100"
item_state = "energystun100" //This is temporary.
fire_sound = 'sound/weapons/Taser.ogg'
charge_cost = 100
force = 8
w_class = ITEMSIZE_LARGE
fire_delay = 6
pixel_x = -16
projectile_type = /obj/item/projectile/beam/stun/weak
origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2, TECH_ILLEGAL = 3)
modifystate = "g44estun"
one_handed_penalty = 60
firemodes = list(
list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="g44estun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 100),
list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="g44estun", fire_sound='sound/weapons/Taser.ogg'),
list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="g44ekill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 200),
list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="g44ekill", fire_sound='sound/weapons/Laser.ogg'),
)
*/
//////////////////// Energy Weapons ////////////////////
// ------------ Energy Luger ------------
/obj/item/weapon/gun/energy/gun/eluger
name = "energy Luger"
desc = "The finest sidearm produced by RauMauser. Although its battery cannot be removed, its ergonomic design makes it easy to shoot, allowing for rapid follow-up shots. It also has the ability to toggle between stun and kill."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "elugerstun100"
item_state = "gun"
fire_delay = null // Lugers are quite comfortable to shoot, thus allowing for more controlled follow-up shots. Rate of fire similar to a laser carbine.
battery_lock = 1 // In exchange for balance, you cannot remove the battery. Also there's no sprite for that and I fucking suck at sprites. -Ace
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2, TECH_ILLEGAL = 2) // Illegal tech cuz Space Nazis
modifystate = "elugerstun"
fire_sound = 'sound/weapons/Taser.ogg'
firemodes = list(
list(mode_name="stun", charge_cost=120,projectile_type=/obj/item/projectile/beam/stun, modifystate="elugerstun", fire_sound='sound/weapons/Taser.ogg'),
list(mode_name="lethal", charge_cost=240,projectile_type=/obj/item/projectile/beam/eluger, modifystate="elugerkill", fire_sound='sound/weapons/eluger.ogg'),
)
//////////////////// Eris Ported Guns ////////////////////
//HoP gun
/obj/item/weapon/gun/energy/gun/martin
name = "holdout energy gun"
desc = "The FS PDW E \"Martin\" is small holdout e-gun. Don't miss!"
icon = 'icons/obj/gun_vr.dmi'
icon_state = "PDW"
item_state = "gun"
w_class = ITEMSIZE_SMALL
projectile_type = /obj/item/projectile/beam/stun
charge_cost = 1200
charge_meter = 0
modifystate = null
battery_lock = 1
fire_sound = 'sound/weapons/Taser.ogg'
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, fire_sound='sound/weapons/Taser.ogg', charge_cost = 600),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, fire_sound='sound/weapons/Laser.ogg', charge_cost = 1200),
)
/obj/item/weapon/gun/energy/gun/martin/proc/update_mode()
var/datum/firemode/current_mode = firemodes[sel_mode]
switch(current_mode.name)
if("stun") add_overlay("taser_pdw")
if("lethal") add_overlay("lazer_pdw")
/obj/item/weapon/gun/energy/gun/martin/update_icon()
cut_overlays()
update_mode()
/////////////////////////////////////////////////////
//////////////////// Custom Ammo ////////////////////
/////////////////////////////////////////////////////
//---------------- Beams ----------------
/obj/item/projectile/beam/eluger
name = "laser beam"
icon_state = "xray"
light_color = "#00FF00"
muzzle_type = /obj/effect/projectile/muzzle/xray
tracer_type = /obj/effect/projectile/tracer/xray
impact_type = /obj/effect/projectile/impact/xray
/obj/item/projectile/beam/imperial
name = "laser beam"
fire_sound = 'sound/weapons/mandalorian.ogg'
icon_state = "darkb"
light_color = "#8837A3"
muzzle_type = /obj/effect/projectile/muzzle/darkmatter
tracer_type = /obj/effect/projectile/tracer/darkmatter
impact_type = /obj/effect/projectile/impact/darkmatter
/obj/item/projectile/beam/stun/kin21
name = "kinh21 stun beam"
icon_state = "omnilaser"
light_color = "#0000FF"
muzzle_type = /obj/effect/projectile/muzzle/laser_omni
tracer_type = /obj/effect/projectile/tracer/laser_omni
impact_type = /obj/effect/projectile/impact/laser_omni
//Gun Locking Mechanism
/obj/item/weapon/gun/energy/locked
req_access = list(access_armory) //for toggling safety
var/locked = 1
var/lockable = 1
/obj/item/weapon/gun/energy/locked/attackby(obj/item/I, mob/user)
var/obj/item/weapon/card/id/id = I.GetID()
if(!lockable)
return ..()
if(istype(id))
if(check_access(id))
locked = !locked
to_chat(user, "<span class='warning'>You [locked ? "enable" : "disable"] the safety lock on \the [src].</span>")
else
to_chat(user, "<span class='warning'>Access denied.</span>")
user.visible_message("<span class='notice'>[user] swipes \the [I] against \the [src].</span>")
else
return ..()
/obj/item/weapon/gun/energy/locked/emag_act(var/remaining_charges,var/mob/user)
..()
if(locked)
locked = !locked
to_chat(user, "<span class='warning'>You [locked ? "enable" : "disable"] the safety lock on \the [src]!</span>")
/obj/item/weapon/gun/energy/locked/special_check(mob/user)
if(locked)
var/turf/T = get_turf(src)
if(T.z in using_map.map_levels)
to_chat(user, "<span class='warning'>The safety device prevents the gun from firing this close to the facility.</span>")
return 0
return ..()
//Expedition Frontier Phaser
/obj/item/weapon/gun/energy/locked/frontier
name = "frontier phaser"
desc = "An extraordinarily rugged laser weapon, built to last and requiring effectively no maintenance. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "phaser"
item_state = "phaser"
item_icons = list(slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi', slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi', "slot_belt" = 'icons/mob/belt_vr.dmi')
fire_sound = 'sound/weapons/laser2.ogg'
origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2, TECH_POWER = 4)
charge_cost = 300
battery_lock = 1
unacidable = 1
var/recharging = 0
var/phase_power = 75
projectile_type = /obj/item/projectile/beam
firemodes = list(
list(mode_name="lethal", fire_delay=12, projectile_type=/obj/item/projectile/beam, charge_cost = 300),
list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60),
)
/obj/item/weapon/gun/energy/locked/frontier/unload_ammo(var/mob/user)
if(recharging)
return
recharging = 1
update_icon()
user.visible_message("<span class='notice'>[user] opens \the [src] and starts pumping the handle.</span>", \
"<span class='notice'>You open \the [src] and start pumping the handle.</span>")
while(recharging)
if(!do_after(user, 10, src))
break
playsound(get_turf(src),'sound/items/change_drill.ogg',25,1)
if(power_supply.give(phase_power) < phase_power)
break
recharging = 0
update_icon()
/obj/item/weapon/gun/energy/locked/frontier/update_icon()
if(recharging)
icon_state = "[initial(icon_state)]_pump"
update_held_icon()
return
..()
/obj/item/weapon/gun/energy/locked/frontier/emp_act(severity)
return ..(severity+2)
/obj/item/weapon/gun/energy/locked/frontier/ex_act() //|rugged|
return
/obj/item/weapon/gun/energy/locked/frontier/unlocked
desc = "An extraordinarily rugged laser weapon, built to last and requiring effectively no maintenance. Includes a built-in crank charger for recharging away from civilization."
req_access = newlist() //for toggling safety
locked = 0
lockable = 0
//Phaser Carbine - Reskinned phaser
/obj/item/weapon/gun/energy/locked/frontier/carbine
name = "frontier carbine"
desc = "An ergonomically improved version of the venerable frontier phaser, the carbine is a fairly new weapon, and has only been produced in limited numbers so far. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "carbinekill"
item_state = "retro"
item_icons = list(slot_l_hand_str = 'icons/mob/items/lefthand_guns.dmi', slot_r_hand_str = 'icons/mob/items/righthand_guns.dmi')
modifystate = "carbinekill"
firemodes = list(
list(mode_name="lethal", fire_delay=12, projectile_type=/obj/item/projectile/beam, modifystate="carbinekill", charge_cost = 300),
list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser, modifystate="carbinestun", charge_cost = 60),
)
/obj/item/weapon/gun/energy/locked/frontier/carbine/update_icon()
if(recharging)
icon_state = "[modifystate]_pump"
update_held_icon()
return
..()
/obj/item/weapon/gun/energy/locked/frontier/carbine/unlocked
desc = "An ergonomically improved version of the venerable frontier phaser, the carbine is a fairly new weapon, and has only been produced in limited numbers so far."
req_access = newlist() //for toggling safety
locked = 0
lockable = 0
//Expeditionary Holdout Phaser Pistol
/obj/item/weapon/gun/energy/locked/frontier/holdout
name = "holdout frontier phaser"
desc = "An minaturized weapon designed for the purpose of expeditionary support to defend themselves on the field. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "holdoutkill"
item_state = null
phase_power = 100
w_class = ITEMSIZE_SMALL
charge_cost = 600
modifystate = "holdoutkill"
firemodes = list(
list(mode_name="lethal", fire_delay=12, projectile_type=/obj/item/projectile/beam, modifystate="holdoutkill", charge_cost = 600),
list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser, modifystate="holdoutstun", charge_cost = 120),
list(mode_name="stun", fire_delay=12, projectile_type=/obj/item/projectile/beam/stun/med, modifystate="holdoutshock", charge_cost = 300),
)
/obj/item/weapon/gun/energy/locked/frontier/holdout/unlocked
desc = "An minaturized weapon designed for the purpose of expeditionary support to defend themselves on the field. Includes a built-in crank charger for recharging away from civilization."
req_access = newlist() //for toggling safety
locked = 0
lockable = 0

View File

@@ -1,35 +1,12 @@
/obj/item/weapon/gun/energy/netgun
name = "energy net gun"
desc = "A Kitsuhana-designed, usually dubbed 'Hunter' or 'non-lethal capture device' stunner and energy net launcher, \
for when you want criminals to stop acting like they're on a 20th century British comedy sketch show."
catalogue_data = list(/datum/category_item/catalogue/information/organization/khi)
desc = "Specially made-to-order by Xenonomix, the XX-1 \"Varmint Catcher\" is designed to trap even the most unruly of creatures for safe transport."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "hunter"
icon_state = "netgun"
item_state = "gun" // Placeholder
mode_name = "stun"
fire_sound = 'sound/weapons/eluger.ogg'
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_MAGNET = 3)
projectile_type = /obj/item/projectile/beam/stun/blue
charge_cost = 240
fire_delay = 5
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/blue, fire_sound='sound/weapons/Taser.ogg', charge_cost=240, fire_delay=5),
list(mode_name="capture", projectile_type=/obj/item/projectile/beam/energy_net, fire_sound = 'sound/weapons/eluger.ogg', charge_cost=1200, fire_delay=50)
)
/obj/item/weapon/gun/energy/netgun/update_icon()
overlays.Cut()
if(power_supply)
var/ratio = power_supply.charge / power_supply.maxcharge
if(power_supply.charge < charge_cost)
ratio = 0
else
ratio = max(round(ratio, 0.25) * 100, 25)
overlays += "[initial(icon_state)]_cell"
overlays += "[initial(icon_state)]_[ratio]"
overlays += "[initial(icon_state)]_[mode_name]"
projectile_type = /obj/item/projectile/beam/energy_net
charge_cost = 800
fire_delay = 50

View File

@@ -0,0 +1,104 @@
// -------------- Protector -------------
/obj/item/weapon/gun/energy/gun/protector
name = "secure small energy gun"
desc = "The LAEP95 'Protector' is another firearm from Lawson Arms and "+TSC_HEPH+", unlike the Perun this is designed for issue to non-security staff. It contains a detachable cell, and an alert-level-locked lethal mode, only usable on code blue and higher. It also features an integrated flashlight!"
description_info = "This gun can only be fired in lethal mode while on higher security alert levels. It is legal for sec to carry for this reason, since it cannot be used for lethal force until SOP allows it, in essence."
description_fluff = "A lighter weapon designed for non-security staff, this gun has a wireless connection to the computer's datacore to ensure it can't be used without authorization from heads of staff who have raised the alert level. Until then, *click*!"
description_antag = "The gun can be emagged to remove the lethal security level restriction, allowing it to be fired on lethal mode at all times."
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "prot"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = "gun"
fire_sound = 'sound/weapons/Taser.ogg'
projectile_type = /obj/item/projectile/beam/stun
modifystate = "stun"
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2)
charge_sections = 3 //For the icon
ammo_x_offset = 2
ammo_y_offset = 0
can_flashlight = TRUE
light_state = "prot_light"
flight_x_offset = 0
flight_y_offset = 0
w_class = ITEMSIZE_SMALL
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="stun", charge_cost = 400),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="kill", charge_cost = 800),
)
var/emagged = FALSE
/obj/item/weapon/gun/energy/gun/protector/special_check(mob/user)
if(!emagged && mode_name == "lethal" && get_security_level() == "green")
to_chat(user,"<span class='warning'>The trigger refuses to depress while on the lethal setting under security level green!</span>")
return FALSE
return ..()
/obj/item/weapon/gun/energy/gun/protector/emag_act(var/remaining_charges,var/mob/user)
..()
if(!emagged)
emagged = TRUE
to_chat(user,"<span class='warning'>You disable the alert level locking mechanism on \the [src]!</span>")
return TRUE
//Update icons from /tg/, so fancy! Use this more!
/obj/item/weapon/gun/energy/gun/protector/update_icon()
overlays.Cut()
var/ratio = 0
/* Don't have one for this gun
var/itemState = null
if(!initial(item_state))
itemState = icon_state
*/
var/iconState = "[icon_state]_charge"
if (modifystate)
overlays += "[icon_state]_[modifystate]"
iconState += "_[modifystate]"
/* Don't have one for this gun
if(itemState)
itemState += "[modifystate]"
*/
if(power_supply)
ratio = CEILING(((power_supply.charge / power_supply.maxcharge) * charge_sections), 1)
if(power_supply.charge < charge_cost)
overlays += "[icon_state]_empty"
else
if(!shaded_charge)
var/mutable_appearance/charge_overlay = mutable_appearance(icon, iconState)
for(var/i = ratio, i >= 1, i--)
charge_overlay.pixel_x = ammo_x_offset * (i - 1)
overlays += charge_overlay
else
overlays += "[icon_state]_[modifystate][ratio]"
if(can_flashlight & gun_light)
var/mutable_appearance/flashlight_overlay = mutable_appearance(icon, light_state)
flashlight_overlay.pixel_x = flight_x_offset
flashlight_overlay.pixel_y = flight_y_offset
overlays += flashlight_overlay
/* Don't have one for this gun
if(itemState)
itemState += "[ratio]"
item_state = itemState
*/
/obj/item/weapon/gun/energy/gun/protector/unlocked
emagged = TRUE
name = "small energy gun"
desc = "The LAEP95 'Protector' is another firearm from Lawson Arms and "+TSC_HEPH+", unlike the Perun this is designed for issue to non-security staff. It contains a detachable cell. It also features an integrated flashlight!"

View File

@@ -0,0 +1,48 @@
// -------------- Pummeler -------------
/obj/item/weapon/gun/energy/pummeler
name = "hypersonic gun"
desc = "For when you want to get that pesky marketing guy out of your face ASAP. The PML9 'Pummeler' fires one HUGE \
sonic blast in the direction of fire, throwing the target away from you at high speed. Now you can REALLY \
turn up the bass to max."
description_info = "This gun punts people away and has a chance of knocking them down briefly. It may also throw them over railings in the process!"
description_fluff = ""
description_antag = ""
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "pum"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = "gun"
fire_sound = 'sound/effects/basscannon.ogg'
projectile_type = /obj/item/projectile/pummel
charge_cost = 600
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 5)
slot_flags = SLOT_BELT|SLOT_BACK
w_class = ITEMSIZE_LARGE
//Projectile
/obj/item/projectile/pummel
name = "sonic blast"
icon_state = "sound"
damage = 5
damage_type = BRUTE
check_armour = "melee"
embed_chance = 0
vacuum_traversal = 0
range = 6 //Scary name, but just deletes the projectile after this range
/obj/item/projectile/pummel/on_hit(var/atom/movable/target, var/blocked = 0)
if(isliving(target))
var/mob/living/L = target
var/throwdir = get_dir(firer,L)
if(prob(40) && !blocked)
L.Stun(1)
L.Confuse(1)
L.throw_at(get_edge_target_turf(L, throwdir), rand(3,6), 10)
return 1

View File

@@ -0,0 +1,48 @@
// -------------- Sickshot -------------
/obj/item/weapon/gun/energy/sickshot
name = "\'Sickshot\' revolver"
desc = "Need to stun someone? Don't mind having to clean up the mess afterwards? The MPA6 'Sickshot' is the answer to your prayers. \
Using a short-range concentrated blast of disruptive sound, the Sickshot will nauseate and confuse the target for several seconds. NOTE: Not suitable \
for use in vacuum. Usage on animals may cause panic and rage without stunning. May cause contraction and release of various 'things' from various 'orifices', even if the target is already dead."
description_info = "This gun causes nausea in targets, stunning them briefly and causing vomiting. It will also cause them to vomit up prey, sometimes. Repeated shots may help in that case."
description_fluff = ""
description_antag = ""
icon = 'icons/vore/custom_guns_vr.dmi'
icon_state = "sickshot"
icon_override = 'icons/vore/custom_guns_vr.dmi'
item_state = "gun"
fire_sound = 'sound/weapons/eluger.ogg'
projectile_type = /obj/item/projectile/sickshot
charge_cost = 600
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 2)
//Projectile
/obj/item/projectile/sickshot
name = "sickshot pulse"
icon_state = "sound"
damage = 5
armor_penetration = 30
damage_type = BURN
check_armour = "melee"
embed_chance = 0
vacuum_traversal = 0
range = 5 //Scary name, but just deletes the projectile after this range
/obj/item/projectile/sickshot/on_hit(var/atom/movable/target, var/blocked = 0)
if(isliving(target))
var/mob/living/L = target
if(prob(20))
L.release_vore_contents()
if(ishuman(target))
var/mob/living/carbon/human/H = target
H.vomit()
H.Confuse(2)
return 1

View File

@@ -1,2 +1,226 @@
/obj/item/weapon/gun/projectile/automatic/wt550/lethal
magazine_type = /obj/item/ammo_magazine/m9mmt
magazine_type = /obj/item/ammo_magazine/m9mmt
////////////////////////////////////////////////////////////
//////////////////// Projectile Weapons ////////////////////
////////////////////////////////////////////////////////////
// For general use
/obj/item/weapon/gun/projectile/automatic/battlerifle
name = "\improper USDF service rifle"
desc = "You had your chance to be afraid before you joined my beloved Corps! But, to guide you back to the true path, I have brought this motivational device! Uses 9.5x40mm rounds."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "battlerifle"
icon_override = 'icons/obj/gun_vr.dmi'
item_state = "battlerifle_i"
item_icons = null
w_class = ITEMSIZE_LARGE
recoil = 2 // The battlerifle was known for its nasty recoil.
max_shells = 36
caliber = "9.5x40mm"
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2)
magazine_type = /obj/item/ammo_magazine/m95
allowed_magazines = list(/obj/item/ammo_magazine/m95)
fire_sound = 'sound/weapons/battlerifle.ogg'
load_method = MAGAZINE
slot_flags = SLOT_BACK
one_handed_penalty = 60 // The weapon itself is heavy
// For general use
/obj/item/weapon/gun/projectile/automatic/pdw
name = "personal defense weapon"
desc = "The X-9MM is a select-fire personal defense weapon designed in-house by Xing Private Security. It was made to compete with the WT550 Saber, but never caught on with NanoTrasen. Uses 9mm rounds."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "pdw"
item_state = "c20r" // Placeholder
w_class = ITEMSIZE_NORMAL
caliber = "9mm"
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2)
slot_flags = SLOT_BELT
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/m9mml
allowed_magazines = list(/obj/item/ammo_magazine/m9mm, /obj/item/ammo_magazine/m9mml)
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=6, burst_accuracy=list(0,-15,-30), dispersion=list(0.0, 0.6, 0.6))
)
/obj/item/weapon/gun/projectile/automatic/pdw/update_icon(var/ignore_inhands)
..()
if(istype(ammo_magazine,/obj/item/ammo_magazine/m9mm))
icon_state = "pdw-short"
else
icon_state = (ammo_magazine)? "pdw" : "pdw-empty"
if(!ignore_inhands) update_held_icon()
// For general use
/obj/item/weapon/gun/projectile/automatic/stg
name = "\improper Sturmgewehr"
desc = "An STG-560 built by RauMauser. Experience the terror of the Siegfried line, redone for the 26th century! The Kaiser would be proud. Uses unique 7.92x33mm Kurz rounds."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "stg60"
item_state = "arifle"
w_class = ITEMSIZE_LARGE
max_shells = 30
caliber = "7.92x33mm"
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_ILLEGAL = 6)
magazine_type = /obj/item/ammo_magazine/mtg
allowed_magazines = list(/obj/item/ammo_magazine/mtg)
load_method = MAGAZINE
/obj/item/weapon/gun/projectile/automatic/stg/update_icon(var/ignore_inhands)
..()
icon_state = (ammo_magazine)? "stg60" : "stg60-empty"
item_state = (ammo_magazine)? "arifle" : "arifle-empty"
if(!ignore_inhands) update_held_icon()
// Removed because gun64_vr.dmi guns don't work.
/*
//-----------------------UF-ARC----------------------------------
/obj/item/weapon/gun/projectile/automatic/carbine/fluff/ufarc
name = "UF-ARC"
desc = "The UF-ARC is a lightweight assault rifle manufactured by the National Armory of Gaia and sold almost exclusively to the United Federation's standing army, the Military Assault Command Operations Department (MACOs)."
icon = 'icons/obj/gun64_vr.dmi'
icon_state = "ufarc"
icon_override = 'icons/obj/gun_vr.dmi'
item_state = "battlerifle_i"
item_icons = null
pixel_x = -16
/obj/item/weapon/gun/projectile/automatic/carbine/fluff/ufarc/update_icon(var/ignore_inhands)
..()
// TODO - Fix this for spriting different size magazines
icon_state = (ammo_magazine)? "ufarc" : "ufarc-empty"
item_state = (ammo_magazine)? "bullpup" : "bullpup-empty"
if(!ignore_inhands) update_held_icon()
//-----------------------G44----------------------------------
/obj/item/weapon/gun/projectile/automatic/carbine/fluff/g44
name = "G44 Rifle"
desc = "The G44 is a lightweight assault rifle manufactured by the National Armory of Gaia and sold almost exclusively to the United Federation's standing army, the Military Assault Command Operations Department (MACOs)."
icon = 'icons/obj/gun64_vr.dmi'
icon_state = "g44"
item_state = "bullpup"
pixel_x = -16
/obj/item/weapon/gun/projectile/automatic/carbine/fluff/g44/update_icon(var/ignore_inhands)
..()
// TODO - Fix this for spriting different size magazines
icon_state = (ammo_magazine)? "g44" : "g44-empty"
item_state = (ammo_magazine)? "bullpup" : "bullpup-empty"
if(!ignore_inhands) update_held_icon()
*/
//////////////////// Eris Ported Guns ////////////////////
// No idea what this is for.
/obj/item/weapon/gun/projectile/automatic/sol
name = "\improper \"Sol\" SMG"
desc = "The FS 9x19mm \"Sol\" is a compact and reliable submachine gun. Uses 9mm rounds."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "SMG-IS"
item_state = "wt550"
w_class = ITEMSIZE_LARGE
slot_flags = SLOT_BELT
caliber = "9mm"
magazine_type = /obj/item/ammo_magazine/m9mm
allowed_magazines = list(/obj/item/ammo_magazine/m9mm)
load_method = MAGAZINE
multi_aim = 1
burst_delay = 2
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2)
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0)),
)
/obj/item/weapon/gun/projectile/automatic/sol/proc/update_charge()
if(!ammo_magazine)
return
var/ratio = ammo_magazine.stored_ammo.len / ammo_magazine.max_ammo
if(ratio < 0.25 && ratio != 0)
ratio = 0.25
ratio = round(ratio, 0.25) * 100
overlays += "smg_[ratio]"
/obj/item/weapon/gun/projectile/automatic/sol/update_icon()
icon_state = (ammo_magazine)? "SMG-IS" : "SMG-IS-empty"
overlays.Cut()
update_charge()
//--------------- StG-60 ----------------
/obj/item/ammo_magazine/m792
name = "box mag (7.92x33mm Kurz)"
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "stg_30rnd"
caliber = "7.92x33mm"
ammo_type = /obj/item/ammo_casing/a792
max_ammo = 30
mag_type = MAGAZINE
/obj/item/ammo_casing/a792
desc = "A 7.92x33mm Kurz casing."
icon_state = "rifle-casing"
caliber = "7.92x33mm"
projectile_type = /obj/item/projectile/bullet/rifle/a762
/obj/item/ammo_magazine/mtg/empty
initial_ammo = 0
//------------- Battlerifle -------------
/obj/item/ammo_magazine/m95
name = "box mag (9.5x40mm)"
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "battlerifle"
caliber = "9.5x40mm"
ammo_type = /obj/item/ammo_casing/a95
max_ammo = 36
mag_type = MAGAZINE
multiple_sprites = 1
/obj/item/ammo_casing/a95
desc = "A 9.5x40mm bullet casing."
icon_state = "rifle-casing"
caliber = "9.5x40mm"
projectile_type = /obj/item/projectile/bullet/rifle/a95
/obj/item/projectile/bullet/rifle/a95
damage = 40
/obj/item/ammo_magazine/m95/empty
initial_ammo = 0
//---------------- PDW ------------------
/obj/item/ammo_magazine/m9mml
name = "\improper SMG magazine (9mm)"
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "smg"
origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE
matter = list(DEFAULT_WALL_MATERIAL = 1800)
caliber = "9mm"
ammo_type = /obj/item/ammo_casing/a9mm
max_ammo = 30
multiple_sprites = 1
/obj/item/ammo_magazine/m9mml/empty
initial_ammo = 0
/obj/item/ammo_magazine/m9mml/ap
name = "\improper SMG magazine (9mm armor-piercing)"
ammo_type = /obj/item/ammo_casing/a9mm/ap
/* Seems to have been de-coded?
/obj/item/ammo_magazine/m9mml/flash
name = "\improper SMG magazine (9mm flash)"
ammo_type = /obj/item/ammo_casing/a9mmf
/obj/item/ammo_magazine/m9mml/rubber
name = "\improper SMG magazine (9mm rubber)"
ammo_type = /obj/item/ammo_casing/a9mmr
/obj/item/ammo_magazine/m9mml/practice
name = "\improper SMG magazine (9mm practice)"
ammo_type = /obj/item/ammo_casing/a9mmp
*/

View File

@@ -0,0 +1,29 @@
//-----------------------Tranq Gun----------------------------------
/obj/item/weapon/gun/projectile/dartgun/tranq
name = "tranquilizer gun"
desc = "A gas-powered dart gun designed by the National Armory of Gaia. This gun is used primarily by United Federation special forces for Tactical Espionage missions. Don't forget your bandana."
icon_state = "tranqgun"
item_state = null
caliber = "dart"
fire_sound = 'sound/weapons/empty.ogg'
fire_sound_text = "a metallic click"
recoil = 0
silenced = 1
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/chemdart
allowed_magazines = list(/obj/item/ammo_magazine/chemdart)
auto_eject = 0
/obj/item/weapon/gun/projectile/dartgun/tranq/update_icon()
if(!ammo_magazine)
icon_state = "tranqgun"
return 1
if(!ammo_magazine.stored_ammo || ammo_magazine.stored_ammo.len)
icon_state = "tranqgun"
else if(ammo_magazine.stored_ammo.len > 5)
icon_state = "tranqgun"
else
icon_state = "tranqgun"
return 1

View File

@@ -9,4 +9,66 @@
magazine_type = /obj/item/ammo_magazine/m9mm/large/preban // Spawns with big magazines that are legal.
/obj/item/weapon/gun/projectile/p92x/large/preban/hp
magazine_type = /obj/item/ammo_magazine/m9mm/large/preban/hp // Spawns with legal hollow-point mag
magazine_type = /obj/item/ammo_magazine/m9mm/large/preban/hp // Spawns with legal hollow-point mag
//////////////////// Eris Ported Guns ////////////////////
//HoS Gun
/obj/item/weapon/gun/projectile/lamia
name = "FS HG .44 \"Lamia\""
desc = "Uses .44 rounds."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "Headdeagle"
item_state = "revolver"
caliber = ".44"
magazine_type = /obj/item/ammo_magazine/m44/rubber
allowed_magazines = list(/obj/item/ammo_magazine/m44,/obj/item/ammo_magazine/m44/rubber)
load_method = MAGAZINE
auto_eject = 1
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4)
/obj/item/weapon/gun/projectile/lamia/update_icon()
overlays.Cut()
if(!ammo_magazine)
return
var/ratio = ammo_magazine.stored_ammo.len * 100 / ammo_magazine.max_ammo
ratio = round(ratio, 33)
overlays += "deagle_[ratio]"
//Civilian gun
/obj/item/weapon/gun/projectile/giskard
name = "\improper \"Giskard\" holdout pistol"
desc = "The FS HG .380 \"Giskard\" can even fit into the pocket! Uses .380 rounds."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "giskardcivil"
caliber = ".380"
magazine_type = /obj/item/ammo_magazine/m380
allowed_magazines = list(/obj/item/ammo_magazine/m380)
load_method = MAGAZINE
w_class = ITEMSIZE_SMALL
fire_sound = 'sound/weapons/gunshot_pathetic.ogg'
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 3)
/obj/item/weapon/gun/projectile/giskard/update_icon()
..()
if(ammo_magazine && ammo_magazine.stored_ammo.len)
icon_state = "giskardcivil"
else
icon_state = "giskardcivil_empty"
//Not so civilian gun
/obj/item/weapon/gun/projectile/giskard/olivaw
name = "\improper \"Olivaw\" holdout burst-pistol"
desc = "The FS HG .380 \"Olivaw\" is a more advanced version of the \"Giskard\". This one seems to have a two-round burst-fire mode. Uses .380 rounds."
icon_state = "olivawcivil"
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=1.2, move_delay=null, burst_accuracy=null, dispersion=null),
list(mode_name="2-round bursts", burst=2, fire_delay=0.2, move_delay=4, burst_accuracy=list(0,-15), dispersion=list(1.2, 1.8)),
)
/obj/item/weapon/gun/projectile/giskard/olivaw/update_icon()
..()
if(ammo_magazine && ammo_magazine.stored_ammo.len)
icon_state = "olivawcivil"
else
icon_state = "olivawcivil_empty"

View File

@@ -0,0 +1,115 @@
//////////////////// Eris Ported Guns ////////////////////
//Detective gun
/obj/item/weapon/gun/projectile/revolver/consul
name = "\improper \"Consul\" Revolver"
desc = "Are you feeling lucky, punk? Uses .44 rounds."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "inspector"
item_state = "revolver"
caliber = ".44"
ammo_type = /obj/item/ammo_casing/a44/rubber
handle_casings = CYCLE_CASINGS
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3)
/obj/item/weapon/gun/projectile/revolver/consul/proc/update_charge()
if(loaded.len==0)
overlays += "inspector_off"
else
overlays += "inspector_on"
/obj/item/weapon/gun/projectile/revolver/consul/update_icon()
overlays.Cut()
update_charge()
//.357 special ammo
/obj/item/ammo_magazine/s357/stun
name = "speedloader (.357 stun)"
desc = "A speedloader for .357 revolvers."
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "s357"
caliber = ".357"
ammo_type = /obj/item/ammo_casing/a357/stun
/obj/item/ammo_casing/a357/stun
desc = "A .357 stun bullet casing."
caliber = ".357"
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "stun357"
projectile_type = /obj/item/projectile/energy/electrode/stunshot/strong
/obj/item/ammo_magazine/s357/rubber
name = "speedloader (.357 rubber)"
desc = "A speedloader for .357 revolvers."
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "r357"
caliber = ".357"
ammo_type = /obj/item/ammo_casing/a357/rubber
/obj/item/ammo_casing/a357/rubber
desc = "A .357 rubber bullet casing."
caliber = ".357"
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "rubber357"
projectile_type = /obj/item/projectile/bullet/pistol/rubber/strong
/obj/item/ammo_magazine/s357/flash
name = "speedloader (.357 flash)"
desc = "A speedloader for .357 revolvers."
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "f357"
caliber = ".357"
ammo_type = /obj/item/ammo_casing/a357/flash
/obj/item/ammo_casing/a357/flash
desc = "A .357 flash bullet casing."
caliber = ".357"
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "flash357"
projectile_type = /obj/item/projectile/energy/flash/strong
//.380
/obj/item/ammo_casing/a380
desc = "A .380 bullet casing."
caliber = ".380"
projectile_type = /obj/item/projectile/bullet/pistol
/obj/item/ammo_magazine/m380
name = "magazine (.380)"
icon_state = "9x19p"
origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE
matter = list(DEFAULT_WALL_MATERIAL = 480)
caliber = ".380"
ammo_type = /obj/item/ammo_casing/a380
max_ammo = 8
multiple_sprites = 1
//.44
/obj/item/ammo_casing/a44/rubber
icon_state = "r-casing"
desc = "A .44 rubber bullet casing."
projectile_type = /obj/item/projectile/bullet/pistol/rubber/strong
/obj/item/ammo_magazine/m44/rubber
desc = "A magazine for .44 less-than-lethal ammo."
ammo_type = /obj/item/ammo_casing/a44/rubber
//.44 speedloaders
/obj/item/ammo_magazine/s44
name = "speedloader (.44)"
desc = "A speedloader for .44 revolvers."
icon = 'icons/obj/ammo_vr.dmi'
icon_state = "s357"
caliber = ".44"
matter = list(DEFAULT_WALL_MATERIAL = 1260)
ammo_type = /obj/item/ammo_casing/a44
max_ammo = 6
multiple_sprites = 1
mag_type = SPEEDLOADER
/obj/item/ammo_magazine/s44/rubber
name = "speedloader (.44 rubber)"
icon_state = "r357"
ammo_type = /obj/item/ammo_casing/a44/rubber

View File

@@ -0,0 +1,11 @@
// For general use
/obj/item/weapon/gun/projectile/shotgun/pump/USDF
name = "\improper USDF tactical shotgun"
desc = "All you greenhorns who wanted to see Xenomorphs up close... this is your lucky day. Uses 12g rounds."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "haloshotgun"
icon_override = 'icons/obj/gun_vr.dmi'
item_state = "haloshotgun_i"
item_icons = null
ammo_type = /obj/item/ammo_casing/a12g
max_shells = 12

View File

@@ -1,36 +0,0 @@
////////////// Dragunov Sniper Rifle //////////////
/obj/item/weapon/gun/projectile/SVD
name = "\improper Dragunov"
desc = "The SVD, also known as the Dragunov, was mass produced with an Optical Sniper Sight so simple that even Ivan can figure out how it works. Too bad for you that it's written in Russian. Uses 7.62mm rounds."
icon_state = "SVD"
item_state = "SVD"
w_class = ITEMSIZE_HUGE // So it can't fit in a backpack.
force = 10
slot_flags = SLOT_BACK // Needs a sprite.
origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
recoil = 2 //extra kickback
caliber = "a762"
load_method = MAGAZINE
accuracy = -45 //shooting at the hip
scoped_accuracy = 0
one_handed_penalty = 60 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand.
fire_sound = 'sound/weapons/SVD_shot.ogg'
magazine_type = /obj/item/ammo_magazine/m762
allowed_magazines = list(/obj/item/ammo_magazine/m762)
/obj/item/weapon/gun/projectile/SVD/update_icon()
..()
// if(istype(ammo_magazine,/obj/item/ammo_magazine/m762)
// icon_state = "SVD-bigmag" //No icon for this exists yet.
if(ammo_magazine)
icon_state = "SVD"
else
icon_state = "SVD-empty"
/obj/item/weapon/gun/projectile/SVD/verb/scope()
set category = "Object"
set name = "Use Scope"
set popup_menu = 1
toggle_scope(2.0)