Add caltrop component for spikey floor objects (#33280)

* Add caltrop component for spikey floor objects

The caltrop component now can be added to any crossable atom, and it'll
act like a shard of glass, or a d4. Additional flags are possible for it
to bypass shoes or ignore people who are walking.

This means d4 don't reimplement shard logic, and also open the window
for caltrop grenades later.

Also, it taught me how components work.

* Code review I

* Caltrop damage is 4

* Cactus hurts

* Whoops

* Ignore restraints = true
This commit is contained in:
coiax
2017-12-10 16:31:56 +00:00
committed by CitadelStationBot
parent e18457f92e
commit 9d59e36289
6 changed files with 75 additions and 44 deletions
+4 -8
View File
@@ -73,6 +73,10 @@
icon_state = "d4"
sides = 4
/obj/item/dice/d4/Initialize(mapload)
. = ..()
AddComponent(/datum/component/caltrop, 4)
/obj/item/dice/d6
name = "d6"
@@ -182,14 +186,6 @@
else if(!src.throwing) //Dice was thrown and is coming to rest
visible_message("<span class='notice'>[src] rolls to a stop, landing on [result]. [comment]</span>")
/obj/item/dice/d4/Crossed(mob/living/carbon/human/H)
if(istype(H) && !H.shoes)
if(PIERCEIMMUNE in H.dna.species.species_traits)
return 0
to_chat(H, "<span class='userdanger'>You step on the D4!</span>")
H.apply_damage(4,BRUTE,(pick("l_leg", "r_leg")))
H.Knockdown(60)
/obj/item/dice/update_icon()
cut_overlays()
add_overlay("[src.icon_state][src.result]")
+2 -24
View File
@@ -205,6 +205,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \
/obj/item/shard/Initialize()
. = ..()
AddComponent(/datum/component/caltrop, force)
icon_state = pick("large", "medium", "small")
switch(icon_state)
if("small")
@@ -257,27 +258,4 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \
/obj/item/shard/Crossed(mob/AM)
if(istype(AM) && has_gravity(loc))
playsound(loc, 'sound/effects/glass_step.ogg', 50, 1)
if(ishuman(AM))
var/mob/living/carbon/human/H = AM
if(PIERCEIMMUNE in H.dna.species.species_traits)
return
var/picked_def_zone = pick("l_leg", "r_leg")
var/obj/item/bodypart/O = H.get_bodypart(picked_def_zone)
if(!istype(O))
return
if(O.status == BODYPART_ROBOTIC)
return
var/feetCover = (H.wear_suit && H.wear_suit.body_parts_covered & FEET) || (H.w_uniform && H.w_uniform.body_parts_covered & FEET)
if(H.shoes || feetCover || H.movement_type & FLYING || H.buckled)
return
H.apply_damage(5, BRUTE, picked_def_zone)
if(cooldown < world.time - 10) //cooldown to avoid message spam.
if(!H.incapacitated())
H.visible_message("<span class='danger'>[H] steps in the broken glass!</span>", \
"<span class='userdanger'>You step in the broken glass!</span>")
else
H.visible_message("<span class='danger'>[H] slides on the broken glass!</span>", \
"<span class='userdanger'>You slide on the broken glass!</span>")
cooldown = world.time
H.Knockdown(60)
. = ..()