bf079d29d4
New power tools for the CE! It's like goof's golden tools but less memey and makes more sense, power tools are much faster than normal tools and take the place of two. Hand drill, activate to switch between between screwdriver bit and bolt bit (screwdriver/wrench) Jaws of life, activate to switch between a cutting head and prying head, can also open powered doors like a xeno. Cutting head cuts your head off if you suicide with them. I wanted to make the prying head gib your head but i couldn't figure it out. Reworked how construction handles sounds and added a new "usesound" var to obj/items. This is useful if you want to add another tool or item that makes a send when it's being used. Also useful if you want to replace a sound for an item or if you have an item with a choice of sounds (like if you have two versions of a sound sound you want to play) CE now gets a unique white tool belt, exactly the same as a regular tool belt, just a re-skin. CE also spawns with the new power tools and an experimental welder, CE will be the ONLY one to spawn with these tools, might make him a more valuable target for traitors. I figured this would be acceptable considering most heads are not antag enabled (i think) Also i added a welding tool sound for reasons... figured might as well add some more sounds while i was reworking it.
374 lines
13 KiB
Plaintext
374 lines
13 KiB
Plaintext
#define GIRDER_NORMAL 0
|
|
#define GIRDER_REINF_STRUTS 1
|
|
#define GIRDER_REINF 2
|
|
#define GIRDER_DISPLACED 3
|
|
#define GIRDER_DISASSEMBLED 4
|
|
|
|
/obj/structure/girder
|
|
name = "girder"
|
|
icon_state = "girder"
|
|
anchored = 1
|
|
density = 1
|
|
layer = BELOW_OBJ_LAYER
|
|
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
|
|
obj_integrity = 200
|
|
max_integrity = 200
|
|
|
|
/obj/structure/girder/attackby(obj/item/W, mob/user, params)
|
|
add_fingerprint(user)
|
|
if(istype(W, /obj/item/weapon/screwdriver))
|
|
if(state == GIRDER_DISPLACED)
|
|
playsound(src.loc, W.usesound, 100, 1)
|
|
user.visible_message("<span class='warning'>[user] disassembles the girder.</span>", \
|
|
"<span class='notice'>You start to disassemble the girder...</span>", "You hear clanking and banging noises.")
|
|
if(do_after(user, 40/W.toolspeed, target = src))
|
|
if(state != GIRDER_DISPLACED)
|
|
return
|
|
state = GIRDER_DISASSEMBLED
|
|
user << "<span class='notice'>You disassemble the girder.</span>"
|
|
var/obj/item/stack/sheet/metal/M = new (loc, 2)
|
|
M.add_fingerprint(user)
|
|
qdel(src)
|
|
else if(state == GIRDER_REINF)
|
|
playsound(src.loc, W.usesound, 100, 1)
|
|
user << "<span class='notice'>You start unsecuring support struts...</span>"
|
|
if(do_after(user, 40/W.toolspeed, target = src))
|
|
if(state != GIRDER_REINF)
|
|
return
|
|
user << "<span class='notice'>You unsecure the support struts.</span>"
|
|
state = GIRDER_REINF_STRUTS
|
|
|
|
else if(istype(W, /obj/item/weapon/wrench))
|
|
if(state == GIRDER_DISPLACED)
|
|
if(!isfloorturf(loc))
|
|
user << "<span class='warning'>A floor must be present to secure the girder!</span>"
|
|
return
|
|
playsound(src.loc, W.usesound, 100, 1)
|
|
user << "<span class='notice'>You start securing the girder...</span>"
|
|
if(do_after(user, 40/W.toolspeed, target = src))
|
|
user << "<span class='notice'>You secure the girder.</span>"
|
|
var/obj/structure/girder/G = new (loc)
|
|
transfer_fingerprints_to(G)
|
|
qdel(src)
|
|
else if(state == GIRDER_NORMAL && can_displace)
|
|
playsound(src.loc, W.usesound, 100, 1)
|
|
user << "<span class='notice'>You start unsecuring the girder...</span>"
|
|
if(do_after(user, 40/W.toolspeed, target = src))
|
|
user << "<span class='notice'>You unsecure the girder.</span>"
|
|
var/obj/structure/girder/displaced/D = new (loc)
|
|
transfer_fingerprints_to(D)
|
|
qdel(src)
|
|
|
|
else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
|
|
user << "<span class='notice'>You start slicing apart the girder...</span>"
|
|
playsound(src, 'sound/items/Welder.ogg', 100, 1)
|
|
if(do_after(user, 30, target = src))
|
|
user << "<span class='notice'>You slice apart the girder.</span>"
|
|
var/obj/item/stack/sheet/metal/M = new (loc, 2)
|
|
M.add_fingerprint(user)
|
|
qdel(src)
|
|
|
|
else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer))
|
|
var/obj/item/weapon/pickaxe/drill/jackhammer/D = W
|
|
user << "<span class='notice'>You smash through the girder!</span>"
|
|
new /obj/item/stack/sheet/metal(get_turf(src))
|
|
D.playDigSound()
|
|
qdel(src)
|
|
|
|
else if(istype(W, /obj/item/weapon/wirecutters) && state == GIRDER_REINF_STRUTS)
|
|
playsound(src.loc, W.usesound, 100, 1)
|
|
user << "<span class='notice'>You start removing support struts...</span>"
|
|
if(do_after(user, 40/W.toolspeed, target = src))
|
|
user << "<span class='notice'>You remove the support struts.</span>"
|
|
new /obj/item/stack/sheet/plasteel(get_turf(src))
|
|
var/obj/structure/girder/G = new (loc)
|
|
transfer_fingerprints_to(G)
|
|
qdel(src)
|
|
|
|
else if(istype(W, /obj/item/stack))
|
|
if(iswallturf(loc))
|
|
user << "<span class='warning'>There is already a wall present!</span>"
|
|
return
|
|
if(!isfloorturf(src.loc))
|
|
user << "<span class='warning'>A floor must be present to build a false wall!</span>"
|
|
return
|
|
if (locate(/obj/structure/falsewall) in src.loc.contents)
|
|
user << "<span class='warning'>There is already a false wall present!</span>"
|
|
return
|
|
|
|
if(istype(W,/obj/item/stack/rods))
|
|
var/obj/item/stack/rods/S = W
|
|
if(state == GIRDER_DISPLACED)
|
|
if(S.get_amount() < 2)
|
|
user << "<span class='warning'>You need at least two rods to create a false wall!</span>"
|
|
return
|
|
user << "<span class='notice'>You start building a reinforced false wall...</span>"
|
|
if(do_after(user, 20, target = src))
|
|
if(!src.loc || !S || S.get_amount() < 2)
|
|
return
|
|
S.use(2)
|
|
user << "<span class='notice'>You create a false wall. Push on it to open or close the passage.</span>"
|
|
var/obj/structure/falsewall/iron/FW = new (loc)
|
|
transfer_fingerprints_to(FW)
|
|
qdel(src)
|
|
else
|
|
if(S.get_amount() < 5)
|
|
user << "<span class='warning'>You need at least five rods to add plating!</span>"
|
|
return
|
|
user << "<span class='notice'>You start adding plating...</span>"
|
|
if (do_after(user, 40, target = src))
|
|
if(!src.loc || !S || S.get_amount() < 5)
|
|
return
|
|
S.use(5)
|
|
user << "<span class='notice'>You add the plating.</span>"
|
|
var/turf/T = get_turf(src)
|
|
T.ChangeTurf(/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/S = W
|
|
if(istype(S,/obj/item/stack/sheet/metal))
|
|
if(state == GIRDER_DISPLACED)
|
|
if(S.get_amount() < 2)
|
|
user << "<span class='warning'>You need two sheets of metal to create a false wall!</span>"
|
|
return
|
|
user << "<span class='notice'>You start building a false wall...</span>"
|
|
if(do_after(user, 20, target = src))
|
|
if(!src.loc || !S || S.get_amount() < 2)
|
|
return
|
|
S.use(2)
|
|
user << "<span class='notice'>You create a false wall. Push on it to open or close the passage.</span>"
|
|
var/obj/structure/falsewall/F = new (loc)
|
|
transfer_fingerprints_to(F)
|
|
qdel(src)
|
|
else
|
|
if(S.get_amount() < 2)
|
|
user << "<span class='warning'>You need two sheets of metal to finish a wall!</span>"
|
|
return
|
|
user << "<span class='notice'>You start adding plating...</span>"
|
|
if (do_after(user, 40, target = src))
|
|
if(loc == null || S.get_amount() < 2)
|
|
return
|
|
S.use(2)
|
|
user << "<span class='notice'>You add the plating.</span>"
|
|
var/turf/T = get_turf(src)
|
|
T.ChangeTurf(/turf/closed/wall)
|
|
transfer_fingerprints_to(T)
|
|
qdel(src)
|
|
return
|
|
|
|
if(istype(S,/obj/item/stack/sheet/plasteel))
|
|
if(state == GIRDER_DISPLACED)
|
|
if(S.get_amount() < 2)
|
|
user << "<span class='warning'>You need at least two sheets to create a false wall!</span>"
|
|
return
|
|
user << "<span class='notice'>You start building a reinforced false wall...</span>"
|
|
if(do_after(user, 20, target = src))
|
|
if(!src.loc || !S || S.get_amount() < 2)
|
|
return
|
|
S.use(2)
|
|
user << "<span class='notice'>You create a reinforced false wall. Push on it to open or close the passage.</span>"
|
|
var/obj/structure/falsewall/reinforced/FW = new (loc)
|
|
transfer_fingerprints_to(FW)
|
|
qdel(src)
|
|
else
|
|
if(state == GIRDER_REINF)
|
|
if(S.get_amount() < 1)
|
|
return
|
|
user << "<span class='notice'>You start finalizing the reinforced wall...</span>"
|
|
if(do_after(user, 50, target = src))
|
|
if(!src.loc || !S || S.get_amount() < 1)
|
|
return
|
|
S.use(1)
|
|
user << "<span class='notice'>You fully reinforce the wall.</span>"
|
|
var/turf/T = get_turf(src)
|
|
T.ChangeTurf(/turf/closed/wall/r_wall)
|
|
transfer_fingerprints_to(T)
|
|
qdel(src)
|
|
return
|
|
else
|
|
if(S.get_amount() < 1)
|
|
return
|
|
user << "<span class='notice'>You start reinforcing the girder...</span>"
|
|
if (do_after(user, 60, target = src))
|
|
if(!src.loc || !S || S.get_amount() < 1)
|
|
return
|
|
S.use(1)
|
|
user << "<span class='notice'>You reinforce the girder.</span>"
|
|
var/obj/structure/girder/reinforced/R = new (loc)
|
|
transfer_fingerprints_to(R)
|
|
qdel(src)
|
|
return
|
|
|
|
if(S.sheettype)
|
|
var/M = S.sheettype
|
|
if(state == GIRDER_DISPLACED)
|
|
if(S.get_amount() < 2)
|
|
user << "<span class='warning'>You need at least two sheets to create a false wall!</span>"
|
|
return
|
|
if(do_after(user, 20, target = src))
|
|
if(!src.loc || !S || S.get_amount() < 2)
|
|
return
|
|
S.use(2)
|
|
user << "<span class='notice'>You create a false wall. Push on it to open or close the passage.</span>"
|
|
var/F = text2path("/obj/structure/falsewall/[M]")
|
|
var/obj/structure/FW = new F (loc)
|
|
transfer_fingerprints_to(FW)
|
|
qdel(src)
|
|
else
|
|
if(S.get_amount() < 2)
|
|
user << "<span class='warning'>You need at least two sheets to add plating!</span>"
|
|
return
|
|
user << "<span class='notice'>You start adding plating...</span>"
|
|
if (do_after(user, 40, target = src))
|
|
if(!src.loc || !S || S.get_amount() < 2)
|
|
return
|
|
S.use(2)
|
|
user << "<span class='notice'>You add the plating.</span>"
|
|
var/turf/T = get_turf(src)
|
|
T.ChangeTurf(text2path("/turf/closed/wall/mineral/[M]"))
|
|
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.drop_item())
|
|
return
|
|
P.loc = src.loc
|
|
user << "<span class='notice'>You fit the pipe into \the [src].</span>"
|
|
else
|
|
return ..()
|
|
|
|
/obj/structure/girder/CanPass(atom/movable/mover, turf/target, height=0)
|
|
if(height==0)
|
|
return 1
|
|
if(istype(mover) && mover.checkpass(PASSGRILLE))
|
|
return prob(girderpasschance)
|
|
else
|
|
if(istype(mover, /obj/item/projectile))
|
|
return prob(girderpasschance)
|
|
else
|
|
return 0
|
|
|
|
/obj/structure/girder/CanAStarPass(ID, dir, caller)
|
|
. = !density
|
|
if(ismovableatom(caller))
|
|
var/atom/movable/mover = caller
|
|
. = . || mover.checkpass(PASSGRILLE)
|
|
|
|
/obj/structure/girder/deconstruct(disassembled = TRUE)
|
|
if(!(flags & NODECONSTRUCT))
|
|
var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
|
|
new remains(loc)
|
|
qdel(src)
|
|
|
|
/obj/structure/girder/narsie_act()
|
|
if(prob(25))
|
|
new /obj/structure/girder/cult(loc)
|
|
qdel(src)
|
|
|
|
/obj/structure/girder/displaced
|
|
name = "displaced girder"
|
|
icon_state = "displaced"
|
|
anchored = 0
|
|
state = GIRDER_DISPLACED
|
|
girderpasschance = 25
|
|
obj_integrity = 120
|
|
max_integrity = 120
|
|
|
|
/obj/structure/girder/reinforced
|
|
name = "reinforced girder"
|
|
icon_state = "reinforced"
|
|
state = GIRDER_REINF
|
|
girderpasschance = 0
|
|
obj_integrity = 350
|
|
max_integrity = 350
|
|
|
|
|
|
|
|
//////////////////////////////////////////// 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.dmi'
|
|
icon_state= "cultgirder"
|
|
can_displace = FALSE
|
|
|
|
/obj/structure/girder/cult/attackby(obj/item/W, mob/user, params)
|
|
add_fingerprint(user)
|
|
if(istype(W, /obj/item/weapon/tome) && iscultist(user)) //Cultists can demolish cult girders instantly with their tomes
|
|
user.visible_message("<span class='warning'>[user] strikes [src] with [W]!</span>", "<span class='notice'>You demolish [src].</span>")
|
|
var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
|
|
R.amount = 1
|
|
qdel(src)
|
|
|
|
else if(istype(W, /obj/item/weapon/weldingtool))
|
|
var/obj/item/weapon/weldingtool/WT = W
|
|
if(WT.remove_fuel(0,user))
|
|
playsound(src.loc, W.usesound, 50, 1)
|
|
user << "<span class='notice'>You start slicing apart the girder...</span>"
|
|
if(do_after(user, 40/W.toolspeed, target = src))
|
|
if( !WT.isOn() )
|
|
return
|
|
user << "<span class='notice'>You slice apart the girder.</span>"
|
|
var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
|
|
R.amount = 1
|
|
transfer_fingerprints_to(R)
|
|
qdel(src)
|
|
|
|
else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
|
|
user << "<span class='notice'>You start slicing apart the girder...</span>"
|
|
playsound(src, 'sound/items/Welder.ogg', 100, 1)
|
|
if(do_after(user, 30, target = src))
|
|
user << "<span class='notice'>You slice apart the girder.</span>"
|
|
var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
|
|
R.amount = 1
|
|
transfer_fingerprints_to(R)
|
|
qdel(src)
|
|
|
|
else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer))
|
|
var/obj/item/weapon/pickaxe/drill/jackhammer/D = W
|
|
user << "<span class='notice'>Your jackhammer smashes through the girder!</span>"
|
|
var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
|
|
R.amount = 2
|
|
transfer_fingerprints_to(R)
|
|
D.playDigSound()
|
|
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)
|
|
user << "<span class='warning'>You need at least one sheet of runed metal to construct a runed wall!</span>"
|
|
return 0
|
|
user.visible_message("<span class='notice'>[user] begins laying runed metal on [src]...</span>", "<span class='notice'>You begin constructing a runed wall...</span>")
|
|
if(do_after(user, 50, target = src))
|
|
if(R.get_amount() < 1 || !R)
|
|
return
|
|
user.visible_message("<span class='notice'>[user] plates [src] with runed metal.</span>", "<span class='notice'>You construct a runed wall.</span>")
|
|
R.use(1)
|
|
var/turf/T = get_turf(src)
|
|
T.ChangeTurf(/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 & NODECONSTRUCT))
|
|
new/obj/item/stack/sheet/runed_metal/(get_turf(src), 1)
|
|
qdel(src)
|