From 0d8c7d5e51ad882bf5ba253f0f3158e1454c4e9d Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Thu, 1 Mar 2012 19:18:27 -0700 Subject: [PATCH] Reworked the gun system to handle hostage scenarios better. Ported and adjusted with permission from Lost Worlds. --- baystation12.dme | 7 +- .../Cael_Aislinn/Tajara/tajaran.dm | 7 + code/defines/mob/mob.dm | 3 + code/defines/sd_procs/atom.dm | 32 ++ code/defines/sd_procs/base64.dm | 131 ++++++++ code/defines/sd_procs/color.dm | 75 +++++ code/defines/sd_procs/constants.dm | 1 + code/defines/sd_procs/direction.dm | 154 +++++++++ code/defines/sd_procs/hsl.dm | 186 +++++++++++ code/defines/sd_procs/math.dm | 117 +++++++ code/defines/sd_procs/nybble.dm | 140 ++++++++ code/defines/sd_procs/samplecolors.dm | 310 ++++++++++++++++++ code/defines/sd_procs/sd_procs.dm | 161 +++++++++ code/defines/sd_procs/text.dm | 89 +++++ code/game/atom_procs.dm | 2 + code/game/hud.dm | 5 + code/game/objects/portals.dm | 1 + code/game/objects/radio/radio.dm | 2 +- .../living/carbon/alien/humanoid/humanoid.dm | 7 + code/modules/mob/living/carbon/human/human.dm | 7 + .../mob/living/carbon/monkey/monkey.dm | 10 +- code/modules/mob/living/damage_procs.dm | 4 +- code/modules/mob/living/say.dm | 49 ++- .../modules/mob/living/silicon/robot/robot.dm | 8 + code/modules/mob/living/silicon/say.dm | 4 +- code/modules/mob/mob_movement.dm | 1 + code/modules/mob/screen.dm | 50 +++ code/modules/projectiles/gun.dm | 295 ++++++++++++++++- code/modules/projectiles/guns/energy.dm | 2 +- code/modules/projectiles/guns/energy/laser.dm | 6 +- .../projectiles/guns/energy/nuclear.dm | 33 +- code/modules/projectiles/guns/energy/pulse.dm | 48 +-- .../projectiles/guns/energy/special.dm | 6 +- code/modules/projectiles/guns/energy/stun.dm | 8 +- .../projectiles/guns/energy/temperature.dm | 27 +- code/modules/projectiles/guns/projectile.dm | 2 +- .../projectiles/guns/projectile/automatic.dm | 6 +- .../projectiles/guns/projectile/pistol.dm | 10 +- .../projectiles/guns/projectile/revolver.dm | 4 +- .../projectiles/guns/projectile/shotgun.dm | 17 +- code/modules/projectiles/projectile.dm | 4 +- code/modules/projectiles/projectile/beams.dm | 8 +- .../modules/projectiles/projectile/bullets.dm | 10 +- code/modules/projectiles/projectile/change.dm | 2 +- code/modules/projectiles/projectile/energy.dm | 18 +- .../modules/projectiles/projectile/special.dm | 6 +- code/modules/recycling/disposal.dm | 2 +- icons/effects/Targeted.dmi | Bin 0 -> 613 bytes icons/mob/screen1.dmi | Bin 150550 -> 154309 bytes icons/mob/screen1_old.dmi | Bin 113744 -> 116568 bytes icons/mob/screen1_robot.dmi | Bin 29971 -> 32784 bytes sound/weapons/TargetOff.ogg | Bin 0 -> 7712 bytes sound/weapons/TargetOn.ogg | Bin 0 -> 7512 bytes 53 files changed, 1938 insertions(+), 139 deletions(-) create mode 100644 code/defines/sd_procs/atom.dm create mode 100644 code/defines/sd_procs/base64.dm create mode 100644 code/defines/sd_procs/color.dm create mode 100644 code/defines/sd_procs/constants.dm create mode 100644 code/defines/sd_procs/direction.dm create mode 100644 code/defines/sd_procs/hsl.dm create mode 100644 code/defines/sd_procs/math.dm create mode 100644 code/defines/sd_procs/nybble.dm create mode 100644 code/defines/sd_procs/samplecolors.dm create mode 100644 code/defines/sd_procs/sd_procs.dm create mode 100644 code/defines/sd_procs/text.dm create mode 100644 icons/effects/Targeted.dmi create mode 100644 sound/weapons/TargetOff.ogg create mode 100644 sound/weapons/TargetOn.ogg diff --git a/baystation12.dme b/baystation12.dme index 1c112b009c4..21128d8db28 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -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" @@ -352,6 +353,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" @@ -531,7 +536,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" diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm index b07f634aa9d..3a718e18de5 100644 --- a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm +++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm @@ -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 diff --git a/code/defines/mob/mob.dm b/code/defines/mob/mob.dm index 6bc1b6de22d..4f67c079ec4 100644 --- a/code/defines/mob/mob.dm +++ b/code/defines/mob/mob.dm @@ -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 diff --git a/code/defines/sd_procs/atom.dm b/code/defines/sd_procs/atom.dm new file mode 100644 index 00000000000..54cbe0ff1d5 --- /dev/null +++ b/code/defines/sd_procs/atom.dm @@ -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) + ..() \ No newline at end of file diff --git a/code/defines/sd_procs/base64.dm b/code/defines/sd_procs/base64.dm new file mode 100644 index 00000000000..2b65fef20ca --- /dev/null +++ b/code/defines/sd_procs/base64.dm @@ -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 \ No newline at end of file diff --git a/code/defines/sd_procs/color.dm b/code/defines/sd_procs/color.dm new file mode 100644 index 00000000000..366227d57f8 --- /dev/null +++ b/code/defines/sd_procs/color.dm @@ -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 diff --git a/code/defines/sd_procs/constants.dm b/code/defines/sd_procs/constants.dm new file mode 100644 index 00000000000..bb3664aabbc --- /dev/null +++ b/code/defines/sd_procs/constants.dm @@ -0,0 +1 @@ +#define PI 3.141592654 diff --git a/code/defines/sd_procs/direction.dm b/code/defines/sd_procs/direction.dm new file mode 100644 index 00000000000..45a38173fd4 --- /dev/null +++ b/code/defines/sd_procs/direction.dm @@ -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 diff --git a/code/defines/sd_procs/hsl.dm b/code/defines/sd_procs/hsl.dm new file mode 100644 index 00000000000..0b71948b7ec --- /dev/null +++ b/code/defines/sd_procs/hsl.dm @@ -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) diff --git a/code/defines/sd_procs/math.dm b/code/defines/sd_procs/math.dm new file mode 100644 index 00000000000..cd3f4ea6ce3 --- /dev/null +++ b/code/defines/sd_procs/math.dm @@ -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 diff --git a/code/defines/sd_procs/nybble.dm b/code/defines/sd_procs/nybble.dm new file mode 100644 index 00000000000..eca85c49ec7 --- /dev/null +++ b/code/defines/sd_procs/nybble.dm @@ -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 diff --git a/code/defines/sd_procs/samplecolors.dm b/code/defines/sd_procs/samplecolors.dm new file mode 100644 index 00000000000..96a6bebebdb --- /dev/null +++ b/code/defines/sd_procs/samplecolors.dm @@ -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" diff --git a/code/defines/sd_procs/sd_procs.dm b/code/defines/sd_procs/sd_procs.dm new file mode 100644 index 00000000000..16de19f4743 --- /dev/null +++ b/code/defines/sd_procs/sd_procs.dm @@ -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. + +*/ \ No newline at end of file diff --git a/code/defines/sd_procs/text.dm b/code/defines/sd_procs/text.dm new file mode 100644 index 00000000000..88b410bd2b7 --- /dev/null +++ b/code/defines/sd_procs/text.dm @@ -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, " ","") + var/open = findtext(T,"<") + while(open) + var/close = findtext(T,">",open) + if(close) + if(close= 2)) return 0 switch(effecttype) if(STUN) - Stun((effect - (effect*getarmor(null, "laser")))/(blocked + 1)) + Stun((effect - (effect*getarmor(null, "laser")))) if(WEAKEN) - Weaken((effect - (effect*getarmor(null, "laser")))/(blocked + 1)) + Weaken((effect - (effect*getarmor(null, "laser")))) if(PARALYZE) Paralyse(effect/(blocked+1)) if(IRRADIATE) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 6a9a228a716..c76afae8228 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -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. diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 2fc30a57fec..66027f582da 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -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 diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index fa8ae87b1fd..15d24563989 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -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)) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 098ca75e562..0b6f753d3d1 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -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) diff --git a/code/modules/mob/screen.dm b/code/modules/mob/screen.dm index edf60ec1f95..d646df6906b 100644 --- a/code/modules/mob/screen.dm +++ b/code/modules/mob/screen.dm @@ -25,6 +25,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 +588,37 @@ usr:inv3.icon_state = "inv3" usr:module_active = null + if("Allow Walking") + usr.AllowTargetMove() + icon_state = "walking" + name = "Disallow Walking" + + if("Disallow Walking") + usr.AllowTargetMove() + icon_state = "no_walk" + name = "Allow Walking" + + if("Allow Running") + usr.AllowTargetRun() + icon_state = "running" + name = "Disallow Running" + + if("Disallow Running") + usr.AllowTargetRun() + icon_state = "no_run" + name = "Allow Running" + + if("Allow Item Use") + name = "Disallow Item Use" + icon_state = "act_throw_off" + usr.AllowTargetClick() + + + if("Disallow Item Use") + name = "Allow Item Use" + icon_state = "no_item" + usr.AllowTargetClick() + else DblClick() return diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 084002946f1..2e3a274a18c 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -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,13 @@ load_into_chamber() return 0 + 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 +47,16 @@ for(var/obj/O in contents) O.emp_act(severity) + attack_self() + if(target) + target.NotTargeted(src) + usr.visible_message("[usr] lowers \the [src].") + return 0 + return 1 + 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 +77,18 @@ 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? - + 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 +131,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 +156,264 @@ update_icon() return + 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) + + proc/TargetActed() + var/mob/M = loc + if(target == M) return + 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) + + 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) + +#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 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 + 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*/ + +/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 + +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 + 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 walk at the discretion of their targeter." + else + G.target << "Your character will now be shot if they move." + 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 run at the discretion of their targeter." + else + G.target << "Your character will now be shot if they run." + 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 use items at the discretion of their targeter." + else + G.target << "Your character will now be shot if they use items." \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index e739ea24bbf..84d069df95f 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -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' diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 489b7ac91ba..52349e64642 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -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' diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 7b791c15775..ba8e3acc6e6 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -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 diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 449ac729797..79814620688 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -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" diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 828c05db823..817d23d96ab 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -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" diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index e3177e7438b..348f32f75a7 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -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 diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm index 3c2d5e64e5d..b9fa50739a2 100644 --- a/code/modules/projectiles/guns/energy/temperature.dm +++ b/code/modules/projectiles/guns/energy/temperature.dm @@ -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 = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)" - else - temp_text = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)" + if(..()) + user.machine = src + var/temp_text = "" + if(temperature > (T0C - 50)) + temp_text = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)" + else + temp_text = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)" - var/dat = {"Freeze Gun Configuration:
- Current output temperature: [temp_text]
- Target output temperature: - - - [current_temperature] + + +
- "} + var/dat = {"Freeze Gun Configuration:
+ Current output temperature: [temp_text]
+ Target output temperature: - - - [current_temperature] + + +
+ "} - user << browse(dat, "window=freezegun;size=450x300") - onclose(user, "freezegun") + user << browse(dat, "window=freezegun;size=450x300") + onclose(user, "freezegun") Topic(href, href_list) diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 9d17671303f..f4e4e7a3d83 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -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" diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 43024098039..46086b8e48d 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -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" diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 394649e92f1..f02112fecfe 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -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 diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index ee4ed93f46d..859e734d05b 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -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" @@ -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" \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index c334fb755d4..eb6746cbc29 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -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 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 4b6bef3f3b1..2757b672231 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -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)) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 7812fe4bff3..803fb597fa4 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -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 diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index f12dd9f2467..28566f9e90a 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -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 diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 02ff86c2ed2..eea3f22a741 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -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 diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 95d7931e850..bb8f30ad3ff 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -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 diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index ae20b7ca630..c8ead597efd 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -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 diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 4671aa7c228..3163332c5cf 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -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 diff --git a/icons/effects/Targeted.dmi b/icons/effects/Targeted.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f0d4b95f64f9e147b6f549d70ff39674898bfb51 GIT binary patch literal 613 zcmV-r0-F7aP) zJLh&@M7HXx$=ZgdZz?zshCb3LlxuQf5C+(gyn zwQW?}}%>y%F2rMm3(jyOp82Fs7Jp)0>@GwDA%LYpMX;-50vXG`Je+n7I~piuW#b*Ha!F1 zrES!8%Lj&G7z)b=mJci+T)wb;U>Jsx!Tg`jr>`smeQB}_VE#`RVE)gb*2SRy&!GO# zp#IOG{{M#s>Y7OXpDsZCpHX|1>mMfbf1{E!EKXTRE7gi_00000NkvXXu0mjfUrQ1R literal 0 HcmV?d00001 diff --git a/icons/mob/screen1.dmi b/icons/mob/screen1.dmi index d631ff02ce293e140357f33ed697a071ef8e163a..3b56a6cd6c9e590eae3f134e75877e678a2cc86b 100644 GIT binary patch delta 16958 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 diff --git a/icons/mob/screen1_old.dmi b/icons/mob/screen1_old.dmi index 1918ebce9fe45dd647cd5df00596d091c502266e..c214d6441dda07ee58f9444a24addac62d34885f 100644 GIT binary patch delta 9365 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 LtIAc#mJ0LNH3?Kq39ReaCpmZ}sNQ)rd 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 Lsmhc}nfm=7+VHH7 delta 8088 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 literal 0 HcmV?d00001 diff --git a/sound/weapons/TargetOn.ogg b/sound/weapons/TargetOn.ogg new file mode 100644 index 0000000000000000000000000000000000000000..93a2f68f326cd25c91bd8331ce423830f89dae99 GIT binary patch literal 7512 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