diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index a3bb5355947..571b32cbc48 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -34,7 +34,7 @@ if(istype(W, /obj/item/device/analyzer)) atmosanalyzer_scan(parent.air, user) - if(istype(W,/obj/item/device/pipe_painter)) + if(istype(W,/obj/item/device/pipe_painter) || istype(W,/obj/item/weapon/pipe_dispenser)) return return ..() @@ -49,4 +49,4 @@ var/obj/item/pipe_meter/PM = new (T) meter.transfer_fingerprints_to(PM) qdel(meter) - ..() \ No newline at end of file + ..() diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index bb16ba4c47c..c1fa0980810 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -22,6 +22,15 @@ Buildable meters #define PIPE_HEAT_EXCHANGE 17 #define PIPE_DVALVE 18 #define PIPE_4WAYMANIFOLD 19 +//Disposal piping numbers - do NOT hardcode these, use the defines +#define DISP_PIPE_STRAIGHT 0 +#define DISP_PIPE_BENT 1 +#define DISP_JUNCTION 2 +#define DISP_YJUNCTION 3 +#define DISP_END_TRUNK 4 +#define DISP_END_BIN 5 +#define DISP_END_OUTLET 6 +#define DISP_END_CHUTE 7 /obj/item/pipe name = "pipe" @@ -95,6 +104,28 @@ Buildable meters src.pixel_y = rand(-5, 5) //update the name and icon of the pipe item depending on the type +var/global/list/pipeID2State = list( + "simple", \ + "simple", \ + "he", \ + "he", \ + "connector", \ + "manifold", \ + "junction", \ + "uvent", \ + "mvalve", \ + "pump", \ + "scrubber", \ + "insulated", \ + "insulated", \ + "filter", \ + "mixer", \ + "passivegate", \ + "volumepump", \ + "heunary", \ + "dvalve", \ + "manifold4w", \ +) /obj/item/pipe/proc/update() var/list/nlist = list( \ @@ -120,29 +151,7 @@ Buildable meters "4-way manifold", \ ) name = nlist[pipe_type+1] + " fitting" - var/list/islist = list( \ - "simple", \ - "simple", \ - "he", \ - "he", \ - "connector", \ - "manifold", \ - "junction", \ - "uvent", \ - "mvalve", \ - "pump", \ - "scrubber", \ - "insulated", \ - "insulated", \ - "filter", \ - "mixer", \ - "passivegate", \ - "volumepump", \ - "heunary", \ - "dvalve", \ - "manifold4w", \ - ) - icon_state = islist[pipe_type + 1] + icon_state = pipeID2State[pipe_type + 1] //called when a turf is attacked with a pipe item // place the pipe on the turf, setting pipe level to 1 (underfloor) if the turf is not intact @@ -423,24 +432,3 @@ Buildable meters playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You have fastened the meter to the pipe." qdel(src) - -#undef PIPE_SIMPLE_STRAIGHT -#undef PIPE_SIMPLE_BENT -#undef PIPE_HE_STRAIGHT -#undef PIPE_HE_BENT -#undef PIPE_CONNECTOR -#undef PIPE_MANIFOLD -#undef PIPE_JUNCTION -#undef PIPE_UVENT -#undef PIPE_MVALVE -#undef PIPE_PUMP -#undef PIPE_SCRUBBER -#undef PIPE_INSULATED_STRAIGHT -#undef PIPE_INSULATED_BENT -#undef PIPE_GAS_FILTER -#undef PIPE_GAS_MIXER -#undef PIPE_PASSIVE_GATE -#undef PIPE_VOLUME_PUMP -#undef PIPE_OUTLET_INJECT -#undef PIPE_DVALVE -#undef PIPE_4WAYMANIFOLD \ No newline at end of file diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm new file mode 100644 index 00000000000..8ed87ab0597 --- /dev/null +++ b/code/game/objects/items/weapons/RPD.dm @@ -0,0 +1,547 @@ +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 + +/* +CONTAINS: +RPD +*/ +#define PIPE_BINARY 0 +#define PIPE_BENT 1 +#define PIPE_TRINARY 2 +#define PIPE_TRIN_M 3 +#define PIPE_UNARY 4 + +/datum/pipe_info + var/id=-1 + var/dir=SOUTH + var/dirtype=PIPE_BINARY + var/icon = 'icons/obj/pipe-item.dmi' + var/icon_state="" + var/selected=0 + +/datum/pipe_info/New(var/pid,var/direction,var/dt) + src.id=pid + src.icon_state=pipeID2State[pid+1] + src.dir=direction + src.dirtype=dt + +/datum/pipe_info/proc/Render(var/dispenser,var/label) + return "
  • [label]
  • " + +/datum/pipe_info/meter + icon = 'icons/obj/pipes.dmi' + icon_state = "meterX" + +/datum/pipe_info/meter/New() + return + +/datum/pipe_info/meter/Render(var/dispenser,var/label) + return "
  • [label]
  • " //hardcoding is no + +var/global/list/disposalpipeID2State=list( + "pipe-s", + "pipe-c", + "pipe-j1", + "pipe-j2", + "pipe-y", + "pipe-t", + "condisposal", + "outlet", + "intake", + "pipe-j1s", + "pipe-j2s" +) + +/datum/pipe_info/disposal + icon = 'icons/obj/pipes/disposal.dmi' + icon_state = "meterX" + +/datum/pipe_info/disposal/New(var/pid,var/dt) + src.id=pid + src.icon_state=disposalpipeID2State[pid+1] + src.dir=2 + src.dirtype=dt + if(pid<6 || pid>8) + icon_state = "con[icon_state]" + +/datum/pipe_info/disposal/Render(var/dispenser,var/label) + return "
  • [label]
  • " //avoid hardcoding. + +//find these defines in code\game\machinery\pipe\consruction.dm +var/global/list/RPD_recipes=list( + "Regular Pipes" = list( + "Pipe" = new /datum/pipe_info(PIPE_SIMPLE_STRAIGHT, 1, PIPE_BINARY), + "Bent Pipe" = new /datum/pipe_info(PIPE_SIMPLE_BENT, 5, PIPE_BENT), + "Manifold" = new /datum/pipe_info(PIPE_MANIFOLD, 1, PIPE_TRINARY), + "Manual Valve" = new /datum/pipe_info(PIPE_MVALVE, 1, PIPE_BINARY), + "Digital Valve" = new /datum/pipe_info(PIPE_DVALVE, 1, PIPE_BINARY), + "4-Way Manifold" = new /datum/pipe_info(PIPE_4WAYMANIFOLD, 1, PIPE_BINARY), + ), + "Devices"=list( + "Connector" = new /datum/pipe_info(PIPE_CONNECTOR, 1, PIPE_UNARY), + "Unary Vent" = new /datum/pipe_info(PIPE_UVENT, 1, PIPE_UNARY), + "Gas Pump" = new /datum/pipe_info(PIPE_PUMP, 1, PIPE_UNARY), + "Passive Gate" = new /datum/pipe_info(PIPE_PASSIVE_GATE, 1, PIPE_UNARY), + "Volume Pump" = new /datum/pipe_info(PIPE_VOLUME_PUMP, 1, PIPE_UNARY), + "Scrubber" = new /datum/pipe_info(PIPE_SCRUBBER, 1, PIPE_UNARY), + "Meter" = new /datum/pipe_info/meter(), + "Gas Filter" = new /datum/pipe_info(PIPE_GAS_FILTER, 1, PIPE_TRIN_M), + "Gas Mixer" = new /datum/pipe_info(PIPE_GAS_MIXER, 1, PIPE_TRIN_M), +// "Injector" = new /datum/pipe_info(PIPE_INJECTOR, 1, PIPE_UNARY), + ), + "Heat Exchange" = list( + "Pipe" = new /datum/pipe_info(PIPE_HE_STRAIGHT, 1, PIPE_BINARY), + "Bent Pipe" = new /datum/pipe_info(PIPE_HE_BENT, 5, PIPE_BENT), + "Junction" = new /datum/pipe_info(PIPE_JUNCTION, 1, PIPE_UNARY), + "Heat Exchanger" = new /datum/pipe_info(PIPE_HEAT_EXCHANGE, 1, PIPE_UNARY), + ), + "Insulated Pipes" = list( + "Pipe" = new /datum/pipe_info(PIPE_INSULATED_STRAIGHT,1, PIPE_BINARY), + "Bent Pipe" = new /datum/pipe_info(PIPE_INSULATED_BENT, 5, PIPE_BENT), + ), + "Disposal Pipes" = list( + "Pipe" = new /datum/pipe_info/disposal(DISP_PIPE_STRAIGHT, PIPE_BINARY), + "Bent Pipe" = new /datum/pipe_info/disposal(DISP_PIPE_BENT, PIPE_BENT), + "Junction" = new /datum/pipe_info/disposal(DISP_JUNCTION, PIPE_TRINARY), + "Y-Junction" = new /datum/pipe_info/disposal(DISP_YJUNCTION, PIPE_TRINARY), + "Trunk" = new /datum/pipe_info/disposal(DISP_END_TRUNK, PIPE_TRINARY), + "Bin" = new /datum/pipe_info/disposal(DISP_END_BIN, PIPE_UNARY), + "Outlet" = new /datum/pipe_info/disposal(DISP_END_OUTLET, PIPE_UNARY), + "Chute" = new /datum/pipe_info/disposal(DISP_END_CHUTE, PIPE_UNARY), + ) +) +/obj/item/weapon/pipe_dispenser + name = "Rapid Piping Device (RPD)" + desc = "A device used to rapidly pipe things." + icon = 'icons/obj/items.dmi' + icon_state = "rpd" + opacity = 0 + density = 0 + anchored = 0.0 + flags = CONDUCT + force = 10.0 + throwforce = 10.0 + throw_speed = 1 + throw_range = 5 + w_class = 3.0 + m_amt = 75000 + g_amt = 37500 + origin_tech = "engineering=4;materials=2" + var/datum/effect/effect/system/spark_spread/spark_system + var/working = 0 + var/p_type = 0 + var/p_conntype = 0 + var/p_dir = 1 + var/p_class = 0 + var/p_disposal = 0 + var/list/paint_colors = list( + "grey" = "#cccccc", + "red" = "#800000", + "blue" = "#000080", + "cyan" = "#1C94C4", + "green" = "#00CC00", + "yellow" = "#FFCC00", + "purple" = "#822BFF" + ) + var/paint_color="grey" + +/obj/item/weapon/pipe_dispenser/New() + . = ..() + spark_system = new /datum/effect/effect/system/spark_spread + spark_system.set_up(5, 0, src) + spark_system.attach(src) + +/obj/item/weapon/pipe_dispenser/attack_self(mob/user as mob) + show_menu(user) + +/obj/item/weapon/pipe_dispenser/proc/render_dir_img(var/_dir,var/pic,var/title) + var/selected="" + if(_dir == p_dir) + selected=" class=\"selected\"" + return "" + +/obj/item/weapon/pipe_dispenser/proc/show_menu(mob/user as mob) + if(!user || !src) return 0 + var/dat = {"

    Type

    +Utilities: +"} + var/icon/preview=null + for(var/category in RPD_recipes) + dat += "[category]:" + + var/color_css="" + var/color_picker="" + for(var/color_name in paint_colors) + var/color=paint_colors[color_name] + color_css += {" + a.color.[color_name] { + color: [color]; + } + a.color.[color_name]:hover { + border:1px solid [color]; + } + a.color.[color_name].selected { + background-color: [color]; + } + "} + var/selected="" + if(color_name==paint_color) + selected = " selected" + color_picker += {""} + + var/dirsel="

    Direction

    " + switch(p_conntype) + if(-1) + if(p_class==-2) + dirsel = "

    Direction

    [color_picker]" + + if(PIPE_BINARY) // Straight, N-S, W-E + if(preview) + user << browse_rsc(new /icon(preview, dir=NORTH), "vertical.png") + user << browse_rsc(new /icon(preview, dir=EAST), "horizontal.png") + + dirsel += "

    " + dirsel += render_dir_img(1,"vertical.png","Vertical") + dirsel += render_dir_img(4,"horizontal.png","Horizontal") + dirsel += "

    " + else + dirsel+={" +

    + + +

    + "} + if(PIPE_BENT) // Bent, N-W, N-E etc + if(preview) + user << browse_rsc(new /icon(preview, dir=NORTHWEST), "nw.png") + user << browse_rsc(new /icon(preview, dir=NORTHEAST), "ne.png") + user << browse_rsc(new /icon(preview, dir=SOUTHWEST), "sw.png") + user << browse_rsc(new /icon(preview, dir=SOUTHEAST), "se.png") + + dirsel += "

    " + dirsel += render_dir_img(9,"nw.png","West to North") + dirsel += render_dir_img(5,"ne.png","North to East") + dirsel += "
    " + dirsel += render_dir_img(10,"sw.png","South to West") + dirsel += render_dir_img(6,"se.png","East to South") + dirsel += "

    " + else + dirsel+={" +

    + + +
    + + +

    + "} + if(PIPE_TRINARY) // Manifold + if(preview) + user << browse_rsc(new /icon(preview, dir=NORTH), "s.png") + user << browse_rsc(new /icon(preview, dir=EAST), "w.png") + user << browse_rsc(new /icon(preview, dir=SOUTH), "n.png") + user << browse_rsc(new /icon(preview, dir=WEST), "e.png") + + dirsel += "

    " + dirsel += render_dir_img(1,"s.png","West South East") + dirsel += render_dir_img(4,"w.png","North West South") + dirsel += "
    " + dirsel += render_dir_img(2,"n.png","East North West") + dirsel += render_dir_img(8,"e.png","South East North") + dirsel += "

    " + else + dirsel+={" +

    + + +
    + + +

    + "} + if(PIPE_TRIN_M) // Mirrored ones + if(preview) + user << browse_rsc(new /icon(preview, dir=NORTH), "s.png") + user << browse_rsc(new /icon(preview, dir=EAST), "w.png") + user << browse_rsc(new /icon(preview, dir=SOUTH), "n.png") + user << browse_rsc(new /icon(preview, dir=WEST), "e.png") + user << browse_rsc(new /icon(preview, dir=SOUTHEAST), "sm.png") //each mirror icon is 45 anticlockwise from it's real direction + user << browse_rsc(new /icon(preview, dir=NORTHEAST), "wm.png") + user << browse_rsc(new /icon(preview, dir=NORTHWEST), "nm.png") + user << browse_rsc(new /icon(preview, dir=SOUTHWEST), "em.png") + + dirsel += "

    " + dirsel += render_dir_img(1,"s.png","West South East") + dirsel += render_dir_img(4,"w.png","North West South") + dirsel += "
    " + dirsel += render_dir_img(2,"n.png","East North West") + dirsel += render_dir_img(8,"e.png","South East North") + dirsel += "
    " + dirsel += render_dir_img(6,"sm.png","West South East") + dirsel += render_dir_img(5,"wm.png","North West South") + dirsel += "
    " + dirsel += render_dir_img(9,"nm.png","East North West") + dirsel += render_dir_img(10,"em.png","South East North") + dirsel += "

    " + else + dirsel+={" +

    + + +
    + + +
    + + +
    + + +

    + "} + if(PIPE_UNARY) // Unary + if(preview) + user << browse_rsc(new /icon(preview, dir=NORTH), "n.png") + user << browse_rsc(new /icon(preview, dir=EAST), "e.png") + user << browse_rsc(new /icon(preview, dir=SOUTH), "s.png") + user << browse_rsc(new /icon(preview, dir=WEST), "w.png") + + dirsel += "

    " + dirsel += render_dir_img(NORTH,"n.png","North") + dirsel += render_dir_img(EAST, "e.png","East") + dirsel += render_dir_img(SOUTH,"s.png","South") + dirsel += render_dir_img(WEST, "w.png","West") + dirsel += "

    " + else + dirsel+={" +

    + + + + +

    + "} + + dat = {" + + + [name] + + + +[dirsel][dat] + + +"} + user << browse(dat, "window=pipedispenser") + onclose(user, "pipedispenser") + return + +/obj/item/weapon/pipe_dispenser/Topic(href, href_list) + if(usr.stat || usr.restrained()) + usr << browse(null, "window=pipedispenser") + return + usr.set_machine(src) + src.add_fingerprint(usr) + if(href_list["setdir"]) + p_dir= text2num(href_list["setdir"]) + show_menu(usr) + + if(href_list["eatpipes"]) + p_class = -1 + p_conntype=-1 + p_dir=1 + src.spark_system.start() + playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) + show_menu(usr) + + if(href_list["paintpipes"]) + p_class = -2 + p_conntype=-1 + p_dir=1 + src.spark_system.start() + playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) + show_menu(usr) + + if(href_list["set_color"]) + paint_color=href_list["set_color"] + src.spark_system.start() + playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) + show_menu(usr) + + if(href_list["makepipe"]) + p_type = text2num(href_list["makepipe"]) + p_dir = text2num(href_list["dir"]) + p_conntype = text2num(href_list["type"]) + p_class = 0 + src.spark_system.start() + playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) + show_menu(usr) + + if(href_list["makemeter"]) + p_class = 1 + p_conntype=-1 + p_dir=1 + src.spark_system.start() + playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) + show_menu(usr) + + if(href_list["dmake"]) + p_type = text2num(href_list["dmake"]) + p_conntype = text2num(href_list["type"]) + p_dir = 1 + p_class = 2 + src.spark_system.start() + playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0) + show_menu(usr) + + +/obj/item/weapon/pipe_dispenser/afterattack(atom/A, mob/user) + if(!in_range(A,user)) + return + if(loc != user) + return + if(!isrobot(user) && !ishuman(user)) + return 0 + if(istype(A,/area/shuttle)||istype(A,/turf/space/transit)) + return 0 + + switch(p_class) + if(-2) // Paint pipes + if(!istype(A,/obj/machinery/atmospherics/pipe) || istype(A,/obj/machinery/atmospherics/pipe/simple/heat_exchanging) || istype(A,/obj/machinery/atmospherics/pipe/simple/insulated)) + // Avoid spewing errors about invalid mode -2 when clicking on stuff that aren't pipes. + user << "\The [src]'s error light flickers. Perhaps you need to only use it on pipes and pipe meters?" + return 0 + var/obj/machinery/atmospherics/pipe/P = A + playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) + P.pipe_color = paint_color + user.visible_message("[user] paints \the [P] [paint_color].","You paint \the [P] [paint_color].") + P.update_icon() + return 1 + if(-1) // Eating pipes + // Must click on an actual pipe or meter. + if(istype(A,/obj/item/pipe) || istype(A,/obj/item/pipe_meter) || istype(A,/obj/structure/disposalconstruct)) + user << "Destroying Pipe..." + playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) + if(do_after(user, 5)) + activate() + del(A) + return 1 + return 0 + + // Avoid spewing errors about invalid mode -1 when clicking on stuff that aren't pipes. + user << "The [src]'s error light flickers. Perhaps you need to only use it on pipes and pipe meters?" + return 0 + if(0) + if(!(istype(A, /turf))) + user << "The [src]'s error light flickers." + return 0 + user << "Building Pipes ..." + playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) + if(do_after(user, 20)) + activate() + var/obj/item/pipe/P = new (A, pipe_type=p_type, dir=p_dir) + P.update() + P.add_fingerprint(usr) + return 1 + return 0 + + if(1) + if(!(istype(A, /turf))) + user << "The [src]'s error light flickers." + return 0 + user << "Building Meter..." + playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) + if(do_after(user, 20)) + activate() + new /obj/item/pipe_meter(A) + return 1 + return 0 + + if(2) + if(!(istype(A, /turf))) + user << "The [src]'s error light flickers." + return 0 + user << "Building Pipes..." + playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) + if(do_after(user, 20)) + activate() + var/obj/structure/disposalconstruct/C = new (A) + // This may still produce runtimes, but I checked and /obj/structure/disposalconstruct + // DOES have a dir property, inherited from /obj/structure. - N3X + C.dir=p_dir + switch(p_type) + if(0) + C.ptype = 0 + if(1) + C.ptype = 1 + if(2) + C.ptype = 2 + if(3) + C.ptype = 4 + if(4) + C.ptype = 5 + if(5) + C.ptype = 6 + C.density = 1 + if(6) + C.ptype = 7 + C.density = 1 + if(7) + C.ptype = 8 + C.density = 1 + C.add_fingerprint(usr) + C.update() + return 1 + return 0 + else + ..() + return 0 + + +/obj/item/weapon/pipe_dispenser/proc/activate() + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 439fb0a86ff..ae268783c38 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -125,8 +125,8 @@ /obj/structure/closet/secure_closet/atmospherics/New() ..() - sleep(2) new /obj/item/device/radio/headset/headset_eng(src) + new /obj/item/weapon/pipe_dispenser(src) new /obj/item/weapon/storage/toolbox/mechanical(src) new /obj/item/weapon/storage/backpack/satchel_norm(src) new /obj/item/weapon/tank/emergency_oxygen/engi(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 6e488bc3ec9..77be370abf8 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -109,6 +109,7 @@ modules += new /obj/item/borg/sight/meson(src) emag = new /obj/item/borg/stun(src) modules += new /obj/item/weapon/rcd/borg(src) + modules += new /obj/item/weapon/pipe_dispenser(src) //What could possibly go wrong? modules += new /obj/item/weapon/extinguisher(src) modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src) modules += new /obj/item/weapon/screwdriver(src) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 8eca25e1066..71868e610c9 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -403,6 +403,14 @@ build_path = /obj/item/weapon/rcd category = list("hacked", "Construction") +/datum/design/rpd + name = "Rapid pipe dispenser (RPD)" + id = "rpd" + build_type = AUTOLATHE + materials = list("$metal" = 75000, "$glass" = 37500) + build_path = /obj/item/weapon/pipe_dispenser + category = list("hacked", "Construction") + /datum/design/electropack name = "Electropack" id = "electropack" diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 9107f227f89..ac7af348b0f 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 1ee1c28cfe7..3b1467a5f08 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -579,6 +579,7 @@ #include "code\game\objects\items\weapons\paiwire.dm" #include "code\game\objects\items\weapons\power_cells.dm" #include "code\game\objects\items\weapons\RCD.dm" +#include "code\game\objects\items\weapons\RPD.dm" #include "code\game\objects\items\weapons\RSF.dm" #include "code\game\objects\items\weapons\scrolls.dm" #include "code\game\objects\items\weapons\shields.dm"