Files
Bubberstation/code/game/objects/structures/girders.dm
小月猫 b757fce02a New in-wall engine sprites (#64839)
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
2022-03-02 09:06:51 +13:00

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 ..()