Singularity Engine
-Recoded some parts, still works mostly the same
Welders
-Recoded, it works mostly the same but is easier to use in code
-Cyborgs have a larger fuel tank
-Brought most if not all of the areas that use welders upto spec
Moved the changeling chem recharge code into the human life proc
New players who log out before spawning in are now deleted
New minor Common event
Machines around the station use more power, system might need some changes later
Likely few other minor changes that I just cant think of atm

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@945 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
mport2004@gmail.com
2011-02-03 08:15:17 +00:00
parent e78f6c0d50
commit cd79ae951d
67 changed files with 3276 additions and 3238 deletions

View File

@@ -12,6 +12,9 @@ Pipelines + Other Objects -> Pipe network
obj/machinery/atmospherics
anchored = 1
power_usage = 10
power_channel = ENVIRON
var/initialize_directions = 0
var/color

View File

@@ -46,7 +46,6 @@ obj/machinery/atmospherics/binary/pump
return
if(!on)
return 0
use_power(5)
var/output_starting_pressure = air2.return_pressure()
@@ -69,7 +68,6 @@ obj/machinery/atmospherics/binary/pump
if(network2)
network2.update = 1
use_power(round(air2.volume/12))
return 1
//Radio remote control

View File

@@ -6,7 +6,6 @@
desc = "Has a valve and pump attached to it"
level = 1
var/channel = ENVIRON
var/area_uid
var/id = null
@@ -42,7 +41,6 @@
name = "Large Air Vent"
New()
..()
channel = EQUIP
air_contents.volume = 1000
update_icon()
@@ -66,7 +64,6 @@
if(!on)
return 0
use_power(5, channel)
if(welded)
return 0
@@ -87,7 +84,6 @@
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
use_power(round(air_contents.volume/12), channel)
loc.assume_air(removed)
if(network)
@@ -108,8 +104,6 @@
if (isnull(removed)) //in space
return
use_power(round(air_contents.volume/12), channel)
air_contents.merge(removed)
if(network)
@@ -228,22 +222,21 @@
on = 0
return
attackby(obj/item/W, mob/user) // Added for aliens -- TLE
// Stolen from the Emitter welding code of the Singularity
if(istype(W, /obj/item/weapon/weldingtool) && W:welding)
if (W:get_fuel() < 1)
user << "\blue You need more welding fuel to complete this task."
return 1
W:use_fuel(1)
attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/weldingtool))
if (W:remove_fuel(2,user))
user << "\blue Now welding the vent."
if(do_after(user, 20))
playsound(src.loc, 'Welder2.ogg', 50, 1)
if(!welded)
user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.")
welded = 1
else
user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.")
welded = 0
else
user << "\blue You need more welding fuel to complete this task."
return 1
examine()
set src in oview(1)
..()
@@ -251,10 +244,10 @@
usr << "It seems welded shut."
power_change()
if(powered(channel))
stat &= ~NOPOWER
else
stat |= NOPOWER
// if(powered(EVNIRON))
// stat &= ~NOPOWER
// else
// stat |= NOPOWER
update_icon()
attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)

View File

@@ -97,8 +97,7 @@
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
if (isnull(removed)) //in space
return
var/power = (scrub_Toxins+scrub_CO2+scrub_N2O)*volume_rate/12
use_power(round(power+5), ENVIRON)
//Filter it
var/datum/gas_mixture/filtered_out = new
filtered_out.temperature = removed.temperature
@@ -130,7 +129,7 @@
else //Just siphoning all air
if (air_contents.return_pressure()>=50*ONE_ATMOSPHERE)
return
use_power(round(volume_rate/12)+5, ENVIRON)
var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume)
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)

View File

@@ -1,4 +1,5 @@
obj/machinery/atmospherics/pipe
power_usage = 0
var/datum/gas_mixture/air_temporary //used when reconstructing a pipeline that broke
var/datum/pipeline/parent

View File

@@ -305,11 +305,11 @@
return 0
/proc/do_after(mob/M as mob, time as num)
var/turf/T = M.loc
var/turf/T = get_turf(M)
var/holding = M.equipped()
sleep(time)
if(M)
if ((M.loc == T && M.equipped() == holding && !( M.stat )))
if ((get_turf(M) == T && M.equipped() == holding && !( M.stat )))
return 1
else
return 0

View File

@@ -132,18 +132,10 @@
else if(istype(I, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = I
if(W.welding)
if(W.get_fuel() > 2)
W.use_fuel(2)
if(W.remove_fuel(2))
playsound(src.loc, 'Welder2.ogg', 100, 1)
// check if anything changed over 2 seconds
var/turf/uloc = user.loc
var/atom/wloc = W.loc
user << "Welding the pipe in place."
sleep(20)
if(user.loc == uloc && wloc == W.loc)
if(do_after(user, 20))
update()
var/pipetype = dpipetype()
var/obj/disposalpipe/P = new pipetype(src.loc)
@@ -151,14 +143,8 @@
P.dir = dir
P.dpdir = dpdir
P.updateicon()
del(src)
else
user << "You must stay still while welding."
return
else
user << "You need more welding fuel to complete this task."
return

View File

@@ -685,17 +685,14 @@
var/obj/item/weapon/weldingtool/W = I
if(W.welding)
if(W.get_fuel() > 3)
W.use_fuel(3)
if(W.remove_fuel(3))
playsound(src.loc, 'Welder2.ogg', 100, 1)
// check if anything changed over 2 seconds
var/turf/uloc = user.loc
var/atom/wloc = W.loc
user << "Slicing the disposal pipe."
sleep(30)
if(user.loc == uloc && wloc == W.loc)
welded()
else
user << "You must stay still while welding the pipe."

View File

@@ -42,6 +42,7 @@
var/area/master // master area used for power calcluations
// (original area before splitting due to sd_DAL)
var/list/related // the other areas of the same type as this
var/list/lights // list of all lights on this area
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/

View File

@@ -76,6 +76,9 @@ obj
/atom/proc/HasProximity(atom/movable/AM as mob|obj)
return
/atom/proc/emp_act(var/severity)
return
/atom/movable/overlay/attackby(a, b)
if (src.master)
return src.master.attackby(a, b)

View File

@@ -1,7 +1,13 @@
/obj/machinery
name = "machinery"
icon = 'stationobjs.dmi'
var/stat = 0
var
stat = 0
power_usage = 200
power_channel = EQUIP
//EQUIP,ENVIRON or LIGHT
/obj/machinery/alarm
name = "alarm"
@@ -10,6 +16,7 @@
anchored = 1.0
var/skipprocess = 0 //Experimenting
var/alarm_frequency = "1437"
power_usage = 5
/obj/machinery/autolathe
name = "Autolathe"
@@ -30,6 +37,7 @@
var/hack_wire
var/disable_wire
var/shock_wire
power_usage = 50
/obj/machinery/camera
name = "Security Camera"
@@ -43,7 +51,7 @@
anchored = 1.0
var/invuln = null
var/bugged = 0
power_usage = 5
/obj/machinery/dispenser
@@ -55,6 +63,7 @@
var/o2tanks = 10.0
var/pltanks = 10.0
anchored = 1.0
power_usage = 10
/obj/machinery/dna_scanner
name = "DNA Scanner/Implanter"
@@ -64,6 +73,7 @@
var/locked = 0.0
var/mob/occupant = null
anchored = 1.0
power_usage = 200
/obj/machinery/dna_scannernew
name = "DNA Modifier"
@@ -73,7 +83,7 @@
var/locked = 0.0
var/mob/occupant = null
anchored = 1.0
power_usage = 200
/obj/machinery/firealarm
name = "Fire Alarm"
@@ -85,6 +95,8 @@
var/timing = 0.0
var/lockdownbyai = 0
anchored = 1.0
power_usage = 5
power_channel = ENVIRON
/obj/machinery/partyalarm
name = "Party Button"
@@ -96,7 +108,7 @@
var/timing = 0.0
var/lockdownbyai = 0
anchored = 1.0
power_usage = 5
/obj/machinery/hologram_proj
@@ -143,6 +155,7 @@
var/id = 1.0
anchored = 1.0
var/drive_range = 50 //this is mostly irrelevant since current mass drivers throw into space, but you could make a lower-range mass driver for interstation transport or something I guess.
power_usage = 50
/obj/machinery/meter
name = "meter"
@@ -152,6 +165,7 @@
anchored = 1.0
var/frequency = 0
var/id
power_usage = 5
/obj/machinery/nuclearbomb
desc = "Uh oh."
@@ -169,6 +183,7 @@
var/safety = 1.0
var/obj/item/weapon/disk/nuclear/auth = null
flags = FPRINT
power_usage = 0
/obj/machinery/optable
name = "Operating Table"
@@ -176,7 +191,7 @@
icon_state = "table2-idle"
density = 1
anchored = 1.0
power_usage = 40
var/mob/living/carbon/human/victim = null
var/strapped = 0.0
@@ -195,6 +210,7 @@
var/can_rotate = 1
var/can_maximize_speed = 0
var/one_person_only = 0
power_usage = 0
/obj/machinery/vehicle/pod
name = "Escape Pod"
@@ -220,6 +236,7 @@
var/locked = 0.0
var/mob/occupant = null
anchored = 1.0
power_usage = 600
/obj/machinery/scan_console
name = "DNA Scanner Access Console"
@@ -238,6 +255,7 @@
var/temp = null
var/obj/machinery/dna_scanner/connected = null
anchored = 1.0
power_usage = 400
/obj/machinery/scan_consolenew
name = "DNA Modifier Access Console"
@@ -272,6 +290,7 @@
var/obj/machinery/dna_scanner/connected = null
var/obj/item/weapon/disk/data/diskette = null
anchored = 1.0
power_usage = 400
/obj/machinery/sec_lock
name = "Security Pad"
@@ -283,6 +302,7 @@
var/obj/machinery/door/d2 = null
anchored = 1.0
req_access = list(access_brig)
power_usage = 5
/obj/machinery/door_control
name = "Remote Door Control"
@@ -291,6 +311,7 @@
desc = "A remote control switch for a door."
var/id = null
anchored = 1.0
power_usage = 5
/obj/machinery/driver_button
name = "Mass Driver Button"
@@ -300,6 +321,7 @@
var/id = null
var/active = 0
anchored = 1.0
power_usage = 5
/obj/machinery/ignition_switch
name = "Ignition Switch"
@@ -309,10 +331,12 @@
var/id = null
var/active = 0
anchored = 1.0
power_usage = 5
/obj/machinery/shuttle
name = "shuttle"
icon = 'shuttle.dmi'
power_usage = 0
/obj/machinery/shuttle/engine
name = "engine"
@@ -358,17 +382,19 @@
name = "hub"
icon_state = "tele0"
var/accurate = 0
power_usage = 100
/obj/machinery/teleport/station
name = "station"
icon_state = "controller"
var/active = 0
var/engaged = 0
power_usage = 100
/obj/machinery/wire
name = "wire"
icon = 'power_cond.dmi'
power_usage = 1
/obj/machinery/power
name = null
@@ -378,6 +404,7 @@
var/netnum = 0
var/directwired = 1 // by default, power machines are connected by a cable in a neighbouring turf
// if set to 0, requires a 0-X cable on this turf
power_usage = 0
/obj/machinery/power/terminal
name = "terminal"
@@ -420,36 +447,7 @@
icon_state = "power"
density = 1
anchored = 1
#define SMESMAXCHARGELEVEL 200000
#define SMESMAXOUTPUT 200000
/obj/machinery/power/smes/magical
name = "magical power storage unit"
desc = "A high-capacity superconducting magnetic energy storage (SMES) unit. Magically produces power."
process()
capacity = INFINITY
charge = INFINITY
..()
/obj/machinery/power/smes
name = "power storage unit"
desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."
icon_state = "smes"
density = 1
anchored = 1
var/output = 30000
var/lastout = 0
var/loaddemand = 0
var/capacity = 5e6
var/charge = 1e6
var/charging = 0
var/chargemode = 0
var/chargecount = 0
var/chargelevel = 30000
var/online = 1
var/n_tag = null
var/obj/machinery/power/terminal/terminal = null
power_usage = 600
/obj/machinery/power/solar
name = "solar panel"
@@ -467,6 +465,7 @@
var/ndir = SOUTH
var/turn_angle = 0
var/obj/machinery/power/solar_control/control
power_usage = 0
/obj/machinery/power/solar_control
name = "solar panel control"
@@ -484,7 +483,7 @@
var/trackrate = 600 // 300-900 seconds
var/trackdir = 1 // 0 =CCW, 1=CW
var/nexttime = 0
power_usage = 500
/obj/machinery/cell_charger
@@ -495,6 +494,7 @@
var/obj/item/weapon/cell/charging = null
var/chargelevel = -1
anchored = 1
power_usage = 50
/obj/machinery/light_switch
desc = "A light switch"
@@ -525,6 +525,7 @@
icon_state = "mw"
density = 1
anchored = 1
power_usage = 100
var/egg_amount = 0 //Current number of eggs inside
var/flour_amount = 0 //Current amount of flour inside
var/water_amount = 0 //Current amount of water inside
@@ -563,6 +564,8 @@
anchored = 1
var/broken = 0
var/processing = 0
power_usage = 50
/obj/machinery/gibber
name = "Gibber"
@@ -575,6 +578,7 @@
var/dirty = 0 // Does it need cleaning?
var/gibtime = 40 // Time from starting until meat appears
var/mob/occupant // Mob who has been put inside
power_usage = 50
/obj/machinery/holopad
name = "holopad"
@@ -583,3 +587,4 @@
anchored = 1
var/state = "off"
var/slave_holo = null
power_usage = 50

View File

@@ -1126,21 +1126,6 @@ Total SMES charging rate should not exceed total power generation rate, or an ov
throw_speed = 4
throw_range = 20
/obj/item/weapon/weldingtool
name = "weldingtool"
icon = 'items.dmi'
icon_state = "welder"
var/welding = 0
var/status = 0 //flamethrower construction :shobon:
flags = FPRINT | TABLEPASS| CONDUCT
force = 3.0
throwforce = 5.0
throw_speed = 1
throw_range = 5
w_class = 2.0
m_amt = 70
g_amt = 30
/obj/item/weapon/wire
desc = "This is just a simple piece of regular insulated wire."
name = "wire"

View File

@@ -19,7 +19,7 @@
src.icon = 'alert.dmi'
src.layer = 10
// update_lights()
if(name == "Space") // override defaults for space
requires_power = 0
@@ -56,7 +56,15 @@
A = A.loc
return null
*/
/*
/area/proc/update_lights()
var/new_power = 0
for(var/obj/machinery/light/L in src.contents)
if(L.on)
new_power += (L.luminosity * 20)
lighting_power_usage = new_power
return
*/
/area/proc/poweralert(var/state, var/source)
if (state != poweralm)
poweralm = state

View File

@@ -645,7 +645,6 @@
/obj/machinery/scan_consolenew/process() //not really used right now
if(stat & (NOPOWER|BROKEN))
return
use_power(250) // power stuff
if (!( src.status )) //remove this
return
return

View File

@@ -1,4 +1,7 @@
/proc/start_events()
if(prob(50))//Every 120 seconds and prob 50 4-8 weak spacedusts will hit the station
spawn(1)
dust_swarm("weak")
if (!event && prob(eventchance))
event()
hadevent = 1

View File

@@ -0,0 +1,117 @@
/*
Space dust
Commonish random event that causes small clumps of "space dust" to hit the station at high speeds.
No command report on the common version of this event.
The "dust" will damage the hull of the station causin minor hull breaches.
*/
/proc/dust_swarm(var/strength = "weak")
var/numbers = 1
switch(strength)
if("weak")
numbers = rand(4,8)
for(var/i = 0 to numbers)
new/obj/space_dust/weak()
if("norm")
numbers = rand(5,10)
for(var/i = 0 to numbers)
new/obj/space_dust()
if("strong")
numbers = rand(10,15)
for(var/i = 0 to numbers)
new/obj/space_dust/strong()
if("super")
numbers = rand(15,25)
for(var/i = 0 to numbers)
new/obj/space_dust/super()
return
/obj/space_dust
name = "Space Dust"
desc = "Dust in space."
icon = 'meteor.dmi'
icon_state = "space_dust"
density = 1
anchored = 1
var
strength = 2 //ex_act severity number
life = 2 //how many things we hit before del(src)
weak
strength = 3
life = 1
strong
strength = 1
life = 6
super
strength = 1
life = 40
New()
var/startx = 0
var/starty = 0
var/endy = 0
var/endx = 0
var/startside = pick(cardinal)
switch(startside)
if(NORTH)
starty = world.maxy-1
startx = rand(1, world.maxx-1)
endy = 1
endx = rand(1, world.maxx-1)
if(EAST)
starty = rand(1,world.maxy-1)
startx = world.maxx-1
endy = rand(1, world.maxy-1)
endx = 1
if(SOUTH)
starty = 1
startx = rand(1, world.maxx-1)
endy = world.maxy-1
endx = rand(1, world.maxx-1)
if(WEST)
starty = rand(1, world.maxy-1)
startx = 1
endy = rand(1,world.maxy-1)
endx = world.maxx-1
var/goal = locate(endx, endy, src.z)
src.x = startx
src.y = starty
spawn(0)
walk_towards(src, goal, 1)
return
Bump(atom/A)
spawn(0)
if(prob(50))
for(var/mob/M in range(10, src))
if(!M.stat && !istype(M, /mob/living/silicon/ai))
shake_camera(M, 3, 1)
if (A)
playsound(src.loc, 'meteorimpact.ogg', 40, 1)
if(ismob(A))
A.meteorhit(src)//This should work for now I guess
else
A.ex_act(strength)
life--
if(life <= 0)
spawn(0)
del(src)
return 0
return
Bumped(atom/A)
Bump(A)
return
ex_act(severity)
del(src)
return

View File

@@ -1,5 +1,7 @@
/obj/machinery/alarm
power_usage = 5
power_channel = ENVIRON
var/frequency = 1439
var/list/sensors = list()
var/list/vents = list()
@@ -352,7 +354,6 @@
icon_state = "alarmp"
return
use_power(5, ENVIRON)
if (!( istype(location, /turf) ))
return 0
@@ -574,8 +575,6 @@
if(stat & (NOPOWER|BROKEN))
return
use_power(10, ENVIRON)
var/area/A = src.loc
A = A.loc

View File

@@ -16,6 +16,7 @@ the blender or the processor: Processor items are solid objects and Blender resu
icon_state = "blender_e"
density = 1
anchored = 1
power_usage = 20
flags = OPENCONTAINER //So that you can pour stuff into it.
var/processing = 0 //This turns on (1) while it is processing so you don't accidentally get multiples from the same item.
var/container = 1 //Is there a jug attached? Could have been done with a for loop but it's less code this way.

View File

@@ -781,8 +781,7 @@ Auto Patrol: []"},
src.icon_state = "ed209_shell"
del(W)
else if ((istype(W, /obj/item/weapon/weldingtool)) && (src.build_step == 3))
if ((W:welding) && (W:get_fuel() >= 1))
W:use_fuel(1)
if (W:remove_fuel(1,user))
src.build_step++
src.name = "shielded frame assembly"
user << "You welded the vest to [src]!"
@@ -864,10 +863,8 @@ Auto Patrol: []"},
var/obj/beam/a_laser/A
if (src.emagged)
A = new /obj/beam/a_laser( loc )
use_power(50)
else
A = new /obj/bullet/electrode( loc )
use_power(100)
if (!( istype(U, /turf) ))
//A = null

View File

@@ -756,8 +756,7 @@ Auto Patrol: []"},
/obj/item/weapon/secbot_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob)
if ((istype(W, /obj/item/weapon/weldingtool)) && (!src.build_step))
if ((W:welding) && (W:get_fuel() >= 1))
W:use_fuel(1)
if(W:remove_fuel(1,user))
src.build_step++
src.overlays += image('aibots.dmi', "hs_hole")
user << "You weld a hole in [src]!"

View File

@@ -143,7 +143,7 @@
/obj/machinery/computer/aifixer/process()
if(stat & (NOPOWER|BROKEN))
return
use_power(500)
src.updateDialog()
return

View File

@@ -800,19 +800,15 @@ About the new airlock wires panel:
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.get_fuel() > 2)
W.use_fuel(2)
W.eyecheck(user)
else
user << "Need more welding fuel!"
return
if(W.remove_fuel(2,user))
if (!src.welded)
src.welded = 1
else
src.welded = null
src.update_icon()
return
else
return
else if (istype(C, /obj/item/weapon/screwdriver))
src.p_open = !( src.p_open )
src.update_icon()

View File

@@ -20,19 +20,12 @@
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.get_fuel() > 2)
W.use_fuel(2)
if (!( src.blocked ))
src.blocked = 1
else
src.blocked = 0
if(W.remove_fuel(2, user))
src.blocked = !src.blocked
user << text("\red You [blocked?"welded":"unwelded"] the [src]")
update_icon()
return
if (!( istype(C, /obj/item/weapon/crowbar) ))
return
if (istype(C, /obj/item/weapon/crowbar))
if (!src.blocked && !src.operating)
if(src.density)
spawn( 0 )
@@ -58,6 +51,7 @@
src.sd_SetOpacity(1)
src.operating = 0
return
..()
return
/obj/machinery/door/firedoor/process()

View File

@@ -53,8 +53,6 @@
src.state = "off"
src.icon_state = "holopad0"
src.slave_holo = null
else
use_power(300)
if(src.state == "off" && src.slave_holo) //usually happens if the power ran out
del(src.slave_holo) //code for returning the control back to the AI is in the mob's del() code
src.slave_holo = null

View File

@@ -3,6 +3,7 @@ obj/machinery/recharger
icon = 'stationobjs.dmi'
icon_state = "recharger0"
name = "recharger"
power_usage = 50
var
obj/item/weapon/gun/energy/charging = null

View File

@@ -4,7 +4,7 @@
icon_state = "pod_0"
density = 1
anchored = 1.0
power_usage = 80
var/mob/occupant = null

View File

@@ -7,6 +7,7 @@
var/metal_amount = 0
var/operating = 0
var/obj/item/robot_parts/being_built = null
power_usage = 1000
/obj/machinery/robotic_fabricator/attackby(var/obj/item/O as obj, var/mob/user as mob)
if (istype(O, /obj/item/stack/sheet/metal))
@@ -39,8 +40,6 @@
if (stat & (NOPOWER | BROKEN))
return
use_power(1000)
/obj/machinery/robotic_fabricator/attack_paw(user as mob)
return src.attack_hand(user)

View File

@@ -34,6 +34,7 @@
var/obj/cable/attached // the attached cable
var/storedpower = 0
flags = FPRINT | CONDUCT
power_usage = 500
/obj/machinery/shield
name = "shield"

File diff suppressed because it is too large Load Diff

View File

@@ -11,7 +11,7 @@
name = "status display"
anchored = 1
density = 1
power_usage = 250
var/mode = 1 // 0 = Blank
// 1 = Shuttle timer
// 2 = Arbitrary message(s)
@@ -49,8 +49,6 @@
overlays = null
return
use_power(200)
update()
@@ -270,8 +268,6 @@
overlays = null
return
use_power(200)
update()
proc/update()

View File

@@ -63,6 +63,7 @@
var/wasvalid = 0
var/lastfired = 0
var/shot_delay = 30 //3 seconds between shots
power_usage = 100
/obj/machinery/turretcover
name = "pop-up turret cover"
@@ -107,7 +108,6 @@
lastfired = world.time
if (src.cover==null)
src.cover = new /obj/machinery/turretcover(src.loc)
use_power(50)
var/loc = src.loc
if (istype(loc, /turf))
loc = loc:loc
@@ -252,10 +252,10 @@
var/obj/beam/a_laser/A
if (src.lasers)
A = new /obj/beam/a_laser( loc )
use_power(50)
use_power(500)
else
A = new /obj/bullet/electrode( loc )
use_power(100)
use_power(200)
if (!( istype(U, /turf) ))
//A = null

View File

@@ -127,7 +127,7 @@ var/list/sacrificed = list()
M.say("Tok-lyr rqa'nap g'lt-ulotf!")
cultist_count += 1
if(cultist_count >= 9)
var/obj/machinery/the_singularity/S = new /obj/machinery/the_singularity/(src.loc)
var/obj/machinery/singularity/S = new /obj/machinery/singularity/(src.loc)
S.icon = 'magic_terror.dmi'
S.name = "Tear in the Fabric of Reality"
S.desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees."

View File

@@ -11,6 +11,7 @@ datum/controller/game_controller
setup()
if(master_controller && (master_controller != src))
del(src)
return
//There can be only one master.
if(!air_master)
@@ -76,9 +77,7 @@ datum/controller/game_controller
M.Life()
else
M.Life()
if (M && M.mind) //I think it will be better if author place this under mob/Life() - rastaf0
if (M.mind.special_role == "Changeling")
M.chem_charges = between(0, (max((0.9 - (M.chem_charges / 50)), 0.1) + M.chem_charges), 50)
sleep(-1)
for(var/datum/disease/D in active_diseases)
@@ -86,6 +85,9 @@ datum/controller/game_controller
for(var/obj/machinery/machine in machines)
machine.process()
if(machine)//Testing this for now, might change it up later - Mport
if(machine.power_usage && machine.power_channel)
machine.use_power(machine.power_usage,machine.power_channel)
sleep(-1)
sleep(1)

View File

@@ -705,17 +705,15 @@
return
else if(istype(W, /obj/item/weapon/weldingtool) && W:welding)
if (W:get_fuel() < 2)
user << "\blue You need more welding fuel to complete this task."
return
if (W:remove_fuel(1,user))
if (src.internal_damage & MECHA_INT_TANK_BREACH)
src.internal_damage &= ~MECHA_INT_TANK_BREACH
user << "\blue You repair the damaged gas tank."
W:use_fuel(1)
else
return
if(src.health<initial(src.health))
user << "\blue You repair some damage to [src.name]."
src.health += min(20, initial(src.health)-src.health)
W:use_fuel(1)
else
user << "The [src.name] is at full integrity"
return

View File

@@ -139,12 +139,10 @@
custom_action(step, atom/used_atom, mob/user)
if(istype(used_atom, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = used_atom
if(W.get_fuel() < 2)
user << ("You need more fuel to complete current task")
return 0
if (W:remove_fuel(2, user))
playsound(holder, 'Welder2.ogg', 50, 1)
else
W.use_fuel(1)
playsound(holder, 'Welder.ogg', 50, 1)
return 0
else if(istype(used_atom, /obj/item/weapon/wrench))
playsound(holder, 'Ratchet.ogg', 50, 1)

View File

@@ -26,17 +26,16 @@
if(salvage_num <= 0)
user << "You can't see anything of value left on this wreck."
return
if (W:get_fuel() < 2)
user << "\blue You need more welding fuel to complete this task."
else
if (W:remove_fuel(1,user))
var/type = prob(70)?pick(welder_salvage):null
if(type)
var/N = new type(get_turf(user))
user.visible_message("[user] cuts [N] from [src]", "You cut [N] from [src]", "You hear a sound of welder nearby")
W:use_fuel(1)
else
user << "You failed to salvage anything valuable from [src]."
salvage_num--
else
user << "\blue You need more welding fuel to complete this task."
return
if(istype(W, /obj/item/weapon/wirecutters))
if(salvage_num <= 0)

View File

@@ -142,10 +142,9 @@
src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
if (istype(W, /obj/item/weapon/weldingtool) && W:welding)
if (W:get_fuel() < 2)
if (!W:remove_fuel(1,user))
user << "\blue You need more welding fuel to complete this task."
return
W:use_fuel(1)
new /obj/item/stack/sheet/metal(src.loc)
for (var/mob/M in viewers(src))
M.show_message("\red [src] has been cut apart by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2)
@@ -158,11 +157,9 @@
W.loc = src.loc
else if(istype(W, /obj/item/weapon/weldingtool) && W:welding)
if (W:get_fuel() < 2)
if (!W:remove_fuel(1,user))
user << "\blue You need more welding fuel to complete this task."
return
W:eyecheck(user)
W:use_fuel(1)
src.welded =! src.welded
for(var/mob/M in viewers(src))
M.show_message("\red [src] has been [welded?"welded shut":"unwelded"] by [user.name].", 3, "\red You hear welding.", 2)

View File

@@ -84,20 +84,18 @@ obj/door_assembly
/obj/door_assembly/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/weldingtool) && W:welding && !anchored )
if (W:get_fuel() < 1)
user << "\blue You need more welding fuel to dissassemble the airlock assembly."
return
W:use_fuel(1)
if (W:remove_fuel(1,user))
user.visible_message("[user] dissassembles the airlock assembly.", "You start to dissassemble the airlock assembly.")
playsound(src.loc, 'Welder2.ogg', 50, 1)
var/turf/T = get_turf(user)
sleep(40)
if(get_turf(user) == T)
if(do_after(user, 40))
user << "\blue You dissasembled the airlock assembly!"
new /obj/item/stack/sheet/metal(get_turf(src), 4)
if(src.glass==1)
new /obj/item/stack/sheet/rglass(get_turf(src))
del(src)
else
user << "\blue You need more welding fuel to dissassemble the airlock assembly."
return
else if(istype(W, /obj/item/weapon/wrench) && !anchored )
playsound(src.loc, 'Ratchet.ogg', 100, 1)
var/turf/T = get_turf(user)

View File

@@ -71,3 +71,9 @@
var/rendered = "<span class='game say'><span class='name'>[M.name]: </span> <span class='message'>[text]</span></span>"
mo.show_message(rendered, 2)
return
/proc/is_item_in_list(var/list/L, var/atom/A)
for(var/atom/O in L)
if(O == A)
return 1
return 0

View File

@@ -81,19 +81,40 @@ WELDINGTOOOL
// WELDING TOOL
/obj/item/weapon/weldingtool/New()
var/datum/reagents/R = new/datum/reagents(20)
/obj/item/weapon/weldingtool
name = "weldingtool"
icon = 'items.dmi'
icon_state = "welder"
flags = FPRINT | TABLEPASS| CONDUCT
force = 3.0
throwforce = 5.0
throw_speed = 1
throw_range = 5
w_class = 2.0
m_amt = 70
g_amt = 30
var
welding = 0
status = 0
max_fuel = 20
New()
var/random_fuel = min(rand(10,20),max_fuel)
var/datum/reagents/R = new/datum/reagents(max_fuel)
reagents = R
R.my_atom = src
R.add_reagent("fuel", 20)
R.add_reagent("fuel", random_fuel)
return
/obj/item/weapon/weldingtool/examine()
examine()
set src in usr
usr << text("\icon[] [] contains [] units of fuel left!", src, src.name, get_fuel() )
usr << text("\icon[] [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel )
return
/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/user as mob)
attackby(obj/item/W as obj, mob/user as mob)
if (istype(W,/obj/item/weapon/screwdriver))
status = !status
if (status)
@@ -130,51 +151,114 @@ WELDINGTOOOL
else
..()
// helper functions for weldingtool fuel use
// return fuel amount
/obj/item/weapon/weldingtool/proc/get_fuel()
return reagents.get_reagent_amount("fuel")
// remove fuel amount
/obj/item/weapon/weldingtool/proc/use_fuel(var/amount)
amount = min( get_fuel() , amount)
reagents.remove_reagent("fuel", amount)
process()
if(!welding)
processing_items.Remove(src)
return
var/turf/location = src.loc
if(istype(location, /mob/))
var/mob/M = location
if(M.l_hand == src || M.r_hand == src)
location = get_turf(M)
if (istype(location, /turf))
location.hotspot_expose(700, 5)
if(prob(20))//Welders left on now use up fuel, but lets not have them run out quite that fast
remove_fuel(1)
/obj/item/weapon/weldingtool/afterattack(obj/O as obj, mob/user as mob)
afterattack(obj/O as obj, mob/user as mob)
if (istype(O, /obj/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !src.welding)
O.reagents.trans_to(src, 20)
O.reagents.trans_to(src, max_fuel)
user << "\blue Welder refueled"
playsound(src.loc, 'refill.ogg', 50, 1, -6)
return
else if (istype(O, /obj/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && src.welding)
message_admins("[key_name_admin(user)] triggered a fueltank explosion.")
user << "\red That was stupid of you."
explosion(O.loc,-1,0,2)
if(O)
del(O)
else if (src.welding)
use_fuel(1)
if (get_fuel() <= 0)
usr << "\blue Need more fuel!"
src.welding = 0
src.force = 3
src.damtype = "brute"
src.icon_state = "welder"
var/turf/location = user.loc
return
if (src.welding)
remove_fuel(1)
var/turf/location = get_turf(user)
if (istype(location, /turf))
location.hotspot_expose(700, 50, 1)
return
/obj/item/weapon/weldingtool/proc/eyecheck(mob/user as mob)
attack_self(mob/user as mob)
toggle()
return
proc
///GET prop for fuel
get_fuel()
return reagents.get_reagent_amount("fuel")
///SET prop for fuel
///Will also turn it off if it is out of fuel
///The mob argument is not needed but if included will call eyecheck() on it if the welder is on.
remove_fuel(var/amount = 1, var/mob/M = null)
if(!welding || !check_status())
return 0
if(get_fuel() >= amount)
reagents.remove_reagent("fuel", amount)
check_status()
if(M)
eyecheck()//TODO:eyecheck should really be in mob not here
return 1
else
if(M)
M << "\blue You need more welding fuel to complete this task."
return 0
///Quick check to see if we even have any fuel and should shut off
///This could use a better name
check_status()
if((get_fuel() <= 0) && welding)
toggle(1)
return 0
return 1
//toggles the welder off and on
toggle(var/message = 0)
if(status > 1) return
src.welding = !( src.welding )
if (src.welding)
if (remove_fuel(1))
usr << "\blue You switch the [src] on."
src.force = 15
src.damtype = "fire"
src.icon_state = "welder1"
processing_items.Add(src)
else
usr << "\blue Need more fuel!"
src.welding = 0
return
else
if(!message)
usr << "\blue You switch the [src] off."
else
usr << "\blue The [src] shuts off!"
src.force = 3
src.damtype = "brute"
src.icon_state = "welder"
src.welding = 0
eyecheck(mob/user as mob)//TODO:Move this over to /mob/ where it should be
//check eye protection
var/safety = null
if(!ishuman() && !ismonkey())
return 1
var/safety = 0
if (istype(user, /mob/living/carbon/human))
if (istype(user:head, /obj/item/clothing/head/helmet/welding) || istype(user:head, /obj/item/clothing/head/helmet/space))
safety = 2
@@ -184,8 +268,6 @@ WELDINGTOOOL
safety = -1
else
safety = 0
else if(istype(user, /mob/living/carbon))
safety = 0
switch(safety)
if(1)
usr << "\red Your eyes sting a little."
@@ -213,37 +295,12 @@ WELDINGTOOOL
user.disabilities |= 1
spawn(100)
user.disabilities &= ~1
/obj/item/weapon/weldingtool/attack_self(mob/user as mob)
if(status > 1) return
src.welding = !( src.welding )
if (src.welding)
if (get_fuel() <= 0)
user << "\blue Need more fuel!"
src.welding = 0
return 0
user << "\blue You will now weld when you attack."
src.force = 15
src.damtype = "fire"
src.icon_state = "welder1"
processing_items.Add(src)
else
user << "\blue Not welding anymore."
src.force = 3
src.damtype = "brute"
src.icon_state = "welder"
return
/obj/item/weapon/weldingtool/process()
if(!welding)
processing_items.Remove(src)
return
var/turf/location = src.loc
if(istype(location, /mob/))
var/mob/M = location
if(M.l_hand == src || M.r_hand == src)
location = M.loc
if (istype(location, /turf))
location.hotspot_expose(700, 5)
/obj/item/weapon/weldingtool/largetank
name = "weldingtool"
icon = 'items.dmi'
icon_state = "welder"
max_fuel = 40

View File

@@ -15,11 +15,7 @@ FLOOR TILES
if(amount < 2)
user << "\red You need at least two rods to do this."
return
if (W:get_fuel() < 3)
user << "\red You need more welding fuel to complete this task."
return
W:eyecheck(user)
W:use_fuel(2)
if(W:remove_fuel(2,user))
var/obj/item/stack/sheet/metal/new_item = new(usr.loc)
new_item.add_to_stacks(usr)
for (var/mob/M in viewers(src))

View File

@@ -325,8 +325,7 @@
return
if (istype(W, /obj/item/weapon/weldingtool) && W:welding)
W:eyecheck(user)
var/turf/T = user.loc
var/turf/T = get_turf(user)
if (!( istype(T, /turf) ))
return
@@ -346,19 +345,18 @@
spawn(100) del(O)
return
if (W:get_fuel() < 5)
user << "\blue You need more welding fuel to complete this task."
return
W:use_fuel(5)
if (W:remove_fuel(5,user))
user << "\blue Now disassembling the outer wall plating."
playsound(src.loc, 'Welder.ogg', 100, 1)
sleep(100)
if (istype(src, /turf/simulated/wall))
if ((user.loc == T && user.equipped() == W))
if ((get_turf(user) == T && user.equipped() == W))
user << "\blue You disassembled the outer wall plating."
dismantle_wall()
else
user << "\blue You need more welding fuel to complete this task."
return
else if(istype(W,/obj/item/apc_frame))
var/obj/item/apc_frame/AH = W
AH.try_build(src)
@@ -809,7 +807,7 @@ turf/simulated/floor/proc/update_icon()
var/list/y_arr
if(src.x <= 1)
if(istype(A, /obj/meteor))
if(istype(A, /obj/meteor)||istype(A, /obj/space_dust))
del(A)
return
@@ -884,7 +882,7 @@ turf/simulated/floor/proc/update_icon()
A.loc.Entered(A)
else if (src.y >= world.maxy)
if(istype(A, /obj/meteor))
if(istype(A, /obj/meteor)||istype(A, /obj/space_dust))
del(A)
return
var/list/cur_pos = src.get_global_map_pos()
@@ -914,7 +912,7 @@ turf/simulated/floor/proc/update_icon()
if (src.x <= 2)
if(prob(50))
if(istype(A, /obj/meteor))
if(istype(A, /obj/meteor)||istype(A, /obj/space_dust))
del(A)
return
if(istype(A,/mob/living/carbon/human))
@@ -935,7 +933,7 @@ turf/simulated/floor/proc/update_icon()
if ((A && A.loc))
A.loc.Entered(A)
else
if(istype(A, /obj/meteor))
if(istype(A, /obj/meteor)||istype(A, /obj/space_dust))
del(A)
return
if(istype(A,/mob/living/carbon/human))
@@ -957,7 +955,7 @@ turf/simulated/floor/proc/update_icon()
A.loc.Entered(A)
else if (A.x >= (world.maxx - 1))
if(prob(50))
if(istype(A, /obj/meteor))
if(istype(A, /obj/meteor)||istype(A, /obj/space_dust))
del(A)
return
if(istype(A,/mob/living/carbon/human))
@@ -978,7 +976,7 @@ turf/simulated/floor/proc/update_icon()
if ((A && A.loc))
A.loc.Entered(A)
else
if(istype(A, /obj/meteor))
if(istype(A, /obj/meteor)||istype(A, /obj/space_dust))
del(A)
return
if(istype(A,/mob/living/carbon/human))
@@ -1000,7 +998,7 @@ turf/simulated/floor/proc/update_icon()
A.loc.Entered(A)
else if (src.y <= 2)
if(prob(50))
if(istype(A, /obj/meteor))
if(istype(A, /obj/meteor)||istype(A, /obj/space_dust))
del(A)
return
if(istype(A,/mob/living/carbon/human))
@@ -1021,7 +1019,7 @@ turf/simulated/floor/proc/update_icon()
if ((A && A.loc))
A.loc.Entered(A)
else
if(istype(A, /obj/meteor))
if(istype(A, /obj/meteor)||istype(A, /obj/space_dust))
del(A)
return
if(istype(A,/mob/living/carbon/human))
@@ -1044,7 +1042,7 @@ turf/simulated/floor/proc/update_icon()
else if (A.y >= (world.maxy - 1))
if(prob(50))
if(istype(A, /obj/meteor))
if(istype(A, /obj/meteor)||istype(A, /obj/space_dust))
del(A)
return
if(istype(A,/mob/living/carbon/human))
@@ -1065,7 +1063,7 @@ turf/simulated/floor/proc/update_icon()
if ((A && A.loc))
A.loc.Entered(A)
else
if(istype(A, /obj/meteor))
if(istype(A, /obj/meteor)||istype(A, /obj/space_dust))
del(A)
return
if(istype(A,/mob/living/carbon/human))

View File

@@ -45,7 +45,7 @@
src.verbs += /proc/toggle_adminmsg
src.verbs += /client/proc/triple_ai //triple AIs~ --NEO
src.verbs += /client/proc/cmd_mass_modify_object_variables
// Admin "must have"
src.verbs += /client/proc/cmd_admin_list_occ
src.verbs += /client/proc/cmd_admin_mute
@@ -171,7 +171,7 @@
src.verbs += /obj/admins/proc/voteres //toggle votes
src.verbs += /client/proc/deadchat //toggles deadchat
src.verbs += /proc/toggle_adminmsg
src.verbs += /client/proc/cmd_mass_modify_object_variables
// Admin "must have"
src.verbs += /client/proc/cmd_admin_list_occ
src.verbs += /client/proc/cmd_admin_mute
@@ -1093,7 +1093,7 @@
src.verbs -= /client/proc/cmd_admin_prison
src.verbs -= /obj/admins/proc/unprison
src.verbs -= /proc/togglebuildmode
src.verbs -= /client/proc/cmd_mass_modify_object_variables
// Unnecessary commands
src.verbs -= /client/proc/funbutton
src.verbs -= /client/proc/make_sound // -- TLE

View File

@@ -0,0 +1,223 @@
/client/proc/cmd_mass_modify_object_variables(obj/O as obj|mob|turf|area in world)
set category = "Debug"
set name = "Mass Edit Variables"
set desc="(target) Edit all instances of a target item's variables"
src.massmodify_variables(O)
/client/proc/massmodify_variables(var/atom/O)
var/list/locked = list("vars", "key", "ckey", "client")
if(!src.authenticated || !src.holder)
src << "Only administrators may use this command."
return
var/list/names = list()
for (var/V in O.vars)
names += V
names = sortList(names)
var/variable = input("Which var?","Var") as null|anything in names
if(!variable)
return
var/default
var/var_value = O.vars[variable]
var/dir
if (locked.Find(variable) && !(src.holder.rank in list("Host", "Coder")))
return
if(isnull(var_value))
usr << "Unable to determine variable type."
else if(isnum(var_value))
usr << "Variable appears to be <b>NUM</b>."
default = "num"
dir = 1
else if(istext(var_value))
usr << "Variable appears to be <b>TEXT</b>."
default = "text"
else if(isloc(var_value))
usr << "Variable appears to be <b>REFERENCE</b>."
default = "reference"
else if(isicon(var_value))
usr << "Variable appears to be <b>ICON</b>."
var_value = "\icon[var_value]"
default = "icon"
else if(istype(var_value,/atom) || istype(var_value,/datum))
usr << "Variable appears to be <b>TYPE</b>."
default = "type"
else if(istype(var_value,/list))
usr << "Variable appears to be <b>LIST</b>."
default = "list"
else if(istype(var_value,/client))
usr << "Variable appears to be <b>CLIENT</b>."
default = "cancel"
else
usr << "Variable appears to be <b>FILE</b>."
default = "file"
usr << "Variable contains: [var_value]"
if(dir)
switch(var_value)
if(1)
dir = "NORTH"
if(2)
dir = "SOUTH"
if(4)
dir = "EAST"
if(8)
dir = "WEST"
if(5)
dir = "NORTHEAST"
if(6)
dir = "SOUTHEAST"
if(9)
dir = "NORTHWEST"
if(10)
dir = "SOUTHWEST"
else
dir = null
if(dir)
usr << "If a direction, direction is: [dir]"
var/class = input("What kind of variable?","Variable Type",default) as null|anything in list("text",
"num","type","icon","file","edit referenced object","restore to default")
if(!class)
return
var/original_name
if (!istype(O, /atom))
original_name = "\ref[O] ([O])"
else
original_name = O:name
switch(class)
if("restore to default")
O.vars[variable] = initial(O.vars[variable])
if(istype(O, /mob))
for(var/mob/M in world)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
if("edit referenced object")
return .(O.vars[variable])
if("text")
O.vars[variable] = input("Enter new text:","Text",\
O.vars[variable]) as text
if(istype(O, /mob))
for(var/mob/M in world)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
if("num")
O.vars[variable] = input("Enter new number:","Num",\
O.vars[variable]) as num
if(istype(O, /mob))
for(var/mob/M in world)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
if("type")
O.vars[variable] = input("Enter type:","Type",O.vars[variable]) \
in typesof(/obj,/mob,/area,/turf)
if(istype(O, /mob))
for(var/mob/M in world)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
if("file")
O.vars[variable] = input("Pick file:","File",O.vars[variable]) \
as file
if(istype(O, /mob))
for(var/mob/M in world)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
else if(istype(O.type, /obj))
for(var/obj/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
else if(istype(O.type, /turf))
for(var/turf/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
if("icon")
O.vars[variable] = input("Pick icon:","Icon",O.vars[variable]) \
as icon
if(istype(O, /mob))
for(var/mob/M in world)
if (M.type == O.type)
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
if (A.type == O.type)
A.vars[variable] = O.vars[variable]
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]")
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]", 1)

View File

@@ -41,6 +41,9 @@
//Disease Check
handle_virus_updates()
//Changeling things
handle_changeling()
//Handle temperature/pressure differences between body and environment
handle_environment(environment)
@@ -866,6 +869,13 @@
if(!M.nodamage)
M.bruteloss += 5
src.nutrition += 10
handle_changeling()
if (mind)
if (mind.special_role == "Changeling")
src.chem_charges = between(0, (max((0.9 - (chem_charges / 50)), 0.1) + chem_charges), 50)
/*
// Commented out so hunger system won't be such shock
// Damage and effects from not eating

View File

@@ -40,6 +40,9 @@
//Disease Check
handle_virus_updates()
//Changeling things
handle_changeling()
//Handle temperature/pressure differences between body and environment
if(environment) // More error checking -- TLE
handle_environment(environment)
@@ -565,3 +568,8 @@
src.density = 1
else
src.density = !src.lying
handle_changeling()
if (mind)
if (mind.special_role == "Changeling")
src.chem_charges = between(0, (max((0.9 - (chem_charges / 50)), 0.1) + chem_charges), 50)

View File

@@ -351,6 +351,7 @@
statpanel("Status")
stat(null, text("Intent: []", src.a_intent))
stat(null, text("Move Mode: []", src.m_intent))
if(client && mind)
if (src.client.statpanel == "Status")
if (src.mind.special_role == "Changeling")
stat("Chemical Storage", src.chem_charges)

View File

@@ -185,18 +185,16 @@
/mob/living/silicon/hivebot/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/weldingtool) && W:welding)
if (W:get_fuel() > 2)
W:use_fuel(1)
else
user << "Need more welding fuel!"
return
if (W:remove_fuel(4))
src.bruteloss -= 30
if(src.bruteloss < 0) src.bruteloss = 0
src.updatehealth()
src.add_fingerprint(user)
for(var/mob/O in viewers(user, null))
O.show_message(text("\red [user] has fixed some of the dents on [src]!"), 1)
else
user << "Need more welding fuel!"
return
/mob/living/silicon/hivebot/attack_alien(mob/living/carbon/alien/humanoid/M as mob)

View File

@@ -281,6 +281,7 @@
process_locks()
if(weapon_lock)
src.module_active = null
src.module_state_1 = null
src.module_state_2 = null
src.module_state_3 = null

View File

@@ -348,17 +348,17 @@
/mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/weldingtool) && W:welding)
if (W:get_fuel() > 2)
W:use_fuel(1)
else
user << "Need more welding fuel!"
return
if (W:remove_fuel(4))
src.bruteloss -= 30
if(src.bruteloss < 0) src.bruteloss = 0
src.updatehealth()
src.add_fingerprint(user)
for(var/mob/O in viewers(user, null))
O.show_message(text("\red [user] has fixed some of the dents on [src]!"), 1)
else
user << "Need more welding fuel!"
return
else if(istype(W, /obj/item/weapon/cable_coil) && wiresexposed)
var/obj/item/weapon/cable_coil/coil = W

View File

@@ -45,7 +45,7 @@
..()
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/weldingtool(src)
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/device/analyzer(src)
src.modules += new /obj/item/device/flashlight(src)

View File

@@ -1381,7 +1381,7 @@
namecounts[name] = 1
creatures[name] = D
for (var/obj/machinery/the_singularity/S in world)
for (var/obj/machinery/singularity/S in world)
var/name = "Singularity"
if (name in names)
namecounts[name]++

View File

@@ -3,6 +3,7 @@ mob/new_player
var/datum/preferences/preferences
var/ready = 0
var/spawning = 0
invisibility = 101
@@ -80,6 +81,8 @@ mob/new_player
Logout()
ready = 0
..()
if(!spawning)
del(src)
return
verb
@@ -142,6 +145,8 @@ mob/new_player
if(alert(src,"Are you sure you wish to observe? You will not be able to play this round!","Player Setup","Yes","No") == "Yes")
var/mob/dead/observer/observer = new()
src.spawning = 1
close_spawn_windows()
var/obj/O = locate("landmark*Observer-Start")
src << "\blue Now teleporting."
@@ -397,6 +402,7 @@ mob/new_player
src << browse(dat, "window=latechoices;size=300x640;can_close=0")
proc/create_character()
src.spawning = 1
var/mob/living/carbon/human/new_character = new(src.loc)
close_spawn_windows()

View File

@@ -366,8 +366,7 @@
user << "\blue You need more welding fuel to complete this task."
return
user << "You start welding APC frame..."
W:use_fuel(2)
W:eyecheck(user)
if(W:remove_fuel(2))
playsound(src.loc, 'Welder.ogg', 50, 1)
if(do_after(user, 50))
if (emagged || malfhack || (stat & BROKEN) || opened==2)
@@ -383,6 +382,7 @@
"You cut APC frame from the wall.",\
"\red You hear welding.")
del(src)
return
else if (istype(W, /obj/item/apc_frame) && opened && emagged)
emagged = 0
if (opened==2)
@@ -810,7 +810,7 @@
else
malfai << "Hack complete. The APC is now under your exclusive control. Unable to fuse interface due to insufficient cell charge."
else
malfai << "Hack complete. The APC is now under your exclusive control. Unable to fuse interface due to lack of cell do discharge."
malfai << "Hack complete. The APC is now under your exclusive control. Unable to fuse interface due to lack of cell to discharge."
src.updateDialog()

View File

@@ -19,7 +19,10 @@
desc = "A lighting fixture."
anchored = 1
layer = 5 // They were appearing under mobs which is a little weird - Ostaf
power_usage = 0
power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list
var/on = 0 // 1 if on, 0 if off
var/on_gs = 0
var/brightness = 8 // luminosity when on, also used in power calculation
var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN
@@ -63,9 +66,23 @@
// create a new lighting fixture
/obj/machinery/light/New()
..()
switch(fitting)
if("tube")
brightness = rand(6,9)
if("bulb")
brightness = rand(3,6)
spawn(1)
update()
/obj/machinery/light/Del()
var/area/A = get_area(src)
if(A)
on = 0
// A.update_lights()
..()
// update the icon_state and luminosity of the light depending on its state
/obj/machinery/light/proc/update()
@@ -100,7 +117,12 @@
icon_state = "[base_state]-burned"
on = 0
sd_SetLuminosity(0)
power_usage = (luminosity * 20)
if(on != on_gs)
on_gs = on
// var/area/A = get_area(src)
// if(A)
// A.update_lights()
// attempt to set the light's on/off status
@@ -129,8 +151,6 @@
/obj/machinery/light/attackby(obj/item/W, mob/user)
if (istype(user, /mob/living/silicon))
return
// attempt to insert light
if(istype(W, /obj/item/weapon/light))
@@ -145,6 +165,7 @@
user << "You insert the [L.name]."
switchcount = L.switchcount
rigged = L.rigged
brightness = L.brightness
del(L)
on = has_power()
@@ -255,6 +276,7 @@
var/obj/item/weapon/light/L = new light_type()
L.status = status
L.rigged = rigged
L.brightness = src.brightness
L.loc = usr
L.layer = 20
if(user.hand)
@@ -318,8 +340,9 @@
#define LIGHTING_POWER_FACTOR 20 //20W per unit luminosity
/obj/machinery/light/process()
if(on)
use_power(luminosity * LIGHTING_POWER_FACTOR, LIGHT)
return
// if(on)
// use_power(luminosity * LIGHTING_POWER_FACTOR, LIGHT)
// called when area power state changes
@@ -402,6 +425,7 @@
var/switchcount = 0 // number of times switched
m_amt = 60
var/rigged = 0 // true if rigged to explode
var/brightness = 2 //how much light it gives off
/obj/item/weapon/light/tube
name = "light tube"
@@ -410,6 +434,7 @@
base_state = "ltube"
item_state = "c_tube"
g_amt = 200
brightness = 8
/obj/item/weapon/light/bulb
name = "light bulb"
@@ -418,6 +443,7 @@
base_state = "lbulb"
item_state = "contvapour"
g_amt = 100
brightness = 5
// update the icon state and description of the light
/obj/item/weapon/light
@@ -436,6 +462,11 @@
/obj/item/weapon/light/New()
..()
switch(name)
if("light tube")
brightness = rand(6,9)
if("light bulb")
brightness = rand(4,6)
update()

View File

@@ -0,0 +1,83 @@
/obj/machinery/power/rad_collector
name = "Radiation Collector Array"
desc = "A device which uses Hawking Radiation and plasma to produce power."
icon = 'singularity.dmi'
icon_state = "collector"
anchored = 1
density = 1
directwired = 1
var
obj/item/weapon/tank/plasma/P = null
last_power = 0
process()
if(P)
if(P.air_contents.toxins <= 0)
P.air_contents.toxins = 0
eject()
else
P.air_contents.toxins -= 0.001
return
attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/device/analyzer))
user << "\blue The [W.name] detects that [last_power]W were recently produced."
return 1
if(istype(W, /obj/item/weapon/tank/plasma))
if(!src.anchored)
user << "The [src] needs to be secured to the floor first."
return 1
if(src.P)
user << "\red There appears to already be a plasma tank loaded!"
return 1
icon_state = "collector +p"
src.P = W
W.loc = src
if (user.client)
user.client.screen -= W
user.u_equip(W)
else if(istype(W, /obj/item/weapon/crowbar))
if(P)
eject()
return 1
else if(istype(W, /obj/item/weapon/wrench))
if(P)
user << "\red Remove the plasma tank first."
return 1
playsound(src.loc, 'Ratchet.ogg', 75, 1)
src.anchored = !src.anchored
user.visible_message("[user.name] [anchored? "secures":"unsecures"] the [src.name].", \
"You [anchored? "secure":"undo"] the external bolts.", \
"You hear ratchet")
else
..()
return 1
ex_act(severity)
switch(severity)
if(2, 3)
eject()
return ..()
proc
eject()
var/obj/item/weapon/tank/plasma/Z = src.P
if (!Z)
return
Z.loc = get_turf(src)
Z.layer = initial(Z.layer)
src.P = null
icon_state = "collector"
receive_pulse(var/pulse_strength)
if(P)
var/power_produced = 0
power_produced = P.air_contents.toxins*pulse_strength*20
add_avail(power_produced)
last_power = power_produced
return
return

View File

@@ -0,0 +1,75 @@
/obj/machinery/containment_field
name = "Containment Field"
desc = "An energy field."
icon = 'singularity.dmi'
icon_state = "Contain_F"
anchored = 1
density = 0
unacidable = 1
power_usage = 0
New()
spawn(1)
src.sd_SetLuminosity(5)
attack_hand(mob/user as mob)
if(get_dist(src, user) > 1)
return 0
else
shock(user)
return 1
blob_act()
return
ex_act(severity)
return
HasProximity(atom/movable/AM as mob|obj)
if(istype(AM,/mob/living/silicon) && prob(40))
shock(AM)
return
if(istype(AM,/mob/living/carbon) && prob(50))
shock(AM)
return
proc
shock(mob/user as mob)
if(iscarbon(user))
var/datum/effects/system/spark_spread/s = new /datum/effects/system/spark_spread
s.set_up(5, 1, user.loc)
s.start()
var/shock_damage = min(rand(30,40),rand(30,40))
user.burn_skin(shock_damage)
user.updatehealth()
user.visible_message("\red [user.name] was shocked by the [src.name]!", \
"\red <B>You feel a powerful shock course through your body sending you flying!</B>", \
"\red You hear a heavy electrical crack")
var/stun = min(shock_damage, 15)
if(user.stunned < shock_damage) user.stunned = stun
if(user.weakened < 10) user.weakened = 10
user.updatehealth()
var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src)))
user.throw_at(target, 200, 4)
return
else if(issilicon(user))
var/datum/effects/system/spark_spread/s = new /datum/effects/system/spark_spread
s.set_up(5, 1, user.loc)
s.start()
var/shock_damage = rand(15,30)
user.fireloss += shock_damage
user.updatehealth()
user.visible_message("\red [user.name] was shocked by the [src.name]!", \
"\red <B>Energy pulse detected, system damaged!</B>", \
"\red You hear an electrical crack")
if(prob(20))
if(user.stunned < 2)
user.stunned = 2
return
return

View File

@@ -0,0 +1,179 @@
/obj/machinery/emitter
name = "Emitter"
desc = "A heavy duty industrial laser"
icon = 'singularity.dmi'
icon_state = "Emitter"
anchored = 0
density = 1
req_access = list(access_engine)
var/active = 0
var/fire_delay = 100
var/last_shot = 0
var/shot_number = 0
var/state = 0
var/locked = 0
power_usage = 0
/obj/machinery/emitter/New()
..()
return
/obj/machinery/emitter/update_icon()
if (active && !(stat & (NOPOWER|BROKEN)))
icon_state = "Emitter +a"
else
icon_state = "Emitter"
/obj/machinery/emitter/attack_hand(mob/user as mob)
src.add_fingerprint(user)
if(state == 2)
if(!src.locked || istype(user, /mob/living/silicon))
if(src.active==1)
src.active = 0
user << "You turn off the [src]."
src.power_usage = 0
else
src.active = 1
user << "You turn on the [src]."
src.shot_number = 0
src.fire_delay = 100
src.power_usage = 100
update_icon()
else
user << "The controls are locked!"
else
user << "The [src] needs to be firmly secured to the floor first."
return 1
/obj/machinery/emitter/emp_act()//Emitters are hardened but still might have issues
use_power(50)
if(prob(1)&&prob(1))
if(src.active)
src.active = 0
src.power_usage = 0
return 1
/obj/machinery/emitter/process()
if(stat & (NOPOWER|BROKEN))
return
if(src.state != 2)
src.active = 0
return
if(((src.last_shot + src.fire_delay) <= world.time) && (src.active == 1))
src.last_shot = world.time
if(src.shot_number < 3)
src.fire_delay = 2
src.shot_number ++
else
src.fire_delay = rand(20,100)
src.shot_number = 0
use_power(1000)
var/obj/beam/a_laser/A = new /obj/beam/a_laser( src.loc )
A.icon_state = "u_laser"
playsound(src.loc, 'emitter.ogg', 75, 1)
if(prob(35))
var/datum/effects/system/spark_spread/s = new /datum/effects/system/spark_spread
s.set_up(5, 1, src)
s.start()
A.dir = src.dir
if(src.dir == 1)//Up
A.yo = 20
A.xo = 0
else if(src.dir == 2)//Down
A.yo = -20
A.xo = 0
else if(src.dir == 4)//Right
A.yo = 0
A.xo = 20
else if(src.dir == 8)//Left
A.yo = 0
A.xo = -20
else // Any other
A.yo = -20
A.xo = 0
A.process()
/obj/machinery/emitter/attackby(obj/item/W, mob/user)
if(active)
user << "Turn off the [src] first."
return
else if(istype(W, /obj/item/weapon/wrench))
switch(state)
if(0)
state = 1
playsound(src.loc, 'Ratchet.ogg', 75, 1)
user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the external reinforcing bolts to the floor.", \
"You hear ratchet")
src.anchored = 1
if(1)
state = 0
playsound(src.loc, 'Ratchet.ogg', 75, 1)
user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
"You undo the external reinforcing bolts.", \
"You hear ratchet")
src.anchored = 0
if(2)
user << "\red The [src.name] needs to be unwelded from the floor."
return
else if(istype(W, /obj/item/weapon/weldingtool))
switch(state)
if(0)
user << "\red The [src.name] needs to be wrenched to the floor."
return
if(1)
if (W:remove_fuel(2))
playsound(src.loc, 'Welder2.ogg', 50, 1)
user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
"You start to weld the [src] to the floor.", \
"You hear welding")
if (do_after(user,20))
state = 2
user << "You weld the [src] to the floor."
else
user << "\blue You need more welding fuel to complete this task."
return
if(2)
if (W:remove_fuel(2))
playsound(src.loc, 'Welder2.ogg', 50, 1)
user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
"You start to cut the [src] free from the floor.", \
"You hear welding")
if (do_after(user,20))
state = 1
user << "You cut the [src] free from the floor."
else
user << "\blue You need more welding fuel to complete this task."
return
else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
if (src.allowed(user))
src.locked = !src.locked
user << "Controls are now [src.locked ? "locked." : "unlocked."]"
else
user << "\red Access denied."
return
else
..()
return
/obj/machinery/emitter/power_change()
..()
update_icon()

View File

@@ -0,0 +1,308 @@
/////FIELD GEN
#define field_generator_max_power 250
/obj/machinery/field_generator
name = "Field Generator"
desc = "A large thermal battery that projects a high amount of energy when powered."
icon = 'singularity.dmi'
icon_state = "Field_Gen"
anchored = 0
density = 1
req_access = list(access_engine)
power_usage = 0
var
Varedit_start = 0
Varpower = 0
active = 0
power = 20
state = 0
warming_up = 0
powerlevel = 0
list/obj/machinery/containment_field/fields
list/obj/machinery/field_generator/connected_gens
update_icon()
if (!active)
icon_state = "Field_Gen"
return
var/level = 3
switch (power)
if(0 to 60)
level = 1
if(61 to 220)
level = 2
if(221 to INFINITY)
level = 3
level = min(level,warming_up)
if (powerlevel!=level)
powerlevel = level
icon_state = "Field_Gen +a[powerlevel]"
New()
..()
fields = list()
connected_gens = list()
return
process()
if(src.Varedit_start == 1)
if(src.active == 0)
src.active = 1
src.state = 2
src.power = field_generator_max_power
src.anchored = 1
src.warming_up = 3
turn_on()
Varedit_start = 0
if(src.active == 2)
calc_power()
return
attack_hand(mob/user as mob)
if(state == 2)
if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on
if(src.active >= 1)
user << "You are unable to turn off the [src] once it is online."
return 1
else
user.visible_message("[user.name] turns on the [src.name]", \
"You turn on the [src].", \
"You hear heavy droning")
turn_on()
src.add_fingerprint(user)
else
user << "The [src] needs to be firmly secured to the floor first."
return
attackby(obj/item/W, mob/user)
if(active)
user << "The [src] needs to be off."
return
else if(istype(W, /obj/item/weapon/wrench))
switch(state)
if(0)
state = 1
playsound(src.loc, 'Ratchet.ogg', 75, 1)
user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the external reinforcing bolts to the floor.", \
"You hear ratchet")
src.anchored = 1
if(1)
state = 0
playsound(src.loc, 'Ratchet.ogg', 75, 1)
user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
"You undo the external reinforcing bolts.", \
"You hear ratchet")
src.anchored = 0
if(2)
user << "\red The [src.name] needs to be unwelded from the floor."
return
else if(istype(W, /obj/item/weapon/weldingtool))
switch(state)
if(0)
user << "\red The [src.name] needs to be wrenched to the floor."
return
if(1)
if (W:remove_fuel(2,user))
playsound(src.loc, 'Welder2.ogg', 50, 1)
user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
"You start to weld the [src] to the floor.", \
"You hear welding")
if (do_after(user,20))
state = 2
user << "You weld the field generator to the floor."
else
return
if(2)
if (W:remove_fuel(2,user))
playsound(src.loc, 'Welder2.ogg', 50, 1)
user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
"You start to cut the [src] free from the floor.", \
"You hear welding")
if (do_after(user,20))
state = 1
user << "You cut the [src] free from the floor."
else
return
else
..()
return
emp_act()
return 0
bullet_act(flag)
if (flag == PROJECTILE_BULLET)
src.power -= 100
else if (flag == PROJECTILE_WEAKBULLET)
src.power -= 50
else if (flag == PROJECTILE_LASER)
src.power += 20
else if (flag == PROJECTILE_TASER)
src.power += 5
else
src.power -= 30
update_icon()
return
Del()
src.cleanup()
..()
proc
turn_off()
src.active = 0
spawn(1)
src.cleanup()
update_icon()
turn_on()
src.active = 1
warming_up = 1
powerlevel = 0
spawn(1)
while (warming_up<3 && active)
sleep(50)
warming_up++
update_icon()
if(warming_up >= 3)
start_fields()
update_icon()
calc_power()
if(Varpower)
return
update_icon()
if(src.power > field_generator_max_power)
src.power = field_generator_max_power
var/power_draw = 0
for (var/obj/machinery/containment_field/F in fields)
if (isnull(F))
continue
power_draw++
if(draw_power(round(power_draw/2,1)))
return 1
else
for(var/mob/M in viewers(src))
M.show_message("\red The [src.name] shuts down!")
turn_off()
src.power = 0
return
draw_power(var/draw = 0,var/obj/machinery/field_generator/G = null, var/obj/machinery/field_generator/last = null)
// if(G && G == src)//Loopin, set fail
// return 0
if(src.power >= draw)//We have enough power
src.power -= draw
return 1
else//Need more power
return 0
/* draw -= src.power
src.power = 0 ill finis this up when not about to pass out
for(var/obj/machinery/field_generator/FG in connected_gens)
if(isnull(FG))
continue
if(FG == last)//We just asked you
continue
if(G)//Another gen is askin for power and we dont have it
if(FG.draw_power(draw,G,src))//Can you take the load
return 1
else
return 0
else//We are askin another for power
if(FG.draw_power(draw,src,src))
return 1
else
return 0
*/
start_fields()
if(!src.state == 2 || !anchored)
turn_off()
return
spawn(1)
setup_field(1)
spawn(2)
setup_field(2)
spawn(3)
setup_field(4)
spawn(4)
setup_field(8)
src.active = 2
setup_field(var/NSEW)
var/turf/T = src.loc
var/obj/machinery/field_generator/G
var/steps = 0
if(!NSEW)//Make sure its ran right
return
for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for another generator
T = get_step(T, NSEW)
steps += 1
G = locate(/obj/machinery/field_generator) in T
if(!isnull(G))
steps -= 1
if(!G.active)
return
break
if(isnull(G))
return
T = src.loc
for(var/dist = 0, dist < steps, dist += 1) // creates each field tile
var/field_dir = get_dir(T,get_step(G.loc, NSEW))
T = get_step(T, NSEW)
if(!locate(/obj/machinery/containment_field) in T)
var/obj/machinery/containment_field/CF = new/obj/machinery/containment_field()
fields += CF
G.fields += CF
CF.loc = T
CF.dir = field_dir
var/listcheck = 0
for(var/obj/machinery/field_generator/FG in connected_gens)
if (isnull(FG))
continue
if(FG == G)
listcheck = 1
break
if(!listcheck)
connected_gens.Add(G)
listcheck = 0
for(var/obj/machinery/field_generator/FG2 in G.connected_gens)
if (isnull(FG2))
continue
if(FG2 == src)
listcheck = 1
break
if(!listcheck)
G.connected_gens.Add(src)
cleanup()
for (var/obj/machinery/containment_field/F in fields)
if (isnull(F))
continue
del(F)
fields = list()
for(var/obj/machinery/field_generator/FG in connected_gens)
if (isnull(FG))
continue
FG.connected_gens.Remove(src)
connected_gens.Remove(FG)
connected_gens = list()

View File

@@ -0,0 +1,42 @@
/////SINGULARITY SPAWNER
/obj/machinery/the_singularitygen/
name = "Gravitational Singularity Generator"
desc = "An Odd Device which produces a Gravitational Singularity when set up."
icon = 'singularity.dmi'
icon_state = "TheSingGen"
anchored = 1
density = 1
power_usage = 0
//////////////////////Singularity gen START
/obj/machinery/the_singularitygen/process()
var/turf/T = get_turf(src)
if (singularity_is_surrounded(T))
new /obj/machinery/singularity/(T, 200)
spawn(0)
del(src)
return
/obj/machinery/the_singularitygen/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/wrench))
anchored = !anchored
playsound(src.loc, 'Ratchet.ogg', 75, 1)
if(anchored)
user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the [src.name] to the floor.", \
"You hear ratchet")
else
user.visible_message("[user.name] unsecures [src.name] from the floor.", \
"You unsecure the [src.name] from the floor.", \
"You hear ratchet")
return
return ..()
/proc/singularity_is_surrounded(turf/T)//TODO:Add a timer so we dont need this
var/checkpointC = 0
for (var/obj/X in orange(4,T)) //TODO: do we need requirement to singularity be actually _surrounded_ by field?
if(istype(X, /obj/machinery/containment_field) || istype(X, /obj/machinery/shieldwall))
checkpointC ++
return checkpointC >= 20

View File

@@ -0,0 +1,269 @@
var/global/list/uneatable = list(
/obj/machinery/singularity,
/turf/space,/obj/effects,
/obj/overlay)
/obj/machinery/singularity/
name = "Gravitational Singularity"
desc = "A Gravitational Singularity."
icon = '160x160.dmi'
icon_state = "Singularity"
anchored = 1
density = 1
layer = 6
unacidable = 1 //Don't comment this out.
power_usage = 0
var
active = 0
contained = 1 //Are we going to move around?
energy = 100 //How strong are we?
dissipate = 0 //Do we lose energy over time? TODO:Set this to 1 when/if the feederthing is finished
dissipate_delay = 5
dissipate_track = 0
dissipate_strength = 10 //How much energy do we lose?
move_self = 1 //Do we move on our own?
grav_pull = 6 //How many tiles out do we pull?
event_chance = 15 //Prob for event each tick
New(loc, var/starting_energy = 200, var/temp = 0)
src.energy = starting_energy
pixel_x = -64
pixel_y = -64
if(temp)
spawn(temp)
del(src)
..()
return
Del()
//Could have it do something bad when this happens, explode/implode or something
..()
attack_hand(mob/user as mob)
consume(user)
return 1
blob_act(severity)
return
ex_act(severity)
switch(severity)
if(1.0)
if(prob(10))
del(src)
return
if(2.0 to 3.0)
return
return
Bump(atom/A)
consume(A)
return
Bumped(atom/A)
consume(A)
return
process()
eat()
dissipate()
check_energy()
move()
if(prob(event_chance))//Chance for it to run a special event
event()
pulse()
return
proc
dissipate()
if(!dissipate)
return
if(dissipate_track >= dissipate_delay)
src.energy -= dissipate_strength
dissipate_track = 0
else
dissipate_track++
check_energy()
if(energy <= 0)
del(src)
return 0
switch(energy)
if(1000 to 1999)
for(var/obj/machinery/field_generator/F in orange(5,src))
F.turn_off()
emp_area()
toxmob()
if(2000 to INFINITY)
explosion(src.loc, 4, 8, 15, 0)
if(src)
del(src)
return 0
return 1
is_eatable(atom/X)
for (var/Type in uneatable)
if (istype(X, Type))
return 0
return 1
eat()
for (var/atom/X in orange(grav_pull,src))
if(isarea(X))
continue
if (!is_eatable(X))
continue
switch(get_dist(src,X))
if(0 to 2)
consume(X)
else if(!isturf(X))
if(!X:anchored && !istype(X,/mob/living/carbon/human))//TODO:change the boots to just anchor so we dont have to add this to everything
step_towards(X,src)
else if(istype(X,/mob/living/carbon/human))
var/mob/living/carbon/human/H = X
if(istype(H.shoes,/obj/item/clothing/shoes/magboots))
var/obj/item/clothing/shoes/magboots/M = H.shoes
if(M.magpulse)
continue
step_towards(H,src)
return
consume(var/atom/A)
var/gain = 0
if (!is_eatable(A))
return
if (istype(A,/mob/living))//Mobs get gibbed
gain = 20
if(istype(A,/mob/living/carbon/human))
if(A:mind)
if((A:mind:assigned_role == "Station Engineer") || (A:mind:assigned_role == "Chief Engineer") )
gain = 100
A:gib()
else if(istype(A,/obj/))
A:ex_act(1.0)
if(A) del(A)
gain = 2
else if(isturf(A))
var/turf/T = A
if(T.intact)
for(var/obj/O in T.contents)
if(O.level != 1)
continue
if(O.invisibility == 101)
src.consume(O)
A:ReplaceWithSpace()
gain = 2
src.energy += gain
return
move(var/movement_dir = 0)
if(!movement_dir == 1 || !movement_dir == 2 || !movement_dir == 4 || !movement_dir == 8)
movement_dir = pick(NORTH, SOUTH, EAST, WEST)
var/turf/T = null
switch(movement_dir)
if(NORTH)
T = locate(src.x,src.y+3,src.z)
if(SOUTH)
T = locate(src.x,src.y-3,src.z)
if(EAST)
T =locate(src.x+3,src.y,src.z)
if(WEST)
T = locate(src.x-3,src.y,src.z)
if(can_move(T))
spawn(0)
step(src, movement_dir)
can_move(var/turf/T)
if(!T)
return 0
if(locate(/obj/machinery/containment_field) in T)
return 0
else if(locate(/obj/machinery/field_generator) in T)
var/obj/machinery/field_generator/G = locate(/obj/machinery/field_generator) in T
if(G && G.active)
return 0
return 1
event()
var/numb = pick(1,2,3,4,5,6)
switch(numb)
if(1)//EMP
emp_area()
if(2,3)//tox damage all carbon mobs in area
toxmob()
if(4)//Stun mobs who lack optic scanners
mezzer()
else
//do nothing
return
toxmob()
var/toxrange = 8
if (src.energy>100)
toxrange+=round((src.energy-100)/100)
var/toxloss = 4
var/radiation = 5
if (src.energy>150)
toxloss += round(((src.energy-150)/50)*4,1)
radiation += round(((src.energy-150)/50)*5,1)
for(var/mob/living/carbon/M in view(toxrange, src.loc))
if(istype(M,/mob/living/carbon/human))
if(M:wear_suit) //TODO: check for radiation protection
toxloss = round(toxloss/2,1)
radiation = round(radiation/2,1)
M.toxloss += toxloss
M.radiation += radiation
M.updatehealth()
M << "\red You feel odd."
return
mezzer()
for(var/mob/living/carbon/M in oviewers(8, src))
if(istype(M,/mob/living/carbon/human))
if(istype(M:glasses,/obj/item/clothing/glasses/meson))
M << "\blue You look directly into The [src.name], good thing you had your protective eyewear on!"
return
M << "\red You look directly into The [src.name] and feel weak."
if (M:stunned < 3)
M.stunned = 3
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] stares blankly at The []!</B>", M, src), 1)
return
emp_area()
var/turf/myturf = get_turf(src)
var/obj/overlay/pulse = new/obj/overlay ( myturf )
pulse.icon = 'effects.dmi'
pulse.icon_state = "emppulse"
pulse.name = "emp pulse"
pulse.anchored = 1
spawn(20)
del(pulse)
for (var/atom/X in orange(8,src))
X.emp_act()
return
pulse()
for(var/obj/machinery/power/rad_collector/R in orange(15,src))
if(istype(R,/obj/machinery/power/rad_collector))
R.receive_pulse(energy)
return

View File

@@ -1,6 +1,37 @@
// the SMES
// stores power
#define SMESMAXCHARGELEVEL 200000
#define SMESMAXOUTPUT 200000
/obj/machinery/power/smes/magical
name = "magical power storage unit"
desc = "A high-capacity superconducting magnetic energy storage (SMES) unit. Magically produces power."
process()
capacity = INFINITY
charge = INFINITY
..()
/obj/machinery/power/smes
name = "power storage unit"
desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."
icon_state = "smes"
density = 1
anchored = 1
var/output = 50000
var/lastout = 0
var/loaddemand = 0
var/capacity = 5e6
var/charge = 1e6
var/charging = 0
var/chargemode = 0
var/chargecount = 0
var/chargelevel = 50000
var/online = 1
var/n_tag = null
var/obj/machinery/power/terminal/terminal = null
/obj/machinery/power/smes/New()
..()

View File

@@ -43,6 +43,8 @@
return
/obj/machinery/power/solar/proc/update_solar_exposure()
if(!sun)
return
if(obscured)
sunfrac = 0
return

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -102,6 +102,7 @@
#define FILE_DIR "code/modules/mob/new_player"
#define FILE_DIR "code/modules/power"
#define FILE_DIR "code/modules/power/antimatter"
#define FILE_DIR "code/modules/power/singularity"
#define FILE_DIR "code/unused"
#define FILE_DIR "code/WorkInProgress"
#define FILE_DIR "code/WorkInProgress/computer2"
@@ -197,7 +198,6 @@
#include "code\datums\diseases\plasmatoid.dm"
#include "code\datums\diseases\rhumba_beat.dm"
#include "code\datums\diseases\robotic_transformation.dm"
#include "code\datums\diseases\t_virus.dm"
#include "code\datums\diseases\wizarditis.dm"
#include "code\datums\diseases\xeno_transformation.dm"
#include "code\datums\spells\blind.dm"
@@ -316,6 +316,7 @@
#include "code\game\gamemodes\cult\cult.dm"
#include "code\game\gamemodes\deathmatch\deathmatch.dm"
#include "code\game\gamemodes\events\clang.dm"
#include "code\game\gamemodes\events\dust.dm"
#include "code\game\gamemodes\extended\extended.dm"
#include "code\game\gamemodes\malfunction\Malf_Modules.dm"
#include "code\game\gamemodes\malfunction\malfunction.dm"
@@ -596,6 +597,7 @@
#include "code\modules\admin\verbs\debug.dm"
#include "code\modules\admin\verbs\diagnostics.dm"
#include "code\modules\admin\verbs\grillify.dm"
#include "code\modules\admin\verbs\massmodvar.dm"
#include "code\modules\admin\verbs\modifyvariables.dm"
#include "code\modules\admin\verbs\onlyone.dm"
#include "code\modules\admin\verbs\playsound.dm"
@@ -721,6 +723,12 @@
#include "code\modules\power\antimatter\computer.dm"
#include "code\modules\power\antimatter\engine.dm"
#include "code\modules\power\antimatter\fuel.dm"
#include "code\modules\power\singularity\collector.dm"
#include "code\modules\power\singularity\containment_field.dm"
#include "code\modules\power\singularity\emitter.dm"
#include "code\modules\power\singularity\field_generator.dm"
#include "code\modules\power\singularity\generator.dm"
#include "code\modules\power\singularity\singularity.dm"
#include "code\WorkInProgress\BrokenInhands.dm"
#include "code\WorkInProgress\buildmode.dm"
#include "code\WorkInProgress\Cameras.dm"
@@ -735,21 +743,6 @@
#include "code\WorkInProgress\KeelinsStuff.dm"
#include "code\WorkInProgress\mining.dm"
#include "code\WorkInProgress\NewBan.dm"
#include "code\WorkInProgress\computer2\airlock_control.dm"
#include "code\WorkInProgress\computer2\arcade.dm"
#include "code\WorkInProgress\computer2\base_program.dm"
#include "code\WorkInProgress\computer2\buildandrepair.dm"
#include "code\WorkInProgress\computer2\computerII.dm"
#include "code\WorkInProgress\computer2\filebrowse.dm"
#include "code\WorkInProgress\computer2\med_rec.dm"
#include "code\WorkInProgress\computer2\messenger.dm"
#include "code\WorkInProgress\computer2\peripherals.dm"
#include "code\WorkInProgress\pda2\base_os.dm"
#include "code\WorkInProgress\pda2\base_program.dm"
#include "code\WorkInProgress\pda2\pda2.dm"
#include "code\WorkInProgress\pda2\record_progs.dm"
#include "code\WorkInProgress\pda2\scanners.dm"
#include "code\WorkInProgress\pda2\smallprogs.dm"
#include "code\WorkInProgress\recycling\conveyor.dm"
#include "code\WorkInProgress\recycling\disposal-construction.dm"
#include "code\WorkInProgress\recycling\disposal.dm"