Merge branch 'master' of github.com:Baystation12/Baystation12

This commit is contained in:
Hawk-v3
2012-03-02 19:07:44 +00:00
62 changed files with 4654 additions and 2622 deletions

View File

@@ -26,6 +26,7 @@
#define FILE_DIR "code/defines/obj"
#define FILE_DIR "code/defines/obj/clothing"
#define FILE_DIR "code/defines/procs"
#define FILE_DIR "code/defines/sd_procs"
#define FILE_DIR "code/FEA"
#define FILE_DIR "code/game"
#define FILE_DIR "code/game/area"
@@ -354,6 +355,10 @@
#include "code\defines\procs\statistics.dm"
#include "code\defines\procs\syndicate_name.dm"
#include "code\defines\procs\time_stamp.dm"
#include "code\defines\sd_procs\base64.dm"
#include "code\defines\sd_procs\constants.dm"
#include "code\defines\sd_procs\direction.dm"
#include "code\defines\sd_procs\math.dm"
#include "code\FEA\FEA_airgroup.dm"
#include "code\FEA\FEA_fire.dm"
#include "code\FEA\FEA_gas_mixture.dm"
@@ -533,7 +538,7 @@
#include "code\game\machinery\computer\id.dm"
#include "code\game\machinery\computer\lockdown.dm"
#include "code\game\machinery\computer\medical.dm"
#include "code\game\machinery\computer\Operating.dm"
#include "code\game\machinery\computer\operating.dm"
#include "code\game\machinery\computer\power.dm"
#include "code\game\machinery\computer\robot.dm"
#include "code\game\machinery\computer\security.dm"

View File

@@ -439,6 +439,13 @@
invisibility = 2
else
invisibility = 0
if(targeted_by && target_locked)
overlays += target_locked
else if(targeted_by)
target_locked = new /obj/effect/target_locked(src)
overlays += target_locked
else if(!targeted_by && target_locked)
del(target_locked)
/*
for (var/mob/M in viewers(1, src))//For the love of god DO NOT REFRESH EVERY SECOND - Mport

View File

@@ -62,6 +62,7 @@
update_icon()
examine()
set src in oview(7)
..()
if(src in usr)
usr << "It claims to contain [contents.len ? descriptor : descriptor + "... but it looks empty"]."

View File

@@ -557,10 +557,6 @@ proc/process_ghost_teleport_locs()
name = "Escape Shuttle Hallway"
icon_state = "escape"
/area/hallway/secondary/construction
name = "Construction Area"
icon_state = "construction"
/area/hallway/secondary/entry
name = "Arrival Shuttle Hallway"
icon_state = "entry"
@@ -585,16 +581,24 @@ proc/process_ghost_teleport_locs()
name = "Courtroom"
icon_state = "courtroom"
/area/crew_quarters/heads
/area/crew_quarters/heads/hop
name = "Head of Personnel's Quarters"
icon_state = "head_quarters"
/area/crew_quarters/hor
name = "Research Director's Office"
/area/crew_quarters/heads/hor
name = "Research Director's Quarters"
icon_state = "head_quarters"
/area/crew_quarters/chief
name = "Chief Engineer's Office"
/area/crew_quarters/heads/ce
name = "Chief Engineer's Quarters"
icon_state = "head_quarters"
/area/crew_quarters/heads/hos
name = "Head of Security's Quarters"
icon_state = "head_quarters"
/area/crew_quarters/heads/cmo
name = "Chief Medical Officer's Quarters"
icon_state = "head_quarters"
/area/mint
@@ -982,6 +986,10 @@ proc/process_ghost_teleport_locs()
name = "Research Lab"
icon_state = "researchlab"
/area/toxins/rdoffice
name = "Research Director's Office"
icon_state = "head_quarters"
/area/toxins/xenobiology
name = "Xenobiology Lab"
icon_state = "xenolab"
@@ -1157,6 +1165,14 @@ proc/process_ghost_teleport_locs()
name = "Construction Area"
icon_state = "yellow"
/area/construction/under_construction_small
name = "Construction Area"
icon_state = "construction"
/area/construction/under_construction_large
name = "Construction Area"
icon_state = "construction"
/area/construction/supplyshuttle
name = "Supply Shuttle"
icon_state = "yellow"

View File

@@ -41,6 +41,9 @@
var/obj/screen/healths = null
var/obj/screen/throw_icon = null
var/obj/screen/nutrition_icon = null
var/obj/screen/gun/item/item_use_icon = null
var/obj/screen/gun/move/gun_move_icon = null
var/obj/screen/gun/run/gun_run_icon = null
var/total_luminosity = 0 //This controls luminosity for mobs, when you pick up lights and such this is edited. If you want the mob to use lights it must update its lum in its life proc or such. Note clamp this value around 7 or such to prevent massive light lag.
var/last_luminosity = 0

View File

@@ -0,0 +1,32 @@
/* Atom procs
These procs expand on the basic built in procs.
Bumped(O)
Automatically called whenever a movable atom O Bump()s into src.
Proc protype designed to be overridden for specific objects.
Trigger(O)
Automatically called whenever a movable atom O steps into the same
turf with src.
Proc protype designed to be overridden for specific objects.
*/
atom
proc
Bumped(O)
// O just Bump()ed into src.
// prototype Bumped() proc for all atoms
Trigger(O)
atom/movable
Bump(atom/A)
if(istype(A)) A.Bumped(src) // tell A that src bumped into it
..()
turf
Entered(atom/O)
for(var/atom/A in contents - O)
if(O)
O.Trigger(A)
..()

View File

@@ -0,0 +1,131 @@
/* base 64 procs
These procs convert plain text to a hexidecimal string to 64 encoded text and vice versa.
sd_base64toHex(encode64, pad_code = 67)
Accepts a base 64 encoded text and returns the hexidecimal equivalent.
ARGS:
encode64 = the base64 text to convert
pad_code = the character or ASCII code used to pad the base64 text.
DEFAULT: 67 (= sign)
RETURNS: the hexidecimal text
sd_hex2base64(hextext, pad_char = "=")
Accepts a hexidecimal string and returns the base 64 encoded text equivalent.
ARGS:
hextext = hex text to convert
pad_char = the character or ASCII code used to pad the base64 text.
DEFAULT: "=" (ASCII 67)
RETURNS: the base64 text
sd_hex2text(hex)
Accepts a hexidecimal string and returns the plain text equivalent.
sd_text2hex(txt)
Accepts a plain text string and returns the hexidecimal equivalent.
*/
/*********************************************
* Implimentation: No need to read further. *
*********************************************/
proc
sd_base64toHex(encode64, pad_code = 67)
/* convert the base 64 text encode64 to hexidecimal text
pad_code = the character or ASCII code used to pad the base64 text.
DEFAULT: 67 (= sign)
RETURNS: the hexidecimal text */
var
pos = 1
offset = 2
current = 0
padding = 0
hextext = ""
if(istext(pad_code)) pad_code = text2ascii(pad_code)
while(pos <= length(encode64))
var/val = text2ascii(encode64, pos++)
if((val >= 65) && (val <= 90)) // A to Z
val -= 65
else if((val >= 97) && (val <= 122)) // a to z
val -= 71
else if((val >= 48) && (val <= 57)) // 0 to 9
val += 4
else if(val == 43) // + sign
val = 62
else if(val == 47) // / symbol
val = 63
else if(pad_code) // padding
// the = sign indicates that some 0 bits were appended to pad the original string to
val = -1
padding ++
else // anything else (presumably whitespace)
val = -1
if(val < 0) continue // whitespace and padding ignored
if(offset>2)
var/lft = val >> (8 - offset)
current |= lft
hextext += sd_dec2base(current,,2)
current = (val << offset) & 0xFF
offset += 2
if(offset > 8)
offset = 2
if(padding)
hextext = copytext(hextext, 1, length(hextext) + 1 - padding * 2)
return hextext
sd_hex2base64(hextext, pad_char = "=")
/* convert the hexidecimal string hextext to base 64 encoded text
pad_char = the character or ASCII code used to pad the base64 text.
DEFAULT: "=" (ASCII 67)
RETURNS: the base 64 encoded text */
var
key64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
encode64 = ""
pos = 1
offset = 2
current = 0
len = length(hextext)
end = len
padding = end%6
if(padding)
padding = 6 - padding
end += padding
padding >>= 1
if(isnum(pad_char)) pad_char = ascii2text(pad_char)
while(pos <= end)
var/val = 0 // pad with 0s
if(pos < len) val = sd_base2dec(copytext(hextext, pos, pos+2))
pos+=2
var/lft = val >> offset
current |= lft
encode64 += copytext(key64,current+1,current+2)
current = (val << (6-offset)) & 0x3F
offset += 2
if(offset>6)
encode64 += copytext(key64,current+1,current+2)
offset = 2
current = 0
for(var/x = 1 to padding)
encode64 += pad_char
return encode64
sd_hex2text(hex)
/* convert hexidecimal text to a plain text string
RETURNS: the plain text */
var/txt = ""
for(var/loop = 1 to length(hex) step 2)
txt += ascii2text(sd_base2dec(copytext(hex,loop, loop+2)))
return txt
sd_text2hex(txt)
/* convert plain text to a hexidecimal string
RETURNS: the hexidecimal text */
var/hex = ""
for(var/loop = 1 to length(txt))
hex += sd_dec2base(text2ascii(txt,loop),,2)
return hex

View File

@@ -0,0 +1,75 @@
/* sd_color and procs
sd_color is a special datum that contains color data in various
formats. Sample colors are available in samplecolors.dm.
sd_color
var
name // the name of the color
red // red componant of the color
green // green componant of the color
blue // red componant of the color
html // html string for the color
icon/Icon // contains the icon produced by the rgb2icon() proc
PROCS
brightness()
Returns the grayscale brightness of the RGB color set.
html2rgb()
Calculates the rgb colors from the html colors.
rgb2html()
Calculates the html color from the rbg colors.
rgb2icon()
Converts the rgb value to a solid icon stored as src.Icon
*/
/*********************************************
* Implimentation: No need to read further. *
*********************************************/
sd_color
var
name // the name of the color
red = 0 // red componant of the color
green = 0 // green componant of the color
blue = 0 // red componant of the color
html // html string for the color
icon/Icon // contains the icon produced by the rgb2icon() proc
proc
brightness()
/* returns the grayscale brightness of the RGB colors. */
return round((red*30 + green*59 + blue*11)/100,1)
html2rgb()
/* Calculates the rgb colors from the html colors */
red = sd_base2dec(copytext(html,1,3))
green = sd_base2dec(copytext(html,3,5))
blue = sd_base2dec(copytext(html,5,7))
rgb2html()
/* Calculates the html color from the rbg colors */
html = sd_dec2base(red,,2) + sd_dec2base(green,,2) + sd_dec2base(blue,,2)
return html
rgb2icon()
/* Converts the rgb value to a solid icon stored as src.Icon */
Icon = 'Black.dmi' + rgb(red,green,blue)
return Icon
New()
..()
// if this is an unnamed subtype, name it according to it's type
if(!name)
name = "[type]"
var/slash = sd_findlast(name,"/")
if(slash)
name = copytext(name,slash+1)
name = sd_replacetext(name,"_"," ")
if(html) // if there is an html string
html2rgb() // convert the html to red, green, & blue values
else
rgb2html() // convert the red, green, & blue values to html

View File

@@ -0,0 +1 @@
#define PI 3.141592654

View File

@@ -0,0 +1,154 @@
/* Direction procs
These procs deal with BYOND directions.
sd_get_approx_dir(atom/ref,atom/target)
returns the approximate direction from ref to target.
sd_degrees2dir(degrees as num)
Accepts an angle in degrees and returns the closest BYOND
direction value.
sd_dir2degrees(dir as num)
Accepts a BYOND direction value and returns the angle North of
East in degrees.
sd_dir2radial(dir as num)
Accepts a BYOND direction value and returns the radial direction
(0-7) North of East.
sd_dir2radians(dir as num)
Accepts a BYOND direction value and returns the angle North of
East in radians.
sd_dir2text(dir as num)
Accepts a BYOND direction value and returns the lowercase text
name of the direction.
sd_dir2Text(dir as num)
Accepts a BYOND direction value and returns the Capitalized text
name of the direction
sd_radial2dir(radial as num)
Accepts a radial direction (0-7) and returns the BYOND direction
value.
*/
/*********************************************
* Implimentation: No need to read further. *
*********************************************/
proc
sd_get_approx_dir(atom/ref,atom/target)
/* returns the approximate direction from ref to target.
Code by Lummox JR
http://www.byond.com/forum/forum.cgi?action=message_list&query=Post+ID%3A153964#153964
*/
var/d=get_dir(ref,target)
if(d&d-1) // diagonal
var/ax=abs(ref.x-target.x)
var/ay=abs(ref.y-target.y)
if(ax>=ay<<1) return d&12 // keep east/west (4 and 8)
else if(ay>=ax<<1) return d&3 // keep north/south (1 and 2)
return d
sd_degrees2dir(degrees as num)
/* accepts an angle in degrees and returns the closest BYOND
direction value */
var/error_report = degrees // for error tracking
// force angle into a range between 0 and 360
degrees %= 360
if(degrees < 0)
degrees += 360
// BYOND dirs are at 45 degree angles
degrees = round(degrees,45)
switch(degrees)
if(0,360) return EAST
if(45) return NORTHEAST
if(90) return NORTH
if(135) return NORTHWEST
if(180) return WEST
if(225) return SOUTHWEST
if(270) return SOUTH
if(315) return SOUTHEAST
else
world.log << "Error in sd_degrees2dir(): [error_report] -> [degrees]"
sd_dir2degrees(dir as num)
/* accepts a BYOND direction value and returns the angle North of
East in degrees */
switch(dir)
if(EAST) return 0
if(NORTHEAST) return 45
if(NORTH) return 90
if(NORTHWEST) return 135
if(WEST) return 180
if(SOUTHWEST) return 225
if(SOUTH) return 270
if(SOUTHEAST) return 315
sd_dir2radial(dir as num)
/* accepts a BYOND direction value and returns the radial direction
(0-7) North of East */
switch(dir)
if(EAST) return 0
if(NORTHEAST) return 1
if(NORTH) return 2
if(NORTHWEST) return 3
if(WEST) return 4
if(SOUTHWEST) return 5
if(SOUTH) return 6
if(SOUTHEAST) return 7
sd_dir2radians(dir as num)
/* accepts a BYOND direction value and returns the angle North of
East in radians */
switch(dir)
if(EAST) return 0
if(NORTHEAST) return PI/4
if(NORTH) return PI/2
if(NORTHWEST) return PI*3/4
if(WEST) return PI
if(SOUTHWEST) return PI*5/4
if(SOUTH) return PI*3/2
if(SOUTHEAST) return PI*7/4
sd_dir2text(dir as num)
/* accepts a direction and returns the lowercase text name of
the direction */
switch(dir)
if(NORTH) return "north"
if(SOUTH) return "south"
if(EAST) return "east"
if(WEST) return "west"
if(NORTHEAST) return "northeast"
if(SOUTHEAST) return "southeast"
if(NORTHWEST) return "northwest"
if(SOUTHWEST) return "southwest"
sd_dir2Text(dir as num)
/* accepts a direction and returns the Capitalized text name of
the direction */
switch(dir)
if(NORTH) return "North"
if(SOUTH) return "South"
if(EAST) return "East"
if(WEST) return "West"
if(NORTHEAST) return "Northeast"
if(SOUTHEAST) return "Southeast"
if(NORTHWEST) return "Northwest"
if(SOUTHWEST) return "Southwest"
sd_radial2dir(radial as num)
/* accepts a radial direction (0-7) and returns the BYOND direction
value */
switch(radial)
if(0) return EAST
if(1) return NORTHEAST
if(2) return NORTH
if(3) return NORTHWEST
if(4) return WEST
if(5) return SOUTHWEST
if(6) return SOUTH
if(7) return SOUTHEAST

View File

@@ -0,0 +1,186 @@
/* HSL procs
These procs convert between RGB (red, green, blu) and HSL (hue, saturation, light)
color spaces. The algorithms used for these procs were found at
http://www.paris-pc-gis.com/MI_Enviro/Colors/color_models.htm
hsl2rgb(hue, sat, lgh, scale = 240)
Returns the RRGGBB format of an HSL color.
ALTERNATE FORMAT:
hsl2rgb(HSL, scale)
ARGS:
hue - hue
sat - saturation
lgh - light/dark
HSL - a hex string in format HHSSLL where:
HH = Hue from
SS = Saturation
LL = light
scale - high end of the HSL values. Some programs (like BYOND Dream Maker)
use 240, others use 255. The H {0-360}, S {0-100}, L {0-100}
scale is not supported.
DEFAULT: 240
RETURNS:
RGB color string in RRGGBB format.
rgb2hsl(red, grn, blu, scale = 240)
Returns the HSL color string of an RGB color
ALTERNATE FORMAT:
rgb2hsl(RGB, scale)
ARGS:
red - red componant {0-255}
grn - green componant {0-255}
blu - blue componant {0-255}
RGB - a hex string in format RRGGBB
scale - high end of the HSL values. Some programs (like BYOND Dream Maker)
use 240, others use 255. The H {0-360}, S {0-100}, L {0-100}
scale is not supported.
DEFAULT: 240
RETURNS:
HHSSLL color string
*/
/*********************************************
* Implimentation: No need to read further. *
*********************************************/
proc
hsl2rgb(hue, sat, lgh, scale = 240)
/* Returns the RRGGBB format of an HSL color string
algorithm from http://www.paris-pc-gis.com/MI_Enviro/Colors/color_models.htm
ALTERNATE FORMAT:
hsl2rgb(HSL, scale)
ARGS:
hue - hue
sat - saturation
lgh - light/dark
HSL - a hex string in format HHSSLL where:
HH = Hue from
SS = Saturation
LL = light
scale - high end of the HSL values. Some programs (like BYOND Dream Maker)
use 240, others use 255. The H {0-360}, S {0-100}, L {0-100}
scale is not supported.
DEFAULT: 240
RETURNS:
RGB color string in RRGGBB format. */
if(istext(hue)) // used alternate hsl2rgb("HHSSLL", scale)
if(length(hue)!=6)
CRASH("hsl2rbg('[hue]'): text argument must be a 6 character hex code.")
return
if(isnum(sat)) scale = sat
lgh = sd_base2dec(copytext(hue,5))
sat = sd_base2dec(copytext(hue,3,5))
hue = sd_base2dec(copytext(hue,1,3))
// scale decimal {0-1}
hue /= scale
sat /= scale
lgh /= scale
var
red
grn
blu
if(!sat) // greyscale
red = lgh
grn = lgh
blu = lgh
else
var
temp1
temp2
temp3
if(lgh < 0.5) temp2 = lgh * (1 + sat)
else temp2 = lgh + sat - lgh * sat
temp1 = 2 * lgh - temp2
// red
temp3 = hue + 1/3
if(temp3 > 1) temp3--
if(6*temp3<1) red = temp1 + (temp2 - temp1) * 6 * temp3
else if(2*temp3<1) red = temp2
else if(3*temp3<2) red = temp1 + (temp2 - temp1) * ((2/3) - temp3) * 6
else red = temp1
// green
temp3 = hue
if(6*temp3<1) grn = temp1 + (temp2 - temp1) * 6 * temp3
else if(2*temp3<1) grn = temp2
else if(3*temp3<2) grn = temp1 + (temp2 - temp1) * ((2/3) - temp3) * 6
else grn = temp1
// blue
temp3 = hue - 1/3
if(temp3 < 0) temp3++
if(6*temp3<1) blu = temp1 + (temp2 - temp1) * 6 * temp3
else if(2*temp3<1) blu = temp2
else if(3*temp3<2) blu = temp1 + (temp2 - temp1) * ((2/3) - temp3) * 6
else blu = temp1
// shift from {0-1} scale to integers {0-255}
red = round(red*255, 1)
grn = round(grn*255, 1)
blu = round(blu*255, 1)
// return 6 digit hex string
return sd_dec2base(red,16, 2) + sd_dec2base(grn,16, 2) + sd_dec2base(blu,16, 2)
rgb2hsl(red, grn, blu, scale = 240)
/* Returns the HSL color string of a RGB color
algorithm from http://www.paris-pc-gis.com/MI_Enviro/Colors/color_models.htm
ALTERNATE FORMAT:
rgb2hsl(RGB, scale)
ARGS:
red - red componant {0-255}
grn - green componant {0-255}
blu - blue componant {0-255}
RGB - a hex string in format RRGGBB
scale - high end of the HSL values. Some programs (like BYOND Dream Maker)
use 240, others use 255. The H {0-360}, S {0-100}, L {0-100}
scale is not supported.
DEFAULT: 240
RETURNS:
HHSSLL color string */
if(istext(red)) // used alternate rgb2hsl("RRGGBB", scale) format
if(length(red)!=6)
CRASH("rbg2hsl('[red]'): text argument must be a 6 character hex code.")
return
if(isnum(grn)) scale = grn
blu = sd_base2dec(copytext(red,5))
grn = sd_base2dec(copytext(red,3,5))
red = sd_base2dec(copytext(red,1,3))
// scale decimal {0-1}
red /= 255
grn /= 255
blu /= 255
var
lo = min(red, grn, blu)
hi = max(red, grn, blu)
hue = 0
sat = 0
lgh = (lo + hi)/2
if(lo != hi) // if equal, hue and sat may both stay 0
if(lgh < 0.5) sat = (hi - lo) / (hi + lo)
else sat = (hi - lo) / (2 - hi - lo)
// produce hue as value from 0-6
if(red == hi) hue = (grn - blu) / (hi - lo)
else if(grn == hi) hue = 2 + (blu - red) / (hi - lo)
else hue = 4 + (red - grn) / (hi - lo)
if(hue<0) hue += 6
// convert decimal {0-1} to integer {0-scale}
lgh = round(lgh * scale, 1)
sat = round(sat * scale, 1)
// convert hue as decimal 0-6 to integer {0-scale}
hue = round((hue / 6) * scale, 1)
// return 6 digit hex string
return sd_dec2base(hue,16, 2) + sd_dec2base(sat,16, 2) + sd_dec2base(lgh,16, 2)

View File

@@ -0,0 +1,117 @@
/* Math procs
These procs contain basic math routines.
sd_base2dec(number as text, base = 16 as num)
Accepts a number in any base (2 to 36) and returns the equivelent
value in decimal.
ARGS:
number - number to convert as a text string
base - number base
RETURNS:
decimal value of the number
sd_dec2base(decimal,base = 16 as num,digits = 0 as num)
Accepts a decimal number and returns the equivelent value in the
new base as a string.
ARGS:
decimal - number to convert
base - new number base
digits - if output is less than digits, it will add
preceeding 0s to pad it out
RETURNS:
equivelent value in the new base as a string
sd_get_dist(atom/A, atom/B)
Returns the mathematical 3D distance between two atoms.
sd_get_dist_squared(atom/A, atom/B)
Returns the square of the mathematical 3D distance between two atoms. (More processor
friendly than sd_get_dist() and useful for modelling realworld physics.)
*/
/*********************************************
* Implimentation: No need to read further. *
*********************************************/
proc
sd_base2dec(number as text, base = 16 as num)
/* Accepts a number in any base (2 to 36) and returns the equivelent
value in decimal.
ARGS:
number - number to convert as a text string
base - number base
RETURNS:
decimal value of the number
*/
if(!istext(number))
world.log << "sd_base2dec: invalid number string- [number]"
return null
if(!isnum(base) || (base < 2) || (base > 36))
world.log << "sd_base2dec: invalid base - [base]"
return null
var/decimal = 0
number = uppertext(number)
for(var/loop = 1, loop <= lentext(number))
var/digit = copytext(number,loop,++loop)
if((digit >= "0") && (digit <= "9"))
decimal = decimal * base + text2num(digit)
else if((digit >= "A") && (digit <= "Z"))
decimal = decimal * base + (text2ascii(digit) - 55)
else
break // terminate when it encounters an invalid character
return decimal
sd_dec2base(decimal,base = 16 as num,digits = 0 as num)
/* Accepts a decimal number and returns the equivelent value in the
new base as a string.
ARGS:
decimal - number to convert
base - new number base
digits - if output is less than digits, it will add
preceeding 0s to pad it out
RETURNS:
equivelent value in the new base as a string
*/
if(istext(decimal)) decimal = text2num(decimal)
decimal = round(decimal)
if(!isnum(decimal) || (decimal < 0))
world.log << "sd_dec2base: invalid decimal number - [decimal]"
return null
if(!isnum(base) || (base < 2) || (base > 36))
world.log << "sd_dec2base: invalid base - [base]"
return null
var/text = ""
if(!decimal) text = "0"
while(decimal)
var/n = decimal%base
if(n<10)
text = num2text(n) + text
else
text = ascii2text(55+n) + text
decimal = (decimal - n)/base
while(lentext(text) < digits)
text = "0" + text
return text
sd_get_dist(atom/A, atom/B)
/* Returns the mathematical 3D distance between two atoms. */
var/X = (A.x - B.x)
var/Y = (A.y - B.y)
var/Z = (A.z - B.z)
return sqrt(X * X + Y * Y + Z * Z)
sd_get_dist_squared(atom/A, atom/B)
/* Returns the square of the mathematical 3D distance between two atoms. (More processor
friendly than sd_get_dist() and useful for modelling realworld physics.) */
var/X = (A.x - B.x)
var/Y = (A.y - B.y)
var/Z = (A.z - B.z)
return X * X + Y * Y + Z * Z

View File

@@ -0,0 +1,140 @@
/* Nybble Colors
Nybble colors is used to compact RGB colors to "nybble" (4 bits, 1 hex
digit, or decimal numbers 0 to 15.) Since BYOND allows up to 16 bits in
bitwise mathematics, you could store up to 4 color values in a single
number. (The project inspiring these procs stores a foreground nybble
color, background nybble color, and 8 bit text character in each 16 bit
number.)
The value of each bit is:
Bit: 4 3 2 1
Component: Intensity Red Green Blue
Nybble color values are:
Dec Hex Bin Color
0 0 0000 null color. See the note below.
1 1 0001 dark blue (navy)
2 2 0010 dark green
3 3 0011 dark cyan
4 4 0100 dark red
5 5 0101 dark magenta
6 6 0110 brown
7 7 0111 grey
8 8 1000 black
9 9 1001 blue
10 A 1010 green
11 B 1011 cyan
12 C 1100 red
13 D 1101 magenta
14 E 1110 yellow
15 F 1111 white
Null color note: rgb2nybble() will return a value of 8 for black, so
that you may use 0 value nybbles for special cases in your own code.
For example, in the project that inspired these procs, color 0
indicates the default background, which is a textured image.
nybble2rgb() will convert values of 0 or 8 to "000000" (or "000" if
you specify short rgb.)
PROCS
sd_nybble2rgb(original, bit = 8, short = 0)
Converts a nybble color to an RGB hex color string.
ARGS:
value - the number containing the nibble
bit - the MSB (most significant bit) of the nybble. The
default value of 8 uses the lowest 4 bits of original.
DEFAULT: 8
short - short RGB flag. If this is set, the proc returns a
3 character RGB string. Otherwise it returns a 6
character RGB string.
DEFAULT: 0 (return 6 characters)
RETURNS:
A 3 or 6 character hexidecimal RGB color string.
sd_rgb2nybble(rgb, bit = 8)
Converts an rgb color string to a nybble color.
ARGS:
rgb - The color string to be converted. This may be a 3 or 6
character color code with or without a leading "#".
Examples: "000", "000000", "#000", "#000000" all
indicate black.
bit - the MSB (most significant bit) of the nybble. You can
use this to shift the position of your nybble within
the return value. The default value of 8 uses the
lowest 4 bits.
DEFAULT: 8
RETURNS:
A nybble color value or null if the proc failed.
*/
/*********************************************
* Implimentation: No need to read further. *
*********************************************/
proc
sd_nybble2rgb(original, bit = 8, short = 0)
/* Converts a nybble color to an RGB hex color string.
ARGS:
value - the number containing the nibble
bit - the MSB (most significant bit) of the nybble. The
default value of 8 uses the lowest 4 bits of original.
DEFAULT: 8
short - short RGB flag. If this is set, the proc returns a
3 character RGB string. Otherwise it returns a 6
character RGB string.
DEFAULT: 0 (return 6 characters)
RETURNS:
A 3 or 6 character hexidecimal RGB color string. */
var {intensity = "9"; off = "0"}
if(original & bit) intensity = "F"
if(!short)
intensity += intensity
off = "00"
. = ""
for(var/loop = 1 to 3)
bit >>= 1
if(original & bit) . += intensity
else . += off
if(. == "990") . = "940"
else if(. == "999900") . = "994400"
if(intensity == "F" && . == "000000") . = "00FF99"
sd_rgb2nybble(rgb, bit = 8)
/* Converts an rgb color string to a nybble color.
ARGS:
rgb - The color string to be converted. This may be a 3 or 6
character color code with or without a leading "#".
Examples: "000", "000000", "#000", "#000000" all
indicate black.
bit - the MSB (most significant bit) of the nybble. You can
use this to shift the position of your nybble within
the return value. The default value of 8 uses the
lowest 4 bits.
DEFAULT: 8
RETURNS:
A nybble color value or null if the proc failed. */
if(!istext(rgb)) return
if(text2ascii(rgb) == 35) // leading "#"
rgb = copytext(rgb,2)
var{char; cmp[3]; cmp_size; hi = 0; loop; pos = 1}
switch(length(rgb))
if(3) cmp_size = 1
if(6) cmp_size = 2
else return
for(loop = 1 to 3)
char = copytext(rgb, pos, pos+1)
// char 0 to 3 => 0, 4 to 9 => 1, A to F => 2
// cmp[loop] = round(sd_base2dec(char, 16) * 0.15, 1)
// previous line takes over twice as long as switch() method below
switch(char)
if("0", "1", "2", "3") cmp[loop] = 0
if("4", "5", "6", "7", "8", "9") cmp[loop] = 1
else cmp[loop] = 2
if(cmp[loop] > hi) hi = cmp[loop]
pos += cmp_size
switch(hi)
if(0) return bit // color 8: black
if(2) . = bit // high intensity
else . = 0 // low intensity
for(loop = 1 to 3)
bit >>= 1
if(cmp[loop] == hi) . |= bit

View File

@@ -0,0 +1,310 @@
/* Sample sd_colors. This file will not automatically be included in your
projects, since you may want to define them differently.
Colors can be defined by rgb values:
sd_color/blue
red = 0
green = 0
blue = 255
Colors can be defined by HTML values:
sd_color/green
html = "00FF00"
Colors can be defined by just overriding selective rgb values:
sd_color/red
red = 255
magenta
// still has red = 255, since it is a child of red
blue = 255
*/
/******************************************************
* Here 142 colors you might like to use from *
* http://www.w3schools.com/html/html_colornames.asp *
******************************************************/
sd_color
AliceBlue
html = "F0F8FF"
AntiqueWhite
html = "FAEBD7"
Aqua
html = "00FFFF"
Aquamarine
html = "7FFFD4"
Azure
html = "F0FFFF"
Beige
html = "F5F5DC"
Bisque
html = "FFE4C4"
Black
html = "000000"
BlanchedAlmond
html = "FFEBCD"
Blue
html = "0000FF"
BlueViolet
html = "8A2BE2"
Brown
html = "A52A2A"
BurlyWood
html = "DEB887"
CadetBlue
html = "5F9EA0"
Chartreuse
html = "7FFF00"
Chocolate
html = "D2691E"
Coral
html = "FF7F50"
CornflowerBlue
html = "6495ED"
Cornsilk
html = "FFF8DC"
Crimson
html = "DC143C"
Cyan
html = "00FFFF"
DarkBlue
html = "00008B"
DarkCyan
html = "008B8B"
DarkGoldenRod
html = "B8860B"
DarkGray
html = "A9A9A9"
DarkGreen
html = "006400"
DarkKhaki
html = "BDB76B"
DarkMagenta
html = "8B008B"
DarkOliveGreen
html = "556B2F"
Darkorange
html = "FF8C00"
DarkOrchid
html = "9932CC"
DarkRed
html = "8B0000"
DarkSalmon
html = "E9967A"
DarkSeaGreen
html = "8FBC8F"
DarkSlateBlue
html = "483D8B"
DarkSlateGray
html = "2F4F4F"
DarkTurquoise
html = "00CED1"
DarkViolet
html = "9400D3"
DeepPink
html = "FF1493"
DeepSkyBlue
html = "00BFFF"
DimGray
html = "696969"
DodgerBlue
html = "1E90FF"
FireBrick
html = "B22222"
FloralWhite
html = "FFFAF0"
ForestGreen
html = "228B22"
Fuchsia
html = "FF00FF"
Gainsboro
html = "DCDCDC"
GhostWhite
html = "F8F8FF"
Gold
html = "FFD700"
GoldenRod
html = "DAA520"
Gray
html = "808080"
Green
html = "008000"
GreenYellow
html = "ADFF2F"
HoneyDew
html = "F0FFF0"
HotPink
html = "FF69B4"
IndianRed
html = "CD5C5C"
Indigo
html = "4B0082"
Ivory
html = "FFFFF0"
Khaki
html = "F0E68C"
Lavender
html = "E6E6FA"
LavenderBlush
html = "FFF0F5"
LawnGreen
html = "7CFC00"
LemonChiffon
html = "FFFACD"
LightBlue
html = "ADD8E6"
LightCoral
html = "F08080"
LightCyan
html = "E0FFFF"
LightGoldenRodYellow
html = "FAFAD2"
LightGrey
html = "D3D3D3"
LightGreen
html = "90EE90"
LightPink
html = "FFB6C1"
LightSalmon
html = "FFA07A"
LightSeaGreen
html = "20B2AA"
LightSkyBlue
html = "87CEFA"
LightSlateBlue
html = "8470FF"
LightSlateGray
html = "778899"
LightSteelBlue
html = "B0C4DE"
LightYellow
html = "FFFFE0"
Lime
html = "00FF00"
LimeGreen
html = "32CD32"
Linen
html = "FAF0E6"
Magenta
html = "FF00FF"
Maroon
html = "800000"
MediumAquaMarine
html = "66CDAA"
MediumBlue
html = "0000CD"
MediumOrchid
html = "BA55D3"
MediumPurple
html = "9370D8"
MediumSeaGreen
html = "3CB371"
MediumSlateBlue
html = "7B68EE"
MediumSpringGreen
html = "00FA9A"
MediumTurquoise
html = "48D1CC"
MediumVioletRed
html = "C71585"
MidnightBlue
html = "191970"
MintCream
html = "F5FFFA"
MistyRose
html = "FFE4E1"
Moccasin
html = "FFE4B5"
NavajoWhite
html = "FFDEAD"
Navy
html = "000080"
OldLace
html = "FDF5E6"
Olive
html = "808000"
OliveDrab
html = "6B8E23"
Orange
html = "FFA500"
OrangeRed
html = "FF4500"
Orchid
html = "DA70D6"
PaleGoldenRod
html = "EEE8AA"
PaleGreen
html = "98FB98"
PaleTurquoise
html = "AFEEEE"
PaleVioletRed
html = "D87093"
PapayaWhip
html = "FFEFD5"
PeachPuff
html = "FFDAB9"
Peru
html = "CD853F"
Pink
html = "FFC0CB"
Plum
html = "DDA0DD"
PowderBlue
html = "B0E0E6"
Purple
html = "800080"
Red
html = "FF0000"
RosyBrown
html = "BC8F8F"
RoyalBlue
html = "4169E1"
SaddleBrown
html = "8B4513"
Salmon
html = "FA8072"
SandyBrown
html = "F4A460"
SeaGreen
html = "2E8B57"
SeaShell
html = "FFF5EE"
Sienna
html = "A0522D"
Silver
html = "C0C0C0"
SkyBlue
html = "87CEEB"
SlateBlue
html = "6A5ACD"
SlateGray
html = "708090"
Snow
html = "FFFAFA"
SpringGreen
html = "00FF7F"
SteelBlue
html = "4682B4"
Tan
html = "D2B48C"
Teal
html = "008080"
Thistle
html = "D8BFD8"
Tomato
html = "FF6347"
Turquoise
html = "40E0D0"
Violet
html = "EE82EE"
VioletRed
html = "D02090"
Wheat
html = "F5DEB3"
White
html = "FFFFFF"
WhiteSmoke
html = "F5F5F5"
Yellow
html = "FFFF00"
YellowGreen
html = "9ACD32"

View File

@@ -0,0 +1,161 @@
/* sd_procs
by: Shadowdarke (shadowdarke@hotmail.com)
A collection of general purpose procs I use often in
other projects.
The following is a summary of all the procs and other additions included in
the sd_procs library. Please refer to the specific file for detailed information.
Atom (atom.dm)
These procs expand on the basic built in procs.
Bumped(O)
Automatically called whenever a movable atom O Bump()s into src.
Proc protype designed to be overridden for specific objects.
Trigger(O)
Automatically called whenever a movable atom O steps into the same
turf with src.
Proc protype designed to be overridden for specific objects.
Base 64 (base64.dm)
These procs convert plain text to a hexidecimal string to 64 encoded text and vice versa.
sd_base64toHex(encode64, pad_code = 67)
Accepts a base 64 encoded text and returns the hexidecimal equivalent.
sd_hex2base64(hextext, pad_char = "=")
Accepts a hexidecimal string and returns the base 64 encoded text equivalent.
sd_hex2text(hex)
Accepts a hexidecimal string and returns the plain text equivalent.
sd_text2hex(txt)
Accepts a plain text string and returns the hexidecimal equivalent.
Colors(color.dm)
sd_color
sd_color is a special datum that contains color data in various
formats. Sample colors are available in samplecolors.dm.
VARS
name // the name of the color
red // red componant of the color
green // green componant of the color
blue // red componant of the color
html // html string for the color
icon/Icon // contains the icon produced by rgb2icon() proc
PROCS
brightness()
Returns the grayscale brightness of the RGB color set.
html2rgb()
Calculates the rgb colors from the html colors.
rgb2html()
Calculates the html color from the rbg colors.
rgb2icon()
Converts the rgb value to a solid icon stored as src.Icon
Direction procs (direction.dm)
sd_get_approx_dir(atom/ref,atom/target)
returns the approximate direction from ref to target.
sd_degrees2dir(degrees as num)
Accepts an angle in degrees and returns the closest BYOND
direction value.
sd_dir2degrees(dir as num)
Accepts a BYOND direction value and returns the angle North of
East in degrees.
sd_dir2radial(dir as num)
Accepts a BYOND direction value and returns the radial direction
(0-7) North of East.
sd_dir2radians(dir as num)
Accepts a BYOND direction value and returns the angle North of
East in radians.
sd_dir2text(dir as num)
Accepts a BYOND direction value and returns the lowercase text
name of the direction.
sd_dir2Text(dir as num)
Accepts a BYOND direction value and returns the Capitalized text
name of the direction
sd_radial2dir(radial as num)
Accepts a radial direction (0-7) and returns the BYOND direction
value.
HSL procs (hsl.dm)
hsl2rgb(hue, sat, lgh, scale = 240)
Returns the RRGGBB format of an HSL color.
ALTERNATE FORMAT: hsl2rgb(HSL, scale)
rgb2hsl(red, grn, blu, scale = 240)
Returns the HHSSLL string of an RGB color
ALTERNATE FORMAT: rgb2hsl(RGB, scale)
Math procs (math.dm)
sd_base2dec(number as text, base = 16 as num)
Accepts a number in any base (2 to 36) and returns the equivelent
value in decimal.
sd_dec2base(decimal,base = 16 as num,digits = 0 as num)
Accepts a decimal number and returns the equivelent value in the
new base as a string.
sd_get_dist(atom/A, atom/B)
Returns the mathematical 3D distance between two atoms.
sd_get_dist_squared(atom/A, atom/B)
Returns the square of the mathematical 3D distance between two atoms. (More processor
friendly than sd_get_dist() and useful for modelling realworld physics.)
Nybble Color procs (nybble.dm)
sd_nybble2rgb(original, bit = 8, short = 0)
Converts a nybble color to a hexidecimal RGB color string.
sd_rgb2nybble(rgb, bit = 8)
Converts an RGB color string to a nybble color.
Sample sd_colors. (samplecolors.dm)
This file includes 142 predefined sd_colors. It will not automatically
be included in your projects, since you may want to define them differently.
Test program (test.dm)
This file provides a brief demo of some library functions.
It is not included in your projects.
Text procs (text.dm)
sd_findlast(maintext as text, searchtext as text)
Returns the location of the last instance of searchtext in
maintext. sd_findlast is not case sensitive.
sd_findLast(maintext as text, searchtext as text)
Returns the location of the last instance of searchtext in
maintext. sd_findLast is case sensitive.
sd_htmlremove(T as text)
Returns the text string with all potential html tags (anything
between < and >) removed.
sd_replacetext(maintext as text, oldtext as text, newtext as text)
Replaces all instances of oldtext within maintext with newtext.
sd_replacetext is not case sensitive.
sd_replaceText(maintext as text, oldtext as text, newtext as text)
Replaces all instances of oldtext within maintext with newtext.
sd_replaceText is case sensitive.
*/

View File

@@ -0,0 +1,89 @@
/* Text procs
These procs manipulate text strings.
sd_findlast(maintext as text, searchtext as text)
Returns the location of the last instance of searchtext in
maintext. sd_findlast is not case sensitive.
sd_findLast(maintext as text, searchtext as text)
Returns the location of the last instance of searchtext in
maintext. sd_findLast is case sensitive.
sd_htmlremove(T as text)
Returns the text string with all potential html tags (anything
between < and >) removed.
sd_replacetext(maintext as text, oldtext as text, newtext as text)
Replaces all instances of oldtext within maintext with newtext.
sd_replacetext is not case sensitive.
sd_replaceText(maintext as text, oldtext as text, newtext as text)
Replaces all instances of oldtext within maintext with newtext.
sd_replaceText is case sensitive.
*/
/*********************************************
* Implimentation: No need to read further. *
*********************************************/
proc
sd_findlast(maintext as text, searchtext as text)
/* Returns the location of the last instance of searchtext in
maintext. sd_findlast is not case sensitive. */
var/loc = 0
var/looking = findtext(maintext, searchtext)
while(looking)
loc = looking
looking = findtext(maintext, searchtext, looking + 1)
return loc
sd_findLast(maintext as text, searchtext as text)
/* Returns the location of the last instance of searchtext in
maintext. sd_findLast is case sensitive. */
var/loc = 0
var/looking = findText(maintext, searchtext)
while(looking)
loc = looking
looking = findText(maintext, searchtext, looking + 1)
return loc
sd_htmlremove(T as text)
/* Returns the text string with all potential html tags (anything
between < and >) removed. */
T = sd_replacetext(T, "&nbsp;","")
var/open = findtext(T,"<")
while(open)
var/close = findtext(T,">",open)
if(close)
if(close<lentext(T))
T = copytext(T,1,open)+copytext(T,close+1)
else
T = copytext(T,1,open)
open = findtext(T,"<")
else
open = 0
return T
sd_replacetext(maintext as text, oldtext as text, newtext as text)
/* Replaces all instances of oldtext within maintext with newtext.
sd_replacetext is not case sensitive. See sd_replaceText for a
case sensitive version. */
var/F = findtext(maintext, oldtext)
var/length = length(newtext)
while(F)
var/newmessage = copytext(maintext,1,F) + newtext + copytext(maintext,F+lentext(oldtext))
maintext = newmessage
F = findtext(maintext, oldtext, F + length)
return maintext
sd_replaceText(maintext as text, oldtext as text, newtext as text)
/* Replaces all instances of oldtext within maintext with newtext.
sd_replaceText is case sensitive. See sd_replacetext for a
non-case sensitive version. */
var/F = findText(maintext, oldtext)
var/length = length(newtext)
while(F)
var/newmessage = copytext(maintext,1,F) + newtext + copytext(maintext,F+lentext(oldtext))
maintext = newmessage
F = findText(maintext, oldtext, F + length)
return maintext

View File

@@ -332,6 +332,8 @@
/atom/Click(location,control,params)
//world << "atom.Click() on [src] by [usr] : src.type is [src.type]"
if(!istype(src,/obj/item/weapon/gun))
usr.last_target_click = world.time
var/list/pram = params2list(params)
if((pram["alt"] != null && pram["ctrl"] != null && pram["left"] != null) && istype(src,/atom/movable))
src:pull()

View File

@@ -44,6 +44,11 @@
#define ui_inv3 "SOUTH-1,3"
#define ui_gun1 "WEST,NORTH"
#define ui_gun2 "WEST+1,NORTH"
#define ui_gun3 "WEST+2,NORTH"
obj/hud/New(var/type = 0)
instantiate(type)

View File

@@ -64,6 +64,7 @@
if (istype(M, /atom/movable))
var/temp = get_dir(M,src)
do_teleport(M, target) ///You will appear at the beacon
step(M,temp)
var/turf/target2 = get_edge_target_turf(M, temp)
M.throw_at(target2,100,2)

View File

@@ -128,7 +128,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
if(!src.loc)
on = 0
var/area/A = src.loc.loc
var/area/A = get_area(src)
if(!A || !isarea(A) || !A.master)
on = 0
else

View File

@@ -50,7 +50,7 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
if(!suit_fibers.len) del suit_fibers
atom/proc/get_duplicate(var/atom/location)
var/atom/temp_atom = new src.type(location)
var/atom/movable/temp_atom = new /atom/movable(location)
temp_atom.name = src.name
temp_atom.desc = src.desc
temp_atom.icon = src.icon

View File

@@ -19,6 +19,7 @@
delay = 0
airlock_wire = null
datum/radio_frequency/radio_connection
deadman = 0
proc
signal()
@@ -146,3 +147,24 @@
frequency = new_frequency
radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
return
process()
if(!deadman)
processing_objects.Remove(src)
var/mob/M = src.loc
if(!M || !ismob(M))
if(prob(5))
signal()
deadman = 0
processing_objects.Remove(src)
else if(prob(5))
M.visible_message("[M]'s finger twitches a bit over [src]'s signal button!")
return
verb/deadman_it()
set src in usr
set name = "Threaten to push the button!"
set desc = "BOOOOM!"
deadman = 1
processing_objects.Add(src)
usr.visible_message("\red [usr] moves their finger over [src]'s signal button...")

View File

@@ -444,6 +444,13 @@
AddCamoOverlay(loc)//Overlay camo.
else
invisibility = 0
if(targeted_by && target_locked)
overlays += target_locked
else if(targeted_by)
target_locked = new /obj/effect/target_locked(src)
overlays += target_locked
else if(!targeted_by && target_locked)
del(target_locked)
for (var/mob/M in viewers(1, src))
if ((M.client && M.machine == src))

View File

@@ -1173,6 +1173,13 @@
invisibility = 2
else
invisibility = 0
if(targeted_by && target_locked)
overlays += target_locked
else if(targeted_by)
target_locked = new /obj/effect/target_locked(src)
overlays += target_locked
else if(!targeted_by && target_locked)
del(target_locked)
/*
for (var/mob/M in viewers(1, src))//For the love of god DO NOT REFRESH EVERY SECOND - Mport

View File

@@ -439,8 +439,7 @@
if(update_icon) // Skie
..()
for(var/i in overlays)
overlays -= i
overlays = null
if (!( lying ))
icon_state = "monkey1"
@@ -505,6 +504,13 @@
else
m_select.screen_loc = null
if(targeted_by && target_locked)
overlays += target_locked
else if(targeted_by)
target_locked = new /obj/effect/target_locked(src)
overlays += target_locked
else if(!targeted_by && target_locked)
del(target_locked)
for(var/mob/M in viewers(1, src))
if ((M.client && M.machine == src))
spawn( 0 )

View File

@@ -42,9 +42,9 @@
if(!effect || (blocked >= 2)) return 0
switch(effecttype)
if(STUN)
Stun((effect - (effect*getarmor(null, "laser")))/(blocked + 1))
Stun((effect - (min(effect*getarmor(null, "laser"), effect*(0.75 + (blocked*0.05))))))
if(WEAKEN)
Weaken((effect - (effect*getarmor(null, "laser")))/(blocked + 1))
Weaken((effect - (min(effect*getarmor(null, "laser"), effect*(0.75 + (blocked*0.05))))))
if(PARALYZE)
Paralyse(effect/(blocked+1))
if(IRRADIATE)

View File

@@ -45,6 +45,12 @@
flash_weak_pain()
if(istype(equipped(),/obj/item/device/assembly/signaler))
var/obj/item/device/assembly/signaler/signaler = equipped()
if(signaler.deadman && prob(80))
src.visible_message("\red [src] triggers their deadman's switch!")
signaler.signal()
var/absorb = run_armor_check(def_zone, P.flag)
if(absorb >= 2)
P.on_hit(src,2)

View File

@@ -86,22 +86,39 @@
var/channel_prefix = copytext(message, 1, 3)
var/list/keys = list(
":r" = "right ear",
":l" = "left ear",
":i" = "intercom",
":h" = "department",
":c" = "Command",
":n" = "Science",
":m" = "Medical",
":e" = "Engineering",
":s" = "Security",
":w" = "whisper",
":b" = "binary",
":a" = "alientalk",
":t" = "Syndicate",
":d" = "Mining",
":q" = "Cargo",
":g" = "changeling",
":r" = "right ear",
":l" = "left ear",
":i" = "intercom",
":h" = "department",
":c" = "Command",
":n" = "Science",
":m" = "Medical",
":e" = "Engineering",
":s" = "Security",
":w" = "whisper",
":b" = "binary",
":a" = "alientalk",
":t" = "Syndicate",
":d" = "Mining",
":q" = "Cargo",
":g" = "changeling",
":R" = "right hand",
":L" = "left hand",
":I" = "intercom",
":H" = "department",
":C" = "Command",
":N" = "Science",
":M" = "Medical",
":E" = "Engineering",
":S" = "Security",
":W" = "whisper",
":B" = "binary",
":A" = "alientalk",
":T" = "Syndicate",
":D" = "Mining",
":Q" = "Cargo",
":G" = "changeling",
//kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.

View File

@@ -700,6 +700,14 @@
overlays += "ov-openpanel +c"
else
overlays += "ov-openpanel -c"
if(targeted_by && target_locked)
overlays += target_locked
else if(targeted_by)
target_locked = new /obj/effect/target_locked(src)
overlays += target_locked
else if(!targeted_by && target_locked)
del(target_locked)
return

View File

@@ -15,13 +15,13 @@
return
if (length(message) >= 2)
if (copytext(message, 1, 3) == ":s")
if ((copytext(message, 1, 3) == ":s") || (copytext(message, 1, 3) == ":S"))
if(istype(src, /mob/living/silicon/pai))
return ..(message)
message = copytext(message, 3)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
robot_talk(message)
else if (copytext(message, 1, 3) == ":h")
else if ((copytext(message, 1, 3) == ":h") || (copytext(message, 1, 3) == ":H"))
if(isAI(src)&&client)//For patching directly into AI holopads.
message = copytext(message, 3)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))

View File

@@ -277,6 +277,13 @@
back = null
else if (W == wear_mask)
wear_mask = null
if(istype(W,/obj/item/weapon/gun))
var/obj/item/weapon/gun/gun = W
if(gun.target)
gun.target.NotTargeted(gun)
del(item_use_icon)
del(gun_move_icon)
del(gun_run_icon)
update_clothing()
return

View File

@@ -173,6 +173,7 @@
return 0
move_delay = world.time//set move delay
mob.last_move_intent = world.time + 10
switch(mob.m_intent)
if("run")
if(mob.drowsyness > 0)

View File

@@ -5,6 +5,7 @@
unacidable = 1
var/id = 0.0
var/obj/master
var/gun_click_time = -100 //I'm lazy.
/obj/screen/close
name = "close"
@@ -25,6 +26,25 @@
var/selecting = "chest"
screen_loc = "EAST+1,NORTH"
/obj/screen/gun
name = "gun"
icon = 'screen1.dmi'
master = null
move
name = "Allow Walking"
icon_state = "no_walk"
screen_loc = ui_gun2
run
name = "Allow Running"
icon_state = "no_run"
screen_loc = ui_gun3
item
name = "Allow Item Use"
icon_state = "no_item"
screen_loc = ui_gun1
/obj/screen/zone_sel/MouseDown(location, control,params)
// Changes because of 4.0
@@ -569,6 +589,79 @@
usr:inv3.icon_state = "inv3"
usr:module_active = null
if("Allow Walking")
if(gun_click_time > world.time - 15) //give them 1.5 seconds between mode changes.
usr << "You need to wait some before you can change what they can do!"
return
if(!istype(usr.equipped(),/obj/item/weapon/gun))
usr << "You need your gun in your active hand to do that!"
return
usr.AllowTargetMove()
icon_state = "walking"
name = "Disallow Walking"
gun_click_time = world.time
if("Disallow Walking")
if(gun_click_time > world.time - 15) //give them 1.5 seconds between mode changes.
usr << "You need to wait some before you can change what they can do!"
return
if(!istype(usr.equipped(),/obj/item/weapon/gun))
usr << "You need your gun in your active hand to do that!"
return
usr.AllowTargetMove()
icon_state = "no_walk"
name = "Allow Walking"
gun_click_time = world.time
if("Allow Running")
if(gun_click_time > world.time - 15) //give them 1.5 seconds between mode changes.
usr << "You need to wait some before you can change what they can do!"
return
if(!istype(usr.equipped(),/obj/item/weapon/gun))
usr << "You need your gun in your active hand to do that!"
return
usr.AllowTargetRun()
icon_state = "running"
name = "Disallow Running"
gun_click_time = world.time
if("Disallow Running")
if(gun_click_time > world.time - 15) //give them 1.5 seconds between mode changes.
usr << "You need to wait some before you can change what they can do!"
return
if(!istype(usr.equipped(),/obj/item/weapon/gun))
usr << "You need your gun in your active hand to do that!"
return
usr.AllowTargetRun()
icon_state = "no_run"
name = "Allow Running"
gun_click_time = world.time
if("Allow Item Use")
if(gun_click_time > world.time - 15) //give them 1.5 seconds between mode changes.
usr << "You need to wait some before you can change what they can do!"
return
if(!istype(usr.equipped(),/obj/item/weapon/gun))
usr << "You need your gun in your active hand to do that!"
return
name = "Disallow Item Use"
icon_state = "act_throw_off"
usr.AllowTargetClick()
gun_click_time = world.time
if("Disallow Item Use")
if(gun_click_time > world.time - 15) //give them 1.5 seconds between mode changes.
usr << "You need to wait some before you can change what they can do!"
return
if(!istype(usr.equipped(),/obj/item/weapon/gun))
usr << "You need your gun in your active hand to do that!"
return
name = "Allow Item Use"
icon_state = "no_item"
usr.AllowTargetClick()
gun_click_time = world.time
else
DblClick()
return

View File

@@ -1,5 +1,5 @@
/obj/item/weapon/gun
name = "gun"
name = "\improper Gun"
desc = "Its a gun. It's pretty terrible, though."
icon = 'gun.dmi'
icon_state = "detective"
@@ -19,6 +19,9 @@
caliber = ""
silenced = 0
recoil = 0
tmp/mob/target
tmp/lock_time = -100
mouthshoot = 0
proc
load_into_chamber()
@@ -28,6 +31,14 @@
load_into_chamber()
return 0
//Removing the lock and the buttons.
dropped(mob/user as mob)
if(target)
target.NotTargeted(src)
del(user.item_use_icon)
del(user.gun_move_icon)
del(user.gun_run_icon)
return ..()
special_check(var/mob/M) //Placeholder for any special checks, like detective's revolver.
return 1
@@ -37,8 +48,18 @@
for(var/obj/O in contents)
O.emp_act(severity)
//Handling lowering yer gun.
attack_self()
if(target)
target.NotTargeted(src)
usr.visible_message("[usr] lowers \the [src].")
return 0
return 1
//Suiciding.
attack(mob/living/M as mob, mob/living/user as mob, def_zone)
if (M == user && user.zone_sel.selecting == "mouth" && load_into_chamber())
if (M == user && user.zone_sel.selecting == "mouth" && load_into_chamber() && !mouthshoot)
mouthshoot = 1
M.visible_message("\red [user] sticks their gun in their mouth, ready to pull the trigger...")
if(!do_after(user, 40))
M.visible_message("\blue [user] decided life was worth living")
@@ -59,18 +80,20 @@
M.apply_damage(85, BRUTE, "chest")
M.visible_message("\red [user] pulls the trigger. Ow.")
del(src.in_chamber)
mouthshoot = 0
return
else if(target && M == target)
PreFire(M,user)
else
return ..()
afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)//TODO: go over this
if(flag) return //we're placing gun on a table or in backpack
if(istype(target, /obj/machinery/recharger) && istype(src, /obj/item/weapon/gun/energy)) return//Shouldnt flag take care of this?
//POWPOW!... Used to be afterattack.
proc/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params)//TODO: go over this
if(istype(user, /mob/living))
var/mob/living/M = user
if ((M.mutations & CLUMSY) && prob(50))
M << "\red The [src.name] blows up in your face."
M << "\red \the [src] blows up in your face."
M.take_organ_damage(0,20)
M.drop_item()
del(src)
@@ -113,7 +136,7 @@
playsound(user, fire_sound, 10, 1)
else
playsound(user, fire_sound, 50, 1)
user.visible_message("\red [user.name] fires the [src.name]!", "\red You fire the [src.name]!", "\blue You hear a [istype(in_chamber, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!")
user.visible_message("\red [user] fires the [src]!", "\red You fire the [src]!", "\blue You hear a [istype(in_chamber, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!")
in_chamber.original = targloc
in_chamber.loc = get_turf(user)
@@ -138,3 +161,281 @@
update_icon()
return
//Aiming at the target mob.
proc/Aim(var/mob/M)
if(target != M)
lock_time = world.time
if(target)
//usr.ClearRequest("Aim")
target.NotTargeted(src)
usr.visible_message("[usr] turns \the [src] on [M]!")
else
usr.visible_message("[usr] aims \a [src] at [M]!")
for(var/mob/K in viewers(usr))
K << 'TargetOn.ogg'
M.Targeted(src)
//HE MOVED, SHOOT HIM!
proc/TargetActed()
var/mob/M = loc
if(target == M) return
usr.last_move_intent = world.time
Fire(target,usr)
var/dir_to_fire = sd_get_approx_dir(M,target)
if(dir_to_fire != M.dir)
M.dir = dir_to_fire
afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)
if(flag) return //we're placing gun on a table or in backpack
if(istype(target, /obj/machinery/recharger) && istype(src, /obj/item/weapon/gun/energy)) return//Shouldnt flag take care of this?
PreFire(A,user,params)
//Compute how to fire.....
proc/PreFire(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, params)
if(usr.a_intent in list("help","grab","disarm"))
//GraphicTrace(usr.x,usr.y,A.x,A.y,usr.z)
if(lock_time > world.time - 2) return
if(!ismob(A))
// var/mob/M = locate() in range(0,A)
// if(M && !ismob(A))
// if(M.type == /mob)
// return FindTarget(M,user,params)
var/mob/M = GunTrace(usr.x,usr.y,A.x,A.y,usr.z,usr)
if(M && ismob(M) && !target)
Aim(M)
return
if(ismob(A) && target != A)
Aim(A)
else if(lock_time < world.time + 10)
Fire(A,user,params)
else if(!target)
Fire(A,user,params)
//else
//var/item/gun/G = usr.OHand
//if(!G)
//Fire(A,0)
//else if(istype(G))
//G.Fire(A,3)
//Fire(A,2)
//else
//Fire(A)
var/dir_to_fire = sd_get_approx_dir(usr,A)
if(dir_to_fire != usr.dir)
usr.dir = dir_to_fire
else
Fire(A, user)
//Yay, math!
#define SIGN(X) ((X<0)?-1:1)
proc/GunTrace(X1,Y1,X2,Y2,Z=1,exc_obj,PX1=16,PY1=16,PX2=16,PY2=16)
//bluh << "Tracin' [X1],[Y1] to [X2],[Y2] on floor [Z]."
var/turf/T
var/mob/M
if(X1==X2)
if(Y1==Y2) return 0 //Light cannot be blocked on same tile
else
var/s = SIGN(Y2-Y1)
Y1+=s
while(1)
T = locate(X1,Y1,Z)
if(!T) return 0
M = locate() in T
if(M) return M
M = locate() in orange(1,T)-exc_obj
if(M) return M
Y1+=s
else
var
m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1))
b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles
signX = SIGN(X2-X1)
signY = SIGN(Y2-Y1)
if(X1<X2) b+=m
while(1)
var/xvert = round(m*X1+b-Y1)
if(xvert) Y1+=signY //Line exits tile vertically
else X1+=signX //Line exits tile horizontally
T = locate(X1,Y1,Z)
if(!T) return 0
M = locate() in T
if(M) return M
M = locate() in orange(1,T)-exc_obj
if(M) return M
return 0
//Targeting management procs
mob/var
list/targeted_by
target_time = -100
last_move_intent = -100
last_target_click = -5
obj/effect/target_locked/target_locked = null
mob/proc
Targeted(var/obj/item/weapon/gun/I)
if(!targeted_by) targeted_by = list()
targeted_by += I
I.target = src
//I.lock_time = world.time + 10 //Target has 1 second to realize they're targeted and stop (or target the opponent).
src << "((\red <b>Your character is being targeted. They have 1 second to stop any click or move actions.</b> \black While targeted, they may \
drag and drop items in or into the map, speak, and click on interface buttons. Clicking on the map, their items \
(other than a weapon to de-target), or moving will result in being fired upon. \red The aggressor may also fire manually, \
so try not to get on their bad side.\black ))"
if(targeted_by.len == 1)
spawn(0)
target_locked = new /obj/effect/target_locked(src)
overlays += target_locked
spawn flick("locking",target_locked)
var/mob/T = I.loc
//Adding the buttons to the controler person
if(T)
T.item_use_icon = new /obj/screen/gun/item(null)
T.gun_move_icon = new /obj/screen/gun/move(null)
if(T.client)
T.client.screen += T.item_use_icon
T.client.screen += T.gun_move_icon
while(targeted_by)
sleep(1)
if(last_move_intent > I.lock_time + 10 && !T.target_can_move) //If the target moved while targeted
I.TargetActed()
I.lock_time = world.time + 5
else if(last_move_intent > I.lock_time + 10 && !T.target_can_run && m_intent == "run") //If the target ran while targeted
I.TargetActed()
I.lock_time = world.time + 5
if(last_target_click > I.lock_time + 10 && !T.target_can_click) //If the target clicked the map to pick something up/shoot/etc
I.TargetActed()
I.lock_time = world.time + 5
NotTargeted(var/obj/item/weapon/gun/I,silent)
if(!silent)
for(var/mob/M in viewers(src))
M << 'TargetOff.ogg'
del(target_locked)
targeted_by -= I
update_clothing()
I.target = null
var/mob/T = I.loc
if(T && ismob(T))
del(T.item_use_icon)
del(T.gun_move_icon)
del(T.gun_run_icon)
if(!targeted_by.len) del targeted_by
/* Captive(var/obj/item/weapon/gun/I)
Sound(src,'CounterAttack.ogg')
if(!targeted_by) targeted_by = list()
targeted_by += I
I.target = src
// Stun("Captive")
I.lock_time = world.time + 10 //Target has 1 second to realize they're targeted and stop (or target the opponent).
src << "(Your character is being held captive. They have 1 second to stop any click or move actions. While held, they may \
drag and drop items in or into the map, speak, and click on interface buttons. Clicking on the map or their items \
(other than a weapon to de-target) will result in being attacked. The aggressor may also attack manually, \
so try not to get on their bad side.)"
if(targeted_by.len == 1)
var/mob/T = I.loc
while(targeted_by)
sleep(1)
if(last_target_click > I.lock_time + 10 && !T.target_can_click) //If the target clicked the map to pick something up/shoot/etc
I.TargetActed()
NotCaptive(var/obj/item/weapon/gun/I,silent)
if(!silent) Sound(src,'SwordSheath.ogg')
// UnStun("Captive")
targeted_by -= I
I.target = null
if(!targeted_by.len) del targeted_by*/
//Used to overlay the awesome stuff
/obj/effect
// target_locking
// icon = 'icons/effects/Targeted.dmi'
// icon_state = "locking"
// layer = 99
target_locked
icon = 'icons/effects/Targeted.dmi'
icon_state = "locked"
layer = 99
// captured
// icon = 'Captured.dmi'
// layer = 99
//If you move out of range, it isn't going to still stay locked on you any more.
mob/var
target_can_move = 0
target_can_run = 0
target_can_click = 0
mob/Move()
. = ..()
for(var/obj/item/weapon/gun/G in targeted_by)
var/mob/M = G.loc
if(!(M in view(src)))
//ClearRequest("Aim")
NotTargeted(G)
for(var/obj/item/weapon/gun/G in src)
if(G.target)
if(!(G.target in view(src)))
//ClearRequest("Aim")
G.target.NotTargeted(G)
mob/verb
//These are called by the on-screen buttons, adjusting what the victim can and cannot do.
AllowTargetMove()
set hidden=1
spawn(1) target_can_move = !target_can_move
if(!target_can_move)
// winset(usr,"default.target_can_move","is-flat=true;border=sunken")
usr << "Target may now walk."
gun_run_icon = new /obj/screen/gun/run(null)
if(client)
client.screen += gun_run_icon
else
// winset(usr,"default.target_can_move","is-flat=false;border=none")
usr << "Target may no longer move."
target_can_run = 0
del(gun_run_icon)
for(var/obj/item/weapon/gun/G in src)
G.lock_time = world.time + 5
if(G.target)
if(!target_can_move)
G.target << "Your character may now <b>walk</b> at the discretion of their targeter."
else
G.target << "\red <b>Your character will now be shot if they move.</b>"
AllowTargetRun()
set hidden=1
spawn(1) target_can_run = !target_can_run
if(!target_can_run)
// winset(usr,"default.target_can_move","is-flat=true;border=sunken")
usr << "Target may now run."
else
// winset(usr,"default.target_can_move","is-flat=false;border=none")
usr << "Target may no longer run."
for(var/obj/item/weapon/gun/G in src)
G.lock_time = world.time + 5
if(G.target)
if(!target_can_run)
G.target << "Your character may now <b>run</b> at the discretion of their targeter."
else
G.target << "\red <b>Your character will now be shot if they run.</b>"
AllowTargetClick()
set hidden=1
spawn(1) target_can_click = !target_can_click
if(!target_can_click)
// winset(usr,"default.target_can_click","is-flat=true;border=sunken")
usr << "Target may now use items."
else
// winset(usr,"default.target_can_click","is-flat=false;border=none")
usr << "Target may no longer use items."
for(var/obj/item/weapon/gun/G in src)
G.lock_time = world.time + 5
if(G.target)
if(!target_can_click)
G.target << "Your character may now <b>use items</b> at the discretion of their targeter."
else
G.target << "\red <b>Your character will now be shot if they use items.</b>"

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/gun/energy
icon_state = "energy"
name = "energy gun"
name = "\improper Energy gun"
desc = "A basic energy-based gun with two settings: Stun and kill."
fire_sound = 'Taser.ogg'

View File

@@ -1,5 +1,5 @@
/obj/item/weapon/gun/energy/laser
name = "laser gun"
name = "\improper Laser Gun"
desc = "a basic weapon designed kill with concentrated energy bolts"
icon_state = "laser"
item_state = "laser"
@@ -11,7 +11,7 @@
obj/item/weapon/gun/energy/laser/retro
name ="retro laser"
name ="\improper Retro Laser"
icon_state = "retro"
desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws."
@@ -58,7 +58,7 @@ obj/item/weapon/gun/energy/laser/retro
/obj/item/weapon/gun/energy/lasercannon
name = "laser cannon"
name = "\improper Laser Cannon"
desc = "With the L.A.S.E.R. cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!"
icon_state = "lasercannon"
fire_sound = 'lasercannonfire.ogg'

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/gun/energy/gun
icon_state = "energy"
name = "energy gun"
name = "\improper Energy Gun"
desc = "A basic energy-based gun with two settings: Stun and kill."
fire_sound = 'Taser.ogg'
@@ -13,26 +13,27 @@
attack_self(mob/living/user as mob)
switch(mode)
if(0)
mode = 1
charge_cost = 100
fire_sound = 'Laser.ogg'
user << "\red [src.name] is now set to kill."
projectile_type = "/obj/item/projectile/beam"
if(1)
mode = 0
charge_cost = 100
fire_sound = 'Taser.ogg'
user << "\red [src.name] is now set to stun."
projectile_type = "/obj/item/projectile/energy/electrode"
update_icon()
if(..())
switch(mode)
if(0)
mode = 1
charge_cost = 100
fire_sound = 'Laser.ogg'
user << "\red [src] is now set to kill."
projectile_type = "/obj/item/projectile/beam"
if(1)
mode = 0
charge_cost = 100
fire_sound = 'Taser.ogg'
user << "\red [src] is now set to stun."
projectile_type = "/obj/item/projectile/energy/electrode"
update_icon()
return
/obj/item/weapon/gun/energy/gun/nuclear
name = "Advanced Energy Gun"
name = "\improper Advanced Energy Gun"
desc = "An energy gun with an experimental miniaturized reactor."
origin_tech = "combat=3;materials=5;powerstorage=3"
var/lightfail = 0

View File

@@ -1,5 +1,5 @@
/obj/item/weapon/gun/energy/pulse_rifle
name = "pulse rifle"
name = "\improper Pulse Rifle"
desc = "A heavy-duty, pulse-based energy weapon, preferred by front-line combat personnel."
icon_state = "pulse"
force = 10
@@ -11,40 +11,42 @@
attack_self(mob/living/user as mob)
switch(mode)
if(2)
mode = 0
charge_cost = 100
fire_sound = 'Taser.ogg'
user << "\red [src.name] is now set to stun."
projectile_type = "/obj/item/projectile/energy/electrode"
if(0)
mode = 1
charge_cost = 100
fire_sound = 'Laser.ogg'
user << "\red [src.name] is now set to kill."
projectile_type = "/obj/item/projectile/beam"
if(1)
mode = 2
charge_cost = 200
fire_sound = 'pulse.ogg'
user << "\red [src.name] is now set to DESTROY."
projectile_type = "/obj/item/projectile/beam/pulse"
if(..())
switch(mode)
if(2)
mode = 0
charge_cost = 100
fire_sound = 'Taser.ogg'
user << "\red [src] is now set to stun."
projectile_type = "/obj/item/projectile/energy/electrode"
if(0)
mode = 1
charge_cost = 100
fire_sound = 'Laser.ogg'
user << "\red [src] is now set to kill."
projectile_type = "/obj/item/projectile/beam"
if(1)
mode = 2
charge_cost = 200
fire_sound = 'pulse.ogg'
user << "\red [src] is now set to DESTROY."
projectile_type = "/obj/item/projectile/beam/pulse"
return
/obj/item/weapon/gun/energy/pulse_rifle/destroyer
name = "pulse destroyer"
name = "\improper Pulse Destroyer"
desc = "A heavy-duty, pulse-based energy weapon."
cell_type = "/obj/item/weapon/cell/infinite"
attack_self(mob/living/user as mob)
user << "\red [src.name] has three settings, and they are all DESTROY."
if(..())
user << "\red [src] has three settings, and they are all DESTROY."
/obj/item/weapon/gun/energy/pulse_rifle/M1911
name = "m1911-P"
name = "\improper M1911-P"
desc = "It's not the size of the gun, it's the size of the hole it puts through people."
icon_state = "m1911-p"
cell_type = "/obj/item/weapon/cell/infinite"

View File

@@ -1,5 +1,5 @@
/obj/item/weapon/gun/energy/ionrifle
name = "ion rifle"
name = "\improper Ion Rifle"
desc = "A man portable anti-armor weapon designed to disable mechanical threats"
icon_state = "ionrifle"
fire_sound = 'Laser.ogg'
@@ -12,7 +12,7 @@
/obj/item/weapon/gun/energy/decloner
name = "biological demolecularisor"
name = "\improper Biological Demolecularisor"
desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
icon_state = "decloner"
fire_sound = 'pulse3.ogg'
@@ -21,7 +21,7 @@
projectile_type = "/obj/item/projectile/energy/declone"
obj/item/weapon/gun/energy/staff
name = "staff of change"
name = "\improper Staff of Change"
desc = "an artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself"
icon = 'gun.dmi'
icon_state = "staffofchange"

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/gun/energy/taser
name = "taser gun"
name = "\improper Taser Gun"
desc = "A small, low capacity gun used for non-lethal takedowns."
icon_state = "taser"
fire_sound = 'Taser.ogg'
@@ -24,7 +24,7 @@
/obj/item/weapon/gun/energy/stunrevolver
name = "stun revolver"
name = "\improper Stun Revolver"
desc = "A high-tech revolver that fires stun cartridges. The stun cartridges can be recharged using a conventional energy weapon recharger."
icon_state = "stunrevolver"
fire_sound = 'Gunshot.ogg'
@@ -36,7 +36,7 @@
/obj/item/weapon/gun/energy/crossbow
name = "mini energy-crossbow"
name = "\improper Mini Energy-Crossbow"
desc = "A weapon favored by many of the syndicates stealth specialists."
icon_state = "crossbow"
w_class = 2.0
@@ -75,7 +75,7 @@
/obj/item/weapon/gun/energy/crossbow/largecrossbow
name = "Energy Crossbow"
name = "\improper Energy Crossbow"
desc = "A weapon favored by syndicate infiltration teams."
w_class = 4.0
force = 10

View File

@@ -1,5 +1,5 @@
/obj/item/weapon/gun/energy/temperature
name = "temperature gun"
name = "\improper Temperature Gun"
icon_state = "freezegun"
fire_sound = 'pulse3.ogg'
desc = "A gun that changes temperatures."
@@ -23,20 +23,21 @@
attack_self(mob/living/user as mob)
user.machine = src
var/temp_text = ""
if(temperature > (T0C - 50))
temp_text = "<FONT color=black>[temperature] ([round(temperature-T0C)]&deg;C) ([round(temperature*1.8-459.67)]&deg;F)</FONT>"
else
temp_text = "<FONT color=blue>[temperature] ([round(temperature-T0C)]&deg;C) ([round(temperature*1.8-459.67)]&deg;F)</FONT>"
if(..())
user.machine = src
var/temp_text = ""
if(temperature > (T0C - 50))
temp_text = "<FONT color=black>[temperature] ([round(temperature-T0C)]&deg;C) ([round(temperature*1.8-459.67)]&deg;F)</FONT>"
else
temp_text = "<FONT color=blue>[temperature] ([round(temperature-T0C)]&deg;C) ([round(temperature*1.8-459.67)]&deg;F)</FONT>"
var/dat = {"<B>Freeze Gun Configuration: </B><BR>
Current output temperature: [temp_text]<BR>
Target output temperature: <A href='?src=\ref[src];temp=-100'>-</A> <A href='?src=\ref[src];temp=-10'>-</A> <A href='?src=\ref[src];temp=-1'>-</A> [current_temperature] <A href='?src=\ref[src];temp=1'>+</A> <A href='?src=\ref[src];temp=10'>+</A> <A href='?src=\ref[src];temp=100'>+</A><BR>
"}
var/dat = {"<B>Freeze Gun Configuration: </B><BR>
Current output temperature: [temp_text]<BR>
Target output temperature: <A href='?src=\ref[src];temp=-100'>-</A> <A href='?src=\ref[src];temp=-10'>-</A> <A href='?src=\ref[src];temp=-1'>-</A> [current_temperature] <A href='?src=\ref[src];temp=1'>+</A> <A href='?src=\ref[src];temp=10'>+</A> <A href='?src=\ref[src];temp=100'>+</A><BR>
"}
user << browse(dat, "window=freezegun;size=450x300")
onclose(user, "freezegun")
user << browse(dat, "window=freezegun;size=450x300")
onclose(user, "freezegun")
Topic(href, href_list)

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/gun/projectile
desc = "A classic revolver. Uses 357 ammo"
name = "revolver"
name = "\improper Revolver"
icon_state = "revolver"
caliber = "357"
origin_tech = "combat=2;materials=2"

View File

@@ -1,5 +1,5 @@
/obj/item/weapon/gun/projectile/automatic //Hopefully someone will find a way to make these fire in bursts or something. --Superxpdude
name = "Submachine Gun"
name = "\improper Submachine Gun"
desc = "A lightweight, fast firing gun. Uses 9mm rounds."
icon_state = "saber"
w_class = 3.0
@@ -11,7 +11,7 @@
/obj/item/weapon/gun/projectile/automatic/mini_uzi
name = "Mini-Uzi"
name = "\improper Mini-Uzi"
desc = "A lightweight, fast firing gun, for when you want someone dead. Uses .45 rounds."
icon_state = "mini-uzi"
w_class = 3.0
@@ -23,7 +23,7 @@
/obj/item/weapon/gun/projectile/automatic/c20r
name = "C-20r SMG"
name = "\improper C-20r SMG"
desc = "A lightweight, fast firing gun, for when you REALLY need someone dead. Uses 12mm rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp"
icon_state = "c20r"
item_state = "c20r"

View File

@@ -1,5 +1,5 @@
/obj/item/weapon/gun/projectile/silenced
name = "Silenced Pistol"
name = "\improper Silenced Pistol"
desc = "A small, quiet, easily concealable gun. Uses .45 rounds."
icon_state = "silenced_pistol"
w_class = 3.0
@@ -12,7 +12,7 @@
/obj/item/weapon/gun/projectile/deagle
name = "Desert Eagle"
name = "\improper Desert Eagle"
desc = "A robust handgun that uses 357 magnum ammo"
icon_state = "deagle"
force = 14.0
@@ -21,7 +21,7 @@
/obj/item/weapon/gun/projectile/deagle/gold
name = "Desert Eagle"
name = "\improper Desert Eagle"
desc = "A gold plated gun folded over a million times by superior martian gunsmiths. Uses 357 ammo."
icon_state = "deagleg"
item_state = "deagleg"
@@ -29,7 +29,7 @@
/obj/item/weapon/gun/projectile/deagle/camo
name = "Desert Eagle"
name = "\improper Desert Eagle"
desc = "A Deagle brand Deagle for operators operating operationally. Uses 357 ammo."
icon_state = "deaglecamo"
item_state = "deagleg"
@@ -37,7 +37,7 @@
/obj/item/weapon/gun/projectile/gyropistol
name = "Gyrojet Pistol"
name = "\improper Gyrojet Pistol"
desc = "A bulky pistol designed to fire self propelled rounds"
icon_state = "gyropistol"
max_shells = 8

View File

@@ -1,6 +1,6 @@
/obj/item/weapon/gun/projectile/detective
desc = "A cheap Martian knock-off of a Smith & Wesson Model 10. Uses .38-Special rounds."
name = "revolver"
name = "\improper Revolver"
icon_state = "detective"
caliber = "38"
origin_tech = "combat=2;materials=2"
@@ -18,7 +18,7 @@
verb/rename_gun()
set name = "Name Gun"
set desc = "Click to rename your gun. If you're the detective."
set desc = "Click to rename your gun."
var/mob/M = usr
if(!M.mind) return 0
@@ -38,7 +38,7 @@
/obj/item/weapon/gun/projectile/mateba
name = "mateba"
name = "\improper Mateba"
desc = "When you absolutely, positively need a 10mm hole in the other guy. Uses .357 ammo."
icon_state = "mateba"
origin_tech = "combat=2;materials=2"

View File

@@ -1,5 +1,5 @@
/obj/item/weapon/gun/projectile/shotgun
name = "shotgun"
name = "\improper Shotgun"
desc = "Useful for sweeping alleys."
icon_state = "shotgun"
max_shells = 2
@@ -21,11 +21,12 @@
attack_self(mob/living/user as mob)
if(recentpump) return
pump()
recentpump = 1
spawn(10)
recentpump = 0
if(..())
if(recentpump) return
pump()
recentpump = 1
spawn(10)
recentpump = 0
return
@@ -48,7 +49,7 @@
/obj/item/weapon/gun/projectile/shotgun/combat
name = "combat shotgun"
name = "\improper Combat Shotgun"
icon_state = "cshotgun"
max_shells = 8
ammo_type = "/obj/item/ammo_casing/shotgun"
@@ -56,7 +57,7 @@
/obj/item/weapon/gun/projectile/shotgun/combat2
name = "security combat shotgun"
name = "\improper Security Combat Shotgun"
icon_state = "cshotgun"
max_shells = 4

View File

@@ -10,7 +10,7 @@
*/
/obj/item/projectile
name = "projectile"
name = "\improper Projectile"
icon = 'projectiles.dmi'
icon_state = "bullet"
density = 1
@@ -70,7 +70,7 @@
return // nope.avi
if(!silenced)
visible_message("\red [A.name] is hit by the [src.name]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
visible_message("\red [A] is hit by the [src]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
else
M << "\red You've been shot!"
if(istype(firer, /mob))

View File

@@ -1,5 +1,5 @@
/obj/item/projectile/beam
name = "laser"
name = "\improper Laser"
icon_state = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 20
@@ -49,19 +49,19 @@
del(src)
/obj/item/projectile/beam/heavylaser
name = "heavy laser"
name = "\improper Heavy Laser"
icon_state = "heavylaser"
damage = 40
/obj/item/projectile/beam/pulse
name = "pulse"
name = "\improper Pulse"
icon_state = "u_laser"
damage = 50
/obj/item/projectile/beam/deathlaser
name = "death laser"
name = "\improper Death Laser"
icon_state = "heavylaser"
damage = 60

View File

@@ -1,5 +1,5 @@
/obj/item/projectile/bullet
name = "bullet"
name = "\improper Bullet"
icon_state = "bullet"
damage = 60
damage_type = BRUTE
@@ -20,24 +20,24 @@
eyeblur = 3
/obj/item/projectile/bullet/suffocationbullet//How does this even work?
name = "co bullet"
// name = "\improper ullet"
damage = 20
damage_type = OXY
/obj/item/projectile/bullet/cyanideround
name = "poison bullet"
name = "\improper Poison Bullet"
damage = 40
damage_type = TOX
/obj/item/projectile/bullet/burstbullet//I think this one needs something for the on hit
name = "exploding bullet"
name = "\improper Exploding Bullet"
damage = 20
/obj/item/projectile/bullet/stunshot
name = "stunshot"
name = "\improper Stunshot"
damage = 5
stun = 10
weaken = 10

View File

@@ -1,5 +1,5 @@
/obj/item/projectile/change
name = "bolt of change"
name = "\improper Bolt of Change"
icon_state = "ice_1"
damage = 0
damage_type = BURN

View File

@@ -1,5 +1,5 @@
/obj/item/projectile/energy
name = "energy"
name = "\improper Energy"
icon_state = "spark"
damage = 0
damage_type = BURN
@@ -7,17 +7,17 @@
/obj/item/projectile/energy/electrode
name = "electrode"
name = "\improper Electrode"
icon_state = "spark"
nodamage = 1
stun = 10
weaken = 10
stun = 15
weaken = 15
stutter = 10
flag = "melee" //Give it a better chance to be blocked.
flag = "laser" //Give it a better chance to be blocked.
/obj/item/projectile/energy/declone
name = "declown"
name = "\improper Decloner Bolt"
icon_state = "declone"
nodamage = 1
damage_type = CLONE
@@ -25,7 +25,7 @@
/obj/item/projectile/energy/dart
name = "dart"
name = "\improper Dart"
icon_state = "toxin"
damage = 5
damage_type = TOX
@@ -33,7 +33,7 @@
/obj/item/projectile/energy/bolt
name = "bolt"
name = "\improper Bolt"
icon_state = "cbbolt"
damage = 10
damage_type = TOX
@@ -43,7 +43,7 @@
/obj/item/projectile/energy/bolt/large
name = "largebolt"
name = "\improper Large Bolt"
damage = 20

View File

@@ -1,5 +1,5 @@
/obj/item/projectile/ion
name = "ion bolt"
name = "\improper Ion Bolt"
icon_state = "ion"
damage = 0
damage_type = BURN
@@ -13,7 +13,7 @@
/obj/item/projectile/bullet/gyro
name ="gyro"
name ="\improper Rocket"
icon_state= "bolter"
damage = 50
flag = "bullet"
@@ -24,7 +24,7 @@
return 1
/obj/item/projectile/temp
name = "freeze beam"
name = "\improper Freeze Beam"
icon_state = "ice_2"
damage = 0
damage_type = BURN

View File

@@ -86,7 +86,7 @@
if(ismob(G.affecting))
var/mob/GM = G.affecting
for (var/mob/V in viewers(usr))
V.show_message("[usr] starts putting [GM.name] into the disposal.", 3)
V.show_message("[usr] starts putting [GM] into the disposal.", 3)
if(do_after(usr, 20))
if (GM.client)
GM.client.perspective = EYE_PERSPECTIVE

View File

@@ -1,31 +1,8 @@
<html>
<head>
<head></head>
<body>
</head>
<body>There are a few notable rules we have here. If you disagree with them, drop by the forums and contribute to the "Server Rules - You Decide" thread. <br />
<br />
<ol>
<li>Don't be a dick. This is subject to interpretation, and there is a gray area, but for the most part it should be obvious if you're breaking it or not.</li>
<li>Murder is a touchy thing. On the one hand, it sucks being knocked out of the round for a couple of hours. On the other, it's SS13. It's hard to articulate every circumstance that killing a guy is and isn't acceptable, so I'll just try and convey the general philosophy and hope you can extrapolate from that<br />
</li>
<ol>
<li>Self defense is always acceptable. Sometimes calling Security isn't enough, and that asshole trying to strangle you for your slightly higher access ID won't fuck off. Just don't confuse an instance of outright paranoia with one of obvious imminent danger.</li>
<li>Syndicate are dangerous! Syndicate are notorious criminals, renowned for their proclivity of raiding and destroying stations not unlike space vikings. Murdering an innocent and claiming he is a Syndicate is actually worse than being a Syndicate yourself, and will not only bring you retribution from the crew, but the gods as well.</li>
<li>"I'm crazy!!!1" is shitty roleplaying tossed up to thinly veil the fact that you want to grief the station and not get punished for it.</li>
<li>general it's usually better to brig someone than kill them, but circumstances are not always ideal, and the safety of the crew comes before the safety of the proven traitor when all is said and done.</li>
</ol>
<li>Security has a tendency to ruin the round for everyone else. You have greater expectations placed on you than other positions. If you cannot handle that responsibility, ask for a job change. Someone with a position of authority like Security, Captain, HoP, etc. will receive harsher punishments for offenses than those not in such a position. Yes, this is unfair. Deal with it or take off the shades.<br />
</li>
<li>Keep IC out of OOC. At worst it ruins game modes by blowing traitors' covers and at best it pisses off everybody and stirs up drama.</li>
<li>Don't metagame. The big one here is calling the shuttle immediately at the beginning of the round to test the gamemode in Secret. It is bullshit and will get you on everyone's bad side very quickly.<br />
</li>
</ol><br />
We try and play it straight here. We don't like to metagame. We like to roleplay. We like to enjoy each other's company. We don't like to piss each other off.<br />
<br />
The way we play the game isn't everyone's cup of tea. We understand that and we don't fault you if you enjoy more a competitive style of play, but we do expect you to go elsewhere for that.<br />
<br />
This is not a comprehensive list. You're using my server and my bandwidth, and as Draconian as it sounds I have the final say on who stays and who goes. <br />
<iframe width='100%' height='100%' src="http://baystation12.net/wiki/index.php?title=Rules&printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe>
</body>
</html>

BIN
icons/effects/Targeted.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 32 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -4043,14 +4043,14 @@
"bzM" = (/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Sleeper Room"; dir = 2; network = "Medbay"; pixel_x = 22},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bzN" = (/obj/machinery/sink{pixel_y = 30},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bzO" = (/obj/structure/table,/obj/item/weapon/storage/stma_kit{pixel_x = 0; pixel_y = 0},/obj/machinery/firealarm{dir = 1; pixel_x = 24; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bzP" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/stamp/rd,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bzQ" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/structure/table,/obj/item/device/taperecorder,/obj/machinery/light{dir = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bzR" = (/obj/machinery/requests_console{announcementConsole = 1; department = "RD's Office"; departmentType = 5; name = "RD RC"; pixel_x = 0; pixel_y = 30},/turf/simulated/wall/r_wall,/area/crew_quarters/hor)
"bzS" = (/obj/machinery/computer/aifixer,/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 2; network = "Research"; pixel_x = 22},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bzT" = (/obj/machinery/computer/security/research,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bzU" = (/obj/machinery/computer/robotics,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bzV" = (/obj/machinery/light{dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bzW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/hor)
"bzP" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/stamp/rd,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bzQ" = (/obj/item/device/radio/intercom{pixel_y = 25},/obj/structure/table,/obj/item/device/taperecorder,/obj/machinery/light{dir = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bzR" = (/obj/machinery/requests_console{announcementConsole = 1; department = "RD's Office"; departmentType = 5; name = "RD RC"; pixel_x = 0; pixel_y = 30},/turf/simulated/wall/r_wall,/area/crew_quarters/heads/hor)
"bzS" = (/obj/machinery/computer/aifixer,/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 2; network = "Research"; pixel_x = 22},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bzT" = (/obj/machinery/computer/security/research,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bzU" = (/obj/machinery/computer/robotics,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bzV" = (/obj/machinery/light{dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bzW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hor)
"bzX" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bzY" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Toxins Lab"; req_access_txt = "7"},/turf/simulated/floor{icon_state = "white"},/area/toxins/toxinslab)
"bzZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/toxinslab)
@@ -4110,14 +4110,14 @@
"bBb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bBc" = (/obj/machinery/power/apc{dir = 4; name = "Surgery APC"; pixel_x = 25},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/crowbar,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bBd" = (/turf/simulated/wall/r_wall,/area/medical/surgery)
"bBe" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/machinery/power/apc{dir = 8; name = "RD's Office APC"; pixel_x = -25; pixel_y = 0},/obj/structure/cable{d2 = 2; icon_state = "0-4"; pixel_y = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bBf" = (/obj/structure/stool/chair{dir = 1},/obj/structure/cable{d2 = 2; icon_state = "4-8"; pixel_y = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bBg" = (/obj/structure/cable{d2 = 2; icon_state = "4-8"; pixel_y = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bBh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "2-8"; pixel_y = 0; tag = "Streight"},/obj/machinery/keycard_auth{pixel_x = -25; pixel_y = 32},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bBi" = (/obj/structure/stool/chair{dir = 1},/obj/effect/landmark/start{name = "Research Director"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bBj" = (/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bBk" = (/obj/structure/disposalpipe/segment{dir = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bBl" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/hor)
"bBe" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/machinery/power/apc{dir = 8; name = "RD's Office APC"; pixel_x = -25; pixel_y = 0},/obj/structure/cable{d2 = 2; icon_state = "0-4"; pixel_y = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bBf" = (/obj/structure/stool/chair{dir = 1},/obj/structure/cable{d2 = 2; icon_state = "4-8"; pixel_y = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bBg" = (/obj/structure/cable{d2 = 2; icon_state = "4-8"; pixel_y = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bBh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "2-8"; pixel_y = 0; tag = "Streight"},/obj/machinery/keycard_auth{pixel_x = -25; pixel_y = 32},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bBi" = (/obj/structure/stool/chair{dir = 1},/obj/effect/landmark/start{name = "Research Director"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bBj" = (/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bBk" = (/obj/structure/disposalpipe/segment{dir = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bBl" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hor)
"bBm" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Toxins Lab"; req_access_txt = "7"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/toxinslab)
"bBn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/toxinslab)
"bBo" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/toxins/toxinslab)
@@ -4182,13 +4182,13 @@
"bCv" = (/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bCw" = (/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bCx" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bCy" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/crew_quarters/hor)
"bCz" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/crew_quarters/hor)
"bCA" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bCB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = "90Curve"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bCC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bCD" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bCE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Research Director's Office"; req_access_txt = "30"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/ai_status_display{layer = 4; pixel_y = -32},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/hor)
"bCy" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/crew_quarters/heads/hor)
"bCz" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/crew_quarters/heads/hor)
"bCA" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bCB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = "90Curve"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bCC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bCD" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bCE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Research Director's Office"; req_access_txt = "30"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/ai_status_display{layer = 4; pixel_y = -32},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/hor)
"bCF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/structure/disposalpipe/sortjunction{sortType = list("Research Director")},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bCG" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/camera{c_tag = "Division Hallway South"; dir = 8; network = "Research"; pixel_x = 0; pixel_y = -22},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bCH" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/requests_console{department = "Toxins Lab"; departmentType = 2; name = "Tox lab Requests Console"; pixel_x = -30; pixel_y = -3},/turf/simulated/floor{icon_state = "white"},/area/toxins/toxinslab)
@@ -4252,11 +4252,11 @@
"bDN" = (/obj/machinery/sleep_console,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bDO" = (/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bDP" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/computer/med_data,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bDQ" = (/obj/structure/lamarr,/turf/simulated/floor,/area/crew_quarters/hor)
"bDR" = (/obj/machinery/door/window/eastright{name = "Lab Cage Access"; req_access_txt = "30"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/crew_quarters/hor)
"bDS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bDT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bDU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/hor)
"bDQ" = (/obj/structure/lamarr,/turf/simulated/floor,/area/crew_quarters/heads/hor)
"bDR" = (/obj/machinery/door/window/eastright{name = "Lab Cage Access"; req_access_txt = "30"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/crew_quarters/heads/hor)
"bDS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bDT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bDU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hor)
"bDV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bDW" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/camera{c_tag = "Toxins Lab West"; dir = 4; network = "SS13"},/turf/simulated/floor{icon_state = "white"},/area/toxins/toxinslab)
"bDX" = (/obj/structure/closet/bombcloset,/turf/simulated/floor{icon_state = "white"},/area/toxins/toxinslab)
@@ -4321,12 +4321,12 @@
"bFe" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/surgery)
"bFf" = (/obj/structure/stool/bed/roller,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/medical/surgery)
"bFg" = (/obj/structure/table,/obj/item/weapon/storage/belt/medical,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bFh" = (/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/crew_quarters/hor)
"bFi" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/crew_quarters/hor)
"bFj" = (/obj/structure/table,/obj/item/device/paicard,/obj/item/weapon/book/manual/robotics_cyborgs{pixel_y = 5},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bFk" = (/obj/structure/table,/obj/item/weapon/circuitboard/aicore,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bFl" = (/obj/structure/closet/secure_closet/RD,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bFm" = (/obj/structure/closet/wardrobe/rd,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"bFh" = (/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/crew_quarters/heads/hor)
"bFi" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/crew_quarters/heads/hor)
"bFj" = (/obj/structure/table,/obj/item/device/paicard,/obj/item/weapon/book/manual/robotics_cyborgs{pixel_y = 5},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bFk" = (/obj/structure/table,/obj/item/weapon/circuitboard/aicore,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bFl" = (/obj/structure/closet/secure_closet/RD,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bFm" = (/obj/structure/closet/wardrobe/rd,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bFn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/xenobiology)
"bFo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/mob/living/carbon/monkey,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"bFp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
@@ -4391,7 +4391,7 @@
"bGw" = (/obj/structure/table,/obj/item/weapon/storage/lglo_kit{pixel_x = 3; pixel_y = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bGx" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bGy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bGz" = (/turf/simulated/wall/r_wall,/area/crew_quarters/hor)
"bGz" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads/hor)
"bGA" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple{dir = 6},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Server Room APC"; pixel_x = -25},/obj/structure/filingcabinet,/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bGB" = (/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 2; network = "Research"; pixel_x = 22},/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/cable{tag = "Streight"; icon_state = "4-8"; pixel_x = 1; d1 = 4; d2 = 8},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bGC" = (/obj/machinery/door/window/northleft{name = "Server Room"; req_access_txt = "30"},/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = "90Curve"},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)

BIN
sound/weapons/TargetOff.ogg Normal file

Binary file not shown.

BIN
sound/weapons/TargetOn.ogg Normal file

Binary file not shown.