mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-12 01:43:40 +00:00
adds new variants for each sized engine to look like they are in walls (basically cut down sprites with their density set to false (because they dont take up the full tiles, especially the huge engines are 3x3 but only take up 1x3, they must have no density or they block way more than they should)) before: dumb looking gap image after: nice clean engine (and box trams are soul filled, also, trams kinda too small to really get any sort of diagnal design working) image showcase of each sized thruster: image added new structures that act like walls but arent turfs, and can only be used (and can be used!) on trams! comes with 3 types, iron, plastitanium, and titanium. supports more types being added if you want but these are basically all that a tram needs to use: Untitled.1.mp4 also removed a duplicated APC in a maint on tram, and removed cycle helpers from random maint airlocks that arent actually meant to cycle (they are solo) Why It's Good For The Game engines are kinda too bulky and organically shaped so they dont really fit some designs such as tram as a good example, in wall designs allow you to add thrusters onto any shaped ship easily without worrying about ensuring the walls around them being shaped right, as it appears to have the bulk of the engine merged inside the wall Changelog cl Nari Harimoto imageadd: New thruster sprites to allow for in-wall designs fix: removed cycle helpers from 2 random tram maint airlocks that arent meant to cycle (solo airlocks) and a duplicated APC in tram maint expansion: the tram now has new walls! they are structures that function like walls so as to be built on the tram, create and deconstruct via the new tram girder (screwdriver on the girder to deconstruct, there is no displaced version ie wrench) /cl
501 lines
17 KiB
Plaintext
501 lines
17 KiB
Plaintext
/obj/structure/girder
|
|
name = "girder"
|
|
icon_state = "girder"
|
|
desc = "A large structural assembly made out of metal; It requires a layer of iron before it can be considered a wall."
|
|
anchored = TRUE
|
|
density = TRUE
|
|
var/state = GIRDER_NORMAL
|
|
var/girderpasschance = 20 // percentage chance that a projectile passes through the girder.
|
|
var/can_displace = TRUE //If the girder can be moved around by wrenching it
|
|
var/next_beep = 0 //Prevents spamming of the construction sound
|
|
max_integrity = 200
|
|
rad_insulation = RAD_VERY_LIGHT_INSULATION
|
|
|
|
/obj/structure/girder/examine(mob/user)
|
|
. = ..()
|
|
switch(state)
|
|
if(GIRDER_REINF)
|
|
. += span_notice("The support struts are <b>screwed</b> in place.")
|
|
if(GIRDER_REINF_STRUTS)
|
|
. += span_notice("The support struts are <i>unscrewed</i> and the inner <b>grille</b> is intact.")
|
|
if(GIRDER_NORMAL)
|
|
if(can_displace)
|
|
. += span_notice("The bolts are <b>wrenched</b> in place.")
|
|
if(GIRDER_DISPLACED)
|
|
. += span_notice("The bolts are <i>loosened</i>, but the <b>screws</b> are holding [src] together.")
|
|
if(GIRDER_DISASSEMBLED)
|
|
. += span_notice("[src] is disassembled! You probably shouldn't be able to see this examine message.")
|
|
if(GIRDER_TRAM)
|
|
. += span_notice("[src] is designed for tram usage. Deconstructed with a screwdriver!")
|
|
|
|
/obj/structure/girder/attackby(obj/item/W, mob/user, params)
|
|
var/platingmodifier = 1
|
|
if(HAS_TRAIT(user, TRAIT_QUICK_BUILD))
|
|
platingmodifier = 0.7
|
|
if(next_beep <= world.time)
|
|
next_beep = world.time + 10
|
|
playsound(src, 'sound/machines/clockcult/integration_cog_install.ogg', 50, TRUE)
|
|
add_fingerprint(user)
|
|
|
|
if(istype(W, /obj/item/gun/energy/plasmacutter))
|
|
to_chat(user, span_notice("You start slicing apart the girder..."))
|
|
if(W.use_tool(src, user, 40, volume=100))
|
|
to_chat(user, span_notice("You slice apart the girder."))
|
|
var/obj/item/stack/sheet/iron/M = new (loc, 2)
|
|
if (!QDELETED(M))
|
|
M.add_fingerprint(user)
|
|
qdel(src)
|
|
return
|
|
|
|
else if(istype(W, /obj/item/stack))
|
|
if(iswallturf(loc))
|
|
to_chat(user, span_warning("There is already a wall present!"))
|
|
return
|
|
if(!isfloorturf(src.loc) && state != GIRDER_TRAM)
|
|
to_chat(user, span_warning("A floor must be present to build a wall!"))
|
|
return
|
|
if(state == GIRDER_TRAM)
|
|
if(!locate(/obj/structure/industrial_lift/tram) in src.loc.contents)
|
|
to_chat(user, span_warning("Tram walls can only be built on tram floors!"))
|
|
return
|
|
if (locate(/obj/structure/falsewall) in src.loc.contents)
|
|
to_chat(user, span_warning("There is already a false wall present!"))
|
|
return
|
|
|
|
if(istype(W, /obj/item/stack/rods))
|
|
var/obj/item/stack/rods/rod = W
|
|
if(state == GIRDER_DISPLACED)
|
|
if(rod.get_amount() < 5)
|
|
to_chat(user, span_warning("You need at least five rods to create a false wall!"))
|
|
return
|
|
to_chat(user, span_notice("You start building a false wall..."))
|
|
if(do_after(user, 20, target = src))
|
|
if(rod.get_amount() < 5)
|
|
return
|
|
rod.use(5)
|
|
to_chat(user, span_notice("You create a false wall. Push on it to open or close the passage."))
|
|
var/obj/structure/falsewall/iron/FW = new (loc)
|
|
transfer_fingerprints_to(FW)
|
|
qdel(src)
|
|
return
|
|
else
|
|
if(rod.get_amount() < 5)
|
|
to_chat(user, span_warning("You need at least five rods to add plating!"))
|
|
return
|
|
to_chat(user, span_notice("You start adding plating..."))
|
|
if(do_after(user, 40, target = src))
|
|
if(rod.get_amount() < 5)
|
|
return
|
|
rod.use(5)
|
|
to_chat(user, span_notice("You add the plating."))
|
|
var/turf/T = get_turf(src)
|
|
T.PlaceOnTop(/turf/closed/wall/mineral/iron)
|
|
transfer_fingerprints_to(T)
|
|
qdel(src)
|
|
return
|
|
|
|
if(!istype(W, /obj/item/stack/sheet))
|
|
return
|
|
|
|
var/obj/item/stack/sheet/sheets = W
|
|
if(istype(sheets, /obj/item/stack/sheet/iron))
|
|
if(state == GIRDER_DISPLACED)
|
|
if(sheets.get_amount() < 2)
|
|
to_chat(user, span_warning("You need two sheets of iron to create a false wall!"))
|
|
return
|
|
to_chat(user, span_notice("You start building a false wall..."))
|
|
if(do_after(user, 20*platingmodifier, target = src))
|
|
if(sheets.get_amount() < 2)
|
|
return
|
|
sheets.use(2)
|
|
to_chat(user, span_notice("You create a false wall. Push on it to open or close the passage."))
|
|
var/obj/structure/falsewall/F = new (loc)
|
|
transfer_fingerprints_to(F)
|
|
qdel(src)
|
|
return
|
|
else if(state == GIRDER_REINF)
|
|
to_chat(user, span_warning("You can't finish a reinforced girder with regular iron. You need a plasteel sheet for that."))
|
|
return
|
|
else if(state == GIRDER_TRAM)
|
|
if(sheets.get_amount() < 2)
|
|
to_chat(user, span_warning("You need at least two sheets to add plating!"))
|
|
return
|
|
to_chat(user, span_notice("You start adding plating..."))
|
|
if (do_after(user, 4 SECONDS, target = src))
|
|
if(sheets.get_amount() < 2)
|
|
return
|
|
sheets.use(2)
|
|
to_chat(user, span_notice("You add the plating."))
|
|
var/obj/structure/tramwall/tram_wall = new sheets.tram_wall_type(loc)
|
|
transfer_fingerprints_to(tram_wall)
|
|
qdel(src)
|
|
return
|
|
else
|
|
if(sheets.get_amount() < 2)
|
|
to_chat(user, span_warning("You need two sheets of iron to finish a wall!"))
|
|
return
|
|
to_chat(user, span_notice("You start adding plating..."))
|
|
if (do_after(user, 40*platingmodifier, target = src))
|
|
if(sheets.get_amount() < 2)
|
|
return
|
|
sheets.use(2)
|
|
to_chat(user, span_notice("You add the plating."))
|
|
var/turf/T = get_turf(src)
|
|
T.PlaceOnTop(/turf/closed/wall)
|
|
transfer_fingerprints_to(T)
|
|
qdel(src)
|
|
return
|
|
|
|
if(istype(sheets, /obj/item/stack/sheet/plasteel))
|
|
if(state == GIRDER_DISPLACED)
|
|
if(sheets.get_amount() < 2)
|
|
to_chat(user, span_warning("You need at least two sheets to create a false wall!"))
|
|
return
|
|
to_chat(user, span_notice("You start building a reinforced false wall..."))
|
|
if(do_after(user, 20, target = src))
|
|
if(sheets.get_amount() < 2)
|
|
return
|
|
sheets.use(2)
|
|
to_chat(user, span_notice("You create a reinforced false wall. Push on it to open or close the passage."))
|
|
var/obj/structure/falsewall/reinforced/FW = new (loc)
|
|
transfer_fingerprints_to(FW)
|
|
qdel(src)
|
|
return
|
|
else if(state == GIRDER_REINF)
|
|
if(sheets.get_amount() < 1)
|
|
return
|
|
to_chat(user, span_notice("You start finalizing the reinforced wall..."))
|
|
if(do_after(user, 50*platingmodifier, target = src))
|
|
if(sheets.get_amount() < 1)
|
|
return
|
|
sheets.use(1)
|
|
to_chat(user, span_notice("You fully reinforce the wall."))
|
|
var/turf/T = get_turf(src)
|
|
T.PlaceOnTop(/turf/closed/wall/r_wall)
|
|
transfer_fingerprints_to(T)
|
|
qdel(src)
|
|
return
|
|
else
|
|
if(sheets.get_amount() < 1)
|
|
return
|
|
to_chat(user, span_notice("You start reinforcing the girder..."))
|
|
if(do_after(user, 60*platingmodifier, target = src))
|
|
if(sheets.get_amount() < 1)
|
|
return
|
|
sheets.use(1)
|
|
to_chat(user, span_notice("You reinforce the girder."))
|
|
var/obj/structure/girder/reinforced/R = new (loc)
|
|
transfer_fingerprints_to(R)
|
|
qdel(src)
|
|
return
|
|
|
|
if(!sheets.has_unique_girder && sheets.material_type)
|
|
var/M = sheets.sheettype
|
|
if(state == GIRDER_TRAM)
|
|
if(!sheets.tram_wall_type)
|
|
to_chat(user, span_warning("This tram girder only works with Titanium, Plastitanium, or Iron!"))
|
|
return
|
|
if(sheets.get_amount() < 2)
|
|
to_chat(user, span_warning("You need at least two sheets to add plating!"))
|
|
return
|
|
to_chat(user, span_notice("You start adding plating..."))
|
|
if (do_after(user, 4 SECONDS, target = src))
|
|
if(sheets.get_amount() < 2)
|
|
return
|
|
sheets.use(2)
|
|
to_chat(user, span_notice("You add the plating."))
|
|
var/obj/structure/tramwall/tram_wall = new sheets.tram_wall_type(loc)
|
|
transfer_fingerprints_to(tram_wall)
|
|
qdel(src)
|
|
return
|
|
if(state == GIRDER_DISPLACED)
|
|
var/falsewall_type = text2path("/obj/structure/falsewall/[M]")
|
|
if(!falsewall_type)
|
|
to_chat(user, span_warning("You can't seem to figure out how to make a false wall with [sheets]!"))
|
|
return
|
|
if(sheets.get_amount() < 2)
|
|
to_chat(user, span_warning("You need at least two sheets to create a false wall!"))
|
|
return
|
|
if(do_after(user, 20, target = src))
|
|
if(sheets.get_amount() < 2)
|
|
return
|
|
sheets.use(2)
|
|
to_chat(user, span_notice("You create a false wall. Push on it to open or close the passage."))
|
|
var/obj/structure/falsewall/FW = new falsewall_type (loc)
|
|
transfer_fingerprints_to(FW)
|
|
qdel(src)
|
|
return
|
|
else
|
|
if(sheets.get_amount() < 2)
|
|
to_chat(user, span_warning("You need at least two sheets to add plating!"))
|
|
return
|
|
to_chat(user, span_notice("You start adding plating..."))
|
|
if (do_after(user, 40, target = src))
|
|
if(sheets.get_amount() < 2)
|
|
return
|
|
sheets.use(2)
|
|
to_chat(user, span_notice("You add the plating."))
|
|
var/turf/T = get_turf(src)
|
|
if(sheets.walltype)
|
|
T.PlaceOnTop(sheets.walltype)
|
|
else
|
|
var/turf/newturf = T.PlaceOnTop(/turf/closed/wall/material)
|
|
var/list/material_list = list()
|
|
material_list[GET_MATERIAL_REF(sheets.material_type)] = MINERAL_MATERIAL_AMOUNT * 2
|
|
if(material_list)
|
|
newturf.set_custom_materials(material_list)
|
|
|
|
transfer_fingerprints_to(T)
|
|
qdel(src)
|
|
return
|
|
|
|
add_hiddenprint(user)
|
|
|
|
else if(istype(W, /obj/item/pipe))
|
|
var/obj/item/pipe/P = W
|
|
if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds.
|
|
if(!user.transferItemToLoc(P, drop_location()))
|
|
return
|
|
to_chat(user, span_notice("You fit the pipe into \the [src]."))
|
|
else
|
|
return ..()
|
|
|
|
// Screwdriver behavior for girders
|
|
/obj/structure/girder/screwdriver_act(mob/user, obj/item/tool)
|
|
if(..())
|
|
return TRUE
|
|
|
|
. = FALSE
|
|
if(state == GIRDER_TRAM)
|
|
user.visible_message(span_warning("[user] disassembles the girder."),
|
|
span_notice("You start to disassemble the girder..."),
|
|
span_hear("You hear clanking and banging noises."))
|
|
if(tool.use_tool(src, user, 4 SECONDS, volume=100))
|
|
if(state != GIRDER_TRAM)
|
|
return
|
|
state = GIRDER_DISASSEMBLED
|
|
to_chat(user, span_notice("You disassemble the girder."))
|
|
var/obj/item/stack/sheet/iron/M = new (loc, 2)
|
|
if (!QDELETED(M))
|
|
M.add_fingerprint(user)
|
|
qdel(src)
|
|
return TRUE
|
|
|
|
if(state == GIRDER_DISPLACED)
|
|
user.visible_message(span_warning("[user] disassembles the girder."),
|
|
span_notice("You start to disassemble the girder..."),
|
|
span_hear("You hear clanking and banging noises."))
|
|
if(tool.use_tool(src, user, 40, volume=100))
|
|
if(state != GIRDER_DISPLACED)
|
|
return
|
|
state = GIRDER_DISASSEMBLED
|
|
to_chat(user, span_notice("You disassemble the girder."))
|
|
var/obj/item/stack/sheet/iron/M = new (loc, 2)
|
|
if (!QDELETED(M))
|
|
M.add_fingerprint(user)
|
|
qdel(src)
|
|
return TRUE
|
|
|
|
else if(state == GIRDER_REINF)
|
|
to_chat(user, span_notice("You start unsecuring support struts..."))
|
|
if(tool.use_tool(src, user, 40, volume=100))
|
|
if(state != GIRDER_REINF)
|
|
return
|
|
to_chat(user, span_notice("You unsecure the support struts."))
|
|
state = GIRDER_REINF_STRUTS
|
|
return TRUE
|
|
|
|
else if(state == GIRDER_REINF_STRUTS)
|
|
to_chat(user, span_notice("You start securing support struts..."))
|
|
if(tool.use_tool(src, user, 40, volume=100))
|
|
if(state != GIRDER_REINF_STRUTS)
|
|
return
|
|
to_chat(user, span_notice("You secure the support struts."))
|
|
state = GIRDER_REINF
|
|
return TRUE
|
|
|
|
// Wirecutter behavior for girders
|
|
/obj/structure/girder/wirecutter_act(mob/user, obj/item/tool)
|
|
. = ..()
|
|
if(state == GIRDER_REINF_STRUTS)
|
|
to_chat(user, span_notice("You start removing the inner grille..."))
|
|
if(tool.use_tool(src, user, 40, volume=100))
|
|
to_chat(user, span_notice("You remove the inner grille."))
|
|
new /obj/item/stack/sheet/plasteel(get_turf(src))
|
|
var/obj/structure/girder/G = new (loc)
|
|
transfer_fingerprints_to(G)
|
|
qdel(src)
|
|
return TRUE
|
|
|
|
/obj/structure/girder/wrench_act(mob/user, obj/item/tool)
|
|
. = ..()
|
|
if(state == GIRDER_DISPLACED)
|
|
if(!isfloorturf(loc))
|
|
to_chat(user, span_warning("A floor must be present to secure the girder!"))
|
|
|
|
to_chat(user, span_notice("You start securing the girder..."))
|
|
if(tool.use_tool(src, user, 40, volume=100))
|
|
to_chat(user, span_notice("You secure the girder."))
|
|
var/obj/structure/girder/G = new (loc)
|
|
transfer_fingerprints_to(G)
|
|
qdel(src)
|
|
return TRUE
|
|
else if(state == GIRDER_NORMAL && can_displace)
|
|
to_chat(user, span_notice("You start unsecuring the girder..."))
|
|
if(tool.use_tool(src, user, 40, volume=100))
|
|
to_chat(user, span_notice("You unsecure the girder."))
|
|
var/obj/structure/girder/displaced/D = new (loc)
|
|
transfer_fingerprints_to(D)
|
|
qdel(src)
|
|
return TRUE
|
|
|
|
/obj/structure/girder/CanAllowThrough(atom/movable/mover, border_dir)
|
|
. = ..()
|
|
if((mover.pass_flags & PASSGRILLE) || istype(mover, /obj/projectile))
|
|
return prob(girderpasschance)
|
|
|
|
/obj/structure/girder/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller)
|
|
. = !density
|
|
if(istype(caller))
|
|
. = . || (caller.pass_flags & PASSGRILLE)
|
|
|
|
/obj/structure/girder/deconstruct(disassembled = TRUE)
|
|
if(!(flags_1 & NODECONSTRUCT_1))
|
|
var/remains = pick(/obj/item/stack/rods, /obj/item/stack/sheet/iron)
|
|
new remains(loc)
|
|
qdel(src)
|
|
|
|
/obj/structure/girder/narsie_act()
|
|
new /obj/structure/girder/cult(loc)
|
|
qdel(src)
|
|
|
|
/obj/structure/girder/displaced
|
|
name = "displaced girder"
|
|
icon_state = "displaced"
|
|
anchored = FALSE
|
|
state = GIRDER_DISPLACED
|
|
girderpasschance = 25
|
|
max_integrity = 120
|
|
|
|
/obj/structure/girder/reinforced
|
|
name = "reinforced girder"
|
|
icon_state = "reinforced"
|
|
state = GIRDER_REINF
|
|
girderpasschance = 0
|
|
max_integrity = 350
|
|
|
|
/obj/structure/girder/tram
|
|
name = "tram girder"
|
|
state = GIRDER_TRAM
|
|
|
|
|
|
|
|
//////////////////////////////////////////// cult girder //////////////////////////////////////////////
|
|
|
|
/obj/structure/girder/cult
|
|
name = "runed girder"
|
|
desc = "Framework made of a strange and shockingly cold metal. It doesn't seem to have any bolts."
|
|
icon = 'icons/obj/cult/structures.dmi'
|
|
icon_state= "cultgirder"
|
|
can_displace = FALSE
|
|
|
|
/obj/structure/girder/cult/attackby(obj/item/W, mob/user, params)
|
|
add_fingerprint(user)
|
|
if(W.tool_behaviour == TOOL_WELDER)
|
|
if(!W.tool_start_check(user, amount=0))
|
|
return
|
|
|
|
to_chat(user, span_notice("You start slicing apart the girder..."))
|
|
if(W.use_tool(src, user, 40, volume=50))
|
|
to_chat(user, span_notice("You slice apart the girder."))
|
|
var/obj/item/stack/sheet/runed_metal/R = new(drop_location(), 1)
|
|
transfer_fingerprints_to(R)
|
|
qdel(src)
|
|
|
|
else if(istype(W, /obj/item/stack/sheet/runed_metal))
|
|
var/obj/item/stack/sheet/runed_metal/R = W
|
|
if(R.get_amount() < 1)
|
|
to_chat(user, span_warning("You need at least one sheet of runed metal to construct a runed wall!"))
|
|
return
|
|
user.visible_message(span_notice("[user] begins laying runed metal on [src]..."), span_notice("You begin constructing a runed wall..."))
|
|
if(do_after(user, 50, target = src))
|
|
if(R.get_amount() < 1)
|
|
return
|
|
user.visible_message(span_notice("[user] plates [src] with runed metal."), span_notice("You construct a runed wall."))
|
|
R.use(1)
|
|
var/turf/T = get_turf(src)
|
|
T.PlaceOnTop(/turf/closed/wall/mineral/cult)
|
|
qdel(src)
|
|
|
|
else
|
|
return ..()
|
|
|
|
/obj/structure/girder/cult/narsie_act()
|
|
return
|
|
|
|
/obj/structure/girder/cult/deconstruct(disassembled = TRUE)
|
|
if(!(flags_1 & NODECONSTRUCT_1))
|
|
new /obj/item/stack/sheet/runed_metal(drop_location(), 1)
|
|
qdel(src)
|
|
|
|
/obj/structure/girder/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
|
switch(the_rcd.mode)
|
|
if(RCD_FLOORWALL)
|
|
return rcd_result_with_memory(
|
|
list("mode" = RCD_FLOORWALL, "delay" = 2 SECONDS, "cost" = 8),
|
|
get_turf(src), RCD_MEMORY_WALL,
|
|
)
|
|
if(RCD_DECONSTRUCT)
|
|
return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 13)
|
|
return FALSE
|
|
|
|
/obj/structure/girder/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
|
|
var/turf/T = get_turf(src)
|
|
switch(passed_mode)
|
|
if(RCD_FLOORWALL)
|
|
to_chat(user, span_notice("You finish a wall."))
|
|
T.PlaceOnTop(/turf/closed/wall)
|
|
qdel(src)
|
|
return TRUE
|
|
if(RCD_DECONSTRUCT)
|
|
to_chat(user, span_notice("You deconstruct the girder."))
|
|
qdel(src)
|
|
return TRUE
|
|
return FALSE
|
|
|
|
/obj/structure/girder/bronze
|
|
name = "wall gear"
|
|
desc = "A girder made out of sturdy bronze, made to resemble a gear."
|
|
icon_state = "wall_gear"
|
|
can_displace = FALSE
|
|
|
|
/obj/structure/girder/bronze/attackby(obj/item/W, mob/living/user, params)
|
|
add_fingerprint(user)
|
|
if(W.tool_behaviour == TOOL_WELDER)
|
|
if(!W.tool_start_check(user, amount = 0))
|
|
return
|
|
to_chat(user, span_notice("You start slicing apart [src]..."))
|
|
if(W.use_tool(src, user, 40, volume=50))
|
|
to_chat(user, span_notice("You slice apart [src]."))
|
|
var/obj/item/stack/sheet/bronze/B = new(drop_location(), 2)
|
|
transfer_fingerprints_to(B)
|
|
qdel(src)
|
|
|
|
else if(istype(W, /obj/item/stack/sheet/bronze))
|
|
var/obj/item/stack/sheet/bronze/B = W
|
|
if(B.get_amount() < 2)
|
|
to_chat(user, span_warning("You need at least two bronze sheets to build a bronze wall!"))
|
|
return
|
|
user.visible_message(span_notice("[user] begins plating [src] with bronze..."), span_notice("You begin constructing a bronze wall..."))
|
|
if(do_after(user, 50, target = src))
|
|
if(B.get_amount() < 2)
|
|
return
|
|
user.visible_message(span_notice("[user] plates [src] with bronze!"), span_notice("You construct a bronze wall."))
|
|
B.use(2)
|
|
var/turf/T = get_turf(src)
|
|
T.PlaceOnTop(/turf/closed/wall/mineral/bronze)
|
|
qdel(src)
|
|
|
|
else
|
|
return ..()
|