From 9a34819c0ca689eff5213e2406c0af8905176e69 Mon Sep 17 00:00:00 2001 From: hobnob13 Date: Fri, 25 Apr 2008 23:37:41 +0000 Subject: [PATCH] Altered method of showing solar panels to work around a possible BYOND bug. Continued refactoring of obj/machinery code (doors). --- main-src/Code/!atoms.dm | 53 +- main-src/Code/Machinery/Door/_door.dm | 146 +++++ main-src/Code/Machinery/Door/airlock.dm | 209 ++++++++ main-src/Code/Machinery/Door/false_wall.dm | 57 ++ main-src/Code/Machinery/Door/firedoor.dm | 120 +++++ main-src/Code/Machinery/Door/poddoor.dm | 90 ++++ main-src/Code/Machinery/Door/window.dm | 136 +++++ main-src/Code/Machinery/Power/solar.dm | 12 +- .../Code/Machinery/Power/solar_control.dm | 4 +- main-src/Code/Machinery/meter.dm | 88 +++ main-src/Code/atmo_control.dm | 59 -- main-src/Code/computer.dm | 73 --- main-src/Code/demo.dm | 503 ------------------ main-src/Code/globals.dm | 21 +- main-src/Code/mob.dm | 4 + main-src/Icons/power.dmi | Bin 9594 -> 9806 bytes main-src/spacestation13.dme | 10 +- main-src/ss13h.dmp | 2 +- 18 files changed, 891 insertions(+), 696 deletions(-) create mode 100644 main-src/Code/Machinery/Door/_door.dm create mode 100644 main-src/Code/Machinery/Door/airlock.dm create mode 100644 main-src/Code/Machinery/Door/false_wall.dm create mode 100644 main-src/Code/Machinery/Door/firedoor.dm create mode 100644 main-src/Code/Machinery/Door/poddoor.dm create mode 100644 main-src/Code/Machinery/Door/window.dm create mode 100644 main-src/Code/Machinery/meter.dm diff --git a/main-src/Code/!atoms.dm b/main-src/Code/!atoms.dm index 52e7c8e..c0bfc5b 100644 --- a/main-src/Code/!atoms.dm +++ b/main-src/Code/!atoms.dm @@ -2387,51 +2387,8 @@ Total SMES charging rate should not exceed total power generation rate, or an ov var/locked = 0.0 var/mob/occupant = null anchored = 1.0 -/obj/machinery/door - name = "door" - icon = 'doors.dmi' - icon_state = "door1" - opacity = 1 - density = 1 - var/visible = 1.0 - var/access = "0000" - var/allowed = null - //var/r_access - //var/r_lab - //var/r_engine - //var/r_air - var/p_open = 0.0 - var/operating = null - anchored = 1.0 -/obj/machinery/door/airlock - name = "airlock" - icon = 'Door1.dmi' - var/blocked = null - var/powered = 1.0 - var/locked = 0.0 - var/wires = 511.0 -/obj/machinery/door/false_wall - name = "wall" - icon = 'Doorf.dmi' -/obj/machinery/door/firedoor - name = "firedoor" - icon = 'Door1.dmi' - icon_state = "door0" - var/blocked = null - opacity = 0 - density = 0 -/obj/machinery/door/poddoor - name = "poddoor" - icon = 'Door1.dmi' - icon_state = "pdoor1" - var/id = 1.0 -/obj/machinery/door/window - name = "interior door" - icon = 'windoor.dmi' - visible = 0.0 - flags = 512.0 - opacity = 0 + /obj/machinery/freezer name = "freezer" @@ -2469,13 +2426,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov var/code = 1.0 var/id = 1.0 anchored = 1.0 -/obj/machinery/meter - name = "meter" - icon = 'pipes.dmi' - icon_state = "meterX" - var/obj/machinery/pipes/target = null - anchored = 1.0 - var/average = 0 + /obj/machinery/nuclearbomb desc = "Uh oh." name = "Nuclear Fission Explosive" diff --git a/main-src/Code/Machinery/Door/_door.dm b/main-src/Code/Machinery/Door/_door.dm new file mode 100644 index 0000000..dbf2ef5 --- /dev/null +++ b/main-src/Code/Machinery/Door/_door.dm @@ -0,0 +1,146 @@ +/* + * Door -- the base door type. + * All other doors (airlocks, false walls, poddoors, firedoors and windowdoors) descend from this. + * + */ + +obj/machinery/door + name = "door" + icon = 'doors.dmi' + icon_state = "door1" + opacity = 1 + density = 1 + anchored = 1 + + var + visible = 1.0 // True for all except windowdoors; controls whether door becomes opaque when closed. + + access = "0000" // ID card access levels + allowed = null // ID card job assignment access + + p_open = 0.0 // True if the wiring panel is open; currently only used for airlocks + operating = null // True if door is currently opening/closing + + + // Create a new door. Ensure that turf links are updated. + + New() + ..() + var/turf/T = src.loc + if (istype(T, /turf)) + if (src.density) + T.updatecell = 0 + T.buildlinks() + + + // Called to open a door + // Plays opening animation, updates icon state, ensures turf links are updated + + proc/open() + if (src.operating) + return + src.operating = 1 + flick(text("[]doorc0", (src.p_open ? "o_" : null)), src) + src.icon_state = text("[]door0", (src.p_open ? "o_" : null)) + sleep(15) + src.density = 0 + src.opacity = 0 + var/turf/T = src.loc + if (istype(T, /turf)) + T.updatecell = 1 + T.buildlinks() + src.operating = 0 + + + // Called to close a door. + // Plays closing animation, updates icon state, ensures turf links are updated + + proc/close() + if (src.operating) + return + src.operating = 1 + flick(text("[]doorc1", (src.p_open ? "o_" : null)), src) + src.icon_state = text("[]door1", (src.p_open ? "o_" : null)) + src.density = 1 + if (src.visible) + src.opacity = 1 + var/turf/T = src.loc + if (istype(T, /turf)) + T.updatecell = 0 + T.buildlinks() + sleep(15) + src.operating = 0 + + // Monkey attack same as human + + attack_paw(mob/user) + return src.attack_hand(user) + + + // Attack with hand. If human and wearing an ID, same as attacking with the ID + + attack_hand(mob/user as mob) + if(istype(user, /mob/human)) + var/mob/human/H = user + if(H.wear_id) + attackby(H.wear_id, user) + + + // Attack with an item + // If an emag card, open the door if closed. Note: Door cannot be reclosed with an emag. + // If anything else, check to see if user is wearing an ID (or the ID was used) + // then check the ID access and open or close the door + + attackby(obj/item/I, mob/user) + + if (src.operating) + return + src.add_fingerprint(user) + if ((src.density && istype(I, /obj/item/weapon/card/emag))) + src.operating = 1 + flick("door_spark", src) + sleep(6) + src.operating = null + open() + return 1 + var/obj/item/weapon/card/id/card + if (istype(user, /mob/human)) + var/mob/human/H = user + card = H.wear_id + if (istype(I, /obj/item/weapon/card/id)) + card = I + else + if (!( istype(card, /obj/item/weapon/card/id) )) + return 0 + if (card.check_access(access, allowed)) + if (src.density) + open() + else + close() + else + if (src.density) + flick("door_deny", src) + + + // If hit by a meteor, open the door + + meteorhit(obj/M) + src.open() + return + + // Attack by blob, chance to destroy the door. + + blob_act() + if(prob(20)) + del(src) + +// Built-in proc called when the door moves location + // Since doors do not move, this seems to be redundent + + Move() + ..() + if (src.density) + var/turf/location = src.loc + if (istype(location, /turf)) + location.updatecell = 0 + buildlinks() diff --git a/main-src/Code/Machinery/Door/airlock.dm b/main-src/Code/Machinery/Door/airlock.dm new file mode 100644 index 0000000..18bf713 --- /dev/null +++ b/main-src/Code/Machinery/Door/airlock.dm @@ -0,0 +1,209 @@ +/* + * Airlock -- an airlock door. + * + * TODO: Make the interaction between the "test light" and the new power system more logical. + * TODO: Make it possible to crowbar an airlock open if the area power is out (but bolts still up) + */ + +obj/machinery/door/airlock + name = "airlock" + icon = 'Door1.dmi' + var + blocked = null // true if door is welded shut + powered = 1.0 // true if the test light is on + locked = 0.0 // true if the door bolts are down (locked) + wires = 511 // bitmask representing the 9 internal wires. Defaults to all connected + // The wire conditions effect the "powered" and "locked" variables. + + + // Called to open door. + // Door must be unwelded, not locked, test light on, and area power present to open + + open() + if ((src.blocked || src.locked || !( src.powered )) || stat & NOPOWER) + return + use_power(50) + ..() + + + // Called to close door + // If test light is off or no area power, do not close + + close() + if (!( src.powered || stat & NOPOWER)) + return + use_power(50) + ..() + var/turf/T = src.loc + if (T) + T.firelevel = 0 + + + // Set the icon state and other variables, depending on the wires bitfield. + + proc/update() + if (((!( src.wires & 2 ) || !( src.wires & 8 ) || !( src.wires & 32 ) || !( src.wires & 64 ) || !( src.wires & 128 ) || !( src.wires & 256 )) && src.powered)) + src.locked = 1 // Door is locked if grey, blue, yellow, white, dk red or orange wires are cut and test light is on + // Note bolts are not automatically raised - you must use a wrench to reset + if ((!( src.wires & 1 ) && !( src.wires & 4 ) && !( src.wires & 16 ))) + src.powered = 0 // Test light goes off if black, green and red wires are cut + else + src.powered = 1 // Otherwise test light is on + var/d = src.density + if (src.blocked) // true if welded shut + d = "l" + src.icon_state = text("[]door[]", (src.p_open ? "o_" : null), d) + return + + + // Monkey interact same a human + + attack_paw(mob/user) + return src.attack_hand(user) + + + // Human interact. If the door panel is open, show the wire interaction window. Otherwise, do standard door interaction. + + attack_hand(mob/user) + if (src.p_open) + user.machine = src + var/t1 = {"Access Panel
+Orange Wire: [(src.wires & 256 ? "Cut Wire" : "Mend Wire")]
+Dark Red Wire: [(src.wires & 128 ? "Cut Wire" : "Mend Wire")]
+White Wire: [(src.wires & 64 ? "Cut Wire" : "Mend Wire")]
+Yellow Wire: [(src.wires & 32 ? "Cut Wire" : "Mend Wire")]
+Red Wire: [(src.wires & 16 ? "Cut Wire" : "Mend Wire")]
+Blue Wire: [(src.wires & 8 ? "Cut Wire" : "Mend Wire")]
+Green Wire: [(src.wires & 4 ? "Cut Wire" : "Mend Wire")]
+Grey Wire: [(src.wires & 2 ? "Cut Wire" : "Mend Wire")]
+Black Wire: [(src.wires & 1 ? "Cut Wire" : "Mend Wire")]
+
+[(src.locked ? "The door bolts have fallen!" : "The door bolts look up.")]
+[(src.powered ? "The test light is on." : "The test light is off!")]"} + + + user << browse(t1, "window=airlock") + else + ..(user) + return + + + // Handle topic links from interaction window. Cut/join wires if clicking with wirecutters + + Topic(href, href_list) + ..() + if (usr.stat || usr.restrained() ) + return + if ((get_dist(src, usr) <= 1 && istype(src.loc, /turf))) + usr.machine = src + if (href_list["wires"]) + var/t1 = text2num(href_list["wires"]) + if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) )) + return + if (!( src.p_open )) + return + if (t1 & 1) + if (src.wires & 1) + src.wires &= ~1 + else + src.wires |= 1 + else if (t1 & 2) + if (src.wires & 2) + src.wires &= ~2 + else + src.wires |= 2 + else if (t1 & 4) + if (src.wires & 4) + src.wires &= ~4 + else + src.wires |= 4 + else if (t1 & 8) + if (src.wires & 8) + src.wires &= ~8 + else + src.wires |= 8 + else if (t1 & 16) + if (src.wires & 16) + src.wires &= ~16 + else + src.wires |= 16 + else if (t1 & 32) + if (src.wires & 32) + src.wires &= ~32 + else + src.wires |= 32 + else if (t1 & 64) + if (src.wires & 64) + src.wires &= ~64 + else + src.wires |= 64 + else if (t1 & 128) + if (src.wires & 128) + src.wires &= ~128 + else + src.wires |= 128 + else if (t1 & 256) + if (src.wires & 256) + src.wires &= ~256 + else + src.wires |= 256 + src.update() + add_fingerprint(usr) + for(var/mob/M in viewers(1, src)) + if ((M.client && M.machine == src)) + src.attack_hand(M) + return + + + // Attack with item. + // If weldingtool (and door is closed), weld/unweld the door + // If wrench, and door has test light on, unlock the door (raise bolts) + // If screwdriver, toggle door panel open/closed + // If crowbar, and door is closed, not welded, test light off and not locked, open the door + // Otherwise, do standard door attackby() + + attackby(obj/item/weapon/C, mob/user) + src.add_fingerprint(user) + if ((istype(C, /obj/item/weapon/weldingtool) && !( src.operating ) && src.density)) + var/obj/item/weapon/weldingtool/W = C + if(W.welding) + if (W.weldfuel > 2) + W.weldfuel -= 2 + else + user << "Need more welding fuel!" + return + if (!( src.blocked )) + src.blocked = 1 + else + src.blocked = null + src.update() + return + else if (istype(C, /obj/item/weapon/wrench)) + if (src.p_open) + if (src.powered) + src.locked = null + else + user << alert("You need power assist!", null, null, null, null, null) + src.update() + else if (istype(C, /obj/item/weapon/screwdriver)) + src.p_open = !( src.p_open ) + update() + else if (istype(C, /obj/item/weapon/crowbar)) + if ((src.density && !( src.blocked ) && !( src.operating ) && !( src.powered ) && !( src.locked ))) + spawn( 0 ) + src.operating = 1 + flick(text("[]doorc0", (src.p_open ? "o_" : null)), src) + src.icon_state = text("[]door0", (src.p_open ? "o_" : null)) + sleep(15) + src.density = 0 + src.opacity = 0 + var/turf/T = src.loc + if (istype(T, /turf)) + T.updatecell = 1 + T.buildlinks() + src.operating = 0 + return + else + ..() + return + diff --git a/main-src/Code/Machinery/Door/false_wall.dm b/main-src/Code/Machinery/Door/false_wall.dm new file mode 100644 index 0000000..a531d3a --- /dev/null +++ b/main-src/Code/Machinery/Door/false_wall.dm @@ -0,0 +1,57 @@ +/* + * False_wall -- A fake wall that can be opened like a door. + * + * + */ + +obj/machinery/door/false_wall + name = "wall" + icon = 'Doorf.dmi' + + + // Create a false-wall door. Remove the pull verb as this gives away the doors position. + + New() + ..() + src.verbs -= /atom/movable/verb/pull + + // Examine verb. Same result as a standard wall. + + examine() + set src in oview(1) + + usr << "It looks like a regular wall" + + // Monkey interact - if in monkey mode, same as human + + attack_paw(mob/user) + if ((ticker && ticker.mode == "monkey")) + return src.attack_hand(user) + + + // Human interact - 25% chance to open the door + + attack_hand(mob/user) + + src.add_fingerprint(user) + if (src.density) + if (prob(25)) + open() + else + user << "\blue You push the wall but nothing happens!" + else + close() + + // Attack by item + // If a screwdriver, disassembly the false wall into components + + attackby(obj/item/weapon/screwdriver/S, mob/user) + + src.add_fingerprint(user) + if (istype(S, /obj/item/weapon/screwdriver)) + new /obj/item/weapon/sheet/metal( src.loc ) + new /obj/d_girders( src.loc ) + del(src) + return + else + ..() diff --git a/main-src/Code/Machinery/Door/firedoor.dm b/main-src/Code/Machinery/Door/firedoor.dm new file mode 100644 index 0000000..41cae72 --- /dev/null +++ b/main-src/Code/Machinery/Door/firedoor.dm @@ -0,0 +1,120 @@ +/* + * Firedoor - a door automatically closed by the firealarm system + * + */ + +obj/machinery/door/firedoor + name = "firedoor" + icon = 'Door1.dmi' + icon_state = "door0" + opacity = 0 // Firedoors start open + density = 0 // + var + blocked = null // true if the door has been welded shut (can't be opened) + + + // Standard open and close procs do not work with firedoors + + open() + usr << "This is a remote firedoor!" + + + close() + usr << "This is a remote firedoor!" + + + + // Called when area power status changes. Firedoors use the ENVIRON channel. + + power_change() + if( powered(ENVIRON) ) + stat &= ~NOPOWER + else + stat |= NOPOWER + + + // Attack by an item + // If a welding tool, weld the door shut (or unweld) + // If a crowbar. open the door. + + attackby(obj/item/weapon/C, mob/user) + + src.add_fingerprint(user) + if ((istype(C, /obj/item/weapon/weldingtool) && !( src.operating ) && src.density)) + var/obj/item/weapon/weldingtool/W = C + if(W.welding) + if (W.weldfuel > 2) + W.weldfuel -= 2 + if (!( src.blocked )) + src.blocked = 1 + src.icon_state = "doorl" + else + src.blocked = 0 + src.icon_state = "door1" + return + else + if (!( istype(C, /obj/item/weapon/crowbar) )) + return + if ((src.density && !( src.blocked ) && !( src.operating ))) + spawn( 0 ) + src.operating = 1 + flick("doorc0", src) + src.icon_state = "door0" + sleep(15) + src.density = 0 + src.opacity = 0 + var/turf/T = src.loc + if (istype(T, /turf)) + T.updatecell = 1 + T.buildlinks() + src.operating = 0 + + + // Called to open a firedoor + // Play opening animation, update icon state, and update turf links + + proc/openfire() + set src in oview(1) + + if (stat & NOPOWER) return + + if ((src.operating || src.blocked)) + return + use_power(50, ENVIRON) + src.operating = 1 + flick("doorc0", src) + src.icon_state = "door0" + sleep(15) + src.density = 0 + src.opacity = 0 + var/turf/T = src.loc + if (istype(T, /turf)) + T.updatecell = 1 + T.buildlinks() + src.operating = 0 + + + // Called to close a firedoor. + // Play closing animation, update icon state, and update turf links. + + proc/closefire() + set src in oview(1) + + if (stat & NOPOWER) return + + if (src.operating) + return + use_power(50, ENVIRON) + src.operating = 1 + flick("doorc1", src) + src.icon_state = "door1" + src.density = 1 + src.opacity = 1 + var/turf/T = src.loc + if (istype(T, /turf)) + T.updatecell = 0 + T.buildlinks() + T.firelevel = 0 + sleep(15) + src.operating = 0 + diff --git a/main-src/Code/Machinery/Door/poddoor.dm b/main-src/Code/Machinery/Door/poddoor.dm new file mode 100644 index 0000000..1c62e23 --- /dev/null +++ b/main-src/Code/Machinery/Door/poddoor.dm @@ -0,0 +1,90 @@ +/* + * Poddoor -- A remotely controlled door. Operable from pod computers and remote door controls. + * + */ + + +obj/machinery/door/poddoor + name = "poddoor" + icon = 'Door1.dmi' + icon_state = "pdoor1" + var + id = 1.0 // ID that must match that of the controlling device + + + // Standard open() and close() procs do not work + + open() + usr << "This is a remote controlled door!" + + close() + usr << "This is a remote controlled door!" + + + + // Attack by item. + // If crowbar (and door unpowered), open the door + + attackby(obj/item/weapon/C as obj, mob/user as mob) + src.add_fingerprint(user) + if (!( istype(C, /obj/item/weapon/crowbar) )) + return + if ((src.density && (stat & NOPOWER) && !( src.operating ))) + spawn( 0 ) + src.operating = 1 + flick("pdoorc0", src) + src.icon_state = "pdoor0" + sleep(15) + src.density = 0 + src.opacity = 0 + var/turf/T = src.loc + if (istype(T, /turf)) + T.updatecell = 1 + T.buildlinks() + src.operating = 0 + return + + // Called to open a poddoor + + proc/openpod() + set src in oview(1) + + if(stat & NOPOWER) return + + if (src.operating || !src.density) + return + src.operating = 1 + use_power(50) + flick("pdoorc0", src) + src.icon_state = "pdoor0" + sleep(15) + src.density = 0 + src.opacity = 0 + var/turf/T = src.loc + if (istype(T, /turf)) + T.updatecell = 1 + T.buildlinks() + src.operating = 0 + + + // Called to close a poddoor + + proc/closepod() + set src in oview(1) + + if(stat & NOPOWER) return + + if (src.operating || src.density) + return + use_power(50) + src.operating = 1 + flick("pdoorc1", src) + src.icon_state = "pdoor1" + src.density = 1 + src.opacity = 1 + var/turf/T = src.loc + if (istype(T, /turf)) + T.updatecell = 0 + T.buildlinks() + sleep(15) + src.operating = 0 diff --git a/main-src/Code/Machinery/Door/window.dm b/main-src/Code/Machinery/Door/window.dm new file mode 100644 index 0000000..03fd050 --- /dev/null +++ b/main-src/Code/Machinery/Door/window.dm @@ -0,0 +1,136 @@ +/* + * Window door -- A non-opaque door covering either the south or east edges of a turf + * + * If the door has an access requirement, the security door icon is substituted + */ + + +obj/machinery/door/window + name = "interior door" + icon = 'windoor.dmi' + visible = 0.0 // Door is not opaque when closed + flags = WINDOW + opacity = 0 + + // Note dir var sets the 4 possible states - "door handle" points in the dir direction, slides in opposite dirn to open + // dir=1 : Door on east edge, slides to south + // dir=2: Door on east edge, slides to north + // dir=4: Door on south edge, slides to west + // dir=8: Door on south edge, slides to east + + + // Create a new windowdoor. If access controls are set, use the alternate icon for security doors + + New() + ..() + var/turf/T = src.loc + if (T) + T.updatecell = 1 + T.buildlinks() + if ( (access && access!="0000") || allowed) + src.icon = 'security.dmi' + + + // Override close() proc since windowdoors still update their turf when closed, unlike other doors. + + close() + ..() // call standard door/close() proc + var/turf/T = src.loc + if (T) + T.updatecell = 1 // turf still runs gas simulation + T.buildlinks() + return + + + // If a mob bumps into the door, cycle the door (open then close) + + Bumped(atom/movable/AM) + if (!( ismob(AM) )) + return + src.cycle(AM,1) + return + + + // Attack by monkey same as human + + attack_paw(mob/user) + return src.attack_hand(user) + + + // Human attack hand - cycle the door + + attack_hand(mob/user) + src.cycle(user,0) + + + // Called to cycle a windowdoor + // If an unsecured door, open for 5 seconds, then close again + // Otherwise, check ID access levels and toggle open/closed state + // arg bumped is true if called from the Bump proc (will not check ID in this case) + + proc/cycle(mob/user, bumped=0) + if (!( ticker )) // doors won't open until round has started + return + if (src.operating) + return + if (access && access=="0000" && !allowed) // unsecure door + if (src.density) + open() // open then close 5 seconds later + sleep(50) + close() + return + + if(bumped) // if called from Bump(), return now - you can't bump open a secure door + return + + var/obj/item/weapon/card/id/card // check if user is human and wearing ID + if (istype(user, /mob/human)) + var/mob/human/H = user + card = H.wear_id + if (!( istype(card, /obj/item/weapon/card/id) )) + return + else + return + if (card.check_access(access, allowed)) // check access levels of worn ID + if (src.density) // and toggle door open/closed depending on current state + open() + else + close() + else + if (src.density) + flick("door_deny", src) + + + // Note attackby item (ID) handled by standard door proc + + + // Called in turf/Enter() to see if windowdoor is passable, when turf being entered contains a windowdoor + // O is the moving object + // target is the turf it wants to move into + + CheckPass(atom/movable/O, target) + if (src.density) // only check if door is closed + var/direct = get_dir(O, target) + if ((direct == NORTH && src.dir & 12)) // moving north, and door is on south edge of target + return 0 // can't pass + else + if ((direct == WEST && src.dir & 3)) // moving west, and door is on east edge of target + return 0 + return 1 + + + // Called in turf/Enter() to see if windowdoor is passable, when turf entering from contains a windowdoor + // O is the moving object + // target is the turf it wants to move into + + CheckExit(atom/movable/O, target) + + if (src.density) // only check if door is closed + var/direct = get_dir(O, target) + if ((direct == SOUTH && src.dir & 12)) // moving south, and door is on south edge + return 0 + else + if ((direct == EAST && src.dir & 3)) // moving east, and door is on east edge + return 0 + return 1 + diff --git a/main-src/Code/Machinery/Power/solar.dm b/main-src/Code/Machinery/Power/solar.dm index 75d4622..fd63858 100644 --- a/main-src/Code/Machinery/Power/solar.dm +++ b/main-src/Code/Machinery/Power/solar.dm @@ -14,12 +14,13 @@ obj/machinery/power/solar anchored = 1 density = 1 directwired = 1 + dir = SOUTH // the current direction of the solar panel var id = 1 // solar_control must have matching id (and be on same powernet) to control this machine obscured = 0 // true if the panel is in shadow (thus does not generate power) sunfrac = 0 // fraction (0.0-1.0) of the maximum exposure of the solar panel to the sun // calculated from the relative angle of the sun and the panel - adir = SOUTH // the current direction of the solar panel + ndir = SOUTH // the new set direction of the panel turn_angle = 0 // the angle to turn through to get to the set angle; -45 or +45 obj/machinery/power/solar_control/control // the controller for this panel @@ -42,13 +43,14 @@ obj/machinery/power/solar // Updates the icon for the solar panel // The object icon is just the base, with the panel itself being an 8-direction overlay + // As the object direction is changed, the overlay direction will echo it proc/updateicon() src.overlays = null if(stat & BROKEN) overlays += image('power.dmi', "solar_panel-b", FLY_LAYER) else - overlays += image('power.dmi', "solar_panel", FLY_LAYER, adir) + overlays += image('power.dmi', "solar_panel", FLY_LAYER) // Calculate the fraction of power produced by the panel @@ -61,7 +63,7 @@ obj/machinery/power/solar sunfrac = 0 return - var/p_angle = dir2angle(adir) - sun.angle + var/p_angle = dir2angle(dir) - sun.angle if(abs(p_angle) > 90) // if facing more than 90deg from sun, zero output sunfrac = 0 @@ -85,11 +87,11 @@ obj/machinery/power/solar control.gen += sgen // notify the controller of how much was generated - if(adir == ndir) // if current angle == set angle, stop turning + if(dir == ndir) // if current angle == set angle, stop turning turn_angle = 0 else // otherwise turn spawn(rand(0,10)) // slight random delay is to stop all panels turning in lockstep - adir = turn(adir, turn_angle) + dir = turn(dir, turn_angle) updateicon() updatefrac() // update the panel icon and the fractional power production for the new angle diff --git a/main-src/Code/Machinery/Power/solar_control.dm b/main-src/Code/Machinery/Power/solar_control.dm index e41c487..e008ae7 100644 --- a/main-src/Code/Machinery/Power/solar_control.dm +++ b/main-src/Code/Machinery/Power/solar_control.dm @@ -34,7 +34,7 @@ obj/machinery/power/solar_control if(powernet) for(var/obj/machinery/power/solar/S in powernet.nodes) if(S.id == id) - cdir = S.adir // find the contorlled solar panels and set the current direction to match + cdir = S.dir // find the contorlled solar panels and set the current direction to match updateicon() // also update the icon overlay @@ -222,7 +222,7 @@ obj/machinery/power/solar_control if(S.id == id) S.control = src - var/delta = dir2angle(S.adir) - dir2angle(cdir) + var/delta = dir2angle(S.dir) - dir2angle(cdir) delta = (delta+360)%360 diff --git a/main-src/Code/Machinery/meter.dm b/main-src/Code/Machinery/meter.dm new file mode 100644 index 0000000..34d961d --- /dev/null +++ b/main-src/Code/Machinery/meter.dm @@ -0,0 +1,88 @@ +/* + * Meter -- a machine that shows the flow rate of gas in a pipe on the same turf + * + * The meter actually reads a moving average of the flow var of the pipeline object associated with the pipe. + * Note that the value can be negative if the flow is going through the pipe "backwards" + * + * TODO: Add an icon overlay showing the actual movement direction of the gas. + */ + +obj/machinery/meter + name = "meter" + icon = 'pipes.dmi' + icon_state = "meterX" + anchored = 1 + var + obj/machinery/pipes/target = null // the pipe object to monitor + average = 0 // the exponential moving average of the flow rate + + + + // Create a new meter. Find the target pipe in the same location as the meter + + New() + ..() + src.target = locate(/obj/machinery/pipes, src.loc) + average = 0 + return + + + // Timed process. + // Read flow rate from the pipeline object of the target pipe + // Calculate exponentially weighted moving average of flow rate + // Update icon state of flow rate bargraph + + process() + + if(!target) + icon_state = "meterX" + return + if(stat & NOPOWER) + icon_state = "meter0" + return + + use_power(5) + + average = 0.5 * average + 0.5 * target.pl.flow + + var/val = min(18, round( 18.99 * ((abs(average) / 2500000)**0.25)) ) + icon_state = "meter[val]" + + + // If the meter is clicked on, report the flow rate and temperature of the gas + + Click() + + if (get_dist(usr, src) <= 3) + if (src.target) + usr << text("\blue Results:\nMass flow []%\nTemperature [] K", round(100*abs(average)/6e6, 0.1), round(target.pl.gas.temperature,0.1)) + else + usr << "\blue Results: Connection Error!" + else + usr << "\blue You are too far away." + return + +// Disabled routines + +/* +/obj/machinery/meter/proc/pressure() + + if(src.target && src.target.gas) + return (average * target.gas.temperature)/100000.0 + else + return 0 +*/ + +/* +/obj/machinery/meter/examine() + set src in oview(1) + + var/t = "A gas flow meter. " + if (src.target) + t += text("Results:\nMass flow []%\nPressure [] kPa", round(100*average/src.target.gas.maximum, 0.1), round(pressure(), 0.1) ) + else + t += "It is not functioning." + + usr << t + +*/ diff --git a/main-src/Code/atmo_control.dm b/main-src/Code/atmo_control.dm index ee6d816..785b2f7 100644 --- a/main-src/Code/atmo_control.dm +++ b/main-src/Code/atmo_control.dm @@ -1,63 +1,4 @@ - -/obj/machinery/meter/New() - - ..() - src.target = locate(/obj/machinery/pipes, src.loc) - average = 0 - return - -/obj/machinery/meter/process() - - if(!target) - icon_state = "meterX" - return - if(stat & NOPOWER) - icon_state = "meter0" - return - - use_power(5) - - average = 0.5 * average + 0.5 * target.pl.flow - - var/val = min(18, round( 18.99 * ((abs(average) / 2500000)**0.25)) ) - icon_state = "meter[val]" - -/* -/obj/machinery/meter/examine() - set src in oview(1) - - var/t = "A gas flow meter. " - if (src.target) - t += text("Results:\nMass flow []%\nPressure [] kPa", round(100*average/src.target.gas.maximum, 0.1), round(pressure(), 0.1) ) - else - t += "It is not functioning." - - usr << t - -*/ - -/obj/machinery/meter/Click() - - if (get_dist(usr, src) <= 3) - if (src.target) - usr << text("\blue Results:\nMass flow []%\nTemperature [] K", round(100*abs(average)/6e6, 0.1), round(target.pl.gas.temperature,0.1)) - else - usr << "\blue Results: Connection Error!" - else - usr << "\blue You are too far away." - return - -/* -/obj/machinery/meter/proc/pressure() - - if(src.target && src.target.gas) - return (average * target.gas.temperature)/100000.0 - else - return 0 -*/ - - /obj/machinery/mass_driver/proc/drive(amount) if(stat & NOPOWER) diff --git a/main-src/Code/computer.dm b/main-src/Code/computer.dm index 987540c..a7e582c 100644 --- a/main-src/Code/computer.dm +++ b/main-src/Code/computer.dm @@ -580,79 +580,6 @@ //Foreach goto(394) return -/obj/machinery/door/poddoor/open() - - usr << "This is a remote controlled door!" - return - -/obj/machinery/door/poddoor/close() - - usr << "This is a remote controlled door!" - return - -/obj/machinery/door/poddoor/attackby(obj/item/weapon/C as obj, mob/user as mob) - - src.add_fingerprint(user) - if (!( istype(C, /obj/item/weapon/crowbar) )) - return - if ((src.density && (stat & NOPOWER) && !( src.operating ))) - spawn( 0 ) - src.operating = 1 - flick("pdoorc0", src) - src.icon_state = "pdoor0" - sleep(15) - src.density = 0 - src.opacity = 0 - var/turf/T = src.loc - if (istype(T, /turf)) - T.updatecell = 1 - T.buildlinks() - src.operating = 0 - return - return - -/obj/machinery/door/poddoor/proc/openpod() - set src in oview(1) - - if(stat & NOPOWER) return - - if (src.operating || !src.density) - return - src.operating = 1 - use_power(50) - flick("pdoorc0", src) - src.icon_state = "pdoor0" - sleep(15) - src.density = 0 - src.opacity = 0 - var/turf/T = src.loc - if (istype(T, /turf)) - T.updatecell = 1 - T.buildlinks() - src.operating = 0 - return - -/obj/machinery/door/poddoor/proc/closepod() - set src in oview(1) - - if(stat & NOPOWER) return - - if (src.operating || src.density) - return - use_power(50) - src.operating = 1 - flick("pdoorc1", src) - src.icon_state = "pdoor1" - src.density = 1 - src.opacity = 1 - var/turf/T = src.loc - if (istype(T, /turf)) - T.updatecell = 0 - T.buildlinks() - sleep(15) - src.operating = 0 - return - /obj/machinery/pod/meteorhit(var/obj/O as obj) if (O.icon_state == "flaming") diff --git a/main-src/Code/demo.dm b/main-src/Code/demo.dm index a028cae..e5e68fc 100644 --- a/main-src/Code/demo.dm +++ b/main-src/Code/demo.dm @@ -1,507 +1,4 @@ -/obj/machinery/door/meteorhit(obj/M as obj) - - src.open() - return - -/obj/machinery/door/Move() - - ..() - if (src.density) - var/turf/location = src.loc - if (istype(location, /turf)) - location.updatecell = 0 - buildlinks() - return - - -//*****RM -/obj/machinery/door/attack_paw(mob/user as mob) - - return src.attack_hand(user) - -/obj/machinery/door/attack_hand(mob/user as mob) - if(istype(user, /mob/human)) - var/mob/human/H = user - if(H.wear_id) - attackby(H.wear_id, user) - return -//***** - -/obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob) - - if (src.operating) - return - src.add_fingerprint(user) - if ((src.density && istype(I, /obj/item/weapon/card/emag))) - src.operating = 1 - flick("door_spark", src) - sleep(6) - src.operating = null - open() - return 1 - var/obj/item/weapon/card/id/card - if (istype(user, /mob/human)) - var/mob/human/H = user - card = H.wear_id - if (istype(I, /obj/item/weapon/card/id)) - card = I - else - if (!( istype(card, /obj/item/weapon/card/id) )) - return 0 - if (card.check_access(access, allowed)) - if (src.density) - open() - else - close() - else - if (src.density) - flick("door_deny", src) - return - -/obj/machinery/door/window/close() - - ..() - var/turf/T = src.loc - if (T) - T.updatecell = 1 - T.buildlinks() - return - -/obj/machinery/door/window/New() - - ..() - var/turf/T = src.loc - if (T) - T.updatecell = 1 - T.buildlinks() - if ( (access && access!="0000") || allowed) - src.icon = 'security.dmi' - return - - -/obj/machinery/door/window/Bumped(atom/movable/AM as mob|obj) - - if (!( ismob(AM) )) - return - src.cycle(AM,1) - return - -//*****RM -/obj/machinery/door/window/attack_paw(mob/user as mob) - - return src.attack_hand(user) - -/obj/machinery/door/window/attack_hand(mob/user as mob) - src.cycle(user,0) - return - -/obj/machinery/door/window/proc/cycle(mob/user, bumped=0) - if (!( ticker )) - return - if (src.operating) - return - if (access && access=="0000" && !allowed) - if (src.density) - open() - sleep(50) - close() - return - - if(bumped) - return - - var/obj/item/weapon/card/id/card - if (istype(user, /mob/human)) - var/mob/human/H = user - card = H.wear_id - if (!( istype(card, /obj/item/weapon/card/id) )) - return - else - return - if (card.check_access(access, allowed)) - if (src.density) - open() - else - close() - else - if (src.density) - flick("door_deny", src) - return -//***** - -/obj/machinery/door/window/CheckPass(atom/movable/O as mob|obj, target as turf) - - if (src.density) - var/direct = get_dir(O, target) - if ((direct == NORTH && src.dir & 12)) - return 0 - else - if ((direct == WEST && src.dir & 3)) - return 0 - return 1 - return - -/obj/machinery/door/window/CheckExit(atom/movable/O as mob|obj, target as turf) - - if (src.density) - var/direct = get_dir(O, target) - if ((direct == SOUTH && src.dir & 12)) - return 0 - else - if ((direct == EAST && src.dir & 3)) - return 0 - return 1 - return - -/obj/machinery/door/false_wall/New() - ..() - src.verbs -= /atom/movable/verb/pull - return - -/obj/machinery/door/false_wall/examine() - set src in oview(1) - - usr << "It looks like a regular wall" - return - -/obj/machinery/door/false_wall/attack_paw(mob/user as mob) - - if ((ticker && ticker.mode == "monkey")) - return src.attack_hand(user) - return - -/obj/machinery/door/false_wall/attack_hand(mob/user as mob) - - src.add_fingerprint(user) - if (src.density) - if (prob(25)) - open() - else - user << "\blue You push the wall but nothing happens!" - else - close() - return - -/obj/machinery/door/false_wall/attackby(obj/item/weapon/screwdriver/S as obj, mob/user as mob) - - src.add_fingerprint(user) - if (istype(S, /obj/item/weapon/screwdriver)) - new /obj/item/weapon/sheet/metal( src.loc ) - new /obj/d_girders( src.loc ) - //SN src = null - del(src) - return - else - ..() - return - -/obj/machinery/door/airlock/proc/update() - - if (((!( src.wires & 2 ) || !( src.wires & 8 ) || !( src.wires & 32 ) || !( src.wires & 64 ) || !( src.wires & 128 ) || !( src.wires & 256 )) && src.powered)) - src.locked = 1 - if ((!( src.wires & 1 ) && !( src.wires & 4 ) && !( src.wires & 16 ))) - src.powered = 0 - else - src.powered = 1 - var/d = src.density - if (src.blocked) - d = "l" - src.icon_state = text("[]door[]", (src.p_open ? "o_" : null), d) - return - -/obj/machinery/door/airlock/attack_paw(mob/user as mob) - - return src.attack_hand(user) - return - -/obj/machinery/door/airlock/attack_hand(mob/user as mob) - - if (src.p_open) - user.machine = src - var/t1 = text("Access Panel
\nOrange Wire: []
\nDark Red Wire: []
\nWhite Wire: []
\nYellow Wire: []
\nRed Wire: []
\nBlue Wire: []
\nGreen Wire: []
\nGrey Wire: []
\nBlack Wire: []
\n
\n[]
\n[]", (src.wires & 256 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 128 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 64 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 32 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 16 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 8 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 4 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 2 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.wires & 1 ? text("Cut Wire", src) : text("Mend Wire", src)), (src.locked ? "The door bolts have fallen!" : "The door bolts look up."), (src.powered ? "The test light is on." : "The test light is off!")) - user << browse(t1, "window=airlock") - else - ..(user) - return - -/obj/machinery/door/airlock/Topic(href, href_list) - ..() - if (usr.stat || usr.restrained() ) - return - if ((get_dist(src, usr) <= 1 && istype(src.loc, /turf))) - usr.machine = src - if (href_list["wires"]) - var/t1 = text2num(href_list["wires"]) - if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) )) - return - if (!( src.p_open )) - return - if (t1 & 1) - if (src.wires & 1) - src.wires &= ~1 - else - src.wires |= 1 - else if (t1 & 2) - if (src.wires & 2) - src.wires &= ~2 - else - src.wires |= 2 - else if (t1 & 4) - if (src.wires & 4) - src.wires &= ~4 - else - src.wires |= 4 - else if (t1 & 8) - if (src.wires & 8) - src.wires &= ~8 - else - src.wires |= 8 - else if (t1 & 16) - if (src.wires & 16) - src.wires &= ~16 - else - src.wires |= 16 - else if (t1 & 32) - if (src.wires & 32) - src.wires &= ~32 - else - src.wires |= 32 - else if (t1 & 64) - if (src.wires & 64) - src.wires &= ~64 - else - src.wires |= 64 - else if (t1 & 128) - if (src.wires & 128) - src.wires &= ~128 - else - src.wires |= 128 - else if (t1 & 256) - if (src.wires & 256) - src.wires &= ~256 - else - src.wires |= 256 - src.update() - add_fingerprint(usr) - for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - src.attack_hand(M) - //Foreach goto(477) - return - -/obj/machinery/door/airlock/attackby(C as obj, mob/user as mob) - - src.add_fingerprint(user) - if ((istype(C, /obj/item/weapon/weldingtool) && !( src.operating ) && src.density)) - var/obj/item/weapon/weldingtool/W = C - if(W.welding) - if (W.weldfuel > 2) - W.weldfuel -= 2 - else - user << "Need more welding fuel!" - return - if (!( src.blocked )) - src.blocked = 1 - else - src.blocked = null - src.update() - return - else - if (istype(C, /obj/item/weapon/wrench)) - if (src.p_open) - if (src.powered) - src.locked = null - else - user << alert("You need power assist!", null, null, null, null, null) - src.update() - else - if (istype(C, /obj/item/weapon/screwdriver)) - src.p_open = !( src.p_open ) - update() - else - if (istype(C, /obj/item/weapon/crowbar)) - if ((src.density && !( src.blocked ) && !( src.operating ) && !( src.powered ) && !( src.locked ))) - spawn( 0 ) - src.operating = 1 - flick(text("[]doorc0", (src.p_open ? "o_" : null)), src) - src.icon_state = text("[]door0", (src.p_open ? "o_" : null)) - sleep(15) - src.density = 0 - src.opacity = 0 - var/turf/T = src.loc - if (istype(T, /turf)) - T.updatecell = 1 - T.buildlinks() - src.operating = 0 - return - else - ..() - return - -/obj/machinery/door/airlock/open() - - if ((src.blocked || src.locked || !( src.powered )) || stat & NOPOWER) - return - use_power(50) - ..() - return - -/obj/machinery/door/airlock/close() - - if (!( src.powered || stat & NOPOWER)) - return - use_power(50) - ..() - var/turf/T = src.loc - if (T) - T.firelevel = 0 - return - -/obj/machinery/door/firedoor/open() - - usr << "This is a remote firedoor!" - return - -/obj/machinery/door/firedoor/close() - - usr << "This is a remote firedoor!" - return - -/obj/machinery/door/blob_act() - if(prob(20)) - del(src) - -/obj/machinery/door/firedoor/power_change() - if( powered(ENVIRON) ) - stat &= ~NOPOWER - else - stat |= NOPOWER - -/obj/machinery/door/firedoor/attackby(obj/item/weapon/C as obj, mob/user as mob) - - src.add_fingerprint(user) - if ((istype(C, /obj/item/weapon/weldingtool) && !( src.operating ) && src.density)) - var/obj/item/weapon/weldingtool/W = C - if(W.welding) - if (W.weldfuel > 2) - W.weldfuel -= 2 - if (!( src.blocked )) - src.blocked = 1 - src.icon_state = "doorl" - else - src.blocked = 0 - src.icon_state = "door1" - return - else - if (!( istype(C, /obj/item/weapon/crowbar) )) - return - if ((src.density && !( src.blocked ) && !( src.operating ))) - spawn( 0 ) - src.operating = 1 - flick("doorc0", src) - src.icon_state = "door0" - sleep(15) - src.density = 0 - src.opacity = 0 - var/turf/T = src.loc - if (istype(T, /turf)) - T.updatecell = 1 - T.buildlinks() - src.operating = 0 - return - return - -/obj/machinery/door/firedoor/proc/openfire() - set src in oview(1) - - if (stat & NOPOWER) return - - if ((src.operating || src.blocked)) - return - use_power(50, ENVIRON) - src.operating = 1 - flick("doorc0", src) - src.icon_state = "door0" - sleep(15) - src.density = 0 - src.opacity = 0 - var/turf/T = src.loc - if (istype(T, /turf)) - T.updatecell = 1 - T.buildlinks() - src.operating = 0 - return - -/obj/machinery/door/firedoor/proc/closefire() - set src in oview(1) - - if (stat & NOPOWER) return - - if (src.operating) - return - use_power(50, ENVIRON) - src.operating = 1 - flick("doorc1", src) - src.icon_state = "door1" - src.density = 1 - src.opacity = 1 - var/turf/T = src.loc - if (istype(T, /turf)) - T.updatecell = 0 - T.buildlinks() - T.firelevel = 0 - sleep(15) - src.operating = 0 - return - -/obj/machinery/door/New() - - ..() - var/turf/T = src.loc - if (istype(T, /turf)) - if (src.density) - T.updatecell = 0 - T.buildlinks() - return - -/obj/machinery/door/proc/open() - - if (src.operating) - return - src.operating = 1 - flick(text("[]doorc0", (src.p_open ? "o_" : null)), src) - src.icon_state = text("[]door0", (src.p_open ? "o_" : null)) - sleep(15) - src.density = 0 - src.opacity = 0 - var/turf/T = src.loc - if (istype(T, /turf)) - T.updatecell = 1 - T.buildlinks() - src.operating = 0 - return - -/obj/machinery/door/proc/close() - - if (src.operating) - return - src.operating = 1 - flick(text("[]doorc1", (src.p_open ? "o_" : null)), src) - src.icon_state = text("[]door1", (src.p_open ? "o_" : null)) - src.density = 1 - if (src.visible) - src.opacity = 1 - var/turf/T = src.loc - if (istype(T, /turf)) - T.updatecell = 0 - T.buildlinks() - sleep(15) - src.operating = 0 - return - - - diff --git a/main-src/Code/globals.dm b/main-src/Code/globals.dm index 1b6839e..55a9c3c 100644 --- a/main-src/Code/globals.dm +++ b/main-src/Code/globals.dm @@ -1,4 +1,23 @@ -/* Most recent changes (Since H9.5) +/* Most recent changes (Since H9.6) + + Contining reorg of obj/machinery code + Changed how solar panel directions are displayed, to fix the rotation display bug. + + + + + + + + + + + + + + + + (Since H9.5) Started pipelaying system, /obj/item/weapon/pipe. diff --git a/main-src/Code/mob.dm b/main-src/Code/mob.dm index cfc6bd2..d99ca31 100644 --- a/main-src/Code/mob.dm +++ b/main-src/Code/mob.dm @@ -3596,6 +3596,10 @@ //stat(null, "([x], [y], [z])") +#ifdef SDEBUG + stat("CPU",world.cpu) +#endif + stat(null, text("Intent: []", src.a_intent)) stat(null, text("Move Mode: []", src.m_intent)) diff --git a/main-src/Icons/power.dmi b/main-src/Icons/power.dmi index a49e0a7b4ece4904d981f9836a0e9562b38864a3..563fbd19002cfdd13fe34f77c2849111a28182b6 100644 GIT binary patch literal 9806 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 HIEDQmB&{l; diff --git a/main-src/spacestation13.dme b/main-src/spacestation13.dme index d5e7437..c64e112 100644 --- a/main-src/spacestation13.dme +++ b/main-src/spacestation13.dme @@ -5,7 +5,7 @@ // BEGIN_INTERNALS /* FILE: Code\!atoms.dm -DIR: Code Code\Machinery Code\Machinery\Atmoalter Code\Machinery\Power +DIR: Code Code\Machinery Code\Machinery\Atmoalter Code\Machinery\Door Code\Machinery\Power MAP_ICON_TYPE: 0 AUTO_FILE_DIR: ON */ @@ -15,6 +15,7 @@ AUTO_FILE_DIR: ON #define FILE_DIR "Code" #define FILE_DIR "Code/Machinery" #define FILE_DIR "Code/Machinery/Atmoalter" +#define FILE_DIR "Code/Machinery/Door" #define FILE_DIR "Code/Machinery/Power" #define FILE_DIR "Icons" #define FILE_DIR "Interface" @@ -82,6 +83,7 @@ AUTO_FILE_DIR: ON #include "Code\Machinery\junction.dm" #include "Code\Machinery\light_switch.dm" #include "Code\Machinery\manifold.dm" +#include "Code\Machinery\meter.dm" #include "Code\Machinery\pipeline.dm" #include "Code\Machinery\pipes.dm" #include "Code\Machinery\recharger.dm" @@ -92,6 +94,12 @@ AUTO_FILE_DIR: ON #include "Code\Machinery\Atmoalter\canister.dm" #include "Code\Machinery\Atmoalter\heater.dm" #include "Code\Machinery\Atmoalter\siphs.dm" +#include "Code\Machinery\Door\_door.dm" +#include "Code\Machinery\Door\airlock.dm" +#include "Code\Machinery\Door\false_wall.dm" +#include "Code\Machinery\Door\firedoor.dm" +#include "Code\Machinery\Door\poddoor.dm" +#include "Code\Machinery\Door\window.dm" #include "Code\Machinery\Power\_power.dm" #include "Code\Machinery\Power\apc.dm" #include "Code\Machinery\Power\generator.dm" diff --git a/main-src/ss13h.dmp b/main-src/ss13h.dmp index a9db3d1..7955d70 100644 --- a/main-src/ss13h.dmp +++ b/main-src/ss13h.dmp @@ -1,7 +1,7 @@ "aa" = (/turf/space,/area) "ab" = (/obj/grille,/turf/station/floor,/area) "ac" = (/obj/item/weapon/tank/oxygentank,/turf/space,/area) -"ad" = (/obj/machinery/power/solar{id = 2; adir = 1},/turf/station/floor,/area) +"ad" = (/obj/machinery/power/solar{id = 2},/turf/station/floor,/area) "ae" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/station/floor{icon_state = "Floor1"; intact = 0},/area) "af" = (/obj/cable{icon_state = "1-4"; d1 = 1; d2 = 4},/turf/station/floor{icon_state = "Floor1"; intact = 0},/area) "ag" = (/obj/cable,/obj/cable{icon_state = "0-8"; d2 = 8},/obj/cable{icon_state = "0-4"; d2 = 4},/turf/station/floor{icon_state = "Floor1"; intact = 0},/area)