Merge remote-tracking branch 'polaris/master' into pixel_projectiles

This commit is contained in:
kevinz000
2019-01-06 23:12:48 -08:00
225 changed files with 1742 additions and 977 deletions
@@ -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))
+6
View File
@@ -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
+3
View File
@@ -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"
+1
View File
@@ -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)
+5
View File
@@ -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)
+1
View File
@@ -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
View File
@@ -59,7 +59,7 @@
return ..()
/datum/beam/proc/Draw()
if(QDELETED(target) || !QDELETED(origin))
if(QDELETED(target) || QDELETED(origin))
qdel(src)
return
+1 -1
View File
@@ -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)
+29
View File
@@ -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
+16
View File
@@ -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
+10 -2
View File
@@ -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)
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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>"
+4 -4
View File
@@ -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>")
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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.
+4 -4
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
+19 -18
View File
@@ -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
+1 -1
View File
@@ -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
+11 -14
View File
@@ -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
+10 -14
View File
@@ -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.", \
+4 -4
View File
@@ -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"
+11 -2
View File
@@ -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)
+24 -24
View File
@@ -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
View File
@@ -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')
-1
View File
@@ -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."
+3 -3
View File
@@ -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
+8 -8
View File
@@ -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"
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
+15 -10
View File
@@ -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))
+12 -12
View File
@@ -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."
+12 -4
View File
@@ -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."
+2 -1
View File
@@ -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")
+3 -3
View File
@@ -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.
+4 -1
View File
@@ -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
View File
@@ -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.
+16
View File
@@ -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)
+2
View File
@@ -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)
+1 -1
View File
@@ -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())
+1 -1
View File
@@ -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
View File
@@ -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))
+85 -2
View File
@@ -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))
+27 -14
View File
@@ -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
+4 -4
View File
@@ -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
+12 -1
View File
@@ -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
+10 -11
View File
@@ -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 -3
View File
@@ -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.
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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()
..()
+4 -2
View File
@@ -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--
+1 -1
View File
@@ -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"
+36 -30
View File
@@ -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