mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
@@ -175,12 +175,9 @@ var/global/list/tele_landmarks = list() // Terrible, but the alternative is loop
|
|||||||
|
|
||||||
if(isliving(A)) // Someday, implement parachutes. For now, just turbomurder whoever falls.
|
if(isliving(A)) // Someday, implement parachutes. For now, just turbomurder whoever falls.
|
||||||
var/mob/living/L = A
|
var/mob/living/L = A
|
||||||
for(var/i = 1 to 6)
|
L.fall_impact(T, 42, 90, FALSE, TRUE) //You will not be defibbed from this.
|
||||||
L.adjustBruteLoss(100)
|
|
||||||
message_admins("\The [A] fell out of the sky.")
|
message_admins("\The [A] fell out of the sky.")
|
||||||
explosion(T, 0, 1, 2)
|
|
||||||
A.forceMove(T)
|
A.forceMove(T)
|
||||||
T.visible_message("<span class='danger'><font size='3'>\A [A] falls out of the sky and crashes into \the [T]!</font></span>")
|
|
||||||
else
|
else
|
||||||
message_admins("ERROR: planetary_fall step trigger lacks a planet to fall onto.")
|
message_admins("ERROR: planetary_fall step trigger lacks a planet to fall onto.")
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
/obj/item/weapon/storage/backpack
|
/obj/item/weapon/storage/backpack
|
||||||
name = "backpack"
|
name = "backpack"
|
||||||
desc = "You wear this on your back and put items into it."
|
desc = "You wear this on your back and put items into it."
|
||||||
|
icon = 'icons/obj/clothing/backpack.dmi'
|
||||||
icon_state = "backpack"
|
icon_state = "backpack"
|
||||||
sprite_sheets = list(
|
sprite_sheets = list(
|
||||||
"Teshari" = 'icons/mob/species/seromi/back.dmi'
|
"Teshari" = 'icons/mob/species/seromi/back.dmi'
|
||||||
@@ -347,6 +348,8 @@
|
|||||||
/obj/item/weapon/storage/backpack/messenger/black
|
/obj/item/weapon/storage/backpack/messenger/black
|
||||||
icon_state = "courierbagblk"
|
icon_state = "courierbagblk"
|
||||||
|
|
||||||
|
|
||||||
|
//Purses
|
||||||
/obj/item/weapon/storage/backpack/purse
|
/obj/item/weapon/storage/backpack/purse
|
||||||
name = "purse"
|
name = "purse"
|
||||||
desc = "A small, fashionable bag typically worn over the shoulder."
|
desc = "A small, fashionable bag typically worn over the shoulder."
|
||||||
@@ -355,3 +358,69 @@
|
|||||||
w_class = ITEMSIZE_LARGE
|
w_class = ITEMSIZE_LARGE
|
||||||
max_w_class = ITEMSIZE_NORMAL
|
max_w_class = ITEMSIZE_NORMAL
|
||||||
max_storage_space = ITEMSIZE_COST_NORMAL * 5
|
max_storage_space = ITEMSIZE_COST_NORMAL * 5
|
||||||
|
|
||||||
|
//Parachutes
|
||||||
|
/obj/item/weapon/storage/backpack/parachute
|
||||||
|
name = "parachute"
|
||||||
|
desc = "A specially made backpack, designed to help one survive jumping from incredible heights. It sacrifices some storage space for that added functionality."
|
||||||
|
icon_state = "parachute"
|
||||||
|
item_state_slots = list(slot_r_hand_str = "backpack", slot_l_hand_str = "backpack")
|
||||||
|
max_storage_space = ITEMSIZE_COST_NORMAL * 5
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/backpack/parachute/examine(mob/user)
|
||||||
|
var/msg = desc
|
||||||
|
if(get_dist(src, user) <= 1)
|
||||||
|
if(parachute)
|
||||||
|
msg += " It seems to be packed."
|
||||||
|
else
|
||||||
|
msg += " It seems to be unpacked."
|
||||||
|
to_chat(user, msg)
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/backpack/parachute/handleParachute()
|
||||||
|
parachute = FALSE //If you parachute in, the parachute has probably been used.
|
||||||
|
|
||||||
|
/obj/item/weapon/storage/backpack/parachute/verb/pack_parachute()
|
||||||
|
|
||||||
|
set name = "Pack/Unpack Parachute"
|
||||||
|
set category = "Object"
|
||||||
|
set src in usr
|
||||||
|
|
||||||
|
if(!istype(src.loc, /mob/living))
|
||||||
|
return
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/H = usr
|
||||||
|
|
||||||
|
if(!istype(H))
|
||||||
|
return
|
||||||
|
if(H.stat)
|
||||||
|
return
|
||||||
|
if(H.back == src)
|
||||||
|
to_chat(H, "<span class='warning'>How do you expect to work on \the [src] while it's on your back?</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!parachute) //This packs the parachute
|
||||||
|
visible_message("<span class='notice'>\The [H] starts to pack \the [src]!</span>", \
|
||||||
|
"<span class='notice'>You start to pack \the [src]!</span>", \
|
||||||
|
"You hear the shuffling of cloth.")
|
||||||
|
if(do_after(H, 50))
|
||||||
|
visible_message("<span class='notice'>\The [H] finishes packing \the [src]!</span>", \
|
||||||
|
"<span class='notice'>You finish packing \the [src]!</span>", \
|
||||||
|
"You hear the shuffling of cloth.")
|
||||||
|
parachute = TRUE
|
||||||
|
else
|
||||||
|
visible_message("<span class='notice'>\The [src] gives up on packing \the [src]!</span>", \
|
||||||
|
"<span class='notice'>You give up on packing \the [src]!</span>")
|
||||||
|
return
|
||||||
|
else //This unpacks the parachute
|
||||||
|
visible_message("<span class='notice'>\The [src] starts to unpack \the [src]!</span>", \
|
||||||
|
"<span class='notice'>You start to unpack \the [src]!</span>", \
|
||||||
|
"You hear the shuffling of cloth.")
|
||||||
|
if(do_after(H, 25))
|
||||||
|
visible_message("<span class='notice'>\The [src] finishes unpacking \the [src]!</span>", \
|
||||||
|
"<span class='notice'>You finish unpacking \the [src]!</span>", \
|
||||||
|
"You hear the shuffling of cloth.")
|
||||||
|
parachute = FALSE
|
||||||
|
else
|
||||||
|
visible_message("<span class='notice'>\The [src] decides not to unpack \the [src]!</span>", \
|
||||||
|
"<span class='notice'>You decide not to unpack \the [src]!</span>")
|
||||||
|
return
|
||||||
@@ -56,6 +56,10 @@
|
|||||||
|
|
||||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/cracker
|
meat_type = /obj/item/weapon/reagent_containers/food/snacks/cracker
|
||||||
|
|
||||||
|
hovering = TRUE
|
||||||
|
softfall = TRUE
|
||||||
|
parachuting = TRUE
|
||||||
|
|
||||||
var/parrot_state = PARROT_WANDER //Hunt for a perch when created
|
var/parrot_state = PARROT_WANDER //Hunt for a perch when created
|
||||||
var/parrot_sleep_max = 25 //The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in life() being run every single tick.
|
var/parrot_sleep_max = 25 //The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in life() being run every single tick.
|
||||||
var/parrot_sleep_dur = 25 //Same as above, this is the var that physically counts down
|
var/parrot_sleep_dur = 25 //Same as above, this is the var that physically counts down
|
||||||
|
|||||||
@@ -212,3 +212,8 @@
|
|||||||
var/forbid_seeing_deadchat = FALSE // Used for lings to not see deadchat, and to have ghosting behave as if they were not really dead.
|
var/forbid_seeing_deadchat = FALSE // Used for lings to not see deadchat, and to have ghosting behave as if they were not really dead.
|
||||||
|
|
||||||
var/seedarkness = 1 //Determines mob's ability to see shadows. 1 = Normal vision, 0 = darkvision
|
var/seedarkness = 1 //Determines mob's ability to see shadows. 1 = Normal vision, 0 = darkvision
|
||||||
|
|
||||||
|
// Falling things
|
||||||
|
var/hovering = FALSE // Is the mob floating or flying in some way? If so, don't fall normally. //Not implemented yet, idea is to let them ignore terrain slowdown and falling down floors
|
||||||
|
var/softfall = FALSE // Is the mob able to lessen their impact upon falling?
|
||||||
|
var/parachuting = FALSE // Is the mob able to jump out of planes and survive? Don't check this directly outside of CanParachute().
|
||||||
@@ -285,26 +285,141 @@
|
|||||||
/obj/structure/stairs/CheckFall(var/atom/movable/falling_atom)
|
/obj/structure/stairs/CheckFall(var/atom/movable/falling_atom)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
// Called by CheckFall when we actually hit something. Oof
|
// Can't fall onto ghosts
|
||||||
/atom/movable/proc/fall_impact(var/atom/hit_atom)
|
/mob/observer/dead/CheckFall()
|
||||||
|
return 0
|
||||||
|
|
||||||
|
// Called by CheckFall when we actually hit something. Various Vars will be described below
|
||||||
|
// hit_atom is the thing we fall on
|
||||||
|
// damage_min is the smallest amount of damage a thing (currently only mobs and mechs) will take from falling
|
||||||
|
// damage_max is the largest amount of damage a thing (currently only mobs and mechs) will take from falling.
|
||||||
|
// If silent is True, the proc won't play sound or give a message.
|
||||||
|
// If planetary is True, it's harder to stop the fall damage
|
||||||
|
|
||||||
|
/atom/movable/proc/fall_impact(var/atom/hit_atom, var/damage_min = 0, var/damage_max = 10, var/silent = FALSE, var/planetary = FALSE)
|
||||||
|
if(!silent)
|
||||||
visible_message("\The [src] falls from above and slams into \the [hit_atom]!", "You hear something slam into \the [hit_atom].")
|
visible_message("\The [src] falls from above and slams into \the [hit_atom]!", "You hear something slam into \the [hit_atom].")
|
||||||
|
|
||||||
// Take damage from falling and hitting the ground
|
// Take damage from falling and hitting the ground
|
||||||
/mob/living/carbon/human/fall_impact(var/turf/landing)
|
/mob/living/fall_impact(var/turf/landing, var/damage_min = 0, var/damage_max = 30, var/silent = FALSE, var/planetary = FALSE)
|
||||||
|
if(planetary && src.CanParachute())
|
||||||
|
if(!silent)
|
||||||
|
visible_message("<span class='warning'>\The [src] glides in from above and lands on \the [landing]!</span>", \
|
||||||
|
"<span class='danger'>You land on \the [landing]!</span>", \
|
||||||
|
"You hear something land \the [landing].")
|
||||||
|
return
|
||||||
|
else if(!planetary && src.softfall) // Falling one floor and falling one atmosphere are very different things
|
||||||
|
if(!silent)
|
||||||
|
visible_message("<span class='warning'>\The [src] falls from above and lands on \the [landing]!</span>", \
|
||||||
|
"<span class='danger'>You land on \the [landing]!</span>", \
|
||||||
|
"You hear something land \the [landing].")
|
||||||
|
return
|
||||||
|
else
|
||||||
|
if(!silent)
|
||||||
|
if(planetary)
|
||||||
|
visible_message("<span class='danger'><font size='3'>\A [src] falls out of the sky and crashes into \the [landing]!</font></span>", \
|
||||||
|
"<span class='danger'><font size='3'> You fall out of the skiy and crash into \the [landing]!</font></span>", \
|
||||||
|
"You hear something slam into \the [landing].")
|
||||||
|
var/turf/T = get_turf(landing)
|
||||||
|
explosion(T, 0, 1, 2)
|
||||||
|
else
|
||||||
visible_message("<span class='warning'>\The [src] falls from above and slams into \the [landing]!</span>", \
|
visible_message("<span class='warning'>\The [src] falls from above and slams into \the [landing]!</span>", \
|
||||||
"<span class='danger'>You fall off and hit \the [landing]!</span>", \
|
"<span class='danger'>You fall off and hit \the [landing]!</span>", \
|
||||||
"You hear something slam into \the [landing].")
|
"You hear something slam into \the [landing].")
|
||||||
playsound(loc, "punch", 25, 1, -1)
|
playsound(loc, "punch", 25, 1, -1)
|
||||||
var/damage = 15 // Because wounds heal rather quickly, 15 should be enough to discourage jumping off but not be enough to ruin you, at least for the first time.
|
|
||||||
apply_damage(rand(0, damage), BRUTE, BP_HEAD)
|
if(planetary) //Since the planetary fall damage is calibrated for humans, we need to up this a bit
|
||||||
apply_damage(rand(0, damage), BRUTE, BP_TORSO)
|
damage_min *= 2
|
||||||
apply_damage(rand(0, damage), BRUTE, BP_L_LEG)
|
damage_max *= 2
|
||||||
apply_damage(rand(0, damage), BRUTE, BP_R_LEG)
|
|
||||||
apply_damage(rand(0, damage), BRUTE, BP_L_ARM)
|
adjustBruteLoss(rand(damage_min, damage_max))
|
||||||
apply_damage(rand(0, damage), BRUTE, BP_R_ARM)
|
return
|
||||||
|
return
|
||||||
|
|
||||||
|
/mob/living/carbon/human/fall_impact(var/turf/landing, var/damage_min = 0, var/damage_max = 10, var/silent = FALSE, var/planetary = FALSE)
|
||||||
|
if(planetary && src.CanParachute())
|
||||||
|
if(!silent)
|
||||||
|
visible_message("<span class='warning'>\The [src] glides in from above and lands on \the [landing]!</span>", \
|
||||||
|
"<span class='danger'>You land on \the [landing]!</span>", \
|
||||||
|
"You hear something land \the [landing].")
|
||||||
|
return
|
||||||
|
else if(!planetary && src.softfall) // Falling one floor and falling one atmosphere are very different things
|
||||||
|
if(!silent)
|
||||||
|
visible_message("<span class='warning'>\The [src] falls from above and lands on \the [landing]!</span>", \
|
||||||
|
"<span class='danger'>You land on \the [landing]!</span>", \
|
||||||
|
"You hear something land \the [landing].")
|
||||||
|
return
|
||||||
|
else
|
||||||
|
if(!silent)
|
||||||
|
if(planetary)
|
||||||
|
visible_message("<span class='danger'><font size='3'>\A [src] falls out of the sky and crashes into \the [landing]!</font></span>", \
|
||||||
|
"<span class='danger'><font size='3'> You fall out of the skiy and crash into \the [landing]!</font></span>", \
|
||||||
|
"You hear something slam into \the [landing].")
|
||||||
|
var/turf/T = get_turf(landing)
|
||||||
|
explosion(T, 0, 1, 2)
|
||||||
|
else
|
||||||
|
visible_message("<span class='warning'>\The [src] falls from above and slams into \the [landing]!</span>", \
|
||||||
|
"<span class='danger'>You fall off and hit \the [landing]!</span>", \
|
||||||
|
"You hear something slam into \the [landing].")
|
||||||
|
playsound(loc, "punch", 25, 1, -1)
|
||||||
|
|
||||||
|
// Because wounds heal rather quickly, 10 should be enough to discourage jumping off but not be enough to ruin you, at least for the first time.
|
||||||
|
apply_damage(rand(damage_min, damage_max), BRUTE, BP_HEAD)
|
||||||
|
apply_damage(rand(damage_min, damage_max), BRUTE, BP_TORSO)
|
||||||
|
apply_damage(rand(damage_min, damage_max), BRUTE, BP_GROIN)
|
||||||
|
apply_damage(rand(damage_min, damage_max), BRUTE, BP_L_LEG)
|
||||||
|
apply_damage(rand(damage_min, damage_max), BRUTE, BP_R_LEG)
|
||||||
|
apply_damage(rand(damage_min, damage_max), BRUTE, BP_L_FOOT)
|
||||||
|
apply_damage(rand(damage_min, damage_max), BRUTE, BP_R_FOOT)
|
||||||
|
apply_damage(rand(damage_min, damage_max), BRUTE, BP_L_ARM)
|
||||||
|
apply_damage(rand(damage_min, damage_max), BRUTE, BP_R_ARM)
|
||||||
|
apply_damage(rand(damage_min, damage_max), BRUTE, BP_L_HAND)
|
||||||
|
apply_damage(rand(damage_min, damage_max), BRUTE, BP_R_HAND)
|
||||||
Weaken(4)
|
Weaken(4)
|
||||||
updatehealth()
|
updatehealth()
|
||||||
|
return
|
||||||
|
return
|
||||||
|
|
||||||
|
//Checks if the mob is allowed to survive a fall from space
|
||||||
|
/mob/living/proc/CanParachute()
|
||||||
|
return parachuting
|
||||||
|
|
||||||
|
//For humans, this needs to be a wee bit more complicated
|
||||||
|
/mob/living/carbon/human/CanParachute()
|
||||||
|
//Certain slots don't really need to be checked for parachute ability, i.e. pockets, ears, etc. If this changes, just add them to the loop, I guess?
|
||||||
|
//This is done in Priority Order, so items lower down the list don't call handleParachute() unless they're actually used.
|
||||||
|
if(back && back.isParachute())
|
||||||
|
back.handleParachute()
|
||||||
|
return TRUE
|
||||||
|
if(s_store && s_store.isParachute())
|
||||||
|
back.handleParachute()
|
||||||
|
return TRUE
|
||||||
|
if(belt && belt.isParachute())
|
||||||
|
back.handleParachute()
|
||||||
|
return TRUE
|
||||||
|
if(wear_suit && wear_suit.isParachute())
|
||||||
|
back.handleParachute()
|
||||||
|
return TRUE
|
||||||
|
if(w_uniform && w_uniform.isParachute())
|
||||||
|
back.handleParachute()
|
||||||
|
return TRUE
|
||||||
|
else
|
||||||
|
return parachuting
|
||||||
|
|
||||||
|
//For human falling code
|
||||||
|
//Using /obj instead of /obj/item because I'm not sure what all humans can pick up or wear
|
||||||
|
/obj
|
||||||
|
var/parachute = FALSE
|
||||||
|
|
||||||
|
/obj/proc/isParachute()
|
||||||
|
return parachute
|
||||||
|
|
||||||
|
//This is what makes the parachute items know they've been used.
|
||||||
|
//I made it /atom/movable so it can be retooled for other things (mobs, mechs, etc), though it's only currently called in human/CanParachute().
|
||||||
|
/atom/movable/proc/handleParachute()
|
||||||
|
return
|
||||||
|
|
||||||
|
//Mech Code
|
||||||
/obj/mecha/handle_fall(var/turf/landing)
|
/obj/mecha/handle_fall(var/turf/landing)
|
||||||
// First things first, break any lattice
|
// First things first, break any lattice
|
||||||
var/obj/structure/lattice/lattice = locate(/obj/structure/lattice, loc)
|
var/obj/structure/lattice/lattice = locate(/obj/structure/lattice, loc)
|
||||||
@@ -316,7 +431,7 @@
|
|||||||
// Then call parent to have us actually fall
|
// Then call parent to have us actually fall
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
/obj/mecha/fall_impact(var/atom/hit_atom)
|
/obj/mecha/fall_impact(var/atom/hit_atom, var/damage_min = 15, var/damage_max = 30, var/silent = FALSE, var/planetary = FALSE)
|
||||||
// Tell the pilot that they just dropped down with a superheavy mecha.
|
// Tell the pilot that they just dropped down with a superheavy mecha.
|
||||||
if(occupant)
|
if(occupant)
|
||||||
to_chat(occupant, "<span class='warning'>\The [src] crashed down onto \the [hit_atom]!</span>")
|
to_chat(occupant, "<span class='warning'>\The [src] crashed down onto \the [hit_atom]!</span>")
|
||||||
@@ -328,7 +443,7 @@
|
|||||||
L.Weaken(8)
|
L.Weaken(8)
|
||||||
|
|
||||||
// Now to hurt the mech.
|
// Now to hurt the mech.
|
||||||
take_damage(rand(15, 30))
|
take_damage(rand(damage_min, damage_max))
|
||||||
|
|
||||||
// And hurt the floor.
|
// And hurt the floor.
|
||||||
if(istype(hit_atom, /turf/simulated/floor))
|
if(istype(hit_atom, /turf/simulated/floor))
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 90 KiB |
BIN
icons/obj/clothing/backpack.dmi
Normal file
BIN
icons/obj/clothing/backpack.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 54 KiB |
Reference in New Issue
Block a user