Merge branch 'master' into familyport
This commit is contained in:
@@ -245,6 +245,8 @@
|
||||
those who wish to spit in the eyes of God. Sacrifices outright damage for \
|
||||
a reliance on backstabs and the ability to give fauna concussions on a parry."
|
||||
attack_verb = list("pummeled", "punched", "jabbed", "hammer-fisted", "uppercut", "slammed")
|
||||
hitsound = 'sound/weapons/resonator_blast.ogg'
|
||||
sharpness = SHARP_NONE // use your survival dagger or smth
|
||||
icon_state = "crusher-hands"
|
||||
item_state = "crusher0-fist"
|
||||
unique_reskin = list("Gauntlets" = "crusher-hands",
|
||||
|
||||
@@ -190,6 +190,10 @@
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
icon_state = "bed"
|
||||
|
||||
/obj/structure/bed/double/pod
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
icon_state = "bed_double"
|
||||
|
||||
//Survival Storage Unit
|
||||
/obj/machinery/smartfridge/survival_pod
|
||||
name = "survival pod storage"
|
||||
|
||||
@@ -60,83 +60,86 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
|
||||
return
|
||||
if(A.anchored || (A.move_resist > max_force_fulton))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You start attaching the pack to [A]...</span>")
|
||||
if(do_after(user,50,target=A))
|
||||
to_chat(user, "<span class='notice'>You attach the pack to [A] and activate it.</span>")
|
||||
if(loc == user && istype(user.back, /obj/item/storage/backpack))
|
||||
var/obj/item/storage/backpack/B = user.back
|
||||
SEND_SIGNAL(B, COMSIG_TRY_STORAGE_INSERT, src, user, FALSE, FALSE)
|
||||
uses_left--
|
||||
if(uses_left <= 0)
|
||||
user.transferItemToLoc(src, A, TRUE)
|
||||
var/mutable_appearance/balloon
|
||||
var/mutable_appearance/balloon2
|
||||
var/mutable_appearance/balloon3
|
||||
if(isliving(A))
|
||||
var/mob/living/M = A
|
||||
M.DefaultCombatKnockdown(320) // Keep them from moving during the duration of the extraction
|
||||
M.buckled = 0 // Unbuckle them to prevent anchoring problems
|
||||
else
|
||||
A.anchored = TRUE
|
||||
A.density = FALSE
|
||||
var/obj/effect/extraction_holder/holder_obj = new(A.loc)
|
||||
holder_obj.appearance = A.appearance
|
||||
A.forceMove(holder_obj)
|
||||
balloon2 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_expand")
|
||||
balloon2.pixel_y = 10
|
||||
balloon2.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
||||
holder_obj.add_overlay(balloon2)
|
||||
sleep(4)
|
||||
balloon = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_balloon")
|
||||
balloon.pixel_y = 10
|
||||
balloon.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
||||
holder_obj.cut_overlay(balloon2)
|
||||
holder_obj.add_overlay(balloon)
|
||||
playsound(holder_obj.loc, 'sound/items/fulext_deploy.wav', 50, 1, -3)
|
||||
animate(holder_obj, pixel_z = 10, time = 20)
|
||||
sleep(20)
|
||||
animate(holder_obj, pixel_z = 15, time = 10)
|
||||
sleep(10)
|
||||
animate(holder_obj, pixel_z = 10, time = 10)
|
||||
sleep(10)
|
||||
animate(holder_obj, pixel_z = 15, time = 10)
|
||||
sleep(10)
|
||||
animate(holder_obj, pixel_z = 10, time = 10)
|
||||
sleep(10)
|
||||
playsound(holder_obj.loc, 'sound/items/fultext_launch.wav', 50, 1, -3)
|
||||
animate(holder_obj, pixel_z = 1000, time = 30)
|
||||
if(ishuman(A))
|
||||
var/mob/living/carbon/human/L = A
|
||||
L.SetUnconscious(0)
|
||||
L.drowsyness = 0
|
||||
L.SetSleeping(0)
|
||||
sleep(30)
|
||||
var/list/flooring_near_beacon = list()
|
||||
for(var/turf/open/floor in orange(1, beacon))
|
||||
flooring_near_beacon += floor
|
||||
holder_obj.forceMove(pick(flooring_near_beacon))
|
||||
animate(holder_obj, pixel_z = 10, time = 50)
|
||||
sleep(50)
|
||||
animate(holder_obj, pixel_z = 15, time = 10)
|
||||
sleep(10)
|
||||
animate(holder_obj, pixel_z = 10, time = 10)
|
||||
sleep(10)
|
||||
balloon3 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_retract")
|
||||
balloon3.pixel_y = 10
|
||||
balloon3.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
||||
holder_obj.cut_overlay(balloon)
|
||||
holder_obj.add_overlay(balloon3)
|
||||
sleep(4)
|
||||
holder_obj.cut_overlay(balloon3)
|
||||
A.anchored = FALSE // An item has to be unanchored to be extracted in the first place.
|
||||
A.density = initial(A.density)
|
||||
animate(holder_obj, pixel_z = 0, time = 5)
|
||||
sleep(5)
|
||||
A.forceMove(holder_obj.loc)
|
||||
qdel(holder_obj)
|
||||
if(uses_left <= 0)
|
||||
qdel(src)
|
||||
attach_fulton(A, user, flag, params)
|
||||
|
||||
/obj/item/extraction_pack/proc/attach_fulton(atom/movable/A, mob/living/carbon/human/user, flag, params)
|
||||
set waitfor = FALSE
|
||||
to_chat(user, "<span class='notice'>You start attaching the pack to [A]...</span>")
|
||||
if(do_after(user,50,target=A))
|
||||
to_chat(user, "<span class='notice'>You attach the pack to [A] and activate it.</span>")
|
||||
if(loc == user && istype(user.back, /obj/item/storage/backpack))
|
||||
var/obj/item/storage/backpack/B = user.back
|
||||
SEND_SIGNAL(B, COMSIG_TRY_STORAGE_INSERT, src, user, FALSE, FALSE)
|
||||
uses_left--
|
||||
if(uses_left <= 0)
|
||||
user.transferItemToLoc(src, A, TRUE)
|
||||
var/mutable_appearance/balloon
|
||||
var/mutable_appearance/balloon2
|
||||
var/mutable_appearance/balloon3
|
||||
if(isliving(A))
|
||||
var/mob/living/M = A
|
||||
M.DefaultCombatKnockdown(320) // Keep them from moving during the duration of the extraction
|
||||
M.buckled = 0 // Unbuckle them to prevent anchoring problems
|
||||
else
|
||||
A.anchored = TRUE
|
||||
A.density = FALSE
|
||||
var/obj/effect/extraction_holder/holder_obj = new(A.loc)
|
||||
holder_obj.appearance = A.appearance
|
||||
A.forceMove(holder_obj)
|
||||
balloon2 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_expand")
|
||||
balloon2.pixel_y = 10
|
||||
balloon2.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
||||
holder_obj.add_overlay(balloon2)
|
||||
sleep(4)
|
||||
balloon = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_balloon")
|
||||
balloon.pixel_y = 10
|
||||
balloon.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
||||
holder_obj.cut_overlay(balloon2)
|
||||
holder_obj.add_overlay(balloon)
|
||||
playsound(holder_obj.loc, 'sound/items/fulext_deploy.wav', 50, 1, -3)
|
||||
animate(holder_obj, pixel_z = 10, time = 20)
|
||||
sleep(20)
|
||||
animate(holder_obj, pixel_z = 15, time = 10)
|
||||
sleep(10)
|
||||
animate(holder_obj, pixel_z = 10, time = 10)
|
||||
sleep(10)
|
||||
animate(holder_obj, pixel_z = 15, time = 10)
|
||||
sleep(10)
|
||||
animate(holder_obj, pixel_z = 10, time = 10)
|
||||
sleep(10)
|
||||
playsound(holder_obj.loc, 'sound/items/fultext_launch.wav', 50, 1, -3)
|
||||
animate(holder_obj, pixel_z = 1000, time = 30)
|
||||
if(ishuman(A))
|
||||
var/mob/living/carbon/human/L = A
|
||||
L.SetUnconscious(0)
|
||||
L.drowsyness = 0
|
||||
L.SetSleeping(0)
|
||||
sleep(30)
|
||||
var/list/flooring_near_beacon = list()
|
||||
for(var/turf/open/floor in orange(1, beacon))
|
||||
flooring_near_beacon += floor
|
||||
holder_obj.forceMove(pick(flooring_near_beacon))
|
||||
animate(holder_obj, pixel_z = 10, time = 50)
|
||||
sleep(50)
|
||||
animate(holder_obj, pixel_z = 15, time = 10)
|
||||
sleep(10)
|
||||
animate(holder_obj, pixel_z = 10, time = 10)
|
||||
sleep(10)
|
||||
balloon3 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_retract")
|
||||
balloon3.pixel_y = 10
|
||||
balloon3.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM
|
||||
holder_obj.cut_overlay(balloon)
|
||||
holder_obj.add_overlay(balloon3)
|
||||
sleep(4)
|
||||
holder_obj.cut_overlay(balloon3)
|
||||
A.anchored = FALSE // An item has to be unanchored to be extracted in the first place.
|
||||
A.density = initial(A.density)
|
||||
animate(holder_obj, pixel_z = 0, time = 5)
|
||||
sleep(5)
|
||||
A.forceMove(holder_obj.loc)
|
||||
qdel(holder_obj)
|
||||
if(uses_left <= 0)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/fulton_core
|
||||
name = "extraction beacon signaller"
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
//Houses the ash tree, a lava land tree that has been burning for quite some time making a maple like sweetener.
|
||||
|
||||
/obj/structure/flora/ashtree
|
||||
name = "ashed tree"
|
||||
desc = "A once large tree now burnt like the lands around it."
|
||||
layer = FLY_LAYER
|
||||
gender = PLURAL //same as other tree
|
||||
density = TRUE
|
||||
pixel_x = -16
|
||||
icon = 'icons/obj/lavaland/ash_tree.dmi'
|
||||
icon_state = "ashtree"
|
||||
//Are icon when we are full of honey or other sap
|
||||
var/sap_icon_state = "ashtree_maple"
|
||||
//What we look like when tapping
|
||||
var/tabbed_icon_state = "ashtree_maple"
|
||||
//amout of coal in are tree, simular to logs
|
||||
var/coal_amount = 5
|
||||
//Do we have sap?
|
||||
var/sap = FALSE
|
||||
//What reagent we have
|
||||
var/sap_type = /datum/reagent/consumable/honey
|
||||
//This is in seconds, and now long we wait till are tree is tapped
|
||||
var/harvest_sap_time = 60
|
||||
var/container_used
|
||||
var/sap_amount
|
||||
|
||||
/obj/structure/flora/ashtree/Initialize(mapload)
|
||||
..()
|
||||
if(prob(50))
|
||||
sap = TRUE
|
||||
icon_state = sap_icon_state
|
||||
desc = "A once large tree now burnt like the lands around it. This one seems to have a sap still inside."
|
||||
//If we have sap, we can generate a bit of it
|
||||
sap_amount = rand(5,15)
|
||||
//Random coal or wood amount, so its not bog standered.
|
||||
coal_amount = rand(5,15)
|
||||
//If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
SSblackbox.record_feedback("tally", "Honey Tree", 1, "Trees Spawned")
|
||||
|
||||
//So we dont lose are bowls, stolen form closet code
|
||||
/obj/structure/flora/ashtree/Destroy()
|
||||
dump_contents(override = FALSE)
|
||||
return ..()
|
||||
|
||||
//Override is for not revealing the locker electronics when you open the locker, for example
|
||||
/obj/structure/flora/ashtree/proc/dump_contents(override = TRUE)
|
||||
var/atom/L = drop_location()
|
||||
for(var/atom/movable/AM in src)
|
||||
AM.forceMove(L)
|
||||
|
||||
/obj/structure/flora/ashtree/proc/harvest_sap()
|
||||
desc = "A once large tree now burnt like the lands around it."
|
||||
icon_state = "ashtree"
|
||||
var/obj/item/reagent_containers/RG = container_used
|
||||
//Incase someone was a dumb and used a lidded container
|
||||
if(RG.is_refillable())
|
||||
//Make sure that its not filling something thats full
|
||||
if(!RG.reagents.holder_full())
|
||||
RG.reagents.add_reagent(sap_type, min(RG.volume - RG.reagents.total_volume, sap_amount))
|
||||
//We drop are used beaker and try to fill it with sap
|
||||
RG.forceMove(drop_location())
|
||||
SSblackbox.record_feedback("tally", "Honey Tree", 1, "Harvested Honey") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
//Proc stolen from Trees
|
||||
//If you hit it with a sharp force aboe 0 item it chops it down, unlike trees tho it dosnt give wood as its already charcoal
|
||||
//Also dosnt have a stump
|
||||
/obj/structure/flora/ashtree/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/reagent_containers))
|
||||
if(sap)
|
||||
user.visible_message("<span class='notice'>[user] pokes [src] and places a container under the [W].</span>","<span class='notice'>You set up [src] with [W].</span>")
|
||||
icon_state = tabbed_icon_state
|
||||
sap = FALSE
|
||||
container_used = W
|
||||
//So we dont lose are bowl when cutting it down + needed for the harvest sap proc
|
||||
user.transferItemToLoc(W, src)
|
||||
addtimer(CALLBACK(src, .proc/harvest_sap), harvest_sap_time SECONDS)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There is no sap to collect.</span>")
|
||||
|
||||
if(coal_amount && (!(flags_1 & NODECONSTRUCT_1)))
|
||||
if(!W.sharpness || !W.force)
|
||||
return
|
||||
if(W.hitsound)
|
||||
playsound(get_turf(src), W.hitsound, 100, 0, 0)
|
||||
user.visible_message("<span class='notice'>[user] begins to cut down [src] with [W].</span>","<span class='notice'>You begin to cut down [src] with [W].</span>", "You hear the sound of brittle sawing.")
|
||||
//2.5 seconds with 20 force, 4 seconds with a hatchet, 10 seconds with a shard.
|
||||
if(do_after(user, 500/W.force, target = src))
|
||||
user.visible_message("<span class='notice'>[user] fells [src] with the [W].</span>","<span class='notice'>You fell [src] with the [W].</span>", "You hear the sound of a crumbling tree.")
|
||||
playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 100 , 0, 0)
|
||||
for(var/i=1 to coal_amount)
|
||||
new /obj/item/stack/sheet/mineral/coal(get_turf(src))
|
||||
qdel(src)//If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
SSblackbox.record_feedback("tally", "Honey Tree", 1, "Cutted Tree")
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -484,7 +484,7 @@
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/warp_cube/ex_act(severity, target)
|
||||
/obj/effect/warp_cube/ex_act(severity, target, origin)
|
||||
return
|
||||
|
||||
//Meat Hook
|
||||
@@ -607,7 +607,7 @@
|
||||
/obj/effect/immortality_talisman/attackby()
|
||||
return
|
||||
|
||||
/obj/effect/immortality_talisman/ex_act()
|
||||
/obj/effect/immortality_talisman/ex_act(severity, target, origin)
|
||||
return
|
||||
|
||||
/obj/effect/immortality_talisman/singularity_pull()
|
||||
|
||||
@@ -346,7 +346,7 @@
|
||||
to_chat(usr, "<span class='warning'>Required access not found.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/ex_act(severity, target)
|
||||
/obj/machinery/mineral/ore_redemption/ex_act(severity, target, origin)
|
||||
do_sparks(5, TRUE, src)
|
||||
..()
|
||||
|
||||
|
||||
@@ -243,3 +243,17 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
|
||||
sep = ", "
|
||||
msg += "[amount < 0 ? "-" : "+"][val] [M.name]"
|
||||
formatted = msg.Join()
|
||||
|
||||
/obj/machinery/ore_silo/on_object_saved(var/depth = 0)
|
||||
if(depth >= 10)
|
||||
return ""
|
||||
var/dat
|
||||
var/datum/component/material_container/material_holder = GetComponent(/datum/component/material_container)
|
||||
for(var/each in material_holder.materials)
|
||||
var/amount = material_holder.materials[each] / MINERAL_MATERIAL_AMOUNT
|
||||
var/datum/material/material_datum = each
|
||||
while(amount > 0)
|
||||
var/amount_in_stack = max(1, min(50, amount))
|
||||
amount -= amount_in_stack
|
||||
dat += "[dat ? ",\n" : ""][material_datum.sheet_type]{\n\tamount = [amount_in_stack]\n\t}"
|
||||
return dat
|
||||
|
||||
@@ -270,7 +270,7 @@
|
||||
SSblackbox.record_feedback("tally", "crusher_voucher_redeemed", 1, selection)
|
||||
qdel(voucher)
|
||||
|
||||
/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
|
||||
/obj/machinery/mineral/equipment_vendor/ex_act(severity, target, origin)
|
||||
do_sparks(5, TRUE, src)
|
||||
if(prob(50 / severity) && severity < 3)
|
||||
qdel(src)
|
||||
|
||||
@@ -152,7 +152,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
|
||||
C.forcesay("*scream")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/stack/ore/glass/ex_act(severity, target)
|
||||
/obj/item/stack/ore/glass/ex_act(severity, target, origin)
|
||||
if (severity == EXPLODE_NONE)
|
||||
return
|
||||
qdel(src)
|
||||
@@ -314,7 +314,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
|
||||
GibtoniteReaction(P.firer)
|
||||
. = ..()
|
||||
|
||||
/obj/item/gibtonite/ex_act()
|
||||
/obj/item/gibtonite/ex_act(severity, target, origin)
|
||||
GibtoniteReaction(null, 1)
|
||||
|
||||
/obj/item/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by = 0)
|
||||
@@ -356,7 +356,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
|
||||
pixel_x = initial(pixel_x) + rand(0, 16) - 8
|
||||
pixel_y = initial(pixel_y) + rand(0, 8) - 8
|
||||
|
||||
/obj/item/stack/ore/ex_act(severity, target)
|
||||
/obj/item/stack/ore/ex_act(severity, target, origin)
|
||||
if (!severity || severity >= 2)
|
||||
return
|
||||
qdel(src)
|
||||
|
||||
Reference in New Issue
Block a user