mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-08-24 13:46:53 +01:00
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:
@@ -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)
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user