mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-07-20 20:52:52 +01:00
Merge remote-tracking branch 'polaris/master' into pixel_projectiles
This commit is contained in:
@@ -125,24 +125,24 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/atmospherics/binary/circulator/verb/rotate_clockwise()
|
||||
set name = "Rotate Circulator Clockwise"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]."
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/binary/circulator/verb/rotate_counterclockwise()
|
||||
set name = "Rotate Circulator Counterclockwise"
|
||||
set category = "Object"
|
||||
set name = "Rotate Circulator (Clockwise)"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]."
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/binary/circulator/verb/rotate_anticlockwise()
|
||||
set category = "Object"
|
||||
set name = "Rotate Circulator (Counterclockwise)"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, -90))
|
||||
desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]."
|
||||
@@ -20,209 +20,210 @@
|
||||
var/datum/pipe_network/network1
|
||||
var/datum/pipe_network/network2
|
||||
|
||||
New()
|
||||
..()
|
||||
air_in.volume = 200
|
||||
air_out.volume = 800
|
||||
volume_ratio = air_in.volume / (air_in.volume + air_out.volume)
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
/obj/machinery/atmospherics/pipeturbine/New()
|
||||
..()
|
||||
air_in.volume = 200
|
||||
air_out.volume = 800
|
||||
volume_ratio = air_in.volume / (air_in.volume + air_out.volume)
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
initialize_directions = EAST|WEST
|
||||
if(SOUTH)
|
||||
initialize_directions = EAST|WEST
|
||||
if(EAST)
|
||||
initialize_directions = NORTH|SOUTH
|
||||
if(WEST)
|
||||
initialize_directions = NORTH|SOUTH
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine/Destroy()
|
||||
. = ..()
|
||||
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
qdel(network1)
|
||||
if(node2)
|
||||
node2.disconnect(src)
|
||||
qdel(network2)
|
||||
|
||||
node1 = null
|
||||
node2 = null
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine/process()
|
||||
..()
|
||||
if(anchored && !(stat&BROKEN))
|
||||
kin_energy *= 1 - kin_loss
|
||||
dP = max(air_in.return_pressure() - air_out.return_pressure(), 0)
|
||||
if(dP > 10)
|
||||
kin_energy += 1/ADIABATIC_EXPONENT * dP * air_in.volume * (1 - volume_ratio**ADIABATIC_EXPONENT) * efficiency
|
||||
air_in.temperature *= volume_ratio**ADIABATIC_EXPONENT
|
||||
|
||||
var/datum/gas_mixture/air_all = new
|
||||
air_all.volume = air_in.volume + air_out.volume
|
||||
air_all.merge(air_in.remove_ratio(1))
|
||||
air_all.merge(air_out.remove_ratio(1))
|
||||
|
||||
air_in.merge(air_all.remove(volume_ratio))
|
||||
air_out.merge(air_all)
|
||||
|
||||
update_icon()
|
||||
|
||||
if (network1)
|
||||
network1.update = 1
|
||||
if (network2)
|
||||
network2.update = 1
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine/update_icon()
|
||||
overlays.Cut()
|
||||
if (dP > 10)
|
||||
overlays += image('icons/obj/pipeturbine.dmi', "moto-turb")
|
||||
if (kin_energy > 100000)
|
||||
overlays += image('icons/obj/pipeturbine.dmi', "low-turb")
|
||||
if (kin_energy > 500000)
|
||||
overlays += image('icons/obj/pipeturbine.dmi', "med-turb")
|
||||
if (kin_energy > 1000000)
|
||||
overlays += image('icons/obj/pipeturbine.dmi', "hi-turb")
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(W.is_wrench())
|
||||
anchored = !anchored
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "secure" : "unsecure"] the bolts holding \the [src] to the floor.</span>")
|
||||
|
||||
if(anchored)
|
||||
if(dir & (NORTH|SOUTH))
|
||||
initialize_directions = EAST|WEST
|
||||
if(SOUTH)
|
||||
initialize_directions = EAST|WEST
|
||||
if(EAST)
|
||||
initialize_directions = NORTH|SOUTH
|
||||
if(WEST)
|
||||
else if(dir & (EAST|WEST))
|
||||
initialize_directions = NORTH|SOUTH
|
||||
|
||||
Destroy()
|
||||
. = ..()
|
||||
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
qdel(network1)
|
||||
if(node2)
|
||||
node2.disconnect(src)
|
||||
qdel(network2)
|
||||
|
||||
node1 = null
|
||||
node2 = null
|
||||
|
||||
process()
|
||||
..()
|
||||
if(anchored && !(stat&BROKEN))
|
||||
kin_energy *= 1 - kin_loss
|
||||
dP = max(air_in.return_pressure() - air_out.return_pressure(), 0)
|
||||
if(dP > 10)
|
||||
kin_energy += 1/ADIABATIC_EXPONENT * dP * air_in.volume * (1 - volume_ratio**ADIABATIC_EXPONENT) * efficiency
|
||||
air_in.temperature *= volume_ratio**ADIABATIC_EXPONENT
|
||||
|
||||
var/datum/gas_mixture/air_all = new
|
||||
air_all.volume = air_in.volume + air_out.volume
|
||||
air_all.merge(air_in.remove_ratio(1))
|
||||
air_all.merge(air_out.remove_ratio(1))
|
||||
|
||||
air_in.merge(air_all.remove(volume_ratio))
|
||||
air_out.merge(air_all)
|
||||
|
||||
update_icon()
|
||||
|
||||
if (network1)
|
||||
network1.update = 1
|
||||
if (network2)
|
||||
network2.update = 1
|
||||
|
||||
update_icon()
|
||||
overlays.Cut()
|
||||
if (dP > 10)
|
||||
overlays += image('icons/obj/pipeturbine.dmi', "moto-turb")
|
||||
if (kin_energy > 100000)
|
||||
overlays += image('icons/obj/pipeturbine.dmi', "low-turb")
|
||||
if (kin_energy > 500000)
|
||||
overlays += image('icons/obj/pipeturbine.dmi', "med-turb")
|
||||
if (kin_energy > 1000000)
|
||||
overlays += image('icons/obj/pipeturbine.dmi', "hi-turb")
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(W.is_wrench())
|
||||
anchored = !anchored
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "secure" : "unsecure"] the bolts holding \the [src] to the floor.</span>")
|
||||
|
||||
if(anchored)
|
||||
if(dir & (NORTH|SOUTH))
|
||||
initialize_directions = EAST|WEST
|
||||
else if(dir & (EAST|WEST))
|
||||
initialize_directions = NORTH|SOUTH
|
||||
|
||||
atmos_init()
|
||||
build_network()
|
||||
if (node1)
|
||||
node1.atmos_init()
|
||||
node1.build_network()
|
||||
if (node2)
|
||||
node2.atmos_init()
|
||||
node2.build_network()
|
||||
else
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
qdel(network1)
|
||||
if(node2)
|
||||
node2.disconnect(src)
|
||||
qdel(network2)
|
||||
|
||||
node1 = null
|
||||
node2 = null
|
||||
|
||||
atmos_init()
|
||||
build_network()
|
||||
if (node1)
|
||||
node1.atmos_init()
|
||||
node1.build_network()
|
||||
if (node2)
|
||||
node2.atmos_init()
|
||||
node2.build_network()
|
||||
else
|
||||
..()
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
qdel(network1)
|
||||
if(node2)
|
||||
node2.disconnect(src)
|
||||
qdel(network2)
|
||||
|
||||
verb/rotate_clockwise()
|
||||
set category = "Object"
|
||||
set name = "Rotate Circulator (Clockwise)"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, -90))
|
||||
|
||||
|
||||
verb/rotate_anticlockwise()
|
||||
set category = "Object"
|
||||
set name = "Rotate Circulator (Counterclockwise)"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
|
||||
//Goddamn copypaste from binary base class because atmospherics machinery API is not damn flexible
|
||||
get_neighbor_nodes_for_init()
|
||||
return list(node1, node2)
|
||||
|
||||
network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
|
||||
if(reference == node1)
|
||||
network1 = new_network
|
||||
|
||||
else if(reference == node2)
|
||||
network2 = new_network
|
||||
|
||||
if(new_network.normal_members.Find(src))
|
||||
return 0
|
||||
|
||||
new_network.normal_members += src
|
||||
|
||||
return null
|
||||
|
||||
atmos_init()
|
||||
if(node1 && node2) return
|
||||
|
||||
var/node2_connect = turn(dir, -90)
|
||||
var/node1_connect = turn(dir, 90)
|
||||
|
||||
for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
|
||||
if(target.initialize_directions & get_dir(target,src))
|
||||
node1 = target
|
||||
break
|
||||
|
||||
for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
|
||||
if(target.initialize_directions & get_dir(target,src))
|
||||
node2 = target
|
||||
break
|
||||
|
||||
build_network()
|
||||
if(!network1 && node1)
|
||||
network1 = new /datum/pipe_network()
|
||||
network1.normal_members += src
|
||||
network1.build_network(node1, src)
|
||||
|
||||
if(!network2 && node2)
|
||||
network2 = new /datum/pipe_network()
|
||||
network2.normal_members += src
|
||||
network2.build_network(node2, src)
|
||||
|
||||
|
||||
return_network(obj/machinery/atmospherics/reference)
|
||||
build_network()
|
||||
|
||||
if(reference==node1)
|
||||
return network1
|
||||
|
||||
if(reference==node2)
|
||||
return network2
|
||||
|
||||
return null
|
||||
|
||||
reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
|
||||
if(network1 == old_network)
|
||||
network1 = new_network
|
||||
if(network2 == old_network)
|
||||
network2 = new_network
|
||||
|
||||
return 1
|
||||
|
||||
return_network_air(datum/pipe_network/reference)
|
||||
var/list/results = list()
|
||||
|
||||
if(network1 == reference)
|
||||
results += air_in
|
||||
if(network2 == reference)
|
||||
results += air_out
|
||||
|
||||
return results
|
||||
|
||||
disconnect(obj/machinery/atmospherics/reference)
|
||||
if(reference==node1)
|
||||
qdel(network1)
|
||||
node1 = null
|
||||
|
||||
else if(reference==node2)
|
||||
qdel(network2)
|
||||
node2 = null
|
||||
|
||||
return null
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine/verb/rotate_clockwise()
|
||||
set name = "Rotate Turbine Clockwise"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine/verb/rotate_counterclockwise()
|
||||
set name = "Rotate Turbine Counterclockwise"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
|
||||
//Goddamn copypaste from binary base class because atmospherics machinery API is not damn flexible
|
||||
/obj/machinery/atmospherics/pipeturbine/get_neighbor_nodes_for_init()
|
||||
return list(node1, node2)
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
|
||||
if(reference == node1)
|
||||
network1 = new_network
|
||||
|
||||
else if(reference == node2)
|
||||
network2 = new_network
|
||||
|
||||
if(new_network.normal_members.Find(src))
|
||||
return 0
|
||||
|
||||
new_network.normal_members += src
|
||||
|
||||
return null
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine/atmos_init()
|
||||
if(node1 && node2)
|
||||
return
|
||||
|
||||
var/node2_connect = turn(dir, -90)
|
||||
var/node1_connect = turn(dir, 90)
|
||||
|
||||
for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
|
||||
if(target.initialize_directions & get_dir(target,src))
|
||||
node1 = target
|
||||
break
|
||||
|
||||
for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
|
||||
if(target.initialize_directions & get_dir(target,src))
|
||||
node2 = target
|
||||
break
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine/build_network()
|
||||
if(!network1 && node1)
|
||||
network1 = new /datum/pipe_network()
|
||||
network1.normal_members += src
|
||||
network1.build_network(node1, src)
|
||||
|
||||
if(!network2 && node2)
|
||||
network2 = new /datum/pipe_network()
|
||||
network2.normal_members += src
|
||||
network2.build_network(node2, src)
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine/return_network(obj/machinery/atmospherics/reference)
|
||||
build_network()
|
||||
|
||||
if(reference==node1)
|
||||
return network1
|
||||
|
||||
if(reference==node2)
|
||||
return network2
|
||||
|
||||
return null
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
|
||||
if(network1 == old_network)
|
||||
network1 = new_network
|
||||
if(network2 == old_network)
|
||||
network2 = new_network
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine/return_network_air(datum/pipe_network/reference)
|
||||
var/list/results = list()
|
||||
|
||||
if(network1 == reference)
|
||||
results += air_in
|
||||
if(network2 == reference)
|
||||
results += air_out
|
||||
|
||||
return results
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine/disconnect(obj/machinery/atmospherics/reference)
|
||||
if(reference==node1)
|
||||
qdel(network1)
|
||||
node1 = null
|
||||
|
||||
else if(reference==node2)
|
||||
qdel(network2)
|
||||
node2 = null
|
||||
|
||||
return null
|
||||
|
||||
|
||||
/obj/machinery/power/turbinemotor
|
||||
@@ -236,54 +237,53 @@
|
||||
var/kin_to_el_ratio = 0.1 //How much kinetic energy will be taken from turbine and converted into electricity
|
||||
var/obj/machinery/atmospherics/pipeturbine/turbine
|
||||
|
||||
New()
|
||||
..()
|
||||
spawn(1)
|
||||
updateConnection()
|
||||
|
||||
proc/updateConnection()
|
||||
turbine = null
|
||||
if(src.loc && anchored)
|
||||
turbine = locate(/obj/machinery/atmospherics/pipeturbine) in get_step(src,dir)
|
||||
if (turbine.stat & (BROKEN) || !turbine.anchored || turn(turbine.dir,180) != dir)
|
||||
turbine = null
|
||||
|
||||
process()
|
||||
/obj/machinery/power/turbinemotor/New()
|
||||
..()
|
||||
spawn(1)
|
||||
updateConnection()
|
||||
if(!turbine || !anchored || stat & (BROKEN))
|
||||
return
|
||||
|
||||
var/power_generated = kin_to_el_ratio * turbine.kin_energy
|
||||
turbine.kin_energy -= power_generated
|
||||
add_avail(power_generated)
|
||||
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(W.is_wrench())
|
||||
anchored = !anchored
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
/obj/machinery/power/turbinemotor/proc/updateConnection()
|
||||
turbine = null
|
||||
if(src.loc && anchored)
|
||||
turbine = locate(/obj/machinery/atmospherics/pipeturbine) in get_step(src,dir)
|
||||
if (turbine.stat & (BROKEN) || !turbine.anchored || turn(turbine.dir,180) != dir)
|
||||
turbine = null
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "secure" : "unsecure"] the bolts holding \the [src] to the floor.</span>")
|
||||
updateConnection()
|
||||
else
|
||||
..()
|
||||
|
||||
verb/rotate_clock()
|
||||
set category = "Object"
|
||||
set name = "Rotate Motor Clockwise"
|
||||
set src in view(1)
|
||||
/obj/machinery/power/turbinemotor/process()
|
||||
updateConnection()
|
||||
if(!turbine || !anchored || stat & (BROKEN))
|
||||
return
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
var/power_generated = kin_to_el_ratio * turbine.kin_energy
|
||||
turbine.kin_energy -= power_generated
|
||||
add_avail(power_generated)
|
||||
|
||||
src.set_dir(turn(src.dir, -90))
|
||||
/obj/machinery/power/turbinemotor/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(W.is_wrench())
|
||||
anchored = !anchored
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
turbine = null
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "secure" : "unsecure"] the bolts holding \the [src] to the floor.</span>")
|
||||
updateConnection()
|
||||
else
|
||||
..()
|
||||
|
||||
verb/rotate_anticlock()
|
||||
set category = "Object"
|
||||
set name = "Rotate Motor Counterclockwise"
|
||||
set src in view(1)
|
||||
/obj/machinery/power/turbinemotor/verb/rotate_clockwise()
|
||||
set name = "Rotate Motor Clockwise"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
|
||||
/obj/machinery/power/turbinemotor/verb/rotate_counterclockwise()
|
||||
set name = "Rotate Motor Counterclockwise"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
@@ -306,3 +306,9 @@ var/global/list/##LIST_NAME = list();\
|
||||
|
||||
#define RCD_SHEETS_PER_MATTER_UNIT 4 // Each physical material sheet is worth four matter units.
|
||||
#define RCD_MAX_CAPACITY 30 * RCD_SHEETS_PER_MATTER_UNIT
|
||||
|
||||
// Radiation 'levels'. Used for the geiger counter, for visuals and sound. They are in different files so this goes here.
|
||||
#define RAD_LEVEL_LOW 0.01 // Around the level at which radiation starts to become harmful
|
||||
#define RAD_LEVEL_MODERATE 10
|
||||
#define RAD_LEVEL_HIGH 25
|
||||
#define RAD_LEVEL_VERY_HIGH 50
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
#define WEATHER_WINDY "windy"
|
||||
#define WEATHER_HOT "hot"
|
||||
#define WEATHER_BLOOD_MOON "blood moon" // For admin fun or cult later on.
|
||||
#define WEATHER_EMBERFALL "emberfall" // More adminbuse, from TG. Harmless.
|
||||
#define WEATHER_ASH_STORM "ash storm" // Ripped from TG, like the above. Less harmless.
|
||||
#define WEATHER_FALLOUT "fallout" // Modified emberfall, actually harmful. Admin only.
|
||||
|
||||
#define MOON_PHASE_NEW_MOON "new moon"
|
||||
#define MOON_PHASE_WAXING_CRESCENT "waxing crescent"
|
||||
|
||||
@@ -3,3 +3,4 @@ GLOBAL_PROTECT(admins)
|
||||
GLOBAL_LIST_EMPTY(deadmins) //all ckeys who have used the de-admin verb.
|
||||
GLOBAL_LIST_EMPTY(stealthminID)
|
||||
GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client
|
||||
GLOBAL_LIST_EMPTY(players_by_zlevel)
|
||||
|
||||
@@ -62,6 +62,11 @@
|
||||
#define to_file(file_entry, source_var) file_entry << source_var
|
||||
#define from_file(file_entry, target_var) file_entry >> target_var
|
||||
|
||||
// From TG, might be useful to have.
|
||||
// Didn't port SEND_TEXT() since to_chat() appears to serve the same purpose.
|
||||
#define DIRECT_OUTPUT(A, B) A << B
|
||||
#define SEND_IMAGE(target, image) DIRECT_OUTPUT(target, image)
|
||||
#define SEND_SOUND(target, sound) DIRECT_OUTPUT(target, sound)
|
||||
|
||||
#define CanInteract(user, state) (CanUseTopic(user, state) == STATUS_INTERACTIVE)
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ SUBSYSTEM_DEF(mapping)
|
||||
/datum/controller/subsystem/mapping/Initialize(timeofday)
|
||||
if(subsystem_initialized)
|
||||
return
|
||||
world.max_z_changed() // This is to set up the player z-level list, maxz hasn't actually changed (probably)
|
||||
maploader = new()
|
||||
load_map_templates()
|
||||
|
||||
|
||||
+1
-1
@@ -59,7 +59,7 @@
|
||||
return ..()
|
||||
|
||||
/datum/beam/proc/Draw()
|
||||
if(QDELETED(target) || !QDELETED(origin))
|
||||
if(QDELETED(target) || QDELETED(origin))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -166,7 +166,7 @@
|
||||
// Use sparingly
|
||||
/world/proc/PushUsr(mob/M, datum/callback/CB)
|
||||
var/temp = usr
|
||||
testing("PushUsr() in use")
|
||||
// testing("PushUsr() in use")
|
||||
usr = M
|
||||
. = CB.Invoke()
|
||||
usr = temp
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
output_atoms (list of atoms) The destination(s) for the sounds
|
||||
|
||||
mid_sounds (list or soundfile) Since this can be either a list or a single soundfile you can have random sounds. May contain further lists but must contain a soundfile at the end.
|
||||
mid_length (num) The length to wait between playing mid_sounds
|
||||
|
||||
start_sound (soundfile) Played before starting the mid_sounds loop
|
||||
start_length (num) How long to wait before starting the main loop after playing start_sound
|
||||
|
||||
end_sound (soundfile) The sound played after the main loop has concluded
|
||||
|
||||
chance (num) Chance per loop to play a mid_sound
|
||||
volume (num) Sound output volume
|
||||
muted (bool) Private. Used to stop the sound loop.
|
||||
max_loops (num) The max amount of loops to run for.
|
||||
direct (bool) If true plays directly to provided atoms instead of from them
|
||||
opacity_check (bool) If true, things behind walls/opaque things won't hear the sounds.
|
||||
pref_check (type) If set to a /datum/client_preference type, will check if the hearer has that preference active before playing it to them.
|
||||
*/
|
||||
/datum/looping_sound
|
||||
var/list/atom/output_atoms
|
||||
var/mid_sounds
|
||||
var/mid_length
|
||||
var/start_sound
|
||||
var/start_length
|
||||
var/end_sound
|
||||
var/chance
|
||||
var/volume = 100
|
||||
var/max_loops
|
||||
var/direct
|
||||
var/opacity_check
|
||||
var/pref_check
|
||||
|
||||
var/timerid
|
||||
|
||||
/datum/looping_sound/New(list/_output_atoms=list(), start_immediately=FALSE, _direct=FALSE)
|
||||
if(!mid_sounds)
|
||||
WARNING("A looping sound datum was created without sounds to play.")
|
||||
return
|
||||
|
||||
output_atoms = _output_atoms
|
||||
direct = _direct
|
||||
|
||||
if(start_immediately)
|
||||
start()
|
||||
|
||||
/datum/looping_sound/Destroy()
|
||||
stop()
|
||||
output_atoms = null
|
||||
return ..()
|
||||
|
||||
/datum/looping_sound/proc/start(atom/add_thing)
|
||||
if(add_thing)
|
||||
output_atoms |= add_thing
|
||||
if(timerid)
|
||||
return
|
||||
on_start()
|
||||
|
||||
/datum/looping_sound/proc/stop(atom/remove_thing)
|
||||
if(remove_thing)
|
||||
output_atoms -= remove_thing
|
||||
if(!timerid)
|
||||
return
|
||||
on_stop()
|
||||
deltimer(timerid)
|
||||
timerid = null
|
||||
|
||||
/datum/looping_sound/proc/sound_loop(starttime)
|
||||
if(max_loops && world.time >= starttime + mid_length * max_loops)
|
||||
stop()
|
||||
return
|
||||
if(!chance || prob(chance))
|
||||
play(get_sound(starttime))
|
||||
if(!timerid)
|
||||
timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_STOPPABLE | TIMER_LOOP)
|
||||
|
||||
/datum/looping_sound/proc/play(soundfile)
|
||||
var/list/atoms_cache = output_atoms
|
||||
var/sound/S = sound(soundfile)
|
||||
if(direct)
|
||||
S.channel = open_sound_channel()
|
||||
S.volume = volume
|
||||
for(var/i in 1 to atoms_cache.len)
|
||||
var/atom/thing = atoms_cache[i]
|
||||
if(direct)
|
||||
if(ismob(thing))
|
||||
var/mob/M = thing
|
||||
if(!M.is_preference_enabled(pref_check))
|
||||
continue
|
||||
SEND_SOUND(thing, S)
|
||||
else
|
||||
playsound(thing, S, volume, ignore_walls = !opacity_check, preference = pref_check)
|
||||
|
||||
/datum/looping_sound/proc/get_sound(starttime, _mid_sounds)
|
||||
if(!_mid_sounds)
|
||||
. = mid_sounds
|
||||
else
|
||||
. = _mid_sounds
|
||||
while(!isfile(.) && !isnull(.))
|
||||
. = pickweight(.)
|
||||
|
||||
/datum/looping_sound/proc/on_start()
|
||||
var/start_wait = 1 // On TG this is 0, however it needs to be 1 to work around an issue.
|
||||
if(start_sound)
|
||||
play(start_sound)
|
||||
start_wait = start_length
|
||||
addtimer(CALLBACK(src, .proc/sound_loop), start_wait)
|
||||
|
||||
/datum/looping_sound/proc/on_stop()
|
||||
if(end_sound)
|
||||
play(end_sound)
|
||||
@@ -0,0 +1,29 @@
|
||||
/datum/looping_sound/geiger
|
||||
mid_sounds = list(
|
||||
list('sound/items/geiger/low1.ogg'=1, 'sound/items/geiger/low2.ogg'=1, 'sound/items/geiger/low3.ogg'=1, 'sound/items/geiger/low4.ogg'=1),
|
||||
list('sound/items/geiger/med1.ogg'=1, 'sound/items/geiger/med2.ogg'=1, 'sound/items/geiger/med3.ogg'=1, 'sound/items/geiger/med4.ogg'=1),
|
||||
list('sound/items/geiger/high1.ogg'=1, 'sound/items/geiger/high2.ogg'=1, 'sound/items/geiger/high3.ogg'=1, 'sound/items/geiger/high4.ogg'=1),
|
||||
list('sound/items/geiger/ext1.ogg'=1, 'sound/items/geiger/ext2.ogg'=1, 'sound/items/geiger/ext3.ogg'=1, 'sound/items/geiger/ext4.ogg'=1)
|
||||
)
|
||||
mid_length = 1 SECOND
|
||||
volume = 25
|
||||
var/last_radiation
|
||||
|
||||
/datum/looping_sound/geiger/get_sound(starttime)
|
||||
var/danger
|
||||
switch(last_radiation)
|
||||
if(0 to RAD_LEVEL_MODERATE)
|
||||
danger = 1
|
||||
if(RAD_LEVEL_MODERATE to RAD_LEVEL_HIGH)
|
||||
danger = 2
|
||||
if(RAD_LEVEL_HIGH to RAD_LEVEL_VERY_HIGH)
|
||||
danger = 3
|
||||
if(RAD_LEVEL_VERY_HIGH to INFINITY)
|
||||
danger = 4
|
||||
else
|
||||
return null
|
||||
return ..(starttime, mid_sounds[danger])
|
||||
|
||||
/datum/looping_sound/geiger/stop()
|
||||
. = ..()
|
||||
last_radiation = 0
|
||||
@@ -0,0 +1,46 @@
|
||||
/datum/looping_sound/showering
|
||||
start_sound = 'sound/machines/shower/shower_start.ogg'
|
||||
start_length = 2
|
||||
mid_sounds = list('sound/machines/shower/shower_mid1.ogg'=1,'sound/machines/shower/shower_mid2.ogg'=1,'sound/machines/shower/shower_mid3.ogg'=1)
|
||||
mid_length = 10
|
||||
end_sound = 'sound/machines/shower/shower_end.ogg'
|
||||
volume = 20
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/supermatter
|
||||
mid_sounds = list('sound/machines/sm/supermatter1.ogg'=1,'sound/machines/sm/supermatter2.ogg'=1,'sound/machines/sm/supermatter3.ogg'=1)
|
||||
mid_length = 10
|
||||
volume = 1
|
||||
pref_check = /datum/client_preference/supermatter_hum
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/generator
|
||||
start_sound = 'sound/machines/generator/generator_start.ogg'
|
||||
start_length = 4
|
||||
mid_sounds = list('sound/machines/generator/generator_mid1.ogg'=1, 'sound/machines/generator/generator_mid2.ogg'=1, 'sound/machines/generator/generator_mid3.ogg'=1)
|
||||
mid_length = 4
|
||||
end_sound = 'sound/machines/generator/generator_end.ogg'
|
||||
volume = 40
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/datum/looping_sound/deep_fryer
|
||||
start_sound = 'sound/machines/fryer/deep_fryer_immerse.ogg' //my immersions
|
||||
start_length = 10
|
||||
mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1)
|
||||
mid_length = 2
|
||||
end_sound = 'sound/machines/fryer/deep_fryer_emerge.ogg'
|
||||
volume = 15
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/microwave
|
||||
start_sound = 'sound/machines/microwave/microwave-start.ogg'
|
||||
start_length = 10
|
||||
mid_sounds = list('sound/machines/microwave/microwave-mid1.ogg'=10, 'sound/machines/microwave/microwave-mid2.ogg'=1)
|
||||
mid_length = 10
|
||||
end_sound = 'sound/machines/microwave/microwave-end.ogg'
|
||||
volume = 90
|
||||
@@ -0,0 +1,79 @@
|
||||
/datum/looping_sound/weather
|
||||
pref_check = /datum/client_preference/weather_sounds
|
||||
|
||||
/datum/looping_sound/weather/outside_blizzard
|
||||
mid_sounds = list(
|
||||
'sound/effects/weather/snowstorm/outside/active_mid1.ogg' = 1,
|
||||
'sound/effects/weather/snowstorm/outside/active_mid1.ogg' = 1,
|
||||
'sound/effects/weather/snowstorm/outside/active_mid1.ogg' = 1
|
||||
)
|
||||
mid_length = 8 SECONDS
|
||||
start_sound = 'sound/effects/weather/snowstorm/outside/active_start.ogg'
|
||||
start_length = 13 SECONDS
|
||||
end_sound = 'sound/effects/weather/snowstorm/outside/active_end.ogg'
|
||||
volume = 80
|
||||
|
||||
/datum/looping_sound/weather/inside_blizzard
|
||||
mid_sounds = list(
|
||||
'sound/effects/weather/snowstorm/inside/active_mid1.ogg' = 1,
|
||||
'sound/effects/weather/snowstorm/inside/active_mid2.ogg' = 1,
|
||||
'sound/effects/weather/snowstorm/inside/active_mid3.ogg' = 1
|
||||
)
|
||||
mid_length = 8 SECONDS
|
||||
start_sound = 'sound/effects/weather/snowstorm/inside/active_start.ogg'
|
||||
start_length = 13 SECONDS
|
||||
end_sound = 'sound/effects/weather/snowstorm/inside/active_end.ogg'
|
||||
volume = 60
|
||||
|
||||
/datum/looping_sound/weather/outside_snow
|
||||
mid_sounds = list(
|
||||
'sound/effects/weather/snowstorm/outside/weak_mid1.ogg' = 1,
|
||||
'sound/effects/weather/snowstorm/outside/weak_mid2.ogg' = 1,
|
||||
'sound/effects/weather/snowstorm/outside/weak_mid3.ogg' = 1
|
||||
)
|
||||
mid_length = 8 SECONDS
|
||||
start_sound = 'sound/effects/weather/snowstorm/outside/weak_start.ogg'
|
||||
start_length = 13 SECONDS
|
||||
end_sound = 'sound/effects/weather/snowstorm/outside/weak_end.ogg'
|
||||
volume = 50
|
||||
|
||||
/datum/looping_sound/weather/inside_snow
|
||||
mid_sounds = list(
|
||||
'sound/effects/weather/snowstorm/inside/weak_mid1.ogg' = 1,
|
||||
'sound/effects/weather/snowstorm/inside/weak_mid2.ogg' = 1,
|
||||
'sound/effects/weather/snowstorm/inside/weak_mid3.ogg' = 1
|
||||
)
|
||||
mid_length = 8 SECONDS
|
||||
start_sound = 'sound/effects/weather/snowstorm/inside/weak_start.ogg'
|
||||
start_length = 13 SECONDS
|
||||
end_sound = 'sound/effects/weather/snowstorm/inside/weak_end.ogg'
|
||||
volume = 30
|
||||
|
||||
/datum/looping_sound/weather/wind
|
||||
mid_sounds = list(
|
||||
'sound/effects/weather/wind/wind_2_1.ogg' = 1,
|
||||
'sound/effects/weather/wind/wind_2_2.ogg' = 1,
|
||||
'sound/effects/weather/wind/wind_3_1.ogg' = 1,
|
||||
'sound/effects/weather/wind/wind_4_1.ogg' = 1,
|
||||
'sound/effects/weather/wind/wind_4_2.ogg' = 1,
|
||||
'sound/effects/weather/wind/wind_5_1.ogg' = 1
|
||||
)
|
||||
mid_length = 10 SECONDS // The lengths for the files vary, but the longest is ten seconds, so this will make it sound like intermittent wind.
|
||||
volume = 50
|
||||
|
||||
// Don't have special sounds so we just make it quieter indoors.
|
||||
/datum/looping_sound/weather/wind/indoors
|
||||
volume = 30
|
||||
|
||||
/datum/looping_sound/weather/rain
|
||||
mid_sounds = list(
|
||||
'sound/effects/weather/acidrain_mid.ogg' = 1
|
||||
)
|
||||
mid_length = 15 SECONDS // The lengths for the files vary, but the longest is ten seconds, so this will make it sound like intermittent wind.
|
||||
start_sound = 'sound/effects/weather/acidrain_start.ogg'
|
||||
start_length = 13 SECONDS
|
||||
end_sound = 'sound/effects/weather/acidrain_end.ogg'
|
||||
volume = 50
|
||||
|
||||
/datum/looping_sound/weather/rain/indoors
|
||||
volume = 30
|
||||
@@ -0,0 +1,16 @@
|
||||
// Observer Pattern Implementation: Z_Moved
|
||||
// Registration type: /atom/movable
|
||||
//
|
||||
// Raised when: An /atom/movable instance has changed z-levels by any means.
|
||||
//
|
||||
// Arguments that the called proc should expect:
|
||||
// /atom/movable/moving_instance: The instance that moved
|
||||
// old_z: The z number before the move.
|
||||
// new_z: The z number after the move.
|
||||
|
||||
|
||||
GLOBAL_DATUM_INIT(z_moved_event, /decl/observ/z_moved, new)
|
||||
|
||||
/decl/observ/z_moved
|
||||
name = "Z_Moved"
|
||||
expected_type = /atom/movable
|
||||
@@ -59,7 +59,6 @@
|
||||
|
||||
if(!newloc.Enter(src, src.loc))
|
||||
return
|
||||
|
||||
// Past this is the point of no return
|
||||
var/atom/oldloc = loc
|
||||
var/area/oldarea = get_area(oldloc)
|
||||
@@ -158,6 +157,8 @@
|
||||
Moved(oldloc, direct)
|
||||
|
||||
//Polaris stuff
|
||||
if(oldloc && (oldloc.z != z)) // If we changed z-levels, tell the AM that.
|
||||
on_z_change(oldloc.z, z)
|
||||
move_speed = world.time - l_move_time
|
||||
l_move_time = world.time
|
||||
m_flag = 1
|
||||
@@ -472,4 +473,11 @@
|
||||
|
||||
/atom/movable/proc/adjust_rotation(new_rotation)
|
||||
icon_rotation = new_rotation
|
||||
update_transform()
|
||||
update_transform()
|
||||
|
||||
// Called when something changes z-levels.
|
||||
/atom/movable/proc/on_z_change(old_z, new_z)
|
||||
GLOB.z_moved_event.raise_event(src, old_z, new_z)
|
||||
for(var/item in src) // Notify contents of Z-transition. This can be overriden IF we know the items contents do not care.
|
||||
var/atom/movable/AM = item
|
||||
AM.on_z_change(old_z, new_z)
|
||||
|
||||
@@ -44,7 +44,7 @@ var/global/list/narsie_list = list()
|
||||
..()
|
||||
if(announce)
|
||||
world << "<font size='15' color='red'><b>[uppertext(name)] HAS RISEN</b></font>"
|
||||
world << sound('sound/effects/wind/wind_5_1.ogg')
|
||||
world << sound('sound/effects/weather/wind/wind_5_1.ogg')
|
||||
|
||||
narsie_spawn_animation()
|
||||
|
||||
|
||||
@@ -206,7 +206,7 @@ var/list/sacrificed = list()
|
||||
if(cultists.len >= 9)
|
||||
if(!narsie_cometh)//so we don't initiate Hell more than one time.
|
||||
world << "<font size='15' color='red'><b>THE VEIL HAS BEEN SHATTERED!</b></font>"
|
||||
world << sound('sound/effects/wind/wind_5_1.ogg')
|
||||
world << sound('sound/effects/weather/wind/wind_5_1.ogg')
|
||||
|
||||
SetUniversalState(/datum/universal_state/hell)
|
||||
narsie_cometh = 1
|
||||
|
||||
@@ -31,14 +31,14 @@
|
||||
"Shotgun Pumping" = 'sound/weapons/shotgunpump.ogg',
|
||||
"Flash" = 'sound/weapons/flash.ogg',
|
||||
"Bite" = 'sound/weapons/bite.ogg',
|
||||
"Gun Firing" = 'sound/weapons/gunshot.ogg',
|
||||
"Desert Eagle Firing" = 'sound/weapons/deagle.ogg',
|
||||
"Rifle Firing" = 'sound/weapons/rifleshot.ogg',
|
||||
"Sniper Rifle Firing" = 'sound/weapons/svd_shot.ogg',
|
||||
"AT Rifle Firing" = 'sound/weapons/sniper.ogg',
|
||||
"Shotgun Firing" = 'sound/weapons/shotgun.ogg',
|
||||
"Handgun Firing" = 'sound/weapons/gunshot3.ogg',
|
||||
"Machinegun Firing" = 'sound/weapons/machinegun.ogg',
|
||||
"Gun Firing" = 'sound/weapons/Gunshot1.ogg',
|
||||
"Desert Eagle Firing" = 'sound/weapons/Gunshot_deagle.ogg',
|
||||
"Rifle Firing" = 'sound/weapons/Gunshot_generic_rifle.ogg',
|
||||
"Sniper Rifle Firing" = 'sound/weapons/Gunshot_sniper.ogg',
|
||||
"AT Rifle Firing" = 'sound/weapons/Gunshot_cannon.ogg',
|
||||
"Shotgun Firing" = 'sound/weapons/Gunshot_shotgun.ogg',
|
||||
"Handgun Firing" = 'sound/weapons/Gunshot2.ogg',
|
||||
"Machinegun Firing" = 'sound/weapons/Gunshot_machinegun.ogg',
|
||||
"Rocket Launcher Firing"= 'sound/weapons/rpg.ogg',
|
||||
"Taser Firing" = 'sound/weapons/Taser.ogg',
|
||||
"Laser Gun Firing" = 'sound/weapons/laser.ogg',
|
||||
@@ -92,4 +92,4 @@
|
||||
M.Paralyse(4)
|
||||
else
|
||||
M.make_jittery(50)
|
||||
M << "<font color='red' size='7'><b>HONK</b></font>"
|
||||
M << "<font color='red' size='7'><b>HONK</b></font>"
|
||||
|
||||
@@ -569,7 +569,7 @@
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/structure/frame/verb/rotate()
|
||||
/obj/structure/frame/verb/rotate_counterclockwise()
|
||||
set name = "Rotate Frame Counter-Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
@@ -581,14 +581,14 @@
|
||||
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
|
||||
return 0
|
||||
|
||||
set_dir(turn(dir, 90))
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
|
||||
to_chat(usr, "<span class='notice'>You rotate the [src] to face [dir2text(dir)]!</span>")
|
||||
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/frame/verb/revrotate()
|
||||
/obj/structure/frame/verb/rotate_clockwise()
|
||||
set name = "Rotate Frame Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
@@ -600,7 +600,7 @@
|
||||
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
|
||||
return 0
|
||||
|
||||
set_dir(turn(dir, 270))
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
|
||||
to_chat(usr, "<span class='notice'>You rotate the [src] to face [dir2text(dir)]!</span>")
|
||||
|
||||
|
||||
@@ -115,15 +115,15 @@ Buildable meters
|
||||
var/obj/machinery/atmospherics/fakeA = pipe_type
|
||||
icon_state = "[initial(fakeA.pipe_state)][mirrored ? "m" : ""]"
|
||||
|
||||
/obj/item/pipe/verb/rotate()
|
||||
/obj/item/pipe/verb/rotate_clockwise()
|
||||
set category = "Object"
|
||||
set name = "Rotate Pipe"
|
||||
set name = "Rotate Pipe Clockwise"
|
||||
set src in view(1)
|
||||
|
||||
if ( usr.stat || usr.restrained() || !usr.canmove )
|
||||
return
|
||||
|
||||
set_dir(turn(src.dir, -90)) // Rotate clockwise
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
fixdir()
|
||||
|
||||
// If you want to disable pipe dir changing when pulled, uncomment this
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "mecha_uac2"
|
||||
equip_cooldown = 60 // 6 seconds
|
||||
projectile = /obj/item/projectile/bullet/cannon
|
||||
fire_sound = 'sound/weapons/cannon.ogg'
|
||||
fire_sound = 'sound/weapons/Gunshot_cannon.ogg'
|
||||
projectiles = 1
|
||||
projectile_energy_cost = 1000
|
||||
salvageable = 0 // We don't want players ripping this off a dead mech. Could potentially be a prize for beating it if Devs bless me and someone offers a nerf idea.
|
||||
|
||||
@@ -297,7 +297,7 @@
|
||||
description_info = "This weapon cannot be fired indoors, underground, or on-station."
|
||||
icon_state = "mecha_mortar"
|
||||
equip_cooldown = 30
|
||||
fire_sound = 'sound/weapons/cannon.ogg'
|
||||
fire_sound = 'sound/weapons/Gunshot_cannon.ogg'
|
||||
fire_volume = 100
|
||||
projectiles = 3
|
||||
deviation = 0.6
|
||||
@@ -320,7 +320,7 @@
|
||||
icon_state = "mecha_scatter"
|
||||
equip_cooldown = 20
|
||||
projectile = /obj/item/projectile/bullet/pellet/shotgun/flak
|
||||
fire_sound = 'sound/weapons/gunshot/shotgun.ogg'
|
||||
fire_sound = 'sound/weapons/Gunshot_shotgun.ogg'
|
||||
fire_volume = 80
|
||||
projectiles = 40
|
||||
projectiles_per_shot = 4
|
||||
@@ -346,7 +346,7 @@
|
||||
icon_state = "mecha_uac2"
|
||||
equip_cooldown = 10
|
||||
projectile = /obj/item/projectile/bullet/pistol/medium
|
||||
fire_sound = 'sound/weapons/machinegun.ogg'
|
||||
fire_sound = 'sound/weapons/Gunshot_machinegun.ogg'
|
||||
projectiles = 30 //10 bursts, matching the Scattershot's 10. Also, conveniently, doesn't eat your powercell when reloading like 300 bullets does.
|
||||
projectiles_per_shot = 3
|
||||
deviation = 0.3
|
||||
@@ -524,7 +524,7 @@
|
||||
icon_state = "mecha_drac3"
|
||||
equip_cooldown = 20
|
||||
projectile = /obj/item/projectile/bullet/incendiary
|
||||
fire_sound = 'sound/weapons/machinegun.ogg'
|
||||
fire_sound = 'sound/weapons/Gunshot_machinegun.ogg'
|
||||
projectiles = 30
|
||||
projectiles_per_shot = 2
|
||||
deviation = 0.4
|
||||
|
||||
@@ -32,4 +32,4 @@
|
||||
/obj/item/weapon/banner/virgov
|
||||
name = "\improper VirGov banner"
|
||||
icon_state = "banner-virgov"
|
||||
desc = "A banner with the symbol of the local government, the Vir Governmental Authority, also known as SifGov."
|
||||
desc = "A banner with the symbol of the local government, the Vir Governmental Authority, also known as VirGov."
|
||||
@@ -54,15 +54,19 @@
|
||||
interval_upper_bound = 15 SECONDS
|
||||
|
||||
/obj/effect/map_effect/interval/sound_emitter/geiger
|
||||
sounds_to_play = list("geiger")
|
||||
interval_lower_bound = 2 SECONDS
|
||||
interval_upper_bound = 2 SECONDS
|
||||
|
||||
/obj/effect/map_effect/interval/sound_emitter/geiger_weak
|
||||
sounds_to_play = list("geiger_weak")
|
||||
sounds_to_play = list('sound/items/geiger/low1.ogg', 'sound/items/geiger/low2.ogg', 'sound/items/geiger/low3.ogg', 'sound/items/geiger/low4.ogg')
|
||||
interval_lower_bound = 1 SECOND
|
||||
interval_upper_bound = 1 SECOND
|
||||
|
||||
/obj/effect/map_effect/interval/sound_emitter/geiger/med
|
||||
sounds_to_play = list('sound/items/geiger/med1.ogg', 'sound/items/geiger/med2.ogg', 'sound/items/geiger/med3.ogg', 'sound/items/geiger/med4.ogg')
|
||||
|
||||
/obj/effect/map_effect/interval/sound_emitter/geiger/high
|
||||
sounds_to_play = list('sound/items/geiger/high1.ogg', 'sound/items/geiger/high2.ogg', 'sound/items/geiger/high3.ogg', 'sound/items/geiger/high4.ogg')
|
||||
|
||||
/obj/effect/map_effect/interval/sound_emitter/geiger/ext
|
||||
sounds_to_play = list('sound/items/geiger/ext1.ogg', 'sound/items/geiger/ext2.ogg', 'sound/items/geiger/ext3.ogg', 'sound/items/geiger/ext4.ogg')
|
||||
|
||||
/obj/effect/map_effect/interval/sound_emitter/punching
|
||||
sounds_to_play = list("punch")
|
||||
interval_lower_bound = 5
|
||||
@@ -73,20 +77,18 @@
|
||||
interval_lower_bound = 5 SECONDS
|
||||
interval_upper_bound = 10 SECONDS
|
||||
|
||||
/obj/effect/map_effect/interval/sound_emitter/distant_explosions
|
||||
/obj/effect/map_effect/interval/sound_emitter/explosions/distant
|
||||
sounds_to_play = list('sound/effects/explosionfar.ogg')
|
||||
interval_lower_bound = 5 SECONDS
|
||||
interval_upper_bound = 10 SECONDS
|
||||
|
||||
/obj/effect/map_effect/interval/sound_emitter/ballistic_gunfight
|
||||
sounds_to_play = list(
|
||||
'sound/weapons/gunshot.ogg',
|
||||
'sound/weapons/deagle.ogg',
|
||||
'sound/weapons/rifleshot.ogg',
|
||||
'sound/weapons/sniper.ogg',
|
||||
'sound/weapons/shotgun.ogg',
|
||||
'sound/weapons/gunshot3.ogg',
|
||||
'sound/weapons/machinegun.ogg'
|
||||
'sound/weapons/Gunshot1.ogg',
|
||||
'sound/weapons/Gunshot_deagle.ogg',
|
||||
'sound/weapons/Gunshot_generic_rifle.ogg',
|
||||
'sound/weapons/Gunshot_sniper.ogg',
|
||||
'sound/weapons/Gunshot_shotgun.ogg',
|
||||
'sound/weapons/Gunshot3.ogg',
|
||||
'sound/weapons/Gunshot_machinegun.ogg'
|
||||
)
|
||||
interval_lower_bound = 5
|
||||
interval_upper_bound = 2 SECONDS
|
||||
|
||||
@@ -24,9 +24,9 @@
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
|
||||
if(W.attack_verb.len)
|
||||
visible_message("<span class='warning'>\The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]</span>")
|
||||
visible_message("<span class='warning'>\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]</span>")
|
||||
else
|
||||
visible_message("<span class='warning'>\The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
|
||||
visible_message("<span class='warning'>\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
|
||||
|
||||
var/damage = W.force / 4.0
|
||||
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
#define RAD_LEVEL_LOW 0.01 // Around the level at which radiation starts to become harmful
|
||||
#define RAD_LEVEL_MODERATE 10
|
||||
#define RAD_LEVEL_HIGH 25
|
||||
#define RAD_LEVEL_VERY_HIGH 50
|
||||
|
||||
//Geiger counter
|
||||
//Rewritten version of TG's geiger counter
|
||||
//I opted to show exact radiation levels
|
||||
@@ -15,12 +10,16 @@
|
||||
w_class = ITEMSIZE_SMALL
|
||||
var/scanning = 0
|
||||
var/radiation_count = 0
|
||||
var/datum/looping_sound/geiger/soundloop
|
||||
|
||||
/obj/item/device/geiger/New()
|
||||
/obj/item/device/geiger/Initialize()
|
||||
START_PROCESSING(SSobj, src)
|
||||
soundloop = new(list(src), FALSE)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/geiger/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/geiger/process()
|
||||
@@ -31,6 +30,7 @@
|
||||
return
|
||||
radiation_count = radiation_repository.get_rads_at_turf(get_turf(src))
|
||||
update_icon()
|
||||
update_sound()
|
||||
|
||||
/obj/item/device/geiger/examine(mob/user)
|
||||
..(user)
|
||||
@@ -44,18 +44,24 @@
|
||||
if(amount > radiation_count)
|
||||
radiation_count = amount
|
||||
|
||||
var/sound = "geiger"
|
||||
if(amount < 5)
|
||||
sound = "geiger_weak"
|
||||
playsound(src, sound, between(10, 10 + (radiation_count * 4), 100), 0)
|
||||
if(sound == "geiger_weak") // A weak geiger sound every two seconds sounds too infrequent.
|
||||
spawn(1 SECOND)
|
||||
playsound(src, sound, between(10, 10 + (radiation_count * 4), 100), 0)
|
||||
update_icon()
|
||||
update_sound()
|
||||
|
||||
/obj/item/device/geiger/proc/update_sound()
|
||||
var/datum/looping_sound/geiger/loop = soundloop
|
||||
if(!scanning)
|
||||
loop.stop()
|
||||
return
|
||||
if(!radiation_count)
|
||||
loop.stop()
|
||||
return
|
||||
loop.last_radiation = radiation_count
|
||||
loop.start()
|
||||
|
||||
/obj/item/device/geiger/attack_self(var/mob/user)
|
||||
scanning = !scanning
|
||||
update_icon()
|
||||
update_sound()
|
||||
to_chat(user, "<span class='notice'>\icon[src] You switch [scanning ? "on" : "off"] \the [src].</span>")
|
||||
|
||||
/obj/item/device/geiger/update_icon()
|
||||
@@ -76,8 +82,3 @@
|
||||
icon_state = "geiger_on_4"
|
||||
if(RAD_LEVEL_VERY_HIGH to INFINITY)
|
||||
icon_state = "geiger_on_5"
|
||||
|
||||
#undef RAD_LEVEL_LOW
|
||||
#undef RAD_LEVEL_MODERATE
|
||||
#undef RAD_LEVEL_HIGH
|
||||
#undef RAD_LEVEL_VERY_HIGH
|
||||
@@ -25,7 +25,7 @@
|
||||
/obj/item/latexballon/proc/burst()
|
||||
if (!air_contents)
|
||||
return
|
||||
playsound(src, 'sound/weapons/Gunshot.ogg', 100, 1)
|
||||
playsound(src, 'sound/weapons/Gunshot_old.ogg', 100, 1)
|
||||
icon_state = "latexballon_bursted"
|
||||
item_state = "lgloves"
|
||||
loc.assume_air(air_contents)
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
|
||||
/obj/item/weapon/tank/emergency/oxygen/New()
|
||||
..()
|
||||
src.air_contents.adjust_gas("oxygen", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
src.air_contents.adjust_gas("oxygen", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
|
||||
return
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
|
||||
/obj/item/weapon/tank/emergency/nitrogen/New()
|
||||
..()
|
||||
src.air_contents.adjust_gas("nitrogen", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
src.air_contents.adjust_gas("nitrogen", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
|
||||
/obj/item/weapon/tank/emergency/nitrogen/double
|
||||
name = "double emergency nitrogen tank"
|
||||
@@ -183,7 +183,7 @@
|
||||
|
||||
/obj/item/weapon/tank/emergency/phoron/New()
|
||||
..()
|
||||
src.air_contents.adjust_gas("phoron", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
src.air_contents.adjust_gas("phoron", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
|
||||
/obj/item/weapon/tank/emergency/phoron/double
|
||||
name = "double emergency phoron tank"
|
||||
|
||||
@@ -65,7 +65,7 @@ var/list/global/tank_gauge_cache = list()
|
||||
src.air_contents = new /datum/gas_mixture()
|
||||
src.air_contents.volume = volume //liters
|
||||
src.air_contents.temperature = T20C
|
||||
START_PROCESSING(SSobj, src)
|
||||
START_PROCESSING(SSobj, src)
|
||||
update_gauge()
|
||||
return
|
||||
|
||||
@@ -464,7 +464,7 @@ var/list/global/tank_gauge_cache = list()
|
||||
if(!T)
|
||||
return
|
||||
T.assume_air(air_contents)
|
||||
playsound(get_turf(src), 'sound/weapons/shotgun.ogg', 20, 1)
|
||||
playsound(get_turf(src), 'sound/weapons/Gunshot_shotgun.ogg', 20, 1)
|
||||
visible_message("\icon[src] <span class='danger'>\The [src] flies apart!</span>", "<span class='warning'>You hear a bang!</span>")
|
||||
T.hotspot_expose(air_contents.temperature, 70, 1)
|
||||
|
||||
|
||||
@@ -34,10 +34,10 @@
|
||||
else
|
||||
on = 1
|
||||
icon_state = "echair1"
|
||||
usr << "<span class='notice'>You switch [on ? "on" : "off"] [src].</span>"
|
||||
to_chat(usr, "<span class='notice'>You switch [on ? "on" : "off"] [src].</span>")
|
||||
return
|
||||
|
||||
/obj/structure/bed/chair/e_chair/rotate()
|
||||
/obj/structure/bed/chair/e_chair/rotate_clockwise()
|
||||
..()
|
||||
overlays.Cut()
|
||||
overlays += image('icons/obj/objects.dmi', src, "echair_over", MOB_LAYER + 1, dir) //there's probably a better way of handling this, but eh. -Pete
|
||||
|
||||
@@ -115,23 +115,20 @@
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/gravemarker/verb/rotate()
|
||||
set name = "Rotate Grave Marker"
|
||||
/obj/structure/gravemarker/verb/rotate_clockwise()
|
||||
set name = "Rotate Grave Marker Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if(anchored)
|
||||
return
|
||||
if(config.ghost_interaction)
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
return
|
||||
else
|
||||
if(ismouse(usr))
|
||||
return
|
||||
if(!usr || !isturf(usr.loc))
|
||||
return
|
||||
if(usr.stat || usr.restrained())
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
return
|
||||
if(!usr || !isturf(usr.loc))
|
||||
return
|
||||
if(usr.stat || usr.restrained())
|
||||
return
|
||||
if(ismouse(usr) || (isobserver(usr) && !config.ghost_interaction))
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
return
|
||||
@@ -210,12 +210,12 @@
|
||||
else
|
||||
tempo = sanitize_tempo(5) // default 120 BPM
|
||||
if(lines.len > INSTRUMENT_MAX_LINE_NUMBER)
|
||||
usr << "Too many lines!"
|
||||
to_chat(usr, "Too many lines!")
|
||||
lines.Cut(INSTRUMENT_MAX_LINE_NUMBER+1)
|
||||
var/linenum = 1
|
||||
for(var/l in lines)
|
||||
if(lentext(l) > INSTRUMENT_MAX_LINE_LENGTH)
|
||||
usr << "Line [linenum] too long!"
|
||||
to_chat(usr, "Line [linenum] too long!")
|
||||
lines.Remove(l)
|
||||
else
|
||||
linenum++
|
||||
@@ -316,22 +316,18 @@
|
||||
song = null
|
||||
..()
|
||||
|
||||
/obj/structure/device/piano/verb/rotate()
|
||||
set name = "Rotate Piano"
|
||||
/obj/structure/device/piano/verb/rotate_clockwise()
|
||||
set name = "Rotate Piano Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if(istype(usr,/mob/living/simple_mob/animal/passive/mouse))
|
||||
if(ismouse(usr))
|
||||
return
|
||||
else if(!usr || !isturf(usr.loc))
|
||||
if(!usr || !isturf(usr.loc) || usr.stat || usr.restrained())
|
||||
return
|
||||
else if(usr.stat || usr.restrained())
|
||||
return
|
||||
else if (istype(usr,/mob/observer/ghost) && !config.ghost_interaction)
|
||||
return
|
||||
else
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
if (isobserver(usr) && !config.ghost_interaction)
|
||||
return
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
|
||||
/obj/structure/device/piano/attack_hand(mob/user)
|
||||
if(!user.IsAdvancedToolUser())
|
||||
@@ -350,7 +346,7 @@
|
||||
if(O.is_wrench())
|
||||
if(anchored)
|
||||
playsound(src.loc, O.usesound, 50, 1)
|
||||
user << "<span class='notice'>You begin to loosen \the [src]'s casters...</span>"
|
||||
to_chat(user, "<span class='notice'>You begin to loosen \the [src]'s casters...</span>")
|
||||
if (do_after(user, 40 * O.toolspeed))
|
||||
user.visible_message( \
|
||||
"[user] loosens \the [src]'s casters.", \
|
||||
@@ -359,7 +355,7 @@
|
||||
src.anchored = 0
|
||||
else
|
||||
playsound(src.loc, O.usesound, 50, 1)
|
||||
user << "<span class='notice'>You begin to tighten \the [src] to the floor...</span>"
|
||||
to_chat(user, "<span class='notice'>You begin to tighten \the [src] to the floor...</span>")
|
||||
if (do_after(user, 20 * O.toolspeed))
|
||||
user.visible_message( \
|
||||
"[user] tightens \the [src]'s casters.", \
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
if (WEST)
|
||||
overlays += image ('icons/obj/railing.dmi', src, "mcorneroverlay", pixel_y = 32)
|
||||
|
||||
/obj/structure/railing/verb/rotate()
|
||||
/obj/structure/railing/verb/rotate_counterclockwise()
|
||||
set name = "Rotate Railing Counter-Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
@@ -141,11 +141,11 @@
|
||||
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
|
||||
return 0
|
||||
|
||||
set_dir(turn(dir, 90))
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/structure/railing/verb/revrotate()
|
||||
/obj/structure/railing/verb/rotate_clockwise()
|
||||
set name = "Rotate Railing Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
@@ -160,7 +160,7 @@
|
||||
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
|
||||
return 0
|
||||
|
||||
set_dir(turn(dir, -90))
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
update_icon()
|
||||
return
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
if(!padding_material && istype(W, /obj/item/assembly/shock_kit))
|
||||
var/obj/item/assembly/shock_kit/SK = W
|
||||
if(!SK.status)
|
||||
user << "<span class='notice'>\The [SK] is not ready to be attached!</span>"
|
||||
to_chat(user, "<span class='notice'>\The [SK] is not ready to be attached!</span>")
|
||||
return
|
||||
user.drop_item()
|
||||
var/obj/structure/bed/chair/e_chair/E = new (src.loc, material.name)
|
||||
@@ -34,7 +34,7 @@
|
||||
if(has_buckled_mobs())
|
||||
..()
|
||||
else
|
||||
rotate()
|
||||
rotate_clockwise()
|
||||
return
|
||||
|
||||
/obj/structure/bed/chair/post_buckle_mob()
|
||||
@@ -67,24 +67,19 @@
|
||||
var/mob/living/L = A
|
||||
L.set_dir(dir)
|
||||
|
||||
/obj/structure/bed/chair/verb/rotate()
|
||||
set name = "Rotate Chair"
|
||||
/obj/structure/bed/chair/verb/rotate_clockwise()
|
||||
set name = "Rotate Chair Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if(config.ghost_interaction)
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
if(!usr || !isturf(usr.loc))
|
||||
return
|
||||
if(usr.stat || usr.restrained())
|
||||
return
|
||||
if(ismouse(usr) || (isobserver(usr) && !config.ghost_interaction))
|
||||
return
|
||||
else
|
||||
if(istype(usr,/mob/living/simple_mob/animal/passive/mouse))
|
||||
return
|
||||
if(!usr || !isturf(usr.loc))
|
||||
return
|
||||
if(usr.stat || usr.restrained())
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
return
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
|
||||
/obj/structure/bed/chair/shuttle
|
||||
name = "chair"
|
||||
|
||||
@@ -131,10 +131,16 @@
|
||||
var/watertemp = "normal" //freezing, normal, or boiling
|
||||
var/is_washing = 0
|
||||
var/list/temperature_settings = list("normal" = 310, "boiling" = T0C+100, "freezing" = T0C)
|
||||
var/datum/looping_sound/showering/soundloop
|
||||
|
||||
/obj/machinery/shower/New()
|
||||
..()
|
||||
/obj/machinery/shower/Initialize()
|
||||
create_reagents(50)
|
||||
soundloop = new(list(src), FALSE)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/shower/Destroy()
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
//add heat controls? when emagged, you can freeze to death in it?
|
||||
|
||||
@@ -151,11 +157,14 @@
|
||||
on = !on
|
||||
update_icon()
|
||||
if(on)
|
||||
soundloop.start()
|
||||
if (M.loc == loc)
|
||||
wash(M)
|
||||
process_heat(M)
|
||||
for (var/atom/movable/G in src.loc)
|
||||
G.clean_blood()
|
||||
else
|
||||
soundloop.stop()
|
||||
|
||||
/obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(I.type == /obj/item/device/analyzer)
|
||||
|
||||
@@ -273,8 +273,8 @@ obj/structure/windoor_assembly/Destroy()
|
||||
name += "[secure ? "secure " : ""]windoor assembly[created_name ? " ([created_name])" : ""]"
|
||||
|
||||
//Rotates the windoor assembly clockwise
|
||||
/obj/structure/windoor_assembly/verb/revrotate()
|
||||
set name = "Rotate Windoor Assembly"
|
||||
/obj/structure/windoor_assembly/verb/rotate_clockwise()
|
||||
set name = "Rotate Windoor Assembly Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
|
||||
@@ -27,24 +27,24 @@
|
||||
. = ..(user)
|
||||
|
||||
if(health == maxhealth)
|
||||
user << "<span class='notice'>It looks fully intact.</span>"
|
||||
to_chat(user, "<span class='notice'>It looks fully intact.</span>")
|
||||
else
|
||||
var/perc = health / maxhealth
|
||||
if(perc > 0.75)
|
||||
user << "<span class='notice'>It has a few cracks.</span>"
|
||||
to_chat(user, "<span class='notice'>It has a few cracks.</span>")
|
||||
else if(perc > 0.5)
|
||||
user << "<span class='warning'>It looks slightly damaged.</span>"
|
||||
to_chat(user, "<span class='warning'>It looks slightly damaged.</span>")
|
||||
else if(perc > 0.25)
|
||||
user << "<span class='warning'>It looks moderately damaged.</span>"
|
||||
to_chat(user, "<span class='warning'>It looks moderately damaged.</span>")
|
||||
else
|
||||
user << "<span class='danger'>It looks heavily damaged.</span>"
|
||||
to_chat(user, "<span class='danger'>It looks heavily damaged.</span>")
|
||||
if(silicate)
|
||||
if (silicate < 30)
|
||||
user << "<span class='notice'>It has a thin layer of silicate.</span>"
|
||||
to_chat(user, "<span class='notice'>It has a thin layer of silicate.</span>")
|
||||
else if (silicate < 70)
|
||||
user << "<span class='notice'>It is covered in silicate.</span>"
|
||||
to_chat(user, "<span class='notice'>It is covered in silicate.</span>")
|
||||
else
|
||||
user << "<span class='notice'>There is a thick layer of silicate covering it.</span>"
|
||||
to_chat(user, "<span class='notice'>There is a thick layer of silicate covering it.</span>")
|
||||
|
||||
/obj/structure/window/proc/take_damage(var/damage = 0, var/sound_effect = 1)
|
||||
var/initialhealth = health
|
||||
@@ -260,26 +260,26 @@
|
||||
state = 3 - state
|
||||
update_nearby_icons()
|
||||
playsound(src, W.usesound, 75, 1)
|
||||
user << (state == 1 ? "<span class='notice'>You have unfastened the window from the frame.</span>" : "<span class='notice'>You have fastened the window to the frame.</span>")
|
||||
to_chat(user, "<span class='notice'>You have [state ? "un" : ""]fastened the window [state ? "from" : "to"] the frame.</span>")
|
||||
else if(reinf && state == 0)
|
||||
anchored = !anchored
|
||||
update_nearby_icons()
|
||||
update_verbs()
|
||||
playsound(src, W.usesound, 75, 1)
|
||||
user << (anchored ? "<span class='notice'>You have fastened the frame to the floor.</span>" : "<span class='notice'>You have unfastened the frame from the floor.</span>")
|
||||
to_chat(user, "<span class='notice'>You have [anchored ? "" : "un"]fastened the frame [anchored ? "to" : "from"] the floor.</span>")
|
||||
else if(!reinf)
|
||||
anchored = !anchored
|
||||
update_nearby_icons()
|
||||
update_verbs()
|
||||
playsound(src, W.usesound, 75, 1)
|
||||
user << (anchored ? "<span class='notice'>You have fastened the window to the floor.</span>" : "<span class='notice'>You have unfastened the window.</span>")
|
||||
to_chat(user, "<span class='notice'>You have [anchored ? "" : "un"]fastened the window [anchored ? "to" : "from"] the floor.</span>")
|
||||
else if(W.is_crowbar() && reinf && state <= 1)
|
||||
state = 1 - state
|
||||
playsound(src, W.usesound, 75, 1)
|
||||
user << (state ? "<span class='notice'>You have pried the window into the frame.</span>" : "<span class='notice'>You have pried the window out of the frame.</span>")
|
||||
to_chat(user, "<span class='notice'>You have pried the window [state ? "into" : "out of"] the frame.</span>")
|
||||
else if(W.is_wrench() && !anchored && (!state || !reinf))
|
||||
if(!glasstype)
|
||||
user << "<span class='notice'>You're not sure how to dismantle \the [src] properly.</span>"
|
||||
to_chat(user, "<span class='notice'>You're not sure how to dismantle \the [src] properly.</span>")
|
||||
else
|
||||
playsound(src, W.usesound, 75, 1)
|
||||
visible_message("<span class='notice'>[user] dismantles \the [src].</span>")
|
||||
@@ -327,8 +327,8 @@
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/window/proc/rotate()
|
||||
set name = "Rotate Window Counter-Clockwise"
|
||||
/obj/structure/window/verb/rotate_counterclockwise()
|
||||
set name = "Rotate Window Counterclockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
@@ -339,17 +339,17 @@
|
||||
return 0
|
||||
|
||||
if(anchored)
|
||||
usr << "It is fastened to the floor therefore you can't rotate it!"
|
||||
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
|
||||
return 0
|
||||
|
||||
update_nearby_tiles(need_rebuild=1) //Compel updates before
|
||||
set_dir(turn(dir, 90))
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
updateSilicate()
|
||||
update_nearby_tiles(need_rebuild=1)
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/window/proc/revrotate()
|
||||
/obj/structure/window/verb/rotate_clockwise()
|
||||
set name = "Rotate Window Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
@@ -361,11 +361,11 @@
|
||||
return 0
|
||||
|
||||
if(anchored)
|
||||
usr << "It is fastened to the floor therefore you can't rotate it!"
|
||||
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
|
||||
return 0
|
||||
|
||||
update_nearby_tiles(need_rebuild=1) //Compel updates before
|
||||
set_dir(turn(dir, 270))
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
updateSilicate()
|
||||
update_nearby_tiles(need_rebuild=1)
|
||||
return
|
||||
@@ -418,11 +418,11 @@
|
||||
//Updates the availabiliy of the rotation verbs
|
||||
/obj/structure/window/proc/update_verbs()
|
||||
if(anchored || is_fulltile())
|
||||
verbs -= /obj/structure/window/proc/rotate
|
||||
verbs -= /obj/structure/window/proc/revrotate
|
||||
verbs -= /obj/structure/window/verb/rotate_counterclockwise
|
||||
verbs -= /obj/structure/window/verb/rotate_clockwise
|
||||
else if(!is_fulltile())
|
||||
verbs += /obj/structure/window/proc/rotate
|
||||
verbs += /obj/structure/window/proc/revrotate
|
||||
verbs += /obj/structure/window/verb/rotate_counterclockwise
|
||||
verbs += /obj/structure/window/verb/rotate_clockwise
|
||||
|
||||
//merges adjacent full-tile windows into one (blatant ripoff from game/smoothwall.dm)
|
||||
/obj/structure/window/update_icon()
|
||||
|
||||
+1
-3
@@ -23,7 +23,7 @@
|
||||
|
||||
if(distance <= maxdistance)
|
||||
if(T && T.z == turf_source.z)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, is_global, channel, pressure_affected, S)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, is_global, channel, pressure_affected, S, preference)
|
||||
|
||||
/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, is_global, channel = 0, pressure_affected = TRUE, sound/S, preference)
|
||||
if(!client || ear_deaf > 0)
|
||||
@@ -128,8 +128,6 @@
|
||||
if ("fracture") soundin = pick('sound/effects/bonebreak1.ogg','sound/effects/bonebreak2.ogg','sound/effects/bonebreak3.ogg','sound/effects/bonebreak4.ogg')
|
||||
if ("canopen") soundin = pick('sound/effects/can_open1.ogg','sound/effects/can_open2.ogg','sound/effects/can_open3.ogg','sound/effects/can_open4.ogg')
|
||||
if ("mechstep") soundin = pick('sound/mecha/mechstep1.ogg', 'sound/mecha/mechstep2.ogg')
|
||||
if ("geiger") soundin = pick('sound/items/geiger1.ogg', 'sound/items/geiger2.ogg', 'sound/items/geiger3.ogg', 'sound/items/geiger4.ogg', 'sound/items/geiger5.ogg')
|
||||
if ("geiger_weak") soundin = pick('sound/items/geiger_weak1.ogg', 'sound/items/geiger_weak2.ogg', 'sound/items/geiger_weak3.ogg', 'sound/items/geiger_weak4.ogg')
|
||||
if ("thunder") soundin = pick('sound/effects/thunder/thunder1.ogg', 'sound/effects/thunder/thunder2.ogg', 'sound/effects/thunder/thunder3.ogg', 'sound/effects/thunder/thunder4.ogg',
|
||||
'sound/effects/thunder/thunder5.ogg', 'sound/effects/thunder/thunder6.ogg', 'sound/effects/thunder/thunder7.ogg', 'sound/effects/thunder/thunder8.ogg', 'sound/effects/thunder/thunder9.ogg',
|
||||
'sound/effects/thunder/thunder10.ogg')
|
||||
|
||||
@@ -74,7 +74,6 @@ var/list/flooring_types
|
||||
'sound/effects/footstep/snow4.ogg',
|
||||
'sound/effects/footstep/snow5.ogg'))
|
||||
|
||||
|
||||
/decl/flooring/snow/snow2
|
||||
name = "snow"
|
||||
desc = "A layer of many tiny bits of frozen water. It's hard to tell how deep it is."
|
||||
|
||||
@@ -142,12 +142,12 @@
|
||||
return
|
||||
|
||||
|
||||
/obj/item/device/assembly/infra/verb/rotate()//This could likely be better
|
||||
set name = "Rotate Infrared Laser"
|
||||
/obj/item/device/assembly/infra/verb/rotate_clockwise()
|
||||
set name = "Rotate Infrared Laser Clockwise"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
|
||||
set_dir(turn(dir, 90))
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -476,19 +476,19 @@
|
||||
|
||||
// Governments
|
||||
|
||||
/datum/lore/organization/gov/sifgov
|
||||
name = "Sif Governmental Authority"
|
||||
short_name = "SifGov"
|
||||
desc = "SifGov is the sole governing administration for the Vir system, based in New Reykjavik, Sif. It is a representative \
|
||||
/datum/lore/organization/gov/virgov
|
||||
name = "Vir Governmental Authority"
|
||||
short_name = "VirGov"
|
||||
desc = "VirGov is the sole governing administration for the Vir system, based in New Reykjavik, Sif. It is a representative \
|
||||
democratic government, and a fully recognized member of the Solar Confederate Government. Anyone operating inside of Vir must \
|
||||
comply with SifGov's legislation and regulations."
|
||||
comply with VirGov's legislation and regulations."
|
||||
history = "" // Todo like the rest of them
|
||||
work = "governing body of Sif"
|
||||
work = "governing body of Vir"
|
||||
headquarters = "New Reykjavik, Sif, Vir"
|
||||
motto = ""
|
||||
autogenerate_destination_names = FALSE
|
||||
|
||||
ship_prefixes = list("SGA" = "hauling", "SGA" = "energy relay")
|
||||
ship_prefixes = list("VGA" = "hauling", "VGA" = "energy relay")
|
||||
destination_names = list(
|
||||
"New Reykjavik on Sif",
|
||||
"Radiance Energy Chain",
|
||||
@@ -544,7 +544,7 @@
|
||||
"Firnir orbit",
|
||||
"Tyr orbit",
|
||||
"Magni orbit",
|
||||
"a wreck in SifGov territory",
|
||||
"a wreck in VirGov territory",
|
||||
"a military outpost",
|
||||
)
|
||||
*/
|
||||
|
||||
@@ -74,6 +74,18 @@ var/list/_client_preferences_by_type
|
||||
preference_mob << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
|
||||
preference_mob << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
|
||||
|
||||
/datum/client_preference/weather_sounds
|
||||
description ="Weather sounds"
|
||||
key = "SOUND_WEATHER"
|
||||
enabled_description = "Audible"
|
||||
disabled_description = "Silent"
|
||||
|
||||
/datum/client_preference/supermatter_hum
|
||||
description ="Supermatter hum"
|
||||
key = "SOUND_SUPERMATTER"
|
||||
enabled_description = "Audible"
|
||||
disabled_description = "Silent"
|
||||
|
||||
/datum/client_preference/ghost_ears
|
||||
description ="Ghost ears"
|
||||
key = "CHAT_GHOSTEARS"
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : " no longer"] hear MIDIs from admins.")
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear MIDIs from admins.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
@@ -158,11 +158,41 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : " no longer"] hear ambient noise.")
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear ambient noise.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
feedback_add_details("admin_verb","TAmbience") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggle_weather_sounds()
|
||||
set name = "Toggle Weather Sounds"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggles the ability to hear weather sounds while on a planet."
|
||||
|
||||
var/pref_path = /datum/client_preference/weather_sounds
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear weather sounds.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
feedback_add_details("admin_verb","TWeatherSounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggle_supermatter_hum()
|
||||
set name = "Toggle SM Hum" // Avoiding using the full 'Supermatter' name to not conflict with the Setup-Supermatter adminverb.
|
||||
set category = "Preferences"
|
||||
set desc = "Toggles the ability to hear supermatter hums."
|
||||
|
||||
var/pref_path = /datum/client_preference/supermatter_hum
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear a hum from the supermatter.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
feedback_add_details("admin_verb","TSupermatterHum") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggle_be_special(role in be_special_flags)
|
||||
set name = "Toggle SpecialRole Candidacy"
|
||||
|
||||
@@ -404,7 +404,7 @@
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 4)
|
||||
matter = list()
|
||||
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
fire_sound = 'sound/weapons/Gunshot1.ogg'
|
||||
projectile_type = /obj/item/projectile/chameleon
|
||||
charge_meter = 0
|
||||
charge_cost = 48 //uses next to no power, since it's just holograms
|
||||
|
||||
@@ -124,9 +124,9 @@ mob/living/carbon/proc/handle_hallucinations()
|
||||
if(8) src << 'sound/machines/windowdoor.ogg'
|
||||
if(9)
|
||||
//To make it more realistic, I added two gunshots (enough to kill)
|
||||
src << 'sound/weapons/Gunshot.ogg'
|
||||
src << 'sound/weapons/Gunshot1.ogg'
|
||||
spawn(rand(10,30))
|
||||
src << 'sound/weapons/Gunshot.ogg'
|
||||
src << 'sound/weapons/Gunshot2.ogg'
|
||||
if(10) src << 'sound/weapons/smash.ogg'
|
||||
if(11)
|
||||
//Same as above, but with tasers.
|
||||
|
||||
@@ -35,6 +35,10 @@
|
||||
cooking_obj = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/cooker/proc/set_cooking(new_setting)
|
||||
cooking = new_setting
|
||||
icon_state = new_setting ? on_icon : off_icon
|
||||
|
||||
/obj/machinery/cooker/examine()
|
||||
..()
|
||||
if(cooking_obj && Adjacent(usr))
|
||||
@@ -113,7 +117,7 @@
|
||||
user.visible_message("<span class='notice'>\The [user] puts \the [I] into \the [src].</span>")
|
||||
cooking_obj = I
|
||||
cooking_obj.forceMove(src)
|
||||
cooking = 1
|
||||
set_cooking(TRUE)
|
||||
icon_state = on_icon
|
||||
|
||||
// Doop de doo. Jeopardy theme goes here.
|
||||
@@ -123,7 +127,7 @@
|
||||
if(!cooking_obj || cooking_obj.loc != src)
|
||||
cooking_obj = null
|
||||
icon_state = off_icon
|
||||
cooking = 0
|
||||
set_cooking(FALSE)
|
||||
return
|
||||
|
||||
// RIP slow-moving held mobs.
|
||||
@@ -166,7 +170,7 @@
|
||||
|
||||
if(!can_burn_food)
|
||||
icon_state = off_icon
|
||||
cooking = 0
|
||||
set_cooking(FALSE)
|
||||
result.forceMove(get_turf(src))
|
||||
cooking_obj = null
|
||||
else
|
||||
@@ -192,7 +196,7 @@
|
||||
failed = 1
|
||||
|
||||
if(failed)
|
||||
cooking = 0
|
||||
set_cooking(FALSE)
|
||||
icon_state = off_icon
|
||||
break
|
||||
|
||||
@@ -201,7 +205,7 @@
|
||||
if(cooking_obj && user.Adjacent(src)) //Fixes borgs being able to teleport food in these machines to themselves.
|
||||
user << "<span class='notice'>You grab \the [cooking_obj] from \the [src].</span>"
|
||||
user.put_in_hands(cooking_obj)
|
||||
cooking = 0
|
||||
set_cooking(FALSE)
|
||||
cooking_obj = null
|
||||
icon_state = off_icon
|
||||
return
|
||||
|
||||
@@ -8,6 +8,22 @@
|
||||
off_icon = "fryer_off"
|
||||
food_color = "#FFAD33"
|
||||
cooked_sound = 'sound/machines/ding.ogg'
|
||||
var/datum/looping_sound/deep_fryer/fry_loop
|
||||
|
||||
/obj/machinery/cooker/fryer/Initialize()
|
||||
fry_loop = new(list(src), FALSE)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/cooker/fryer/Destroy()
|
||||
QDEL_NULL(fry_loop)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/cooker/fryer/set_cooking(new_setting)
|
||||
..()
|
||||
if(new_setting)
|
||||
fry_loop.start()
|
||||
else
|
||||
fry_loop.stop()
|
||||
|
||||
/obj/machinery/cooker/fryer/cook_mob(var/mob/living/victim, var/mob/user)
|
||||
|
||||
@@ -17,16 +33,19 @@
|
||||
user.visible_message("<span class='danger'>\The [user] starts pushing \the [victim] into \the [src]!</span>")
|
||||
icon_state = on_icon
|
||||
cooking = 1
|
||||
fry_loop.start()
|
||||
|
||||
if(!do_mob(user, victim, 20))
|
||||
cooking = 0
|
||||
icon_state = off_icon
|
||||
fry_loop.stop()
|
||||
return
|
||||
|
||||
if(!victim || !victim.Adjacent(user))
|
||||
user << "<span class='danger'>Your victim slipped free!</span>"
|
||||
cooking = 0
|
||||
icon_state = off_icon
|
||||
fry_loop.stop()
|
||||
return
|
||||
|
||||
var/obj/item/organ/external/E
|
||||
@@ -62,4 +81,5 @@
|
||||
|
||||
icon_state = off_icon
|
||||
cooking = 0
|
||||
fry_loop.stop()
|
||||
return
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
var/global/list/acceptable_items // List of the items you can put in
|
||||
var/global/list/acceptable_reagents // List of the reagents you can put in
|
||||
var/global/max_n_of_items = 0
|
||||
var/datum/looping_sound/microwave/soundloop
|
||||
|
||||
|
||||
// see code/modules/food/recipes_microwave.dm for recipes
|
||||
@@ -24,8 +25,7 @@
|
||||
* Initialising
|
||||
********************/
|
||||
|
||||
/obj/machinery/microwave/New()
|
||||
..()
|
||||
/obj/machinery/microwave/Initialize()
|
||||
reagents = new/datum/reagents(100)
|
||||
reagents.my_atom = src
|
||||
|
||||
@@ -54,6 +54,12 @@
|
||||
acceptable_items |= /obj/item/weapon/reagent_containers/food/snacks/grown
|
||||
|
||||
RefreshParts()
|
||||
soundloop = new(list(src), FALSE)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/microwave/Destroy()
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
/*******************
|
||||
* Item Adding
|
||||
@@ -311,20 +317,19 @@
|
||||
|
||||
/obj/machinery/microwave/proc/start()
|
||||
src.visible_message("<span class='notice'>The microwave turns on.</span>", "<span class='notice'>You hear a microwave.</span>")
|
||||
src.operating = 1
|
||||
soundloop.start()
|
||||
src.operating = TRUE
|
||||
src.icon_state = "mw1"
|
||||
src.updateUsrDialog()
|
||||
|
||||
/obj/machinery/microwave/proc/abort()
|
||||
src.operating = 0 // Turn it off again aferwards
|
||||
src.icon_state = "mw"
|
||||
src.updateUsrDialog()
|
||||
operating = FALSE // Turn it off again aferwards
|
||||
icon_state = "mw"
|
||||
updateUsrDialog()
|
||||
soundloop.stop()
|
||||
|
||||
/obj/machinery/microwave/proc/stop()
|
||||
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
|
||||
src.operating = 0 // Turn it off again aferwards
|
||||
src.icon_state = "mw"
|
||||
src.updateUsrDialog()
|
||||
abort()
|
||||
|
||||
/obj/machinery/microwave/proc/dispose()
|
||||
for (var/obj/O in ((contents-component_parts)-circuit))
|
||||
|
||||
@@ -32,22 +32,22 @@
|
||||
"Beach" = new/datum/holodeck_program(/area/holodeck/source_beach),
|
||||
"Desert" = new/datum/holodeck_program(/area/holodeck/source_desert,
|
||||
list(
|
||||
'sound/effects/wind/wind_2_1.ogg',
|
||||
'sound/effects/wind/wind_2_2.ogg',
|
||||
'sound/effects/wind/wind_3_1.ogg',
|
||||
'sound/effects/wind/wind_4_1.ogg',
|
||||
'sound/effects/wind/wind_4_2.ogg',
|
||||
'sound/effects/wind/wind_5_1.ogg'
|
||||
'sound/effects/weather/wind/wind_2_1.ogg',
|
||||
'sound/effects/weather/wind/wind_2_2.ogg',
|
||||
'sound/effects/weather/wind/wind_3_1.ogg',
|
||||
'sound/effects/weather/wind/wind_4_1.ogg',
|
||||
'sound/effects/weather/wind/wind_4_2.ogg',
|
||||
'sound/effects/weather/wind/wind_5_1.ogg'
|
||||
)
|
||||
),
|
||||
"Snowfield" = new/datum/holodeck_program(/area/holodeck/source_snowfield,
|
||||
list(
|
||||
'sound/effects/wind/wind_2_1.ogg',
|
||||
'sound/effects/wind/wind_2_2.ogg',
|
||||
'sound/effects/wind/wind_3_1.ogg',
|
||||
'sound/effects/wind/wind_4_1.ogg',
|
||||
'sound/effects/wind/wind_4_2.ogg',
|
||||
'sound/effects/wind/wind_5_1.ogg'
|
||||
'sound/effects/weather/wind/wind_2_1.ogg',
|
||||
'sound/effects/weather/wind/wind_2_2.ogg',
|
||||
'sound/effects/weather/wind/wind_3_1.ogg',
|
||||
'sound/effects/weather/wind/wind_4_1.ogg',
|
||||
'sound/effects/weather/wind/wind_4_2.ogg',
|
||||
'sound/effects/weather/wind/wind_5_1.ogg'
|
||||
)
|
||||
),
|
||||
"Space" = new/datum/holodeck_program(/area/holodeck/source_space,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/lore/codex/category/main_corp_regs // The top-level categories for SOP/Regs/Law/etc
|
||||
name = "Index"
|
||||
data = "This book is meant to act as a reference for both NanoTrasen regulations, Standard Operating Procedure, and important laws of both \
|
||||
the Sif Governmental Authority and the Solar Confederate Government. The legal interactions between Nanotrasen corporate policy and SGA/SolGov \
|
||||
the Sif Governmental Authority and the Solar Confederate Government. The legal interactions between Nanotrasen corporate policy and VGA/SolGov \
|
||||
law can make for some confusing legalese. This book was written by the Vir division of NanoTrasen in order for employees, visitors, and residents \
|
||||
at NanoTrasen installations such as the Northen Star and the Southen Cross to know what isn't allowed, without needing to be a lawyer to read it.\
|
||||
<br><br>\
|
||||
@@ -12,8 +12,8 @@
|
||||
Also contained inside are our Standard Operating Procedures, that all employees of NanoTrasen are expected to follow, and for the local facility's \
|
||||
Command team and Internal Affairs to enforce.\
|
||||
<br><br>\
|
||||
It should be noted that by being on-board our facility, you agree to follow the rules of Corporate Regulations. By being within SGA space, \
|
||||
you are also required to follow the laws of SifGov."
|
||||
It should be noted that by being on-board our facility, you agree to follow the rules of Corporate Regulations. By being within VGA space, \
|
||||
you are also required to follow the laws of VirGov."
|
||||
children = list(
|
||||
/datum/lore/codex/category/standard_operating_procedures,
|
||||
/datum/lore/codex/category/corporate_regulations,
|
||||
@@ -34,7 +34,7 @@
|
||||
var/suggested_brig_time = null
|
||||
var/suggested_fine = null
|
||||
var/notes = null
|
||||
var/mandated = FALSE // If true, changes 'suggested' to 'mandated' for punishments, used for sifgov laws and some high corporate regs.
|
||||
var/mandated = FALSE // If true, changes 'suggested' to 'mandated' for punishments, used for virgov laws and some high corporate regs.
|
||||
|
||||
/datum/lore/codex/page/law/add_content()
|
||||
data = "<i>[definition]</i>\
|
||||
|
||||
@@ -90,11 +90,11 @@
|
||||
/datum/lore/codex/page/law/drone_id_failure
|
||||
name = "Failure to Present Drone ID"
|
||||
definition = "Failing to carry or present an EIO-issued Drone Identification card as a Drone intelligence."
|
||||
suggested_punishments = "200 thaler fine. Give Drone a temporary paper stating that it is a drone, if the ID was lost. Fax SifGov. Inform owner of \
|
||||
suggested_punishments = "200 thaler fine. Give Drone a temporary paper stating that it is a drone, if the ID was lost. Fax VirGov. Inform owner of \
|
||||
Drone if possible. Instruct Drone to obtain new ID at its earliest opportunity, if it was lost."
|
||||
notes = "This is only applicable to Drone intelligences which possess autonomous capability. It must be proven that the offender is a Drone, which can be \
|
||||
accomplished in various ways, generally with the expertise of a Roboticist. Lawbound synthetics, maintenance drones, and \
|
||||
simple bots do not require an ID card. No fine or SifGov fax should be sent if the Drone's ID was lost due to theft and the ID is able to be recovered."
|
||||
simple bots do not require an ID card. No fine or VirGov fax should be sent if the Drone's ID was lost due to theft and the ID is able to be recovered."
|
||||
mandated = TRUE
|
||||
|
||||
/datum/lore/codex/page/law/slander
|
||||
@@ -148,7 +148,7 @@
|
||||
/datum/lore/codex/page/law/embezzlement
|
||||
name = "Embezzlement"
|
||||
definition = "Stealing money that is entrusted to you by a corporation or person."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Reimbursement of embezzled funds. Fax Central Command and SifGov."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Reimbursement of embezzled funds. Fax Central Command and VirGov."
|
||||
notes = "This includes funneling Departmental, Facility, or Crew funds into the offender's account. It also includes pocketing \
|
||||
transactions directly that are meant to go to a seperate account."
|
||||
mandated = TRUE
|
||||
@@ -166,7 +166,7 @@
|
||||
/datum/lore/codex/page/law/manslaughter/add_content()
|
||||
name = "Manslaughter"
|
||||
definition = "To kill a sapient being without intent."
|
||||
suggested_punishments = "Hold until Transfer, if unjustified. Fax SifGov."
|
||||
suggested_punishments = "Hold until Transfer, if unjustified. Fax VirGov."
|
||||
notes = "Includes provoked manslaughter, negligent manslaughter, and impassioned killing. The important distinction between this \
|
||||
and [quick_link("Murder")] is intent. Manslaughter can be justified if force was nessecary and it was intented to prevent further loss of life or \
|
||||
grievous injury to self or others, however persons involved in the kill will still be required to answer to higher legal authority \
|
||||
@@ -177,7 +177,7 @@
|
||||
/datum/lore/codex/page/law/murder/add_content()
|
||||
name = "Murder"
|
||||
definition = "To kill or attempt to kill a sapient being with malicious intent."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax SifGov."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax VirGov."
|
||||
notes = "The distinction between this and [quick_link("Manslaughter")] is intent. Sapients held within synthetic bodies, lawbound or otherwise, which receive \
|
||||
critical damage from someone can be considered a murder attempt."
|
||||
mandated = TRUE
|
||||
@@ -194,7 +194,7 @@
|
||||
name = "Experimentation with Transgressive Technology"
|
||||
keywords += list("Transgressive", "Illegal Technology")
|
||||
definition = "Experimenting with technologies deemed unsafe or are otherwise federally restricted by the Solar Confederate Government."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax SifGov. Delete, destroy, or otherwise remove the experiments."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax VirGov. Delete, destroy, or otherwise remove the experiments."
|
||||
notes = "Unsafe technologies include unrestricted nanomachinery, massive sapient body bio-augmentation, massive sapient brain augmentation, \
|
||||
massively self-improving AI, and animal uplifting."
|
||||
mandated = TRUE
|
||||
@@ -225,14 +225,14 @@
|
||||
/datum/lore/codex/page/law/unlawful_law_changes
|
||||
name = "Unlawful Alteration of Bound Synthetics"
|
||||
definition = "Modifying a bound synthetic's lawset or chassis, in order to force it to do illegal, humiliating, dangerous, or other unlawful acts."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax SifGov."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax VirGov."
|
||||
notes = "If the synthetic is a cyborg or positronic, this is also an offense against the Sapient Rights laws federally mandated by the Solar Confederate Government."
|
||||
mandated = TRUE
|
||||
|
||||
/datum/lore/codex/page/law/grand_theft
|
||||
name = "Grand Theft"
|
||||
definition = "To steal items that are dangerous, of a high value, or a sensitive nature."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax SifGov."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax VirGov."
|
||||
notes = "This can include the following;\
|
||||
<br><ul>\
|
||||
<li>Deadly Weapons or Firearms.</li>\
|
||||
@@ -259,7 +259,7 @@
|
||||
/datum/lore/codex/page/law/sabotage/add_content()
|
||||
name = "Sabotage"
|
||||
definition = "To deliberately damage, or attempt to damage the facility, or critical systems of the facility."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax SifGov."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax VirGov."
|
||||
notes = "This includes causing hull breaches, arson, sabotaging air supplies, stealing vital equipment, tampering with AI or telecomm systems, and sabotaging the \
|
||||
Engine. If someone has only caused minor damage, the [quick_link("Vandalism")] charge should be used instead."
|
||||
mandated = TRUE
|
||||
@@ -269,7 +269,7 @@
|
||||
name = "Kidnapping / Hostage Taking"
|
||||
keywords += list("Kidnapping", "Hostage Taking")
|
||||
definition = "To unlawfully confine, transport, or hold a sapient being against that individual's will."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax SifGov."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax VirGov."
|
||||
notes = "Persons held for ransom or exchange are also considered to be hostages for this charge."
|
||||
mandated = TRUE
|
||||
..()
|
||||
@@ -278,7 +278,7 @@
|
||||
name = "Terrorist Acts"
|
||||
keywords += list("Terrorism")
|
||||
definition = "To engage in maliciously destructive actions, which seriously threaten the crew or facility, or the usage of weapons of mass destruction."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax SifGov."
|
||||
suggested_punishments = "Hold until Transfer. Termination. Fax VirGov."
|
||||
notes = "This includes the use of mass bombings, mass murder, releasing harmful biological agents, nuclear weapons, \
|
||||
radiological weapons, and chemical weapons."
|
||||
mandated = TRUE
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
the exact circumstances involved. For minor violations of Corp Regs, generally the Prisoner will have a choice of paying a Fine, or \
|
||||
serving time within the brig. For major violations, generally a demotion is recommended, however this is at the discretion of the Prisoner's \
|
||||
Superior, and not the Arresting Officer. For minor violations of Sif Law, the same rules generally apply as if it was a minor Corp Reg violation, however \
|
||||
major Law violations generally require a long brig sentence, or Holding until Transfer, as well as a fax to the SGA. See the specific violation contained \
|
||||
major Law violations generally require a long brig sentence, or Holding until Transfer, as well as a fax to the VGA. See the specific violation contained \
|
||||
in this book for more details."
|
||||
|
||||
/datum/lore/codex/page/sop_brigging
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
has a white glow, and a diameter that is about 34% larger than Sol. It has six major planets in its orbit.\
|
||||
<br><br>\
|
||||
Vir is mainly administered on [quick_link("Sif")] by the [quick_link("Sif Governmental Authority")], as Sif \
|
||||
was the first planet to be colonized, however SGA lays claim to all planets orbiting Vir. The planets \
|
||||
was the first planet to be colonized, however VGA lays claim to all planets orbiting Vir. The planets \
|
||||
are named after figures in ancient human mythology (Norse), due to the original surveyor for the system deciding to do so. \
|
||||
Some installations carry on this tradition."
|
||||
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
data = "As military vessels from the Almach Association continue to enter the Golden Crescent as part of a SolGov initiative to combat the Boiling Point terrorists believed to be hiding in the region, political unrest in the upstream portions of the region continue to grow. Many in the Republic of Saint Columbia, a small upstream nation, have responded to increasing militarization of their local Fleet base by taking to the streets, blocking pedestrian traffic in the capital of Barrueco and shutting down entire industries by destroying or disabling infrastructure. Quote rioter Luisa Tassis, \"we've been sick of the Fleeties squatting in our system and breathing down our neck, and now there's going to be even more of them? No, screw that. If there's going to be a war between the Rim and the Core, I know what side I'd rather be on.\"\
|
||||
<br><br>\
|
||||
Association leaders have refrained from officially supporting the rioters, though many suspect that Association propagandists have sparked the unrest. Solar officials, on the other hand, were quick to offer assurances that the unrest will be calmed long before it begins to affect the Fleet base in system."
|
||||
|
||||
|
||||
/datum/lore/codex/page/article14
|
||||
name = "5/25/62 - Harper's Aetolus Remains Shadowed"
|
||||
data = "The recent detente with the Almach Association has prompted easier communications with Rim governments. Loved ones separated by the cordon have a chance to communicate once more, trade is posed to recommence, and light has been shed on the conditions of Shelf, Relan, and Angessa's Pearl. Amid this light is a patch of darkness. The fourth major polity of the Association, the Aetolian Council remains inscrutable, with no publicly-available information in the system available after their purge of corporate loyalists during the Gray Hour. What reports do exist are rumors within the Rim of Aetolian projects to create a new, hardier strain of Promethean, potentially one in flagrant violation of the Five Points of Human Sanctity. It is also known that Aetolus is a contributor to the personnel of the military vessels that even now are active in the Golden Crescent, although no so-called \"Aeto-Prometheans\" are believed to be active outside of the rim at this time.\
|
||||
@@ -249,7 +249,7 @@
|
||||
data = "Admiral Kaleb McMullen made a public statement this afternoon on the continued Boiling Point attacks within SCG space. Speaking from his office in the Saint Columbia Fleet Base, Admiral McMullen thoroughly reassured reporters that the attacks will come to a swift end. According to McMullen, \"The era of wanton destruction as a result of Boiling Point's madness is coming to a close. Our command staff and proud servicepeople have been training and revising a solution to this threat that has haunted our borders and threatened the stability of our colonies and the lives of the honest people of the Solar Confederate Government. With new options available I have full confidence Boiling Point will be a name left to the dust.\"\
|
||||
<br><br>\
|
||||
Admiral McMullen, who has been stationed in Saint Columbia for nearly half a year of political and social unrest did not elaborate further on what he intended to do to solve the Boiling Point attacks, claiming that details would be forthcoming as \"operational security permits\"."
|
||||
|
||||
|
||||
/datum/lore/codex/page/article24
|
||||
name = "11/22/62 - Construction of \"MJOLNIR\" Weapon System in Saint Columbia Fleet Base"
|
||||
data = "Pursuant to recent assurances of safety in the region and the ongoing \"special election\" in Saint Columbia, a new weapon system called MJOLNIR was revealed, fully operational, in the Saint Columbia Fleet Base's \"Iserlohn\" weapons platform. Said to be a bluespace-lensed laser array capable of faster-than-light strikes against any ship in the system, as well as surgical strikes against ground forces on Saint Columbia proper, MJOLNIR is the first in a new generation of defense systems improving on the capabilities of the Vulture's Claw point defenses developed during the Hegemony War and using laser technology purchased from Eutopia. Political commentators supporting Saint Columbia decry the move as \"an obvious threat\", as does Militia liaison Invalid String Please Try Again. Admiral McMullen acknowledges the criticism, but states that his \"first priority must be the defense of the Golden Crescent and the security of our borders\". When responding to claims that the installation should not be placed in such a politically volatile system, he remarked, \"until the Shelficans figure out a way to teleport about a million tons worth of military equipment down to Gavel, the Fleet Base and Iserlohn are going to stay in Saint Columbia.\""
|
||||
@@ -282,7 +282,7 @@
|
||||
children = list(
|
||||
/datum/lore/codex/page/valult
|
||||
)
|
||||
|
||||
|
||||
/datum/lore/codex/page/valult
|
||||
name = "The Valentine's Ultimatum"
|
||||
data = "\[West shuffles some papers and clears their throat\]\
|
||||
@@ -328,7 +328,15 @@
|
||||
data = "Just hours after reconnecting with the Exonet after voting in a new government, the colony of Saint Columbia has unilaterally seceded from SolGov and petitioned for inclusion within the Almach Association. This declaration, issued by First Secretary Luissa Tassis, is in stark contrast to pre-election promises of continued support of Sol. Admiral McMullen of the Saint Columbia Garrison remains in control of the Fleet Base, itself a large colony housing around 75000 civilian contractors and military families who were not party to the Barrueco Referendum or the new constitution.\
|
||||
<br><br>\
|
||||
Efforts to ensure electoral validity and a peaceful exchange of power have been stymied by the presence of several dozen Militia vessels currently transiting from the Crescent to the Rim. Since the declaration went through, no Almachi vessels have been seen leaving the system, instead forming around Saint Columbia in an obvious defensive posture. The legality of this formation is questionable at best, as fleet activity in divided systems like Abel's Rest and Kauq'xum has been avoided for diplomatic reasons."
|
||||
|
||||
|
||||
/datum/lore/codex/page/article29
|
||||
name = "11/30/62 - Adm. McMullen Declares \"Iserlohn Republic\""
|
||||
data = "Pursuant to the continuing hostility from Secretary Tassis' Saint Columbia Democratic Union and the Almach Militia, the civilians of the Saint Columbia Fleet Base have been organized into an Iserlohn Republic. Named after the largest single module of the station, the Republic has applied to the Colonial Assembly as an independent protectorate, with provisional recognition already extended by Executive of Development Zehava Collins. In a move decried as nepotistic, Admiral McMullen declared independence and installed his daughter Anya as interim President pending ratification of a constitution. SolGov Fleet protocol forbids any member of the service from accepting any political appointment and is believed to be the main reason he did not take power himself. Anya McMullen is the administrative head of the base's hydroponics array and is considered a highly respected citizen of the colony, relationship to its military administrator notwithstanding."
|
||||
|
||||
/datum/lore/codex/page/article30
|
||||
name = "01/01/63 - Sif Governor Bjorn Arielsson to Retire"
|
||||
data = "Aging Shadow Coalition governor Bjorn Arielsson has today confirmed rumours that he will not run for re-election in the 2563 cycle. The popular governor has represented the people of Vir in the Colonial Assembly for ten years, and supporters had long hoped that he would run for a third term. Arielsson cites advancing age and a desire to spend more time with his partner of 12 years, noted Positronic entrepreneur View Arielsson.\
|
||||
<br><br>\
|
||||
Arielsson's governorship saw increased funding towards Sif's vererable ground-based transportation networks to the benefit of some of New Rekjavik's more remote neighbors, though opponents have criticised subsidies towards artificially heated fungal farms, arguing that the faciliies \"benefit a small minority of Skrellian residents to the detriment of already fragile local ecosystems.\"\
|
||||
<br><br>\
|
||||
The Sivian Shadow Coalition has yet to announce who is to take Arielsson's place on this year's ballot."
|
||||
@@ -104,7 +104,8 @@ var/global/use_preloader = FALSE
|
||||
if(cropMap)
|
||||
continue
|
||||
else
|
||||
world.maxz = zcrd //create a new z_level if needed
|
||||
while(world.maxz < zcrd)
|
||||
world.increment_max_z() // create a new z_level if needed.
|
||||
if(!no_changeturf)
|
||||
WARNING("Z-level expansion occurred without no_changeturf set, this may cause problems")
|
||||
|
||||
|
||||
@@ -363,8 +363,8 @@
|
||||
connected.check_supports()
|
||||
connected = null
|
||||
|
||||
/obj/machinery/mining/brace/verb/rotate()
|
||||
set name = "Rotate"
|
||||
/obj/machinery/mining/brace/verb/rotate_clockwise()
|
||||
set name = "Rotate Brace Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
@@ -374,5 +374,5 @@
|
||||
to_chat(usr, "It is anchored in place!")
|
||||
return 0
|
||||
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
return 1
|
||||
@@ -1,9 +1,9 @@
|
||||
#define HUMAN_LOWEST_SLOWDOWN -3
|
||||
|
||||
/mob/living/carbon/human/movement_delay()
|
||||
|
||||
var/tally = 0
|
||||
|
||||
var/item_tally = 0
|
||||
|
||||
if(species.slowdown)
|
||||
tally = species.slowdown
|
||||
|
||||
@@ -13,11 +13,11 @@
|
||||
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
|
||||
|
||||
if(force_max_speed)
|
||||
return -3
|
||||
return HUMAN_LOWEST_SLOWDOWN
|
||||
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(!isnull(M.haste) && M.haste == TRUE)
|
||||
return -3 // Returning -1 will actually result in a slowdown for Teshari.
|
||||
return HUMAN_LOWEST_SLOWDOWN // Returning -1 will actually result in a slowdown for Teshari.
|
||||
if(!isnull(M.slowdown))
|
||||
tally += M.slowdown
|
||||
|
||||
@@ -40,9 +40,6 @@
|
||||
else if(E.status & ORGAN_BROKEN)
|
||||
tally += 1.5
|
||||
else
|
||||
if(shoes)
|
||||
item_tally += shoes.slowdown
|
||||
|
||||
for(var/organ_name in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT))
|
||||
var/obj/item/organ/external/E = get_organ(organ_name)
|
||||
if(!E || E.is_stump())
|
||||
@@ -69,39 +66,20 @@
|
||||
|
||||
// Turf related slowdown
|
||||
var/turf/T = get_turf(src)
|
||||
if(T && T.movement_cost)
|
||||
var/turf_move_cost = T.movement_cost
|
||||
if(istype(T, /turf/simulated/floor/water))
|
||||
if(species.water_movement)
|
||||
turf_move_cost = Clamp(-3, turf_move_cost + species.water_movement, 15)
|
||||
if(shoes)
|
||||
var/obj/item/clothing/shoes/feet = shoes
|
||||
if(feet.water_speed)
|
||||
turf_move_cost = Clamp(-3, turf_move_cost + feet.water_speed, 15)
|
||||
tally += turf_move_cost
|
||||
if(istype(T, /turf/simulated/floor/outdoors/snow))
|
||||
if(species.snow_movement)
|
||||
turf_move_cost = Clamp(-3, turf_move_cost + species.snow_movement, 15)
|
||||
if(shoes)
|
||||
var/obj/item/clothing/shoes/feet = shoes
|
||||
if(feet.water_speed)
|
||||
turf_move_cost = Clamp(-3, turf_move_cost + feet.snow_speed, 15)
|
||||
tally += turf_move_cost
|
||||
tally += calculate_turf_slowdown(T)
|
||||
|
||||
// Loop through some slots, and add up their slowdowns. Shoes are handled below, unfortunately.
|
||||
// Includes slots which can provide armor, the back slot, and suit storage.
|
||||
for(var/obj/item/I in list(wear_suit, w_uniform, back, gloves, head, s_store))
|
||||
item_tally += I.slowdown
|
||||
|
||||
// Hands are also included, to make the 'take off your armor instantly and carry it with you to go faster' trick no longer viable.
|
||||
// This is done seperately to disallow negative numbers.
|
||||
for(var/obj/item/I in list(r_hand, l_hand) )
|
||||
item_tally += max(I.slowdown, 0)
|
||||
// Item related slowdown.
|
||||
var/item_tally = calculate_item_encumbrance()
|
||||
|
||||
// Dragging heavy objects will also slow you down, similar to above.
|
||||
if(pulling && istype(pulling, /obj/item))
|
||||
var/obj/item/pulled = pulling
|
||||
item_tally += max(pulled.slowdown, 0)
|
||||
if(pulling)
|
||||
if(istype(pulling, /obj/item))
|
||||
var/obj/item/pulled = pulling
|
||||
item_tally += max(pulled.slowdown, 0)
|
||||
else if(ishuman(pulling))
|
||||
var/mob/living/carbon/human/H = pulling
|
||||
var/their_slowdown = max(H.calculate_item_encumbrance(), 1)
|
||||
item_tally = max(item_tally, their_slowdown) // If our slowdown is less than theirs, then we become as slow as them (before species modifires).
|
||||
|
||||
item_tally *= species.item_slowdown_mod
|
||||
|
||||
@@ -117,7 +95,47 @@
|
||||
tally = tally/2
|
||||
tally -= chem_effects[CE_SPEEDBOOST] // give 'em a buff on top.
|
||||
|
||||
return max(-3, tally+config.human_delay) // Minimum return should be the same as force_max_speed
|
||||
return max(HUMAN_LOWEST_SLOWDOWN, tally+config.human_delay) // Minimum return should be the same as force_max_speed
|
||||
|
||||
// This calculates the amount of slowdown to receive from items worn. This does NOT include species modifiers.
|
||||
// It is in a seperate place to avoid an infinite loop situation with dragging mobs dragging each other.
|
||||
// Also its nice to have these things seperated.
|
||||
/mob/living/carbon/human/proc/calculate_item_encumbrance()
|
||||
if(!buckled && shoes) // Shoes can make you go faster.
|
||||
. += shoes.slowdown
|
||||
|
||||
// Loop through some slots, and add up their slowdowns.
|
||||
// Includes slots which can provide armor, the back slot, and suit storage.
|
||||
for(var/obj/item/I in list(wear_suit, w_uniform, back, gloves, head, s_store))
|
||||
. += I.slowdown
|
||||
|
||||
// Hands are also included, to make the 'take off your armor instantly and carry it with you to go faster' trick no longer viable.
|
||||
// This is done seperately to disallow negative numbers (so you can't hold shoes in your hands to go faster).
|
||||
for(var/obj/item/I in list(r_hand, l_hand) )
|
||||
. += max(I.slowdown, 0)
|
||||
|
||||
// Similar to above, but for turf slowdown.
|
||||
/mob/living/carbon/human/proc/calculate_turf_slowdown(turf/T)
|
||||
if(T && T.movement_cost)
|
||||
var/turf_move_cost = T.movement_cost
|
||||
if(istype(T, /turf/simulated/floor/water))
|
||||
if(species.water_movement)
|
||||
turf_move_cost = Clamp(HUMAN_LOWEST_SLOWDOWN, turf_move_cost + species.water_movement, 15)
|
||||
if(shoes)
|
||||
var/obj/item/clothing/shoes/feet = shoes
|
||||
if(feet.water_speed)
|
||||
turf_move_cost = Clamp(HUMAN_LOWEST_SLOWDOWN, turf_move_cost + feet.water_speed, 15)
|
||||
. += turf_move_cost
|
||||
if(istype(T, /turf/simulated/floor/outdoors/snow))
|
||||
if(species.snow_movement)
|
||||
turf_move_cost = Clamp(HUMAN_LOWEST_SLOWDOWN, turf_move_cost + species.snow_movement, 15)
|
||||
if(shoes)
|
||||
var/obj/item/clothing/shoes/feet = shoes
|
||||
if(feet.water_speed)
|
||||
turf_move_cost = Clamp(HUMAN_LOWEST_SLOWDOWN, turf_move_cost + feet.snow_speed, 15)
|
||||
. += turf_move_cost
|
||||
|
||||
#undef HUMAN_LOWEST_SLOWDOWN
|
||||
|
||||
/mob/living/carbon/human/Process_Spacemove(var/check_drift = 0)
|
||||
//Can we act?
|
||||
|
||||
@@ -30,6 +30,7 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
health_hud_intensity = 2
|
||||
num_alternate_languages = 3
|
||||
species_language = LANGUAGE_SOL_COMMON
|
||||
secondary_langs = list(LANGUAGE_SOL_COMMON) // For some reason, having this as their species language does not allow it to be chosen.
|
||||
assisted_langs = list(LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) // Prometheans are weird, let's just assume they can use basically any language.
|
||||
|
||||
breath_type = null
|
||||
|
||||
@@ -189,7 +189,7 @@
|
||||
icon_state = "syndicateranged_shotgun"
|
||||
icon_living = "syndicateranged_shotgun"
|
||||
projectiletype = /obj/item/projectile/bullet/pellet/shotgun // Buckshot
|
||||
projectilesound = 'sound/weapons/gunshot/shotgun.ogg'
|
||||
projectilesound = 'sound/weapons/Gunshot_shotgun.ogg'
|
||||
|
||||
loot_list = list(/obj/item/weapon/gun/projectile/shotgun/pump = 100)
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet
|
||||
casingtype = /obj/item/ammo_casing/spent
|
||||
projectilesound = 'sound/weapons/Gunshot.ogg'
|
||||
projectilesound = 'sound/weapons/Gunshot4.ogg'
|
||||
|
||||
loot_list = list(/obj/item/weapon/gun/projectile/revolver/mateba = 100)
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
movement_sound = 'sound/effects/servostep.ogg'
|
||||
|
||||
attacktext = list("clawed")
|
||||
projectilesound = 'sound/weapons/Gunshot.ogg'
|
||||
projectilesound = 'sound/weapons/Gunshot_old.ogg'
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/hivebot
|
||||
say_list_type = /datum/say_list/hivebot
|
||||
|
||||
@@ -129,17 +129,18 @@
|
||||
/mob/living/simple_mob/slime/proc/unify()
|
||||
unity = TRUE
|
||||
|
||||
// Interface override, because slimes are supposed to attack other slimes of different color regardless of faction
|
||||
// Interface override, because slimes are supposed to attack other slimes of different color regardless of faction.
|
||||
// (unless Unified, of course).
|
||||
/mob/living/simple_mob/slime/IIsAlly(mob/living/L)
|
||||
. = ..()
|
||||
if(.) // Need to do an additional check if its another slime.
|
||||
if(istype(L, /mob/living/simple_mob/slime))
|
||||
var/mob/living/simple_mob/slime/S = L
|
||||
if(S.slime_color != src.slime_color)
|
||||
if(S.unity || src.unity)
|
||||
return TRUE
|
||||
return FALSE
|
||||
if(istype(L, /mob/living/simple_mob/slime)) // Slimes should care about their color subfaction compared to another's.
|
||||
var/mob/living/simple_mob/slime/S = L
|
||||
if(S.unity || src.unity)
|
||||
return TRUE
|
||||
if(S.slime_color == src.slime_color)
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
// The other stuff was already checked in parent proc, and the . variable will implicitly return the correct value.
|
||||
|
||||
// Slimes regenerate passively.
|
||||
|
||||
@@ -70,4 +70,7 @@
|
||||
|
||||
if(!client.tooltips)
|
||||
client.tooltips = new(client)
|
||||
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(isturf(T))
|
||||
update_client_z(T.z)
|
||||
@@ -1,6 +1,7 @@
|
||||
/mob/Logout()
|
||||
GLOB.nanomanager.user_logout(src) // this is used to clean up (remove) this user's Nano UIs
|
||||
player_list -= src
|
||||
update_client_z(null)
|
||||
log_access_out(src)
|
||||
if(admin_datums[src.ckey])
|
||||
if (ticker && ticker.current_state == GAME_STATE_PLAYING) //Only report this stuff if we are currently playing.
|
||||
|
||||
@@ -1172,3 +1172,19 @@ mob/proc/yank_out_object()
|
||||
closeToolTip(usr) //No reason not to, really
|
||||
|
||||
..()
|
||||
|
||||
// Manages a global list of mobs with clients attached, indexed by z-level.
|
||||
/mob/proc/update_client_z(new_z) // +1 to register, null to unregister.
|
||||
if(registered_z != new_z)
|
||||
if(registered_z)
|
||||
GLOB.players_by_zlevel[registered_z] -= src
|
||||
if(client)
|
||||
if(new_z)
|
||||
GLOB.players_by_zlevel[new_z] += src
|
||||
registered_z = new_z
|
||||
else
|
||||
registered_z = null
|
||||
|
||||
/mob/on_z_change(old_z, new_z)
|
||||
..()
|
||||
update_client_z(new_z)
|
||||
@@ -231,3 +231,5 @@
|
||||
|
||||
var/attack_icon //Icon to use when attacking w/o anything in-hand
|
||||
var/attack_icon_state //State for above
|
||||
|
||||
var/registered_z
|
||||
|
||||
@@ -251,6 +251,7 @@
|
||||
var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client_ckey)
|
||||
mannequin.delete_inventory(TRUE)
|
||||
dress_preview_mob(mannequin)
|
||||
COMPILE_OVERLAYS(mannequin)
|
||||
|
||||
preview_icon = icon('icons/effects/128x48.dmi', bgstate)
|
||||
preview_icon.Scale(48+32, 16+32)
|
||||
|
||||
@@ -112,5 +112,5 @@
|
||||
var/turf/newloc = locate(x + deltas[1], y + deltas[2], z)
|
||||
if(newloc)
|
||||
Move(newloc)
|
||||
if(rotate)
|
||||
if(rotate)
|
||||
rotate(get_heading())
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
var/sun_position = 0 // 0 means midnight, 1 means noon.
|
||||
var/list/sun = list("range","brightness","color","lum_r","lum_g","lum_b")
|
||||
var/list/datum/lighting_corner/sunlit_corners = list()
|
||||
var/expected_z_levels = list()
|
||||
var/list/expected_z_levels = list()
|
||||
|
||||
var/turf/unsimulated/wall/planetary/planetary_wall_type = /turf/unsimulated/wall/planetary
|
||||
|
||||
|
||||
+119
-2
@@ -121,7 +121,10 @@ var/datum/planet/sif/planet_sif = null
|
||||
WEATHER_RAIN = new /datum/weather/sif/rain(),
|
||||
WEATHER_STORM = new /datum/weather/sif/storm(),
|
||||
WEATHER_HAIL = new /datum/weather/sif/hail(),
|
||||
WEATHER_BLOOD_MOON = new /datum/weather/sif/blood_moon()
|
||||
WEATHER_BLOOD_MOON = new /datum/weather/sif/blood_moon(),
|
||||
WEATHER_EMBERFALL = new /datum/weather/sif/emberfall(),
|
||||
WEATHER_ASH_STORM = new /datum/weather/sif/ash_storm(),
|
||||
WEATHER_FALLOUT = new /datum/weather/sif/fallout()
|
||||
)
|
||||
roundstart_weather_chances = list(
|
||||
WEATHER_CLEAR = 30,
|
||||
@@ -208,6 +211,8 @@ var/datum/planet/sif/planet_sif = null
|
||||
"It's starting to snow.",
|
||||
"The air feels much colder as snowflakes fall from above."
|
||||
)
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/outside_snow
|
||||
indoor_sounds_type = /datum/looping_sound/weather/inside_snow
|
||||
|
||||
/datum/weather/sif/snow/process_effects()
|
||||
..()
|
||||
@@ -237,6 +242,8 @@ var/datum/planet/sif/planet_sif = null
|
||||
"Strong winds howl around you as a blizzard appears.",
|
||||
"It starts snowing heavily, and it feels extremly cold now."
|
||||
)
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
|
||||
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
|
||||
|
||||
/datum/weather/sif/blizzard/process_effects()
|
||||
..()
|
||||
@@ -265,6 +272,8 @@ var/datum/planet/sif/planet_sif = null
|
||||
transition_messages = list(
|
||||
"The sky is dark, and rain falls down upon you."
|
||||
)
|
||||
// outdoor_sounds_type = /datum/looping_sound/weather/rain
|
||||
// indoor_sounds_type = /datum/looping_sound/weather/rain/indoors
|
||||
|
||||
/datum/weather/sif/rain/process_effects()
|
||||
..()
|
||||
@@ -310,6 +319,8 @@ var/datum/planet/sif/planet_sif = null
|
||||
"Loud thunder is heard in the distance.",
|
||||
"A bright flash heralds the approach of a storm."
|
||||
)
|
||||
// outdoor_sounds_type = /datum/looping_sound/weather/rain
|
||||
// indoor_sounds_type = /datum/looping_sound/weather/rain/indoors
|
||||
|
||||
|
||||
transition_chances = list(
|
||||
@@ -417,7 +428,7 @@ var/datum/planet/sif/planet_sif = null
|
||||
if(show_message)
|
||||
to_chat(H, "<span class='notice'>Hail patters onto your umbrella.</span>")
|
||||
continue
|
||||
|
||||
|
||||
var/target_zone = pick(BP_ALL)
|
||||
var/amount_blocked = H.run_armor_check(target_zone, "melee")
|
||||
var/amount_soaked = H.get_armor_soak(target_zone, "melee")
|
||||
@@ -435,6 +446,10 @@ var/datum/planet/sif/planet_sif = null
|
||||
if(show_message)
|
||||
to_chat(H, effect_message)
|
||||
|
||||
|
||||
// These never happen naturally, and are for adminbuse.
|
||||
|
||||
// A culty weather.
|
||||
/datum/weather/sif/blood_moon
|
||||
name = "blood moon"
|
||||
light_modifier = 0.5
|
||||
@@ -447,3 +462,105 @@ var/datum/planet/sif/planet_sif = null
|
||||
transition_messages = list(
|
||||
"The sky turns blood red!"
|
||||
)
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/wind
|
||||
indoor_sounds_type = /datum/looping_sound/weather/wind/indoors
|
||||
|
||||
// Ash and embers fall forever, such as from a volcano or something.
|
||||
/datum/weather/sif/emberfall
|
||||
name = "emberfall"
|
||||
icon_state = "ashfall_light"
|
||||
light_modifier = 0.7
|
||||
light_color = "#880000"
|
||||
temp_high = 293.15 // 20c
|
||||
temp_low = 283.15 // 10c
|
||||
flight_failure_modifier = 20
|
||||
transition_chances = list(
|
||||
WEATHER_EMBERFALL = 100
|
||||
)
|
||||
observed_message = "Soot, ash, and embers float down from above."
|
||||
transition_messages = list(
|
||||
"Gentle embers waft down around you like grotesque snow."
|
||||
)
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/wind
|
||||
indoor_sounds_type = /datum/looping_sound/weather/wind/indoors
|
||||
|
||||
// Like the above but a lot more harmful.
|
||||
/datum/weather/sif/ash_storm
|
||||
name = "ash storm"
|
||||
icon_state = "ashfall_heavy"
|
||||
light_modifier = 0.1
|
||||
light_color = "#FF0000"
|
||||
temp_high = 323.15 // 50c
|
||||
temp_low = 313.15 // 40c
|
||||
flight_failure_modifier = 50
|
||||
transition_chances = list(
|
||||
WEATHER_ASH_STORM = 100
|
||||
)
|
||||
observed_message = "All that can be seen is black smoldering ash."
|
||||
transition_messages = list(
|
||||
"Smoldering clouds of scorching ash billow down around you!"
|
||||
)
|
||||
// Lets recycle.
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
|
||||
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
|
||||
|
||||
/datum/weather/sif/ash_storm/process_effects()
|
||||
..()
|
||||
for(var/thing in living_mob_list)
|
||||
var/mob/living/L = thing
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to burn them with ash.
|
||||
|
||||
L.inflict_heat_damage(rand(1, 3))
|
||||
|
||||
|
||||
// Totally radical.
|
||||
/datum/weather/sif/fallout
|
||||
name = "fallout"
|
||||
icon_state = "fallout"
|
||||
light_modifier = 0.7
|
||||
light_color = "#CCFFCC"
|
||||
flight_failure_modifier = 30
|
||||
transition_chances = list(
|
||||
WEATHER_FALLOUT = 100
|
||||
)
|
||||
observed_message = "Radioactive soot and ash rains down from the heavens."
|
||||
transition_messages = list(
|
||||
"Radioactive soot and ash start to float down around you, contaminating whatever they touch."
|
||||
)
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/wind
|
||||
indoor_sounds_type = /datum/looping_sound/weather/wind/indoors
|
||||
|
||||
// How much radiation a mob gets while on an outside tile.
|
||||
var/direct_rad_low = RAD_LEVEL_LOW
|
||||
var/direct_rad_high = RAD_LEVEL_MODERATE
|
||||
|
||||
// How much radiation is bursted onto a random tile near a mob.
|
||||
var/fallout_rad_low = RAD_LEVEL_HIGH
|
||||
var/fallout_rad_high = RAD_LEVEL_VERY_HIGH
|
||||
|
||||
/datum/weather/sif/fallout/process_effects()
|
||||
..()
|
||||
for(var/thing in living_mob_list)
|
||||
var/mob/living/L = thing
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
irradiate_nearby_turf(L)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to irradiate them with fallout.
|
||||
|
||||
L.rad_act(rand(direct_rad_low, direct_rad_high))
|
||||
|
||||
// This makes random tiles near people radioactive for awhile.
|
||||
// Tiles far away from people are left alone, for performance.
|
||||
/datum/weather/sif/fallout/proc/irradiate_nearby_turf(mob/living/L)
|
||||
if(!istype(L))
|
||||
return
|
||||
var/list/turfs = RANGE_TURFS(world.view, L)
|
||||
var/turf/T = pick(turfs) // We get one try per tick.
|
||||
if(!istype(T))
|
||||
return
|
||||
if(T.outdoors)
|
||||
radiation_repository.radiate(T, rand(fallout_rad_low, fallout_rad_high))
|
||||
@@ -25,13 +25,19 @@
|
||||
|
||||
/datum/weather_holder/proc/change_weather(var/new_weather)
|
||||
var/old_light_modifier = null
|
||||
var/old_weather = null
|
||||
var/datum/weather/old_weather = null
|
||||
if(current_weather)
|
||||
old_light_modifier = current_weather.light_modifier // We store the old one, so we can determine if recalculating the sun is needed.
|
||||
old_weather = current_weather
|
||||
current_weather = allowed_weather_types[new_weather]
|
||||
next_weather_shift = world.time + rand(current_weather.timer_low_bound, current_weather.timer_high_bound) MINUTES
|
||||
if(new_weather != old_weather)
|
||||
if(istype(old_weather)) // At roundstart this is null.
|
||||
old_weather.process_sounds() // Ensure that people who should hear the ending sound will hear it.
|
||||
old_weather.stop_sounds()
|
||||
|
||||
current_weather.process_sounds() // Same story, make sure the starting sound is heard.
|
||||
current_weather.start_sounds()
|
||||
show_transition_message()
|
||||
|
||||
update_icon_effects()
|
||||
@@ -48,7 +54,7 @@
|
||||
advance_forecast()
|
||||
else
|
||||
current_weather.process_effects()
|
||||
|
||||
current_weather.process_sounds()
|
||||
|
||||
|
||||
// Should only have to be called once.
|
||||
@@ -140,6 +146,18 @@
|
||||
var/list/transition_messages = list()// List of messages shown to all outdoor mobs when this weather is transitioned to, for flavor. Not shown if already this weather.
|
||||
var/observed_message = null // What is shown to a player 'examining' the weather.
|
||||
|
||||
// Looping sound datums for weather sounds, both inside and outside.
|
||||
var/datum/looping_sound/outdoor_sounds = null
|
||||
var/datum/looping_sound/indoor_sounds = null
|
||||
var/outdoor_sounds_type = null
|
||||
var/indoor_sounds_type = null
|
||||
|
||||
/datum/weather/New()
|
||||
if(outdoor_sounds_type)
|
||||
outdoor_sounds = new outdoor_sounds_type(list(), FALSE, TRUE)
|
||||
if(indoor_sounds_type)
|
||||
indoor_sounds = new indoor_sounds_type(list(), FALSE, TRUE)
|
||||
|
||||
/datum/weather/proc/process_effects()
|
||||
show_message = FALSE // Need to reset the show_message var, just in case
|
||||
if(effect_message) // Only bother with the code below if we actually need to display something
|
||||
@@ -148,6 +166,71 @@
|
||||
show_message = TRUE // Tell the rest of the process that we need to make a message
|
||||
return
|
||||
|
||||
/datum/weather/proc/process_sounds()
|
||||
if(!outdoor_sounds && !indoor_sounds) // No point bothering if we have no sounds.
|
||||
return
|
||||
|
||||
for(var/z_level in 1 to world.maxz)
|
||||
for(var/a in GLOB.players_by_zlevel[z_level])
|
||||
var/mob/M = a
|
||||
|
||||
// Check if the mob left the z-levels we control. If so, make the sounds stop for them.
|
||||
if(!(z_level in holder.our_planet.expected_z_levels))
|
||||
hear_indoor_sounds(M, FALSE)
|
||||
hear_outdoor_sounds(M, FALSE)
|
||||
continue
|
||||
|
||||
// Otherwise they should hear some sounds, depending on if they're inside or not.
|
||||
var/turf/T = get_turf(M)
|
||||
if(istype(T))
|
||||
if(T.outdoors) // Mob is currently outdoors.
|
||||
hear_outdoor_sounds(M, TRUE)
|
||||
hear_indoor_sounds(M, FALSE)
|
||||
|
||||
else // Mob is currently indoors.
|
||||
hear_outdoor_sounds(M, FALSE)
|
||||
hear_indoor_sounds(M, TRUE)
|
||||
|
||||
else
|
||||
hear_indoor_sounds(M, FALSE)
|
||||
hear_outdoor_sounds(M, FALSE)
|
||||
|
||||
/datum/weather/proc/start_sounds()
|
||||
if(outdoor_sounds)
|
||||
outdoor_sounds.start()
|
||||
if(indoor_sounds)
|
||||
indoor_sounds.start()
|
||||
|
||||
/datum/weather/proc/stop_sounds()
|
||||
if(outdoor_sounds)
|
||||
outdoor_sounds.stop()
|
||||
if(indoor_sounds)
|
||||
indoor_sounds.stop()
|
||||
|
||||
// Stop everything just in case.
|
||||
for(var/z_level in 1 to world.maxz)
|
||||
for(var/a in GLOB.players_by_zlevel[z_level])
|
||||
hear_indoor_sounds(a, FALSE)
|
||||
hear_outdoor_sounds(a, FALSE)
|
||||
|
||||
// Adds or removes someone from the outdoor list.
|
||||
/datum/weather/proc/hear_outdoor_sounds(mob/M, adding)
|
||||
if(!outdoor_sounds)
|
||||
return
|
||||
if(adding)
|
||||
outdoor_sounds.output_atoms |= M
|
||||
return
|
||||
outdoor_sounds.output_atoms -= M
|
||||
|
||||
// Ditto, for indoors.
|
||||
/datum/weather/proc/hear_indoor_sounds(mob/M, adding)
|
||||
if(!indoor_sounds)
|
||||
return
|
||||
if(adding)
|
||||
indoor_sounds.output_atoms |= M
|
||||
return
|
||||
indoor_sounds.output_atoms -= M
|
||||
|
||||
// All this does is hold the weather icon.
|
||||
/atom/movable/weather_visuals
|
||||
icon = 'icons/effects/weather.dmi'
|
||||
|
||||
@@ -134,22 +134,22 @@ var/list/fuel_injectors = list()
|
||||
else
|
||||
StopInjecting()
|
||||
|
||||
/obj/machinery/fusion_fuel_injector/verb/rotate_clock()
|
||||
/obj/machinery/fusion_fuel_injector/verb/rotate_clockwise()
|
||||
set category = "Object"
|
||||
set name = "Rotate Generator (Clockwise)"
|
||||
set name = "Rotate Generator Clockwise"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.incapacitated() || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.dir = turn(src.dir, -90)
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
|
||||
/obj/machinery/fusion_fuel_injector/verb/rotate_anticlock()
|
||||
/obj/machinery/fusion_fuel_injector/verb/rotate_counterclockwise()
|
||||
set category = "Object"
|
||||
set name = "Rotate Generator (Counter-clockwise)"
|
||||
set name = "Rotate Generator Counterclockwise"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.incapacitated() || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.dir = turn(src.dir, 90)
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
|
||||
@@ -22,12 +22,18 @@
|
||||
var/lastgen2 = 0
|
||||
var/effective_gen = 0
|
||||
var/lastgenlev = 0
|
||||
var/datum/looping_sound/generator/soundloop
|
||||
|
||||
/obj/machinery/power/generator/New()
|
||||
..()
|
||||
/obj/machinery/power/generator/Initialize()
|
||||
soundloop = new(list(src), FALSE)
|
||||
desc = initial(desc) + " Rated for [round(max_power/1000)] kW."
|
||||
spawn(1)
|
||||
reconnect()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/generator/Destroy()
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
//generators connect in dir and reverse_dir(dir) directions
|
||||
//mnemonic to determine circulator/generator directions: the cirulators orbit clockwise around the generator
|
||||
@@ -124,6 +130,13 @@
|
||||
stored_energy -= lastgen1
|
||||
effective_gen = (lastgen1 + lastgen2) / 2
|
||||
|
||||
// Sounds.
|
||||
if(effective_gen > (max_power * 0.05)) // More than 5% and sounds start.
|
||||
soundloop.start()
|
||||
soundloop.volume = LERP(1, 40, effective_gen / max_power)
|
||||
else
|
||||
soundloop.stop()
|
||||
|
||||
// update icon overlays and power usage only if displayed level has changed
|
||||
var/genlev = max(0, min( round(11*effective_gen / max_power), 11))
|
||||
if(effective_gen > 100 && genlev == 0)
|
||||
@@ -215,9 +228,19 @@
|
||||
updateicon()
|
||||
|
||||
|
||||
/obj/machinery/power/generator/verb/rotate_clock()
|
||||
/obj/machinery/power/generator/verb/rotate_clockwise()
|
||||
set category = "Object"
|
||||
set name = "Rotate Generator (Clockwise)"
|
||||
set name = "Rotate Generator Clockwise"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
|
||||
/obj/machinery/power/generator/verb/rotate_counterclockwise()
|
||||
set category = "Object"
|
||||
set name = "Rotate Generator Counterclockwise"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
@@ -225,16 +248,6 @@
|
||||
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
|
||||
/obj/machinery/power/generator/verb/rotate_anticlock()
|
||||
set category = "Object"
|
||||
set name = "Rotate Generator (Counterclockwise)"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.set_dir(turn(src.dir, -90))
|
||||
|
||||
/obj/machinery/power/generator/power_spike()
|
||||
// if(!effective_gen >= max_power / 2 && powernet) // Don't make a spike if we're not making a whole lot of power.
|
||||
// return
|
||||
|
||||
@@ -30,15 +30,15 @@
|
||||
var/integrity = 80
|
||||
|
||||
|
||||
/obj/machinery/power/emitter/verb/rotate()
|
||||
set name = "Rotate"
|
||||
/obj/machinery/power/emitter/verb/rotate_clockwise()
|
||||
set name = "Rotate Emitter Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if (src.anchored || usr:stat)
|
||||
usr << "It is fastened to the floor!"
|
||||
to_chat(usr, "It is fastened to the floor!")
|
||||
return 0
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
return 1
|
||||
|
||||
/obj/machinery/power/emitter/Initialize()
|
||||
|
||||
@@ -89,24 +89,24 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/particle_accelerator/verb/rotate()
|
||||
/obj/structure/particle_accelerator/verb/rotate_clockwise()
|
||||
set name = "Rotate Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if (src.anchored || usr:stat)
|
||||
usr << "It is fastened to the floor!"
|
||||
to_chat(usr, "It is fastened to the floor!")
|
||||
return 0
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
return 1
|
||||
|
||||
/obj/structure/particle_accelerator/verb/rotateccw()
|
||||
/obj/structure/particle_accelerator/verb/rotate_counterclockwise()
|
||||
set name = "Rotate Counter Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if (src.anchored || usr:stat)
|
||||
usr << "It is fastened to the floor!"
|
||||
to_chat(usr, "It is fastened to the floor!")
|
||||
return 0
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
return 1
|
||||
@@ -269,24 +269,24 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
|
||||
var/desc_holder = null
|
||||
|
||||
|
||||
/obj/machinery/particle_accelerator/verb/rotate()
|
||||
/obj/machinery/particle_accelerator/verb/rotate_clockwise()
|
||||
set name = "Rotate Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if (src.anchored || usr:stat)
|
||||
usr << "It is fastened to the floor!"
|
||||
to_chat(usr, "It is fastened to the floor!")
|
||||
return 0
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
return 1
|
||||
|
||||
/obj/machinery/particle_accelerator/verb/rotateccw()
|
||||
/obj/machinery/particle_accelerator/verb/rotate_counterclockwise()
|
||||
set name = "Rotate Counter-Clockwise"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if (src.anchored || usr:stat)
|
||||
usr << "It is fastened to the floor!"
|
||||
to_chat(usr, "It is fastened to the floor!")
|
||||
return 0
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
return 1
|
||||
@@ -333,11 +333,9 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
|
||||
else
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/particle_accelerator/proc/update_state()
|
||||
return 0
|
||||
|
||||
|
||||
/obj/machinery/particle_accelerator/proc/process_tool_hit(var/obj/item/O, var/mob/user)
|
||||
if(!(O) || !(user))
|
||||
return 0
|
||||
|
||||
@@ -88,9 +88,15 @@
|
||||
|
||||
var/debug = 0
|
||||
|
||||
var/datum/looping_sound/supermatter/soundloop
|
||||
|
||||
/obj/machinery/power/supermatter/Initialize()
|
||||
soundloop = new(list(src), TRUE)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/supermatter/Destroy()
|
||||
. = ..()
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/supermatter/proc/explode()
|
||||
message_admins("Supermatter exploded at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
@@ -196,6 +202,11 @@
|
||||
if(grav_pulling)
|
||||
supermatter_pull(src)
|
||||
|
||||
if(power)
|
||||
// Volume will be 1 at no power, ~12.5 at ENERGY_NITROGEN, and 20+ at ENERGY_PHORON.
|
||||
// Capped to 20 volume since higher volumes get annoying and it sounds worse.
|
||||
soundloop.volume = min(round(power/10)+1, 20)
|
||||
|
||||
//Ok, get the air from the turf
|
||||
var/datum/gas_mixture/removed = null
|
||||
var/datum/gas_mixture/env = null
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
/obj/item/ammo_casing/a9mm/practice
|
||||
desc = "A 9mm practice bullet casing."
|
||||
icon_state = "r-casing"
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/practice
|
||||
projectile_type = /obj/item/projectile/bullet/practice
|
||||
|
||||
/*
|
||||
* .45
|
||||
@@ -130,7 +130,7 @@
|
||||
/obj/item/ammo_casing/a45/practice
|
||||
desc = "A .45 practice bullet casing."
|
||||
icon_state = "r-casing"
|
||||
projectile_type = /obj/item/projectile/bullet/pistol/practice
|
||||
projectile_type = /obj/item/projectile/bullet/practice
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 60)
|
||||
|
||||
/obj/item/ammo_casing/a45/rubber
|
||||
@@ -202,7 +202,7 @@
|
||||
name = "shotgun shell"
|
||||
desc = "A practice shell."
|
||||
icon_state = "pshell"
|
||||
projectile_type = /obj/item/projectile/bullet/shotgun/practice
|
||||
projectile_type = /obj/item/projectile/bullet/practice
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 90)
|
||||
|
||||
/obj/item/ammo_casing/a12g/beanbag
|
||||
@@ -260,7 +260,7 @@
|
||||
/obj/item/ammo_casing/a762/practice
|
||||
desc = "A 7.62mm practice bullet casing."
|
||||
icon_state = "rifle-casing" // Need to make an icon for these
|
||||
projectile_type = /obj/item/projectile/bullet/rifle/practice
|
||||
projectile_type = /obj/item/projectile/bullet/practice
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 90)
|
||||
|
||||
/obj/item/ammo_casing/a762/blank
|
||||
@@ -306,7 +306,7 @@
|
||||
/obj/item/ammo_casing/a545/practice
|
||||
desc = "A 5.45mm practice bullet casing."
|
||||
icon_state = "rifle-casing" // Need to make an icon for these
|
||||
projectile_type = /obj/item/projectile/bullet/rifle/practice
|
||||
projectile_type = /obj/item/projectile/bullet/practice
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 90)
|
||||
|
||||
/obj/item/ammo_casing/a545/blank
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
var/fire_delay = 6 //delay after shooting before the gun can be used again
|
||||
var/burst_delay = 2 //delay between shots, if firing in bursts
|
||||
var/move_delay = 1
|
||||
var/fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
var/fire_sound = null // This is handled by projectile.dm's fire_sound var now, but you can override the projectile's fire_sound with this one if you want to.
|
||||
var/fire_sound_text = "gunshot"
|
||||
var/fire_anim = null
|
||||
var/recoil = 0 //screen shake
|
||||
@@ -440,10 +440,7 @@
|
||||
|
||||
last_shot = world.time
|
||||
|
||||
if(silenced)
|
||||
playsound(src, fire_sound, 10, 1)
|
||||
else
|
||||
playsound(src, fire_sound, 50, 1)
|
||||
play_fire_sound()
|
||||
|
||||
if(muzzle_flash)
|
||||
set_light(muzzle_flash)
|
||||
@@ -630,7 +627,13 @@
|
||||
return launched
|
||||
|
||||
/obj/item/weapon/gun/proc/play_fire_sound(var/mob/user, var/obj/item/projectile/P)
|
||||
var/shot_sound = (istype(P) && P.fire_sound)? P.fire_sound : fire_sound
|
||||
var/shot_sound = fire_sound
|
||||
|
||||
if(!shot_sound && istype(P) && P.fire_sound) // If the gun didn't have a fire_sound, but the projectile exists, and has a sound...
|
||||
shot_sound = P.fire_sound
|
||||
if(!shot_sound) // If there's still no sound...
|
||||
return
|
||||
|
||||
if(silenced)
|
||||
playsound(user, shot_sound, 10, 1)
|
||||
else
|
||||
@@ -653,11 +656,7 @@
|
||||
var/obj/item/projectile/in_chamber = consume_next_projectile()
|
||||
if (istype(in_chamber))
|
||||
user.visible_message("<span class = 'warning'>[user] pulls the trigger.</span>")
|
||||
var/shot_sound = in_chamber.fire_sound? in_chamber.fire_sound : fire_sound
|
||||
if(silenced)
|
||||
playsound(user, shot_sound, 10, 1)
|
||||
else
|
||||
playsound(user, shot_sound, 50, 1)
|
||||
play_fire_sound()
|
||||
if(istype(in_chamber, /obj/item/projectile/beam/lastertag))
|
||||
user.show_message("<span class = 'warning'>You feel rather silly, trying to commit suicide with a toy.</span>")
|
||||
mouthshoot = 0
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
name = "energy gun"
|
||||
desc = "A basic energy-based gun."
|
||||
icon_state = "energy"
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
fire_sound_text = "laser blast"
|
||||
|
||||
var/obj/item/weapon/cell/power_supply //What type of power cell this uses
|
||||
@@ -28,7 +27,7 @@
|
||||
..()
|
||||
if(self_recharge)
|
||||
power_supply = new /obj/item/weapon/cell/device/weapon(src)
|
||||
START_PROCESSING(SSobj, src)
|
||||
START_PROCESSING(SSobj, src)
|
||||
else
|
||||
if(cell_type)
|
||||
power_supply = new cell_type(src)
|
||||
@@ -189,7 +188,7 @@
|
||||
if(power_supply == null)
|
||||
power_supply = new /obj/item/weapon/cell/device/weapon(src)
|
||||
self_recharge = 1
|
||||
START_PROCESSING(SSobj, src)
|
||||
START_PROCESSING(SSobj, src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/gun/energy/get_description_interaction()
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
desc = "A large, strange gauntlet."
|
||||
icon_state = "gravwhip"
|
||||
item_state = "gravwhip"
|
||||
fire_sound = 'sound/effects/zzzt.ogg'
|
||||
fire_sound_text = "laser blast"
|
||||
|
||||
fire_delay = 15
|
||||
|
||||
@@ -130,7 +130,6 @@
|
||||
icon_state = "sniper"
|
||||
item_state = "sniper"
|
||||
item_state_slots = list(slot_r_hand_str = "z8carbine", slot_l_hand_str = "z8carbine") //placeholder
|
||||
fire_sound = 'sound/weapons/gauss_shoot.ogg'
|
||||
origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4)
|
||||
projectile_type = /obj/item/projectile/beam/sniper
|
||||
slot_flags = SLOT_BACK
|
||||
@@ -157,7 +156,6 @@
|
||||
description_fluff = "Modeled after ancient hunting rifles, this rifle was dubbed the 'Rainy Day Special' by some, due to its use as some barmens' fight-stopper of choice. One shot is all it takes, or so they say."
|
||||
icon_state = "eshotgun"
|
||||
item_state = "shotgun"
|
||||
fire_sound = 'sound/weapons/gauss_shoot.ogg'
|
||||
origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_POWER = 3)
|
||||
projectile_type = /obj/item/projectile/beam/sniper
|
||||
slot_flags = SLOT_BACK
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
/obj/item/weapon/gun/energy/pulse_rifle/destroyer
|
||||
name = "pulse destroyer"
|
||||
desc = "A heavy-duty, pulse-based energy weapon. Because of its complexity and cost, it is rarely seen in use except by specialists."
|
||||
fire_sound='sound/weapons/gauss_shoot.ogg'
|
||||
projectile_type=/obj/item/projectile/beam/pulse
|
||||
charge_cost = 120
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
|
||||
icon_state = "decloner"
|
||||
item_state = "decloner"
|
||||
fire_sound = 'sound/weapons/pulse3.ogg'
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_POWER = 3)
|
||||
projectile_type = /obj/item/projectile/energy/declone
|
||||
|
||||
@@ -39,7 +38,6 @@
|
||||
desc = "A tool that discharges controlled radiation which induces mutation in plant cells."
|
||||
icon_state = "floramut100"
|
||||
item_state = "floramut"
|
||||
fire_sound = 'sound/effects/stealthoff.ogg'
|
||||
projectile_type = /obj/item/projectile/energy/floramut
|
||||
origin_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3)
|
||||
modifystate = "floramut"
|
||||
@@ -112,13 +110,11 @@
|
||||
desc = "A custom-built weapon of some kind."
|
||||
icon_state = "xray"
|
||||
projectile_type = /obj/item/projectile/beam/mindflayer
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
|
||||
/obj/item/weapon/gun/energy/toxgun
|
||||
name = "phoron pistol"
|
||||
desc = "A specialized firearm designed to fire lethal bolts of phoron."
|
||||
icon_state = "toxgun"
|
||||
fire_sound = 'sound/effects/stealthoff.ogg'
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4)
|
||||
projectile_type = /obj/item/projectile/energy/phoron
|
||||
@@ -131,7 +127,6 @@
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
item_icons = null
|
||||
icon_state = "staffofchange"
|
||||
fire_sound = 'sound/weapons/emitter.ogg'
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BACK
|
||||
w_class = ITEMSIZE_LARGE
|
||||
@@ -187,7 +182,6 @@ obj/item/weapon/gun/energy/staff/focus
|
||||
icon_state = "dakkalaser"
|
||||
item_state = "dakkalaser"
|
||||
wielded_item_state = "dakkalaser-wielded"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
w_class = ITEMSIZE_HUGE
|
||||
charge_cost = 24 // 100 shots, it's a spray and pray (to RNGesus) weapon.
|
||||
projectile_type = /obj/item/projectile/energy/blue_pellet
|
||||
@@ -211,7 +205,6 @@ obj/item/weapon/gun/energy/staff/focus
|
||||
icon_state = "mhdhowitzer"
|
||||
item_state = "mhdhowitzer"
|
||||
wielded_item_state = "mhdhowitzer-wielded"
|
||||
fire_sound = 'sound/weapons/emitter2.ogg'
|
||||
w_class = ITEMSIZE_HUGE
|
||||
|
||||
charge_cost = 10000 // Uses large cells, can at max have 3 shots.
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
icon_state = "taser"
|
||||
item_state = null //so the human update icon uses the icon_state instead.
|
||||
projectile_type = /obj/item/projectile/beam/stun
|
||||
charge_cost = 480
|
||||
|
||||
/obj/item/weapon/gun/energy/taser/mounted
|
||||
name = "mounted taser gun"
|
||||
@@ -36,7 +37,6 @@
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 2000)
|
||||
slot_flags = SLOT_BELT | SLOT_HOLSTER
|
||||
silenced = 1
|
||||
fire_sound = 'sound/weapons/Genhit.ogg'
|
||||
projectile_type = /obj/item/projectile/energy/bolt
|
||||
charge_cost = 480
|
||||
cell_type = /obj/item/weapon/cell/device/weapon/recharge
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/obj/item/weapon/gun/energy/temperature
|
||||
name = "temperature gun"
|
||||
icon_state = "freezegun"
|
||||
fire_sound = 'sound/weapons/pulse3.ogg'
|
||||
desc = "A gun that can add or remove heat from entities it hits. In other words, it can fire 'cold', and 'hot' beams."
|
||||
charge_cost = 240
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
w_class = ITEMSIZE_LARGE
|
||||
force = 10
|
||||
|
||||
fire_sound = 'sound/weapons/empty.ogg'
|
||||
fire_sound = 'sound/weapons/grenade_launcher.ogg'
|
||||
fire_sound_text = "a metallic thunk"
|
||||
recoil = 0
|
||||
throw_distance = 7
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
flags = CONDUCT
|
||||
fire_sound_text = "a loud whoosh of moving air"
|
||||
fire_delay = 50
|
||||
fire_sound = 'sound/weapons/tablehit1.ogg'
|
||||
fire_sound = 'sound/weapons/grenade_launcher.ogg' // Formerly tablehit1.ogg but I like this better -Ace
|
||||
|
||||
var/fire_pressure // Used in fire checks/pressure checks.
|
||||
var/max_w_class = ITEMSIZE_NORMAL // Hopper intake size.
|
||||
|
||||
@@ -20,8 +20,6 @@
|
||||
var/power_cost = 950 // Cost per fire, should consume almost an entire basic cell.
|
||||
var/power_per_tick // Capacitor charge per process(). Updated based on capacitor rating.
|
||||
|
||||
fire_sound = 'sound/weapons/railgun.ogg'
|
||||
|
||||
/obj/item/weapon/gun/magnetic/New()
|
||||
START_PROCESSING(SSobj, src)
|
||||
if(capacitor)
|
||||
|
||||
@@ -102,7 +102,6 @@
|
||||
load_type = /obj/item/weapon/magnetic_ammo
|
||||
projectile_type = /obj/item/projectile/bullet/magnetic/flechette
|
||||
loaded = /obj/item/weapon/magnetic_ammo
|
||||
fire_sound = 'sound/weapons/rapidslice.ogg'
|
||||
empty_sound = 'sound/weapons/smg_empty_alarm.ogg'
|
||||
|
||||
firemodes = list(
|
||||
|
||||
@@ -121,10 +121,10 @@
|
||||
chargecost_lethal = 200
|
||||
|
||||
firemodes = list(
|
||||
new /datum/firemode(src, list(mode_name="stun", projectile_type=beammode, fire_sound='sound/weapons/Taser.ogg', charge_cost = chargecost)),
|
||||
new /datum/firemode(src, list(mode_name="lethal", projectile_type=beammode_lethal, fire_sound='sound/weapons/Laser.ogg', charge_cost = chargecost_lethal)),
|
||||
new /datum/firemode(src, list(mode_name="[burstmode] shot stun", projectile_type=beammode, fire_sound='sound/weapons/Taser.ogg', charge_cost = chargecost, burst = burstmode)),
|
||||
new /datum/firemode(src, list(mode_name="[burstmode] shot lethal", projectile_type=beammode_lethal, fire_sound='sound/weapons/Laser.ogg', charge_cost = chargecost_lethal, burst = burstmode)),
|
||||
new /datum/firemode(src, list(mode_name="stun", projectile_type=beammode, charge_cost = chargecost)),
|
||||
new /datum/firemode(src, list(mode_name="lethal", projectile_type=beammode_lethal, charge_cost = chargecost_lethal)),
|
||||
new /datum/firemode(src, list(mode_name="[burstmode] shot stun", projectile_type=beammode, charge_cost = chargecost, burst = burstmode)),
|
||||
new /datum/firemode(src, list(mode_name="[burstmode] shot lethal", projectile_type=beammode_lethal, charge_cost = chargecost_lethal, burst = burstmode)),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/modular/load_ammo(var/obj/item/C, mob/user)
|
||||
|
||||
@@ -46,7 +46,6 @@
|
||||
caliber = "10mm"
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
|
||||
slot_flags = SLOT_BELT|SLOT_BACK
|
||||
fire_sound = 'sound/weapons/Gunshot_light.ogg'
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m10mm
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m10mm)
|
||||
@@ -107,7 +106,6 @@
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2)
|
||||
slot_flags = SLOT_BELT
|
||||
ammo_type = "/obj/item/ammo_casing/a9mmr"
|
||||
fire_sound = 'sound/weapons/Gunshot_light.ogg'
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m9mmt/rubber
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m9mmt)
|
||||
@@ -131,7 +129,6 @@
|
||||
force = 10
|
||||
caliber = "7.62mm"
|
||||
origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 3)
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
slot_flags = SLOT_BACK
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m762
|
||||
@@ -204,7 +201,6 @@
|
||||
caliber = "5.45mm"
|
||||
origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 2)
|
||||
slot_flags = SLOT_BACK
|
||||
fire_sound = 'sound/weapons/machinegun.ogg'
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m545saw
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m545saw, /obj/item/ammo_magazine/m545)
|
||||
@@ -337,7 +333,6 @@
|
||||
caliber = "9mm"
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2)
|
||||
slot_flags = SLOT_BELT // ToDo: Belt sprite.
|
||||
fire_sound = 'sound/weapons/Gunshot_light.ogg'
|
||||
load_method = MAGAZINE
|
||||
magazine_type = /obj/item/ammo_magazine/m9mmp90
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m9mmp90, /obj/item/ammo_magazine/m9mmt) // ToDo: New sprite for the different mag.
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
desc = "A reproduction of an almost ancient weapon design from the early 20th century. It's still popular among hunters and collectors due to its reliability. Uses 7.62mm rounds."
|
||||
item_state = "boltaction"
|
||||
icon_state = "boltaction"
|
||||
fire_sound = 'sound/weapons/rifleshot.ogg'
|
||||
fire_sound = 'sound/weapons/Gunshot_generic_rifle.ogg'
|
||||
max_shells = 5
|
||||
caliber = "7.62mm"
|
||||
origin_tech = list(TECH_COMBAT = 1)// Old as shit rifle doesn't have very good tech.
|
||||
@@ -29,7 +29,7 @@
|
||||
if(istype(A, /obj/item/weapon/surgical/circular_saw) || istype(A, /obj/item/weapon/melee/energy) || istype(A, /obj/item/weapon/pickaxe/plasmacutter) && w_class != ITEMSIZE_NORMAL)
|
||||
user << "<span class='notice'>You begin to shorten the barrel and stock of \the [src].</span>"
|
||||
if(loaded.len)
|
||||
afterattack(user, user) //will this work? //it will. we call it twice, for twice the FUN
|
||||
afterattack(user, user)
|
||||
playsound(user, fire_sound, 50, 1)
|
||||
user.visible_message("<span class='danger'>[src] goes off!</span>", "<span class='danger'>The rifle goes off in your face!</span>")
|
||||
return
|
||||
@@ -53,7 +53,6 @@
|
||||
desc = "A reproduction of an almost ancient weapon design from the 19th century. This one uses a lever-action to move new rounds into the chamber. Uses 7.62mm rounds."
|
||||
item_state = "leveraction"
|
||||
icon_state = "leveraction"
|
||||
fire_sound = 'sound/weapons/rifleshot.ogg'
|
||||
max_shells = 5
|
||||
caliber = "7.62mm"
|
||||
origin_tech = list(TECH_COMBAT = 1)// Old as shit rifle doesn't have very good tech.
|
||||
|
||||
@@ -132,8 +132,8 @@
|
||||
item_state = "deagle"
|
||||
force = 14.0
|
||||
caliber = ".44"
|
||||
fire_sound = 'sound/weapons/Gunshot_deagle.ogg'
|
||||
load_method = MAGAZINE
|
||||
fire_sound = 'sound/weapons/deagle.ogg'
|
||||
magazine_type = /obj/item/ammo_magazine/m44
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m44)
|
||||
|
||||
@@ -154,33 +154,13 @@
|
||||
icon_state = "deaglecamo"
|
||||
item_state = "deagleg"
|
||||
|
||||
/*
|
||||
/obj/item/weapon/gun/projectile/fiveseven
|
||||
name = "\improper WT-AP57"
|
||||
desc = "This tacticool pistol made by Ward-Takahashi trades stopping power for armor piercing and a large capacity. Uses 5mm rounds."
|
||||
icon_state = "fnseven"
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2)
|
||||
caliber = "5mm"
|
||||
load_method = MAGAZINE
|
||||
fire_sound = 'sound/weapons/semiauto.ogg'
|
||||
magazine_type = /obj/item/ammo_magazine/c5mm
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/c5mm)
|
||||
|
||||
/obj/item/weapon/gun/projectile/fiveseven/update_icon()
|
||||
..()
|
||||
if(ammo_magazine)
|
||||
icon_state = "fnseven"
|
||||
else
|
||||
icon_state = "fnseven-empty"
|
||||
*/
|
||||
|
||||
/obj/item/weapon/gun/projectile/gyropistol // Does this even appear anywhere outside of admin abuse?
|
||||
name = "gyrojet pistol"
|
||||
desc = "Speak softly, and carry a big gun. Fires rare .75 caliber self-propelled exploding bolts--because fuck you and everything around you."
|
||||
icon_state = "gyropistol"
|
||||
max_shells = 8
|
||||
caliber = ".75"
|
||||
fire_sound = 'sound/weapons/rpg.ogg'
|
||||
fire_sound = 'sound/weapons/railgun.ogg'
|
||||
origin_tech = list(TECH_COMBAT = 3)
|
||||
ammo_type = "/obj/item/ammo_casing/a75"
|
||||
load_method = MAGAZINE
|
||||
@@ -331,7 +311,6 @@
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2)
|
||||
caliber = "9mm"
|
||||
load_method = MAGAZINE
|
||||
fire_sound = 'sound/weapons/gunshot3.ogg'
|
||||
magazine_type = /obj/item/ammo_magazine/m9mm
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m9mm) // Can accept illegal large capacity magazines, or compact magazines.
|
||||
|
||||
|
||||
@@ -46,7 +46,6 @@
|
||||
icon_state = "detective"
|
||||
caliber = ".38"
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
|
||||
fire_sound = 'sound/weapons/gunshot3.ogg'
|
||||
ammo_type = /obj/item/ammo_casing/a38
|
||||
|
||||
/obj/item/weapon/gun/projectile/revolver/detective/verb/rename_gun()
|
||||
@@ -73,7 +72,6 @@
|
||||
icon_state = "detective"
|
||||
caliber = ".45"
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
|
||||
fire_sound = 'sound/weapons/gunshot_heavy.ogg'
|
||||
ammo_type = /obj/item/ammo_casing/a45/rubber
|
||||
max_shells = 7
|
||||
|
||||
@@ -125,7 +123,6 @@ obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun()
|
||||
icon_state = "deckard-empty"
|
||||
caliber = ".38"
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
|
||||
fire_sound = 'sound/weapons/gunshot3.ogg'
|
||||
ammo_type = /obj/item/ammo_casing/a38
|
||||
|
||||
/obj/item/weapon/gun/projectile/revolver/deckard/emp
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
caliber = "7.62mm"
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
|
||||
slot_flags = SLOT_BACK
|
||||
fire_sound = 'sound/weapons/rifleshot.ogg'
|
||||
//fire_sound = 'sound/weapons/rifleshot.ogg'
|
||||
load_method = MAGAZINE // ToDo: Make it so MAGAZINE, SPEEDLOADER and SINGLE_CASING can all be used on the same gun.
|
||||
magazine_type = /obj/item/ammo_magazine/m762garand
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m762garand)
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
scoped_accuracy = 0
|
||||
// requires_two_hands = 1
|
||||
// one_handed_penalty = 60 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand.
|
||||
fire_sound = 'sound/weapons/SVD_shot.ogg'
|
||||
fire_sound = 'sound/weapons/Gunshot_SVD.ogg' // Has a very unique sound.
|
||||
magazine_type = /obj/item/ammo_magazine/m762svd
|
||||
allowed_magazines = list(/obj/item/ammo_magazine/m762svd)
|
||||
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "spikethrower3"
|
||||
item_state = "spikethrower"
|
||||
fire_sound_text = "a strange noise"
|
||||
fire_sound = 'sound/weapons/bladeslice.ogg'
|
||||
fire_sound_text = "a strange noise"
|
||||
|
||||
/obj/item/weapon/gun/launcher/spikethrower/New()
|
||||
..()
|
||||
|
||||
@@ -109,8 +109,10 @@
|
||||
var/modifier_duration = null // How long the above modifier should last for. Leave null to be permanent.
|
||||
|
||||
embed_chance = 0 //Base chance for a projectile to embed
|
||||
var/fire_sound
|
||||
var/vacuum_traversal = 1 //Determines if the projectile can exist in vacuum, if false, the projectile will be deleted if it enters vacuum.
|
||||
|
||||
var/fire_sound = 'sound/weapons/Gunshot_old.ogg' // Can be overriden in gun.dm's fire_sound var. It can also be null but I don't know why you'd ever want to do that. -Ace
|
||||
|
||||
var/vacuum_traversal = TRUE //Determines if the projectile can exist in vacuum, if false, the projectile will be deleted if it enters vacuum.
|
||||
|
||||
/obj/item/projectile/proc/Range()
|
||||
range--
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
/obj/item/projectile/beam/pulse
|
||||
name = "pulse"
|
||||
icon_state = "u_laser"
|
||||
fire_sound='sound/weapons/pulse.ogg'
|
||||
fire_sound='sound/weapons/gauss_shoot.ogg' // Needs a more meaty sound than what pulse.ogg currently is; this will be a placeholder for now.
|
||||
damage = 100 //Badmin toy, don't care
|
||||
armor_penetration = 100
|
||||
light_color = "#0066FF"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/projectile/bullet
|
||||
name = "bullet"
|
||||
icon_state = "bullet"
|
||||
fire_sound = 'sound/weapons/gunshot/gunshot_strong.ogg'
|
||||
fire_sound = 'sound/weapons/Gunshot4.ogg'
|
||||
damage = 60
|
||||
damage_type = BRUTE
|
||||
nodamage = 0
|
||||
@@ -65,7 +65,7 @@
|
||||
/* short-casing projectiles, like the kind used in pistols or SMGs */
|
||||
|
||||
/obj/item/projectile/bullet/pistol // 9mm pistols and most SMGs. Sacrifice power for capacity.
|
||||
fire_sound = 'sound/weapons/gunshot/gunshot_pistol.ogg' // ToDo: Different shot sounds for different strength pistols. -Ace
|
||||
fire_sound = 'sound/weapons/gunshot2.ogg'
|
||||
damage = 20
|
||||
|
||||
/obj/item/projectile/bullet/pistol/ap
|
||||
@@ -77,7 +77,7 @@
|
||||
armor_penetration = -50
|
||||
|
||||
/obj/item/projectile/bullet/pistol/medium // .45 (and maybe .40 if it ever gets added) caliber security pistols. Balance between capacity and power.
|
||||
// fire_sound = 'sound/weapons/gunshot3.ogg' // ToDo: Different shot sounds for different strength pistols.
|
||||
fire_sound = 'sound/weapons/gunshot3.ogg' // Snappier sound.
|
||||
damage = 25
|
||||
|
||||
/obj/item/projectile/bullet/pistol/medium/ap
|
||||
@@ -89,11 +89,11 @@
|
||||
armor_penetration = -50
|
||||
|
||||
/obj/item/projectile/bullet/pistol/strong // .357 and .44 caliber stuff. High power pistols like the Mateba or Desert Eagle. Sacrifice capacity for power.
|
||||
fire_sound = 'sound/weapons/gunshot/gunshot_strong.ogg' // ToDo: Replace with something less ugly. I recommend weapons/gunshot3.ogg
|
||||
fire_sound = 'sound/weapons/gunshot4.ogg'
|
||||
damage = 60
|
||||
|
||||
/obj/item/projectile/bullet/pistol/rubber/strong // "Rubber" bullets for high power pistols.
|
||||
fire_sound = 'sound/weapons/gunshot/gunshot_strong.ogg' // ToDo: Same as above.
|
||||
fire_sound = 'sound/weapons/gunshot3.ogg' // Rubber shots have less powder, but these still have more punch than normal rubber shot.
|
||||
damage = 10
|
||||
agony = 60
|
||||
embed_chance = 0
|
||||
@@ -107,12 +107,13 @@
|
||||
embed_chance = 0
|
||||
sharp = 0
|
||||
check_armour = "melee"
|
||||
fire_sound ='sound/weapons/Gunshot_pathetic.ogg' // Rubber shots have less powder in the casing.
|
||||
|
||||
/* shotgun projectiles */
|
||||
|
||||
/obj/item/projectile/bullet/shotgun
|
||||
name = "slug"
|
||||
fire_sound = 'sound/weapons/gunshot/shotgun.ogg'
|
||||
fire_sound = 'sound/weapons/Gunshot_shotgun.ogg'
|
||||
damage = 50
|
||||
armor_penetration = 15
|
||||
|
||||
@@ -128,7 +129,7 @@
|
||||
//Overall less damage than slugs in exchange for more damage at very close range and more embedding
|
||||
/obj/item/projectile/bullet/pellet/shotgun
|
||||
name = "shrapnel"
|
||||
fire_sound = 'sound/weapons/gunshot/shotgun.ogg'
|
||||
fire_sound = 'sound/weapons/Gunshot_shotgun.ogg'
|
||||
damage = 13
|
||||
pellets = 6
|
||||
range_step = 1
|
||||
@@ -143,7 +144,7 @@
|
||||
//EMP shotgun 'slug', it's basically a beanbag that pops a tiny emp when it hits. //Not currently used
|
||||
/obj/item/projectile/bullet/shotgun/ion
|
||||
name = "ion slug"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
fire_sound = 'sound/weapons/Laser.ogg' // Really? We got nothing better than this?
|
||||
damage = 15
|
||||
embed_chance = 0
|
||||
sharp = 0
|
||||
@@ -160,14 +161,18 @@
|
||||
/* "Rifle" rounds */
|
||||
|
||||
/obj/item/projectile/bullet/rifle
|
||||
fire_sound = 'sound/weapons/gunshot/gunshot3.ogg'
|
||||
fire_sound = 'sound/weapons/Gunshot_generic_rifle.ogg'
|
||||
armor_penetration = 15
|
||||
penetrating = 1
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a762
|
||||
fire_sound = 'sound/weapons/gunshot/gunshot2.ogg'
|
||||
fire_sound = 'sound/weapons/Gunshot_heavy.ogg'
|
||||
damage = 35
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a762/sniper // Hitscan specifically for sniper ammo; to be implimented at a later date, probably for the SVD. -Ace
|
||||
fire_sound = 'sound/weapons/Gunshot_sniper.ogg'
|
||||
hitscan = 1 //so the ammo isn't useless as a sniper weapon
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a762/ap
|
||||
damage = 30
|
||||
armor_penetration = 50 // At 30 or more armor, this will do more damage than standard rounds.
|
||||
@@ -177,12 +182,13 @@
|
||||
armor_penetration = -50
|
||||
penetrating = 0
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a762/hunter // Optimized for killing simple animals and not people, because Balance.
|
||||
/obj/item/projectile/bullet/rifle/a762/hunter // Optimized for killing simple animals and not people, because Balance(tm)
|
||||
damage = 20
|
||||
SA_bonus_damage = 50 // 70 total on animals.
|
||||
SA_vulnerability = SA_ANIMAL
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a545
|
||||
fire_sound = 'sound/weapons/Gunshot_light.ogg'
|
||||
damage = 25
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a545/ap
|
||||
@@ -199,8 +205,8 @@
|
||||
SA_bonus_damage = 35 // 50 total on animals.
|
||||
SA_vulnerability = SA_ANIMAL
|
||||
|
||||
/obj/item/projectile/bullet/rifle/a145
|
||||
fire_sound = 'sound/weapons/gunshot/sniper.ogg'
|
||||
/obj/item/projectile/bullet/rifle/a145 // 14.5×114mm is bigger than a .50 BMG round.
|
||||
fire_sound = 'sound/weapons/Gunshot_cannon.ogg' // This is literally an anti-tank rifle caliber. It better sound like a fucking cannon.
|
||||
damage = 80
|
||||
stun = 3
|
||||
weaken = 3
|
||||
@@ -258,28 +264,15 @@
|
||||
damage = 15
|
||||
range = 6
|
||||
|
||||
/obj/item/projectile/bullet/blank
|
||||
invisibility = 101
|
||||
damage = 1
|
||||
embed_chance = 0
|
||||
/* Practice rounds and blanks */
|
||||
|
||||
/* Practice */
|
||||
|
||||
/obj/item/projectile/bullet/pistol/practice
|
||||
/obj/item/projectile/bullet/practice
|
||||
damage = 5
|
||||
|
||||
/obj/item/projectile/bullet/rifle/practice
|
||||
damage = 5
|
||||
penetrating = 0
|
||||
|
||||
/obj/item/projectile/bullet/shotgun/practice
|
||||
name = "practice"
|
||||
damage = 5
|
||||
|
||||
/obj/item/projectile/bullet/pistol/cap
|
||||
/obj/item/projectile/bullet/pistol/cap // Just the primer, such as a cap gun.
|
||||
name = "cap"
|
||||
damage_type = HALLOSS
|
||||
fire_sound = null
|
||||
fire_sound = 'sound/effects/snap.ogg'
|
||||
damage = 0
|
||||
nodamage = 1
|
||||
embed_chance = 0
|
||||
@@ -288,5 +281,18 @@
|
||||
combustion = FALSE
|
||||
|
||||
/obj/item/projectile/bullet/pistol/cap/process()
|
||||
loc = null
|
||||
qdel(src)
|
||||
|
||||
/obj/item/projectile/bullet/blank
|
||||
name = "blank"
|
||||
damage_type = HALLOSS
|
||||
fire_sound = 'sound/weapons/Gunshot_generic_rifle.ogg' // Blanks still make loud noises.
|
||||
damage = 0
|
||||
nodamage = 1
|
||||
embed_chance = 0
|
||||
sharp = 0
|
||||
|
||||
/obj/item/projectile/bullet/blank/cap/process()
|
||||
loc = null
|
||||
qdel(src)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user