diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 9d9f703d70c..47df198e5b8 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -164,7 +164,7 @@ "adh" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/item/clothing/suit/armor/bulletproof{pixel_x = 0; pixel_y = 0},/obj/item/clothing/head/helmet/alt,/obj/item/clothing/suit/armor/bulletproof{pixel_x = 0; pixel_y = 0},/obj/item/clothing/head/helmet/alt,/obj/item/clothing/suit/armor/bulletproof{pixel_x = 0; pixel_y = 0},/obj/item/clothing/head/helmet/alt,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury) "adi" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury) "adj" = (/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) -"adk" = (/obj/structure/table/woodentable,/obj/item/weapon/stamp/hos,/obj/item/device/flashlight/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/carpet,/area/security/hos) +"adk" = (/obj/structure/table/woodentable,/obj/item/weapon/stamp/hos,/obj/item/device/flashlight/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/device/spacepod_key{id = 100000},/turf/simulated/floor/carpet,/area/security/hos) "adl" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/unary/vent_pump,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/security/hos) "adm" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/sop_security,/obj/item/weapon/book/manual/sop_legal,/turf/simulated/floor/carpet,/area/security/hos) "adn" = (/obj/machinery/door_control{id = "Prison Gate"; name = "Prison Wing Lockdown"; pixel_x = -28; pixel_y = 7; req_access_txt = "2"},/obj/machinery/door_control{id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = -28; pixel_y = -3; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) @@ -314,7 +314,7 @@ "agb" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway) "agc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/securehallway) "agd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/security/podbay) -"age" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table/reinforced,/obj/item/clothing/suit/jacket/pilot,/obj/item/clothing/head/beret/sec,/obj/machinery/light_switch{pixel_x = -25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) +"age" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table/reinforced,/obj/item/clothing/suit/jacket/pilot,/obj/item/clothing/head/beret/sec,/obj/machinery/light_switch{pixel_x = -25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/device/spacepod_key{id = 100000},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) "agf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) "agg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) "agh" = (/obj/structure/closet/secure_closet/security,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Security Podbay APC"; pixel_x = 25},/obj/item/device/spacepod_equipment/weaponry/laser,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index edc45b22e23..adb9d60ab1f 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -16,6 +16,7 @@ Pipelines + Other Objects -> Pipe network idle_power_usage = 0 active_power_usage = 0 power_channel = ENVIRON + on_blueprints = TRUE var/nodealert = 0 var/can_unwrench = 0 diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 04a20338c1f..9c9b8db5727 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -66,6 +66,7 @@ #define HAS_MARKINGS 256 #define TAIL_WAGGING 512 #define NO_EYES 1024 +#define HAS_FUR 2048 //Species Diet Flags #define DIET_CARN 1 diff --git a/code/__DEFINES/math.dm b/code/__DEFINES/math.dm index e1d9888126d..d71047fe3d3 100644 --- a/code/__DEFINES/math.dm +++ b/code/__DEFINES/math.dm @@ -10,6 +10,24 @@ #define T20C 293.15 // 20degC #define TCMB 2.7 // -270.3degC -#define Clamp(x, y, z) (x <= y ? y : (x >= z ? z : x)) - -#define CLAMP01(x) (Clamp(x, 0, 1)) +#define Clamp(x, y, z) ((x) <= (y) ? (y) : ((x) >= (z) ? (z) : (x))) +#define CLAMP01(x) (Clamp((x), 0, 1)) +#define SIMPLE_SIGN(X) ((X) < 0 ? -1 : 1) +#define SIGN(X) ((X) ? SIMPLE_SIGN(X) : 0) +#define hypotenuse(Ax, Ay, Bx, By) (sqrt(((Ax) - (Bx))**2 + ((Ay) - (By))**2)) +#define Ceiling(x) (-round(-(x))) +#define Tan(x) (sin(x) / cos(x)) +#define Cot(x) (1 / Tan(x)) +#define Csc(x) (1 / sin(x)) +#define Sec(x) (1 / cos(x)) +#define Floor(x) (round(x)) +#define Inverse(x) (1 / (x)) +#define IsEven(x) ((x) % 2 == 0) +#define IsOdd(x) ((x) % 2 == 1) +#define IsInRange(val, min, max) ((min) <= (val) && (val) <= (max)) +#define IsInteger(x) (Floor(x) == (x)) +#define IsMultiple(x, y) ((x) % (y) == 0) +#define Lcm(a, b) (abs(a) / Gcd((a), (b)) * abs(b)) +#define Root(n, x) ((x) ** (1 / (n))) +#define ToDegrees(radians) ((radians) * 57.2957795) // 180 / Pi +#define ToRadians(degrees) ((degrees) * 0.0174532925) // Pi / 180 \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 7f1a33d0b33..5e31e40a7a6 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -142,6 +142,14 @@ #define STAGE_FIVE 9 #define STAGE_SIX 11 //From supermatter shard +#define in_range(source, user) (get_dist(source, user) <= 1) + +#define RANGE_TURFS(RADIUS, CENTER) \ + block( \ + locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ + locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ + ) + #define FOR_DVIEW(type, range, center, invis_flags) \ dview_mob.loc = center; \ dview_mob.see_invisible = invis_flags; \ diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm index 2bdb3432f69..8cb7556ab3e 100644 --- a/code/__DEFINES/mob.dm +++ b/code/__DEFINES/mob.dm @@ -97,4 +97,39 @@ #define CHEM_MOB_SPAWN_INVALID 0 #define CHEM_MOB_SPAWN_HOSTILE 1 -#define CHEM_MOB_SPAWN_FRIENDLY 2 \ No newline at end of file +#define CHEM_MOB_SPAWN_FRIENDLY 2 + +#define isobserver(A) (istype((A), /mob/dead/observer)) +#define isliving(A) (istype((A), /mob/living)) +#define isAutoAnnouncer(A) (istype((A), /mob/living/automatedannouncer)) + +#define iscarbon(A) (istype((A), /mob/living/carbon)) +#define ishuman(A) (istype((A), /mob/living/carbon/human)) +#define isbrain(A) (istype((A), /mob/living/carbon/brain)) +#define isalien(A) (istype((A), /mob/living/carbon/alien)) +#define isalienadult(A) (istype((A), /mob/living/carbon/alien/humanoid)) +#define islarva(A) (istype((A), /mob/living/carbon/alien/larva)) +#define isslime(A) (istype((A), /mob/living/carbon/slime)) + +#define isanimal(A) (istype((A), /mob/living/simple_animal)) +#define iscorgi(A) (istype((A), /mob/living/simple_animal/pet/corgi)) +#define ismouse(A) (istype((A), /mob/living/simple_animal/mouse)) +#define isbot(A) (istype((A), /mob/living/simple_animal/bot)) +#define isswarmer(A) (istype((A), /mob/living/simple_animal/hostile/swarmer)) +#define isguardian(A) (istype((A), /mob/living/simple_animal/hostile/guardian)) + +#define issilicon(A) (istype((A), /mob/living/silicon)) +#define isAI(A) (istype((A), /mob/living/silicon/ai)) +#define isrobot(A) (istype((A), /mob/living/silicon/robot)) +#define ispAI(A) (istype((A), /mob/living/silicon/pai)) + +#define isAIEye(A) (istype((A), /mob/camera/aiEye)) +#define isovermind(A) (istype((A), /mob/camera/blob)) + +#define isSpirit(A) (istype((A), /mob/spirit)) +#define ismask(A) (istype((A), /mob/spirit/mask)) + +#define isorgan(A) (istype((A), /obj/item/organ/external)) +#define hasorgans(A) (ishuman(A)) + +#define is_admin(user) (check_rights(R_ADMIN, 0, (user)) != 0) \ No newline at end of file diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index e6253c1c170..47cee347876 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -1,10 +1,3 @@ -//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a -#define RANGE_TURFS(RADIUS, CENTER) \ - block( \ - locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ - locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ - ) - /proc/dopage(src,target) var/href_list var/href @@ -46,13 +39,6 @@ areas |= T.loc return areas - -/proc/in_range(source, user) - if(get_dist(source, user) <= 1) - return 1 - - return 0 //not in range and not telekinetic - // Like view but bypasses luminosity check /proc/hear(var/range, var/atom/source) @@ -65,11 +51,6 @@ return heard -//We used to use linear regression to approximate the answer, but Mloc realized this was actually faster. -//And lo and behold, it is, and it's more accurate to boot. -/proc/cheap_hypotenuse(Ax,Ay,Bx,By) - return sqrt(abs(Ax - Bx)**2 + abs(Ay - By)**2) //A squared + B squared = C squared - /proc/circlerange(center=usr,radius=3) var/turf/centerturf = get_turf(center) @@ -233,53 +214,44 @@ . |= M // Since we're already looping through mobs, why bother using |= ? This only slows things down. return . - -#define SIGN(X) ((X<0)?-1:1) - -proc - inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5) - var/turf/T - if(X1==X2) - if(Y1==Y2) - return 1 //Light cannot be blocked on same tile - else - var/s = SIGN(Y2-Y1) - Y1+=s - while(Y1!=Y2) - T=locate(X1,Y1,Z) - if(T.opacity) - return 0 - Y1+=s +/proc/inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5) + var/turf/T + if(X1==X2) + if(Y1==Y2) + return 1 //Light cannot be blocked on same tile else - var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1)) - var/b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles - var/signX = SIGN(X2-X1) - var/signY = SIGN(Y2-Y1) - if(X1= 0 ? a : -a -/proc/Ceiling(x) - return -round(-x) - -//Replaced in /code/__DEFINES/math.dm because holy shit man a define is faster. -/* -/proc/Clamp(val, min, max) - return max(min, min(val, max)) -*/ - -// cotangent -/proc/Cot(x) - return 1 / Tan(x) - -// cosecant -/proc/Csc(x) - return 1 / sin(x) - -/proc/Default(a, b) - return a ? a : b - -/proc/Floor(x) - return round(x) - // Greatest Common Divisor - Euclid's algorithm /proc/Gcd(a, b) return b ? Gcd(b, a % b) : a -/proc/Inverse(x) - return 1 / x - /proc/IsAboutEqual(a, b, deviation = 0.1) return abs(a - b) <= deviation -/proc/IsEven(x) - return x % 2 == 0 - -// Returns true if val is from min to max, inclusive. -/proc/IsInRange(val, min, max) - return min <= val && val <= max - -/proc/IsInteger(x) - return Floor(x) == x - -/proc/IsOdd(x) - return !IsEven(x) - -/proc/IsMultiple(x, y) - return x % y == 0 - -// Least Common Multiple -/proc/Lcm(a, b) - return abs(a) / Gcd(a, b) * abs(b) - // Performs a linear interpolation between a and b. // Note that amount=0 returns a, amount=1 returns b, and // amount=0.5 returns the mean of a and b. @@ -81,15 +29,6 @@ var/list/sqrtTable = list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, sum += val return sum / values - -// Returns the nth root of x. -/proc/Root(n, x) - return x ** (1 / n) - -// secant -/proc/Sec(x) - return 1 / cos(x) - // The quadratic formula. Returns a list with the solutions, or an empty list // if they are imaginary. /proc/SolveQuadratic(a, b, c) @@ -103,18 +42,6 @@ var/list/sqrtTable = list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, if(!d) return . += (-b - root) / bottom -// tangent -/proc/Tan(x) - return sin(x) / cos(x) - -/proc/ToDegrees(radians) - // 180 / Pi - return radians * 57.2957795 - -/proc/ToRadians(degrees) - // Pi / 180 - return degrees * 0.0174532925 - // Will filter out extra rotations and negative rotations // E.g: 540 becomes 180. -180 becomes 180. /proc/SimplifyDegrees(degrees) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index f85e318de76..59784a357e0 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -208,6 +208,14 @@ proc/checkhtml(var/t) t = replacetext(t, char, repl_chars[char]) return t +//Strips the first char and returns it and the new string as a list +/proc/strip_first(t) + return list(copytext(t, 1, 2), copytext(t, 2, 0)) + +//Strips the last char and returns it and the new string as a list +/proc/strip_last(t) + return list(copytext(t, 1, length(t)), copytext(t, length(t))) + //Adds 'u' number of zeros ahead of the text 't' /proc/add_zero(t, u) while (length(t) < u) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 0147bffe195..ff4ee54b2e9 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -185,9 +185,6 @@ Turf and target are seperate in case you want to teleport some distance from a t ///////////////////////////////////////////////////////////////////////// -/proc/sign(x) - return x!=0?x/abs(x):0 - /proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm var/px=M.x //starting x var/py=M.y @@ -196,8 +193,8 @@ Turf and target are seperate in case you want to teleport some distance from a t var/dy=N.y-py var/dxabs=abs(dx)//Absolute value of x distance var/dyabs=abs(dy) - var/sdx=sign(dx) //Sign of x distance (+ or -) - var/sdy=sign(dy) + var/sdx=SIGN(dx) //Sign of x distance (+ or -) + var/sdy=SIGN(dy) var/x=dxabs>>1 //Counters for steps taken, setting to distance/2 var/y=dyabs>>1 //Bit-shifting makes me l33t. It also makes getline() unnessecarrily fast. var/j //Generic integer for counting diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 617a0af3d7d..ec3be384bad 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -30,3 +30,4 @@ var/global/list/beacons = list() var/global/list/shuttle_caller_list = list() //list of all communication consoles and AIs, for automatic shuttle calls when there are none. var/global/list/tracked_implants = list() //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented... var/global/list/abductor_equipment = list() //list of all abductor equipment +var/global/list/global_intercoms = list() //list of all intercomms, across all z-levels \ No newline at end of file diff --git a/code/controllers/ProcessScheduler/core/processScheduler.dm b/code/controllers/ProcessScheduler/core/processScheduler.dm index 1c6a0c91a28..86e1fc5bbe9 100644 --- a/code/controllers/ProcessScheduler/core/processScheduler.dm +++ b/code/controllers/ProcessScheduler/core/processScheduler.dm @@ -355,16 +355,11 @@ var/global/datum/controller/processScheduler/processScheduler /datum/controller/processScheduler/proc/updateTimeAllowance() // Time allowance goes down linearly with world.cpu. var/tmp/error = cpuAverage - 100 - var/tmp/timeAllowanceDelta = sign(error) * -0.5 * world.tick_lag * max(0, 0.001 * abs(error)) + var/tmp/timeAllowanceDelta = SIMPLE_SIGN(error) * -0.5 * world.tick_lag * max(0, 0.001 * abs(error)) //timeAllowance = world.tick_lag * min(1, 0.5 * ((200/max(1,cpuAverage)) - 1)) timeAllowance = min(timeAllowanceMax, max(0, timeAllowance + timeAllowanceDelta)) -/datum/controller/processScheduler/proc/sign(var/x) - if (x == 0) - return 1 - return x / abs(x) - /datum/controller/processScheduler/proc/statProcesses() if(!isRunning) stat("Processes", "Scheduler not running") diff --git a/code/datums/Emote_system/emotes.dm b/code/datums/Emote_system/emotes.dm index 509ff9eca2a..7a3f9ea2b10 100644 --- a/code/datums/Emote_system/emotes.dm +++ b/code/datums/Emote_system/emotes.dm @@ -197,7 +197,12 @@ above it. If you don't want this, make the call to ..() then use commands = new if(!. && user.buckled) return "you are buckled to something" - +/datum/emote/burp + name = "burp" + desc = "burp" + text = "burps" + selfText = "burp" + muzzledNoise = "peculiar /datum/emote/scream diff --git a/code/datums/diseases/berserker.dm b/code/datums/diseases/berserker.dm new file mode 100644 index 00000000000..248503ba672 --- /dev/null +++ b/code/datums/diseases/berserker.dm @@ -0,0 +1,55 @@ +/datum/disease/berserker + name = "Berserker" + max_stages = 2 + stage_prob = 5 + spread_text = "Non-Contagious" + spread_flags = SPECIAL + cure_text = "Anti-Psychotics" + cures = list("haloperidol") + agent = "Jagged Crystals" + cure_chance = 10 + viable_mobtypes = list(/mob/living/carbon/human) + desc = "Swearing, shouting, attacking nearby crew members uncontrollably." + severity = DANGEROUS + disease_flags = CURABLE + spread_flags = NON_CONTAGIOUS + +/datum/disease/berserker/stage_act() + ..() + if(affected_mob.reagents.has_reagent("thc")) + to_chat(affected_mob, "You mellow out.") + cure() + return + switch(stage) + if(1) + if(prob(5)) + affected_mob.emote(pick("twitch_s", "grumble")) + if(prob(5)) + var/speak = pick("Grr...", "Fuck...", "Fucking...", "Fuck this fucking.. fuck..") + affected_mob.say(speak) + if(2) + if(prob(5)) + affected_mob.emote(pick("twitch_s", "scream")) + if (prob(5)) + var/speak = pick("AAARRGGHHH!!!!", "GRR!!!", "FUCK!! FUUUUUUCK!!!", "FUCKING SHITCOCK!!", "WROOAAAGHHH!!") + affected_mob.say(speak) + if (prob(15)) + affected_mob.visible_message("[affected_mob] twitches violently!") + affected_mob.drop_l_hand() + affected_mob.drop_r_hand() + if (prob(33)) + if(affected_mob.incapacitated()) + affected_mob.visible_message("[affected_mob] spasms and twitches!") + return + affected_mob.visible_message("[affected_mob] thrashes around violently!") + for(var/mob/living/carbon/M in range(1, affected_mob)) + if(M == affected_mob) + continue + var/damage = rand(1, 5) + if (prob(80)) + playsound(affected_mob.loc, "punch", 25, 1, -1) + affected_mob.visible_message("[affected_mob] hits [M] with their thrashing!") + M.adjustBruteLoss(damage) + else + playsound(affected_mob.loc, "sound/weapons/punchmiss.ogg", 25, 1, -1) + affected_mob.visible_message("[affected_mob] fails to hit [M] with their thrashing!") \ No newline at end of file diff --git a/code/datums/diseases/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm new file mode 100644 index 00000000000..25166ecf13b --- /dev/null +++ b/code/datums/diseases/food_poisoning.dm @@ -0,0 +1,77 @@ +/datum/disease/food_poisoning + name = "Food Poisoning" + max_stages = 3 + stage_prob = 5 + spread_text = "Non-Contagious" + spread_flags = SPECIAL + cure_text = "Sleep" + agent = "Salmonella" + cures = list("chicken_soup") + cure_chance = 10 + viable_mobtypes = list(/mob/living/carbon/human) + desc = "Nausea, sickness, and vomitting." + severity = MINOR + disease_flags = CURABLE + spread_flags = NON_CONTAGIOUS + var/remissive = 0 + +/datum/disease/food_poisoning/stage_act() + if(!remissive) + ..() + if(affected_mob.sleeping && prob(33)) + to_chat(affected_mob, "You feel better.") + remissive = 1 + if(remissive) + if(prob(stage_prob)) + stage-- + if(stage == 0) + cure() + return + switch(stage) + if(1) + if(prob(5)) + to_chat(affected_mob, "Your stomach feels weird.") + if(prob(5)) + to_chat(affected_mob, "You feel queasy.") + if(2) + if(affected_mob.sleeping && prob(40)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(10)) + affected_mob.emote("groan") + if(prob(5)) + to_chat(affected_mob, "Your stomach aches.") + if(prob(5)) + to_chat(affected_mob, "You feel nauseous.") + if(3) + if(affected_mob.sleeping && prob(25)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(10)) + affected_mob.emote("moan") + if(prob(10)) + affected_mob.emote("groan") + if(prob(1)) + to_chat(affected_mob, "Your stomach hurts.") + if(prob(1)) + to_chat(affected_mob, "You feel sick.") + if(prob(5)) + if(affected_mob.nutrition > 10) + affected_mob.visible_message("[affected_mob] vomits on the floor profusely!") + affected_mob.fakevomit(no_text = 1) + affected_mob.nutrition -= rand(3,5) + else + to_chat(affected_mob, "Your stomach lurches painfully!") + affected_mob.visible_message("[affected_mob] gags and retches!") + affected_mob.Stun(rand(2,4)) + affected_mob.Weaken(rand(2,4)) \ No newline at end of file diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index 64079f0fddc..8ba67750c06 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -38,4 +38,16 @@ if(prob(50)) affected_mob.gib() else - return \ No newline at end of file + return + +/datum/disease/gbs/curable + name = "Non-Contagious GBS" + stage_prob = 5 + spread_text = "Non-Contagious" + spread_flags = SPECIAL + cure_text = "Cryoxadone" + cures = list("cryoxadone") + cure_chance = 10 + agent = "gibbis" + spread_flags = NON_CONTAGIOUS + disease_flags = CURABLE \ No newline at end of file diff --git a/code/datums/diseases/kuru.dm b/code/datums/diseases/kuru.dm new file mode 100644 index 00000000000..67cfd3e8693 --- /dev/null +++ b/code/datums/diseases/kuru.dm @@ -0,0 +1,51 @@ +/datum/disease/kuru + name = "Space Kuru" + max_stages = 4 + stage_prob = 5 + spread_text = "Non-Contagious" + spread_flags = SPECIAL + cure_text = "Incurable" + agent = "Prions" + viable_mobtypes = list(/mob/living/carbon/human) + desc = "Uncontrollable laughing." + severity = BIOHAZARD + spread_flags = NON_CONTAGIOUS + +/datum/disease/kuru/stage_act() + ..() + switch(stage) + if(1) + if(prob(50)) + affected_mob.emote("laugh") + if(prob(50)) + affected_mob.Jitter(25) + if(2) + if (prob(50)) + affected_mob.visible_message("[affected_mob] laughs uncontrollably!") + affected_mob.Stun(10) + affected_mob.Weaken(10) + affected_mob.Jitter(250) + affected_mob.drop_l_hand() + affected_mob.drop_r_hand() + if(3) + if(prob(25)) + to_chat(affected_mob, "You feel like you are about to drop dead!") + to_chat(affected_mob, "Your body convulses painfully!") + affected_mob.drop_l_hand() + affected_mob.drop_r_hand() + affected_mob.adjustBruteLoss(5) + affected_mob.adjustOxyLoss(5) + affected_mob.Stun(10) + affected_mob.Weaken(10) + affected_mob.Jitter(250) + affected_mob.visible_message("[affected_mob] laughs uncontrollably!") + if(4) + if(prob(25)) + to_chat(affected_mob, "You feel like you are going to die!") + affected_mob.adjustOxyLoss(75) + affected_mob.adjustBruteLoss(75) + affected_mob.drop_l_hand() + affected_mob.drop_r_hand() + affected_mob.Stun(10) + affected_mob.Weaken(10) + affected_mob.visible_message("[affected_mob] laughs uncontrollably!") \ No newline at end of file diff --git a/code/datums/diseases/vampire.dm b/code/datums/diseases/vampire.dm new file mode 100644 index 00000000000..dbcc9bbb3c0 --- /dev/null +++ b/code/datums/diseases/vampire.dm @@ -0,0 +1,34 @@ +/datum/disease/vampire + name = "Grave Fever" + max_stages = 3 + stage_prob = 5 + spread_text = "Non-Contagious" + spread_flags = SPECIAL + cure_text = "Antibiotics" + cures = list("spaceacillin") + agent = "Grave Dust" + cure_chance = 20 + viable_mobtypes = list(/mob/living/carbon/human) + severity = DANGEROUS + disease_flags = CURABLE + spread_flags = NON_CONTAGIOUS + +/datum/disease/vampire/stage_act() + ..() + var/toxdamage = stage * 2 + var/stuntime = stage * 2 + + if(prob(10)) + affected_mob.emote(pick("cough","groan", "gasp")) + affected_mob.losebreath++ + + if(prob(15)) + if(prob(33)) + to_chat(affected_mob, "You feel sickly and weak.") + affected_mob.slowed += 3 + affected_mob.adjustToxLoss(toxdamage) + + if(prob(5)) + to_chat(affected_mob, "Your joints ache horribly!") + affected_mob.Weaken(stuntime) + affected_mob.Stun(stuntime) \ No newline at end of file diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index f6295599199..7b30a0bb9a6 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -54,8 +54,13 @@ var/list/uplink_items = list() var/list/excludefrom = list() //Empty list does nothing. Place the name of gamemode you don't want this item to be available in here. This is so you dont have to list EVERY mode to exclude something. var/list/job = null var/surplus = 100 //Chance of being included in the surplus crate (when pick() selects it) + var/hijack_only = 0 //can this item be purchased only during hijackings? /datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U) + if(hijack_only) + if(!(locate(/datum/objective/hijack) in usr.mind.objectives)) + to_chat(usr, "The Syndicate lacks resources to provide you with this item.") + return if(item) U.uses -= max(cost, 0) U.used_TC += cost @@ -89,15 +94,16 @@ var/list/uplink_items = list() var/obj/I = spawn_item(get_turf(user), U) - if(ishuman(user)) - var/mob/living/carbon/human/A = user - A.put_in_any_hand_if_possible(I) + if(I) + if(ishuman(user)) + var/mob/living/carbon/human/A = user + A.put_in_any_hand_if_possible(I) - if(istype(I,/obj/item/weapon/storage/box/) && I.contents.len>0) - for(var/atom/o in I) - U.purchase_log += "\icon[o]" - else - U.purchase_log += "\icon[I]" + if(istype(I,/obj/item/weapon/storage/box/) && I.contents.len>0) + for(var/atom/o in I) + U.purchase_log += "\icon[o]" + else + U.purchase_log += "\icon[I]" //U.interact(user) return 1 @@ -174,6 +180,16 @@ var/list/uplink_items = list() cost = 13 job = list("Chaplain") +/datum/uplink_item/jobspecific/artistic_toolbox + name = "Artistic Toolbox" + desc = "An accursed toolbox that grants its followers extreme power at the cost of requiring repeated sacrifices to it. If sacrifices are not provided, it will turn on its follower." + reference = "HGAT" + item = /obj/item/weapon/storage/toolbox/green/memetic + cost = 20 + job = list("Chaplain") + surplus = 0 //No lucky chances from the crate; if you get this, this is ALL you're getting + hijack_only = 1 //This is a murderbone weapon, as such, it should only be available in those scenarios. + //Janitor /datum/uplink_item/jobspecific/cautionsign @@ -235,6 +251,16 @@ var/list/uplink_items = list() cost = 5 job = list("Barber") +//Botanist + +/datum/uplink_item/jobspecific/bee_briefcase + name = "Briefcase Full of Bees" + desc = "A seemingly innocent briefcase full of not-so-innocent Syndicate-bred bees. Inject the case with blood to train the bees to ignore the donor(s). It also wirelessly taps into station intercomms to broadcast a message of TERROR." + reference = "BEE" + item = /obj/item/weapon/bee_briefcase + cost = 10 + job = list("Botanist") + //Engineer /datum/uplink_item/jobspecific/powergloves @@ -302,7 +328,7 @@ var/list/uplink_items = list() reference = "TPB" item = /obj/item/weapon/reagent_containers/glass/bottle/traitor cost = 2 - job = list("Scientist","Research Director","Chief Medical Officer","Medical Doctor","Psychiatrist","Chemist","Paramedic","Virologist","Bartender") + job = list("Research Director","Chief Medical Officer","Medical Doctor","Psychiatrist","Paramedic","Virologist","Bartender") // DANGEROUS WEAPONS diff --git a/code/defines/procs/AStar.dm b/code/defines/procs/AStar.dm index 1750814c228..1ec4f4eb7fc 100644 --- a/code/defines/procs/AStar.dm +++ b/code/defines/procs/AStar.dm @@ -157,7 +157,7 @@ Actual Adjacent procs : for(var/dir in cardinal) T = get_step(src,dir) - if(simulated_only && !istype(T)) + if(!T || (simulated_only && !istype(T))) continue if(!T.density && !LinkBlockedWithAccess(T,caller, ID)) L.Add(T) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 868d0e901a7..1706763b824 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -2327,6 +2327,7 @@ area/security/podbay /area/awaymission name = "\improper Strange Location" icon_state = "away" + report_alerts = 0 /area/awaymission/example name = "\improper Strange Station" diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 923e787c8af..18382562f6a 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -11,7 +11,6 @@ var/list/blob_nodes = list() config_tag = "blob" required_players = 30 - required_players_secret = 30 required_enemies = 1 recommended_enemies = 1 restricted_jobs = list("Cyborg", "AI") diff --git a/code/game/gamemodes/borer/borer.dm b/code/game/gamemodes/borer/borer.dm index f393db5811d..042e8eb67b2 100644 --- a/code/game/gamemodes/borer/borer.dm +++ b/code/game/gamemodes/borer/borer.dm @@ -6,8 +6,7 @@ /datum/game_mode/borer name = "corticalborers" config_tag = "borer" - required_players = 3 - required_players_secret = 10 + required_players = 10 restricted_jobs = list("AI", "Cyborg", "Mobile MMI") recommended_enemies = 2 // need at least a borer and a host votable = 0 // temporarily disable this mode for voting diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index edb40c4ca04..caead8e0a61 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -10,8 +10,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent") protected_species = list("Machine", "Slime People", "Plasmaman") - required_players = 2 - required_players_secret = 10 + required_players = 15 required_enemies = 1 recommended_enemies = 4 diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index b27494ebee6..5c4b2269c3a 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -4,7 +4,6 @@ traitors_possible = 3 //hard limit on traitors if scaling is turned off restricted_jobs = list("AI", "Cyborg") required_players = 10 - required_players_secret = 10 required_enemies = 1 // how many of each type are required recommended_enemies = 3 var/protected_species_changeling = list("Machine", "Slime People") diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index daf93b73799..07ead9ebd6d 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -30,8 +30,7 @@ config_tag = "cult" restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Security Officer", "Warden", "Detective", "Security Pod Pilot", "Head of Security", "Captain", "Head of Personnel", "Blueshield", "Nanotrasen Representative", "Magistrate", "Brig Physician") protected_jobs = list() - required_players = 5 - required_players_secret = 15 + required_players = 30 required_enemies = 3 recommended_enemies = 4 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 3cdb5b412f5..00ff9c707c6 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -25,9 +25,7 @@ var/list/protected_jobs = list() // Jobs that can't be traitors var/list/protected_species = list() // Species that can't be traitors var/required_players = 0 - var/required_players_secret = 0 //Minimum number of players for that game mode to be chose in Secret var/required_enemies = 0 - var/recommended_players = 0 var/recommended_enemies = 0 var/newscaster_announcements = null var/ert_disabled = 0 @@ -49,12 +47,8 @@ if((player.client)&&(player.ready)) playerC++ - if(master_mode=="secret") - if(playerC >= required_players_secret) - return 1 - else - if(playerC >= required_players) - return 1 + if(playerC >= required_players) + return 1 return 0 //pre_pre_setup() For when you really don't want certain jobs ingame. diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index 057c43345f8..28ebdeae677 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -12,8 +12,7 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' /datum/game_mode/heist name = "heist" config_tag = "heist" - required_players = 15 - required_players_secret = 25 + required_players = 25 required_enemies = 4 recommended_enemies = 5 votable = 0 diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 57893e3fab4..d5d3c3e87e1 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -4,8 +4,7 @@ /datum/game_mode/malfunction name = "AI malfunction" config_tag = "malfunction" - required_players = 2 - required_players_secret = 20 + required_players = 25 required_enemies = 1 recommended_enemies = 1 diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 10e3468f1c4..a8c8fec6f51 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -4,7 +4,6 @@ var/const/initialmeteordelay = 6000 var/wave = 1 required_players = 35 - required_players_secret = 35 uplink_welcome = "EVIL METEOR Uplink Console:" uplink_uses = 10 diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 70f5c14a9f0..f056bb4cb34 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -8,7 +8,6 @@ config_tag = "abduction" recommended_enemies = 2 required_players = 15 - required_players_secret = 15 var/max_teams = 4 abductor_teams = 1 var/list/datum/mind/scientists = list() @@ -112,6 +111,7 @@ H = agent.current L = agent_landmarks[team_number] H.forceMove(get_turf(L)) + H.body_accessory = null H.set_species("Abductor") H.mind.abductor.agent = 1 H.mind.abductor.team = team_number @@ -124,6 +124,7 @@ H = scientist.current L = scientist_landmarks[team_number] H.forceMove(get_turf(L)) + H.body_accessory = null H.set_species("Abductor") H.mind.abductor.scientist = 1 H.mind.abductor.team = team_number @@ -156,6 +157,7 @@ H = agent.current L = agent_landmarks[team_number] H.forceMove(get_turf(L)) + H.body_accessory = null H.set_species("Abductor") H.mind.abductor.agent = 1 H.mind.abductor.team = team_number @@ -169,6 +171,7 @@ H = scientist.current L = scientist_landmarks[team_number] H.forceMove(get_turf(L)) + H.body_accessory = null H.set_species("Abductor") H.mind.abductor.scientist = 1 H.mind.abductor.team = team_number diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index ccd498bb97f..315e48ba983 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -97,8 +97,7 @@ /mob/living/simple_animal/hostile/swarmer/emp_act() if(health > 1) - health = 1 - return + adjustHealth(health-1) else death() @@ -515,7 +514,7 @@ return to_chat(src, "Attempting to repair damage to our body, stand by...") if(do_mob(src, src, 100)) - adjustBruteLoss(-100) + adjustHealth(-100) to_chat(src, "We successfully repaired ourselves.") /mob/living/simple_animal/hostile/swarmer/proc/ToggleLight() diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 2108e1c3147..dbb56523e4e 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -86,7 +86,7 @@ hud_used.guardianhealthdisplay.maptext = "
[resulthealth]%
" -/mob/living/simple_animal/hostile/guardian/adjustBruteLoss(amount) //The spirit is invincible, but passes on damage to the summoner +/mob/living/simple_animal/hostile/guardian/adjustHealth(amount) //The spirit is invincible, but passes on damage to the summoner var/damage = amount * damage_transfer if (summoner) if(loc == summoner) diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index dbbf561b609..780abb8854f 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -162,7 +162,7 @@ if(L.stat == DEAD) if(do_after(src, 30, target = L)) if(eat(L)) - heal_overall_damage(50,50) + adjustHealth(-50) return else if(istype(target,/obj/item)) // Eat items just to be annoying var/obj/item/I = target diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 0e048b85df0..7fddc8c3c56 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -81,7 +81,7 @@ /mob/living/simple_animal/revenant/narsie_act() return //most humans will now be either bones or harvesters, but we're still un-alive. -/mob/living/simple_animal/revenant/adjustBruteLoss(amount) +/mob/living/simple_animal/revenant/adjustHealth(amount) if(!revealed) return essence = max(0, essence-amount) diff --git a/code/game/gamemodes/mutiny/mutiny.dm b/code/game/gamemodes/mutiny/mutiny.dm index e08a336997a..92b45e223a5 100644 --- a/code/game/gamemodes/mutiny/mutiny.dm +++ b/code/game/gamemodes/mutiny/mutiny.dm @@ -16,7 +16,7 @@ datum/game_mode/mutiny name = "mutiny" config_tag = "mutiny" - required_players = 7 + required_players = 20 ert_disabled = 1 uplink_welcome = "Mutineers Uplink Console:" diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm index 8cad280dff5..2a1faf35d0d 100644 --- a/code/game/gamemodes/nations/nations.dm +++ b/code/game/gamemodes/nations/nations.dm @@ -1,7 +1,7 @@ datum/game_mode/nations name = "nations" config_tag = "nations" - required_players_secret = 25 + required_players = 25 var/kickoff = 0 var/victory = 0 var/list/cargonians = list("Quartermaster","Cargo Technician","Shaft Miner") @@ -221,7 +221,7 @@ datum/game_mode/nations H.mind.nation.membership += H.mind.current to_chat(H, "You are now part of the great sovereign nation of [H.mind.nation.current_name]!") return 1 - + if(H.mind.assigned_role in civilian_positions) to_chat(H, "You do not belong to any nation and are free to sell your services to the highest bidder.") return 1 diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index f2d05507da1..e10dce617fa 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -7,8 +7,7 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/nuclear name = "nuclear emergency" config_tag = "nuclear" - required_players = 30 - required_players_secret = 30 // 30 players - 5 players to be the nuke ops = 25 players remaining + required_players = 30 // 30 players - 5 players to be the nuke ops = 25 players remaining required_enemies = 5 recommended_enemies = 5 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 1cb05d4ac0d..0acd5bb5336 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -15,7 +15,6 @@ config_tag = "revolution" restricted_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician") required_players = 20 - required_players_secret = 20 required_enemies = 1 recommended_enemies = 3 diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 5c6ca539f91..7c8100edbc5 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -69,7 +69,6 @@ Made by Xhuis name = "shadowling" config_tag = "shadowling" required_players = 30 - required_players_secret = 30 required_enemies = 2 recommended_enemies = 2 restricted_jobs = list("AI", "Cyborg") diff --git a/code/game/gamemodes/vampire/traitor_vamp.dm b/code/game/gamemodes/vampire/traitor_vamp.dm index e063fb43f0c..e94fbfeb199 100644 --- a/code/game/gamemodes/vampire/traitor_vamp.dm +++ b/code/game/gamemodes/vampire/traitor_vamp.dm @@ -4,7 +4,6 @@ traitors_possible = 3 //hard limit on traitors if scaling is turned off restricted_jobs = list("AI", "Cyborg") required_players = 10 - required_players_secret = 10 required_enemies = 1 // how many of each type are required recommended_enemies = 3 var/protected_species_vampire = list("Machine") diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index f10e5333a46..92f08ecc586 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -10,8 +10,7 @@ restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent") protected_species = list("Machine") - required_players = 2 - required_players_secret = 10 + required_players = 15 required_enemies = 1 recommended_enemies = 4 diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index a7e470ef056..bc7ba9276f5 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -192,8 +192,8 @@ /obj/effect/proc_holder/spell/vampire/targetted/disease name = "Diseased Touch (100)" - desc = "Touches your victim with infected blood giving them appendicitis, which will, left untreated, cause a slow death by poison." - gain_desc = "You have gained the Diseased Touch ability which causes those you touch to die unless treated medically." + desc = "Touches your victim with infected blood giving them Grave Fever, which will, left untreated, causes toxic building and frequent collapsing." + gain_desc = "You have gained the Diseased Touch ability which causes those you touch to become weak unless treated medically." action_icon_state = "vampire_disease" required_blood = 100 @@ -204,7 +204,7 @@ if(!affects(target)) to_chat(usr, "They seem to be unaffected.") continue - var/datum/disease/D = new /datum/disease/appendicitis //someone should probably make a better virus for this + var/datum/disease/D = new /datum/disease/vampire target.ForceContractDisease(D) /obj/effect/proc_holder/spell/vampire/mob_aoe/glare diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index cef7b507f82..32feaede2e1 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -1,8 +1,7 @@ /datum/game_mode/wizard/raginmages name = "ragin' mages" config_tag = "raginmages" - required_players = 1 - required_players_secret = 15 + required_players = 20 use_huds = 1 var/max_mages = 0 var/making_mage = 0 @@ -119,8 +118,6 @@ if(making_mage || shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) return 0 - if(mages_made >= max_mages) - return 0 making_mage = 1 var/list/candidates = list() var/mob/dead/observer/harry = null diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 1910e8ffa85..32d73ff33f7 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -4,8 +4,7 @@ /datum/game_mode/wizard name = "wizard" config_tag = "wizard" - required_players = 2 - required_players_secret = 10 + required_players = 20 required_enemies = 1 recommended_enemies = 1 diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm index 12dab66e569..37e9b39ce11 100644 --- a/code/game/gamemodes/xenos/xenos.dm +++ b/code/game/gamemodes/xenos/xenos.dm @@ -5,11 +5,8 @@ /datum/game_mode/xenos name = "xenos" config_tag = "xenos" - required_players = 0 - recommended_players = 30 - required_players_secret = 20 + required_players = 30 required_enemies = 3 - recommended_enemies = 3 var/result = 0 var/checkwin_counter = 0 var/xenos_list = list() @@ -27,7 +24,7 @@ var/list/candidates = get_players_for_role(ROLE_ALIEN) var/playersready = 0 - var/xenos_num + var/xenos_num = required_enemies for(var/mob/new_player/player in player_list) if((player.client)&&(player.ready)) playersready += 1 @@ -35,10 +32,6 @@ //Check that we have enough alien candidates if(candidates.len < required_enemies) return 0 - if (playersready < recommended_players) - xenos_num = required_enemies - if (playersready >= recommended_players) - xenos_num = recommended_enemies //Grab candidates randomly until we have enough. while(xenos_num > 0) diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index 29a0375b849..0df72eaf9d5 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -79,7 +79,7 @@ while(!accepted) if(!B) break // prevents possible runtime errors - new_book_style = input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon") + new_book_style = input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon", "Greentext") switch(new_book_style) if("Koran") B.icon_state = "koran" @@ -129,6 +129,9 @@ if("Necronomicon") B.icon_state = "necronomicon" B.item_state = "necronomicon" + if("Greentext") + B.icon_state = "greentext" + B.item_state = "greentext" else // if christian bible, revert to default B.icon_state = "bible" diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 8de2f1baf60..dedcd52164a 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -206,7 +206,8 @@ /obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/clothing/head/helmet/space, - /obj/item/weapon/storage/internal + /obj/item/weapon/storage/internal, + /obj/item/device/spacepod_key ) // These items will NOT be preserved var/list/do_not_preserve_items = list ( diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 2bcdfdd6894..f916998e26b 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -129,10 +129,6 @@ eprojectile = /obj/item/projectile/beam eshot_sound = 'sound/weapons/Laser.ogg' - if(/obj/item/weapon/gun/energy/stunrevolver) - eprojectile = /obj/item/projectile/beam - eshot_sound = 'sound/weapons/Laser.ogg' - if(/obj/item/weapon/gun/energy/gun) eprojectile = /obj/item/projectile/beam //If it has, going to kill mode eshot_sound = 'sound/weapons/Laser.ogg' diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 1933c022e16..6dd9954046b 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -123,7 +123,7 @@ power_station.teleporter_hub.calibrated = 0 set_target(usr) nanomanager.update_uis(src) - if(href_list["locked"]) + if(href_list["lock"]) power_station.engaged = 0 power_station.teleporter_hub.update_icon() power_station.teleporter_hub.calibrated = 0 diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 821d65d183d..29880e519ec 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -973,7 +973,7 @@ /obj/item/seeds/teaasperaseed = 3,/obj/item/seeds/tobaccoseed = 3,/obj/item/seeds/tomatoseed = 3, /obj/item/seeds/towermycelium = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/whitebeetseed = 3) contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/nettleseed = 2, - /obj/item/seeds/plumpmycelium = 2,/obj/item/seeds/random = 2, /obj/item/seeds/reishimycelium = 2) + /obj/item/seeds/plumpmycelium = 2,/obj/item/seeds/random = 2, /obj/item/seeds/reishimycelium = 2, /obj/item/seeds/brownmold = 2) premium = list(/obj/item/weapon/reagent_containers/spray/waterflower = 1) /** diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index 7a01a53a8b9..4eae22d7646 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -22,7 +22,7 @@ recharging_mecha = null return ..() -/turf/simulated/floor/mech_bay_recharge_floor/Entered(var/obj/mecha/mecha) +/turf/simulated/floor/mech_bay_recharge_floor/Entered(var/obj/mecha/mecha, atom/OL, ignoreRest = 0) . = ..() if(istype(mecha)) mecha.occupant_message("Initializing power control devices.") diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 562e30d834d..a88d1c49bad 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -9,9 +9,6 @@ idle_power_usage = 20 active_power_usage = 5000 var/time_coeff = 1 - var/resource_coeff = 1 - var/time_coeff_tech = 1 - var/resource_coeff_tech = 1 var/list/resources = list( MAT_METAL=0, MAT_GLASS=0, @@ -80,12 +77,6 @@ T += M.rating res_max_amount = (187000+(T * 37500)) - //ressources adjustment coefficient (1 -> 0.88 -> 0.75) - T = -1 - for(var/obj/item/weapon/stock_parts/micro_laser/Ma in component_parts) - T += Ma.rating - resource_coeff = round(initial(resource_coeff) - (initial(resource_coeff)*(T))/8,0.01) - //building time adjustment coefficient (1 -> 0.8 -> 0.6) T = -1 for(var/obj/item/weapon/stock_parts/manipulator/Ml in component_parts) @@ -230,29 +221,6 @@ output += "\[Process queue | Clear queue\]" return output -/obj/machinery/mecha_part_fabricator/proc/update_tech() - if(!files) - return - var/output - for(var/datum/tech/T in files.known_tech) - if(T && T.level > 1) - var/diff - switch(T.id) - if("materials") - //one materials level is 1/32, so that max level is 0.75 coefficient - diff = round(initial(resource_coeff_tech) - (initial(resource_coeff_tech)*(T.level-1))/32,0.01) - if(resource_coeff_tech>diff) - resource_coeff_tech = diff - output+="Production efficiency increased.
" - if("programming") - //one materials level is 1/40, so that max level is 0.8 coefficient - diff = round(initial(time_coeff_tech) - (initial(time_coeff_tech)*(T.level-1))/40,0.1) - if(time_coeff_tech>diff) - time_coeff_tech = diff - output+="Production routines updated.
" - return output - - /obj/machinery/mecha_part_fabricator/proc/sync() temp = "Updating local R&D database..." updateUsrDialog() @@ -269,7 +237,6 @@ files.RefreshResearch() temp = "Processed equipment designs.
" //check if the tech coefficients have changed - temp += update_tech() temp += "Return" updateUsrDialog() @@ -281,10 +248,10 @@ return /obj/machinery/mecha_part_fabricator/proc/get_resource_cost_w_coeff(datum/design/D, resource, roundto = 1) - return round(D.materials[resource]*resource_coeff*resource_coeff_tech, roundto) + return round(D.materials[resource], roundto) /obj/machinery/mecha_part_fabricator/proc/get_construction_time_w_coeff(datum/design/D, roundto = 1) //aran - return round(initial(D.construction_time)*time_coeff*time_coeff_tech, roundto) + return round(initial(D.construction_time)*time_coeff, roundto) /obj/machinery/mecha_part_fabricator/attack_ghost(mob/user) interact(user) diff --git a/code/game/objects/effects/datacore-effect.dm b/code/game/objects/effects/datacore-effect.dm index a5e687956f8..5c2fe3f5167 100644 --- a/code/game/objects/effects/datacore-effect.dm +++ b/code/game/objects/effects/datacore-effect.dm @@ -141,7 +141,6 @@ using /obj/effect/datacore/proc/manifest_inject( ), or manifest_insert( ) */ var/global/list/PDA_Manifest = list() -var/global/ManifestJSON /obj/effect/datacore/proc/get_manifest_json() if(PDA_Manifest.len) @@ -224,6 +223,5 @@ var/global/ManifestJSON "bot" = bot,\ "misc" = misc\ ) - ManifestJSON = json_encode(PDA_Manifest) return diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index c03652a1126..bdec24c7902 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -89,7 +89,7 @@ var/turf/T = A if(!T) continue - var/dist = cheap_hypotenuse(T.x, T.y, x0, y0) + var/dist = hypotenuse(T.x, T.y, x0, y0) if(config.reactionary_explosions) var/turf/Trajectory = T @@ -206,7 +206,7 @@ var/list/wipe_colours = list() for(var/turf/T in spiral_range_turfs(max_range, epicenter)) wipe_colours += T - var/dist = cheap_hypotenuse(T.x, T.y, x0, y0) + var/dist = hypotenuse(T.x, T.y, x0, y0) if(newmode == "Yes") var/turf/TT = T diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 6dd269176b3..70ede0a075d 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -41,7 +41,7 @@ if(href_list["create_area"]) if(get_area_type()==AREA_SPACE) create_area() - updateUsrDialog() + //One-use area creation permits. @@ -77,6 +77,12 @@ icon_state = "blueprints" fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage." w_class = 3 + var/list/showing = list() + var/client/viewing + +/obj/item/areaeditor/blueprints/Destroy() + clear_viewer() + return ..() /obj/item/areaeditor/blueprints/attack_self(mob/user as mob) @@ -85,6 +91,11 @@ if(get_area_type() == AREA_STATION) . += "

According to the [src], you are now in \"[sanitize(A.name)]\".

" . += "

You may move an amendment to the drawing.

" + if(!viewing) + . += "

View structural data

" + else + . += "

Refresh structural data

" + . += "

Hide structural data

" var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500) popup.set_content(.) popup.open() @@ -97,8 +108,43 @@ if(get_area_type()!=AREA_STATION) return edit_area() - updateUsrDialog() + if(href_list["view_blueprints"]) + set_viewer(usr, "You flip the blueprints over to view the complex information diagram.") + if(href_list["hide_blueprints"]) + clear_viewer(usr, "You flip the blueprints over to view the simple information diagram.") + if(href_list["refresh"]) + clear_viewer(usr) + set_viewer(usr) + attack_self(usr) +/obj/item/areaeditor/blueprints/proc/get_images(turf/T, viewsize) + . = list() + for(var/tt in RANGE_TURFS(viewsize, T)) + var/turf/TT = tt + if(TT.blueprint_data) + . += TT.blueprint_data + +/obj/item/areaeditor/blueprints/proc/set_viewer(mob/user, message = "") + if(user && user.client) + if(viewing) + clear_viewer() + viewing = user.client + showing = get_images(get_turf(user), viewing.view) + viewing.images |= showing + if(message) + to_chat(user, message) + +/obj/item/areaeditor/blueprints/proc/clear_viewer(mob/user, message = "") + if(viewing) + viewing.images -= showing + viewing = null + showing.Cut() + if(message) + to_chat(user, message) + +/obj/item/areaeditor/blueprints/dropped(mob/user) + ..() + clear_viewer() /obj/item/areaeditor/proc/get_area() var/turf/T = get_turf(usr) diff --git a/code/game/objects/items/contraband.dm b/code/game/objects/items/contraband.dm index 22eb55e150e..8bc5b265466 100644 --- a/code/game/objects/items/contraband.dm +++ b/code/game/objects/items/contraband.dm @@ -29,35 +29,35 @@ new /obj/item/weapon/reagent_containers/food/pill/zoom( src ) new /obj/item/weapon/reagent_containers/food/pill/zoom( src ) - /obj/item/weapon/reagent_containers/food/pill/random_drugs name = "pill" - desc = "" + desc = "A cocktail of illicit designer drugs, who knows what might be in here." /obj/item/weapon/reagent_containers/food/pill/random_drugs/New() ..() icon_state = "pill" + pick("2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20") - name = pick("lunar","vorpal","hardcore","willow", "void","loopy","electro", "cyber","heavy", "ninja", "hydro", "blue", "red", "green", "purple", "strong", "divine","carp" ,"deadly","dead","vicious" ,"wild" ,"demon", "chill", "solid", "liquid", "crazy", "super", "hyper", "space", "wizard", "rainbow", "star", "turbo", "prism", "sticky") + " " + pick("jack","zero","null","beat","nip","bubbles" ,"ice","medicine","venom","shock","solar" ,"spice" ,"shredder", "heart" , "heat", "pill","hopper","scum","fruit", "bolt", "deck", "butter", "runoff", "grease", "flair", "sweat", "zone", "blast") + name = "[pick_list("chemistry_tools.json", "CYBERPUNK_drug_prefixes")] [pick_list("chemistry_tools.json", "CYBERPUNK_drug_suffixes")]" - reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" , "hydrocodone", "psilocybin", "lsd", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15)) - reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" ,"hydrocodone", "psilocybin", "lsd", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15)) - reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" , "hydrocodone", "psilocybin", "lsd", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15)) + var/primaries = rand(1,3) + var/adulterants = rand(2,4) + + while(primaries > 0) + primaries-- + reagents.add_reagent(pick_list("chemistry_tools.json", "CYBERPUNK_drug_primaries"), 6) + while(adulterants > 0) + adulterants-- + reagents.add_reagent(pick_list("chemistry_tools.json", "CYBERPUNK_drug_adulterants"), 3) /obj/item/weapon/storage/pill_bottle/random_drug_bottle - name = "odd pill bottle" - desc = "You're not sure if you trust the contents of this bottle..." + name = "pill bottle (???)" + desc = "Huh." /obj/item/weapon/storage/pill_bottle/random_drug_bottle/New() ..() - new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src ) - new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src ) - new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src ) - new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src ) - new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src ) - new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src ) - new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src ) + for(var/i in 1 to 5) + new /obj/item/weapon/reagent_containers/food/pill/random_drugs(src) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 92613e6af3e..4ee15232aa7 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -145,7 +145,7 @@ ..() -/obj/item/device/flash/proc/terrible_conversion_proc(var/mob/M, var/mob/user) +/obj/item/device/flash/proc/terrible_conversion_proc(mob/M, mob/user) if(ishuman(M) && ishuman(user) && M.stat != DEAD) if(user.mind && (user.mind in ticker.mode.head_revolutionaries)) if(M.client) @@ -154,7 +154,9 @@ var/resisted if(!isloyal(M)) if(user.mind in ticker.mode.head_revolutionaries) - if(!ticker.mode.add_revolutionary(M.mind)) + if(ticker.mode.add_revolutionary(M.mind)) + times_used -- //Flashes less likely to burn out for headrevs when used for conversion + else resisted = 1 else resisted = 1 diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index fba22decc42..f1eb48e06d7 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -56,6 +56,7 @@ dir=ndir b_stat=1 on = 0 + global_intercoms.Add(src) update_icon() /obj/item/device/radio/intercom/department/medbay/New() @@ -104,6 +105,7 @@ /obj/item/device/radio/intercom/Destroy() processing_objects.Remove(src) + global_intercoms.Remove(src) return ..() /obj/item/device/radio/intercom/attack_ai(mob/user as mob) diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm index 12594ff0310..97b2dfd6cfc 100644 --- a/code/game/objects/items/flag.dm +++ b/code/game/objects/items/flag.dm @@ -161,6 +161,11 @@ desc = "A flag proudly proclaiming the superior heritage of Vulpkanin." icon_state = "vulpflag" +/obj/item/flag/species/drask + name = "Drask flag" + desc = "A flag proudly proclaiming the superior heritage of Drask." + icon_state = "draskflag" + //Department Flags /obj/item/flag/cargo diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 6a863bcc60f..25ade73eb38 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -949,6 +949,9 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/plushie/attack(mob/M as mob, mob/user as mob) playsound(loc, poof_sound, 20, 1) // Play the whoosh sound in local area + if(iscarbon(M)) + if(prob(10)) + M.reagents.add_reagent("hugs", 10) return ..() /obj/item/toy/plushie/attack_self(mob/user as mob) diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index e573215dcaa..159b4014bf4 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -7,62 +7,85 @@ w_class = 1.0 desc = "This is rubbish." - raisins +/obj/item/trash/raisins name = "4no raisins" icon_state= "4no_raisins" - candy + +/obj/item/trash/candy name = "Candy" icon_state= "candy" - cheesie + +/obj/item/trash/cheesie name = "Cheesie honkers" icon_state = "cheesie_honkers" - chips + +/obj/item/trash/chips name = "Chips" icon_state = "chips" - popcorn + +/obj/item/trash/popcorn name = "Popcorn" icon_state = "popcorn" - sosjerky + +/obj/item/trash/sosjerky name = "Scaredy's Private Reserve Beef Jerky" icon_state = "sosjerky" - syndi_cakes + +/obj/item/trash/syndi_cakes name = "Syndi cakes" icon_state = "syndi_cakes" - waffles + +/obj/item/trash/waffles name = "Waffles" icon_state = "waffles" - plate + +/obj/item/trash/plate name = "Plate" icon_state = "plate" - snack_bowl + +/obj/item/trash/snack_bowl name = "Snack bowl" icon_state = "snack_bowl" - pistachios + +/obj/item/trash/pistachios name = "Pistachios pack" icon_state = "pistachios_pack" - semki + +/obj/item/trash/semki name = "Semki pack" icon_state = "semki_pack" - tray + +/obj/item/trash/tray name = "Tray" icon_state = "tray" - candle + +/obj/item/trash/candle name = "candle" icon = 'icons/obj/candle.dmi' icon_state = "candle4" - liquidfood + +/obj/item/trash/liquidfood name = "\improper \"LiquidFood\" ration" icon_state = "liquidfood" - can + +/obj/item/trash/can name = "crushed can" icon_state = "cola" - gum + +/obj/item/trash/gum name = "chewed gum" desc = "NOT free candy." icon_state = "gum" - tastybread + +/obj/item/trash/tastybread name = "bread tube" icon_state = "tastybread" +/obj/item/trash/tapetrash + name = "old duct tape" + icon_state = "tape" + desc = "Not sticky anymore." + throw_range = 1 + /obj/item/trash/attack(mob/M as mob, mob/living/user as mob) return diff --git a/code/game/objects/items/weapons/bee_briefcase.dm b/code/game/objects/items/weapons/bee_briefcase.dm new file mode 100644 index 00000000000..5c3e9afff5d --- /dev/null +++ b/code/game/objects/items/weapons/bee_briefcase.dm @@ -0,0 +1,79 @@ + +/obj/item/weapon/bee_briefcase + name = "briefcase" + desc = "This briefcase has easy-release clasps and smells vaguely of honey and blood..." + icon = 'icons/obj/storage.dmi' + icon_state = "briefcase" + item_state = "briefcase" + flags = CONDUCT + hitsound = "swing_hit" + force = 10 + throw_speed = 2 + throw_range = 4 + w_class = 4 + attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") + var/bees_left = 10 + var/list/blood_list = list() + var/sound_file = 'sound/misc/briefcase_bees.ogg' + var/next_sound = 0 + +/obj/item/weapon/bee_briefcase/examine(mob/user) + ..() + if(loc == user) + if(bees_left) + to_chat(user, "There are [bees_left] bees still inside in briefcase!") + else + to_chat(user, "The bees are gone... Colony collapse disorder?") + +/obj/item/weapon/bee_briefcase/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/reagent_containers/syringe)) + + var/obj/item/weapon/reagent_containers/syringe/S = I + if(!bees_left) + to_chat(user, "The briefcase is empty, so there is no point in injecting something into it.") + return + if(S.reagents && S.reagents.total_volume) + to_chat(user, "You inject [src] with [S].") + for(var/datum/reagent/A in S.reagents.reagent_list) + if(A.id == "blood") + if(!(A.data["donor"] in blood_list)) + blood_list += A.data["donor"] + if(A.id == "strange_reagent") //RELOAD THE BEES (1 bee per 1 unit, max 15 bees) + if(bees_left < 15) + bees_left = min(15, round((bees_left + A.volume), 1)) //No partial bees, max 15 bees in case at any given time + to_chat(user, "The buzzing inside the briefcase intensifies as new bees form inside.") + else + to_chat(user, "The buzzing inside the briefcase swells momentarily, then returns to normal. Guess it was too cramped...") + S.reagents.clear_reagents() + S.update_icon() + + else if(istype(I, /obj/item/weapon/plantspray)) + var/obj/item/weapon/plantspray/PS = I + user.drop_item(PS) + bees_left = max(0, (bees_left - PS.pest_kill_str)) + to_chat(user, "You spray [PS] into \the [src].") + playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) + qdel(PS) + +/obj/item/weapon/bee_briefcase/attack_self(mob/user as mob) + if(!bees_left) + to_chat(user, "The lack of all and any bees at this event has been somewhat of a let-down...") + return + else + if(world.time >= next_sound) //This cooldown doesn't prevent us from releasing bees, just stops the sound + next_sound = world.time + 90 + //Play sound through the station intercomms, so everyone knows the doom you have wrought. + for(var/O in global_intercoms) + var/obj/item/device/radio/intercom/I = O + if(I.z != ZLEVEL_STATION) //Only broadcast to the station intercoms + continue + if(!I.on) //Only broadcast to active intercoms (powered, switched on) + continue + playsound(I, sound_file, 35) + + //Release up to 5 bees per use. Without using strange reagent, that means two uses. WITH strange reagent, you can get more if you don't release the last bee + for(var/bee = min(5, bees_left), bee > 0, bee--) + var/mob/living/simple_animal/hostile/poison/bees/syndi/B = new /mob/living/simple_animal/hostile/poison/bees/syndi(null) + B.master_and_friends = blood_list //Doesn't automatically add the person who opens the case, so the bees will attack the user unless they gave their blood + B.forceMove(get_turf(user)) //RELEASE THE BEES! + bees_left -= 5 \ No newline at end of file diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 2038c4851aa..b3d8a7a19e2 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -39,6 +39,12 @@ //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn if(user.client && (target in user.client.screen)) to_chat(user, "You need to take that [target.name] off before cleaning it.") + else if(target == user && user.a_intent == I_GRAB && ishuman(target)) + var/mob/living/carbon/human/muncher = user + if(muncher && muncher.get_species() == "Drask") + to_chat(user, "You take a bite of the [src.name]. Delicious!") + playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0) + user.nutrition += 2 else if(istype(target,/obj/effect/decal/cleanable)) user.visible_message("[user] begins to scrub \the [target.name] out with [src].") if(do_after(user, src.cleanspeed, target = target) && target) diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm index a5e0081e723..806c6a5b0e5 100644 --- a/code/game/objects/items/weapons/scissors.dm +++ b/code/game/objects/items/weapons/scissors.dm @@ -110,11 +110,7 @@ if(!is_cutting) is_cutting = 1 user.visible_message("[user] starts cutting [M]'s hair!", "You start cutting [M]'s hair!") - playsound(loc, "sound/items/Wirecutter.ogg", 50, 1, -1) - spawn(5) - playsound(loc, "sound/items/Wirecutter.ogg", 50, 1, -1) - spawn(10) - playsound(loc, "sound/items/Wirecutter.ogg", 50, 1, -1) + playsound(loc, "sound/goonstation/misc/Scissor.ogg", 100, 1) if(do_after(user, 50, target = H)) playsound(loc, "sound/weapons/bladeslice.ogg", 50, 1, -1) user.visible_message("[user] abruptly stops cutting [M]'s hair and slices their throat!", "You stop cutting [M]'s hair and slice their throat!") //Just a little off the top. diff --git a/code/game/objects/items/weapons/storage/artistic_toolbox.dm b/code/game/objects/items/weapons/storage/artistic_toolbox.dm new file mode 100644 index 00000000000..1b9be2bec62 --- /dev/null +++ b/code/game/objects/items/weapons/storage/artistic_toolbox.dm @@ -0,0 +1,183 @@ +/obj/item/weapon/storage/toolbox/green + name = "artistic toolbox" + desc = "A metal container designed to hold various tools. This variety holds art supplies." + icon_state = "green" + item_state = "toolbox_green" + icon = 'icons/goonstation/objects/objects.dmi' + lefthand_file = 'icons/goonstation/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/goonstation/mob/inhands/items_righthand.dmi' + +/obj/item/weapon/storage/toolbox/green/memetic + name = "artistic toolbox" + desc = "His Grace." + force = 5 + throwforce = 10 + var/list/servantlinks = list() + var/hunger = 0 + var/hunger_message_level = 0 + var/original_owner = null + var/activated = 0 + var/mindless_override = 0 + +/obj/item/weapon/storage/toolbox/green/memetic/attack_hand(mob/living/carbon/user) + if(!activated) + if(ishuman(user) && !user.HasDisease(new /datum/disease/memetic_madness(0))) + activated = 1 + user.ForceContractDisease(new /datum/disease/memetic_madness(0)) + for(var/datum/disease/memetic_madness/DD in user.viruses) + DD.progenitor = src + servantlinks.Add(DD) + break + force += 4 + throwforce += 4 + user << 'sound/goonstation/effects/screech.ogg' + shake_camera(user, 20, 1) + to_chat(user, "His Grace accepts thee, spread His will! All who look close to the Enlightened may share His gifts.") + original_owner = user + return + ..() + +/obj/item/weapon/storage/toolbox/green/memetic/attackby(obj/item/I, mob/user) + if(activated) + if(istype(I, /obj/item/weapon/grab/)) + var/obj/item/weapon/grab/G = I + if(!G.affecting) + return + if(!user.HasDisease(new /datum/disease/memetic_madness(0))) + to_chat(user, "You can't seem to find the latch to open this.") + return + if(!ishuman(G.affecting) || issmall(G.affecting)) + to_chat(user, "His Grace will not accept such a meager offering!") + return + if(!mindless_override) + if(G.affecting.mind == null && G.affecting.ckey == null) + to_chat(user, "His Grace will not accept a soulless shell for an offering!") + return + if(!G.affecting.stat && !G.affecting.restrained() && !G.affecting.weakened) + to_chat(user, "They're moving too much to feed to His Grace!") + return + user.visible_message("[user] is trying to feed [G.affecting] to [src]!") + if(!do_mob(user, G.affecting, 30)) + return + G.affecting.forceMove(src) + user.visible_message("[user] has fed [G.affecting] to [src]!") + + consume(G.affecting) + qdel(G) + + to_chat(user, "You have done well...") + force += 5 + throwforce += 5 + return + + ..() + +/obj/item/weapon/storage/toolbox/green/memetic/proc/consume(mob/M) + if (!M) + return + hunger = 0 + hunger_message_level = 0 + playsound(src.loc, 'sound/goonstation/misc/burp_alien.ogg', 50, 0) + M.emote("scream") + M.death() + M.ghostize() + if(M == original_owner) + qdel(M) + var/obj/item/weapon/storage/toolbox/green/fake_toolbox = new(get_turf(src)) + fake_toolbox.desc = "It looks a lot duller than it used to." + qdel(src) + +/obj/item/weapon/storage/toolbox/green/memetic/Destroy() + for(var/mob/living/carbon/human/H in src) + H.forceMove(get_turf(src)) + visible_message("[H] bursts out of [src]!") + + for(var/A in servantlinks) + var/datum/disease/memetic_madness/D = A + if(D) + D.cure() + break + + if(servantlinks) + servantlinks.Cut() + servantlinks = null + original_owner = null + visible_message("[src] screams!") + playsound(src.loc, 'sound/goonstation/effects/screech.ogg', 100, 1) + return ..() + +/datum/disease/memetic_madness + name = "Memetic Kill Agent" + max_stages = 4 + stage_prob = 8 + spread_text = "Non-Contagious" + spread_flags = SPECIAL + cure_text = "Unknown" + viable_mobtypes = list(/mob/living/carbon/human) + severity = BIOHAZARD + disease_flags = CURABLE + spread_flags = NON_CONTAGIOUS + var/obj/item/weapon/storage/toolbox/green/memetic/progenitor = null + +/datum/disease/memetic_madness/Destroy() + progenitor = null + if(affected_mob) + affected_mob.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE + return ..() + +/datum/disease/memetic_madness/stage_act() + ..() + if(!progenitor) //if someone admin spawns this, cure it right away; this should only ever be given directly from the toolbox itself. + cure() + return + if(progenitor in affected_mob.contents) + affected_mob.adjustOxyLoss(-5) + affected_mob.adjustBruteLoss(-12) + affected_mob.adjustFireLoss(-12) + affected_mob.adjustToxLoss(-5) + var/status = CANSTUN | CANWEAKEN | CANPARALYSE + affected_mob.status_flags &= ~status + affected_mob.dizziness = max(0, affected_mob.dizziness-10) + affected_mob.drowsyness = max(0, affected_mob.drowsyness-10) + affected_mob.SetSleeping(0) + stage = 1 + switch(progenitor.hunger) + if(10 to 60) + if(progenitor.hunger_message_level < 1) + progenitor.hunger_message_level = 1 + to_chat(affected_mob, "Feed Me the unclean ones...They will be purified...") + if(61 to 120) + if(progenitor.hunger_message_level < 2) + progenitor.hunger_message_level = 2 + to_chat(affected_mob, "I hunger for the flesh of the impure...") + if(121 to 210) + if(prob(10) && progenitor.hunger_message_level < 3) + progenitor.hunger_message_level = 3 + to_chat(affected_mob, "The hunger of your Master grows with every passing moment. Feed Me at once.") + if(211 to 399) + if(progenitor.hunger_message_level < 4) + progenitor.hunger_message_level = 4 + to_chat(affected_mob, "His Grace starves in your hands. Feed Me the unclean or suffer.") + if(400 to INFINITY) + affected_mob.visible_message("[progenitor] consumes [affected_mob] whole!") + progenitor.consume(affected_mob) + return + + progenitor.hunger += min(max((progenitor.force / 10), 1), 10) + + else + affected_mob.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE + + if(stage == 4) + if(get_dist(get_turf(progenitor), get_turf(affected_mob)) <= 7) + stage = 1 + return + if(prob(4)) + to_chat(affected_mob, "You are too far from His Grace...") + affected_mob.adjustToxLoss(5) + else if(prob(6)) + to_chat(affected_mob, "You feel weak.") + affected_mob.adjustBruteLoss(5) + + if(ismob(progenitor.loc)) + progenitor.hunger++ \ No newline at end of file diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index a6c7841e020..067bacaef4b 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -12,6 +12,35 @@ update_icon() +/obj/item/stack/tape_roll/attack(mob/living/carbon/human/M as mob, mob/living/user as mob) + if(M.wear_mask) + to_chat(user, "Remove their mask first!") + else if(amount < 2) + to_chat(user, "You'll need more tape for this!") + else if(!M.check_has_mouth()) + to_chat(user, "They have no mouth to tape over!") + else + if(M == user) + to_chat(user, "You try to tape your own mouth shut.") + else + to_chat(user, "You try to tape [M]'s mouth shut.") + M.visible_message("[user] tries to tape [M]'s mouth closed!") + if(do_after(user, 50, target = M)) + if(M == user) + to_chat(user, "You cover your own mouth with a piece of duct tape.") + else + to_chat(user, "You cover [M]'s mouth with a piece of duct tape. That will shut them up!") + M.visible_message("[user] tapes [M]'s mouth shut!") + var/obj/item/clothing/mask/muzzle/G = new /obj/item/clothing/mask/muzzle/tapegag + M.equip_to_slot(G, slot_wear_mask) + G.add_fingerprint(user) + amount = amount - 2 + if(amount <= 0) + user.unEquip(src, 1) + qdel(src) + + + /* -- Disabled for now until it has a use -- /obj/item/stack/tape_roll/attack_self(mob/user as mob) to_chat(user, "You remove a length of tape from [src].") @@ -110,4 +139,4 @@ if(dir_offset & NORTH) pixel_y += 32 else if(dir_offset & SOUTH) - pixel_y -= 32 \ No newline at end of file + pixel_y -= 32 diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 9f6688b69f6..a8579613604 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -23,6 +23,19 @@ // Reagent ID => friendly name var/list/reagents_to_log=list() + var/on_blueprints = FALSE //Are we visible on the station blueprints at roundstart? + var/force_blueprints = FALSE //forces the obj to be on the blueprints, regardless of when it was created. + +/obj/New() + . = ..() + + if(on_blueprints && isturf(loc)) + var/turf/T = loc + if(force_blueprints) + T.add_blueprints(src) + else + T.add_blueprints_preround(src) + /obj/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state = default_state) // Calling Topic without a corresponding window open causes runtime errors if(!nowindow && ..()) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 58f6e4a41d9..efe3bdb6e55 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -67,7 +67,7 @@ else to_chat(user, "The plating is going to need some support! Place metal rods first.") -/turf/space/Entered(atom/movable/A as mob|obj) +/turf/space/Entered(atom/movable/A as mob|obj, atom/OL, ignoreRest = 0) ..() if(destination_z && A && (src in A.locs)) diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index 73398077df2..1b7c9343ca2 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -85,7 +85,7 @@ /turf/space/transit/horizontal dir = WEST -/turf/space/transit/Entered(atom/movable/AM, atom/OldLoc) +/turf/space/transit/Entered(atom/movable/AM, atom/OldLoc, ignoreRest = 0) if(!AM) return if(istype(AM, /obj/docking_port) || !AM.simulated) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 7c0035cc445..8541a638040 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -29,6 +29,8 @@ var/image/obscured //camerachunks + var/list/blueprint_data //for the station blueprints, images of objects eg: pipes + var/list/footstep_sounds = list() var/shoe_running_volume = 50 var/shoe_walking_volume = 20 @@ -119,7 +121,7 @@ return 1 //Nothing found to block so return success! -/turf/Entered(atom/movable/M) +/turf/Entered(atom/movable/M, atom/OL, ignoreRest = 0) if(ismob(M)) var/mob/O = M if(!O.lastarea) @@ -161,6 +163,7 @@ var/old_dynamic_lighting = dynamic_lighting var/list/old_affecting_lights = affecting_lights var/old_lighting_overlay = lighting_overlay + var/old_blueprint_data = blueprint_data if(air_master) air_master.remove_from_active(src) @@ -170,6 +173,7 @@ if(istype(W, /turf/simulated)) W:Assimilate_Air() W.RemoveLattice() + W.blueprint_data = old_blueprint_data for(var/turf/space/S in range(W,1)) S.update_starlight() @@ -384,4 +388,20 @@ return 1 /turf/proc/can_lay_cable() - return can_have_cabling() & !intact \ No newline at end of file + return can_have_cabling() & !intact + +/turf/proc/add_blueprints(atom/movable/AM) + var/image/I = new + I.appearance = AM.appearance + I.appearance_flags = RESET_COLOR|RESET_ALPHA|RESET_TRANSFORM + I.loc = src + I.dir = AM.dir + I.alpha = 128 + + if(!blueprint_data) + blueprint_data = list() + blueprint_data += I + +/turf/proc/add_blueprints_preround(atom/movable/AM) + if(!ticker || ticker.current_state != GAME_STATE_PLAYING) + add_blueprints(AM) \ No newline at end of file diff --git a/code/game/vehicles/spacepods/equipment.dm b/code/game/vehicles/spacepods/equipment.dm index 734216657ce..91588fa0a8b 100644 --- a/code/game/vehicles/spacepods/equipment.dm +++ b/code/game/vehicles/spacepods/equipment.dm @@ -49,6 +49,7 @@ var/obj/item/device/spacepod_equipment/weaponry/weapon_system // weapons system var/obj/item/device/spacepod_equipment/misc/misc_system // misc system var/obj/item/device/spacepod_equipment/cargo/cargo_system // cargo system + var/obj/item/device/spacepod_equipment/lock/lock_system // lock system //var/obj/item/device/spacepod_equipment/engine/engine_system // engine system //var/obj/item/device/spacepod_equipment/shield/shield_system // shielding system @@ -69,7 +70,7 @@ /obj/item/device/spacepod_equipment/weaponry name = "pod weapon" desc = "You shouldn't be seeing this" - icon = 'icons/goonstation/pods/ship.dmi' + icon = 'icons/vehicles/spacepod.dmi' icon_state = "blank" var/projectile_type var/shot_cost = 0 @@ -80,7 +81,7 @@ /obj/item/device/spacepod_equipment/weaponry/taser name = "disabler system" desc = "A weak taser system for space pods, fires disabler beams." - icon_state = "pod_taser" + icon_state = "weapon_taser" projectile_type = "/obj/item/projectile/beam/disabler" shot_cost = 400 fire_sound = "sound/weapons/Taser.ogg" @@ -88,7 +89,7 @@ /obj/item/device/spacepod_equipment/weaponry/burst_taser name = "burst taser system" desc = "A weak taser system for space pods, this one fires 3 at a time." - icon_state = "pod_b_taser" + icon_state = "weapon_burst_taser" projectile_type = "/obj/item/projectile/beam/disabler" shot_cost = 1200 shots_per = 3 @@ -98,7 +99,7 @@ /obj/item/device/spacepod_equipment/weaponry/laser name = "laser system" desc = "A weak laser system for space pods, fires concentrated bursts of energy" - icon_state = "pod_w_laser" + icon_state = "weapon_laser" projectile_type = "/obj/item/projectile/beam" shot_cost = 600 fire_sound = 'sound/weapons/Laser.ogg' @@ -107,6 +108,7 @@ /obj/item/device/spacepod_equipment/weaponry/mining_laser_basic name = "weak mining laser system" desc = "A weak mining laser system for space pods, fires bursts of energy that cut through rock" + icon = 'icons/goonstation/pods/ship.dmi' icon_state = "pod_taser" projectile_type = "/obj/item/projectile/kinetic" shot_cost = 300 @@ -116,6 +118,7 @@ /obj/item/device/spacepod_equipment/weaponry/mining_laser name = "mining laser system" desc = "A mining laser system for space pods, fires bursts of energy that cut through rock" + icon = 'icons/goonstation/pods/ship.dmi' icon_state = "pod_m_laser" projectile_type = "/obj/item/projectile/kinetic/super" shot_cost = 250 @@ -125,6 +128,7 @@ /obj/item/device/spacepod_equipment/weaponry/mining_laser_hyper name = "enhanced mining laser system" desc = "An enhanced mining laser system for space pods, fires bursts of energy that cut through rock" + icon = 'icons/goonstation/pods/ship.dmi' icon_state = "pod_w_laser" projectile_type = "/obj/item/projectile/kinetic/hyper" shot_cost = 200 @@ -159,7 +163,7 @@ /obj/item/device/spacepod_equipment/cargo name = "pod cargo" desc = "You shouldn't be seeing this" - icon = 'icons/goonstation/pods/ship.dmi' + icon = 'icons/vehicles/spacepod.dmi' icon_state = "blank" /obj/item/device/spacepod_equipment/cargo/proc/passover(var/obj/item/I) @@ -171,7 +175,7 @@ /obj/item/device/spacepod_equipment/cargo/ore name = "\improper spacepod ore storage system" desc = "An ore storage system for spacepods. Scoops up any ore you drive over." - icon_state = "pod_locator" + icon_state = "cargo_ore" var/obj/structure/ore_box/box /obj/item/device/spacepod_equipment/cargo/ore/passover(var/obj/item/I) @@ -186,3 +190,43 @@ /obj/item/device/spacepod_equipment/cargo/ore/removed(var/mob/user) . = ..() unload() + +/obj/item/device/spacepod_equipment/lock + name = "pod lock" + desc = "You shouldn't be seeing this" + icon = 'icons/vehicles/spacepod.dmi' + icon_state = "blank" + var/mode = 0 + var/id = null + +// Key and Tumbler System +/obj/item/device/spacepod_equipment/lock/keyed + name = "spacepod tumbler lock" + desc = "A locking system to stop podjacking. This version uses a standalone key." + icon_state = "lock_tumbler" + var/static/id_source = 0 + +/obj/item/device/spacepod_equipment/lock/keyed/New() + ..() + id = ++id_source + +// The key +/obj/item/device/spacepod_key + name = "spacepod key" + desc = "A key for a spacepod lock." + icon = 'icons/vehicles/spacepod.dmi' + icon_state = "podkey" + w_class = 1.0 + var/id = 0 + +// Key - Lock Interactions +/obj/item/device/spacepod_equipment/lock/keyed/attackby(obj/item/I as obj, mob/user as mob, params) + if(istype(I, /obj/item/device/spacepod_key)) + var/obj/item/device/spacepod_key/key = I + if(!key.id) + key.id = id + to_chat(user, "You grind the blank key to fit the lock.") + else + to_chat(user, "This key is already ground!") + else + ..() diff --git a/code/game/vehicles/spacepods/spacepod.dm b/code/game/vehicles/spacepods/spacepod.dm index bfa4cf1dd6a..707b8912460 100644 --- a/code/game/vehicles/spacepods/spacepod.dm +++ b/code/game/vehicles/spacepods/spacepod.dm @@ -250,9 +250,12 @@ /obj/spacepod/attackby(obj/item/W as obj, mob/user as mob, params) if(iscrowbar(W)) - hatch_open = !hatch_open - playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - to_chat(user, "You [hatch_open ? "open" : "close"] the maintenance hatch.") + if(!equipment_system.lock_system || allow2enter || hatch_open) + hatch_open = !hatch_open + playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + to_chat(user, "You [hatch_open ? "open" : "close"] the maintenance hatch.") + else + to_chat(user, "The hatch is locked shut!") if(istype(W, /obj/item/weapon/stock_parts/cell)) if(!hatch_open) to_chat(user, "\red The maintenance hatch is closed!") @@ -305,6 +308,25 @@ equipment_system.cargo_system = W equipment_system.cargo_system.my_atom = src return + if(istype(W, /obj/item/device/spacepod_equipment/lock)) + if(equipment_system.lock_system) + to_chat(user, "The pod already has a lock system, remove it first.") + return + else + to_chat(user, "You insert \the [W] into the lock system.") + user.drop_item(W) + W.forceMove(src) + equipment_system.lock_system = W + equipment_system.lock_system.my_atom = src + return + + if(istype(W, /obj/item/device/spacepod_key) && istype(equipment_system.lock_system, /obj/item/device/spacepod_equipment/lock/keyed)) + var/obj/item/device/spacepod_key/key = W + if (key.id == equipment_system.lock_system.id) + locksecondseat() + else + to_chat(user, "This is the wrong key!") + return if(istype(W, /obj/item/weapon/weldingtool)) if(!hatch_open) @@ -340,6 +362,8 @@ possible.Add("Misc. System") if(equipment_system.cargo_system) possible.Add("Cargo System") + if(equipment_system.lock_system) + possible.Add("Lock System") /* Not yet implemented if(equipment_system.engine_system) possible.Add("Engine System") @@ -379,6 +403,15 @@ equipment_system.cargo_system = null else to_chat(user, "You need an open hand to do that.") + if("Lock System") + SPE = equipment_system.lock_system + if(user.put_in_any_hand_if_possible(SPE)) + to_chat(user, "You remove \the [SPE] from the equipment system.") + SPE.removed(user) + SPE.my_atom = null + equipment_system.lock_system = null + else + to_chat(user, "You need an open hand to do that.") /* if("engine system") SPE = equipment_system.engine_system @@ -423,6 +456,11 @@ equipment_system.misc_system = L equipment_system.misc_system.my_atom = src equipment_system.misc_system.enabled = 1 + var/obj/item/device/spacepod_equipment/lock/keyed/K = new /obj/item/device/spacepod_equipment/lock/keyed + K.loc = equipment_system + equipment_system.lock_system = K + equipment_system.lock_system.my_atom = src + equipment_system.lock_system.id = 100000 return /obj/spacepod/random/New() @@ -534,7 +572,11 @@ moved_other_inside(M) if(M == user) - enter_pod(user) + if(!equipment_system.lock_system || allow2enter) + enter_pod(user) + else + to_chat(user, "\The [src]'s doors are locked!") + if(istype(A, /obj/structure/ore_box)) // For loading ore boxes var/obj/structure/ore_box/O = A @@ -638,10 +680,6 @@ log_debug("##SPACEPOD WARNING: OCCUPANT [occupant2] ESCAPED, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") occupant2 = null - if(!occupant && !allow2enter) - allow2enter = 1 - log_debug("##SPACEPOD WARNING: DOORS WERE STILL LOCKED WITH NO OCCUPANT, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") - /obj/spacepod/verb/exit_pod() set name = "Exit pod" set category = "Spacepod" diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index f2d76051a37..e09953a81d6 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -558,7 +558,9 @@ client/proc/one_click_antag() for(var/i = 0, i= 1 && inputvol <= 70) cvol = inputvol - var/list/intercomms = list() + //Allows for override to utilize intercomms on all z-levels + var/B = alert("Do you want to play through intercomms on ALL Z-levels, or just the station?", "Override", "All", "Station") + var/ignore_z = 0 + if(B == "All") + ignore_z = 1 - for(var/obj/item/device/radio/intercom/I in world) - if(I.z != ZLEVEL_STATION) continue - intercomms += I + //Allows for override to utilize incomplete and unpowered intercomms + var/C = alert("Do you want to play through unpowered / incomplete intercomms, so the crew can't silence it?", "Override", "Yep", "Nope") + var/ignore_power = 0 + if(C == "Yep") + ignore_power = 1 - if(intercomms.len) - for(var/obj/item/device/radio/intercom/I in intercomms) - playsound(I, melody, cvol) + for(var/O in global_intercoms) + var/obj/item/device/radio/intercom/I = O + if(I.z != ZLEVEL_STATION && !ignore_z) + continue + if(!I.on && !ignore_power) + continue + playsound(I, melody, cvol) /* /client/proc/cuban_pete() diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index af73c27667d..0adf55229e0 100644 --- a/code/modules/awaymissions/mission_code/stationCollision.dm +++ b/code/modules/awaymissions/mission_code/stationCollision.dm @@ -19,9 +19,6 @@ * Areas */ //Gateroom gets its own APC specifically for the gate - /area/awaymission - report_alerts = 0 - /area/awaymission/gateroom //Library, medbay, storage room diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e53af9a5014..043caf0ca0e 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -63,6 +63,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts #define MAX_SAVE_SLOTS 20 // Save slots for regular players #define MAX_SAVE_SLOTS_MEMBER 20 // Save slots for BYOND members +#define TAB_CHAR 0 +#define TAB_GAME 1 + /datum/preferences //doohickeys for savefiles // var/path @@ -174,7 +177,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/nanotrasen_relation = "Neutral" // 0 = character settings, 1 = game preferences - var/current_tab = 0 + var/current_tab = TAB_CHAR // OOC Metadata: var/metadata = "" @@ -207,229 +210,198 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts save_preferences(C) save_character(C) //let's save this new random character so it doesn't keep generating new ones. +/datum/preferences/proc/color_square(r, g, b) + return "___" // Hello I am a proc full of snowflake species checks how are you /datum/preferences/proc/ShowChoices(mob/user) - if(!user || !user.client) return + if(!user || !user.client) + return update_preview_icon() user << browse_rsc(preview_icon_front, "previewicon.png") user << browse_rsc(preview_icon_side, "previewicon2.png") - var/dat = "
" - dat += "Character Settings" - dat += "Game Preferences" + var/dat = "" + dat += "
" + dat += "Character Settings" + dat += "Game Preferences" dat += "
" dat += "
" switch(current_tab) - if (0) // Character Settings# + if(TAB_CHAR) // Character Settings + dat += "
" + dat += "
" + dat += "Name: " + dat += "[real_name]" + dat += "(Randomize)" + dat += "(Always Randomize)
" + dat += "
" dat += "
" dat += "Slot [slot_name] - " dat += "Load slot - " dat += "Save slot - " dat += "Reload slot" dat += "
" - dat += "

Occupation Choices

" - dat += "Set Occupation Preferences
" + dat += "
" + dat += "
" dat += "

Identity

" - dat += "
" if(appearance_isbanned(user)) - dat += "You are banned from using custom names and appearances. You can continue to adjust your characters, but you will be randomised once you join the game.
" - dat += "Name: " - dat += "[real_name]
" - dat += "(Random Name) " - dat += "(Always Random Name: [be_random_name ? "Yes" : "No"])" - dat += "
" - dat += "Gender: [gender == MALE ? "Male" : "Female"]
" - dat += "Age: [age]" - //dat += "Spawn Point: [spawnpoint]" - dat += "
Body " - dat += "(®)" - dat += "
" - dat += "Species: [species]
" - if(species == "Vox")//oldvox code, sucks I know - dat += "N2 Tank: [speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]
" - dat += "Secondary Language:
[language]
" - dat += "Blood Type: [b_type]
" + dat += "You are banned from using custom names and appearances. \ + You can continue to adjust your characters, but you will be randomised once you join the game.\ +
" + dat += "Gender: [gender == MALE ? "Male" : "Female"]
" + dat += "Age: [age]
" + dat += "Body: (®)
" + dat += "Species: [species]
" + if(species == "Vox") + dat += "N2 Tank: [speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]
" + dat += "Secondary Language: [language]
" + dat += "Blood Type: [b_type]
" if(species in list("Human", "Drask")) - dat += "Skin Tone: [-s_tone + 35]/220
" + dat += "Skin Tone: [-s_tone + 35]/220
" + dat += "Disabilities: \[Set\]
" + dat += "Nanotrasen Relation: [nanotrasen_relation]
" + dat += "Set Flavor Text
" + if(lentext(flavor_text) <= 40) + if(!lentext(flavor_text)) dat += "\[...\]
" + else dat += "[flavor_text]
" + else dat += "[TextPreview(flavor_text)]...
" - // dat += "Skin pattern: Adjust
" - dat += "
Handicaps
" - dat += "\t\[Set Disabilities\]
" - dat += "Limbs and Parts: Adjust
" + dat += "

Hair & Accessories

" + + if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories. + var/headaccessoryname = "Head Accessory: " + if(species == "Unathi") + headaccessoryname = "Horns: " + dat += "[headaccessoryname]" + dat += "[ha_style] " + dat += "Color [color_square(r_headacc, g_headacc, b_headacc)]
" + + if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings. + dat += "Body Markings: " + dat += "[m_style]" + dat += "Color [color_square(r_markings, g_markings, b_markings)]
" + + dat += "Hair: " + dat += "[h_style]" + dat += "Color [color_square(r_hair, g_hair, b_hair)]
" + + dat += "Facial Hair: " + dat += "[f_style ? "[f_style]" : "Shaved"]" + dat += "Color [color_square(r_facial, g_facial, b_facial)]
" + + if(species != "Machine") + dat += "Eyes: " + dat += "Color [color_square(r_eyes, g_eyes, b_eyes)]
" + + if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins + dat += "Body Color: " + dat += "Color [color_square(r_skin, g_skin, b_skin)]
" + + if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) + dat += "Body Accessory: " + dat += "[body_accessory ? "[body_accessory]" : "None"]
" + + dat += "
" + dat += "

Occupation Choices

" + dat += "Set Occupation Preferences
" + if(jobban_isbanned(user, "Records")) + dat += "You are banned from using character records.
" + else + dat += "Character Records
" + + dat += "

Limbs

" + dat += "Limbs and Parts: Adjust
" if(species != "Slime People" && species != "Machine") - dat += "Internal Organs: Adjust
" + dat += "Internal Organs: Adjust
" //display limbs below var/ind = 0 for(var/name in organ_data) -// to_chat(world, "[ind] \ [organ_data.len]") var/status = organ_data[name] var/organ_name = null switch(name) - if("chest") - organ_name = "torso" - if("groin") - organ_name = "lower body" - if("head") - organ_name = "head" - if("l_arm") - organ_name = "left arm" - if("r_arm") - organ_name = "right arm" - if("l_leg") - organ_name = "left leg" - if("r_leg") - organ_name = "right leg" - if("l_foot") - organ_name = "left foot" - if("r_foot") - organ_name = "right foot" - if("l_hand") - organ_name = "left hand" - if("r_hand") - organ_name = "right hand" - if("heart") - organ_name = "heart" - if("eyes") - organ_name = "eyes" + if("chest") organ_name = "torso" + if("groin") organ_name = "lower body" + if("head") organ_name = "head" + if("l_arm") organ_name = "left arm" + if("r_arm") organ_name = "right arm" + if("l_leg") organ_name = "left leg" + if("r_leg") organ_name = "right leg" + if("l_foot") organ_name = "left foot" + if("r_foot") organ_name = "right foot" + if("l_hand") organ_name = "left hand" + if("r_hand") organ_name = "right hand" + if("heart") organ_name = "heart" + if("eyes") organ_name = "eyes" - if(status == "cyborg") + if(status in list("cyborg", "amputated", "mechanical", "assisted")) ++ind - if(ind > 1) - dat += ", " - var/datum/robolimb/R - if(rlimb_data[name] && all_robolimbs[rlimb_data[name]]) - R = all_robolimbs[rlimb_data[name]] - else - R = basic_robolimb - dat += "\t[R.company] [organ_name] prosthesis" + if(ind > 1) dat += ", " - - else if(status == "amputated") - ++ind - if(ind > 1) - dat += ", " - dat += "\tAmputated [organ_name]" - - else if(status == "mechanical") - ++ind - if(ind > 1) - dat += ", " - dat += "\tMechanical [organ_name]" - - else if(status == "assisted") - ++ind - if(ind > 1) - dat += ", " - switch(organ_name) - if("heart") - dat += "\tPacemaker-assisted [organ_name]" - if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements - dat += "\tSurgically altered [organ_name]" - if("eyes") - dat += "\tRetinal overlayed [organ_name]" + switch(status) + if("cyborg") + var/datum/robolimb/R + if(rlimb_data[name] && all_robolimbs[rlimb_data[name]]) + R = all_robolimbs[rlimb_data[name]] else - dat += "\tMechanically assisted [organ_name]" - if(!ind) - dat += "\[...\]

" - else - dat += "

" - dat += "Underwear:
[underwear]
" - dat += "Undershirt:
[undershirt]
" - dat += "Socks:
[socks]
" - dat += "Backpack Type:
[backbaglist[backbag]]
" - dat += "Nanotrasen Relation:
[nanotrasen_relation]
" - dat += "
Preview
" - dat += "
" + R = basic_robolimb + dat += "\t[R.company] [organ_name] prosthesis" + if("amputated") dat += "\tAmputated [organ_name]" + if("mechanical") dat += "\tMechanical [organ_name]" + if("assisted") + switch(organ_name) + if("heart") dat += "\tPacemaker-assisted [organ_name]" + if("voicebox") dat += "\tSurgically altered [organ_name]" + if("eyes") dat += "\tRetinal overlayed [organ_name]" + else dat += "\tMechanically assisted [organ_name]" + if(!ind) dat += "\[...\]
" + else dat += "
" - if(jobban_isbanned(user, "Records")) - dat += "You are banned from using character records.
" - else - dat += "Character Records
" - dat += "Set Flavor Text
" - if(lentext(flavor_text) <= 40) - if(!lentext(flavor_text)) - dat += "\[...\]" - else - dat += "[flavor_text]" - else - dat += "[TextPreview(flavor_text)]...
" - dat += "
" + dat += "

Clothing

" + dat += "Underwear: [underwear]
" + dat += "Undershirt: [undershirt]
" + dat += "Socks: [socks]
" + dat += "Backpack Type: [backbaglist[backbag]]
" - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories. - var/headaccessoryname = "Head Accessory" - if(species == "Unathi") - headaccessoryname = "Horns" - dat += "
[headaccessoryname]
" - dat += "Change Color
__
" - dat += "Style: [ha_style]
" + dat += "
" - if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings. - dat += "
Body Markings
" - dat += "Change Color
__
" - dat += "
Style: [m_style]
" - - dat += "
Hair
" - dat += "Change Color
__
" - dat += "
Style: [h_style]
" - - dat += "
Facial Hair
" - dat += "Change Color
__
" - dat += "
Style: [f_style ? "[f_style]" : "Shaved"]
" - - if(species != "Machine") - dat += "
Eyes
" - dat += "Change Color
__

" - - if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins - dat += "
Body Color
" - dat += "Change Color
__
" - - if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) - dat += "
Body Accessory
" - dat += "Accessory: [body_accessory ? "[body_accessory]" : "None"]
" - - dat += "

" - - if (1) // General Preferences + if(TAB_GAME) // General Preferences dat += "
" dat += "

General Settings

" - dat += "UI Style: [UI_style]
" dat += "Fancy NanoUI: [(nanoui_fancy) ? "Yes" : "No"]
" dat += "Ghost-Item Attack Animation: [(show_ghostitem_attack) ? "Yes" : "No"]
" dat += "Custom UI settings:
" - dat += "Color: [UI_style_color]
__

" - dat += "Alpha (transparency): [UI_style_alpha]
" + dat += " - UI Style: [UI_style]
" + dat += " - Color: [UI_style_color]
__

" + dat += " - Alpha (transparency): [UI_style_alpha]
" + dat += "
" dat += "Play admin midis: [(sound & SOUND_MIDI) ? "Yes" : "No"]
" dat += "Play lobby music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
" + if(user.client.holder) + dat += "Adminhelp sound: " + dat += "[(sound & SOUND_ADMINHELP)?"On":"Off"]
" + + if(check_rights(R_ADMIN,0)) + dat += "OOC:     Change
" + if(config.allow_Metadata) + dat += "OOC notes: Edit
" + if(unlock_content) + dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
" + dat += "Randomized character slot: [randomslot ? "Yes" : "No"]
" dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
" dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
" dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "Nearest Speakers" : "All Chatter"]
" - if(config.allow_Metadata) - dat += "OOC notes: Edit
" - - if(user.client) - if(user.client.holder) - dat += "Adminhelp sound: " - dat += "[(sound & SOUND_ADMINHELP)?"On":"Off"]
" - - if(check_rights(R_ADMIN,0)) - dat += "OOC:     Change
" - - if(unlock_content) - dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
" dat += "
" dat += "

Special Role Settings

" -// dat += "

" if(jobban_isbanned(user, "Syndicate")) dat += "You are banned from special roles." - src.be_special = list() + be_special = list() else - for (var/i in special_roles) + for(var/i in special_roles) if(jobban_isbanned(user, i)) dat += "Be [capitalize(i)]: \[BANNED]
" else if(!player_old_enough_antag(user.client,i)) @@ -437,17 +409,17 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "Be [capitalize(i)]: \[IN [(available_in_days_antag)] DAYS]
" else dat += "Be [capitalize(i)]: [(i in src.be_special) ? "Yes" : "No"]
" - dat += "

" - + dat += "" + + dat += "
" if(!IsGuestKey(user.key)) dat += "Undo - " dat += "Save Setup - " dat += "Reset Setup" - dat += "
" + dat += "
" -// user << browse(dat, "window=preferences;size=560x580") - var/datum/browser/popup = new(user, "preferences", "
Character Setup
", 640, 810) + var/datum/browser/popup = new(user, "preferences", "
Character Setup
", 820, 640) popup.set_content(dat) popup.open(0) @@ -1701,6 +1673,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("open_load_dialog") if(!IsGuestKey(user.key)) open_load_dialog(user) + return 1 if("close_load_dialog") close_load_dialog(user) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 93e8dc6cd79..d9817add99f 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -7,6 +7,8 @@ w_class = 2 gas_transfer_coefficient = 0.90 put_on_delay = 20 + var/resist_time = 0 //deciseconds of how long you need to gnaw to get rid of the gag, 0 to make it impossible to remove + var/mute = 1 // 1 - completely mutes you, 0 - muffles everything you say "MHHPHHMMM!!!" species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi' @@ -24,6 +26,34 @@ icon_state = "gag" w_class = 1 +/obj/item/clothing/mask/muzzle/tapegag + name = "tape gag" + desc = "MHPMHHH!" + icon_state = "tapegag" + item_state = null + w_class = 1 + resist_time = 150 + mute = 0 + species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', + "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' + ) + +/obj/item/clothing/mask/muzzle/tapegag/dropped(mob/living/carbon/human/user) + var/atom/movable/R = new /obj/item/trash/tapetrash + if(user.species.bodyflags & HAS_FUR) + R.desc += " Is that...fur?" + var/turf/T = get_turf(src) + R.loc = T + transfer_fingerprints_to(R) + playsound(src,'sound/items/poster_ripped.ogg',40,1) + spawn(0) // Because of how dropping is done, if the muzzle gets deleted now, icons won't properly update and the whole unEquip() proc will break stuff. + qdel(src) // This makes sure it gets deleted AFTER all that has to be done is done. + user.emote("scream") + /obj/item/clothing/mask/surgical name = "sterile mask" desc = "A sterile mask designed to help prevent the spread of diseases." @@ -244,4 +274,4 @@ obj/item/clothing/mask/bandana/purple name = "black bandana" icon_state = "bandblack" item_color = "black" - desc = "It's a black bandana." \ No newline at end of file + desc = "It's a black bandana." diff --git a/code/modules/examine/descriptions/weapons.dm b/code/modules/examine/descriptions/weapons.dm index 785beed0042..90929d31e08 100644 --- a/code/modules/examine/descriptions/weapons.dm +++ b/code/modules/examine/descriptions/weapons.dm @@ -31,10 +31,6 @@ then click where you want to fire. To recharge this weapon, use a weapon recharger. \ To switch between insta-stun and disabler beams, click the weapon in your hand. This weapon can only fire through glass if it is set to disabler beams." -/obj/item/weapon/gun/energy/stunrevolver - description_info = "This is an energy weapon. To fire the weapon, have your gun mode set to 'fire', \ - then click where you want to fire. To recharge this weapon, use a weapon recharger." - /obj/item/weapon/gun/energy/nuclear description_info = "This is an energy weapon. To fire the weapon, have your gun mode set to 'fire', \ then click where you want to fire. Most energy weapons can fire through windows harmlessly. To switch between stun and lethal, click the weapon \ diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index d3d9cb0f3dc..150528d4c66 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -109,7 +109,7 @@ if((bee_resources >= BEE_RESOURCE_NEW_BEE_COST && prob(BEE_PROB_NEW_BEE)) || freebee) if(!freebee) bee_resources = max(bee_resources - BEE_RESOURCE_NEW_BEE_COST, 0) - var/mob/living/simple_animal/hostile/poison/bees/B = new(src) + var/mob/living/simple_animal/hostile/poison/bees/worker/B = new(src) B.beehome = src B.assign_reagent(queen_bee.beegent) bees += B @@ -180,7 +180,7 @@ visible_message("[user] sets [qb] down inside the apiary, making it their new home.") var/relocated = 0 for(var/b in bees) - var/mob/living/simple_animal/hostile/poison/bees/B = b + var/mob/living/simple_animal/hostile/poison/bees/worker/B = b if(B.reagent_incompatible(queen_bee)) bees -= B B.beehome = null diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index beadb53c4af..d7ce6d9f49a 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -40,7 +40,7 @@ seed_name = "ghost pepper" display_name = "ghost pepper plants" mutants = null - chems = list("capsaicin" = list(8,2), "condensedcapsaicin" = list(4,4), "plantmatter" = list(1,50)) + chems = list("capsaicin" = list(8,2), "condensedcapsaicin" = list(4,4), "ghostchilijuice" = list(4,4), "plantmatter" = list(1,50)) kitchen_tag = "ghostchili" preset_icon = "ghostchilipepper" @@ -513,7 +513,7 @@ seed_noun = "spores" display_name = "chanterelle mushrooms" mutants = list("reishi","amanita","plumphelmet") - chems = list("plantmatter" = list(1,25), "fungus" = list(1,10)) + chems = list("plantmatter" = list(1,25)) splat_type = /obj/effect/plant kitchen_tag = "mushroom" preset_icon = "chanterelle" @@ -534,6 +534,7 @@ seed_name = "brown mold" display_name = "brown mold" mutants = null + chems = list("fungus" = list(1,10)) /datum/seed/mushroom/mold/New() ..() diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index 25358df5af2..9102af9e0ab 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -11,7 +11,7 @@ /obj/structure/closet/crate/secure/loot/New() ..() - var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "z") + var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") code = "" for(var/i = 0, i < codelen, i++) var/dig = pick(digits) @@ -165,7 +165,7 @@ to_chat(user, "You leave the crate alone.") else to_chat(user, "A red light flashes.") - lastattempt = replacetext(input, 0, "z") + lastattempt = input attempts-- if(attempts == 0) boom(user) @@ -186,19 +186,27 @@ else to_chat(user, "* Anti-Tamper Bomb will activate after [src.attempts] failed access attempts.") if(lastattempt != null) - var/list/guess = list() + var/guess = lastattempt var/bulls = 0 var/cows = 0 - for(var/i = 1, i < codelen + 1, i++) - var/a = copytext(lastattempt, i, i+1) //Stuff the code into the list - guess += a - guess[a] = i - for(var/i in guess) //Go through list and count matches - var/a = findtext(code, i) - if(a == guess[i]) - ++bulls - else if(a) - ++cows + var/list/banned = list() + for(var/i; i <= length(lastattempt); i++) + var/list/a = strip_first(guess) + if(a[1] in banned) + continue + if(findtext(a[2], a[1])) + if(findtext(code, a[1], i, i+1)) + ++bulls + banned += a[1] + else + var/g = findtext(code, a[1]) + if(g) + if(g == i) + ++bulls + else + ++cows + guess = a[2] + to_chat(user, "Last code attempt had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.") else ..() else ..() diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index c94bfcd0ce8..140cdc8b85b 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -49,11 +49,11 @@ var/point_upgrade_temp = 1 var/sheet_per_ore_temp = 1 for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) - sheet_per_ore_temp = B.rating + sheet_per_ore_temp = 0.65 + (0.35 * B.rating) for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) ore_pickup_rate_temp = 15 * M.rating for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts) - point_upgrade_temp = L.rating + point_upgrade_temp = 0.65 + (0.35 * L.rating) ore_pickup_rate = ore_pickup_rate_temp point_upgrade = point_upgrade_temp sheet_per_ore = sheet_per_ore_temp @@ -225,7 +225,7 @@ var/obj/item/stack/sheet/inp = stack_list[text2path(href_list["release"])] var/obj/item/stack/sheet/out = new inp.type() var/desired = input("How much?", "How much to eject?", 1) as num - out.amount = min(desired,50,inp.amount) + out.amount = round(min(desired,50,inp.amount)) if(out.amount >= 1) inp.amount -= out.amount unload_mineral(out) @@ -242,7 +242,7 @@ var/desired = input("How much?", "How much would you like to smelt?", 1) as num var/obj/item/stack/sheet/plasteel/plasteelout = new - plasteelout.amount = min(desired,50,metalstack.amount,plasmastack.amount) + plasteelout.amount = round(min(desired,50,metalstack.amount,plasmastack.amount)) if(plasteelout.amount >= 1) metalstack.amount -= plasteelout.amount plasmastack.amount -= plasteelout.amount @@ -258,7 +258,7 @@ var/desired = input("How much?", "How much would you like to smelt?", 1) as num var/obj/item/stack/sheet/plasmaglass/plasglassout = new - plasglassout.amount = min(desired, 50, glassstack.amount, plasmastack.amount) + plasglassout.amount = round(min(desired, 50, glassstack.amount, plasmastack.amount)) if(plasglassout.amount >= 1) glassstack.amount -= plasglassout.amount plasmastack.amount -= plasglassout.amount @@ -811,7 +811,7 @@ O.forceMove(loc) return -/mob/living/simple_animal/hostile/mining_drone/adjustBruteLoss() +/mob/living/simple_animal/hostile/mining_drone/adjustHealth() if(search_objects) SetOffenseBehavior() ..() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 7a8e608c224..8d68373e3f4 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -124,7 +124,6 @@ I.dropped(src) if(I) I.layer = initial(I.layer) - return 1 @@ -173,4 +172,4 @@ return l_hand if(slot_r_hand) return r_hand - return null \ No newline at end of file + return null diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm index 79445eec13a..a8129bcf7af 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -9,7 +9,7 @@ // if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' // act = copytext(act,1,length(act)) //seriously who the fuck wrote this var/muzzled = is_muzzled() - + act = lowertext(act) switch(act) if("sign") if(!restrained()) diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm index 72be5c029fa..1ed366a4db2 100644 --- a/code/modules/mob/living/carbon/alien/larva/emote.dm +++ b/code/modules/mob/living/carbon/alien/larva/emote.dm @@ -9,7 +9,7 @@ if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' act = copytext(act,1,length(act)) var/muzzled = is_muzzled() - + act = lowertext(act) switch(act) if ("me") if(silent) diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm index b173ac63460..bc3669ea409 100644 --- a/code/modules/mob/living/carbon/brain/emote.dm +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -12,6 +12,7 @@ if(src.stat == DEAD) return + act = lowertext(act) switch(act) if ("alarm") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 70a1d635ff1..5a641a81689 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -746,6 +746,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, spintime -= speed /mob/living/carbon/resist_buckle() + spawn(0) + resist_muzzle() if(restrained()) changeNext_move(CLICK_CD_BREAKOUT) last_special = world.time + CLICK_CD_BREAKOUT @@ -776,6 +778,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, /mob/living/carbon/resist_restraints() + spawn(0) + resist_muzzle() var/obj/item/I = null if(handcuffed) I = handcuffed @@ -786,6 +790,21 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, last_special = world.time + CLICK_CD_BREAKOUT cuff_resist(I) +/mob/living/carbon/resist_muzzle() + if(!istype(wear_mask, /obj/item/clothing/mask/muzzle)) + return + var/obj/item/clothing/mask/muzzle/I = wear_mask + var/time = I.resist_time + if(I.resist_time == 0)//if it's 0, you can't get out of it + to_chat(src, "[I] is too well made, you'll need hands for this one!") + else + visible_message("[src] gnaws on [I], trying to remove it!") + to_chat(src, "You attempt to remove [I]... (This will take around [time/10] seconds and you need to stand still.)") + if(do_after(src, time, 0, target = src)) + visible_message("[src] removes [I]!") + to_chat(src, "You get rid of [I]!") + unEquip(I) + /mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0) breakouttime = I.breakouttime diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 96c05ee627a..77a6eb8e34b 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -26,6 +26,7 @@ //Emote Cooldown System (it's so simple!) // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] var/on_CD = 0 + act = lowertext(act) switch(act) //Cooldown-inducing emotes if("ping", "pings", "buzz", "buzzes", "beep", "beeps", "yes", "no") @@ -33,6 +34,11 @@ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm else //Everyone else fails, skip the emote attempt return + if("drone","drones","hum","hums","rumble","rumbles") + if (species.name == "Drask") //Only Drask can make whale noises + on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm + else + return if("squish", "squishes") var/found_slime_bodypart = 0 @@ -115,6 +121,23 @@ playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) m_type = 2 + if("drone", "drones", "hum", "hums", "rumble", "rumbles") + var/M = null + if(param) + for (var/mob/A in view(null, null)) + if (param == A.name) + M = A + break + if(!M) + param = null + + if (param) + message = "[src] drones at [param]." + else + message = "[src] rumbles." + playsound(src.loc, 'sound/voice/DraskTalk.ogg', 50, 0) + m_type = 2 + if("squish", "squishes") var/M = null if(param) @@ -337,7 +360,7 @@ message = "[src] faints." if(src.sleeping) return //Can't faint while asleep - src.sleeping += 10 //Short-short nap + src.sleeping += 1 m_type = 1 if ("cough", "coughs") @@ -792,14 +815,9 @@ continue // Now, we don't have this: //new /obj/effects/fart_cloud(T,L) - // But: - // <[REDACTED]> so, what it does is...imagine a 3x3 grid with the person in the center. When someone uses the emote *fart (it's not a spell style ability and has no cooldown), then anyone in the 8 tiles AROUND the person who uses it - // <[REDACTED]> gets between 1 and 10 units of jenkem added to them...we obviously don't have Jenkem, but Space Drugs do literally the same exact thing as Jenkem - // <[REDACTED]> the user, of course, isn't impacted because it's not an actual smoke cloud - // So, let's give 'em space drugs. if (M == src) continue - M.reagents.add_reagent("space_drugs",rand(1,10)) + M.reagents.add_reagent("jenkem", 1) if ("help") var/emotelist = "aflap(s), airguitar, blink(s), blink(s)_r, blush(es), bow(s)-(none)/mob, burp(s), choke(s), chuckle(s), clap(s), collapse(s), cough(s),cry, cries, custom, dap(s)(none)/mob," \ diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 5f8e44f840a..835f741be3d 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -262,12 +262,13 @@ emp_act if(!stat) switch(hit_area) if("head")//Harder to score a stun but if you do it lasts a bit longer - if(stat == CONSCIOUS && prob(I.force) && armor < 50) - visible_message("[src] has been knocked down!", \ - "[src] has been knocked down!") - apply_effect(5, WEAKEN, armor) - confused += 15 - if(src != user && I.damtype == BRUTE) + if(stat == CONSCIOUS && armor < 50) + if(prob(I.force)) + visible_message("[src] has been knocked down!", \ + "[src] has been knocked down!") + apply_effect(5, WEAKEN, armor) + confused += 15 + if(prob(I.force + ((100 - health)/2)) && src != user && I.damtype == BRUTE) ticker.mode.remove_revolutionary(mind) if(bloody)//Apply blood diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 5278f0cc723..d44bfbbb27f 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -12,6 +12,8 @@ if(embedded_flag) handle_embedded_objects() //Moving with objects stuck in you can cause bad times. + if(slowed) + tally += 10 var/health_deficiency = (maxHealth - health + staminaloss) if(reagents) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 2ddcb3d0f15..f9d9ae27442 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -607,4 +607,4 @@ return 0 return 1 - return 0 //Unsupported slot \ No newline at end of file + return 0 //Unsupported slot diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 26c6ddb0c57..bccd2a1ffdf 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -104,7 +104,7 @@ flags = HAS_LIPS | CAN_BE_FAT clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING + bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR dietflags = DIET_OMNI reagent_tag = PROCESS_ORG flesh_color = "#AFA59E" @@ -148,7 +148,7 @@ flags = HAS_LIPS clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING + bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR dietflags = DIET_OMNI reagent_tag = PROCESS_ORG flesh_color = "#966464" @@ -793,4 +793,4 @@ /datum/species/machine/handle_death(var/mob/living/carbon/human/H) H.h_style = "" spawn(100) - if(H) H.update_hair() \ No newline at end of file + if(H) H.update_hair() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 004f54a45ba..85fff9e6ead 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -685,7 +685,6 @@ var/global/list/damage_icon_parts = list() var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands") bloodsies.color = gloves.blood_color standing.overlays += bloodsies - gloves.screen_loc = ui_gloves overlays_standing[GLOVES_LAYER] = standing else if(blood_DNA) diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm index dfb0b9cada8..df935f6d98a 100644 --- a/code/modules/mob/living/carbon/slime/emote.dm +++ b/code/modules/mob/living/carbon/slime/emote.dm @@ -8,6 +8,7 @@ if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' act = copytext(act,1,length(act)) + act = lowertext(act) switch(act) //Alphabetical please if ("me") if(silent) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 7e70e3a613f..c3c64c1c696 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -111,6 +111,7 @@ handle_slurring() handle_paralysed() handle_sleeping() + handle_slowed() /mob/living/proc/handle_stunned() @@ -160,7 +161,10 @@ clear_alert("asleep") return sleeping - +/mob/living/proc/handle_slowed() + if(slowed) + slowed = max(slowed-1, 0) + return slowed /mob/living/proc/handle_disabilities() //Eyes diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index dd47a9cbcb6..12473f1d9e8 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -333,7 +333,7 @@ C.unEquip(C.legcuffed) C.legcuffed = initial(C.legcuffed) C.update_inv_legcuffed() - + if(C.reagents) for(var/datum/reagent/R in C.reagents.reagent_list) C.reagents.clear_reagents() @@ -358,12 +358,14 @@ SetParalysis(0) SetStunned(0) SetWeakened(0) + slowed = 0 losebreath = 0 dizziness = 0 jitteriness = 0 confused = 0 drowsyness = 0 radiation = 0 + druggy = 0 nutrition = 400 bodytemperature = 310 sdisabilities = 0 @@ -578,12 +580,19 @@ return /mob/living/proc/resist_buckle() + spawn(0) + resist_muzzle() buckled.user_unbuckle_mob(src,src) +/mob/living/proc/resist_muzzle() + return + /mob/living/proc/resist_fire() return /mob/living/proc/resist_restraints() + spawn(0) + resist_muzzle() return /*////////////////////// @@ -826,3 +835,11 @@ butcher_results.Remove(path) //In case you want to have things like simple_animals drop their butcher results on gib, so it won't double up below. visible_message("[user] butchers [src].") gib() + +/mob/living/movement_delay() + var/tally = 0 + + if(slowed) + tally += 10 + + return tally diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 28f30b58714..0581d464e9e 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -70,7 +70,7 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/proc/handle_speech_problems(var/message, var/verb) var/list/returns[3] var/speech_problem_flag = 0 - + var/robot = isSynthetic() if((HULK in mutations) && health >= 25 && length(message)) @@ -79,11 +79,17 @@ proc/get_radio_key_from_channel(var/channel) speech_problem_flag = 1 if(slurring) - message = slur(message) + if(robot) + message = slur(message, list("@", "!", "#", "$", "%", "&", "?")) + else + message = slur(message) verb = "slurs" speech_problem_flag = 1 if(stuttering) - message = stutter(message) + if(robot) + message = robostutter(message) + else + message = stutter(message) verb = "stammers" speech_problem_flag = 1 @@ -160,8 +166,13 @@ proc/get_radio_key_from_channel(var/channel) verb = say_quote(message, speaking) if(is_muzzled()) - to_chat(src, "You're muzzled and cannot speak!") - return + var/obj/item/clothing/mask/muzzle/G = wear_mask + if(G.mute) //if the mask is supposed to mute you completely or just muffle you + to_chat(src, "You're muzzled and cannot speak!") + return + else + message = muffledspeech(message) + verb = "mumbles" message = trim_left(message) @@ -351,7 +362,10 @@ proc/get_radio_key_from_channel(var/channel) return if(is_muzzled()) - to_chat(src, "You're muzzled and cannot speak!") + if(istype(wear_mask, /obj/item/clothing/mask/muzzle/tapegag)) //just for tape + to_chat(src, "Your mouth is taped and you cannot speak!") + else + to_chat(src, "You're muzzled and cannot speak!") return var/message_range = 1 @@ -451,4 +465,4 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list()) var/image/I = image('icons/mob/talk.dmi', bubble_loc, bubble_state, MOB_LAYER + 1) I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA - flick_overlay(I, bubble_recipients, 30) \ No newline at end of file + flick_overlay(I, bubble_recipients, 30) diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm index 0b9d0a7bb0f..23139963c26 100644 --- a/code/modules/mob/living/silicon/emote.dm +++ b/code/modules/mob/living/silicon/emote.dm @@ -9,6 +9,7 @@ //Emote Cooldown System (it's so simple!) // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] var/on_CD = 0 + act = lowertext(act) switch(act) //Cooldown-inducing emotes if("scream", "screams") diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 5d5f335391d..b4fd1ff3fa7 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -123,7 +123,7 @@ on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1) var/data[0] - data["manifest"] = list("__json_cache" = ManifestJSON) + data["manifest"] = PDA_Manifest ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) if(!ui) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 3d438296ec3..9693920ab9c 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -9,6 +9,7 @@ //Emote Cooldown System (it's so simple!) // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] var/on_CD = 0 + act = lowertext(act) switch(act) //Cooldown-inducing emotes if("law","flip","flips","halt") //halt is exempt because it's used to stop criminal scum //WHOEVER THOUGHT THAT WAS A GOOD IDEA IS GOING TO GET SHOT. diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 3c5206ba3a5..633413cfc86 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -216,17 +216,10 @@ else to_chat(user, "[src] is in pristine condition.") -/mob/living/simple_animal/bot/adjustBruteLoss(amount) - . = ..() - +/mob/living/simple_animal/bot/adjustHealth(amount) if(amount > 0 && prob(10)) new /obj/effect/decal/cleanable/blood/oil(loc) - -/mob/living/simple_animal/bot/adjustFireLoss(amount) - . = ..() - - if(amount > 0 && prob(5)) - new /obj/effect/decal/cleanable/blood/oil(loc) + return ..(amount) /mob/living/simple_animal/bot/updatehealth() ..() @@ -346,9 +339,7 @@ return var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0, user)) - adjustBruteLoss(-10) - adjustFireLoss(-10) - updatehealth() + adjustHealth(-10) add_fingerprint(user) user.visible_message("[user] repairs [src]!","You repair [src].") else diff --git a/code/modules/mob/living/simple_animal/bot/emote.dm b/code/modules/mob/living/simple_animal/bot/emote.dm index ba8b1d86daf..0642d7c5f2b 100644 --- a/code/modules/mob/living/simple_animal/bot/emote.dm +++ b/code/modules/mob/living/simple_animal/bot/emote.dm @@ -12,6 +12,7 @@ //Emote Cooldown System (it's so simple!) // proc/handle_emote_CD() located in [code\modules\mob\emote.dm] var/on_CD = 0 + act = lowertext(act) switch(act) //Cooldown-inducing emotes if("scream", "screams") diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm index 7a8a682e7af..1a1f444f29f 100644 --- a/code/modules/mob/living/simple_animal/friendly/diona.dm +++ b/code/modules/mob/living/simple_animal/friendly/diona.dm @@ -255,6 +255,7 @@ ..() /* var/on_CD = 0 + act = lowertext(act) switch(act) if("chirp") on_CD = handle_emote_CD() diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index fdf597b005e..346a04e7851 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -21,6 +21,7 @@ attacktext = "kicks" attack_sound = 'sound/weapons/punch1.ogg' health = 40 + maxHealth = 40 melee_damage_lower = 1 melee_damage_upper = 2 stop_automated_movement_when_pulled = 1 @@ -109,6 +110,7 @@ attacktext = "kicks" attack_sound = 'sound/weapons/punch1.ogg' health = 50 + maxHealth = 50 var/milk_content = 0 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY @@ -172,7 +174,8 @@ response_disarm = "gently pushes aside the" response_harm = "kicks the" attacktext = "kicks" - health = 1 + health = 3 + maxHealth = 3 ventcrawler = 2 var/amount_grown = 0 pass_flags = PASSTABLE | PASSGRILLE | PASSMOB @@ -216,6 +219,7 @@ var/global/chicken_count = 0 response_harm = "kicks the" attacktext = "kicks" health = 10 + maxHealth = 10 var/eggsleft = 0 var/chicken_color pass_flags = PASSTABLE | PASSMOB @@ -299,6 +303,7 @@ var/global/chicken_count = 0 response_harm = "kicks the" attacktext = "kicks" health = 50 + maxHealth = 50 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY @@ -321,6 +326,7 @@ var/global/chicken_count = 0 response_harm = "kicks the" attacktext = "pecks" health = 50 + maxHealth = 50 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY @@ -343,6 +349,7 @@ var/global/chicken_count = 0 response_harm = "kicks the" attacktext = "kicks" health = 50 + maxHealth = 50 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY @@ -365,6 +372,7 @@ var/global/chicken_count = 0 response_harm = "kicks the" attacktext = "kicks" health = 50 + maxHealth = 50 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY @@ -387,5 +395,6 @@ var/global/chicken_count = 0 response_harm = "kicks the" attacktext = "kicks" health = 50 + maxHealth = 50 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index e536ac303bb..56f63ee99be 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -38,6 +38,7 @@ icon_living = "aliend_running" icon_dead = "aliend_l" health = 60 + maxHealth = 60 melee_damage_lower = 15 melee_damage_upper = 15 var/plant_cooldown = 30 @@ -59,6 +60,7 @@ icon_living = "aliens_running" icon_dead = "aliens_l" health = 120 + maxHealth = 120 melee_damage_lower = 15 melee_damage_upper = 15 ranged = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 5a2ef732eb5..54b0d10608a 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -42,33 +42,23 @@ var/datum/reagent/beegent = null //hehe, beegent var/obj/structure/beebox/beehome = null - var/idle = 0 var/isqueen = FALSE + var/idle = 0 var/icon_base = "bee" var/static/list/bee_icons = list() - /mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0) return 1 - /mob/living/simple_animal/hostile/poison/bees/New() ..() generate_bee_visuals() - /mob/living/simple_animal/hostile/poison/bees/Destroy() - if(beehome) - beehome.bees.Remove(src) - beehome = null beegent = null return ..() - /mob/living/simple_animal/hostile/poison/bees/death(gibbed) - if(beehome) - beehome.bees.Remove(src) - beehome = null beegent = null ..() ghostize() @@ -77,10 +67,6 @@ /mob/living/simple_animal/hostile/poison/bees/examine(mob/user) ..() - if(!beehome) - to_chat(user, "This bee is homeless!") - - /mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals() overlays.Cut() @@ -107,31 +93,87 @@ wings = bee_icons["[icon_base]_wings"] overlays += wings - //We don't attack beekeepers/people dressed as bees//Todo: bee costume /mob/living/simple_animal/hostile/poison/bees/CanAttack(atom/the_target) . = ..() - if(!.) - return 0 - if(ishuman(the_target)) - var/mob/living/carbon/human/H = the_target - return !H.bee_friendly() - + return . /mob/living/simple_animal/hostile/poison/bees/Found(atom/A) + if(isliving(A)) + var/mob/living/L = A + return !L.bee_friendly() + return 0 + +/mob/living/simple_animal/hostile/poison/bees/AttackingTarget() + if(beegent && isliving(target)) + var/mob/living/L = target + if(!isnull(target.reagents)) + beegent.reaction_mob(L, INGEST) + L.reagents.add_reagent(beegent.id, rand(1,5)) + target.attack_animal(src) + +/mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R) + if(istype(R)) + beegent = R + name = "[initial(name)] ([R.name])" + generate_bee_visuals() + +/mob/living/simple_animal/hostile/poison/bees/handle_automated_action() + . = ..() + if(!.) + return + +/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B) + if(!B) + return 0 + if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent) + return 1 + return 0 + + + + +//Botany Worker Bees +/mob/living/simple_animal/hostile/poison/bees/worker + //Blank type define in case we need to give them special stuff later, plus organization (currently they are same as base type bee) + + +/mob/living/simple_animal/hostile/poison/bees/worker/Destroy() + if(beehome) + beehome.bees.Remove(src) + beehome = null + ..() + +/mob/living/simple_animal/hostile/poison/bees/worker/death(gibbed) + if(beehome) + beehome.bees.Remove(src) + beehome = null + ..() + +/mob/living/simple_animal/hostile/poison/bees/worker/examine(mob/user) + ..() + + if(!beehome) + to_chat(user, "This bee is homeless!") + +/mob/living/simple_animal/hostile/poison/bees/worker/Found(atom/A) if(istype(A, /obj/machinery/portable_atmospherics/hydroponics)) var/obj/machinery/portable_atmospherics/hydroponics/Hydro = A if(Hydro.seed && !Hydro.dead && !Hydro.recent_bee_visit) wanted_objects |= /obj/machinery/portable_atmospherics/hydroponics //so we only hunt them while they're alive/seeded/not visisted return 1 - if(ishuman(A)) - var/mob/living/carbon/human/H = A - return !H.bee_friendly() - return 0 + ..() +/mob/living/simple_animal/hostile/poison/bees/worker/CanAttack(atom/the_target) + . = ..() + if(!.) + return 0 + if(isliving(the_target)) //Should ignore ghosts and camera mobs already, but just in case + var/mob/living/L = the_target + return !L.bee_friendly() -/mob/living/simple_animal/hostile/poison/bees/AttackingTarget() - //Pollinate +/mob/living/simple_animal/hostile/poison/bees/worker/AttackingTarget() + //Pollinate if(istype(target, /obj/machinery/portable_atmospherics/hydroponics)) var/obj/machinery/portable_atmospherics/hydroponics/Hydro = target pollinate(Hydro) @@ -141,22 +183,9 @@ target = null wanted_objects.Remove(/obj/structure/beebox) //so we don't attack beeboxes when not going home else - if(beegent && isliving(target)) - var/mob/living/L = target - if(!isnull(target.reagents)) - beegent.reaction_mob(L, INGEST) - L.reagents.add_reagent(beegent.id, rand(1,5)) - target.attack_animal(src) + ..() - -/mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R) - if(istype(R)) - beegent = R - name = "[initial(name)] ([R.name])" - generate_bee_visuals() - - -/mob/living/simple_animal/hostile/poison/bees/proc/pollinate(obj/machinery/portable_atmospherics/hydroponics/Hydro) +/mob/living/simple_animal/hostile/poison/bees/worker/proc/pollinate(obj/machinery/portable_atmospherics/hydroponics/Hydro) if(!istype(Hydro) || !Hydro.seed || Hydro.dead || Hydro.recent_bee_visit) target = null return @@ -187,12 +216,10 @@ if(beehome) beehome.bee_resources = min(beehome.bee_resources + growth, 100) - -/mob/living/simple_animal/hostile/poison/bees/handle_automated_action() +/mob/living/simple_animal/hostile/poison/bees/worker/handle_automated_action() . = ..() if(!.) return - if(!isqueen) if(loc == beehome) idle = min(100, ++idle) @@ -212,7 +239,9 @@ beehome = BB - /mob/living/simple_animal/hostile/poison/bees/queen + +//Botany Queen Bee +/mob/living/simple_animal/hostile/poison/bees/queen name = "queen bee" desc = "she's the queen of bees, BZZ BZZ" icon_base = "queen" @@ -223,28 +252,13 @@ /mob/living/simple_animal/hostile/poison/bees/queen/Found(atom/A) return 0 - -//leave pollination for the peasent bees -/mob/living/simple_animal/hostile/poison/bees/queen/AttackingTarget() - if(beegent && isliving(target)) - var/mob/living/L = target - beegent.reaction_mob(L, TOUCH) - L.reagents.add_reagent(beegent.id, rand(1,5)) - target.attack_animal(src) - - -//PEASENT BEES -/mob/living/simple_animal/hostile/poison/bees/queen/pollinate() - return - - -/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B) - if(!B) +/mob/living/simple_animal/hostile/poison/bees/queen/CanAttack(atom/the_target) + . = ..() + if(!.) return 0 - if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent) - return 1 - return 0 - + if(isliving(the_target)) //Should ignore ghosts and camera mobs already, but just in case + var/mob/living/L = the_target + return !L.bee_friendly() /obj/item/queen_bee name = "queen bee" @@ -254,7 +268,6 @@ icon = 'icons/mob/bees.dmi' var/mob/living/simple_animal/hostile/poison/bees/queen/queen - /obj/item/queen_bee/attackby(obj/item/I, mob/user, params) if(istype(I,/obj/item/weapon/reagent_containers/syringe)) var/obj/item/weapon/reagent_containers/syringe/S = I @@ -280,7 +293,6 @@ to_chat(user, "You don't have enough units of that chemical to modify the bee's DNA!") ..() - /obj/item/queen_bee/bought/New() ..() queen = new(src) @@ -288,3 +300,43 @@ /obj/item/queen_bee/Destroy() qdel(queen) return ..() + + + +//Syndicate Bees +/mob/living/simple_animal/hostile/poison/bees/syndi + name = "syndi-bee" + desc = "The result of a large influx of BEES!" + melee_damage_lower = 5 + melee_damage_upper = 5 + maxHealth = 25 + health = 25 + faction = list("hostile", "syndicate") + search_objects = 0 //these bees don't care about trivial things like plants, especially when there is havoc to sow + beegent = new /datum/reagent/facid() //prepare to die + var/list/master_and_friends = list() + +/mob/living/simple_animal/hostile/poison/bees/syndi/assign_reagent(datum/reagent/R) + return + +/mob/living/simple_animal/hostile/poison/bees/syndi/Found(atom/A) + return CanAttack(A) + +/mob/living/simple_animal/hostile/poison/bees/syndi/CanAttack(atom/the_target) + . = ..() + if(!.) + return 0 + if(isliving(the_target)) + var/mob/living/L = the_target + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H in master_and_friends) + return 0 + return 1 + +/mob/living/simple_animal/hostile/poison/bees/syndi/AttackingTarget() + ..() + if(target && isliving(target)) + var/mob/living/L = target + if(L.stat) + LoseTarget() diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index c5a656c8c66..4412dc77829 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -41,6 +41,7 @@ name = "Strong Hivebot" desc = "A robot, this one is armed and looks tough!" health = 80 + maxHealth = 80 ranged = 1 /mob/living/simple_animal/hostile/hivebot/death() diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 757b72f3809..b1627d17af0 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -186,7 +186,7 @@ /mob/living/simple_animal/hostile/proc/Goto(var/target, var/delay, var/minimum_distance) walk_to(src, target, minimum_distance, delay) -/mob/living/simple_animal/hostile/adjustBruteLoss(var/damage) +/mob/living/simple_animal/hostile/adjustHealth(damage) ..(damage) if(!stat && search_objects < 3)//Not unconscious, and we don't ignore mobs if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 7cff96385e1..e5ee97a70ef 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -99,7 +99,7 @@ visible_message("[src] starts to move!") attempt_open = 1 -/mob/living/simple_animal/hostile/mimic/crate/adjustBruteLoss(var/damage) +/mob/living/simple_animal/hostile/mimic/crate/adjustHealth(damage) trigger() ..(damage) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 5145a7c6a60..5a9f4a433af 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -204,7 +204,7 @@ Reward() ..() -/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustBruteLoss(var/damage) +/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(damage) idle_vision_range = 9 ..() @@ -403,7 +403,7 @@ pre_attack = 0 return -/mob/living/simple_animal/hostile/asteroid/goliath/adjustBruteLoss(var/damage) +/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(damage) ranged_cooldown-- handle_preattack() ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 82a7f09af80..e6dda5e301c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -59,7 +59,7 @@ health = maxHealth ..() -/mob/living/simple_animal/hostile/mushroom/adjustBruteLoss(var/damage)//Possibility to flee from a fight just to make it more visually interesting +/mob/living/simple_animal/hostile/mushroom/adjustHealth(damage)//Possibility to flee from a fight just to make it more visually interesting if(!retreat_distance && prob(33)) retreat_distance = 5 spawn(30) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index b9f04ec68ee..cd34c8a6491 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -61,7 +61,7 @@ H.enemies |= enemies return 0 -/mob/living/simple_animal/hostile/retaliate/adjustBruteLoss(var/damage) +/mob/living/simple_animal/hostile/retaliate/adjustHealth(damage) ..(damage) Retaliate() diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 4d6688aa75b..0ce0cc71a86 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -71,7 +71,7 @@ if(!Proj) return if(prob(65)) if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - src.health -= Proj.damage + adjustHealth(Proj.damage) else visible_message("\red [src] blocks [Proj] with its shield!") return 0 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 23477c2fc18..bb84eccc66b 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -269,8 +269,9 @@ return /mob/living/simple_animal/emote(var/act, var/m_type=1, var/message = null) - if(stat) return - + if(stat) + return + act = lowertext(act) switch(act) //IMPORTANT: Emotes MUST NOT CONFLICT anywhere along the chain. if("scream") message = "\The [src] whimpers." @@ -404,22 +405,18 @@ if(health < maxHealth) if(MED.amount >= 1) if(MED.heal_brute >= 1) - adjustBruteLoss(-MED.heal_brute) - MED.amount -= 1 - if(MED.amount <= 0) - qdel(MED) - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\blue [user] applies [MED] on [src]") + heal_organ_damage((MED.heal_brute * 1.66), (MED.heal_burn * 1.66)) + MED.use(1) + visible_message("[user] applies [MED] on [src]") return else - to_chat(user, "\blue [MED] won't help at all.") + to_chat(user, "[MED] won't help at all.") return else - to_chat(user, "\blue [src] is at full health.") + to_chat(user, "[src] is at full health.") return else - to_chat(user, "\blue [src] is dead, medical items won't bring it back to life.") + to_chat(user, "[src] is dead, medical items won't bring it back to life.") return else if(can_collar && !collar && istype(O, /obj/item/clothing/accessory/petcollar)) var/obj/item/clothing/accessory/petcollar/C = O @@ -492,25 +489,31 @@ if(3.0) adjustBruteLoss(30) +/mob/living/simple_animal/proc/adjustHealth(amount) + if(status_flags & GODMODE) + return 0 + bruteloss = Clamp(bruteloss + amount, 0, maxHealth) + handle_regular_status_updates() + /mob/living/simple_animal/adjustBruteLoss(amount) if(damage_coeff[BRUTE]) - return ..(amount * damage_coeff[BRUTE]) + adjustHealth(amount * damage_coeff[BRUTE]) /mob/living/simple_animal/adjustFireLoss(amount) if(damage_coeff[BURN]) - return ..(amount * damage_coeff[BURN]) + adjustHealth(amount * damage_coeff[BURN]) /mob/living/simple_animal/adjustOxyLoss(amount) if(damage_coeff[OXY]) - return ..(amount * damage_coeff[OXY]) + adjustHealth(amount * damage_coeff[OXY]) /mob/living/simple_animal/adjustToxLoss(amount) if(damage_coeff[TOX]) - return ..(amount * damage_coeff[TOX]) + adjustHealth(amount * damage_coeff[TOX]) /mob/living/simple_animal/adjustCloneLoss(amount) if(damage_coeff[CLONE]) - return ..(amount * damage_coeff[CLONE]) + adjustHealth(amount * damage_coeff[CLONE]) /mob/living/simple_animal/adjustStaminaLoss(amount) if(damage_coeff[STAMINA]) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 36c7d172488..04419656e02 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1350,16 +1350,18 @@ mob/proc/yank_out_object() ghost.notify_cloning(message, sound, source) return ghost -/mob/proc/fakevomit(green=0) //for aesthetic vomits that need to be instant and do not stun. -Fox +/mob/proc/fakevomit(green = 0, no_text = 0) //for aesthetic vomits that need to be instant and do not stun. -Fox if(stat==DEAD) return var/turf/location = loc if (istype(location, /turf/simulated)) if(green) - src.visible_message("[src] vomits up some green goo!","You vomit up some green goo!") + if(!no_text) + visible_message("[src] vomits up some green goo!","You vomit up some green goo!") new /obj/effect/decal/cleanable/vomit/green(location) else - src.visible_message("[src] pukes all over \himself!","You puke all over yourself!") + if(!no_text) + visible_message("[src] pukes all over \himself!","You puke all over yourself!") location.add_vomit_floor(src, 1) playsound(location, 'sound/effects/splat.ogg', 50, 1) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 5151d9adab9..8d0e6ae89a0 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -98,6 +98,7 @@ var/paralysis = 0.0 var/stunned = 0.0 var/weakened = 0.0 + var/slowed = 0 var/losebreath = 0.0//Carbon var/intent = null//Living var/shakecamera = 0 diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index de246f0f667..6e0645866d5 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -1,10 +1,3 @@ - -// fun if you want to typecast humans/monkeys/etc without writing long path-filled lines. -/proc/ishuman(A) - if(istype(A, /mob/living/carbon/human)) - return 1 - return 0 - /proc/issmall(A) if(A && istype(A, /mob/living/carbon/human)) var/mob/living/carbon/human/H = A @@ -12,56 +5,6 @@ return 1 return 0 -/proc/isbrain(A) - if(A && istype(A, /mob/living/carbon/brain)) - return 1 - return 0 - -/proc/isalien(A) - if(istype(A, /mob/living/carbon/alien)) - return 1 - return 0 - -/proc/isalienadult(A) - if(istype(A, /mob/living/carbon/alien/humanoid)) - return 1 - return 0 - -/proc/islarva(A) - if(istype(A, /mob/living/carbon/alien/larva)) - return 1 - return 0 - -proc/isfacehugger(A) - if(istype(A, /obj/item/clothing/mask/facehugger)) - return 1 - return 0 - -proc/isembryo(A) - if(istype(A, /obj/item/organ/internal/body_egg/alien_embryo)) - return 1 - return 0 - -/proc/isslime(A) - if(istype(A, /mob/living/carbon/slime)) - return 1 - return 0 - -/proc/isrobot(A) - if(istype(A, /mob/living/silicon/robot)) - return 1 - return 0 - -/proc/isanimal(A) - if(istype(A, /mob/living/simple_animal)) - return 1 - return 0 - -/proc/iscorgi(A) - if(istype(A, /mob/living/simple_animal/pet/corgi)) - return 1 - return 0 - /proc/ispet(A) if(istype(A, /mob/living/simple_animal)) var/mob/living/simple_animal/SA = A @@ -69,46 +12,6 @@ proc/isembryo(A) return 1 return 0 -/proc/iscrab(A) - if(istype(A, /mob/living/simple_animal/crab)) - return 1 - return 0 - -/proc/iscat(A) - if(istype(A, /mob/living/simple_animal/pet/cat)) - return 1 - return 0 - -/proc/ismouse(A) - if(istype(A, /mob/living/simple_animal/mouse)) - return 1 - return 0 - -/proc/isbear(A) - if(istype(A, /mob/living/simple_animal/hostile/bear)) - return 1 - return 0 - -/proc/iscarp(A) - if(istype(A, /mob/living/simple_animal/hostile/carp)) - return 1 - return 0 - -/proc/isbot(A) - if(istype(A, /mob/living/simple_animal/bot)) - return 1 - return 0 - -/proc/isclown(A) - if(istype(A, /mob/living/simple_animal/hostile/retaliate/clown)) - return 1 - return 0 - -/proc/isAI(A) - if(istype(A, /mob/living/silicon/ai)) - return 1 - return 0 - /mob/proc/isSynthetic() return 0 @@ -119,76 +22,6 @@ proc/isembryo(A) return 0 return 1 -/proc/isAIEye(A) - if(istype(A, /mob/camera/aiEye)) - return 1 - return 0 - -/proc/ispAI(A) - if(istype(A, /mob/living/silicon/pai)) - return 1 - return 0 - -/proc/iscarbon(A) - if(istype(A, /mob/living/carbon)) - return 1 - return 0 - -/proc/issilicon(A) - if(istype(A, /mob/living/silicon)) - return 1 - return 0 - -/proc/isSilicon(A) // Bay support - if(istype(A, /mob/living/silicon)) - return 1 - return 0 - -/proc/isliving(A) - if(istype(A, /mob/living)) - return 1 - return 0 - -/proc/isswarmer(A) - if(istype(A, /mob/living/simple_animal/hostile/swarmer)) - return 1 - return 0 - -/proc/isguardian(A) - if(istype(A, /mob/living/simple_animal/hostile/guardian)) - return 1 - return 0 - -/proc/isobserver(A) - if(istype(A, /mob/dead/observer)) - return 1 - return 0 - -/proc/isSpirit(A) - if(istype(A, /mob/spirit)) - return 1 - return 0 - -proc/isovermind(A) - if(istype(A, /mob/camera/blob)) - return 1 - return 0 - -/proc/ismask(A) - if(istype(A, /mob/spirit/mask)) - return 1 - return 0 - -/proc/isAutoAnnouncer(A) - if(istype(A, /mob/living/automatedannouncer)) - return 1 - return 0 - -/proc/isorgan(A) - if(istype(A, /obj/item/organ/external)) - return 1 - return 0 - /proc/isloyal(A) //Checks to see if the person contains a loyalty implant, then checks that the implant is actually inside of them for(var/obj/item/weapon/implant/loyalty/L in A) if(L && L.implanted) @@ -220,14 +53,6 @@ proc/isNonCrewAntag(A) return 1 -proc/isnewplayer(A) - if(istype(A, /mob/new_player)) - return 1 - return 0 - -proc/hasorgans(A) - return ishuman(A) - proc/iscuffed(A) if(istype(A, /mob/living/carbon)) var/mob/living/carbon/C = A @@ -255,10 +80,6 @@ proc/getsensorlevel(A) return U.sensor_mode return SUIT_SENSOR_OFF -/proc/is_admin(var/mob/user) - return check_rights(R_ADMIN, 0, user) != 0 - - /proc/check_zone(zone) if(!zone) return "chest" switch(zone) @@ -323,7 +144,7 @@ proc/getsensorlevel(A) p++ return t -proc/slur(phrase) +proc/slur(phrase, var/list/slurletters = ("'"))//use a different list as an input if you want to make robots slur with $#@%! characters phrase = html_decode(phrase) var/leng=lentext(phrase) var/counter=lentext(phrase) @@ -339,11 +160,12 @@ proc/slur(phrase) switch(rand(1,15)) if(1,3,5,8) newletter="[lowertext(newletter)]" if(2,4,6,15) newletter="[uppertext(newletter)]" - if(7) newletter+="'" + if(7) newletter+=pick(slurletters) //if(9,10) newletter="[newletter]" //if(11,12) newletter="[newletter]" //if(13) newletter="[newletter]" - newphrase+="[newletter]";counter-=1 + newphrase+="[newletter]" + counter-=1 return newphrase /proc/stutter(n) @@ -369,6 +191,30 @@ proc/slur(phrase) p++//for each letter p is increased to find where the next letter will be. return sanitize(copytext(t,1,MAX_MESSAGE_LEN)) +/proc/robostutter(n) //for robutts + var/te = html_decode(n) + var/t = ""//placed before the message. Not really sure what it's for. + n = length(n)//length of the entire word + var/p = null + p = 1//1 is the start of any word + while(p <= n)//while P, which starts at 1 is less or equal to N which is the length. + var/robotletter = pick("@", "!", "#", "$", "%", "&", "?") //for beep boop + var/n_letter = copytext(te, p, p + 1)//copies text from a certain distance. In this case, only one letter at a time. + if (prob(80) && (ckey(n_letter) in list("b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z"))) + if (prob(10)) + n_letter = text("[n_letter]-[robotletter]-[n_letter]-[n_letter]")//replaces the current letter with this instead. + else + if (prob(20)) + n_letter = text("[n_letter]-[robotletter]-[n_letter]") + else + if (prob(5)) + n_letter = robotletter + else + n_letter = text("[n_letter]-[n_letter]") + t = text("[t][n_letter]")//since the above is ran through for each letter, the text just adds up back to the original word. + p++//for each letter p is increased to find where the next letter will be. + return sanitize(copytext(t,1,MAX_MESSAGE_LEN)) + proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 for p will cause letters to be replaced instead of added /* Turn text into complete gibberish! */ @@ -387,6 +233,24 @@ proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 fo return returntext +proc/muffledspeech(phrase) + phrase = html_decode(phrase) + var/leng=lentext(phrase) + var/counter=lentext(phrase) + var/newphrase="" + var/newletter="" + while(counter>=1) + newletter=copytext(phrase,(leng-counter)+1,(leng-counter)+2) + if(newletter in list(" ", "!", "?", ".", ",")) + //do nothing + else if(lowertext(newletter) in list("a", "e", "i", "o", "u", "y")) + newletter = "ph" + else + newletter = "m" + newphrase+="[newletter]" + counter-=1 + return newphrase + /proc/shake_camera(mob/M, duration, strength=1) if(!M || !M.client || M.shakecamera) @@ -512,8 +376,7 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) return P /proc/get_both_hands(mob/living/carbon/M) - var/list/hands = list(M.l_hand, M.r_hand) - return hands + return list(M.l_hand, M.r_hand) //Direct dead say used both by emote and say @@ -668,4 +531,4 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM) if(!newname) //we'll stick with the oldname then return - rename_character(oldname, newname) \ No newline at end of file + rename_character(oldname, newname) diff --git a/code/modules/pda/core_apps.dm b/code/modules/pda/core_apps.dm index 0117a6b9140..065253fcfab 100644 --- a/code/modules/pda/core_apps.dm +++ b/code/modules/pda/core_apps.dm @@ -5,13 +5,13 @@ /datum/data/pda/app/main_menu/update_ui(mob/user as mob, list/data) title = pda.name - + data["app"]["is_home"] = 1 - + data["apps"] = pda.shortcut_cache data["categories"] = pda.shortcut_cat_order data["pai"] = !isnull(pda.pai) // pAI inserted? - + var/list/notifying[0] for(var/P in pda.notifying_programs) notifying["\ref[P]"] = 1 @@ -72,7 +72,7 @@ /datum/data/pda/app/manifest/update_ui(mob/user as mob, list/data) data_core.get_manifest_json() - data["manifest"] = list("__json_cache" = ManifestJSON) + data["manifest"] = PDA_Manifest /datum/data/pda/app/manifest/Topic(href, list/href_list) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 07a908bb6d1..8208635f577 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -25,6 +25,7 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable level = 1 anchored =1 + on_blueprints = TRUE var/datum/powernet/powernet name = "power cable" desc = "A flexible superconducting cable for heavy-duty power transfer" diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 9cce0b5fa9d..0df18d27150 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -433,83 +433,59 @@ if(status == LIGHT_EMPTY) to_chat(user, "There is no [fitting] in this light.") return - if(user.a_intent == "help") - if(on) - to_chat(user, "This light [fitting] feels hot!") - else - to_chat(user, "The light [fitting] feels cold.") - return - - if(user.a_intent == "disarm" || user.a_intent == "grab") //trying to grab the bulb // make it burn hands if not wearing fire-insulated gloves - if(on) - var/prot = 0 - var/mob/living/carbon/human/H = user + if(on) + var/prot = 0 + var/mob/living/carbon/human/H = user - if(istype(H)) + if(istype(H)) + if(H.gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(G.max_heat_protection_temperature) + prot = (G.max_heat_protection_temperature > 360) + else + prot = 1 - if(H.gloves) - var/obj/item/clothing/gloves/G = H.gloves - if(G.max_heat_protection_temperature) - prot = (G.max_heat_protection_temperature > 360) - else - prot = 1 - - if(prot > 0 || (RESIST_HEAT in user.mutations)) - to_chat(user, "You remove the light [fitting]") - else if(TK in user.mutations) - to_chat(user, "You telekinetically remove the light [fitting].") - else + if(prot > 0 || (RESIST_HEAT in user.mutations)) + to_chat(user, "You remove the light [fitting]") + else if(TK in user.mutations) + to_chat(user, "You telekinetically remove the light [fitting].") + else + if(user.a_intent == I_DISARM || user.a_intent == I_GRAB) to_chat(user, "You try to remove the light [fitting], but you burn your hand on it!") var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand") if(affecting.take_damage( 0, 5 )) // 5 burn damage H.UpdateDamageIcon() H.updatehealth() - return // if burned, don't remove the light - else - to_chat(user, "You remove the light [fitting].") + return + else + to_chat(user, "You try to remove the light [fitting], but it's too hot to touch!") + return + else + to_chat(user, "You remove the light [fitting].") - // create a light tube/bulb item and put it in the user's hand - var/obj/item/weapon/light/L = new light_type() - L.status = status - L.rigged = rigged - L.brightness_range = brightness_range - L.brightness_power = brightness_power - L.brightness_color = brightness_color + // create a light tube/bulb item and put it in the user's hand + var/obj/item/weapon/light/L = new light_type() + L.status = status + L.rigged = rigged + L.brightness_range = brightness_range + L.brightness_power = brightness_power + L.brightness_color = brightness_color // light item inherits the switchcount, then zero it - L.switchcount = switchcount - switchcount = 0 + L.switchcount = switchcount + switchcount = 0 - L.update() - L.add_fingerprint(user) + L.update() + L.add_fingerprint(user) - user.put_in_active_hand(L) //puts it in our active hand - - status = LIGHT_EMPTY - update() - - if(user.a_intent == "harm") //hitting the bulb - user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(src) - if(prob(10)) //10% chance to break a light with bare hands - to_chat(user, "You hit the light, and it smashes!") - for(var/mob/M in viewers(src)) - if(M == user) - continue - M.show_message("[user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) - if(on) - electrocute_mob(user, get_area(src), src, 0.3) - broken() - else - user.visible_message("[user.name] hits the light.") - playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) - - return + user.put_in_active_hand(L) //puts it in our active hand + status = LIGHT_EMPTY + update() // break the light and make sparks if was on diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 91502e270a6..7aa54d3429b 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -10,6 +10,7 @@ name = null icon = 'icons/obj/power.dmi' anchored = 1.0 + on_blueprints = TRUE var/datum/powernet/powernet = null use_power = 0 idle_power_usage = 0 diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 096cd26da3a..330d9136f17 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -56,20 +56,30 @@ obj/item/weapon/gun/energy/laser/retro /obj/item/weapon/gun/energy/lasercannon - name = "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!" + name = "accelerator laser cannon" + desc = "An advanced laser cannon that does more damage the farther away the target is." icon_state = "lasercannon" item_state = "laser" - w_class = 4.0 + w_class = 4 force = 10 flags = CONDUCT slot_flags = SLOT_BACK fire_sound = 'sound/weapons/lasercannonfire.ogg' origin_tech = "combat=4;materials=3;powerstorage=3" - projectile_type = "/obj/item/projectile/beam/heavylaser" + projectile_type = "/obj/item/projectile/beam/laser/accelerator" - isHandgun() - return 0 +/obj/item/weapon/gun/energy/lasercannon/isHandgun() + return 0 + +/obj/item/projectile/beam/laser/accelerator + name = "accelerator laser" + icon_state = "heavylaser" + range = 255 + damage = 6 + +/obj/item/projectile/beam/laser/accelerator/Range() + ..() + damage = min(damage+7, 100) /obj/item/weapon/gun/energy/lasercannon/mounted name = "mounted laser cannon" diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index c24bb897414..37d22ba5ff7 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -25,16 +25,30 @@ self_recharge = 1 recharge_time = 10 //Time it takes for shots to recharge (in ticks) -/obj/item/weapon/gun/energy/stunrevolver - name = "stun revolver" - desc = "A high-tech revolver that fires internal, reusable stun cartidges in a revolving cylinder. Holds twice as much ammo as a standard taser." +/obj/item/weapon/gun/energy/shock_revolver + name = "tesla revolver" + desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers." icon_state = "stunrevolver" - fire_sound = "sound/weapons/gunshot.ogg" - projectile_type = "/obj/item/projectile/energy/electrode" - cell_type = "/obj/item/weapon/stock_parts/cell" - fire_delay = 15 + item_state = "gun" + fire_sound = 'sound/weapons/gunshot.ogg' + projectile_type = "/obj/item/projectile/energy/shock_revolver" + charge_cost = 2000 + can_flashlight = 0 +/obj/item/projectile/energy/shock_revolver + name = "shock bolt" + icon_state = "purple_laser" + var/chain +/obj/item/projectile/energy/shock_revolver/OnFired() + spawn(1) + chain = Beam(firer, icon_state="purple_lightning", icon = 'icons/effects/effects.dmi',time=1000, maxdistance = 30) + +/obj/item/projectile/energy/shock_revolver/on_hit(atom/target) + . = ..() + if(isliving(target)) + tesla_zap(src, 3, 10000) + qdel(chain) /obj/item/weapon/gun/energy/crossbow name = "mini energy-crossbow" diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm index 9c18efe308d..aa0a2db6ae0 100644 --- a/code/modules/reagents/newchem/disease.dm +++ b/code/modules/reagents/newchem/disease.dm @@ -50,6 +50,87 @@ M.ForceContractDisease(new /datum/disease/tuberculosis(0)) ..() +/datum/reagent/jagged_crystals + name = "Jagged Crystals" + id = "jagged_crystals" + description = "Rapid chemical decomposition has warped these crystals into twisted spikes." + reagent_state = SOLID + color = "#FA0000" // rgb: 250, 0, 0 + +/datum/reagent/jagged_crystals/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom + M.ForceContractDisease(new /datum/disease/berserker(0)) + ..() + +/datum/reagent/salmonella + name = "Salmonella" + id = "salmonella" + description = "A nasty bacteria found in spoiled food." + reagent_state = LIQUID + color = "#1E4600" + +/datum/reagent/salmonella/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom + M.ForceContractDisease(new /datum/disease/food_poisoning(0)) + ..() + +/datum/reagent/gibbis + name = "Gibbis" + id = "gibbis" + description = "Liquid gibbis." + reagent_state = LIQUID + color = "#FF0000" + +/datum/reagent/gibbis/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom + if(volume > 2.5) + M.ForceContractDisease(new /datum/disease/gbs/curable(0)) + ..() + +/datum/reagent/prions + name = "Prions" + id = "prions" + description = "A disease-causing agent that is neither bacterial nor fungal nor viral and contains no genetic material." + reagent_state = LIQUID + color = "#FFFFFF" + +/datum/reagent/prions/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom + if(volume > 4.5) + M.ForceContractDisease(new /datum/disease/kuru(0)) + ..() + +/datum/reagent/grave_dust + name = "Grave Dust" + id = "grave_dust" + description = "Moldy old dust taken from a grave site." + reagent_state = LIQUID + color = "#465046" + +/datum/reagent/grave_dust/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom + if(volume > 4.5) + M.ForceContractDisease(new /datum/disease/vampire(0)) + ..() + +/datum/reagent/heartworms + name = "Space heartworms" + id = "heartworms" + description = "Aww, gross! These things can't be good for your heart. They're gunna eat it!" + reagent_state = SOLID + color = "#925D6C" + +/datum/reagent/heartworms/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom + if(volume > 4.5) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/internal/heart/ate_heart = H.get_int_organ(/obj/item/organ/internal/heart) + if(ate_heart) + ate_heart.remove(H) + qdel(ate_heart) + ..() + /datum/reagent/spore name = "Blob Spores" id = "spore" diff --git a/code/modules/reagents/newchem/drinks.dm b/code/modules/reagents/newchem/drinks.dm index 323bb24e832..01920c617c3 100644 --- a/code/modules/reagents/newchem/drinks.dm +++ b/code/modules/reagents/newchem/drinks.dm @@ -67,6 +67,56 @@ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' +/datum/reagent/ethanol/dragons_breath + name = "Dragon's Breath" + id = "dragonsbreath" + description = "Possessing this stuff probably breaks the Geneva convention." + reagent_state = LIQUID + color = "#DC0000" + alcohol_perc = 1 + +/datum/reagent/ethanol/dragons_breath/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(method == INGEST && prob(20)) + if(M.on_fire) + M.adjust_fire_stacks(3) + +/datum/reagent/ethanol/dragons_breath/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(M.reagents.has_reagent("milk")) + to_chat(M, "The milk stops the burning. Ahhh.") + M.reagents.del_reagent("milk") + M.reagents.del_reagent("dragonsbreath") + return + if(prob(8)) + to_chat(M, "Oh god! Oh GODD!!") + if(prob(50)) + to_chat(M, "Your throat burns terribly!") + M.emote(pick("scream","cry","choke","gasp")) + M.Stun(1) + if(prob(8)) + to_chat(M, "Why!? WHY!?") + if(prob(8)) + to_chat(M, "ARGHHHH!") + if(prob(2 * volume)) + to_chat(M, "OH GOD OH GOD PLEASE NO!!") + if(M.on_fire) + M.adjust_fire_stacks(5) + if(prob(50)) + to_chat(M, "IT BURNS!!!!") + M.visible_message("[M] is consumed in flames!") + M.dust() + return + ..() + +/datum/chemical_reaction/dragons_breath + name = "Dragon's Breath" + id = "dragonsbreath" + result = "dragonsbreath" + required_reagents = list("whiskey" = 1, "phlogiston" = 1, "pyrosium" = 1, "fuel" = 1, "ghostchilijuice"= 1) + result_amount = 1 + mix_message = "A tiny mushroom cloud erupts from the container. That's not worrying at all!" + mix_sound = 'sound/effects/meteorimpact.ogg' + // ROBOT ALCOHOL PAST THIS POINT // WOOO! diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index 6d8a7d4117f..127a37593d1 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/newchem/drugs.dm @@ -26,11 +26,45 @@ ..() return -/datum/reagent/nicotine/overdose_process(var/mob/living/M as mob) - M.adjustToxLoss(1*REM) - M.adjustOxyLoss(1*REM) - ..() - return +/datum/reagent/nicotine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + M.visible_message("[M] looks nervous!") + M.confused += 15 + M.adjustToxLoss(2) + M.Jitter(10) + M.emote("twitch_s") + else if(effect <= 4) + M.visible_message("[M] is all sweaty!") + M.bodytemperature += rand(15,30) + M.adjustToxLoss(3) + else if(effect <= 7) + M.adjustToxLoss(4) + M.emote("twitch") + M.Jitter(10) + else if(severity == 2) + if(effect <= 2) + M.emote("gasp") + to_chat(M, "You can't breathe!") + M.adjustOxyLoss(15) + M.adjustToxLoss(3) + M.Stun(1) + else if(effect <= 4) + to_chat(M, "You feel terrible!") + M.emote("drool") + M.Jitter(10) + M.adjustToxLoss(5) + M.Weaken(1) + M.confused += 33 + else if(effect <= 7) + M.emote("collapse") + to_chat(M, "Your heart is pounding!") + M << 'sound/effects/singlebeat.ogg' + M.Paralyse(5) + M.Jitter(30) + M.adjustToxLoss(6) + M.adjustOxyLoss(20) /datum/reagent/crank name = "Crank" @@ -62,12 +96,45 @@ M.emote(pick("groan", "moan")) ..() return -/datum/reagent/crank/overdose_process(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,10)*REM) - M.adjustToxLoss(rand(1,10)*REM) - M.adjustBruteLoss(rand(1,10)*REM) - ..() - return + +/datum/reagent/crank/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + M.visible_message("[M] looks confused!") + M.confused += 20 + M.Jitter(20) + M.emote("scream") + else if(effect <= 4) + M.visible_message("[M] is all sweaty!") + M.bodytemperature += rand(5,30) + M.adjustBrainLoss(1) + M.adjustToxLoss(1) + M.Stun(2) + else if(effect <= 7) + M.Jitter(30) + M.emote("grumble") + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M] is sweating like a pig!") + M.bodytemperature += rand(20,100) + M.adjustToxLoss(5) + M.Stun(3) + else if(effect <= 4) + M.visible_message("[M] starts tweaking the hell out!") + M.Jitter(100) + M.adjustToxLoss(2) + M.adjustBrainLoss(8) + M.Weaken(3) + M.confused += 25 + M.emote("scream") + M.reagents.add_reagent("jagged_crystals", 5) + else if(effect <= 7) + M.emote("scream") + M.visible_message("[M] nervously scratches at their skin!") + M.Jitter(10) + M.adjustBruteLoss(5) + M.emote("twitch_s") /datum/chemical_reaction/crank name = "Crank" @@ -120,12 +187,40 @@ ..() return -/datum/reagent/krokodil/overdose_process(var/mob/living/M as mob) - if(prob(10)) - M.adjustBrainLoss(rand(1,5)*REM) - M.adjustToxLoss(rand(1,5)*REM) - ..() - return +/datum/reagent/krokodil/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + M.visible_message("[M] looks dazed!") + M.Stun(3) + M.emote("drool") + else if(effect <= 4) + M.emote("shiver") + M.bodytemperature -= 40 + else if(effect <= 7) + to_chat(M, "Your skin is cracking and bleeding!") + M.adjustBruteLoss(5) + M.adjustToxLoss(2) + M.adjustBrainLoss(1) + M.emote("cry") + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M] sways and falls over!") + M.adjustToxLoss(3) + M.adjustBrainLoss(3) + M.Weaken(8) + M.emote("faint") + else if(effect <= 4) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.visible_message("[M]'s skin is rotting away!") + H.adjustBruteLoss(25) + H.emote("scream") + H.ChangeToHusk() + H.emote("faint") + else if(effect <= 7) + M.emote("shiver") + M.bodytemperature -= 70 /datum/chemical_reaction/krokodil name = "Krokodil" @@ -169,19 +264,30 @@ ..() return -/datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob) - if(prob(20)) - M.emote("laugh") - if(prob(33)) - M.visible_message("[M]'s hands flip out and flail everywhere!") - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - ..() - if(prob(50)) - M.adjustToxLoss(10) - M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) - return +/datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + M.visible_message("[M] can't seem to control their legs!") + M.confused += 20 + M.Weaken(4) + else if(effect <= 4) + M.visible_message("[M]'s hands flip out and flail everywhere!") + M.drop_l_hand() + M.drop_r_hand() + else if(effect <= 7) + M.emote("laugh") + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M]'s hands flip out and flail everywhere!") + M.drop_l_hand() + M.drop_r_hand() + else if(effect <= 4) + M.visible_message("[M] falls to the floor and flails uncontrollably!") + M.Jitter(10) + M.Weaken(10) + else if(effect <= 7) + M.emote("laugh") /datum/chemical_reaction/methamphetamine name = "methamphetamine" @@ -220,30 +326,97 @@ name = "Bath Salts" id = "bath_salts" description = "Sometimes packaged as a refreshing bathwater additive, these crystals are definitely not for human consumption." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 + reagent_state = SOLID + color = "#FAFAFA" overdose_threshold = 20 addiction_chance = 80 metabolization_rate = 0.6 - /datum/reagent/bath_salts/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") - if(prob(5)) - to_chat(M, "[high_message]") - M.AdjustParalysis(-5) - M.AdjustStunned(-5) - M.AdjustWeakened(-5) - M.adjustStaminaLoss(-10) - M.adjustBrainLoss(1) - M.adjustToxLoss(0.1) - M.hallucination += 10 - if(M.canmove && !istype(M.loc, /turf/space)) - step(M, pick(cardinal)) - step(M, pick(cardinal)) + var/check = rand(0,100) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(check < 8 && H.h_style != "Very Long Beard") + H.h_style = "Very Long Hair" + H.f_style = "Very Long Beard" + H.update_hair() + H.update_fhair() + H.visible_message("[H] has a wild look in their eyes!") + if(check < 60) + M.SetParalysis(0) + M.SetStunned(0) + M.SetWeakened(0) + if(check < 30) + M.emote(pick("twitch", "twitch_s", "scream", "drool", "grumble", "mumble")) + M.druggy = max(M.druggy, 15) + if(check < 20) + M.confused += 10 + if(check < 8) + M.reagents.add_reagent(pick("methamphetamine", "crank", "neurotoxin"), rand(1,5)) + M.visible_message("[M] scratches at something under their skin!") + M.adjustBruteLoss(5) + else if(check < 16) + M.hallucination += 30 + else if(check < 24) + to_chat(M, "They're coming for you!") + else if(check < 28) + to_chat(M, "THEY'RE GONNA GET YOU!") ..() - return + +/datum/reagent/bath_salts/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(method == INGEST) + to_chat(M, "You feel FUCKED UP!!!!!!") + M << 'sound/effects/singlebeat.ogg' + M.emote("faint") + M.apply_effect(5, IRRADIATE, negate_armor = 1) + M.adjustToxLoss(5) + M.adjustBrainLoss(10) + else + to_chat(M, "You feel a bit more salty than usual.") + +/datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + M.visible_message("[M] flails around like a lunatic!") + M.confused += 25 + M.Jitter(10) + M.emote("scream") + M.reagents.add_reagent("jagged_crystals", 5) + else if(effect <= 4) + M.visible_message("[M]'s eyes dilate!") + M.emote("twitch_s") + M.adjustToxLoss(2) + M.adjustBrainLoss(1) + M.Stun(3) + M.eye_blurry = max(M.eye_blurry, 7) + M.reagents.add_reagent("jagged_crystals", 5) + else if(effect <= 7) + M.emote("faint") + M.reagents.add_reagent("jagged_crystals", 5) + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M]'s eyes dilate!") + M.adjustToxLoss(2) + M.adjustBrainLoss(1) + M.Stun(3) + M.eye_blurry = max(M.eye_blurry, 7) + M.reagents.add_reagent("jagged_crystals", 5) + else if(effect <= 4) + M.visible_message("[M] convulses violently and falls to the floor!") + M.Jitter(50) + M.adjustToxLoss(2) + M.adjustBrainLoss(1) + M.Weaken(8) + M.emote("gasp") + M.reagents.add_reagent("jagged_crystals", 5) + else if(effect <= 7) + M.emote("scream") + M.visible_message("[M] tears at their own skin!") + M.adjustBruteLoss(5) + M.reagents.add_reagent("jagged_crystals", 5) + M.emote("twitch") /datum/chemical_reaction/bath_salts name = "bath_salts" @@ -255,19 +428,37 @@ mix_message = "Tiny cubic crystals precipitate out of the mixture. Huh." mix_sound = 'sound/goonstation/misc/fuse.ogg' -/datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob) - M.hallucination += 10 - if(M.canmove && !istype(M.loc, /turf/space)) - for(var/i = 0, i < 8, i++) - step(M, pick(cardinal)) - if(prob(20)) - M.emote(pick("twitch","drool","moan")) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() +/datum/chemical_reaction/jenkem + name = "Jenkem" + id = "jenkem" + result = "jenkem" + required_reagents = list("toiletwater" = 1, "ammonia" = 1, "water" = 1) + result_amount = 3 + mix_message = "The mixture ferments into a filthy morass." + mix_sound = 'sound/effects/blobattack.ogg' + +/datum/chemical_reaction/jenkem/on_reaction(var/datum/reagents/holder) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The solution generates a strong vapor!") + for(var/mob/living/carbon/C in range(T, 1)) + if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) + C.reagents.add_reagent("jenkem", 25) + +/datum/reagent/jenkem + name = "Jenkem" + id = "jenkem" + description = "Jenkem is a prison drug made from fermenting feces in a solution of urine. Extremely disgusting." + reagent_state = LIQUID + color = "#644600" + addiction_chance = 30 + +/datum/reagent/jenkem/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.Dizzy(5) + if(prob(10)) + M.emote(pick("twitch_s","drool","moan")) + M.adjustToxLoss(1) ..() - return /datum/chemical_reaction/aranesp name = "Aranesp" @@ -381,24 +572,30 @@ /datum/reagent/fliptonium/reagent_deleted(var/mob/living/M as mob) M.SpinAnimation(speed = 12, loops = -1) -/datum/reagent/fliptonium/overdose_process(var/mob/living/M as mob) - if(volume > 15) - if(prob(5)) - switch(pick(1, 2, 3)) - if(1) - M.emote("laugh") - M.adjustToxLoss(1) - if(2) - to_chat(M, "[M] can't seem to control their legs!") - M.Weaken(8) - M.adjustToxLoss(1) - if(3) - to_chat(M, "[M]'s hands flip out and flail everywhere!") - M.drop_l_hand() - M.drop_r_hand() - M.adjustToxLoss(1) - ..() - return +/datum/reagent/fliptonium/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + M.visible_message("[M] can't seem to control their legs!") + M.confused += 33 + M.Weaken(2) + else if(effect <= 4) + M.visible_message("[M]'s hands flip out and flail everywhere!") + M.drop_l_hand() + M.drop_r_hand() + else if(effect <= 7) + M.emote("laugh") + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M]'s hands flip out and flail everywhere!") + M.drop_l_hand() + M.drop_r_hand() + else if (effect <= 4) + M.visible_message("[M] falls to the floor and flails uncontrollably!") + M.Jitter(5) + M.Weaken(5) + else if(effect <= 7) + M.emote("laugh") ////////////////////////////// // Synth-Drugs // @@ -445,7 +642,7 @@ ..() return -/datum/reagent/lube/ultra/overdose_process(var/mob/living/M as mob) +/datum/reagent/lube/ultra/overdose_process(var/mob/living/M as mob, severity) if(prob(20)) M.emote("ping") if(prob(33)) @@ -457,7 +654,6 @@ if(prob(50)) M.adjustFireLoss(10) M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) - return //Surge: Krokodil /datum/reagent/surge @@ -484,7 +680,7 @@ ..() return -/datum/reagent/surge/overdose_process(var/mob/living/M as mob) +/datum/reagent/surge/overdose_process(var/mob/living/M as mob, severity) //Hit them with the same effects as an electrode! M.Stun(5) M.Weaken(5) @@ -502,8 +698,6 @@ B.icon = I M.adjustFireLoss(rand(1,5)*REM) M.adjustBruteLoss(rand(1,5)*REM) - ..() - return /datum/chemical_reaction/surge name = "Surge" diff --git a/code/modules/reagents/newchem/food.dm b/code/modules/reagents/newchem/food.dm index 6dd18d307f7..e8b5ed3f681 100644 --- a/code/modules/reagents/newchem/food.dm +++ b/code/modules/reagents/newchem/food.dm @@ -10,8 +10,10 @@ datum/reagent/questionmark/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) if(!istype(M, /mob/living)) return if(method == INGEST) + M.Stun(2) M.Weaken(2) to_chat(M, "Ugh! Eating that was a terrible idea!") + M.ForceContractDisease(new /datum/disease/food_poisoning(0)) datum/reagent/egg name = "Egg" @@ -175,15 +177,12 @@ datum/reagent/mugwort/on_mob_life(var/mob/living/M as mob) metabolization_rate = 0.2 overdose_threshold = 133 -datum/reagent/porktonium/overdose_process(var/mob/living/M as mob) - if(volume > 133) - if(prob(15)) - M.reagents.add_reagent("cholesterol", rand(1,3)) - if(prob(8)) - M.reagents.add_reagent("radium", 15) - M.reagents.add_reagent("cyanide", 10) - ..() - return +/datum/reagent/porktonium/overdose_process(var/mob/living/M as mob, severity) + if(prob(15)) + M.reagents.add_reagent("cholesterol", rand(1,3)) + if(prob(8)) + M.reagents.add_reagent("radium", 15) + M.reagents.add_reagent("cyanide", 10) /datum/reagent/fungus name = "Space fungus" @@ -202,6 +201,7 @@ datum/reagent/fungus/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) M.reagents.add_reagent("toxin", rand(1,5)) else if(ranchance <= 5) to_chat(M, "That tasted absolutely FOUL.") + M.ForceContractDisease(new /datum/disease/food_poisoning(0)) else to_chat(M, "Yuck!") @@ -283,11 +283,10 @@ datum/reagent/cheese/reaction_turf(var/turf/T, var/volume) color = "#B2B139" overdose_threshold = 50 -/datum/reagent/fake_cheese/overdose_process(var/mob/living/M as mob) +/datum/reagent/fake_cheese/overdose_process(var/mob/living/M as mob, severity) if(prob(8)) to_chat(M, "You feel something squirming in your stomach. Your thoughts turn to cheese and you begin to sweat.") M.adjustToxLoss(rand(1,2)) - ..() /datum/reagent/weird_cheese name = "Weird cheese" @@ -442,7 +441,7 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume) ..() return -/datum/reagent/hydrogenated_soybeanoil/overdose_process(var/mob/living/M as mob) +/datum/reagent/hydrogenated_soybeanoil/overdose_process(var/mob/living/M as mob, severity) if(prob(33)) to_chat(M, "You feel horribly weak.") if(prob(10)) @@ -453,7 +452,6 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume) M.adjustOxyLoss(25) M.Stun(5) M.Paralyse(10) - ..() /datum/chemical_reaction/hydrogenated_soybeanoil name = "Partially hydrogenated space-soybean oil" @@ -603,3 +601,44 @@ datum/reagent/pepperoni/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vol if(!H.heart_attack) H.heart_attack = 1 ..() + +/datum/reagent/ghost_chili_juice + name = "Ghost chili juice" + id = "ghostchilijuice" + description = "Juice from the universe's hottest chilli. Do not consume." + reagent_state = LIQUID + color = "#FF7F32" + +/datum/reagent/ghost_chili_juice/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(M.reagents.has_reagent("milk")) + to_chat(M, "The milk stops the burning. Ahhh.") + M.reagents.del_reagent("milk") + M.reagents.del_reagent("ghostchilijuice") + return + if(prob(8)) + to_chat(M, "Oh god! Oh GODD!!") + if(prob(50)) + to_chat(M, "Your throat burns furiously!") + M.emote(pick("scream","cry","choke","gasp")) + M.Stun(1) + if(prob(8)) + to_chat(M, "Why!? WHY!?") + if(prob(8)) + to_chat(M, "ARGHHHH!") + if(prob(33)) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + to_chat(M, "Thank goodness. You're not sure how long you could have held out with heat that intense!") + M.reagents.del_reagent("ghostchilijuice") + return + if(prob(10)) + to_chat(M, "OH GOD OH GOD PLEASE NO!!") + if(M.on_fire) + M.adjust_fire_stacks(5) + if(prob(50)) + to_chat(M, "IT BURNS!!!!") + M.visible_message("[M] is consumed in flames!") + M.dust() + return + ..() \ No newline at end of file diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index 90980c3a421..aca5897735c 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -65,6 +65,7 @@ datum/reagent/salglu_solution description = "This saline and glucose solution can help stabilize critically injured patients and cleanse wounds." reagent_state = LIQUID color = "#C8A5DC" + penetrates_skin = 1 metabolization_rate = 0.15 datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob) @@ -170,7 +171,7 @@ datum/reagent/omnizine overdose_threshold = 30 addiction_chance = 5 -datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob) +/datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustToxLoss(-1*REM) M.adjustOxyLoss(-1*REM) @@ -181,13 +182,39 @@ datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/omnizine/overdose_process(var/mob/living/M as mob) - M.adjustToxLoss(3*REM) - M.adjustOxyLoss(3*REM) - M.adjustBruteLoss(3*REM) - M.adjustFireLoss(3*REM) - ..() - return +/datum/reagent/omnizine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) //lesser + M.stuttering += 1 + if(effect <= 1) + M.visible_message("[M] suddenly cluches their gut!") + M.emote("scream") + M.Stun(4) + M.Weaken(4) + else if(effect <= 3) + M.visible_message("[M] completely spaces out for a moment.") + M.confused += 15 + else if(effect <= 5) + M.visible_message("[M] stumbles and staggers.") + M.Dizzy(5) + M.Weaken(3) + else if(effect <= 7) + M.visible_message("[M] shakes uncontrollably.") + M.Jitter(30) + else if(severity == 2) // greater + if(effect <= 2) + M.visible_message("[M] suddenly cluches their gut!") + M.emote("scream") + M.Stun(7) + M.Weaken(7) + else if(effect <= 5) + M.visible_message("[M] jerks bolt upright, then collapses!") + M.Paralyse(5) + M.Weaken(4) + else if(effect <= 8) + M.visible_message("[M] stumbles and staggers.") + M.Dizzy(5) + M.Weaken(3) datum/reagent/calomel name = "Calomel" @@ -290,13 +317,6 @@ datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/sal_acid/overdose_process(var/mob/living/M as mob) - if(volume > 25) - if(prob(8)) - M.adjustToxLoss(rand(1,2)) - ..() - return - /datum/chemical_reaction/sal_acid name = "Salicyclic Acid" id = "sal_acid" @@ -361,17 +381,17 @@ datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob) mix_message = "The mixture rapidly turns into a dense pink liquid." mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' -datum/reagent/ephedrine +/datum/reagent/ephedrine name = "Ephedrine" id = "ephedrine" description = "Ephedrine is a plant-derived stimulant." reagent_state = LIQUID color = "#C8A5DC" metabolization_rate = 0.3 - overdose_threshold = 45 + overdose_threshold = 35 addiction_chance = 25 -datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob) +/datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.drowsyness = max(0, M.drowsyness-5) M.AdjustParalysis(-1) @@ -389,12 +409,26 @@ datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/ephedrine/overdose_process(var/mob/living/M as mob) - if(prob(33)) - M.adjustToxLoss(1*REM) - M.losebreath++ - ..() - return +/datum/reagent/ephedrine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 1) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 3) + M.emote(pick("groan","moan")) + if(effect <= 8) + M.emote("collapse") + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 5) + M.visible_message("[M.name] staggers and drools, their eyes bloodshot!") + M.Dizzy(2) + M.Weaken(3) + if(effect <= 15) + M.emote("collapse") /datum/chemical_reaction/ephedrine name = "Ephedrine" @@ -441,7 +475,7 @@ datum/reagent/morphine description = "A strong but highly addictive opiate painkiller with sedative side effects." reagent_state = LIQUID color = "#C8A5DC" - overdose_threshold = 30 + overdose_threshold = 20 addiction_chance = 50 shock_reduction = 50 @@ -464,16 +498,6 @@ datum/reagent/morphine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/morphine/overdose_process(var/mob/living/M as mob) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - M.Dizzy(1) - M.Jitter(1) - ..() - return - datum/reagent/oculine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(prob(80)) @@ -519,7 +543,7 @@ datum/reagent/atropine reagent_state = LIQUID color = "#000000" metabolization_rate = 0.2 - overdose_threshold = 35 + overdose_threshold = 25 datum/reagent/atropine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -541,14 +565,6 @@ datum/reagent/atropine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/atropine/overdose_process(var/mob/living/M as mob) - if(prob(50)) - M.adjustToxLoss(2*REM) - M.Dizzy(1) - M.Jitter(1) - ..() - return - /datum/chemical_reaction/atropine name = "Atropine" id = "atropine" @@ -564,7 +580,7 @@ datum/reagent/epinephrine reagent_state = LIQUID color = "#96B1AE" metabolization_rate = 0.2 - overdose_threshold = 30 + overdose_threshold = 20 datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -591,13 +607,26 @@ datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob) - if(prob(33)) - M.adjustStaminaLoss(5*REM) - M.adjustToxLoss(2*REM) - M.losebreath++ - ..() - return +/datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if (severity == 1) + if(effect <= 1) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 3) + M.emote(pick("groan","moan")) + if(effect <= 8) + M.emote("collapse") + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 5) + M.visible_message("[M] staggers and drools, their eyes bloodshot!") + M.Dizzy(2) + M.Weaken(3) + if(effect <= 15) + M.emote("collapse") /datum/chemical_reaction/epinephrine name = "Epinephrine" @@ -771,6 +800,7 @@ datum/reagent/stimulants/on_mob_life(var/mob/living/M as mob) M.adjustBruteLoss(-10*REM) M.adjustFireLoss(-10*REM) M.setStaminaLoss(0) + M.slowed = 0 M.dizziness = max(0,M.dizziness-10) M.drowsyness = max(0,M.drowsyness-10) M.confused = 0 @@ -812,13 +842,11 @@ datum/reagent/stimulants/reagent_deleted(var/mob/living/M as mob) M.adjustStaminaLoss(-5*REM) ..() -/datum/reagent/medicine/stimulative_agent/overdose_process(mob/living/M) +/datum/reagent/medicine/stimulative_agent/overdose_process(mob/living/M, severity) if(prob(33)) M.adjustStaminaLoss(2.5*REM) M.adjustToxLoss(1*REM) M.losebreath++ - ..() - return datum/reagent/insulin name = "Insulin" @@ -855,6 +883,7 @@ datum/reagent/teporone reagent_state = LIQUID color = "#D782E6" addiction_chance = 20 + overdose_threshold = 50 datum/reagent/teporone/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index 97516f916c9..8f3fa6204d2 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -51,14 +51,15 @@ continue //If you got this far, that means we can process whatever reagent this iteration is for. Handle things normally from here. if(M && R) + R.on_mob_life(M) if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) R.overdosed = 1 R.overdose_start(M) if(R.volume < R.overdose_threshold && R.overdosed) R.overdosed = 0 if(R.overdosed) - R.overdose_process(M) - R.on_mob_life(M) + R.overdose_process(M, R.volume >= R.overdose_threshold*2 ? 2 : 1) + for(var/A in addiction_list) var/datum/reagent/R = A if(M && R) @@ -117,8 +118,11 @@ return // Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects -/datum/reagent/proc/overdose_process(var/mob/living/M as mob) - return +/datum/reagent/proc/overdose_process(var/mob/living/M as mob, severity) + var/effect = rand(1, 100) - severity + if (effect <= 8) + M.adjustToxLoss(severity) + return effect /datum/reagent/proc/overdose_start(var/mob/living/M as mob) return diff --git a/code/modules/reagents/newchem/other.dm b/code/modules/reagents/newchem/other.dm index c26d8bbe983..7ef7dff6ff5 100644 --- a/code/modules/reagents/newchem/other.dm +++ b/code/modules/reagents/newchem/other.dm @@ -351,6 +351,52 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob) required_reagents = list("sodium" = 1, "hydrogen" = 1, "oxygen" = 1) result_amount = 3 +/datum/reagent/hugs + name = "Pure hugs" + id = "hugs" + description = "Hugs, in liquid form. Yes, the concept of a hug. As a liquid. This makes sense in the future." + reagent_state = LIQUID + color = "#FF97B9" + +/datum/reagent/love + name = "Pure love" + id = "love" + description = "What is this emotion you humans call \"love?\" Oh, it's this? This is it? Huh, well okay then, thanks." + reagent_state = LIQUID + color = "#FF83A5" + +/datum/reagent/love/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + to_chat(M, "You feel loved!") + +/datum/reagent/love/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + + if(M.a_intent == I_HARM) + M.a_intent = I_HELP + + if(prob(8)) + var/lovely_phrase = pick("appreciated", "loved", "pretty good", "really nice", "pretty happy with yourself, even though things haven't always gone as well as they could") + to_chat(M, "You feel [lovely_phrase].") + + else if(!M.restrained()) + for(var/mob/living/carbon/C in orange(1, M)) + if(C) + if(C == M) + continue + if(!C.stat) + M.visible_message("[M] gives [C] a [pick("hug","warm embrace")].") + playsound(get_turf(M), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + break + ..() + +/datum/chemical_reaction/love + name = "pure love" + id = "love" + result = "love" + required_reagents = list("hugs" = 1, "chocolate" = 1) + result_amount = 2 + mix_message = "The substance gives off a lovely scent!" + ///Alchemical Reagents datum/reagent/eyenewt diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index b602e282b1f..ae8b80ac1cd 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -55,23 +55,45 @@ ..() return -/datum/reagent/histamine/overdose_process(var/mob/living/M as mob) - if(prob(2)) - to_chat(M, "You feel mucus running down the back of your throat.") - M.adjustToxLoss(1) - M.jitteriness += 4 - M.emote("sneeze", "cough") - else if(prob(4)) - M.stuttering += rand(0,5) - if(prob(25)) - M.emote(pick("choke","gasp")) - M.adjustOxyLoss(5) - else if(prob(7)) - to_chat(M, "Your chest hurts!") - M.emote(pick("cough","gasp")) - M.adjustOxyLoss(3) - ..() - return +/datum/reagent/histamine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + to_chat(M, "You feel mucus running down the back of your throat.") + M.adjustToxLoss(1) + M.Jitter(4) + M.emote(pick("sneeze", "cough")) + else if(effect <= 4) + M.stuttering += rand(0,5) + if(prob(25)) + M.emote(pick("choke","gasp")) + M.adjustOxyLoss(5) + else if(effect <= 7) + to_chat(M, "Your chest hurts!") + M.emote(pick("cough","gasp")) + M.adjustOxyLoss(3) + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M] breaks out in hives!") + M.adjustBruteLoss(6) + else if(effect <= 4) + M.visible_message("[M] has a horrible coughing fit!") + M.Jitter(10) + M.stuttering += rand(0,5) + M.emote("cough") + if(prob(40)) + M.emote(pick("choke","gasp")) + M.adjustOxyLoss(6) + M.Weaken(8) + else if(effect <= 7) + to_chat(M, "Your heartbeat is pounding inside your head!") + M << 'sound/effects/singlebeat.ogg' + M.emote("collapse") + M.adjustOxyLoss(8) + M.adjustToxLoss(3) + M.Weaken(3) + M.emote(pick("choke", "gasp")) + to_chat(M, "You feel like you're dying!") /datum/reagent/formaldehyde name = "Formaldehyde" @@ -130,8 +152,6 @@ M.jitteriness += 1000 spawn(rand(20, 100)) M.gib() - ..() - return /datum/reagent/neurotoxin2 name = "Neurotoxin" @@ -377,6 +397,15 @@ ..() return +/datum/chemical_reaction/initropidril + name = "Initropidril" + id = "initropidril" + result = "initropidril" + required_reagents = list("crank" = 1, "histamine" = 1, "krokodil" = 1, "bath_salts" = 1, "atropine" = 1, "nicotine" = 1, "morphine" = 1) + result_amount = 4 + mix_message = "A sweet and sugary scent drifts from the unpleasant milky substance." + + /datum/reagent/concentrated_initro name = "Concentrated Initropidril" id = "concentrated_initro" @@ -627,6 +656,7 @@ color = "#C7C7C7" metabolization_rate = 0.1 penetrates_skin = 1 + overdose_threshold = 25 /datum/chemical_reaction/sarin name = "sarin" diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm index 2d85730193f..12e1a554edd 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -151,10 +151,8 @@ ..() return -/datum/reagent/ethanol/absinthe/overdose_process(mob/living/M) +/datum/reagent/ethanol/absinthe/overdose_process(mob/living/M, severity) M.adjustToxLoss(1) - ..() - return /datum/reagent/ethanol/rum name = "Rum" @@ -169,10 +167,8 @@ M.dizziness +=5 return -/datum/reagent/ethanol/rum/overdose_process(mob/living/M) +/datum/reagent/ethanol/rum/overdose_process(mob/living/M, severity) M.adjustToxLoss(1) - ..() - return /datum/reagent/ethanol/mojito name = "Mojito" diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm index 9daf9cb9ec1..45e0e2e8ac2 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm @@ -201,13 +201,10 @@ ..() return -/datum/reagent/drink/coffee/overdose_process(var/mob/living/M as mob) +/datum/reagent/drink/coffee/overdose_process(var/mob/living/M as mob, severity) if(volume > 45) M.Jitter(5) - ..() - return - /datum/reagent/drink/coffee/icecoffee name = "Iced Coffee" id = "icecoffee" diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm index 05a3fad7808..4c284d7d7cc 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_food.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_food.dm @@ -167,13 +167,11 @@ description = "Sodium chloride, common table salt." reagent_state = SOLID color = "#B1B0B0" + overdose_threshold = 100 -/datum/reagent/sodiumchloride/overdose_process(var/mob/living/M as mob) - if(volume > 100) - if(prob(70)) - M.adjustBrainLoss(1) - if(prob(8)) - M.adjustToxLoss(rand(1,2)) +/datum/reagent/sodiumchloride/overdose_process(var/mob/living/M as mob, severity) + if(prob(70)) + M.adjustBrainLoss(1) ..() return @@ -454,11 +452,9 @@ M.emote("collapse") ..() -/datum/reagent/sugar/overdose_process(var/mob/living/M as mob) - if(volume > 200) - M.Paralyse(3) - M.Weaken(4) - if(prob(8)) - M.adjustToxLoss(1) - ..() - return +/datum/reagent/sugar/overdose_process(var/mob/living/M as mob, severity) + M.Paralyse(3 * severity) + M.Weaken(4 * severity) + if(prob(8)) + M.adjustToxLoss(severity) + diff --git a/code/modules/reagents/oldchem/reagents/reagents_med.dm b/code/modules/reagents/oldchem/reagents/reagents_med.dm index 64e3b00936d..0a2fa0396bf 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_med.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_med.dm @@ -40,6 +40,7 @@ description = "Synaptizine is used to treat neuroleptic shock. Can be used to help remove disabling symptoms such as paralysis." reagent_state = LIQUID color = "#FA46FA" + overdose_threshold = 40 /datum/reagent/synaptizine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -53,6 +54,27 @@ ..() return +/datum/reagent/synaptizine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 1) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 3) + M.emote(pick("groan","moan")) + if(effect <= 8) + M.adjustToxLoss(1) + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 5) + M.visible_message("[M] staggers and drools, their eyes bloodshot!") + M.Dizzy(8) + M.Weaken(4) + if(effect <= 15) + M.adjustToxLoss(1) + /datum/reagent/mitocholide name = "Mitocholide" id = "mitocholide" @@ -114,12 +136,10 @@ ..() return -/datum/reagent/rezadone/overdose_process(mob/living/M) +/datum/reagent/rezadone/overdose_process(mob/living/M, severity) M.adjustToxLoss(1) M.Dizzy(5) M.Jitter(5) - ..() - return /datum/reagent/spaceacillin name = "Spaceacillin" diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index e2c8b5f0670..902892d3f7e 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -787,7 +787,7 @@ New() ..() reagents.add_reagent("nutriment", 6) - reagents.add_reagent("mannitol", 6) + reagents.add_reagent("prions", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/ghostburger @@ -1339,7 +1339,7 @@ New() ..() - reagents.add_reagent("????", 1) + reagents.add_reagent("????", 5) reagents.add_reagent("carbon", 3) bitesize = 2 diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index 3079a5286ec..ca4b15fc211 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -299,7 +299,7 @@ New() ..() - reagents.add_reagent(pick("polonium","initropidril","concentrated_initro","pancuronium","sodium_thiopental","ketamine","sulfonal","amanitin","coniine","curare","sarin","histamine","venom","cyanide","spidereggs","nanomachines"), 40) + reagents.add_reagent(pick_list("chemistry_tools.json", "traitor_poison_bottle"), 40) /obj/item/weapon/reagent_containers/glass/bottle/plasma name = "plasma dust bottle" diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 4301d393391..cb3737824e0 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -14,6 +14,7 @@ icon_state = "disposal" anchored = 1 density = 1 + on_blueprints = TRUE var/datum/gas_mixture/air_contents // internal reservoir var/mode = 1 // item mode 0=off 1=charging 2=charged var/flush = 0 // true if flush handle is pulled @@ -656,6 +657,7 @@ anchored = 1 density = 0 + on_blueprints = TRUE level = 1 // underfloor only var/dpdir = 0 // bitmask of pipe directions dir = 0 // dir will contain dominant direction for junction pipes diff --git a/code/modules/research/designs/spacepod_designs.dm b/code/modules/research/designs/spacepod_designs.dm index cd965caf540..c1927e47654 100644 --- a/code/modules/research/designs/spacepod_designs.dm +++ b/code/modules/research/designs/spacepod_designs.dm @@ -181,4 +181,29 @@ build_type = PODFAB materials = list(MAT_METAL=20000, MAT_GLASS=2000) build_path = /obj/item/device/spacepod_equipment/cargo/ore + category = list("Pod_Parts") + +////////////////////////////////////////// +//////SPACEPOD LOCK ITEMS//////////////// +////////////////////////////////////////// +/datum/design/pod_lock_keyed + construction_time = 100 + name = "Spacepod Tumbler Lock" + desc = "Allows for the construction of a tumbler style podlock." + id = "podlock_keyed" + req_tech = list("materials" = 1) //The most basic kind of locking system + build_type = PODFAB + materials = list(MAT_METAL=4500) + build_path = /obj/item/device/spacepod_equipment/lock/keyed + category = list("Pod_Parts") + +/datum/design/pod_key + construction_time = 100 + name = "Spacepod Tumbler Lock Key" + desc = "Allows for the construction of a blank key for a podlock." + id = "podkey" + req_tech = list("materials" = 1) //The most basic kind of locking system + build_type = PODFAB + materials = list(MAT_METAL=500) + build_path = /obj/item/device/spacepod_key category = list("Pod_Parts") \ No newline at end of file diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 1dd4857ddc7..64ad0c962fc 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -94,8 +94,8 @@ category = list("Weapons") /datum/design/lasercannon - name = "Laser Cannon" - desc = "A heavy duty laser cannon." + name = "Accelerator Laser Cannon" + desc = "A heavy duty laser cannon. It does more damage the farther away the target is." id = "lasercannon" req_tech = list("combat" = 4, "materials" = 3, "powerstorage" = 3) build_type = PROTOLATHE @@ -125,48 +125,6 @@ locked = 1 category = list("Weapons") -/datum/design/smg - name = "Nanotrasen Saber SMG" - desc = "A prototype weapon made using lightweight materials on a traditional frame, designed to fire standard 9mm rounds." - id = "smg" - req_tech = list("combat" = 4, "materials" = 3) - build_type = PROTOLATHE - materials = list(MAT_METAL = 8000, MAT_SILVER = 2000, MAT_DIAMOND = 1000) - build_path = /obj/item/weapon/gun/projectile/automatic/proto - locked = 1 - category = list("Weapons") - -/datum/design/mag_smg - name = "Saber Submachine Gun Magazine (9mm)" - desc = "A 30-round magazine for the Saber submachine gun." - id = "mag_smg" - req_tech = list("combat" = 4, "materials" = 3) - build_type = PROTOLATHE - materials = list(MAT_METAL = 2000) - build_path = /obj/item/ammo_box/magazine/smgm9mm - category = list("Weapons") - -/datum/design/mag_smg/ap_mag - name = "Saber Submachine Gun Magazine (9mmAP)" - desc = "A 30-round armour piercing magazine for the Saber submachine gun. Deals slightly less damage but bypasses most armor." - id = "mag_smg_ap" - materials = list(MAT_METAL = 3000, MAT_SILVER = 100) - build_path = /obj/item/ammo_box/magazine/smgm9mm/ap - -/datum/design/mag_smg/incin_mag - name = "Saber Submachine Gun Magazine (9mmIC)" - desc = "A 30-round incendiary round magazine for the Saber submachine gun. Deals significantly less damage but sets the target on fire." - id = "mag_smg_ic" - materials = list(MAT_METAL = 3000, MAT_SILVER = 100, MAT_GLASS = 400) - build_path = /obj/item/ammo_box/magazine/smgm9mm/fire - -/datum/design/mag_smg/incin_tox - name = "Saber Submachine Gun Magazine (9mmTX)" - desc = "A 30-round uranium tipped round magazine for the Saber submachine gun. Deals toxin damage, but less overall damage." - id = "mag_smg_tx" - materials = list(MAT_METAL = 3000, MAT_GLASS = 200, MAT_URANIUM = 1000) - build_path = /obj/item/ammo_box/magazine/smgm9mm/toxin - //WT550 Mags /datum/design/mag_oldsmg @@ -221,13 +179,13 @@ category = list("Weapons") /datum/design/stunrevolver - name = "Stun Revolver" - desc = "A high-tech revolver that fires internal, reusable stun cartidges in a revolving cylinder. The stun cartridges can be recharged using a conventional energy weapon recharger." + name = "Tesla Revolver" + desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers." id = "stunrevolver" - req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 2) + req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 4000, MAT_GLASS = 1000) - build_path = /obj/item/weapon/gun/energy/stunrevolver + materials = list(MAT_METAL = 10000, MAT_GLASS = 10000, MAT_SILVER = 10000) + build_path = /obj/item/weapon/gun/energy/shock_revolver locked = 1 category = list("Weapons") diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 16748fbb46b..3c8b89ea2a0 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -81,9 +81,9 @@ Note: Must be placed west/left of and R&D console to function. var/A = materials.amount(M) if(!A) A = reagents.get_reagent_amount(M) - A = A / max(1, (being_built.reagents[M]/efficiency_coeff)) + A = A / max(1, (being_built.reagents[M])) else - A = A / max(1, (being_built.materials[M]/efficiency_coeff)) + A = A / max(1, (being_built.materials[M])) return A /obj/machinery/r_n_d/protolathe/attackby(var/obj/item/O as obj, var/mob/user as mob, params) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 58c1cf7fe6f..9e8b29f94c1 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -171,7 +171,7 @@ proc/CallMaterialName(ID) return D.loc = src to_chat(user, "You add the disk to the machine!") - else + else if(!(linked_destroy && linked_destroy.busy) && !(linked_lathe && linked_lathe.busy) && !(linked_imprinter && linked_imprinter.busy)) ..() src.updateUsrDialog() return @@ -411,7 +411,7 @@ proc/CallMaterialName(ID) var/list/efficient_mats = list() for(var/MAT in being_built.materials) - efficient_mats[MAT] = being_built.materials[MAT] / coeff + efficient_mats[MAT] = being_built.materials[MAT] if(!linked_lathe.materials.has_materials(efficient_mats, amount)) src.visible_message("The [src.name] beeps, \"Not enough materials to complete prototype.\"") @@ -419,7 +419,7 @@ proc/CallMaterialName(ID) g2g = 0 else for(var/R in being_built.reagents) - if(!linked_lathe.reagents.has_reagent(R, being_built.reagents[R]/coeff)) + if(!linked_lathe.reagents.has_reagent(R, being_built.reagents[R])) src.visible_message("The [src.name] beeps, \"Not enough reagents to complete prototype.\"") enough_materials = 0 g2g = 0 @@ -427,7 +427,7 @@ proc/CallMaterialName(ID) if(enough_materials) linked_lathe.materials.use_amount(efficient_mats, amount) for(var/R in being_built.reagents) - linked_lathe.reagents.remove_reagent(R, being_built.reagents[R]/coeff) + linked_lathe.reagents.remove_reagent(R, being_built.reagents[R]) var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. var/O = being_built.locked @@ -439,8 +439,7 @@ proc/CallMaterialName(ID) new_item.investigate_log("built by [key]","singulo") new_item.reliability = 100 if(!istype(new_item, /obj/item/stack/sheet)) // To avoid materials dupe glitches - new_item.materials[MAT_METAL] /= coeff - new_item.materials[MAT_GLASS] /= coeff + new_item.materials = efficient_mats.Copy() if(O) var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc) new_item.loc = L @@ -873,7 +872,6 @@ proc/CallMaterialName(ID) dat += "Material Amount: [linked_lathe.materials.total_amount] / [linked_lathe.materials.max_amount]
" dat += "Chemical Volume: [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]
" - var/coeff = linked_lathe.efficiency_coeff for(var/datum/design/D in files.known_designs) if(!(selected_category in D.category)|| !(D.build_type & PROTOLATHE)) continue @@ -884,9 +882,9 @@ proc/CallMaterialName(ID) t = linked_lathe.check_mat(D, M) temp_material += " | " if (t < 1) - temp_material += "[D.materials[M]/coeff] [CallMaterialName(M)]" + temp_material += "[D.materials[M]] [CallMaterialName(M)]" else - temp_material += " [D.materials[M]/coeff] [CallMaterialName(M)]" + temp_material += " [D.materials[M]] [CallMaterialName(M)]" c = min(c,t) @@ -894,9 +892,9 @@ proc/CallMaterialName(ID) t = linked_lathe.check_mat(D, R) temp_material += " | " if (t < 1) - temp_material += "[D.reagents[R]/coeff] [CallMaterialName(R)]" + temp_material += "[D.reagents[R]] [CallMaterialName(R)]" else - temp_material += " [D.reagents[R]/coeff] [CallMaterialName(R)]" + temp_material += " [D.reagents[R]] [CallMaterialName(R)]" c = min(c,t) if (c >= 1) @@ -920,7 +918,6 @@ proc/CallMaterialName(ID) dat += "Material Amount: [linked_lathe.materials.total_amount] / [linked_lathe.materials.max_amount]
" dat += "Chemical Volume: [linked_lathe.reagents.total_volume] / [linked_lathe.reagents.maximum_volume]
" - var/coeff = linked_lathe.efficiency_coeff for(var/datum/design/D in matching_designs) var/temp_material var/c = 50 @@ -929,18 +926,18 @@ proc/CallMaterialName(ID) t = linked_lathe.check_mat(D, M) temp_material += " | " if (t < 1) - temp_material += "[D.materials[M]/coeff] [CallMaterialName(M)]" + temp_material += "[D.materials[M]] [CallMaterialName(M)]" else - temp_material += " [D.materials[M]/coeff] [CallMaterialName(M)]" + temp_material += " [D.materials[M]] [CallMaterialName(M)]" c = min(c,t) for(var/R in D.reagents) t = linked_lathe.check_mat(D, R) temp_material += " | " if (t < 1) - temp_material += "[D.reagents[R]/coeff] [CallMaterialName(R)]" + temp_material += "[D.reagents[R]] [CallMaterialName(R)]" else - temp_material += " [D.reagents[R]/coeff] [CallMaterialName(R)]" + temp_material += " [D.reagents[R]] [CallMaterialName(R)]" c = min(c,t) if (c >= 1) diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index e06a5f9a18d..b85d63fac2b 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -199,27 +199,27 @@ interpreter.SetProc("tostring", /proc/n_num2str) interpreter.SetProc("sqrt", /proc/n_sqrt) interpreter.SetProc("abs", /proc/n_abs) - interpreter.SetProc("floor", /proc/Floor) - interpreter.SetProc("ceil", /proc/Ceiling) + interpreter.SetProc("floor", /proc/n_floor) + interpreter.SetProc("ceil", /proc/n_ceiling) interpreter.SetProc("round", /proc/n_round) interpreter.SetProc("clamp", /proc/n_clamp) - interpreter.SetProc("inrange", /proc/IsInRange) + interpreter.SetProc("inrange", /proc/n_isInRange) interpreter.SetProc("rand", /proc/rand_chance) interpreter.SetProc("arctan", /proc/Atan2) - interpreter.SetProc("lcm", /proc/Lcm) + interpreter.SetProc("lcm", /proc/n_lcm) interpreter.SetProc("gcd", /proc/Gcd) interpreter.SetProc("mean", /proc/Mean) - interpreter.SetProc("root", /proc/Root) + interpreter.SetProc("root", /proc/n_root) interpreter.SetProc("sin", /proc/n_sin) interpreter.SetProc("cos", /proc/n_cos) interpreter.SetProc("arcsin", /proc/n_asin) interpreter.SetProc("arccos", /proc/n_acos) - interpreter.SetProc("tan", /proc/Tan) - interpreter.SetProc("csc", /proc/Csc) - interpreter.SetProc("cot", /proc/Cot) - interpreter.SetProc("sec", /proc/Sec) - interpreter.SetProc("todegrees", /proc/ToDegrees) - interpreter.SetProc("toradians", /proc/ToRadians) + interpreter.SetProc("tan", /proc/n_tan) + interpreter.SetProc("csc", /proc/n_csc) + interpreter.SetProc("cot", /proc/n_cot) + interpreter.SetProc("sec", /proc/n_sec) + interpreter.SetProc("todegrees", /proc/n_toDegrees) + interpreter.SetProc("toradians", /proc/n_toRadians) interpreter.SetProc("lerp", /proc/Lerp) interpreter.SetProc("max", /proc/n_max) interpreter.SetProc("min", /proc/n_min) diff --git a/code/modules/scripting/Implementations/_Logic.dm b/code/modules/scripting/Implementations/_Logic.dm index a97fc320e0e..6befaa6f0eb 100644 --- a/code/modules/scripting/Implementations/_Logic.dm +++ b/code/modules/scripting/Implementations/_Logic.dm @@ -221,13 +221,13 @@ proc/n_abs(var/num) proc/n_floor(var/num) //writepanic("[__FILE__].[__LINE__] \\/proc/n_floor() called tick#: [world.time]") if(isnum(num)) - return round(num) + return Floor(num) // Round up -proc/n_ceil(var/num) +proc/n_ceiling(var/num) //writepanic("[__FILE__].[__LINE__] \\/proc/n_ceil() called tick#: [world.time]") if(isnum(num)) - return round(num)+1 + return Ceiling(num) // Round to nearest integer proc/n_round(var/num) @@ -235,22 +235,61 @@ proc/n_round(var/num) if(isnum(num)) if(num-round(num)<0.5) return round(num) - return n_ceil(num)\ + return Ceiling(num) // END OF BY DONKIE :( /proc/n_sin(var/const/x) - return sin(x) + if(isnum(x)) + return sin(x) /proc/n_cos(var/const/x) - return cos(x) + if(isnum(x)) + return cos(x) + +/proc/n_tan(var/const/x) + if(isnum(x)) + return Tan(x) + +/proc/n_csc(var/const/x) + if(isnum(x)) + return Csc(x) + +/proc/n_cot(var/const/x) + if(isnum(x)) + return Cot(x) + +/proc/n_sec(var/const/x) + if(isnum(x)) + return Sec(x) /proc/n_asin(var/const/x) - return arcsin(x) + if(isnum(x)) + return arcsin(x) /proc/n_acos(var/const/x) - return arccos(x) + if(isnum(x)) + return arccos(x) +/proc/n_isInRange(var/const/x, var/const/min, var/const/max) + if(isnum(x) && isnum(min) && isnum(max)) + return IsInRange(x, min, max) + +/proc/n_lcm(var/const/a, var/const/b) + if(isnum(a) && isnum(b)) + return Lcm(a, b) + +/proc/n_root(var/const/n, var/const/x) + if(isnum(n) && isnum(x)) + return Root(n, x) + +/proc/n_toDegrees(var/const/x) + if(isnum(x)) + return ToDegrees(x) + +/proc/n_toRadians(var/const/x) + if(isnum(x)) + return ToRadians(x) /proc/n_max(...) return max(arglist(args)) diff --git a/code/modules/store/items.dm b/code/modules/store/items.dm index 489caa96a91..c67ed43fd92 100644 --- a/code/modules/store/items.dm +++ b/code/modules/store/items.dm @@ -171,6 +171,12 @@ typepath = /obj/item/flag/species/vulp cost = 1000 +/datum/storeitem/flag_drask + name = "Drask flag" + desc = "A flag proudly proclaiming the superior heritage of Drask." + typepath = /obj/item/flag/species/drask + cost = 1000 + /datum/storeitem/flag_ian name = "Ian flag" desc = "The banner of Ian, because SQUEEEEE." diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 6a6a7e8b7fe..82cda80e494 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -175,6 +175,11 @@ to_chat(user, "Central command would kill you if you implanted the disk into someone.") return 0//fail + var/obj/item/weapon/disk/nuclear/datdisk = locate() in tool + if(datdisk) + to_chat(user, "Central command would kill you if you implanted the disk into someone. Even if in a box. Especially in a box.") + return 0//fail + if(istype(tool,/obj/item/organ)) to_chat(user, "This isn't the type of surgery for organ transplants!") return 0//fail diff --git a/html/changelog.html b/html/changelog.html index c75d79b920c..ee1e84b1671 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,93 @@ -->
+

04 May 2016

+

CrAzYPiLoT updated:

+
    +
  • Adds gameboards to bar and permabrig.
  • +
+

Crazylemon64 updated:

+
    +
  • AIs are no longer created for temporary messages.
  • +
+

Fethas updated:

+
    +
  • Sniper Rifles for nuke ops
  • +
  • you can now actually shove heads on spears again
  • +
  • Before i removed the traitor chemist item i cleaned up the harm reaction code paths.
  • +
+

FlattestGuitar updated:

+
    +
  • cheap lighters only damage your hand if you fail to properly use such a complicated contraption, not the whole body
  • +
  • ports /tg/ Foam Force guns, now you can shoot foam at your enemies /with style/
  • +
+

Fox McCloud updated:

+
    +
  • Slime batteries now self-recharge.
  • +
  • Adds in door wands--control doors from range
  • +
  • Each head of staff (and the QM) starts off with a door wand to control the doors in their respective departments
  • +
  • Fixes nutrition alert icon kicking in too early
  • +
  • Adds in a new hairstyle
  • +
  • Fixes cig icons not updating under some circumstances
  • +
  • Updates the Tesla; it will now have to be "fed" or it can run out of energy; the rate at which it gains additional energy balls and power has been greatly lowered.
  • +
  • energy ball will now be drawn towards the singularity beacon
  • +
  • fuel tank explosions a bit stronger and will arc tesla blasts further
  • +
  • Tweaked some game mode population requirements to enhance general game mode balance and player experience.
  • +
  • Reworks overdosing to have more unique effects and also scale, in part, on volume
  • +
  • Epinephrine, Atropine, and Ephedrine have a lower OD threshold
  • +
  • Saline penetrates the skin
  • +
  • Synaptizine and Teporone now have OD threshold
  • +
  • Adds in berserker disease (treat with haloperidol)
  • +
  • Adds in Jenkem, a nasty gross drug made with toilet water
  • +
  • Adds in food poisoning; get it from eating poorly made food, from salmonella, or fungus
  • +
  • Adds in the Shock Revolver, a replacement for the stun revolver remove: removes the stun revolver remove: removes the prototype SMG+ammo from the protolathe
  • +
+

IK3I updated:

+
    +
  • Can no longer holster items with No-Drop active.
  • +
  • Saves prosthesis users from Tox-Comp's wrath
  • +
+

KasparoVy updated:

+
    +
  • Disembodied prosthetic heads that aren't monitors won't make you go bald when they're re-attached.
  • +
  • 'Optic' markings will disappear when your head gets removed, and reappear if it gets re-attached.
  • +
  • Disembodied prosthetic heads that aren't monitors will now be rendered with hair & facial hair.
  • +
  • Disembodied prosthetic heads with optical markings (markings with the head set as the origin) will be rendered with those markings.
  • +
  • Animated hair styles (e.g. screens) and head accessories (e.g. 2/3 new antennae) will now be animated properly.
  • +
  • 3 more antennae.
  • +
  • An alt. and monitor head model for every prosthetic brand but Zeng-hu. Morpheus only gets an alt model, not another monitor.
  • +
  • Animated optical markings to fit the new alt. heads.
  • +
  • Screen styles for the alt. Hesphiastos head.
  • +
  • Companies that make prosthetic body parts can (and do) now offer separate models for qualified recipients.
  • +
  • Removed the frames from screen styles in order to allow the same styles to be applied to all monitor heads.
  • +
+

LittleBigKid2000 updated:

+
    +
  • Booze dispensers can now dispense synthanol
  • +
+

Norgad updated:

+
    +
  • Adds a disposals chute to the Mechanic's Workshop
  • +
+

QuinnAggeler updated:

+
    +
  • Adds the Drask as a 30KP race
  • +
  • Adds their language, Orluum
  • +
  • Adds a stylecolor for their language
  • +
  • Adds their butts (for photocopying)
  • +
  • Adds, at last, another race with skin tone (humies move over)
  • +
  • Adds a reason to make bad ice puns
  • +
  • Adds a check for brain death (brain damage of 120 or more) to the proc responsible for reviving IPCs
  • +
+

pinatacolada updated:

+
    +
  • Makes fridge boards be selectable by screwdriving them
  • +
  • Virology fridge now accepts syringes, beakers, and bottles
  • +
  • Plasmamen security now spawn with their suit slot items in their bags
  • +
  • Pod pilots spawn with taser in the suit slot
  • +
  • removes armor from plasmamen magistrate suits
  • +
+

25 April 2016

CrAzYPiLoT updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index ccb9d83a458..66e0b3c205f 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1339,3 +1339,86 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Refactored how objects (IE, stuff you pick up) is rendered to the HUD. This should fix the reoccuring "stuff on my screen that definately isn't meant to be there" bug, but keep an eye out for things that do not appear. +2016-05-04: + CrAzYPiLoT: + - rscadd: Adds gameboards to bar and permabrig. + Crazylemon64: + - bugfix: AIs are no longer created for temporary messages. + Fethas: + - rscadd: Sniper Rifles for nuke ops. + - bugfix: you can now actually shove heads on spears again. + - tweak: Before i removed the traitor chemist item i cleaned up the harm reaction + code paths. + FlattestGuitar: + - tweak: cheap lighters only damage your hand if you fail to properly use such a + complicated contraption, not the whole body + - rscadd: ports /tg/ Foam Force guns, now you can shoot foam at your enemies /with + style/ + Fox McCloud: + - rscadd: Slime batteries now self-recharge. + - rscadd: Adds in door wands--control doors from range + - rscadd: Each head of staff (and the QM) starts off with a door wand to control + the doors in their respective departments + - bugfix: Fixes nutrition alert icon kicking in too early + - rscadd: Adds in a new hairstyle + - bugfix: Fixes cig icons not updating under some circumstances + - tweak: Updates the Tesla; it will now have to be "fed" or it can run out of energy; + the rate at which it gains additional energy balls and power has been greatly + lowered. + - tweak: energy ball will now be drawn towards the singularity beacon + - tweak: fuel tank explosions a bit stronger and will arc tesla blasts further + - tweak: Tweaked some game mode population requirements to enhance general game + mode balance and player experience. + - tweak: Reworks overdosing to have more unique effects and also scale, in part, + on volume + - tweak: Epinephrine, Atropine, and Ephedrine have a lower OD threshold + - tweak: Saline penetrates the skin + - tweak: Synaptizine and Teporone now have OD threshold + - rscadd: Adds in berserker disease (treat with haloperidol) + - rscadd: Adds in Jenkem, a nasty gross drug made with toilet water + - rscadd: Adds in food poisoning; get it from eating poorly made food, from salmonella, + or fungus + - rscadd: 'Adds in the Shock Revolver, a replacement for the stun revolver remove: + removes the stun revolver remove: removes the prototype SMG+ammo from the protolathe' + IK3I: + - bugfix: Can no longer holster items with No-Drop active. + - bugfix: Saves prosthesis users from Tox-Comp's wrath + KasparoVy: + - bugfix: Disembodied prosthetic heads that aren't monitors won't make you go bald + when they're re-attached. + - bugfix: '''Optic'' markings will disappear when your head gets removed, and reappear + if it gets re-attached.' + - bugfix: Disembodied prosthetic heads that aren't monitors will now be rendered + with hair & facial hair. + - bugfix: Disembodied prosthetic heads with optical markings (markings with the + head set as the origin) will be rendered with those markings. + - bugfix: Animated hair styles (e.g. screens) and head accessories (e.g. 2/3 new + antennae) will now be animated properly. + - rscadd: 3 more antennae. + - rscadd: An alt. and monitor head model for every prosthetic brand but Zeng-hu. + Morpheus only gets an alt model, not another monitor. + - rscadd: Animated optical markings to fit the new alt. heads. + - rscadd: Screen styles for the alt. Hesphiastos head. + - tweak: Companies that make prosthetic body parts can (and do) now offer separate + models for qualified recipients. + - tweak: Removed the frames from screen styles in order to allow the same styles + to be applied to all monitor heads. + LittleBigKid2000: + - rscadd: Booze dispensers can now dispense synthanol + Norgad: + - rscadd: Adds a disposals chute to the Mechanic's Workshop + QuinnAggeler: + - rscadd: Adds the Drask as a 30KP race + - rscadd: Adds their language, Orluum + - rscadd: Adds a stylecolor for their language + - rscadd: Adds their butts (for photocopying) + - rscadd: Adds, at last, another race with skin tone (humies move over) + - rscadd: Adds a reason to make bad ice puns + - bugfix: Adds a check for brain death (brain damage of 120 or more) to the proc + responsible for reviving IPCs + pinatacolada: + - tweak: Makes fridge boards be selectable by screwdriving them + - bugfix: Virology fridge now accepts syringes, beakers, and bottles + - bugfix: Plasmamen security now spawn with their suit slot items in their bags + - tweak: Pod pilots spawn with taser in the suit slot + - tweak: removes armor from plasmamen magistrate suits diff --git a/html/changelogs/AutoChangeLog-pr-4187.yml b/html/changelogs/AutoChangeLog-pr-4187.yml deleted file mode 100644 index 255f347d71c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4187.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: QuinnAggeler -delete-after: True -changes: - - rscadd: "Adds the Drask as a 30KP race" - - rscadd: "Adds their language, Orluum" - - rscadd: "Adds a stylecolor for their language" - - rscadd: "Adds their butts (for photocopying)" - - rscadd: "Adds, at last, another race with skin tone (humies move over)" - - rscadd: "Adds a reason to make bad ice puns" diff --git a/html/changelogs/AutoChangeLog-pr-4189.yml b/html/changelogs/AutoChangeLog-pr-4189.yml deleted file mode 100644 index ae3c546108d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4189.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Slime batteries now self-recharge." diff --git a/html/changelogs/AutoChangeLog-pr-4246.yml b/html/changelogs/AutoChangeLog-pr-4246.yml deleted file mode 100644 index 15a4ad175ea..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4246.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: FlattestGuitar -delete-after: True -changes: - - tweak: "cheap lighters only damage your hand if you fail to properly use such a complicated contraption, not the whole body" diff --git a/html/changelogs/AutoChangeLog-pr-4258.yml b/html/changelogs/AutoChangeLog-pr-4258.yml deleted file mode 100644 index c8511011210..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4258.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: pinatacolada -delete-after: True -changes: - - tweak: "Makes fridge boards be selectable by screwdriving them" - - bugfix: "Virology fridge now accepts syringes, beakers, and bottles" diff --git a/html/changelogs/AutoChangeLog-pr-4262.yml b/html/changelogs/AutoChangeLog-pr-4262.yml deleted file mode 100644 index 72bc64e4537..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4262.yml +++ /dev/null @@ -1,14 +0,0 @@ -author: KasparoVy -delete-after: True -changes: - - bugfix: "Disembodied prosthetic heads that aren't monitors won't make you go bald when they're re-attached." - - bugfix: "'Optic' markings will disappear when your head gets removed, and reappear if it gets re-attached." - - bugfix: "Disembodied prosthetic heads that aren't monitors will now be rendered with hair & facial hair." - - bugfix: "Disembodied prosthetic heads with optical markings (markings with the head set as the origin) will be rendered with those markings." - - bugfix: "Animated hair styles (e.g. screens) and head accessories (e.g. 2/3 new antennae) will now be animated properly." - - rscadd: "3 more antennae." - - rscadd: "An alt. and monitor head model for every prosthetic brand but Zeng-hu. Morpheus only gets an alt model, not another monitor." - - rscadd: "Animated optical markings to fit the new alt. heads." - - rscadd: "Screen styles for the alt. Hesphiastos head." - - tweak: "Companies that make prosthetic body parts can (and do) now offer separate models for qualified recipients." - - tweak: "Removed the frames from screen styles in order to allow the same styles to be applied to all monitor heads." diff --git a/html/changelogs/AutoChangeLog-pr-4270.yml b/html/changelogs/AutoChangeLog-pr-4270.yml deleted file mode 100644 index c46542d69f8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4270.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: FlattestGuitar -delete-after: True -changes: - - rscadd: "ports /tg/ Foam Force guns, now you can shoot foam at your enemies /with style/" diff --git a/html/changelogs/AutoChangeLog-pr-4282.yml b/html/changelogs/AutoChangeLog-pr-4282.yml deleted file mode 100644 index 1049f7ff047..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4282.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: QuinnAggeler -delete-after: True -changes: - - bugfix: "Adds a check for brain death (brain damage of 120 or more) to the proc responsible for reviving IPCs" diff --git a/html/changelogs/AutoChangeLog-pr-4285.yml b/html/changelogs/AutoChangeLog-pr-4285.yml deleted file mode 100644 index 3bdc7140b0d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4285.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Norgad -delete-after: True -changes: - - rscadd: "Adds a disposals chute to the Mechanic's Workshop" diff --git a/html/changelogs/AutoChangeLog-pr-4287.yml b/html/changelogs/AutoChangeLog-pr-4287.yml new file mode 100644 index 00000000000..1b71df9e0e0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4287.yml @@ -0,0 +1,7 @@ +author: Fox McCloud +delete-after: True +changes: + - tweak: "Removes material efficiency upgrades from the mech fab and protolathe" + - tweak: "Ore redemption machine sheets/points per ore scaled from 1 up to 2 (down from 1 up to 4)" + - bugfix: "Fixes materials exploit duplication" + - bugfix: "Fixes the protolathe locking up under some circumstances" diff --git a/html/changelogs/AutoChangeLog-pr-4288.yml b/html/changelogs/AutoChangeLog-pr-4288.yml deleted file mode 100644 index dd83c5181da..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4288.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Adds in door wands--control doors from range" - - rscadd: "Each head of staff (and the QM) starts off with a door wand to control the doors in their respective departments" diff --git a/html/changelogs/AutoChangeLog-pr-4289.yml b/html/changelogs/AutoChangeLog-pr-4289.yml deleted file mode 100644 index 5f64706be9e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4289.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: pinatacolada -delete-after: True -changes: - - bugfix: "Plasmamen security now spawn with their suit slot items in their -bags" - - tweak: "Pod pilots spawn with taser in the suit slot" - - tweak: "removes armor from plasmamen magistrate suits" diff --git a/html/changelogs/AutoChangeLog-pr-4292.yml b/html/changelogs/AutoChangeLog-pr-4292.yml deleted file mode 100644 index 3a713925e7a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4292.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes nutrition alert icon kicking in too early" diff --git a/html/changelogs/AutoChangeLog-pr-4301.yml b/html/changelogs/AutoChangeLog-pr-4301.yml new file mode 100644 index 00000000000..29f13eefb87 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4301.yml @@ -0,0 +1,9 @@ +author: IK3I +delete-after: True +changes: + - rscadd: "Added key and tumbler based pod locks" + - rscadd: "Made Pod Locks and keys buildable in Pod Fabricator" + - rscadd: "Made Pod Keys recoverable from cryo" + - rscadd: "Added lock to Security Pod" + - rscadd: "Added a key for Security Pod to HoS and Pod Pilot Offices" + - rscadd: "New sprites for several pieces of pod equipment" diff --git a/html/changelogs/AutoChangeLog-pr-4304.yml b/html/changelogs/AutoChangeLog-pr-4304.yml deleted file mode 100644 index 3b681f593b5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4304.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Fethas -delete-after: True -changes: - - rscadd: "Sniper Rifles for nuke ops -bugfix:you can now actually shove heads on spears again -tweak:Before i removed the traitor chemist item i cleaned up the harm reaction code paths." diff --git a/html/changelogs/AutoChangeLog-pr-4305.yml b/html/changelogs/AutoChangeLog-pr-4305.yml deleted file mode 100644 index 9a106ed3dac..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4305.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: LittleBigKid2000 -delete-after: True -changes: - - rscadd: "Booze dispensers can now dispense synthanol" diff --git a/html/changelogs/AutoChangeLog-pr-4312.yml b/html/changelogs/AutoChangeLog-pr-4312.yml deleted file mode 100644 index 39e34c71d97..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4312.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: CrAzYPiLoT -delete-after: True -changes: - - rscadd: "Adds gameboards to bar and permabrig." diff --git a/html/changelogs/AutoChangeLog-pr-4314.yml b/html/changelogs/AutoChangeLog-pr-4314.yml deleted file mode 100644 index 6fc6f3b0cf0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4314.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Crazylemon64 -delete-after: True -changes: - - bugfix: "AIs are no longer created for temporary messages." diff --git a/html/changelogs/AutoChangeLog-pr-4315.yml b/html/changelogs/AutoChangeLog-pr-4315.yml deleted file mode 100644 index cf4627fd1ce..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4315.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: IK3I -delete-after: True -changes: - - bugfix: "Can no longer holster items with No-Drop active." diff --git a/html/changelogs/AutoChangeLog-pr-4320.yml b/html/changelogs/AutoChangeLog-pr-4320.yml deleted file mode 100644 index a551cbb937e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4320.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: IK3I -delete-after: True -changes: - - bugfix: "Saves prosthesis users from Tox-Comp's wrath" diff --git a/html/changelogs/AutoChangeLog-pr-4321.yml b/html/changelogs/AutoChangeLog-pr-4321.yml deleted file mode 100644 index 29121e27cb2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4321.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes cig icons not updating under some circumstances" diff --git a/html/changelogs/AutoChangeLog-pr-4328.yml b/html/changelogs/AutoChangeLog-pr-4328.yml deleted file mode 100644 index aae7be2280d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4328.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - tweak: "Updates the Tesla; it will now have to be \"fed\" or it can run out of energy; the rate at which it gains additional energy balls and power has been greatly lowered." - - tweak: "energy ball will now be drawn towards the singularity beacon" - - tweak: "fuel tank explosions a bit stronger and will arc tesla blasts further" diff --git a/html/changelogs/AutoChangeLog-pr-4339.yml b/html/changelogs/AutoChangeLog-pr-4339.yml new file mode 100644 index 00000000000..19c41130016 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4339.yml @@ -0,0 +1,4 @@ +author: FlattestGuitar +delete-after: True +changes: + - tweak: "Robots now slur and stutter robotically" diff --git a/html/changelogs/AutoChangeLog-pr-4343.yml b/html/changelogs/AutoChangeLog-pr-4343.yml new file mode 100644 index 00000000000..d681f61d173 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4343.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - tweak: "Updates the laser cannon to be range based: the further its projectile travels, the more damage it does. Base damage greatly reduced." diff --git a/html/changelogs/AutoChangeLog-pr-4353.yml b/html/changelogs/AutoChangeLog-pr-4353.yml new file mode 100644 index 00000000000..3507a4153f6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4353.yml @@ -0,0 +1,7 @@ +author: Fox McCloud +delete-after: True +changes: + - tweak: "removes fungus from mushrooms" + - tweak: "adds fungus to \"mold\" plant" + - tweak: "adds mold seeds to hydro vendor" + - tweak: "bumps up ???? reagent from 1 to 5 on bad recipes" diff --git a/html/changelogs/AutoChangeLog-pr-4356.yml b/html/changelogs/AutoChangeLog-pr-4356.yml new file mode 100644 index 00000000000..357e2b7a393 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4356.yml @@ -0,0 +1,5 @@ +author: FalseIncarnate +delete-after: True +changes: + - rscadd: "Adds a Briefcase Full of Bees as a Botanist-only traitor item (10 TC)" + - bugfix: "Fixes worker bees having an insatiable desire to murder bots. (Syndi-bees still murder them though)" diff --git a/html/changelogs/AutoChangeLog-pr-4357.yml b/html/changelogs/AutoChangeLog-pr-4357.yml new file mode 100644 index 00000000000..24e86b79fdf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4357.yml @@ -0,0 +1,10 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Adds in 3 disease: Grave Fever, Space Kuru, and Non-contagious GBS" + - rscadd: "Adds Reagent to cause Space Kuru and Non-contagious GBS to traitor poison bottles" + - rscadd: "Initropidril now has a recipe" + - rscadd: "Adds a number of new reagents" + - tweak: "Brain burgers now contain prions instead of mannitol" + - tweak: "Scientists and chemists can no longer purchase traitor poison bottles" + - tweak: "random drug bottles now have a much wider range of reagents in them" diff --git a/html/changelogs/AutoChangeLog-pr-4362.yml b/html/changelogs/AutoChangeLog-pr-4362.yml new file mode 100644 index 00000000000..4901b08cd2c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4362.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes UI On slot machine saying it costs 5 credits when it's 10" diff --git a/html/changelogs/AutoChangeLog-pr-4293.yml b/html/changelogs/AutoChangeLog-pr-4363.yml similarity index 53% rename from html/changelogs/AutoChangeLog-pr-4293.yml rename to html/changelogs/AutoChangeLog-pr-4363.yml index 5b13e9b5f93..8e1c8ac2686 100644 --- a/html/changelogs/AutoChangeLog-pr-4293.yml +++ b/html/changelogs/AutoChangeLog-pr-4363.yml @@ -1,4 +1,4 @@ author: Fox McCloud delete-after: True changes: - - rscadd: "Adds in a new hairstyle" + - bugfix: "Fixes abductors having tails" diff --git a/html/changelogs/AutoChangeLog-pr-4364.yml b/html/changelogs/AutoChangeLog-pr-4364.yml new file mode 100644 index 00000000000..0b074450742 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4364.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes traitor scissors having a different hair-cutting sound" diff --git a/html/changelogs/AutoChangeLog-pr-4371.yml b/html/changelogs/AutoChangeLog-pr-4371.yml new file mode 100644 index 00000000000..fe68d555a06 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4371.yml @@ -0,0 +1,4 @@ +author: tigercat2000 +delete-after: True +changes: + - rscadd: "The station blueprints can now show you where wires/pipes/disposal pipes are supposed to go." diff --git a/html/changelogs/AutoChangeLog-pr-4376.yml b/html/changelogs/AutoChangeLog-pr-4376.yml new file mode 100644 index 00000000000..5ab71a8cf8b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4376.yml @@ -0,0 +1,4 @@ +author: IK3I +delete-after: True +changes: + - bugfix: "Using a multitool on a decalock now gives usable info" diff --git a/html/changelogs/AutoChangeLog-pr-4377.yml b/html/changelogs/AutoChangeLog-pr-4377.yml new file mode 100644 index 00000000000..ae7392a8235 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4377.yml @@ -0,0 +1,7 @@ +author: QuinnAggeler +delete-after: True +changes: + - rscadd: "Adds a sound emote for the Drask" + - rscadd: "Gives Drask the ability to eat soap" + - rscadd: "Adds a racial flag for the Drask" + - bugfix: "Makes syndicate, paramedic, clown, and EVA helmets display correctly on Drask" diff --git a/html/changelogs/AutoChangeLog-pr-4379.yml b/html/changelogs/AutoChangeLog-pr-4379.yml new file mode 100644 index 00000000000..2a0aef9f39e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4379.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - bugfix: "Ragin' Mage creation works correctly again." diff --git a/html/changelogs/AutoChangeLog-pr-4380.yml b/html/changelogs/AutoChangeLog-pr-4380.yml new file mode 100644 index 00000000000..a79b232b75a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4380.yml @@ -0,0 +1,6 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes simple animals not dying right away when they reach zero health" + - bugfix: "Fixes a few farm animals, simple xenos, and a hivebot from having incorrect health" + - tweak: "Buffed health pack usage on simple animals (should heal roughly 20 damage on them, per use)" diff --git a/html/changelogs/AutoChangeLog-pr-4385.yml b/html/changelogs/AutoChangeLog-pr-4385.yml new file mode 100644 index 00000000000..6b759b6c548 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4385.yml @@ -0,0 +1,4 @@ +author: FlattestGuitar +delete-after: True +changes: + - rscadd: "Adds tape gags. Click on someone with a roll of tape to shut them up!" diff --git a/html/changelogs/AutoChangeLog-pr-4386.yml b/html/changelogs/AutoChangeLog-pr-4386.yml new file mode 100644 index 00000000000..889a917927a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4386.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - tweak: "Emotes no longer need to be purely lowercase to work" diff --git a/html/changelogs/AutoChangeLog-pr-4389.yml b/html/changelogs/AutoChangeLog-pr-4389.yml new file mode 100644 index 00000000000..6efb375c886 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4389.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Chaplain can now select a green book as his Bible" diff --git a/html/changelogs/AutoChangeLog-pr-4394.yml b/html/changelogs/AutoChangeLog-pr-4394.yml new file mode 100644 index 00000000000..089e43d333f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4394.yml @@ -0,0 +1,5 @@ +author: NTSAM +delete-after: True +changes: + - bugfix: "Fixes the stuttery rainbow screen for IPCs." + - bugfix: "Fixes the green IPC screen." diff --git a/html/changelogs/AutoChangeLog-pr-4395.yml b/html/changelogs/AutoChangeLog-pr-4395.yml new file mode 100644 index 00000000000..a3d80c2e208 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4395.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Adds in His Grace, a hijack-only traitor item for the Chaplain" diff --git a/icons/goonstation/mob/inhands/items_lefthand.dmi b/icons/goonstation/mob/inhands/items_lefthand.dmi index 5702ba238c1..3982141cbd0 100644 Binary files a/icons/goonstation/mob/inhands/items_lefthand.dmi and b/icons/goonstation/mob/inhands/items_lefthand.dmi differ diff --git a/icons/goonstation/mob/inhands/items_righthand.dmi b/icons/goonstation/mob/inhands/items_righthand.dmi index 9adcb9a22e8..d3b2dc7531f 100644 Binary files a/icons/goonstation/mob/inhands/items_righthand.dmi and b/icons/goonstation/mob/inhands/items_righthand.dmi differ diff --git a/icons/goonstation/objects/objects.dmi b/icons/goonstation/objects/objects.dmi new file mode 100644 index 00000000000..41523d18541 Binary files /dev/null and b/icons/goonstation/objects/objects.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 3cd59fe3f74..f036d7e3111 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index ba0e34aca9b..c649cee3ec2 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 248525081c6..c0b8af3b551 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index d6dacdce500..ceedd8011b9 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/species/drask/helmet.dmi b/icons/mob/species/drask/helmet.dmi index 3759f81fc41..0fdd257f0d9 100644 Binary files a/icons/mob/species/drask/helmet.dmi and b/icons/mob/species/drask/helmet.dmi differ diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi index 9c3339e29e0..be155741185 100644 Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi index a37b45b4e96..db8c09807ef 100644 Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi index df31a6851ae..cd9c224051b 100644 Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ diff --git a/icons/mob/species/vulpkanin/mask.dmi b/icons/mob/species/vulpkanin/mask.dmi index 37aedd13592..d6baae8ab67 100644 Binary files a/icons/mob/species/vulpkanin/mask.dmi and b/icons/mob/species/vulpkanin/mask.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 1e033f6746d..ff0fc2384c0 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/flag.dmi b/icons/obj/flag.dmi index b85010f3727..d1e0f08fa49 100644 Binary files a/icons/obj/flag.dmi and b/icons/obj/flag.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 1345d8172d7..45e4265c292 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 97ca0e00693..9c90b468860 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi index 4b713b2129e..faea5fe4180 100644 Binary files a/icons/obj/trash.dmi and b/icons/obj/trash.dmi differ diff --git a/icons/vehicles/spacepod.dmi b/icons/vehicles/spacepod.dmi new file mode 100644 index 00000000000..e55085622c9 Binary files /dev/null and b/icons/vehicles/spacepod.dmi differ diff --git a/nano/templates/slotmachine.tmpl b/nano/templates/slotmachine.tmpl index 287830bbb5b..79109fc9aba 100644 --- a/nano/templates/slotmachine.tmpl +++ b/nano/templates/slotmachine.tmpl @@ -8,14 +8,14 @@ Used In File(s): /code/game/machinery/slotmachine.dm
Credits Remaining:
- {{:helper.string("
{1}
", data.money >= 5 ? "" : "bad", data.money)}} + {{:helper.string("
{1}
", data.money >= 10 ? "" : "bad", data.money)}}
- Five credits to play! + Ten credits to play!
- {{:helper.link('SPIN!', 'refresh', {'ops' : 1}, data.money >= 5 && !data.working ? null : 'disabled')}} + {{:helper.link('SPIN!', 'refresh', {'ops' : 1}, data.money >= 10 && !data.working ? null : 'disabled')}}
{{if data.result}} diff --git a/paradise.dme b/paradise.dme index a1cfc939216..c3a14848062 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1494,7 +1494,7 @@ #include "code\modules\mob\living\carbon\human\interactive\functions.dm" #include "code\modules\mob\living\carbon\human\interactive\interactive.dm" #include "code\modules\mob\living\carbon\human\interactive\prefabs.dm" -#include "code\modules\mob\living\carbon\human\species\abdcutor.dm" +#include "code\modules\mob\living\carbon\human\species\abductor.dm" #include "code\modules\mob\living\carbon\human\species\apollo.dm" #include "code\modules\mob\living\carbon\human\species\drask.dm" #include "code\modules\mob\living\carbon\human\species\golem.dm" diff --git a/sound/goonstation/effects/screech.ogg b/sound/goonstation/effects/screech.ogg new file mode 100644 index 00000000000..4a63299ea1d Binary files /dev/null and b/sound/goonstation/effects/screech.ogg differ diff --git a/sound/goonstation/misc/burp_alien.ogg b/sound/goonstation/misc/burp_alien.ogg new file mode 100644 index 00000000000..3f9bdf2ab3a Binary files /dev/null and b/sound/goonstation/misc/burp_alien.ogg differ diff --git a/sound/misc/briefcase_bees.ogg b/sound/misc/briefcase_bees.ogg new file mode 100644 index 00000000000..5483d9d5f91 Binary files /dev/null and b/sound/misc/briefcase_bees.ogg differ diff --git a/strings/chemistry_tools.json b/strings/chemistry_tools.json new file mode 100644 index 00000000000..28bfe60010b --- /dev/null +++ b/strings/chemistry_tools.json @@ -0,0 +1,474 @@ +{ + "CYBERPUNK_drug_prefixes": [ + "ace", + "acid", + "android", + "angel", + "arse", + "astro", + "atomic", + "azimuth", + "bandit", + "base", + "bear", + "big", + "bit", + "blood", + "blue", + "bog", + "borg", + "bronx", + "buffalo", + "butterfly", + "cactus", + "cancer", + "cat", + "chaos", + "cherub", + "cloud", + "crazy", + "creamy", + "crispy", + "cryo", + "crypto", + "crystal", + "cyber", + "dad's", + "dank", + "dapper", + "dead", + "death", + "deep", + "demon", + "desert", + "devil", + "discharge", + "disco", + "dog", + "dragon", + "duck", + "electro", + "evil", + "exo", + "exotic", + "farty", + "flux", + "flying", + "freak", + "freckle", + "fusion", + "gentlemen's", + "george", + "ghost", + "giga", + "glow", + "goon", + "grandma's", + "hardcore", + "harlem", + "heather", + "heavenly", + "hell", + "hungry", + "hydro", + "ice", + "india", + "iron", + "jazz", + "jelly", + "jersey", + "jungle", + "knockout", + "liquid", + "loony", + "loopy", + "lucky", + "lunar", + "macro", + "mad", + "magic", + "mama's", + "mars", + "marsh", + "mega", + "meteor", + "micro", + "monday", + "monkey", + "moon", + "motor", + "mountain", + "murder", + "naughty", + "necro", + "neon", + "nice", + "night", + "ninja", + "nuke", + "omega", + "omni", + "pain", + "paranoid", + "plasma", + "prism", + "puffer", + "puffy", + "quirky", + "racist", + "rainbow", + "red", + "rift", + "rock", + "rough", + "samurai", + "scan", + "secret", + "shitty", + "sick", + "sicknasty", + "silver", + "sine", + "skull", + "sky", + "slime", + "slimy", + "smooth", + "solar", + "solid", + "space", + "special", + "spotty", + "star", + "sticky", + "stray", + "swamp", + "tachyon", + "tech", + "techno", + "troll", + "turbo", + "turkey", + "uber", + "ultra", + "uncle's", + "uncle", + "unicorn", + "vacuum", + "vampire", + "vile", + "viral", + "void", + "volcano", + "vorpal", + "watt", + "wicked", + "willow", + "wizard", + "wobbly", + "yellow", + "zesty", + "zeta", + "zip", + "zone", + "parrot" + ], + "CYBERPUNK_drug_suffixes": [ + "2000", + "420", + "9", + "99", + "aftershave", + "balls", + "bang", + "bass", + "beans", + "beat", + "beep", + "bees", + "biscuits", + "bit", + "blit", + "blot", + "blue", + "bones", + "boop", + "booster", + "brawn", + "bread", + "bright", + "bubbles", + "bullet", + "burgers", + "butter", + "buttons", + "buzz", + "byte", + "ceramique", + "chasers", + "cheese", + "chill", + "chizz", + "clap", + "coins", + "cooking", + "crack", + "crush", + "dark", + "data", + "diablo", + "dreck", + "drool", + "drugs", + "dust", + "eels", + "eggs", + "fire", + "flash", + "flux", + "giblets", + "goblins", + "gold", + "goop", + "grease", + "green", + "grinder", + "gunge", + "hammer", + "hash", + "hog", + "hook", + "hounds", + "ice", + "ink", + "itch", + "jack", + "jane", + "jerks", + "jones", + "junk", + "kick", + "lasagne", + "lightning", + "lock", + "max", + "meat", + "medicine", + "melons", + "milk", + "mollies", + "mondays", + "music", + "nine", + "nip", + "nuggets", + "nugs", + "null", + "particulars", + "pepper", + "pies", + "ping", + "poofs", + "pot", + "powder", + "puffs", + "punch", + "quake", + "quarks", + "red", + "reef", + "riot", + "ripper", + "runoff", + "saliva", + "sass", + "saturdays", + "sauce", + "scum", + "shaker", + "shank", + "shit", + "shock", + "shredder", + "slurm", + "smash", + "smoke", + "smokes", + "smuds", + "snap", + "snow", + "spank", + "spice", + "spit", + "stank", + "stealth", + "sticks", + "sting", + "stink", + "sundays", + "sushi", + "tango", + "tears", + "theta", + "torpedo", + "tuber", + "turbo", + "volts", + "wafers", + "wave", + "weed", + "white", + "wiggle", + "wisps", + "zap", + "zero", + "zeta", + "zip" + ], + "CYBERPUNK_drug_primaries": [ + "bath_salts", + "crank", + "krokodil", + "methamphetamine", + "lsd", + "psilocybin", + "space_drugs", + "thc", + "jenkem", + "nicotine", + "haloperidol", + "ephedrine", + "epinephrine", + "omnizine", + "morphine", + "ketamine", + "diphenhydramine" + ], + "CYBERPUNK_drug_adulterants": [ + "mercury", + "lithium", + "plasma", + "fuel", + "itching_powder", + "capsaicin", + "histamine", + "ethanol", + "diethylamine", + "atrazine", + "clf3", + "aluminum", + "sugar", + "soybeanoil", + "hydrogenated_soybeanoil", + "phlogiston", + "cryostylane", + "toxin", + "neurotoxin2", + "sulfur", + "saltpetre", + "cyanide", + "formaldehyde", + "sacid", + "facid", + "lipolicide", + "mutagen", + "pancuronium", + "radium", + "uranium", + "polonium", + "sodium_thiopental", + "triplepiss", + "hairgrownium", + "iron", + "sulfonal", + "glowing_slurry", + "toxic_slurry", + "carpet", + "oil", + "ammonia", + "acetone", + "ectoplasm", + "fungus", + "cleaner", + "blood", + "ash", + "synthflesh", + "toiletwater", + "porktonium", + "corn_starch", + "corn_syrup", + "vhfcs", + "gravy", + "msg", + "egg", + "????", + "suicider", + "moonshine", + "prions", + "grave_dust", + "nanomachines", + "chlorine", + "fluorine" + ], + "CYBERPUNK_drug_adulterants_safe": [ + "mercury", + "lithium", + "plasma", + "fuel", + "capsaicin", + "ethanol", + "diethylamine", + "atrazine", + "aluminum", + "sugar", + "soybeanoil", + "phlogiston", + "cryostylane", + "sulfur", + "saltpetre", + "lipolicide", + "triplepiss", + "hairgrownium", + "iron", + "sulfonal", + "carpet", + "oil", + "ammonia", + "acetone", + "ectoplasm", + "fungus", + "cleaner", + "blood", + "ash", + "synthflesh", + "toiletwater", + "corn_starch", + "corn_syrup", + "gravy", + "msg", + "egg", + "????", + "chlorine", + "fluorine" + ], + "traitor_poison_bottle": [ + "sarin", + "cyanide", + "sulfonal", + "initropidril", + "coniine", + "venom", + "ketamine", + "amanitin", + "polonium", + "curare", + "pancuronium", + "sodium_thiopental", + "gibbis", + "nanomachines", + "prions", + "spidereggs", + "concentrated_initro", + "heartworms" + ] +} \ No newline at end of file