Antag Uplink Expansion (#6788)

* Adds Energy Daggerpens, Thieves gloves and Buzzer Ring.

* Updoot

* fixfix weakfire

* Extra Touches

* chlgongog

* Fix antag injector cases.
This commit is contained in:
Mechoid
2020-03-16 21:21:41 -07:00
committed by GitHub
parent a5e17e4d6d
commit c7ba2a8e4b
33 changed files with 717 additions and 28 deletions
+157
View File
@@ -0,0 +1,157 @@
/*
* Antagonist-specific gloves, such as traitor or ling-only types.
*/
// Thief - Traitor / Merc
/obj/item/clothing/gloves/sterile/thieves
name = "sterile gloves"
desc = "Sterile gloves."
description_antag = "These gloves are uniquely suited for stealing, as well as breaking and entering. They have minor insulation.\
Attempting to 'help' someone will open their backpack, if it exists, or their belt if they have no backpack, allowing you to deposit\
items into the inventories. Be careful about making too much noise.\
Disarm intent will swap the items in your LEFT pockets. Grab will swap RIGHT pockets."
icon_state = "latex"
item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white")
siemens_coefficient = 0.5 // Not perfect, but slightly more protective than nothing.
permeability_coefficient = 0.01
germ_level = 0
fingerprint_chance = 10 // They're thieves' gloves. What do you think?
/obj/item/clothing/gloves/sterile/thieves/proc/pickpocket(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/proximity)
if(!proximity || !user || !target)
return 0
if(!istype(target))
return 0
if(user.a_intent != I_HURT && (turn(target.dir, 180) == get_dir(user, target)))
to_chat(target, "<span class='warning'>[user] rifles in your pockets!</span>")
if(user.a_intent == I_HELP)
if(istype(target.back,/obj/item/weapon/storage) && do_after(user, 3 SECONDS, target))
var/obj/item/weapon/storage/Backpack = target.back
Backpack.open(user)
else if(istype(target.belt, /obj/item/weapon/storage) && do_after(user, 5 SECONDS, target))
var/obj/item/weapon/storage/Belt = target.belt
Belt.open(user)
return 1
if(user.a_intent == I_DISARM)
var/obj/item/LTarg = target.l_store
var/obj/item/LUser = user.l_store
if(do_after(user, 1 SECOND, target))
if(istype(LTarg) && do_after(user, 1 SECOND, target))
target.drop_from_inventory(LTarg)
target.l_store = null
user.l_store = LTarg
LTarg.forceMove(user)
LTarg.equipped(user, slot_l_store)
else
target.drop_from_inventory(LTarg)
if(istype(LUser) && do_after(user, 1 SECOND, target))
user.drop_from_inventory(LUser)
target.l_store = LUser
LUser.forceMove(target)
LUser.equipped(target, slot_l_store)
else if(istype(LUser) && LUser != user.l_store) // We've taken something, so drop the one that's in bluespace.
user.drop_from_inventory(LUser)
return 1
if(user.a_intent == I_GRAB)
var/obj/item/RTarg = target.r_store
var/obj/item/RUser = user.r_store
if(do_after(user, 1 SECOND, target))
if(istype(RTarg) && do_after(user, 1 SECOND, target))
target.drop_from_inventory(RTarg)
target.r_store = null
user.r_store = RTarg
RTarg.forceMove(user)
RTarg.equipped(user, slot_r_store)
else
target.drop_from_inventory(RTarg)
if(istype(RUser) && do_after(user, 1 SECOND, target))
user.drop_from_inventory(RUser)
target.r_store = RUser
RUser.forceMove(target)
RUser.equipped(target, slot_r_store)
else if(istype(RUser) && RUser != user.r_store) // We've taken something, so drop the one that's in bluespace.
user.drop_from_inventory(RUser)
return 1
/obj/item/clothing/gloves/sterile/thieves/Touch(var/atom/A, var/proximity)
if(proximity && istype(usr, /mob/living/carbon/human) && do_after(usr, 1 SECOND, A))
return pickpocket(usr, A, proximity)
return 0
// Buzzer Ring - Traitor, Merc.
/obj/item/clothing/gloves/ring/buzzer
name = "ring"
desc = "A plain metal band."
description_antag = "This morphium-alloy ring continually generates an electric field, capable of electrocuting a target while not injuring the wearer.\
The device is also capable of 'frankenstein'-ing a corpse, long after normal technology would be able to save them. The body will still be tied to the\
normal damage limits for survival, however, so care must be taken."
icon_state = "material"
var/battery_type = /obj/item/weapon/cell/device/weapon/recharge
var/obj/item/weapon/cell/battery = null
/obj/item/clothing/gloves/ring/buzzer/get_cell()
return battery
/obj/item/clothing/gloves/ring/buzzer/Initialize()
..()
if(!battery)
battery = new battery_type(src)
/obj/item/clothing/gloves/ring/buzzer/Touch(var/atom/A, var/proximity)
if(proximity && istype(usr, /mob/living/carbon/human))
return zap(usr, A, proximity)
return 0
/obj/item/clothing/gloves/ring/buzzer/proc/zap(var/mob/living/carbon/human/user, var/atom/movable/target, var/proximity)
. = FALSE
if(user.a_intent == I_HURT && battery.percent() >= 50)
if(isliving(target))
var/mob/living/L = target
if(ishuman(L) && battery.percent() >= 90) // Silent text-wise, for maximum potential for gimmicks.
var/mob/living/carbon/human/H = L
if(H.stat == DEAD)
. = TRUE
do_defib(H)
to_chat(L, "<span class='warning'>You feel a powerful shock!</span>")
if(!.)
playsound(L, 'sound/effects/sparks7.ogg', 40, 1)
L.electrocute_act(battery.percent() * 0.25, src)
battery.emp_act(2)
return .
return 0
/obj/item/clothing/gloves/ring/buzzer/proc/do_defib(var/mob/living/carbon/human/H = null)
if(!istype(H))
return 0
dead_mob_list.Remove(H)
if((H in living_mob_list) || (H in dead_mob_list))
WARNING("Mob [H] was ring-defibbed but already in the living or dead list still!")
living_mob_list += H
H.timeofdeath = 0
H.stat = UNCONSCIOUS
H.failed_last_breath = 0
H.reload_fullscreen()
H.emote("gasp")
H.Weaken(rand(10,25))
H.updatehealth()
battery.emp_act(1)
+3
View File
@@ -17,6 +17,9 @@
/datum/modifier/fire/tick()
holder.inflict_heat_damage(damage_per_tick)
/datum/modifier/fire/weak
damage_per_tick = 1
/*
* Modifier used by projectiles, like the flamethrower, that rely heavily on fire_stacks to persist.
*/
+1 -1
View File
@@ -12,7 +12,7 @@
organ_verbs = list(/mob/living/carbon/human/proc/augment_menu) // Verbs added by the organ when present in the body.
target_parent_classes = list() // Is the parent supposed to be organic, robotic, assisted?
forgiving_class = FALSE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic.
forgiving_class = TRUE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic.
var/obj/item/integrated_object // Objects held by the organ, used for re-usable, deployable things.
var/integrated_object_type // Object type the organ will spawn.
+97
View File
@@ -48,6 +48,11 @@
var/selectedColor = 1
var/colors = list("black","blue","red")
/obj/item/weapon/pen/AltClick(mob/user)
to_chat(user, "<span class='notice'>Click.</span>")
playsound(loc, 'sound/items/penclick.ogg', 50, 1)
return
/obj/item/weapon/pen/multi/attack_self(mob/user)
if(++selectedColor > 3)
selectedColor = 1
@@ -92,6 +97,98 @@
var/trans = reagents.trans_to_mob(M, 30, CHEM_BLOOD)
add_attack_logs(user,M,"Injected with [src.name] containing [contained], trasferred [trans] units")
/*
* Blade pens.
*/
/obj/item/weapon/pen/blade
desc = "It's a normal black ink pen."
description_antag = "This pen can be transformed into a dangerous melee and thrown assassination weapon with an Alt-Click.\
When active, it cannot be caught safely."
name = "pen"
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "pen"
item_state = "pen"
slot_flags = SLOT_BELT | SLOT_EARS
throwforce = 3
w_class = ITEMSIZE_TINY
throw_speed = 7
throw_range = 15
armor_penetration = 20
var/active = 0
var/active_embed_chance = 0
var/active_force = 15
var/active_throwforce = 30
var/active_w_class = ITEMSIZE_NORMAL
var/active_icon_state
var/default_icon_state
/obj/item/weapon/pen/blade/Initialize()
..()
active_icon_state = "[icon_state]-x"
default_icon_state = icon_state
/obj/item/weapon/pen/blade/AltClick(mob/user)
..()
if(active)
deactivate(user)
else
activate(user)
to_chat(user, "<span class='notice'>You [active ? "de" : ""]activate \the [src]'s blade.</span>")
/obj/item/weapon/pen/blade/proc/activate(mob/living/user)
if(active)
return
active = 1
icon_state = active_icon_state
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', 15, 1)
damtype = SEARING
catchable = FALSE
attack_verb |= list(\
"slashed",\
"cut",\
"shredded",\
"stabbed"\
)
/obj/item/weapon/pen/blade/proc/deactivate(mob/living/user)
if(!active)
return
playsound(user, 'sound/weapons/saberoff.ogg', 15, 1)
active = 0
icon_state = default_icon_state
embed_chance = initial(embed_chance)
force = initial(force)
throwforce = initial(throwforce)
sharp = initial(sharp)
edge = initial(edge)
w_class = initial(w_class)
damtype = BRUTE
catchable = TRUE
/obj/item/weapon/pen/blade/blue
desc = "It's a normal blue ink pen."
icon_state = "pen_blue"
colour = "blue"
/obj/item/weapon/pen/blade/red
desc = "It's a normal red ink pen."
icon_state = "pen_red"
colour = "red"
/obj/item/weapon/pen/blade/fountain
desc = "A well made fountain pen."
icon_state = "pen_fountain"
/*
* Sleepy Pens
*/
+8 -3
View File
@@ -76,12 +76,17 @@
var/start_nutrition = H.nutrition
var/end_nutrition = 0
H.nutrition -= rechargeamt / 10
H.nutrition -= rechargeamt / 15
end_nutrition = H.nutrition
if(start_nutrition - max(0, end_nutrition) < rechargeamt / 10)
H.remove_blood((rechargeamt / 10) - (start_nutrition - max(0, end_nutrition)))
if(start_nutrition - max(0, end_nutrition) < rechargeamt / 15)
if(H.isSynthetic())
H.adjustToxLoss((rechargeamt / 15) - (start_nutrition - max(0, end_nutrition)))
else
H.remove_blood((rechargeamt / 15) - (start_nutrition - max(0, end_nutrition)))
power_supply.give(rechargeamt) //... to recharge 1/5th the battery
update_icon()
@@ -0,0 +1,77 @@
/obj/item/weapon/gun/magnetic/gasthrower
name = "phoronthrower"
desc = "A modernized flamethrower utilizing pressurized phoron gas as both a propellant and combustion medium."
description_fluff = "A weapon designed to effectively combat the threat posed by Almachi soldiers without the danger of other forms of flamethrower."
icon_state = "gasthrower"
item_state = "bore"
wielded_item_state = "bore-wielded"
icon = 'icons/obj/railgun.dmi'
one_handed_penalty = 20
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_ILLEGAL = 2, TECH_PHORON = 4)
w_class = ITEMSIZE_LARGE
burst = 3
burst_delay = 1
fire_sound = 'sound/weapons/towelwipe.ogg'
removable_components = TRUE
gun_unreliable = 0
load_type = /obj/item/weapon/tank
projectile_type = /obj/item/projectile/scatter/flamethrower
power_cost = 250
/obj/item/weapon/gun/magnetic/gasthrower/check_ammo()
if(!loaded || !istype(loaded, load_type))
return 0
var/obj/item/weapon/tank/Tank = loaded
Tank.air_contents.update_values() // Safety
var/turf/T = get_turf(src)
var/phoron_amt = Tank.air_contents.gas["phoron"]
var/co2_amt = Tank.air_contents.gas["carbon_dioxide"]
var/oxy_amt = Tank.air_contents.gas["oxygen"]
var/n2o_amt = Tank.air_contents.gas["sleeping_agent"]
if(isnull(co2_amt))
co2_amt = 0
if(isnull(oxy_amt))
oxy_amt = 0
if(isnull(n2o_amt))
n2o_amt = 0
var/phoron_mix_proper = TRUE
if(!phoron_amt || phoron_amt < max(0.25, 3 + co2_amt - oxy_amt - (n2o_amt / 2)))
phoron_mix_proper = FALSE
if(Tank.air_contents.return_pressure() >= T.air.return_pressure() && phoron_mix_proper)
return 1
return 0
/obj/item/weapon/gun/magnetic/gasthrower/use_ammo()
var/obj/item/weapon/tank/Tank = loaded
var/moles_to_pull = 0.25
Tank.air_contents.remove(moles_to_pull)
/obj/item/weapon/gun/magnetic/gasthrower/show_ammo(var/mob/user)
..()
if(loaded)
var/obj/item/weapon/tank/T = loaded
to_chat(user, "<span class='notice'>\The [T]'s pressure meter shows: [T.air_contents.return_pressure()] kpa.</span>")
switch(check_ammo())
if(TRUE)
to_chat(user, "<span class='notice'>\The [src]'s display registers a proper fuel mixture.</span>")
if(FALSE)
to_chat(user, "<span class='warning'>\The [src]'s display registers an improper fuel mixture.</span>")
@@ -18,6 +18,7 @@
projectile_type = /obj/item/projectile/bullet/rifle/a145
accuracy = -75
scoped_accuracy = 75
ignore_visor_zoom_restriction = TRUE // Ignore the restriction on vision modifiers when using this gun's scope.
// one_handed_penalty = 90
var/bolt_open = 0
+1 -1
View File
@@ -95,7 +95,7 @@
var/spread_submunition_damage = FALSE // Do we assign damage to our sub projectiles based on our main projectile damage?
var/damage = 10
var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE, HALLOSS, ELECTROCUTE, BIOACID are the only things that should be in here
var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE, HALLOSS, ELECTROCUTE, BIOACID, SEARING are the only things that should be in here
var/SA_bonus_damage = 0 // Some bullets inflict extra damage on simple animals.
var/SA_vulnerability = null // What kind of simple animal the above bonus damage should be applied to. Set to null to apply to all SAs.
var/nodamage = 0 //Determines if the projectile will skip any damage inflictions
@@ -266,6 +266,14 @@
flammability = 2
range = 6
/obj/item/projectile/bullet/incendiary/flamethrower/tiny
damage = 2
incendiary = 0
modifier_type_to_apply = /datum/modifier/fire/weak
modifier_duration = 20 SECONDS
range = 7
agony = 3
/* Practice rounds and blanks */
/obj/item/projectile/bullet/practice
@@ -60,3 +60,13 @@
submunitions = list(
/obj/item/projectile/bullet/shotgun/ion = 3
)
/obj/item/projectile/scatter/flamethrower
damage = 5
submunition_spread_max = 100
submunition_spread_min = 30
force_max_submunition_spread = TRUE
submunitions = list(
/obj/item/projectile/bullet/incendiary/flamethrower/tiny = 7
)