mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-01-03 22:13:24 +00:00
Now certain weapons can strike faster or slower than usual. No weapons currently do this as this PR just lays the groundwork for that. The click delay can also be modified with traits. The slime agility modifier makes attacks happen 25% sooner. Adds debug test verb to display a weapon's DPS. It's really basic but should be sufficient for future force adjustments I might do in the future.
276 lines
7.9 KiB
Plaintext
276 lines
7.9 KiB
Plaintext
//generic procs copied from obj/effect/alien
|
|
/obj/effect/spider
|
|
name = "web"
|
|
desc = "it's stringy and sticky"
|
|
icon = 'icons/effects/effects.dmi'
|
|
anchored = 1
|
|
density = 0
|
|
var/health = 15
|
|
|
|
//similar to weeds, but only barfed out by nurses manually
|
|
/obj/effect/spider/ex_act(severity)
|
|
switch(severity)
|
|
if(1.0)
|
|
qdel(src)
|
|
if(2.0)
|
|
if (prob(50))
|
|
qdel(src)
|
|
if(3.0)
|
|
if (prob(5))
|
|
qdel(src)
|
|
return
|
|
|
|
/obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user)
|
|
user.setClickCooldown(user.get_attack_speed(W))
|
|
|
|
if(W.attack_verb.len)
|
|
visible_message("<span class='warning'>\The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]</span>")
|
|
else
|
|
visible_message("<span class='warning'>\The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
|
|
|
|
var/damage = W.force / 4.0
|
|
|
|
if(istype(W, /obj/item/weapon/weldingtool))
|
|
var/obj/item/weapon/weldingtool/WT = W
|
|
|
|
if(WT.remove_fuel(0, user))
|
|
damage = 15
|
|
playsound(src, W.usesound, 100, 1)
|
|
|
|
health -= damage
|
|
healthcheck()
|
|
|
|
/obj/effect/spider/bullet_act(var/obj/item/projectile/Proj)
|
|
..()
|
|
health -= Proj.get_structure_damage()
|
|
healthcheck()
|
|
|
|
/obj/effect/spider/proc/healthcheck()
|
|
if(health <= 0)
|
|
qdel(src)
|
|
|
|
/obj/effect/spider/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
|
if(exposed_temperature > 300 + T0C)
|
|
health -= 5
|
|
healthcheck()
|
|
|
|
/obj/effect/spider/stickyweb
|
|
icon_state = "stickyweb1"
|
|
New()
|
|
if(prob(50))
|
|
icon_state = "stickyweb2"
|
|
|
|
/obj/effect/spider/stickyweb/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
|
if(air_group || (height==0)) return 1
|
|
if(istype(mover, /mob/living/simple_animal/hostile/giant_spider))
|
|
return 1
|
|
else if(istype(mover, /mob/living))
|
|
if(prob(50))
|
|
mover << "<span class='warning'>You get stuck in \the [src] for a moment.</span>"
|
|
return 0
|
|
else if(istype(mover, /obj/item/projectile))
|
|
return prob(30)
|
|
return 1
|
|
|
|
/obj/effect/spider/eggcluster
|
|
name = "egg cluster"
|
|
desc = "They seem to pulse slightly with an inner life"
|
|
icon_state = "eggs"
|
|
var/amount_grown = 0
|
|
var/spiders_min = 6
|
|
var/spiders_max = 24
|
|
var/spider_type = /obj/effect/spider/spiderling
|
|
New()
|
|
pixel_x = rand(3,-3)
|
|
pixel_y = rand(3,-3)
|
|
processing_objects |= src
|
|
|
|
/obj/effect/spider/eggcluster/New(var/location, var/atom/parent)
|
|
get_light_and_color(parent)
|
|
..()
|
|
|
|
/obj/effect/spider/eggcluster/Destroy()
|
|
processing_objects -= src
|
|
if(istype(loc, /obj/item/organ/external))
|
|
var/obj/item/organ/external/O = loc
|
|
O.implants -= src
|
|
|
|
return ..()
|
|
|
|
/obj/effect/spider/eggcluster/process()
|
|
amount_grown += rand(0,2)
|
|
if(amount_grown >= 100)
|
|
var/num = rand(spiders_min, spiders_max)
|
|
var/obj/item/organ/external/O = null
|
|
if(istype(loc, /obj/item/organ/external))
|
|
O = loc
|
|
|
|
for(var/i=0, i<num, i++)
|
|
var/spiderling = new spider_type(src.loc, src)
|
|
if(O)
|
|
O.implants += spiderling
|
|
qdel(src)
|
|
|
|
/obj/effect/spider/eggcluster/small
|
|
spiders_min = 1
|
|
spiders_max = 3
|
|
|
|
/obj/effect/spider/eggcluster/small/frost
|
|
spider_type = /obj/effect/spider/spiderling/frost
|
|
|
|
/obj/effect/spider/spiderling
|
|
name = "spiderling"
|
|
desc = "It never stays still for long."
|
|
icon_state = "spiderling"
|
|
anchored = 0
|
|
layer = 2.7
|
|
health = 3
|
|
var/last_itch = 0
|
|
var/amount_grown = -1
|
|
var/obj/machinery/atmospherics/unary/vent_pump/entry_vent
|
|
var/travelling_in_vent = 0
|
|
var/list/grow_as = list(/mob/living/simple_animal/hostile/giant_spider, /mob/living/simple_animal/hostile/giant_spider/nurse, /mob/living/simple_animal/hostile/giant_spider/hunter)
|
|
|
|
/obj/effect/spider/spiderling/frost
|
|
grow_as = list(/mob/living/simple_animal/hostile/giant_spider/frost)
|
|
|
|
/obj/effect/spider/spiderling/New(var/location, var/atom/parent)
|
|
pixel_x = rand(6,-6)
|
|
pixel_y = rand(6,-6)
|
|
processing_objects |= src
|
|
//50% chance to grow up
|
|
if(prob(50))
|
|
amount_grown = 1
|
|
get_light_and_color(parent)
|
|
..()
|
|
|
|
/obj/effect/spider/spiderling/Destroy()
|
|
processing_objects -= src
|
|
walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever.
|
|
return ..()
|
|
|
|
/obj/effect/spider/spiderling/Bump(atom/user)
|
|
if(istype(user, /obj/structure/table))
|
|
src.loc = user.loc
|
|
else
|
|
..()
|
|
|
|
/obj/effect/spider/spiderling/proc/die()
|
|
visible_message("<span class='alert'>[src] dies!</span>")
|
|
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
|
|
qdel(src)
|
|
|
|
/obj/effect/spider/spiderling/healthcheck()
|
|
if(health <= 0)
|
|
die()
|
|
|
|
/obj/effect/spider/spiderling/process()
|
|
if(travelling_in_vent)
|
|
if(istype(src.loc, /turf))
|
|
travelling_in_vent = 0
|
|
entry_vent = null
|
|
else if(entry_vent)
|
|
if(get_dist(src, entry_vent) <= 1)
|
|
if(entry_vent.network && entry_vent.network.normal_members.len)
|
|
var/list/vents = list()
|
|
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.network.normal_members)
|
|
vents.Add(temp_vent)
|
|
if(!vents.len)
|
|
entry_vent = null
|
|
return
|
|
var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = pick(vents)
|
|
/*if(prob(50))
|
|
src.visible_message("<B>[src] scrambles into the ventillation ducts!</B>")*/
|
|
|
|
spawn(rand(20,60))
|
|
loc = exit_vent
|
|
var/travel_time = round(get_dist(loc, exit_vent.loc) / 2)
|
|
spawn(travel_time)
|
|
|
|
if(!exit_vent || exit_vent.welded)
|
|
loc = entry_vent
|
|
entry_vent = null
|
|
return
|
|
|
|
if(prob(50))
|
|
src.visible_message("<span class='notice'>You hear something squeezing through the ventilation ducts.</span>",2)
|
|
sleep(travel_time)
|
|
|
|
if(!exit_vent || exit_vent.welded)
|
|
loc = entry_vent
|
|
entry_vent = null
|
|
return
|
|
loc = exit_vent.loc
|
|
entry_vent = null
|
|
var/area/new_area = get_area(loc)
|
|
if(new_area)
|
|
new_area.Entered(src)
|
|
else
|
|
entry_vent = null
|
|
//=================
|
|
|
|
if(isturf(loc))
|
|
skitter()
|
|
|
|
else if(isorgan(loc))
|
|
if(!amount_grown) amount_grown = 1
|
|
var/obj/item/organ/external/O = loc
|
|
if(!O.owner || O.owner.stat == DEAD || amount_grown > 80)
|
|
O.implants -= src
|
|
src.loc = O.owner ? O.owner.loc : O.loc
|
|
src.visible_message("<span class='warning'>\A [src] makes its way out of [O.owner ? "[O.owner]'s [O.name]" : "\the [O]"]!</span>")
|
|
if(O.owner)
|
|
O.owner.apply_damage(1, BRUTE, O.organ_tag)
|
|
else if(prob(1))
|
|
O.owner.apply_damage(1, TOX, O.organ_tag)
|
|
if(world.time > last_itch + 30 SECONDS)
|
|
last_itch = world.time
|
|
O.owner << "<span class='notice'>Your [O.name] itches...</span>"
|
|
else if(prob(1))
|
|
src.visible_message("<span class='notice'>\The [src] skitters.</span>")
|
|
|
|
if(amount_grown)
|
|
amount_grown += rand(0,2)
|
|
|
|
/obj/effect/spider/spiderling/proc/skitter()
|
|
if(isturf(loc))
|
|
if(prob(25))
|
|
var/list/nearby = trange(5, src) - loc
|
|
if(nearby.len)
|
|
var/target_atom = pick(nearby)
|
|
walk_to(src, target_atom, 5)
|
|
if(prob(25))
|
|
src.visible_message("<span class='notice'>\The [src] skitters[pick(" away"," around","")].</span>")
|
|
else if(prob(5))
|
|
//vent crawl!
|
|
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
|
|
if(!v.welded)
|
|
entry_vent = v
|
|
walk_to(src, entry_vent, 5)
|
|
break
|
|
if(amount_grown >= 100)
|
|
var/spawn_type = pick(grow_as)
|
|
new spawn_type(src.loc, src)
|
|
qdel(src)
|
|
|
|
/obj/effect/decal/cleanable/spiderling_remains
|
|
name = "spiderling remains"
|
|
desc = "Green squishy mess."
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "greenshatter"
|
|
|
|
/obj/effect/spider/cocoon
|
|
name = "cocoon"
|
|
desc = "Something wrapped in silky spider web"
|
|
icon_state = "cocoon1"
|
|
health = 60
|
|
|
|
/obj/effect/spider/cocoon/New()
|
|
icon_state = pick("cocoon1","cocoon2","cocoon3")
|
|
|
|
/obj/effect/spider/cocoon/Destroy()
|
|
src.visible_message("<span class='warning'>\The [src] splits open.</span>")
|
|
for(var/atom/movable/A in contents)
|
|
A.loc = src.loc
|
|
return ..()
|