From 9eb6eb62255f46e2d48bd0d067714b824e083876 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 22 Mar 2018 13:39:26 -0700 Subject: [PATCH 001/114] [READY] ~SPELL CARDS~, homing projectiles, and more! --- code/__DEFINES/maths.dm | 30 +- code/__HELPERS/_lists.dm | 2 + code/__HELPERS/game.dm | 38 - code/__HELPERS/mouse_control.dm | 50 + code/__HELPERS/unsorted.dm | 51 + code/__HELPERS/unused.dm | 39 + code/_onclick/autoclick.dm | 6 +- code/datums/callback.dm | 2 +- code/datums/components/lockon_aiming.dm | 243 +++++ code/datums/position_point_vector.dm | 26 +- code/datums/weakrefs.dm | 3 + code/modules/antagonists/cult/cult_items.dm | 2 - .../antagonists/wizard/equipment/spellbook.dm | 915 ++++++++++++++++++ .../projectiles/guns/misc/beam_rifle.dm | 6 +- code/modules/projectiles/projectile.dm | 52 +- .../projectiles/projectile/magic/spellcard.dm | 6 + code/modules/spells/spell_types/aimed.dm | 84 +- icons/obj/projectiles.dmi | Bin 116179 -> 116484 bytes tgstation.dme | 3 + 19 files changed, 1459 insertions(+), 99 deletions(-) create mode 100644 code/__HELPERS/mouse_control.dm create mode 100644 code/__HELPERS/unused.dm create mode 100644 code/datums/components/lockon_aiming.dm create mode 100644 code/modules/projectiles/projectile/magic/spellcard.dm diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 6ca1107619..b4a44f6d4b 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -116,6 +116,20 @@ #define GET_ANGLE_OF_INCIDENCE(face, input) (MODULUS((face) - (input), 360)) +//Finds the shortest angle that angle A has to change to get to angle B. Aka, whether to move clock or counterclockwise. +/proc/closer_angle_difference(a, b) + if(!isnum(a) || !isnum(b)) + return + a = SIMPLIFY_DEGREES(a) + b = SIMPLIFY_DEGREES(b) + var/inc = b - a + if(inc < 0) + inc += 360 + var/dec = a - b + if(dec < 0) + dec += 360 + . = inc > dec? -dec : inc + //A logarithm that converts an integer to a number scaled between 0 and 1. //Currently, this is used for hydroponics-produce sprite transforming, but could be useful for other transform functions. #define TRANSFORM_USING_VARIABLE(input, max) ( sin((90*(input))/(max))**2 ) @@ -146,22 +160,6 @@ return (mean + stddev * R1) #undef ACCURACY -/proc/mouse_angle_from_client(client/client) - var/list/mouse_control = params2list(client.mouseParams) - if(mouse_control["screen-loc"] && client) - var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",") - var/list/screen_loc_X = splittext(screen_loc_params[1],":") - var/list/screen_loc_Y = splittext(screen_loc_params[2],":") - var/x = (text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32) - var/y = (text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32) - var/list/screenview = getviewsize(client.view) - var/screenviewX = screenview[1] * world.icon_size - var/screenviewY = screenview[2] * world.icon_size - var/ox = round(screenviewX/2) - client.pixel_x //"origin" x - var/oy = round(screenviewY/2) - client.pixel_y //"origin" y - var/angle = SIMPLIFY_DEGREES(ATAN2(y - oy, x - ox)) - return angle - /proc/get_turf_in_angle(angle, turf/starting, increments) var/pixel_x = 0 var/pixel_y = 0 diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 91eee45b4d..4ba5d55979 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -13,6 +13,8 @@ #define UNSETEMPTY(L) if (L && !L.len) L = null #define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } } #define LAZYADD(L, I) if(!L) { L = list(); } L += I; +#define LAZYOR(L, I) if(!L) { L = list(); } L |= I; +#define LAZYFIND(L, V) L ? L.Find(V) : 0 #define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null) #define LAZYSET(L, K, V) if(!L) { L = list(); } L[K] = V; #define LAZYLEN(L) length(L) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 26b5ac65cc..1dfacc0149 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -387,44 +387,6 @@ active_players++ return active_players -/datum/projectile_data - var/src_x - var/src_y - var/time - var/distance - var/power_x - var/power_y - var/dest_x - var/dest_y - -/datum/projectile_data/New(var/src_x, var/src_y, var/time, var/distance, \ - var/power_x, var/power_y, var/dest_x, var/dest_y) - src.src_x = src_x - src.src_y = src_y - src.time = time - src.distance = distance - src.power_x = power_x - src.power_y = power_y - src.dest_x = dest_x - src.dest_y = dest_y - -/proc/projectile_trajectory(src_x, src_y, rotation, angle, power) - - // returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle], - // rotated at [rotation] and with the power of [power] - // Thanks to VistaPOWA for this function - - var/power_x = power * cos(angle) - var/power_y = power * sin(angle) - var/time = 2* power_y / 10 //10 = g - - var/distance = time * power_x - - var/dest_x = src_x + distance*sin(rotation); - var/dest_y = src_y + distance*cos(rotation); - - return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y) - /proc/showCandidatePollWindow(mob/M, poll_time, Question, list/candidates, ignore_category, time_passed, flashwindow = TRUE) set waitfor = 0 diff --git a/code/__HELPERS/mouse_control.dm b/code/__HELPERS/mouse_control.dm new file mode 100644 index 0000000000..24e40cc355 --- /dev/null +++ b/code/__HELPERS/mouse_control.dm @@ -0,0 +1,50 @@ +/proc/mouse_angle_from_client(client/client) + var/list/mouse_control = params2list(client.mouseParams) + if(mouse_control["screen-loc"] && client) + var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",") + var/list/screen_loc_X = splittext(screen_loc_params[1],":") + var/list/screen_loc_Y = splittext(screen_loc_params[2],":") + var/x = (text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32) + var/y = (text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32) + var/list/screenview = getviewsize(client.view) + var/screenviewX = screenview[1] * world.icon_size + var/screenviewY = screenview[2] * world.icon_size + var/ox = round(screenviewX/2) - client.pixel_x //"origin" x + var/oy = round(screenviewY/2) - client.pixel_y //"origin" y + var/angle = SIMPLIFY_DEGREES(ATAN2(y - oy, x - ox)) + return angle + +//Wow, specific name! +/proc/mouse_absolute_datum_map_position_from_client(client/client) + if(!isloc(client.mob.loc)) + return + var/list/mouse_control = params2list(client.mouseParams) + var/cx = client.mob.x + var/cy = client.mob.y + var/cz = client.mob.z + if(mouse_control["screen-loc"]) + var/x = 0 + var/y = 0 + var/z = 0 + var/p_x = 0 + var/p_y = 0 + //Split screen-loc up into X+Pixel_X and Y+Pixel_Y + var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",") + //Split X+Pixel_X up into list(X, Pixel_X) + var/list/screen_loc_X = splittext(screen_loc_params[1],":") + //Split Y+Pixel_Y up into list(Y, Pixel_Y) + var/list/screen_loc_Y = splittext(screen_loc_params[2],":") + var/sx = text2num(screen_loc_X[1]) + var/sy = text2num(screen_loc_Y[1]) + //Get the resolution of the client's current screen size. + var/list/screenview = getviewsize(client.view) + var/svx = screenview[1] + var/svy = screenview[2] + var/cox = round((svx - 1) / 2) + var/coy = round((svy - 1) / 2) + x = cx + (sx - 1 - cox) + y = cy + (sy - 1 - coy) + z = cz + p_x = text2num(screen_loc_X[2]) + p_y = text2num(screen_loc_Y[2]) + return new /datum/position(x, y, z, p_x, p_y) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index a63ff6bdf0..0a212e36a1 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1572,3 +1572,54 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) /proc/get_random_drink() return pick(subtypesof(/obj/item/reagent_containers/food/drinks)) + +//For these two procs refs MUST be ref = TRUE format like typecaches! +/proc/weakref_filter_list(list/things, list/refs) + if(!islist(things) || !islist(refs)) + return + if(!refs.len) + return things + if(things.len > refs.len) + var/list/f = list() + for(var/i in refs) + var/datum/weakref/r = i + var/datum/d = r.resolve() + if(d) + f |= d + return things & f + + else + . = list() + for(var/i in things) + if(!refs[WEAKREF(i)]) + continue + . |= i + +/proc/weakref_filter_list_reverse(list/things, list/refs) + if(!islist(things) || !islist(refs)) + return + if(!refs.len) + return things + if(things.len > refs.len) + var/list/f = list() + for(var/i in refs) + var/datum/weakref/r = i + var/datum/d = r.resolve() + if(d) + f |= d + + return things - f + else + . = list() + for(var/i in things) + if(refs[WEAKREF(i)]) + continue + . |= i + +/proc/special_list_filter(list/L, datum/callback/condition) + if(!islist(L) || !length(L) || !istype(condition)) + return list() + . = list() + for(var/i in L) + if(condition.Invoke(i)) + . |= i diff --git a/code/__HELPERS/unused.dm b/code/__HELPERS/unused.dm new file mode 100644 index 0000000000..8b590eb2bd --- /dev/null +++ b/code/__HELPERS/unused.dm @@ -0,0 +1,39 @@ + + +/datum/projectile_data + var/src_x + var/src_y + var/time + var/distance + var/power_x + var/power_y + var/dest_x + var/dest_y + +/datum/projectile_data/New(var/src_x, var/src_y, var/time, var/distance, \ + var/power_x, var/power_y, var/dest_x, var/dest_y) + src.src_x = src_x + src.src_y = src_y + src.time = time + src.distance = distance + src.power_x = power_x + src.power_y = power_y + src.dest_x = dest_x + src.dest_y = dest_y + +/proc/projectile_trajectory(src_x, src_y, rotation, angle, power) + + // returns the destination (Vx,y) that a projectile shot at [src_x], [src_y], with an angle of [angle], + // rotated at [rotation] and with the power of [power] + // Thanks to VistaPOWA for this function + + var/power_x = power * cos(angle) + var/power_y = power * sin(angle) + var/time = 2* power_y / 10 //10 = g + + var/distance = time * power_x + + var/dest_x = src_x + distance*sin(rotation); + var/dest_y = src_y + distance*cos(rotation); + + return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y) diff --git a/code/_onclick/autoclick.dm b/code/_onclick/autoclick.dm index 7a5ba0a189..bd978a921d 100644 --- a/code/_onclick/autoclick.dm +++ b/code/_onclick/autoclick.dm @@ -77,10 +77,10 @@ mouseObject = object mouseControlObject = control if(mob && LAZYLEN(mob.mousemove_intercept_objects)) - for(var/obj/item/I in mob.mousemove_intercept_objects) - I.onMouseMove(object, location, control, params) + for(var/datum/D in mob.mousemove_intercept_objects) + D.onMouseMove(object, location, control, params) -/obj/item/proc/onMouseMove(object, location, control, params) +/datum/proc/onMouseMove(object, location, control, params) return /client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params) diff --git a/code/datums/callback.dm b/code/datums/callback.dm index c603be85b7..1a26052cc9 100644 --- a/code/datums/callback.dm +++ b/code/datums/callback.dm @@ -173,7 +173,7 @@ var/datum/callback_select/CS = new(count, savereturns) for (var/i in 1 to count) CS.invoke_callback(i, callbacks[i], callback_args[i], savereturns) - + while(CS.pendingcount) sleep(resolution*world.tick_lag) return CS.finished diff --git a/code/datums/components/lockon_aiming.dm b/code/datums/components/lockon_aiming.dm new file mode 100644 index 0000000000..017e7ea8eb --- /dev/null +++ b/code/datums/components/lockon_aiming.dm @@ -0,0 +1,243 @@ +#define LOCKON_AIMING_MAX_CURSOR_RADIUS 7 +#define LOCKON_IGNORE_RESULT "ignore_my_result" +#define LOCKON_RANGING_BREAK_CHECK if(current_ranging_id != this_id){return LOCKON_IGNORE_RESULT} + +/datum/component/lockon_aiming + dupe_mode = COMPONENT_DUPE_ALLOWED + var/lock_icon = 'icons/mob/blob.dmi' + var/lock_icon_state = "marker" + var/mutable_appearance/lock_appearance + var/list/image/lock_images + var/list/target_typecache + var/list/immune_weakrefs //list(weakref = TRUE) + var/mob_stat_check = TRUE //if a potential target is a mob make sure it's conscious! + var/lock_amount = 1 + var/lock_cursor_range = 5 + var/list/locked_weakrefs + var/update_disabled = FALSE + var/current_ranging_id = 0 + var/list/last_location + var/datum/callback/on_lock + var/datum/callback/can_target_callback + +/datum/component/lockon_aiming/Initialize(range, list/typecache, amount, list/immune, datum/callback/when_locked, icon, icon_state, datum/callback/target_callback) + if(!ismob(parent)) + . = COMPONENT_INCOMPATIBLE + CRASH("Lockon aiming component attempted to be added to a non mob!") + if(target_callback) + can_target_callback = target_callback + else + can_target_callback = CALLBACK(src, .proc/can_target) + if(range) + lock_cursor_range = range + if(typecache) + target_typecache = typecache + if(amount) + lock_amount = amount + immune_weakrefs = list(WEAKREF(parent) = TRUE) //Manually take this out if you want.. + if(immune) + for(var/i in immune) + if(isweakref(i)) + immune_weakrefs[i] = TRUE + else if(isatom(i)) + immune_weakrefs[WEAKREF(i)] = TRUE + if(when_locked) + on_lock = when_locked + if(icon) + lock_icon = icon + if(icon_state) + lock_icon_state = icon_state + generate_lock_visuals() + var/mob/M = parent + LAZYOR(M.mousemove_intercept_objects, src) + START_PROCESSING(SSfastprocess, src) + +/datum/component/lockon_aiming/Destroy() + var/mob/M = parent + clear_visuals() + LAZYREMOVE(M.mousemove_intercept_objects, src) + STOP_PROCESSING(SSfastprocess, src) + return ..() + +/datum/component/lockon_aiming/proc/show_visuals() + LAZYINITLIST(lock_images) + var/mob/M = parent + if(!M.client) + return + for(var/i in locked_weakrefs) + var/datum/weakref/R = i + var/atom/A = R.resolve() + if(!A) + continue //It'll be cleared by processing. + var/image/I = new + I.appearance = lock_appearance + I.loc = A + M.client.images |= I + lock_images |= I + +/datum/component/lockon_aiming/proc/clear_visuals() + var/mob/M = parent + if(!M.client) + return + if(!lock_images) + return + for(var/i in lock_images) + M.client.images -= i + qdel(i) + lock_images.Cut() + +/datum/component/lockon_aiming/proc/refresh_visuals() + clear_visuals() + show_visuals() + +/datum/component/lockon_aiming/proc/generate_lock_visuals() + lock_appearance = mutable_appearance(icon = lock_icon, icon_state = lock_icon_state, layer = FLOAT_LAYER) + +/datum/component/lockon_aiming/proc/unlock_all(refresh_vis = TRUE) + LAZYCLEARLIST(locked_weakrefs) + if(refresh_vis) + refresh_visuals() + +/datum/component/lockon_aiming/proc/unlock(atom/A, refresh_vis = TRUE) + if(!A.weak_reference) + return + LAZYREMOVE(locked_weakrefs, A.weak_reference) + if(refresh_vis) + refresh_visuals() + +/datum/component/lockon_aiming/proc/lock(atom/A, refresh_vis = TRUE) + LAZYOR(locked_weakrefs, WEAKREF(A)) + if(refresh_vis) + refresh_visuals() + +/datum/component/lockon_aiming/proc/add_immune_atom(atom/A) + var/datum/weakref/R = WEAKREF(A) + if(immune_weakrefs && (immune_weakrefs[R])) + return + LAZYSET(immune_weakrefs, R, TRUE) + +/datum/component/lockon_aiming/proc/remove_immune_atom(atom/A) + if(!A.weak_reference || !immune_weakrefs) //if A doesn't have a weakref how did it get on the immunity list? + return + LAZYREMOVE(immune_weakrefs, A.weak_reference) + +/datum/component/lockon_aiming/onMouseMove(object,location,control,params) + var/mob/M = parent + if(!istype(M) || !M.client) + return + var/datum/position/P = mouse_absolute_datum_map_position_from_client(M.client) + if(!P) + return + var/turf/T = P.return_turf() + LAZYINITLIST(last_location) + if(length(last_location) == 3 && last_location[1] == T.x && last_location[2] == T.y && last_location[3] == T.z) + return //Same turf, don't bother. + if(last_location) + last_location.Cut() + else + last_location = list() + last_location.len = 3 + last_location[1] = T.x + last_location[2] = T.y + last_location[3] = T.z + autolock() + +/datum/component/lockon_aiming/process() + if(update_disabled) + return + if(!last_location) + return + var/changed = FALSE + for(var/i in locked_weakrefs) + var/datum/weakref/R = i + if(istype(R)) + var/atom/thing = R.resolve() + if(!istype(thing) || (get_dist(thing, locate(last_location[1], last_location[2], last_location[3])) > lock_cursor_range)) + unlock(R) + changed = TRUE + else + unlock(R) + changed = TRUE + if(changed) + autolock() + +/datum/component/lockon_aiming/proc/autolock() + var/mob/M = parent + if(!M.client) + return FALSE + var/datum/position/current = mouse_absolute_datum_map_position_from_client(M.client) + var/turf/target = current.return_turf() + var/list/atom/targets = get_nearest(target, target_typecache, lock_amount, lock_cursor_range) + if(targets == LOCKON_IGNORE_RESULT) + return + unlock_all(FALSE) + for(var/i in targets) + if(immune_weakrefs[WEAKREF(i)]) + continue + lock(i, FALSE) + refresh_visuals() + on_lock.Invoke(locked_weakrefs) + +/datum/component/lockon_aiming/proc/can_target(atom/A) + var/mob/M = A + return is_type_in_typecache(A, target_typecache) && !(ismob(A) && mob_stat_check && M.stat != CONSCIOUS) && !immune_weakrefs[WEAKREF(A)] + +/datum/component/lockon_aiming/proc/get_nearest(turf/T, list/typecache, amount, range) + current_ranging_id++ + var/this_id = current_ranging_id + var/list/L = list() + var/turf/center = get_turf(T) + if(amount < 1 || range < 0 || !istype(center) || !islist(typecache)) + return + if(range == 0) + return typecache_filter_list(T.contents + T, typecache) + var/x = 0 + var/y = 0 + var/cd = 0 + while(cd <= range) + x = center.x - cd + 1 + y = center.y + cd + LOCKON_RANGING_BREAK_CHECK + for(x in x to center.x + cd) + T = locate(x, y, center.z) + if(T) + L |= special_list_filter(T.contents, can_target_callback) + if(L.len >= amount) + L.Cut(amount+1) + return L + LOCKON_RANGING_BREAK_CHECK + y = center.y + cd - 1 + x = center.x + cd + for(y in center.y - cd to y) + T = locate(x, y, center.z) + if(T) + L |= special_list_filter(T.contents, can_target_callback) + if(L.len >= amount) + L.Cut(amount+1) + return L + LOCKON_RANGING_BREAK_CHECK + y = center.y - cd + x = center.x + cd - 1 + for(x in center.x - cd to x) + T = locate(x, y, center.z) + if(T) + L |= special_list_filter(T.contents, can_target_callback) + if(L.len >= amount) + L.Cut(amount+1) + return L + LOCKON_RANGING_BREAK_CHECK + y = center.y - cd + 1 + x = center.x - cd + for(y in y to center.y + cd) + T = locate(x, y, center.z) + if(T) + L |= special_list_filter(T.contents, can_target_callback) + if(L.len >= amount) + L.Cut(amount+1) + return L + LOCKON_RANGING_BREAK_CHECK + cd++ + CHECK_TICK + +/datum/component/lockon_aiming/OnTransfer(datum/new_parent) + CRASH("Warning: Lockon aiming component transfer attempted, but transfer behavior is not implemented!") diff --git a/code/datums/position_point_vector.dm b/code/datums/position_point_vector.dm index 63b4774550..33facca9a1 100644 --- a/code/datums/position_point_vector.dm +++ b/code/datums/position_point_vector.dm @@ -9,6 +9,19 @@ #define RETURN_POINT_VECTOR(ATOM, ANGLE, SPEED) {new /datum/point/vector(ATOM, null, null, null, null, ANGLE, SPEED)} #define RETURN_POINT_VECTOR_INCREMENT(ATOM, ANGLE, SPEED, AMT) {new /datum/point/vector(ATOM, null, null, null, null, ANGLE, SPEED, AMT)} +/proc/point_midpoint_points(datum/point/a, datum/point/b) //Obviously will not support multiZ calculations! Same for the two below. + var/datum/point/P = new + P.x = a.x + (b.x - a.x) / 2 + P.y = a.y + (b.y - a.y) / 2 + P.z = a.z + return P + +/proc/pixel_length_between_points(datum/point/a, datum/point/b) + return sqrt(((b.x - a.x) ** 2) + ((b.y - a.y) ** 2)) + +/proc/angle_between_points(datum/point/a, datum/point/b) + return ATAN2((b.y - a.y), (b.x - a.x)) + /datum/position //For positions with map x/y/z and pixel x/y so you don't have to return lists. Could use addition/subtraction in the future I guess. var/x = 0 var/y = 0 @@ -53,19 +66,6 @@ /datum/position/proc/return_point() return new /datum/point(src) -/proc/point_midpoint_points(datum/point/a, datum/point/b) //Obviously will not support multiZ calculations! Same for the two below. - var/datum/point/P = new - P.x = a.x + (b.x - a.x) / 2 - P.y = a.y + (b.y - a.y) / 2 - P.z = a.z - return P - -/proc/pixel_length_between_points(datum/point/a, datum/point/b) - return sqrt(((b.x - a.x) ** 2) + ((b.y - a.y) ** 2)) - -/proc/angle_between_points(datum/point/a, datum/point/b) - return ATAN2((b.y - a.y), (b.x - a.x)) - /datum/point //A precise point on the map in absolute pixel locations based on world.icon_size. Pixels are FROM THE EDGE OF THE MAP! var/x = 0 var/y = 0 diff --git a/code/datums/weakrefs.dm b/code/datums/weakrefs.dm index f9602c0217..3c64d5f60d 100644 --- a/code/datums/weakrefs.dm +++ b/code/datums/weakrefs.dm @@ -6,6 +6,9 @@ input.weak_reference = new /datum/weakref(input) return input.weak_reference +/datum/proc/create_weakref() //Forced creation for admin proccalls + return WEAKREF(src) + /datum/weakref var/reference diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 1b744863d8..30d150e3ee 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -776,7 +776,6 @@ impact_effect_type = /obj/effect/temp_visual/dir_setting/bloodsplatter /obj/item/projectile/magic/arcane_barrage/blood/Collide(atom/target) - colliding = TRUE var/turf/T = get_turf(target) playsound(T, 'sound/effects/splat.ogg', 50, TRUE) if(iscultist(target)) @@ -790,7 +789,6 @@ M.adjustHealth(-5) new /obj/effect/temp_visual/cult/sparks(T) qdel(src) - colliding = FALSE else ..() diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index c26cb5e65c..8b2ee4083c 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /datum/spellbook_entry var/name = "Entry Name" @@ -906,3 +907,917 @@ spellname = "sacred flame" icon_state ="booksacredflame" desc = "Become one with the flames that burn within... and invite others to do so as well." +======= +/datum/spellbook_entry + var/name = "Entry Name" + + var/spell_type = null + var/desc = "" + var/category = "Offensive" + var/cost = 2 + var/refundable = 1 + var/surplus = -1 // -1 for infinite, not used by anything atm + var/obj/effect/proc_holder/spell/S = null //Since spellbooks can be used by only one person anyway we can track the actual spell + var/buy_word = "Learn" + var/limit //used to prevent a spellbook_entry from being bought more than X times with one wizard spellbook + var/list/no_coexistance_typecache //Used so you can't have specific spells together + +/datum/spellbook_entry/New() + ..() + no_coexistance_typecache = typecacheof(no_coexistance_typecache) + +/datum/spellbook_entry/proc/IsAvailible() // For config prefs / gamemode restrictions - these are round applied + return 1 + +/datum/spellbook_entry/proc/CanBuy(mob/living/carbon/human/user,obj/item/spellbook/book) // Specific circumstances + if(book.uses= aspell.level_max) + to_chat(user, "This spell cannot be improved further.") + return 0 + else + aspell.name = initial(aspell.name) + aspell.spell_level++ + aspell.charge_max = round(initial(aspell.charge_max) - aspell.spell_level * (initial(aspell.charge_max) - aspell.cooldown_min)/ aspell.level_max) + if(aspell.charge_max < aspell.charge_counter) + aspell.charge_counter = aspell.charge_max + switch(aspell.spell_level) + if(1) + to_chat(user, "You have improved [aspell.name] into Efficient [aspell.name].") + aspell.name = "Efficient [aspell.name]" + if(2) + to_chat(user, "You have further improved [aspell.name] into Quickened [aspell.name].") + aspell.name = "Quickened [aspell.name]" + if(3) + to_chat(user, "You have further improved [aspell.name] into Free [aspell.name].") + aspell.name = "Free [aspell.name]" + if(4) + to_chat(user, "You have further improved [aspell.name] into Instant [aspell.name].") + aspell.name = "Instant [aspell.name]" + if(aspell.spell_level >= aspell.level_max) + to_chat(user, "This spell cannot be strengthened any further.") + SSblackbox.record_feedback("nested tally", "wizard_spell_improved", 1, list("[name]", "[aspell.spell_level]")) + return 1 + //No same spell found - just learn it + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) + user.mind.AddSpell(S) + to_chat(user, "You have learned [S.name].") + return 1 + +/datum/spellbook_entry/proc/CanRefund(mob/living/carbon/human/user,obj/item/spellbook/book) + if(!refundable) + return 0 + if(!S) + S = new spell_type() + for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) + if(initial(S.name) == initial(aspell.name)) + return 1 + return 0 + +/datum/spellbook_entry/proc/Refund(mob/living/carbon/human/user,obj/item/spellbook/book) //return point value or -1 for failure + var/area/wizard_station/A = locate() in GLOB.sortedAreas + if(!(user in A.contents)) + to_chat(user, "You can only refund spells at the wizard lair") + return -1 + if(!S) + S = new spell_type() + var/spell_levels = 0 + for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) + if(initial(S.name) == initial(aspell.name)) + spell_levels = aspell.spell_level + user.mind.spell_list.Remove(aspell) + qdel(S) + return cost * (spell_levels+1) + return -1 +/datum/spellbook_entry/proc/GetInfo() + if(!S) + S = new spell_type() + var/dat ="" + dat += "[initial(S.name)]" + if(S.charge_type == "recharge") + dat += " Cooldown:[S.charge_max/10]" + dat += " Cost:[cost]
" + dat += "[S.desc][desc]
" + dat += "[S.clothes_req?"Needs wizard garb":"Can be cast without wizard garb"]
" + return dat + +/datum/spellbook_entry/fireball + name = "Fireball" + spell_type = /obj/effect/proc_holder/spell/aimed/fireball + +/datum/spellbook_entry/spell_cards + name = "Spell Cards" + spell_type = /obj/effect/proc_holder/spell/aimed/spell_cards + +/datum/spellbook_entry/rod_form + name = "Rod Form" + spell_type = /obj/effect/proc_holder/spell/targeted/rod_form + +/datum/spellbook_entry/magicm + name = "Magic Missile" + spell_type = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile + category = "Defensive" + +/datum/spellbook_entry/disintegrate + name = "Disintegrate" + spell_type = /obj/effect/proc_holder/spell/targeted/touch/disintegrate + +/datum/spellbook_entry/disabletech + name = "Disable Tech" + spell_type = /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech + category = "Defensive" + cost = 1 + +/datum/spellbook_entry/repulse + name = "Repulse" + spell_type = /obj/effect/proc_holder/spell/aoe_turf/repulse + category = "Defensive" + +/datum/spellbook_entry/lightningPacket + name = "Lightning bolt! Lightning bolt!" + spell_type = /obj/effect/proc_holder/spell/targeted/conjure_item/spellpacket + category = "Defensive" + +/datum/spellbook_entry/timestop + name = "Time Stop" + spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/timestop + category = "Defensive" + +/datum/spellbook_entry/smoke + name = "Smoke" + spell_type = /obj/effect/proc_holder/spell/targeted/smoke + category = "Defensive" + cost = 1 + +/datum/spellbook_entry/blind + name = "Blind" + spell_type = /obj/effect/proc_holder/spell/targeted/trigger/blind + cost = 1 + +/datum/spellbook_entry/mindswap + name = "Mindswap" + spell_type = /obj/effect/proc_holder/spell/targeted/mind_transfer + category = "Mobility" + +/datum/spellbook_entry/forcewall + name = "Force Wall" + spell_type = /obj/effect/proc_holder/spell/targeted/forcewall + category = "Defensive" + cost = 1 + +/datum/spellbook_entry/blink + name = "Blink" + spell_type = /obj/effect/proc_holder/spell/targeted/turf_teleport/blink + category = "Mobility" + +/datum/spellbook_entry/teleport + name = "Teleport" + spell_type = /obj/effect/proc_holder/spell/targeted/area_teleport/teleport + category = "Mobility" + +/datum/spellbook_entry/mutate + name = "Mutate" + spell_type = /obj/effect/proc_holder/spell/targeted/genetic/mutate + +/datum/spellbook_entry/jaunt + name = "Ethereal Jaunt" + spell_type = /obj/effect/proc_holder/spell/targeted/ethereal_jaunt + category = "Mobility" + +/datum/spellbook_entry/knock + name = "Knock" + spell_type = /obj/effect/proc_holder/spell/aoe_turf/knock + category = "Mobility" + cost = 1 + +/datum/spellbook_entry/fleshtostone + name = "Flesh to Stone" + spell_type = /obj/effect/proc_holder/spell/targeted/touch/flesh_to_stone + +/datum/spellbook_entry/summonitem + name = "Summon Item" + spell_type = /obj/effect/proc_holder/spell/targeted/summonitem + category = "Assistance" + cost = 1 + +/datum/spellbook_entry/lichdom + name = "Bind Soul" + spell_type = /obj/effect/proc_holder/spell/targeted/lichdom + category = "Defensive" + +/datum/spellbook_entry/teslablast + name = "Tesla Blast" + spell_type = /obj/effect/proc_holder/spell/targeted/tesla + +/datum/spellbook_entry/lightningbolt + name = "Lightning Bolt" + spell_type = /obj/effect/proc_holder/spell/aimed/lightningbolt + cost = 3 + +/datum/spellbook_entry/lightningbolt/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) //return 1 on success + . = ..() + user.flags_2 |= TESLA_IGNORE_2 + +/datum/spellbook_entry/infinite_guns + name = "Lesser Summon Guns" + spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun + cost = 3 + no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage + +/datum/spellbook_entry/arcane_barrage + name = "Arcane Barrage" + spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage + cost = 3 + no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun + +/datum/spellbook_entry/barnyard + name = "Barnyard Curse" + spell_type = /obj/effect/proc_holder/spell/targeted/barnyardcurse + +/datum/spellbook_entry/charge + name = "Charge" + spell_type = /obj/effect/proc_holder/spell/targeted/charge + category = "Assistance" + cost = 1 + +/datum/spellbook_entry/shapeshift + name = "Wild Shapeshift" + spell_type = /obj/effect/proc_holder/spell/targeted/shapeshift + category = "Assistance" + cost = 1 + +/datum/spellbook_entry/spacetime_dist + name = "Spacetime Distortion" + spell_type = /obj/effect/proc_holder/spell/spacetime_dist + category = "Defensive" + cost = 1 + +/datum/spellbook_entry/the_traps + name = "The Traps!" + spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/the_traps + category = "Defensive" + cost = 1 + + +/datum/spellbook_entry/item + name = "Buy Item" + refundable = 0 + buy_word = "Summon" + var/item_path= null + + +/datum/spellbook_entry/item/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) + new item_path(get_turf(user)) + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) + return 1 + +/datum/spellbook_entry/item/GetInfo() + var/dat ="" + dat += "[name]" + dat += " Cost:[cost]
" + dat += "[desc]
" + if(surplus>=0) + dat += "[surplus] left.
" + return dat + +/datum/spellbook_entry/item/staffchange + name = "Staff of Change" + desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." + item_path = /obj/item/gun/magic/staff/change + +/datum/spellbook_entry/item/staffanimation + name = "Staff of Animation" + desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines." + item_path = /obj/item/gun/magic/staff/animate + category = "Assistance" + +/datum/spellbook_entry/item/staffchaos + name = "Staff of Chaos" + desc = "A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended." + item_path = /obj/item/gun/magic/staff/chaos + +/datum/spellbook_entry/item/spellblade + name = "Spellblade" + desc = "A sword capable of firing blasts of energy which rip targets limb from limb." + item_path = /obj/item/gun/magic/staff/spellblade + +/datum/spellbook_entry/item/staffdoor + name = "Staff of Door Creation" + desc = "A particular staff that can mold solid metal into ornate doors. Useful for getting around in the absence of other transportation. Does not work on glass." + item_path = /obj/item/gun/magic/staff/door + cost = 1 + category = "Mobility" + +/datum/spellbook_entry/item/staffhealing + name = "Staff of Healing" + desc = "An altruistic staff that can heal the lame and raise the dead." + item_path = /obj/item/gun/magic/staff/healing + cost = 1 + category = "Defensive" + +/datum/spellbook_entry/item/scryingorb + name = "Scrying Orb" + desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision." + item_path = /obj/item/scrying + category = "Defensive" + +/datum/spellbook_entry/item/soulstones + name = "Six Soul Stone Shards and the spell Artificer" + desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot." + item_path = /obj/item/storage/belt/soulstone/full + category = "Assistance" + +/datum/spellbook_entry/item/soulstones/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) + . =..() + if(.) + user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(null)) + return . + +/datum/spellbook_entry/item/necrostone + name = "A Necromantic Stone" + desc = "A Necromantic stone is able to resurrect three dead individuals as skeletal thralls for you to command." + item_path = /obj/item/device/necromantic_stone + category = "Assistance" + +/datum/spellbook_entry/item/wands + name = "Wand Assortment" + desc = "A collection of wands that allow for a wide variety of utility. Wands have a limited number of charges, so be conservative in use. Comes in a handy belt." + item_path = /obj/item/storage/belt/wands/full + category = "Defensive" + +/datum/spellbook_entry/item/armor + name = "Mastercrafted Armor Set" + desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space." + item_path = /obj/item/clothing/suit/space/hardsuit/wizard + category = "Defensive" + +/datum/spellbook_entry/item/armor/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) + . = ..() + if(.) + new /obj/item/clothing/shoes/sandal/magic(get_turf(user)) //In case they've lost them. + new /obj/item/clothing/gloves/color/purple(get_turf(user))//To complete the outfit + +/datum/spellbook_entry/item/contract + name = "Contract of Apprenticeship" + desc = "A magical contract binding an apprentice wizard to your service, using it will summon them to your side." + item_path = /obj/item/antag_spawner/contract + category = "Assistance" + +/datum/spellbook_entry/item/guardian + name = "Guardian Deck" + desc = "A deck of guardian tarot cards, capable of binding a personal guardian to your body. There are multiple types of guardian available, but all of them will transfer some amount of damage to you. \ + It would be wise to avoid buying these with anything capable of causing you to swap bodies with others." + item_path = /obj/item/guardiancreator/choose/wizard + category = "Assistance" + +/datum/spellbook_entry/item/guardian/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) + . = ..() + if(.) + new /obj/item/paper/guides/antag/guardian/wizard(get_turf(user)) + +/datum/spellbook_entry/item/bloodbottle + name = "Bottle of Blood" + desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim." + item_path = /obj/item/antag_spawner/slaughter_demon + limit = 3 + category = "Assistance" + +/datum/spellbook_entry/item/hugbottle + name = "Bottle of Tickles" + desc = "A bottle of magically infused fun, the smell of which will \ + attract adorable extradimensional beings when broken. These beings \ + are similar to slaughter demons, but they do not permamently kill \ + their victims, instead putting them in an extradimensional hugspace, \ + to be released on the demon's death. Chaotic, but not ultimately \ + damaging. The crew's reaction to the other hand could be very \ + destructive." + item_path = /obj/item/antag_spawner/slaughter_demon/laughter + cost = 1 //non-destructive; it's just a jape, sibling! + limit = 3 + category = "Assistance" + +/datum/spellbook_entry/item/mjolnir + name = "Mjolnir" + desc = "A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power." + item_path = /obj/item/twohanded/mjollnir + +/datum/spellbook_entry/item/singularity_hammer + name = "Singularity Hammer" + desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everything nearby to the point of impact." + item_path = /obj/item/twohanded/singularityhammer + +/datum/spellbook_entry/item/battlemage + name = "Battlemage Armour" + desc = "An ensorcelled suit of armour, protected by a powerful shield. The shield can completly negate sixteen attacks before being permanently depleted." + item_path = /obj/item/clothing/suit/space/hardsuit/shielded/wizard + limit = 1 + category = "Defensive" + +/datum/spellbook_entry/item/battlemage_charge + name = "Battlemage Armour Charges" + desc = "A powerful defensive rune, it will grant eight additional charges to a suit of battlemage armour." + item_path = /obj/item/wizard_armour_charge + category = "Defensive" + cost = 1 + +/datum/spellbook_entry/item/warpwhistle + name = "Warp Whistle" + desc = "A strange whistle that will transport you to a distant safe place on the station. There is a window of vulnerability at the beginning of every use." + item_path = /obj/item/warpwhistle + category = "Mobility" + cost = 1 + +/datum/spellbook_entry/summon + name = "Summon Stuff" + category = "Rituals" + refundable = 0 + buy_word = "Cast" + var/active = 0 + +/datum/spellbook_entry/summon/CanBuy(mob/living/carbon/human/user,obj/item/spellbook/book) + return ..() && !active + +/datum/spellbook_entry/summon/GetInfo() + var/dat ="" + dat += "[name]" + if(cost>0) + dat += " Cost:[cost]
" + else + dat += " No Cost
" + dat += "[desc]
" + if(active) + dat += "Already cast!
" + return dat + +/datum/spellbook_entry/summon/ghosts + name = "Summon Ghosts" + desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilties to frustrate you." + cost = 0 + +/datum/spellbook_entry/summon/ghosts/IsAvailible() + if(!SSticker.mode) + return FALSE + else + return TRUE + +/datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) + new /datum/round_event/wizard/ghost() + active = TRUE + to_chat(user, "You have cast summon ghosts!") + playsound(get_turf(user), 'sound/effects/ghost2.ogg', 50, 1) + return TRUE + +/datum/spellbook_entry/summon/guns + name = "Summon Guns" + desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!" + +/datum/spellbook_entry/summon/guns/IsAvailible() + if(!SSticker.mode) // In case spellbook is placed on map + return 0 + return !CONFIG_GET(flag/no_summon_guns) + +/datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) + rightandwrong(SUMMON_GUNS, user, 25) + active = 1 + playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) + to_chat(user, "You have cast summon guns!") + return 1 + +/datum/spellbook_entry/summon/magic + name = "Summon Magic" + desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time." + +/datum/spellbook_entry/summon/magic/IsAvailible() + if(!SSticker.mode) // In case spellbook is placed on map + return 0 + return !CONFIG_GET(flag/no_summon_magic) + +/datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) + rightandwrong(SUMMON_MAGIC, user, 25) + active = 1 + playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) + to_chat(user, "You have cast summon magic!") + return 1 + +/datum/spellbook_entry/summon/events + name = "Summon Events" + desc = "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events." + var/times = 0 + +/datum/spellbook_entry/summon/events/IsAvailible() + if(!SSticker.mode) // In case spellbook is placed on map + return 0 + return !CONFIG_GET(flag/no_summon_events) + +/datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) + summonevents() + times++ + playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) + to_chat(user, "You have cast summon events.") + return 1 + +/datum/spellbook_entry/summon/events/GetInfo() + . = ..() + if(times>0) + . += "You cast it [times] times.
" + return . + +/obj/item/spellbook + name = "spell book" + desc = "An unearthly tome that glows with power." + icon = 'icons/obj/library.dmi' + icon_state ="book" + throw_speed = 2 + throw_range = 5 + w_class = WEIGHT_CLASS_TINY + persistence_replacement = /obj/item/spellbook/oneuse/random + var/uses = 10 + var/temp = null + var/tab = null + var/mob/living/carbon/human/owner + var/list/datum/spellbook_entry/entries = list() + var/list/categories = list() + +/obj/item/spellbook/examine(mob/user) + ..() + if(owner) + to_chat(user, "There is a small signature on the front cover: \"[owner]\".") + else + to_chat(user, "It appears to have no author.") + +/obj/item/spellbook/Initialize() + . = ..() + prepare_spells() + +/obj/item/spellbook/proc/prepare_spells() + var/entry_types = subtypesof(/datum/spellbook_entry) - /datum/spellbook_entry/item - /datum/spellbook_entry/summon + for(var/T in entry_types) + var/datum/spellbook_entry/E = new T + if(E.IsAvailible()) + entries |= E + categories |= E.category + else + qdel(E) + tab = categories[1] + +/obj/item/spellbook/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/antag_spawner/contract)) + var/obj/item/antag_spawner/contract/contract = O + if(contract.used) + to_chat(user, "The contract has been used, you can't get your points back now!") + else + to_chat(user, "You feed the contract back into the spellbook, refunding your points.") + uses++ + for(var/datum/spellbook_entry/item/contract/CT in entries) + if(!isnull(CT.limit)) + CT.limit++ + qdel(O) + else if(istype(O, /obj/item/antag_spawner/slaughter_demon)) + to_chat(user, "On second thought, maybe summoning a demon is a bad idea. You refund your points.") + uses++ + for(var/datum/spellbook_entry/item/bloodbottle/BB in entries) + if(!isnull(BB.limit)) + BB.limit++ + qdel(O) + +/obj/item/spellbook/proc/GetCategoryHeader(category) + var/dat = "" + switch(category) + if("Offensive") + dat += "Spells and items geared towards debilitating and destroying.

" + dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" + dat += "For spells: the number after the spell name is the cooldown time.
" + dat += "You can reduce this number by spending more points on the spell.
" + if("Defensive") + dat += "Spells and items geared towards improving your survivabilty or reducing foes' ability to attack.

" + dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" + dat += "For spells: the number after the spell name is the cooldown time.
" + dat += "You can reduce this number by spending more points on the spell.
" + if("Mobility") + dat += "Spells and items geared towards improving your ability to move. It is a good idea to take at least one.

" + dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" + dat += "For spells: the number after the spell name is the cooldown time.
" + dat += "You can reduce this number by spending more points on the spell.
" + if("Assistance") + dat += "Spells and items geared towards bringing in outside forces to aid you or improving upon your other items and abilties.

" + dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" + dat += "For spells: the number after the spell name is the cooldown time.
" + dat += "You can reduce this number by spending more points on the spell.
" + if("Challenges") + dat += "The Wizard Federation typically has hard limits on the potency and number of spells brought to the station based on risk.
" + dat += "Arming the station against you will increases the risk, but will grant you one more charge for your spellbook.
" + if("Rituals") + dat += "These powerful spells change the very fabric of reality. Not always in your favour.
" + return dat + +/obj/item/spellbook/proc/wrap(content) + var/dat = "" + dat +="Spellbook" + dat += {" + + + + "} + dat += {"[content]"} + return dat + +/obj/item/spellbook/attack_self(mob/user) + if(!owner) + to_chat(user, "You bind the spellbook to yourself.") + owner = user + return + if(user != owner) + to_chat(user, "The [name] does not recognize you as its owner and refuses to open!") + return + user.set_machine(src) + var/dat = "" + + dat += "" + + var/datum/spellbook_entry/E + for(var/i=1,i<=entries.len,i++) + var/spell_info = "" + E = entries[i] + spell_info += E.GetInfo() + if(E.CanBuy(user,src)) + spell_info+= "[E.buy_word]
" + else + spell_info+= "Can't [E.buy_word]
" + if(E.CanRefund(user,src)) + spell_info+= "Refund
" + spell_info += "
" + if(cat_dat[E.category]) + cat_dat[E.category] += spell_info + + for(var/category in categories) + dat += "
" + dat += GetCategoryHeader(category) + dat += cat_dat[category] + dat += "
" + + user << browse(wrap(dat), "window=spellbook;size=700x500") + onclose(user, "spellbook") + return + +/obj/item/spellbook/Topic(href, href_list) + ..() + var/mob/living/carbon/human/H = usr + + if(H.stat || H.restrained()) + return + if(!ishuman(H)) + return 1 + + if(H.mind.special_role == "apprentice") + temp = "If you got caught sneaking a peek from your teacher's spellbook, you'd likely be expelled from the Wizard Academy. Better not." + return + + var/datum/spellbook_entry/E = null + if(loc == H || (in_range(src, H) && isturf(loc))) + H.set_machine(src) + if(href_list["buy"]) + E = entries[text2num(href_list["buy"])] + if(E && E.CanBuy(H,src)) + if(E.Buy(H,src)) + if(E.limit) + E.limit-- + uses -= E.cost + else if(href_list["refund"]) + E = entries[text2num(href_list["refund"])] + if(E && E.refundable) + var/result = E.Refund(H,src) + if(result > 0) + if(!isnull(E.limit)) + E.limit += result + uses += result + else if(href_list["page"]) + tab = sanitize(href_list["page"]) + attack_self(H) + return + +//Single Use Spellbooks// + +/obj/item/spellbook/oneuse + var/spell = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile //just a placeholder to avoid runtimes if someone spawned the generic + var/spellname = "sandbox" + var/used = 0 + name = "spellbook of " + uses = 1 + desc = "This template spellbook was never meant for the eyes of man..." + persistence_replacement = null + +/obj/item/spellbook/oneuse/prepare_spells() + name += spellname + +/obj/item/spellbook/oneuse/attack_self(mob/user) + var/obj/effect/proc_holder/spell/S = new spell + for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) + if(knownspell.type == S.type) + if(user.mind) + if(iswizard(user)) + to_chat(user,"You're already far more versed in this spell than this flimsy how-to book can provide.") + else + to_chat(user,"You've already read this one.") + return + if(used) + recoil(user) + else + user.mind.AddSpell(S) + to_chat(user,"You rapidly read through the arcane book. Suddenly you realize you understand [spellname]!") + user.log_message("learned the spell [spellname] ([S]).", INDIVIDUAL_ATTACK_LOG) + onlearned(user) + +/obj/item/spellbook/oneuse/proc/recoil(mob/user) + user.visible_message("[src] glows in a black light!") + +/obj/item/spellbook/oneuse/proc/onlearned(mob/user) + used = 1 + user.visible_message("[src] glows dark for a second!") + +/obj/item/spellbook/oneuse/attackby() + return + +/obj/item/spellbook/oneuse/fireball + spell = /obj/effect/proc_holder/spell/aimed/fireball + spellname = "fireball" + icon_state ="bookfireball" + desc = "This book feels warm to the touch." + +/obj/item/spellbook/oneuse/fireball/recoil(mob/user) + ..() + explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2) + qdel(src) + +/obj/item/spellbook/oneuse/smoke + spell = /obj/effect/proc_holder/spell/targeted/smoke + spellname = "smoke" + icon_state ="booksmoke" + desc = "This book is overflowing with the dank arts." + +/obj/item/spellbook/oneuse/smoke/lesser //Chaplain smoke book + spell = /obj/effect/proc_holder/spell/targeted/smoke/lesser + +/obj/item/spellbook/oneuse/smoke/recoil(mob/user) + ..() + to_chat(user,"Your stomach rumbles...") + if(user.nutrition) + user.nutrition -= 200 + if(user.nutrition <= 0) + user.nutrition = 0 + + +/obj/item/spellbook/oneuse/blind + spell = /obj/effect/proc_holder/spell/targeted/trigger/blind + spellname = "blind" + icon_state ="bookblind" + desc = "This book looks blurry, no matter how you look at it." + +/obj/item/spellbook/oneuse/blind/recoil(mob/user) + ..() + to_chat(user,"You go blind!") + user.blind_eyes(10) + +/obj/item/spellbook/oneuse/mindswap + spell = /obj/effect/proc_holder/spell/targeted/mind_transfer + spellname = "mindswap" + icon_state ="bookmindswap" + desc = "This book's cover is pristine, though its pages look ragged and torn." + var/mob/stored_swap = null //Used in used book recoils to store an identity for mindswaps + +/obj/item/spellbook/oneuse/mindswap/onlearned() + spellname = pick("fireball","smoke","blind","forcewall","knock","barnyard","charge") + icon_state = "book[spellname]" + name = "spellbook of [spellname]" //Note, desc doesn't change by design + ..() + +/obj/item/spellbook/oneuse/mindswap/recoil(mob/user) + ..() + if(stored_swap in GLOB.dead_mob_list) + stored_swap = null + if(!stored_swap) + stored_swap = user + to_chat(user,"For a moment you feel like you don't even know who you are anymore.") + return + if(stored_swap == user) + to_chat(user,"You stare at the book some more, but there doesn't seem to be anything else to learn...") + return + + var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new + swapper.cast(user, stored_swap, 1) + + to_chat(stored_swap,"You're suddenly somewhere else... and someone else?!") + to_chat(user,"Suddenly you're staring at [src] again... where are you, who are you?!") + stored_swap = null + +/obj/item/spellbook/oneuse/forcewall + spell = /obj/effect/proc_holder/spell/targeted/forcewall + spellname = "forcewall" + icon_state ="bookforcewall" + desc = "This book has a dedication to mimes everywhere inside the front cover." + +/obj/item/spellbook/oneuse/forcewall/recoil(mob/living/user) + ..() + to_chat(user,"You suddenly feel very solid!") + user.Stun(40, ignore_canstun = TRUE) + user.petrify(30) + +/obj/item/spellbook/oneuse/knock + spell = /obj/effect/proc_holder/spell/aoe_turf/knock + spellname = "knock" + icon_state ="bookknock" + desc = "This book is hard to hold closed properly." + +/obj/item/spellbook/oneuse/knock/recoil(mob/living/user) + ..() + to_chat(user,"You're knocked down!") + user.Knockdown(40) + +/obj/item/spellbook/oneuse/barnyard + spell = /obj/effect/proc_holder/spell/targeted/barnyardcurse + spellname = "barnyard" + icon_state ="bookhorses" + desc = "This book is more horse than your mind has room for." + +/obj/item/spellbook/oneuse/barnyard/recoil(mob/living/carbon/user) + if(ishuman(user)) + to_chat(user,"HOR-SIE HAS RISEN") + var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead + magichead.flags_1 |= NODROP_1 //curses! + magichead.flags_inv &= ~HIDEFACE //so you can still see their face + magichead.voicechange = 1 //NEEEEIIGHH + if(!user.dropItemToGround(user.wear_mask)) + qdel(user.wear_mask) + user.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1) + qdel(src) + else + to_chat(user,"I say thee neigh") //It still lives here + +/obj/item/spellbook/oneuse/charge + spell = /obj/effect/proc_holder/spell/targeted/charge + spellname = "charging" + icon_state ="bookcharge" + desc = "This book is made of 100% post-consumer wizard." + +/obj/item/spellbook/oneuse/charge/recoil(mob/user) + ..() + to_chat(user,"[src] suddenly feels very warm!") + empulse(src, 1, 1) + +/obj/item/spellbook/oneuse/summonitem + spell = /obj/effect/proc_holder/spell/targeted/summonitem + spellname = "instant summons" + icon_state ="booksummons" + desc = "This book is bright and garish, very hard to miss." + +/obj/item/spellbook/oneuse/summonitem/recoil(mob/user) + ..() + to_chat(user,"[src] suddenly vanishes!") + qdel(src) + +/obj/item/spellbook/oneuse/random + icon_state = "random_book" + +/obj/item/spellbook/oneuse/random/Initialize() + ..() + var/static/banned_spells = list(/obj/item/spellbook/oneuse/mimery_blockade, /obj/item/spellbook/oneuse/mimery_guns) + var/real_type = pick(subtypesof(/obj/item/spellbook/oneuse) - banned_spells) + new real_type(loc) + return INITIALIZE_HINT_QDEL + +/obj/item/spellbook/oneuse/sacredflame + spell = /obj/effect/proc_holder/spell/targeted/sacred_flame + spellname = "sacred flame" + icon_state ="booksacredflame" + desc = "Become one with the flames that burn within... and invite others to do so as well." +>>>>>>> ca10fa6... Spell Cards (#36147) diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 80cbf11318..4edff70e6c 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -254,9 +254,7 @@ current_user.setDir(SOUTH) if(226 to 315) current_user.setDir(WEST) - var/difference = abs(lastangle - angle) - if(difference > 350) //Too lazy to properly math, detects 360 --> 0 changes. - difference = (lastangle > 350? ((360 - lastangle) + angle) : ((360 - angle) + lastangle)) + var/difference = abs(closer_angle_difference(lastangle, angle)) delay_penalty(difference * aiming_time_increase_angle_multiplier) lastangle = angle @@ -292,7 +290,7 @@ current_user = null if(istype(user)) current_user = user - LAZYADD(current_user.mousemove_intercept_objects, src) + LAZYOR(current_user.mousemove_intercept_objects, src) mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/on_mob_move)) /obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index ad1d0f76d0..af04402a93 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -46,8 +46,6 @@ var/ricochets_max = 2 var/ricochet_chance = 30 - var/colliding = FALSE //pause processing.. - //Hitscan var/hitscan = FALSE //Whether this is hitscan. If it is, speed is basically ignored. var/list/beam_segments //assoc list of datum/point or datum/point/vector, start = end. Used for hitscan effect generation. @@ -57,6 +55,15 @@ var/muzzle_type var/impact_type + //Homing + var/homing = FALSE + var/atom/homing_target + var/homing_turn_speed = 10 //Angle per tick. + var/homing_inaccuracy_min = 0 //in pixels for these. offsets are set once when setting target. + var/homing_inaccuracy_max = 0 + var/homing_offset_x = 0 + var/homing_offset_y = 0 + var/ignore_source_check = FALSE var/damage = 10 @@ -192,7 +199,6 @@ beam_segments[beam_index] = null /obj/item/projectile/Collide(atom/A) - colliding = TRUE var/datum/point/pcache = trajectory.copy_to() if(check_ricochet(A) && check_ricochet_flag(A) && ricochets < ricochets_max) ricochets++ @@ -208,7 +214,6 @@ trajectory_ignore_forcemove = TRUE forceMove(get_turf(A)) trajectory_ignore_forcemove = FALSE - colliding = FALSE return FALSE var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. @@ -227,7 +232,6 @@ trajectory_ignore_forcemove = TRUE forceMove(target_turf) trajectory_ignore_forcemove = FALSE - colliding = FALSE return FALSE var/permutation = A.bullet_act(src, def_zone) // searches for return value, could be deleted after run so check A isn't null @@ -237,17 +241,14 @@ trajectory_ignore_forcemove = FALSE if(A) permutated.Add(A) - colliding = FALSE return FALSE else var/atom/alt = select_target(A) if(alt) if(!prehit(alt)) - colliding = FALSE return FALSE alt.bullet_act(src, def_zone) qdel(src) - colliding = FALSE return TRUE /obj/item/projectile/proc/select_target(atom/A) //Selects another target from a wall if we hit a wall. @@ -350,7 +351,7 @@ trajectory_ignore_forcemove = TRUE forceMove(starting) trajectory_ignore_forcemove = FALSE - trajectory = new(starting.x, starting.y, starting.z, 0, 0, Angle, pixel_speed) + trajectory = new(starting.x, starting.y, starting.z, pixel_x, pixel_y, Angle, pixel_speed) last_projectile_move = world.time fired = TRUE if(hitscan) @@ -417,6 +418,8 @@ var/matrix/M = new M.Turn(Angle) transform = M + if(homing) + process_homing() trajectory.increment(trajectory_multiplier) var/turf/T = trajectory.return_turf() if(!istype(T)) @@ -445,10 +448,32 @@ Collide(original) Range() +/obj/item/projectile/proc/process_homing() //may need speeding up in the future performance wise. + if(!homing_target) + return FALSE + var/datum/point/PT = RETURN_PRECISE_POINT(homing_target) + PT.x += CLAMP(homing_offset_x, 1, world.maxx) + PT.y += CLAMP(homing_offset_y, 1, world.maxy) + var/angle = closer_angle_difference(Angle, angle_between_points(RETURN_PRECISE_POINT(src), PT)) + setAngle(Angle + CLAMP(angle, -homing_turn_speed, homing_turn_speed)) + +/obj/item/projectile/proc/set_homing_target(atom/A) + if(!A || (!isturf(A) && !isturf(A.loc))) + return FALSE + homing = TRUE + homing_target = A + homing_offset_x = rand(homing_inaccuracy_min, homing_inaccuracy_max) + homing_offset_y = rand(homing_inaccuracy_min, homing_inaccuracy_max) + if(prob(50)) + homing_offset_x = -homing_offset_x + if(prob(50)) + homing_offset_y = -homing_offset_y + //Returns true if the target atom is on our current turf and above the right layer /obj/item/projectile/proc/can_hit_target(atom/target, var/list/passthrough) return (target && ((target.layer >= PROJECTILE_HIT_THRESHHOLD_LAYER) || ismob(target)) && (loc == get_turf(target)) && (!(target in passthrough))) +//Spread is FORCED! /obj/item/projectile/proc/preparePixelProjectile(atom/target, atom/source, params, spread = 0) var/turf/curloc = get_turf(source) var/turf/targloc = get_turf(target) @@ -460,7 +485,7 @@ if(targloc || !params) yo = targloc.y - curloc.y xo = targloc.x - curloc.x - setAngle(Get_Angle(src, targloc)) + setAngle(Get_Angle(src, targloc) + spread) //CIT CHANGES START HERE - makes it so laying down makes you unable to shoot through most objects if(iscarbon(source)) @@ -474,14 +499,11 @@ p_x = calculated[2] p_y = calculated[3] - if(spread) - setAngle(calculated[1] + spread) - else - setAngle(calculated[1]) + setAngle(calculated[1] + spread) else if(targloc) yo = targloc.y - curloc.y xo = targloc.x - curloc.x - setAngle(Get_Angle(src, targloc)) + setAngle(Get_Angle(src, targloc) + spread) else stack_trace("WARNING: Projectile [type] fired without either mouse parameters, or a target atom to aim at!") qdel(src) diff --git a/code/modules/projectiles/projectile/magic/spellcard.dm b/code/modules/projectiles/projectile/magic/spellcard.dm new file mode 100644 index 0000000000..67e3ad374e --- /dev/null +++ b/code/modules/projectiles/projectile/magic/spellcard.dm @@ -0,0 +1,6 @@ +/obj/item/projectile/spellcard + name = "enchanted card" + desc = "A piece of paper enchanted to give it extreme durability and stiffness, along with a very hot burn to anyone unfortunate enough to get hit by a charged one." + icon_state = "spellcard" + damage_type = BURN + damage = 2 diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 6980cba8e2..6c860fda9b 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -9,6 +9,7 @@ var/list/projectile_var_overrides = list() var/projectile_amount = 1 //Projectiles per cast. var/current_amount = 0 //How many projectiles left. + var/projectiles_per_fire = 1 //Projectiles per fire. Probably not a good thing to use unless you override ready_projectile(). /obj/effect/proc_holder/spell/aimed/Click() var/mob/living/user = usr @@ -26,10 +27,18 @@ charge_counter = charge_max * refund_percent start_recharge() remove_ranged_ability(msg) + on_deactivation(user) else msg = "[active_msg]Left-click to shoot it at a target!" current_amount = projectile_amount add_ranged_ability(user, msg, TRUE) + on_activation(user) + +/obj/effect/proc_holder/spell/aimed/proc/on_activation(mob/user) + return + +/obj/effect/proc_holder/spell/aimed/proc/on_deactivation(mob/user) + return /obj/effect/proc_holder/spell/aimed/update_icon() if(!action) @@ -60,19 +69,25 @@ remove_ranged_ability() //Auto-disable the ability once you run out of bullets. charge_counter = 0 start_recharge() + on_deactivation(user) return TRUE /obj/effect/proc_holder/spell/aimed/proc/fire_projectile(mob/living/user, atom/target) current_amount-- - var/obj/item/projectile/P = new projectile_type(user.loc) - P.firer = user - P.preparePixelProjectile(target, user) - for(var/V in projectile_var_overrides) - if(P.vars[V]) - P.vv_edit_var(V, projectile_var_overrides[V]) - P.fire() + for(var/i in 1 to projectiles_per_fire) + var/obj/item/projectile/P = new projectile_type(user.loc) + P.firer = user + P.preparePixelProjectile(target, user) + for(var/V in projectile_var_overrides) + if(P.vars[V]) + P.vv_edit_var(V, projectile_var_overrides[V]) + ready_projectile(P, target, user, i) + P.fire() return TRUE +/obj/effect/proc_holder/spell/aimed/proc/ready_projectile(obj/item/projectile/P, atom/target, mob/user, iteration) + return + /obj/effect/proc_holder/spell/aimed/lightningbolt name = "Lightning Bolt" desc = "Fire a high powered lightning bolt at your foes!" @@ -108,3 +123,58 @@ active_msg = "You prepare to cast your fireball spell!" deactive_msg = "You extinguish your fireball... for now." active = FALSE + +/obj/effect/proc_holder/spell/aimed/spell_cards + name = "Spell Cards" + desc = "Blazing hot rapid-fire homing cards. Banish your foes with its mystical power!" + school = "evocation" + charge_max = 50 + clothes_req = 0 + invocation = "Sigi'lu M'Fan 'Tasia" + invocation_type = "shout" + range = 40 + cooldown_min = 10 + projectile_amount = 5 + projectiles_per_fire = 7 + projectile_type = /obj/item/projectile/spellcard + var/datum/weakref/current_target_weakref + var/projectile_turnrate = 10 + var/projectile_pixel_homing_spread = 32 + var/projectile_initial_spread_amount = 30 + var/projectile_location_spread_amount = 12 + var/datum/component/lockon_aiming/lockon_component + ranged_clickcd_override = 1 + +/obj/effect/proc_holder/spell/aimed/spell_cards/on_activation(mob/M) + QDEL_NULL(lockon_component) + lockon_component = M.AddComponent(/datum/component/lockon_aiming, 5, typecacheof(list(/mob/living)), 1, null, CALLBACK(src, .proc/on_lockon_component)) + +/obj/effect/proc_holder/spell/aimed/spell_cards/proc/on_lockon_component(list/locked_weakrefs) + if(!length(locked_weakrefs)) + current_target_weakref = null + return + current_target_weakref = locked_weakrefs[1] + var/atom/A = current_target_weakref.resolve() + if(A) + var/mob/M = lockon_component.parent + M.face_atom(A) + +/obj/effect/proc_holder/spell/aimed/spell_cards/on_deactivation(mob/M) + QDEL_NULL(lockon_component) + +/obj/effect/proc_holder/spell/aimed/spell_cards/ready_projectile(obj/item/projectile/P, atom/target, mob/user, iteration) + if(current_target_weakref) + var/atom/A = current_target_weakref.resolve() + if(A && get_dist(A, user) < 7) + P.homing_turn_speed = projectile_turnrate + P.homing_inaccuracy_min = projectile_pixel_homing_spread + P.homing_inaccuracy_max = projectile_pixel_homing_spread + P.set_homing_target(current_target_weakref.resolve()) + var/rand_spr = rand() + var/total_angle = projectile_initial_spread_amount * 2 + var/adjusted_angle = total_angle - ((projectile_initial_spread_amount / projectiles_per_fire) * 0.5) + var/one_fire_angle = adjusted_angle / projectiles_per_fire + var/current_angle = iteration * one_fire_angle * rand_spr - (projectile_initial_spread_amount / 2) + P.pixel_x = rand(-projectile_location_spread_amount, projectile_location_spread_amount) + P.pixel_y = rand(-projectile_location_spread_amount, projectile_location_spread_amount) + P.preparePixelProjectile(target, user, null, current_angle) diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 34e6a8134bf18f9d841a99fd68c03644437f0862..2d0d35f8a51aadcafeccc8da322202aa43408983 100644 GIT binary patch delta 1971 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 JPDHLkV1hz88qELz diff --git a/tgstation.dme b/tgstation.dme index 9cdd76edd2..62082a27f2 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -109,6 +109,7 @@ #include "code\__HELPERS\level_traits.dm" #include "code\__HELPERS\matrices.dm" #include "code\__HELPERS\mobs.dm" +#include "code\__HELPERS\mouse_control.dm" #include "code\__HELPERS\names.dm" #include "code\__HELPERS\priority_announce.dm" #include "code\__HELPERS\pronouns.dm" @@ -325,6 +326,7 @@ #include "code\datums\components\infective.dm" #include "code\datums\components\jousting.dm" #include "code\datums\components\knockoff.dm" +#include "code\datums\components\lockon_aiming.dm" #include "code\datums\components\material_container.dm" #include "code\datums\components\mood.dm" #include "code\datums\components\ntnet_interface.dm" @@ -2289,6 +2291,7 @@ #include "code\modules\projectiles\projectile\energy\net_snare.dm" #include "code\modules\projectiles\projectile\energy\stun.dm" #include "code\modules\projectiles\projectile\energy\tesla.dm" +#include "code\modules\projectiles\projectile\magic\spellcard.dm" #include "code\modules\projectiles\projectile\reusable\_reusable.dm" #include "code\modules\projectiles\projectile\reusable\foam_dart.dm" #include "code\modules\projectiles\projectile\reusable\magspear.dm" From 66fc54fcd9c2002ddfc00b5546d69a45d7b5f0f7 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Tue, 27 Mar 2018 13:43:48 -0400 Subject: [PATCH 002/114] Update spellbook.dm --- .../antagonists/wizard/equipment/spellbook.dm | 911 ------------------ 1 file changed, 911 deletions(-) diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 8b2ee4083c..55795afd82 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -1,913 +1,3 @@ -<<<<<<< HEAD -/datum/spellbook_entry - var/name = "Entry Name" - - var/spell_type = null - var/desc = "" - var/category = "Offensive" - var/cost = 2 - var/refundable = 1 - var/surplus = -1 // -1 for infinite, not used by anything atm - var/obj/effect/proc_holder/spell/S = null //Since spellbooks can be used by only one person anyway we can track the actual spell - var/buy_word = "Learn" - var/limit //used to prevent a spellbook_entry from being bought more than X times with one wizard spellbook - var/list/no_coexistance_typecache //Used so you can't have specific spells together - -/datum/spellbook_entry/New() - ..() - no_coexistance_typecache = typecacheof(no_coexistance_typecache) - -/datum/spellbook_entry/proc/IsAvailible() // For config prefs / gamemode restrictions - these are round applied - return 1 - -/datum/spellbook_entry/proc/CanBuy(mob/living/carbon/human/user,obj/item/spellbook/book) // Specific circumstances - if(book.uses= aspell.level_max) - to_chat(user, "This spell cannot be improved further.") - return 0 - else - aspell.name = initial(aspell.name) - aspell.spell_level++ - aspell.charge_max = round(initial(aspell.charge_max) - aspell.spell_level * (initial(aspell.charge_max) - aspell.cooldown_min)/ aspell.level_max) - if(aspell.charge_max < aspell.charge_counter) - aspell.charge_counter = aspell.charge_max - switch(aspell.spell_level) - if(1) - to_chat(user, "You have improved [aspell.name] into Efficient [aspell.name].") - aspell.name = "Efficient [aspell.name]" - if(2) - to_chat(user, "You have further improved [aspell.name] into Quickened [aspell.name].") - aspell.name = "Quickened [aspell.name]" - if(3) - to_chat(user, "You have further improved [aspell.name] into Free [aspell.name].") - aspell.name = "Free [aspell.name]" - if(4) - to_chat(user, "You have further improved [aspell.name] into Instant [aspell.name].") - aspell.name = "Instant [aspell.name]" - if(aspell.spell_level >= aspell.level_max) - to_chat(user, "This spell cannot be strengthened any further.") - SSblackbox.record_feedback("nested tally", "wizard_spell_improved", 1, list("[name]", "[aspell.spell_level]")) - return 1 - //No same spell found - just learn it - SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) - user.mind.AddSpell(S) - to_chat(user, "You have learned [S.name].") - return 1 - -/datum/spellbook_entry/proc/CanRefund(mob/living/carbon/human/user,obj/item/spellbook/book) - if(!refundable) - return 0 - if(!S) - S = new spell_type() - for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) - if(initial(S.name) == initial(aspell.name)) - return 1 - return 0 - -/datum/spellbook_entry/proc/Refund(mob/living/carbon/human/user,obj/item/spellbook/book) //return point value or -1 for failure - var/area/wizard_station/A = locate() in GLOB.sortedAreas - if(!(user in A.contents)) - to_chat(user, "You can only refund spells at the wizard lair") - return -1 - if(!S) - S = new spell_type() - var/spell_levels = 0 - for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) - if(initial(S.name) == initial(aspell.name)) - spell_levels = aspell.spell_level - user.mind.spell_list.Remove(aspell) - qdel(S) - return cost * (spell_levels+1) - return -1 -/datum/spellbook_entry/proc/GetInfo() - if(!S) - S = new spell_type() - var/dat ="" - dat += "[initial(S.name)]" - if(S.charge_type == "recharge") - dat += " Cooldown:[S.charge_max/10]" - dat += " Cost:[cost]
" - dat += "[S.desc][desc]
" - dat += "[S.clothes_req?"Needs wizard garb":"Can be cast without wizard garb"]
" - return dat - -/datum/spellbook_entry/fireball - name = "Fireball" - spell_type = /obj/effect/proc_holder/spell/aimed/fireball - -/datum/spellbook_entry/rod_form - name = "Rod Form" - spell_type = /obj/effect/proc_holder/spell/targeted/rod_form - -/datum/spellbook_entry/magicm - name = "Magic Missile" - spell_type = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile - category = "Defensive" - -/datum/spellbook_entry/disintegrate - name = "Disintegrate" - spell_type = /obj/effect/proc_holder/spell/targeted/touch/disintegrate - -/datum/spellbook_entry/disabletech - name = "Disable Tech" - spell_type = /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech - category = "Defensive" - cost = 1 - -/datum/spellbook_entry/repulse - name = "Repulse" - spell_type = /obj/effect/proc_holder/spell/aoe_turf/repulse - category = "Defensive" - -/datum/spellbook_entry/lightningPacket - name = "Lightning bolt! Lightning bolt!" - spell_type = /obj/effect/proc_holder/spell/targeted/conjure_item/spellpacket - category = "Defensive" - -/datum/spellbook_entry/timestop - name = "Time Stop" - spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/timestop - category = "Defensive" - -/datum/spellbook_entry/smoke - name = "Smoke" - spell_type = /obj/effect/proc_holder/spell/targeted/smoke - category = "Defensive" - cost = 1 - -/datum/spellbook_entry/blind - name = "Blind" - spell_type = /obj/effect/proc_holder/spell/targeted/trigger/blind - cost = 1 - -/datum/spellbook_entry/mindswap - name = "Mindswap" - spell_type = /obj/effect/proc_holder/spell/targeted/mind_transfer - category = "Mobility" - -/datum/spellbook_entry/forcewall - name = "Force Wall" - spell_type = /obj/effect/proc_holder/spell/targeted/forcewall - category = "Defensive" - cost = 1 - -/datum/spellbook_entry/blink - name = "Blink" - spell_type = /obj/effect/proc_holder/spell/targeted/turf_teleport/blink - category = "Mobility" - -/datum/spellbook_entry/teleport - name = "Teleport" - spell_type = /obj/effect/proc_holder/spell/targeted/area_teleport/teleport - category = "Mobility" - -/datum/spellbook_entry/mutate - name = "Mutate" - spell_type = /obj/effect/proc_holder/spell/targeted/genetic/mutate - -/datum/spellbook_entry/jaunt - name = "Ethereal Jaunt" - spell_type = /obj/effect/proc_holder/spell/targeted/ethereal_jaunt - category = "Mobility" - -/datum/spellbook_entry/knock - name = "Knock" - spell_type = /obj/effect/proc_holder/spell/aoe_turf/knock - category = "Mobility" - cost = 1 - -/datum/spellbook_entry/fleshtostone - name = "Flesh to Stone" - spell_type = /obj/effect/proc_holder/spell/targeted/touch/flesh_to_stone - -/datum/spellbook_entry/summonitem - name = "Summon Item" - spell_type = /obj/effect/proc_holder/spell/targeted/summonitem - category = "Assistance" - cost = 1 - -/datum/spellbook_entry/lichdom - name = "Bind Soul" - spell_type = /obj/effect/proc_holder/spell/targeted/lichdom - category = "Defensive" - -/datum/spellbook_entry/teslablast - name = "Tesla Blast" - spell_type = /obj/effect/proc_holder/spell/targeted/tesla - -/datum/spellbook_entry/lightningbolt - name = "Lightning Bolt" - spell_type = /obj/effect/proc_holder/spell/aimed/lightningbolt - cost = 3 - -/datum/spellbook_entry/lightningbolt/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) //return 1 on success - . = ..() - user.flags_2 |= TESLA_IGNORE_2 - -/datum/spellbook_entry/infinite_guns - name = "Lesser Summon Guns" - spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun - cost = 3 - no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - -/datum/spellbook_entry/arcane_barrage - name = "Arcane Barrage" - spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - cost = 3 - no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun - -/datum/spellbook_entry/barnyard - name = "Barnyard Curse" - spell_type = /obj/effect/proc_holder/spell/targeted/barnyardcurse - -/datum/spellbook_entry/charge - name = "Charge" - spell_type = /obj/effect/proc_holder/spell/targeted/charge - category = "Assistance" - cost = 1 - -/datum/spellbook_entry/shapeshift - name = "Wild Shapeshift" - spell_type = /obj/effect/proc_holder/spell/targeted/shapeshift - category = "Assistance" - cost = 1 - -/datum/spellbook_entry/spacetime_dist - name = "Spacetime Distortion" - spell_type = /obj/effect/proc_holder/spell/spacetime_dist - category = "Defensive" - cost = 1 - -/datum/spellbook_entry/the_traps - name = "The Traps!" - spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/the_traps - category = "Defensive" - cost = 1 - - -/datum/spellbook_entry/item - name = "Buy Item" - refundable = 0 - buy_word = "Summon" - var/item_path= null - - -/datum/spellbook_entry/item/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) - new item_path(get_turf(user)) - SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) - return 1 - -/datum/spellbook_entry/item/GetInfo() - var/dat ="" - dat += "[name]" - dat += " Cost:[cost]
" - dat += "[desc]
" - if(surplus>=0) - dat += "[surplus] left.
" - return dat - -/datum/spellbook_entry/item/staffchange - name = "Staff of Change" - desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." - item_path = /obj/item/gun/magic/staff/change - -/datum/spellbook_entry/item/staffanimation - name = "Staff of Animation" - desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines." - item_path = /obj/item/gun/magic/staff/animate - category = "Assistance" - -/datum/spellbook_entry/item/staffchaos - name = "Staff of Chaos" - desc = "A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended." - item_path = /obj/item/gun/magic/staff/chaos - -/datum/spellbook_entry/item/spellblade - name = "Spellblade" - desc = "A sword capable of firing blasts of energy which rip targets limb from limb." - item_path = /obj/item/gun/magic/staff/spellblade - -/datum/spellbook_entry/item/staffdoor - name = "Staff of Door Creation" - desc = "A particular staff that can mold solid metal into ornate doors. Useful for getting around in the absence of other transportation. Does not work on glass." - item_path = /obj/item/gun/magic/staff/door - cost = 1 - category = "Mobility" - -/datum/spellbook_entry/item/staffhealing - name = "Staff of Healing" - desc = "An altruistic staff that can heal the lame and raise the dead." - item_path = /obj/item/gun/magic/staff/healing - cost = 1 - category = "Defensive" - -/datum/spellbook_entry/item/scryingorb - name = "Scrying Orb" - desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision." - item_path = /obj/item/scrying - category = "Defensive" - -/datum/spellbook_entry/item/soulstones - name = "Six Soul Stone Shards and the spell Artificer" - desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot." - item_path = /obj/item/storage/belt/soulstone/full - category = "Assistance" - -/datum/spellbook_entry/item/soulstones/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) - . =..() - if(.) - user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(null)) - return . - -/datum/spellbook_entry/item/necrostone - name = "A Necromantic Stone" - desc = "A Necromantic stone is able to resurrect three dead individuals as skeletal thralls for you to command." - item_path = /obj/item/device/necromantic_stone - category = "Assistance" - -/datum/spellbook_entry/item/wands - name = "Wand Assortment" - desc = "A collection of wands that allow for a wide variety of utility. Wands have a limited number of charges, so be conservative in use. Comes in a handy belt." - item_path = /obj/item/storage/belt/wands/full - category = "Defensive" - -/datum/spellbook_entry/item/armor - name = "Mastercrafted Armor Set" - desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space." - item_path = /obj/item/clothing/suit/space/hardsuit/wizard - category = "Defensive" - -/datum/spellbook_entry/item/armor/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) - . = ..() - if(.) - new /obj/item/clothing/shoes/sandal/magic(get_turf(user)) //In case they've lost them. - new /obj/item/clothing/gloves/color/purple(get_turf(user))//To complete the outfit - -/datum/spellbook_entry/item/contract - name = "Contract of Apprenticeship" - desc = "A magical contract binding an apprentice wizard to your service, using it will summon them to your side." - item_path = /obj/item/antag_spawner/contract - category = "Assistance" - -/datum/spellbook_entry/item/guardian - name = "Guardian Deck" - desc = "A deck of guardian tarot cards, capable of binding a personal guardian to your body. There are multiple types of guardian available, but all of them will transfer some amount of damage to you. \ - It would be wise to avoid buying these with anything capable of causing you to swap bodies with others." - item_path = /obj/item/guardiancreator/choose/wizard - category = "Assistance" - -/datum/spellbook_entry/item/guardian/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) - . = ..() - if(.) - new /obj/item/paper/guides/antag/guardian/wizard(get_turf(user)) - -/datum/spellbook_entry/item/bloodbottle - name = "Bottle of Blood" - desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim." - item_path = /obj/item/antag_spawner/slaughter_demon - limit = 3 - category = "Assistance" - -/datum/spellbook_entry/item/hugbottle - name = "Bottle of Tickles" - desc = "A bottle of magically infused fun, the smell of which will \ - attract adorable extradimensional beings when broken. These beings \ - are similar to slaughter demons, but they do not permamently kill \ - their victims, instead putting them in an extradimensional hugspace, \ - to be released on the demon's death. Chaotic, but not ultimately \ - damaging. The crew's reaction to the other hand could be very \ - destructive." - item_path = /obj/item/antag_spawner/slaughter_demon/laughter - cost = 1 //non-destructive; it's just a jape, sibling! - limit = 3 - category = "Assistance" - -/datum/spellbook_entry/item/mjolnir - name = "Mjolnir" - desc = "A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power." - item_path = /obj/item/twohanded/mjollnir - -/datum/spellbook_entry/item/singularity_hammer - name = "Singularity Hammer" - desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everything nearby to the point of impact." - item_path = /obj/item/twohanded/singularityhammer - -/datum/spellbook_entry/item/battlemage - name = "Battlemage Armour" - desc = "An ensorcelled suit of armour, protected by a powerful shield. The shield can completly negate sixteen attacks before being permanently depleted." - item_path = /obj/item/clothing/suit/space/hardsuit/shielded/wizard - limit = 1 - category = "Defensive" - -/datum/spellbook_entry/item/battlemage_charge - name = "Battlemage Armour Charges" - desc = "A powerful defensive rune, it will grant eight additional charges to a suit of battlemage armour." - item_path = /obj/item/wizard_armour_charge - category = "Defensive" - cost = 1 - -/datum/spellbook_entry/item/warpwhistle - name = "Warp Whistle" - desc = "A strange whistle that will transport you to a distant safe place on the station. There is a window of vulnerability at the beginning of every use." - item_path = /obj/item/warpwhistle - category = "Mobility" - cost = 1 - -/datum/spellbook_entry/summon - name = "Summon Stuff" - category = "Rituals" - refundable = 0 - buy_word = "Cast" - var/active = 0 - -/datum/spellbook_entry/summon/CanBuy(mob/living/carbon/human/user,obj/item/spellbook/book) - return ..() && !active - -/datum/spellbook_entry/summon/GetInfo() - var/dat ="" - dat += "[name]" - if(cost>0) - dat += " Cost:[cost]
" - else - dat += " No Cost
" - dat += "[desc]
" - if(active) - dat += "Already cast!
" - return dat - -/datum/spellbook_entry/summon/ghosts - name = "Summon Ghosts" - desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilties to frustrate you." - cost = 0 - -/datum/spellbook_entry/summon/ghosts/IsAvailible() - if(!SSticker.mode) - return FALSE - else - return TRUE - -/datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) - SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) - new /datum/round_event/wizard/ghost() - active = TRUE - to_chat(user, "You have cast summon ghosts!") - playsound(get_turf(user), 'sound/effects/ghost2.ogg', 50, 1) - return TRUE - -/datum/spellbook_entry/summon/guns - name = "Summon Guns" - desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!" - -/datum/spellbook_entry/summon/guns/IsAvailible() - if(!SSticker.mode) // In case spellbook is placed on map - return 0 - return !CONFIG_GET(flag/no_summon_guns) - -/datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) - SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) - rightandwrong(SUMMON_GUNS, user, 25) - active = 1 - playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) - to_chat(user, "You have cast summon guns!") - return 1 - -/datum/spellbook_entry/summon/magic - name = "Summon Magic" - desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time." - -/datum/spellbook_entry/summon/magic/IsAvailible() - if(!SSticker.mode) // In case spellbook is placed on map - return 0 - return !CONFIG_GET(flag/no_summon_magic) - -/datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) - SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) - rightandwrong(SUMMON_MAGIC, user, 25) - active = 1 - playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) - to_chat(user, "You have cast summon magic!") - return 1 - -/datum/spellbook_entry/summon/events - name = "Summon Events" - desc = "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events." - var/times = 0 - -/datum/spellbook_entry/summon/events/IsAvailible() - if(!SSticker.mode) // In case spellbook is placed on map - return 0 - return !CONFIG_GET(flag/no_summon_events) - -/datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) - SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) - summonevents() - times++ - playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) - to_chat(user, "You have cast summon events.") - return 1 - -/datum/spellbook_entry/summon/events/GetInfo() - . = ..() - if(times>0) - . += "You cast it [times] times.
" - return . - -/obj/item/spellbook - name = "spell book" - desc = "An unearthly tome that glows with power." - icon = 'icons/obj/library.dmi' - icon_state ="book" - throw_speed = 2 - throw_range = 5 - w_class = WEIGHT_CLASS_TINY - persistence_replacement = /obj/item/spellbook/oneuse/random - var/uses = 10 - var/temp = null - var/tab = null - var/mob/living/carbon/human/owner - var/list/datum/spellbook_entry/entries = list() - var/list/categories = list() - -/obj/item/spellbook/examine(mob/user) - ..() - if(owner) - to_chat(user, "There is a small signature on the front cover: \"[owner]\".") - else - to_chat(user, "It appears to have no author.") - -/obj/item/spellbook/Initialize() - . = ..() - prepare_spells() - -/obj/item/spellbook/proc/prepare_spells() - var/entry_types = subtypesof(/datum/spellbook_entry) - /datum/spellbook_entry/item - /datum/spellbook_entry/summon - for(var/T in entry_types) - var/datum/spellbook_entry/E = new T - if(E.IsAvailible()) - entries |= E - categories |= E.category - else - qdel(E) - tab = categories[1] - -/obj/item/spellbook/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/antag_spawner/contract)) - var/obj/item/antag_spawner/contract/contract = O - if(contract.used) - to_chat(user, "The contract has been used, you can't get your points back now!") - else - to_chat(user, "You feed the contract back into the spellbook, refunding your points.") - uses++ - for(var/datum/spellbook_entry/item/contract/CT in entries) - if(!isnull(CT.limit)) - CT.limit++ - qdel(O) - else if(istype(O, /obj/item/antag_spawner/slaughter_demon)) - to_chat(user, "On second thought, maybe summoning a demon is a bad idea. You refund your points.") - uses++ - for(var/datum/spellbook_entry/item/bloodbottle/BB in entries) - if(!isnull(BB.limit)) - BB.limit++ - qdel(O) - -/obj/item/spellbook/proc/GetCategoryHeader(category) - var/dat = "" - switch(category) - if("Offensive") - dat += "Spells and items geared towards debilitating and destroying.

" - dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" - dat += "For spells: the number after the spell name is the cooldown time.
" - dat += "You can reduce this number by spending more points on the spell.
" - if("Defensive") - dat += "Spells and items geared towards improving your survivabilty or reducing foes' ability to attack.

" - dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" - dat += "For spells: the number after the spell name is the cooldown time.
" - dat += "You can reduce this number by spending more points on the spell.
" - if("Mobility") - dat += "Spells and items geared towards improving your ability to move. It is a good idea to take at least one.

" - dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" - dat += "For spells: the number after the spell name is the cooldown time.
" - dat += "You can reduce this number by spending more points on the spell.
" - if("Assistance") - dat += "Spells and items geared towards bringing in outside forces to aid you or improving upon your other items and abilties.

" - dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" - dat += "For spells: the number after the spell name is the cooldown time.
" - dat += "You can reduce this number by spending more points on the spell.
" - if("Challenges") - dat += "The Wizard Federation typically has hard limits on the potency and number of spells brought to the station based on risk.
" - dat += "Arming the station against you will increases the risk, but will grant you one more charge for your spellbook.
" - if("Rituals") - dat += "These powerful spells change the very fabric of reality. Not always in your favour.
" - return dat - -/obj/item/spellbook/proc/wrap(content) - var/dat = "" - dat +="Spellbook" - dat += {" - - - - "} - dat += {"[content]"} - return dat - -/obj/item/spellbook/attack_self(mob/user) - if(!owner) - to_chat(user, "You bind the spellbook to yourself.") - owner = user - return - if(user != owner) - to_chat(user, "The [name] does not recognize you as its owner and refuses to open!") - return - user.set_machine(src) - var/dat = "" - - dat += "" - - var/datum/spellbook_entry/E - for(var/i=1,i<=entries.len,i++) - var/spell_info = "" - E = entries[i] - spell_info += E.GetInfo() - if(E.CanBuy(user,src)) - spell_info+= "[E.buy_word]
" - else - spell_info+= "Can't [E.buy_word]
" - if(E.CanRefund(user,src)) - spell_info+= "Refund
" - spell_info += "
" - if(cat_dat[E.category]) - cat_dat[E.category] += spell_info - - for(var/category in categories) - dat += "
" - dat += GetCategoryHeader(category) - dat += cat_dat[category] - dat += "
" - - user << browse(wrap(dat), "window=spellbook;size=700x500") - onclose(user, "spellbook") - return - -/obj/item/spellbook/Topic(href, href_list) - ..() - var/mob/living/carbon/human/H = usr - - if(H.stat || H.restrained()) - return - if(!ishuman(H)) - return 1 - - if(H.mind.special_role == "apprentice") - temp = "If you got caught sneaking a peek from your teacher's spellbook, you'd likely be expelled from the Wizard Academy. Better not." - return - - var/datum/spellbook_entry/E = null - if(loc == H || (in_range(src, H) && isturf(loc))) - H.set_machine(src) - if(href_list["buy"]) - E = entries[text2num(href_list["buy"])] - if(E && E.CanBuy(H,src)) - if(E.Buy(H,src)) - if(E.limit) - E.limit-- - uses -= E.cost - else if(href_list["refund"]) - E = entries[text2num(href_list["refund"])] - if(E && E.refundable) - var/result = E.Refund(H,src) - if(result > 0) - if(!isnull(E.limit)) - E.limit += result - uses += result - else if(href_list["page"]) - tab = sanitize(href_list["page"]) - attack_self(H) - return - -//Single Use Spellbooks// - -/obj/item/spellbook/oneuse - var/spell = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile //just a placeholder to avoid runtimes if someone spawned the generic - var/spellname = "sandbox" - var/used = 0 - name = "spellbook of " - uses = 1 - desc = "This template spellbook was never meant for the eyes of man..." - persistence_replacement = null - -/obj/item/spellbook/oneuse/prepare_spells() - name += spellname - -/obj/item/spellbook/oneuse/attack_self(mob/user) - var/obj/effect/proc_holder/spell/S = new spell - for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list) - if(knownspell.type == S.type) - if(user.mind) - if(iswizard(user)) - to_chat(user,"You're already far more versed in this spell than this flimsy how-to book can provide.") - else - to_chat(user,"You've already read this one.") - return - if(used) - recoil(user) - else - user.mind.AddSpell(S) - to_chat(user,"You rapidly read through the arcane book. Suddenly you realize you understand [spellname]!") - user.log_message("learned the spell [spellname] ([S]).", INDIVIDUAL_ATTACK_LOG) - onlearned(user) - -/obj/item/spellbook/oneuse/proc/recoil(mob/user) - user.visible_message("[src] glows in a black light!") - -/obj/item/spellbook/oneuse/proc/onlearned(mob/user) - used = 1 - user.visible_message("[src] glows dark for a second!") - -/obj/item/spellbook/oneuse/attackby() - return - -/obj/item/spellbook/oneuse/fireball - spell = /obj/effect/proc_holder/spell/aimed/fireball - spellname = "fireball" - icon_state ="bookfireball" - desc = "This book feels warm to the touch." - -/obj/item/spellbook/oneuse/fireball/recoil(mob/user) - ..() - explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2) - qdel(src) - -/obj/item/spellbook/oneuse/smoke - spell = /obj/effect/proc_holder/spell/targeted/smoke - spellname = "smoke" - icon_state ="booksmoke" - desc = "This book is overflowing with the dank arts." - -/obj/item/spellbook/oneuse/smoke/lesser //Chaplain smoke book - spell = /obj/effect/proc_holder/spell/targeted/smoke/lesser - -/obj/item/spellbook/oneuse/smoke/recoil(mob/user) - ..() - to_chat(user,"Your stomach rumbles...") - if(user.nutrition) - user.nutrition -= 200 - if(user.nutrition <= 0) - user.nutrition = 0 - - -/obj/item/spellbook/oneuse/blind - spell = /obj/effect/proc_holder/spell/targeted/trigger/blind - spellname = "blind" - icon_state ="bookblind" - desc = "This book looks blurry, no matter how you look at it." - -/obj/item/spellbook/oneuse/blind/recoil(mob/user) - ..() - to_chat(user,"You go blind!") - user.blind_eyes(10) - -/obj/item/spellbook/oneuse/mindswap - spell = /obj/effect/proc_holder/spell/targeted/mind_transfer - spellname = "mindswap" - icon_state ="bookmindswap" - desc = "This book's cover is pristine, though its pages look ragged and torn." - var/mob/stored_swap = null //Used in used book recoils to store an identity for mindswaps - -/obj/item/spellbook/oneuse/mindswap/onlearned() - spellname = pick("fireball","smoke","blind","forcewall","knock","barnyard","charge") - icon_state = "book[spellname]" - name = "spellbook of [spellname]" //Note, desc doesn't change by design - ..() - -/obj/item/spellbook/oneuse/mindswap/recoil(mob/user) - ..() - if(stored_swap in GLOB.dead_mob_list) - stored_swap = null - if(!stored_swap) - stored_swap = user - to_chat(user,"For a moment you feel like you don't even know who you are anymore.") - return - if(stored_swap == user) - to_chat(user,"You stare at the book some more, but there doesn't seem to be anything else to learn...") - return - - var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new - swapper.cast(user, stored_swap, 1) - - to_chat(stored_swap,"You're suddenly somewhere else... and someone else?!") - to_chat(user,"Suddenly you're staring at [src] again... where are you, who are you?!") - stored_swap = null - -/obj/item/spellbook/oneuse/forcewall - spell = /obj/effect/proc_holder/spell/targeted/forcewall - spellname = "forcewall" - icon_state ="bookforcewall" - desc = "This book has a dedication to mimes everywhere inside the front cover." - -/obj/item/spellbook/oneuse/forcewall/recoil(mob/living/user) - ..() - to_chat(user,"You suddenly feel very solid!") - user.Stun(40, ignore_canstun = TRUE) - user.petrify(30) - -/obj/item/spellbook/oneuse/knock - spell = /obj/effect/proc_holder/spell/aoe_turf/knock - spellname = "knock" - icon_state ="bookknock" - desc = "This book is hard to hold closed properly." - -/obj/item/spellbook/oneuse/knock/recoil(mob/living/user) - ..() - to_chat(user,"You're knocked down!") - user.Knockdown(40) - -/obj/item/spellbook/oneuse/barnyard - spell = /obj/effect/proc_holder/spell/targeted/barnyardcurse - spellname = "barnyard" - icon_state ="bookhorses" - desc = "This book is more horse than your mind has room for." - -/obj/item/spellbook/oneuse/barnyard/recoil(mob/living/carbon/user) - if(ishuman(user)) - to_chat(user,"HOR-SIE HAS RISEN") - var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead - magichead.flags_1 |= NODROP_1 //curses! - magichead.flags_inv &= ~HIDEFACE //so you can still see their face - magichead.voicechange = 1 //NEEEEIIGHH - if(!user.dropItemToGround(user.wear_mask)) - qdel(user.wear_mask) - user.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1) - qdel(src) - else - to_chat(user,"I say thee neigh") //It still lives here - -/obj/item/spellbook/oneuse/charge - spell = /obj/effect/proc_holder/spell/targeted/charge - spellname = "charging" - icon_state ="bookcharge" - desc = "This book is made of 100% post-consumer wizard." - -/obj/item/spellbook/oneuse/charge/recoil(mob/user) - ..() - to_chat(user,"[src] suddenly feels very warm!") - empulse(src, 1, 1) - -/obj/item/spellbook/oneuse/summonitem - spell = /obj/effect/proc_holder/spell/targeted/summonitem - spellname = "instant summons" - icon_state ="booksummons" - desc = "This book is bright and garish, very hard to miss." - -/obj/item/spellbook/oneuse/summonitem/recoil(mob/user) - ..() - to_chat(user,"[src] suddenly vanishes!") - qdel(src) - -/obj/item/spellbook/oneuse/random - icon_state = "random_book" - -/obj/item/spellbook/oneuse/random/Initialize() - ..() - var/static/banned_spells = list(/obj/item/spellbook/oneuse/mimery_blockade, /obj/item/spellbook/oneuse/mimery_guns) - var/real_type = pick(subtypesof(/obj/item/spellbook/oneuse) - banned_spells) - new real_type(loc) - return INITIALIZE_HINT_QDEL - -/obj/item/spellbook/oneuse/sacredflame - spell = /obj/effect/proc_holder/spell/targeted/sacred_flame - spellname = "sacred flame" - icon_state ="booksacredflame" - desc = "Become one with the flames that burn within... and invite others to do so as well." -======= /datum/spellbook_entry var/name = "Entry Name" @@ -1820,4 +910,3 @@ spellname = "sacred flame" icon_state ="booksacredflame" desc = "Become one with the flames that burn within... and invite others to do so as well." ->>>>>>> ca10fa6... Spell Cards (#36147) From 30d5f3af1788699785ab2d5ef1176c2b2224c4f0 Mon Sep 17 00:00:00 2001 From: Dennok Date: Wed, 28 Mar 2018 16:18:37 +0300 Subject: [PATCH 003/114] Pipenet fix (#36230) * Pipenet fix Fix of Runtime in components_base.dm,91: Cannot read null.parents proc name: returnPipenet Return working releaseAirToTurf() on pipe Destroy() Block of self merge what cause pipeline anihilation. * up * maintainer abuse --- code/modules/atmospherics/machinery/datum_pipeline.dm | 2 ++ code/modules/atmospherics/machinery/pipes/pipes.dm | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index f4d8d54805..0b848968d1 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -105,6 +105,8 @@ addMachineryMember(A) /datum/pipeline/proc/merge(datum/pipeline/E) + if(E == src) + return air.volume += E.air.volume members.Add(E.members) for(var/obj/machinery/atmospherics/pipe/S in E.members) diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 73aaa16820..477cbbc76d 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -79,9 +79,10 @@ parent = P /obj/machinery/atmospherics/pipe/Destroy() + QDEL_NULL(parent) + releaseAirToTurf() - qdel(air_temporary) - air_temporary = null + QDEL_NULL(air_temporary) var/turf/T = loc for(var/obj/machinery/meter/meter in T) @@ -91,8 +92,6 @@ qdel(meter) . = ..() - QDEL_NULL(parent) - /obj/machinery/atmospherics/pipe/proc/update_node_icon() for(var/i in 1 to device_type) if(nodes[i]) From 8ec16df2e41893fd539f543452436c6e55486c9d Mon Sep 17 00:00:00 2001 From: Ashe Higgs Date: Wed, 28 Mar 2018 09:14:08 -0400 Subject: [PATCH 005/114] Adds the Family Heirloom, Nyctophobia, and Monochromacy traits, and rebalances Social Anxiety (#36426) * Adds some more traits * April Fools' heirlooms * Fixes the detective sound * Refactor to use signals --- code/__HELPERS/unsorted.dm | 6 +- .../mood_events/generic_negative_events.dm | 8 ++ .../mood_events/generic_positive_events.dm | 4 + code/datums/traits/good.dm | 48 +++---- code/datums/traits/negative.dm | 119 ++++++++++++++++-- code/datums/traits/neutral.dm | 19 +++ code/game/objects/items/storage/toolbox.dm | 9 ++ .../clock_scriptures/scripture_drivers.dm | 6 +- code/modules/client/client_colour.dm | 7 +- 9 files changed, 187 insertions(+), 39 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index a63ff6bdf0..dfcc7a0eb8 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1301,8 +1301,12 @@ GLOBAL_REAL_VAR(list/stack_trace_storage) if(!istype(C)) return + var/animate_color = initial(C.color) + var/datum/client_colour/CC = C.mob.client_colours[1] + if(CC) + animate_color = CC.colour C.color = flash_color - animate(C, color = initial(C.color), time = flash_time) + animate(C, color = animate_color, time = flash_time) #define RANDOM_COLOUR (rgb(rand(0,255),rand(0,255),rand(0,255))) diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 95161f4f39..3ee3e9b048 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -105,6 +105,14 @@ mood_change = -3 timeout = 3000 +/datum/mood_event/nyctophobia + description = "It sure is dark around here...\n" + mood_change = -3 + +/datum/mood_event/family_heirloom_missing + description = "I'm missing my family heirloom...\n" + mood_change = -4 + //These are unused so far but I want to remember them to use them later /datum/mood_event/cloned_corpse description = "I recently saw my own corpse...\n" diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index e96567cf9d..54eb74f10f 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -56,3 +56,7 @@ description = "I have seen the truth, praise the almighty one!\n" mood_change = 40 //maybe being a cultist isnt that bad after all hidden = TRUE + +/datum/mood_event/family_heirloom + description = "My family heirloom is safe with me.\n" + mood_change = 1 diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 1bad7b3352..26c689e092 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -11,6 +11,23 @@ +/datum/trait/apathetic + name = "Apathetic" + desc = "You just don't care as much as other people. That's nice to have in a place like this, I guess." + value = 1 + +/datum/trait/apathetic/add() + GET_COMPONENT_FROM(mood, /datum/component/mood, trait_holder) + if(mood) + mood.mood_modifier = 0.8 + +/datum/trait/apathetic/remove() + GET_COMPONENT_FROM(mood, /datum/component/mood, trait_holder) + if(mood) + mood.mood_modifier = 1 //Change this once/if species get their own mood modifiers. + + + /datum/trait/freerunning name = "Freerunning" desc = "You're great at quick moves! You can climb tables more quickly." @@ -21,6 +38,14 @@ +/datum/trait/jolly + name = "Jolly" + desc = "You sometimes just feel happy, for no reason at all." + value = 1 + mob_trait = TRAIT_JOLLY + + + /datum/trait/light_step name = "Light Step" desc = "You walk with a gentle step, making stepping on sharp objects quieter and less painful." @@ -81,26 +106,3 @@ mob_trait = TRAIT_VORACIOUS gain_text = "You feel HONGRY." lose_text = "You no longer feel HONGRY." - - -/datum/trait/jolly - name = "Jolly" - desc = "You sometimes just feel happy, for no reason at all." - value = 1 - mob_trait = TRAIT_JOLLY - - -/datum/trait/apathetic - name = "Apathetic" - desc = "You just don't care as much as other people, that's nice to have in a place like this, I guess." - value = 1 - -/datum/trait/apathetic/add() - GET_COMPONENT_FROM(mood, /datum/component/mood, trait_holder) - if(mood) - mood.mood_modifier = 0.8 - -/datum/trait/apathetic/remove() - GET_COMPONENT_FROM(mood, /datum/component/mood, trait_holder) - if(mood) - mood.mood_modifier = 1 //Change this once/if species get their own mood modifiers. diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 59957ef2bc..2865877fce 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -1,5 +1,82 @@ //predominantly negative traits +/datum/trait/depression + name = "Depression" + desc = "You sometimes just hate life." + mob_trait = TRAIT_DEPRESSION + value = -1 + gain_text = "You start feeling depressed." + lose_text = "You no longer feel depressed." //if only it were that easy! + medical_record_text = "Patient has a severe mood disorder causing them to experience sudden moments of sadness." + + + +/datum/trait/family_heirloom + name = "Family Heirloom" + desc = "You are the current owner of an heirloom. passed down for generations. You have to keep it safe!" + value = -1 + var/obj/item/heirloom + var/where_text + +/datum/trait/family_heirloom/on_spawn() + var/mob/living/carbon/human/H = trait_holder + var/obj/item/heirloom_type + if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) //on april fools, pick from any item in the game + var/list/heirlooms = subtypesof(/obj/item) + for(var/V in heirlooms) + var/obj/item/I = V + if((!initial(I.icon_state)) || (!initial(I.item_state)) || (initial(I.flags_1) & ABSTRACT_1)) + heirlooms -= V + heirloom_type = pick(heirlooms) + else + switch(trait_holder.mind.assigned_role) + if("Clown") + heirloom_type = /obj/item/bikehorn/golden + if("Mime") + heirloom_type = /obj/item/reagent_containers/food/snacks/baguette + if("Lawyer") + heirloom_type = /obj/item/gavelhammer + if("Janitor") + heirloom_type = /obj/item/mop + if("Security Officer") + heirloom_type = /obj/item/book/manual/wiki/security_space_law + if("Scientist") + heirloom_type = /obj/item/toy/plush/slimeplushie + if("Assistant") + heirloom_type = /obj/item/storage/toolbox/mechanical/old/heirloom + if(!heirloom_type) + heirloom_type = pick( + /obj/item/toy/cards/deck, + /obj/item/lighter, + /obj/item/dice/d20) + heirloom = new heirloom_type(get_turf(trait_holder)) + var/list/slots = list( + "in your backpack" = slot_in_backpack, + "in your left pocket" = slot_l_store, + "in your right pocket" = slot_r_store + ) + var/where = H.equip_in_one_of_slots(heirloom, slots) + if(!where) + where = "at your feet" + if(where == "in your backpack") + var/obj/item/storage/B = H.back + B.orient2hud(trait_holder) + B.show_to(trait_holder) + where_text = "There is a precious family [heirloom.name] [where], passed down from generation to generation. Keep it safe!" + +/datum/trait/family_heirloom/post_add() + to_chat(trait_holder, where_text) + var/list/family_name = splittext(trait_holder.real_name, " ") + heirloom.name = "\improper [family_name[family_name.len]] family [heirloom.name]" + +/datum/trait/family_heirloom/process() + if(heirloom in trait_holder.GetAllContents()) + trait_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing") + trait_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom) + else + trait_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") + trait_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing) + /datum/trait/heavy_sleeper @@ -44,6 +121,27 @@ +/datum/trait/nyctophobia + name = "Nyctophobia" + desc = "As far as you can remember, you've always been afraid of the dark. While in the dark without a light source, you instinctually act careful, and constantly feel a sense of dread." + value = -1 + +/datum/trait/nyctophobia/on_process() + var/mob/living/carbon/human/H = trait_holder + if(H.dna.species.id in list("shadow", "nightmare")) + return //we're tied with the dark, so we don't get scared of it; don't cleanse outright to avoid cheese + var/turf/T = get_turf(trait_holder) + var/lums = T.get_lumcount() + if(lums <= 0.2) + if(trait_holder.m_intent == MOVE_INTENT_RUN) + to_chat(trait_holder, "Easy, easy, take it slow... you're in the dark...") + trait_holder.toggle_move_intent() + trait_holder.SendSignal(COMSIG_ADD_MOOD_EVENT, "nyctophobia", /datum/mood_event/nyctophobia) + else + trait_holder.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "nyctophobia") + + + /datum/trait/nonviolent name = "Pacifist" desc = "The thought of violence makes you sick. So much so, in fact, that you can't hurt anyone." @@ -156,21 +254,18 @@ var/dumb_thing = TRUE /datum/trait/social_anxiety/on_process() + var/nearby_people = 0 + for(var/mob/living/carbon/human/H in view(5, trait_holder)) + if(H.client) + nearby_people++ var/mob/living/carbon/human/H = trait_holder - if(prob(5)) + if(prob(2 + nearby_people)) H.stuttering = max(3, H.stuttering) - else if(prob(1) && !H.silent) + else if(prob(min(3, nearby_people)) && !H.silent) to_chat(H, "You retreat into yourself. You really don't feel up to talking.") H.silent = max(10, H.silent) else if(prob(0.5) && dumb_thing) - to_chat(H, "You think of a dumb thing you said a long time ago and scream internally.") + to_chat(H, "You think of a dumb thing you said a long time ago and scream internally.") dumb_thing = FALSE //only once per life - -/datum/trait/depression - name = "Depression" - desc = "You sometimes just hate life." - mob_trait = TRAIT_DEPRESSION - value = -1 - gain_text = "You start feeling depressed." - lose_text = "You no longer feel depressed." //if only it were that easy! - medical_record_text = "Patient has a severe mood disorder causing them to experience sudden moments of sadness." + if(prob(1)) + new/obj/item/reagent_containers/food/snacks/pastatomato(get_turf(H)) //now that's what I call spaghetti code diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 140b751fd8..5b0fbefe10 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -31,3 +31,22 @@ var/datum/species/species = H.dna.species species.liked_food = initial(species.liked_food) species.disliked_food = initial(species.disliked_food) + + + +/datum/trait/monochromatic + name = "Monochromacy" + desc = "You suffer from full colorblindness, and perceive nearly the entire world in blacks and whites." + value = 0 + medical_record_text = "Patient is afflicted with almost complete color blindness." + +/datum/trait/monochromatic/add() + trait_holder.add_client_colour(/datum/client_colour/monochrome) + +/datum/trait/monochromatic/post_add() + if(trait_holder.mind.assigned_role == "Detective") + to_chat(trait_holder, "Mmm. Nothing's ever clear on this station. It's all shades of gray...") + trait_holder.playsound_local(trait_holder, 'sound/ambience/ambidet1.ogg', 50, FALSE) + +/datum/trait/monochromatic/remove() + trait_holder.remove_client_colour(/datum/client_colour/monochrome) diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 454eabf058..74c559117f 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -78,6 +78,15 @@ icon_state = "toolbox_blue_old" has_latches = FALSE +/obj/item/storage/toolbox/mechanical/old/heirloom + name = "toolbox" //this will be named "X family toolbox" + desc = "It's seen better days." + force = 5 + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/storage/toolbox/mechanical/old/heirloom/PopulateContents() + return + /obj/item/storage/toolbox/electrical name = "electrical toolbox" icon_state = "yellow" diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm index 28ce2ccf60..ad4062598e 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm @@ -184,6 +184,7 @@ important = TRUE quickbind = TRUE quickbind_desc = "Returns you to Reebe." + var/client_color /datum/clockwork_scripture/abscond/check_special_requirements() if(is_reebe(invoker.z)) @@ -192,6 +193,7 @@ return TRUE /datum/clockwork_scripture/abscond/recital() + client_color = invoker.client.color animate(invoker.client, color = "#AF0AAF", time = 50) . = ..() @@ -214,11 +216,11 @@ invoker.pulling.forceMove(T) invoker.forceMove(T) if(invoker.client) - animate(invoker.client, color = initial(invoker.client.color), time = 25) + animate(invoker.client, color = client_color, time = 25) /datum/clockwork_scripture/abscond/scripture_fail() if(invoker && invoker.client) - animate(invoker.client, color = initial(invoker.client.color), time = 10) + animate(invoker.client, color = client_color, time = 10) //Replicant: Creates a new clockwork slab. diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index 7e78032f46..f1477fb4d2 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -105,4 +105,9 @@ colour = "#ff99ff" /datum/client_colour/glass_colour/gray - colour = "#cccccc" \ No newline at end of file + colour = "#cccccc" + + +/datum/client_colour/monochrome + colour = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + priority = INFINITY //we can't see colors anyway! From c98ce25dfb2b40679a616911fe5a7c0e1c97f62d Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Tue, 27 Mar 2018 21:35:41 +0300 Subject: [PATCH 007/114] adds an admin follow link to revenant spawns --- code/modules/antagonists/revenant/revenant_spawn_event.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/revenant/revenant_spawn_event.dm b/code/modules/antagonists/revenant/revenant_spawn_event.dm index b321ec1ae1..483be4dc34 100644 --- a/code/modules/antagonists/revenant/revenant_spawn_event.dm +++ b/code/modules/antagonists/revenant/revenant_spawn_event.dm @@ -53,7 +53,7 @@ var/mob/living/simple_animal/revenant/revvie = new(pick(spawn_locs)) revvie.key = selected.key - message_admins("[key_name_admin(revvie)] has been made into a revenant by an event.") + message_admins("[key_name_admin(revvie)] [ADMIN_FLW(revvie)] has been made into a revenant by an event.") log_game("[key_name(revvie)] was spawned as a revenant by an event.") spawned_mobs += revvie return SUCCESSFUL_SPAWN From 0a63f55771f9285b9cb3915229556acfaa899849 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Wed, 28 Mar 2018 16:00:22 +0300 Subject: [PATCH 009/114] Makes chem dispenser recharging far less glacial (#36700) * meme * Makes chem dispenser recharging far less glacial * Update chem_dispenser.dm --- .../chemistry/machinery/chem_dispenser.dm | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 32096125dd..c826b623cc 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -14,8 +14,8 @@ var/obj/item/stock_parts/cell/cell var/powerefficiency = 0.1 var/amount = 30 - var/recharged = 0 - var/recharge_delay = 5 + var/recharge_amount = 10 + var/recharge_counter = 0 var/mutable_appearance/beaker_overlay var/working_state = "dispenser_working" var/nopower_state = "dispenser_nopower" @@ -62,7 +62,6 @@ /obj/machinery/chem_dispenser/Initialize() . = ..() cell = new cell_type - recharge() dispensable_reagents = sortList(dispensable_reagents) update_icon() @@ -72,11 +71,15 @@ return ..() /obj/machinery/chem_dispenser/process() - if(recharged < 0) - recharge() - recharged = recharge_delay - else - recharged -= 1 + if (recharge_counter >= 4) + if(!is_operational()) + return + var/usedpower = cell.give(recharge_amount) + if(usedpower) + use_power(250*recharge_amount) + recharge_counter = 0 + return + recharge_counter++ /obj/machinery/chem_dispenser/proc/display_beaker() ..() @@ -102,12 +105,7 @@ obj/machinery/chem_dispenser/update_icon() beaker_overlay = display_beaker() add_overlay(beaker_overlay) -/obj/machinery/chem_dispenser/proc/recharge() - if(stat & (BROKEN|NOPOWER)) - return - var/usedpower = cell.give( 1 / powerefficiency) //Should always be a gain of one on the UI. - if(usedpower) - use_power(2500) + /obj/machinery/chem_dispenser/emag_act(mob/user) if(obj_flags & EMAGGED) @@ -313,15 +311,14 @@ obj/machinery/chem_dispenser/update_icon() /obj/machinery/chem_dispenser/RefreshParts() - var/time = 0 + recharge_amount = initial(recharge_amount) var/newpowereff = 0.0666666 for(var/obj/item/stock_parts/cell/P in component_parts) cell = P for(var/obj/item/stock_parts/matter_bin/M in component_parts) newpowereff += 0.0166666666*M.rating for(var/obj/item/stock_parts/capacitor/C in component_parts) - time += C.rating - recharge_delay = 30/(time/2) //delay between recharges, double the usual time on lowest 50% less than usual on highest + recharge_amount *= C.rating for(var/obj/item/stock_parts/manipulator/M in component_parts) if (M.rating > macrotier) macrotier = M.rating From b53373dec050950d8697dd2df9e6c90d54981e58 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Wed, 28 Mar 2018 15:51:43 +0300 Subject: [PATCH 011/114] Fixes modular computer ui_interact runtime --- .../modular_computers/computers/item/computer_ui.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index c57bf5f4e3..c8ca119e89 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -1,3 +1,10 @@ +<<<<<<< HEAD +======= +/obj/item/device/modular_computer/attack_self(mob/user) + . = ..() + ui_interact(user) + +>>>>>>> ba5a78b... Merge pull request #36743 from ShizCalev/modular-comp-ui_interact-runtime // Operates TGUI /obj/item/device/modular_computer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) if(!enabled) From 6bcd278bb6f7fab6a6be571021aff2b1d6f9aa24 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Wed, 28 Mar 2018 14:49:16 +0300 Subject: [PATCH 012/114] Merge pull request #36747 from praisenarsie/patch-36 Increases monkeycap to 64 --- code/controllers/subsystem/mobs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm index b88e3c711c..066c621572 100644 --- a/code/controllers/subsystem/mobs.dm +++ b/code/controllers/subsystem/mobs.dm @@ -7,7 +7,7 @@ SUBSYSTEM_DEF(mobs) var/list/currentrun = list() var/static/list/clients_by_zlevel[][] var/static/list/cubemonkeys = list() - var/cubemonkeycap = 20 + var/cubemonkeycap = 64 /datum/controller/subsystem/mobs/stat_entry() ..("P:[GLOB.mob_living_list.len]") From ff3818aa86bb90b97584260131b1112b5f3a294e Mon Sep 17 00:00:00 2001 From: Robustin Date: Tue, 27 Mar 2018 22:05:05 -0400 Subject: [PATCH 014/114] Gas react is much more efficient (#36667) * React but with some conditions first * Update gas_types.dm * Webeditor maymay * This might break fire but isn't that what freezes are for? * More webeditor memes * Did that madman just make it even FASTER? * Changing list to typecache * Gotta go faster * review, dnm yet * gas.len instead of volume * Dunc the redeemed * Merge ready * Dunc's method actually wasnt the best --- .../atmospherics/gasmixtures/gas_mixture.dm | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 007aad331a..60dba541f3 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -8,6 +8,7 @@ What are the archived variables for? once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */ GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) +GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide))) // These gasses cannot react amongst themselves /proc/init_gaslist_cache() . = list() @@ -411,10 +412,18 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) /datum/gas_mixture/react(turf/open/dump_location) . = NO_REACTION - - reaction_results = new - var/list/cached_gases = gases + if(!cached_gases.len) + return + var/possible + for(var/I in cached_gases) + if(GLOB.nonreactive_gases[I]) + continue + possible = TRUE + break + if(!possible) + return + reaction_results = new var/temp = temperature var/ener = THERMAL_ENERGY(src) From c0e45aa0a8c94c056363f7c7d80c24dd5f27678d Mon Sep 17 00:00:00 2001 From: iksyp <33264221+iskyp@users.noreply.github.com> Date: Tue, 27 Mar 2018 14:12:02 -0700 Subject: [PATCH 016/114] Night vision goggles no longer cancel out thermal eyes (#36609) cl fix: night vision goggles no longer overwrite thermal eyes. nvg eyes no longer overwrite thermal goggles. /cl fixes #35921 --- code/modules/clothing/glasses/_glasses.dm | 1 - code/modules/surgery/organs/eyes.dm | 1 - 2 files changed, 2 deletions(-) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 2ecf385a1f..eaeedee36c 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -109,7 +109,6 @@ icon_state = "night" item_state = "glasses" darkness_view = 8 - vision_flags = SEE_BLACKNESS lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE glass_colour_type = /datum/client_colour/glass_colour/green diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 456ff681fe..da2a6c1f37 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -46,7 +46,6 @@ see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE actions_types = list(/datum/action/item_action/organ_action/use) - sight_flags = SEE_BLACKNESS var/night_vision = TRUE /obj/item/organ/eyes/night_vision/ui_action_click() From 7020c19dff86af560e906a907404968e33210571 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Tue, 27 Mar 2018 23:21:14 +0300 Subject: [PATCH 018/114] Merge pull request #36736 from fludd12/light-up-the-night Assemblies with lighting circuits now properly update light position. --- code/modules/integrated_electronics/core/assemblies.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 0a70774847..07be1eef78 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -500,6 +500,8 @@ for(var/I in assembly_components) var/obj/item/integrated_circuit/IC = I IC.ext_moved(oldLoc, dir) + if(light) //Update lighting objects (From light circuits). + update_light() /obj/item/device/electronic_assembly/stop_pulling() for(var/I in assembly_components) From 13593d757b872a4af521f557d255f57d6e78040f Mon Sep 17 00:00:00 2001 From: fludd12 Date: Mon, 26 Mar 2018 14:10:12 -0400 Subject: [PATCH 020/114] Nutriment can get you fat again. --- .../reagents/chemistry/reagents/food_reagents.dm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 47bbc899a9..8b035de0b5 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -616,6 +616,22 @@ M.blind_eyes(2) +<<<<<<< HEAD +======= +/datum/reagent/consumable/nutriment/stabilized + name = "Stabilized Nutriment" + id = "stabilizednutriment" + description = "A bioengineered protien-nutrient structure designed to decompose in high saturation. In layman's terms, it won't get you fat." + reagent_state = SOLID + nutriment_factor = 15 * REAGENTS_METABOLISM + color = "#664330" // rgb: 102, 67, 48 + +/datum/reagent/consumable/nutriment/stabilized/on_mob_life(mob/living/M) + if(M.nutrition > NUTRITION_LEVEL_FULL - 25) + M.nutrition -= 3*nutriment_factor + ..() + +>>>>>>> 8637339... Nutriment can get you fat again. ////Lavaland Flora Reagents//// From cb8f3e9293aa0b2005a6b671e777145fff0f1e56 Mon Sep 17 00:00:00 2001 From: BeeSting12 Date: Tue, 27 Mar 2018 13:09:31 -0400 Subject: [PATCH 021/114] >happend --- code/datums/components/mood.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 375370f08f..f8d51a044f 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -68,7 +68,7 @@ var/datum/mood_event/event = mood_events[i] msg += event.description else - msg += "Nothing special has happend to me lately!\n" + msg += "Nothing special has happened to me lately!\n" to_chat(owner, msg) /datum/component/mood/proc/update_mood() //Called whenever a mood event is added or removed From 888ca609a89756cefd52e1223e40e5f4f1b2e019 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Tue, 27 Mar 2018 20:59:13 +0300 Subject: [PATCH 023/114] Merge pull request #36636 from ShizCalev/robo-limb-shake-message Fixes prosthetic limbs injury messages --- .../mob/living/carbon/human/human_defense.dm | 24 +++++--- code/modules/surgery/bodyparts/bodyparts.dm | 9 +++ .../surgery/bodyparts/robot_bodyparts.dm | 61 +++++++++++++++++++ 3 files changed, 84 insertions(+), 10 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index b744630a56..eddfa997b8 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -647,6 +647,9 @@ for(var/X in bodyparts) var/obj/item/bodypart/LB = X missing -= LB.body_zone + if(LB.is_pseudopart) //don't show injury text for fake bodyparts; ie chainsaw arms or synthetic armblades + continue + var/limb_max_damage = LB.max_damage var/status = "" var/brutedamage = LB.brute_dam var/burndamage = LB.burn_dam @@ -663,20 +666,21 @@ else if(brutedamage > 0) - status = "bruised" - if(brutedamage > 20) - status = "battered" - if(brutedamage > 40) - status = "mangled" + status = LB.light_brute_msg + if(brutedamage > (limb_max_damage*0.4)) + status = LB.medium_brute_msg + if(brutedamage > (limb_max_damage*0.8)) + status = LB.heavy_brute_msg if(brutedamage > 0 && burndamage > 0) status += " and " - if(burndamage > 40) - status += "peeling away" - else if(burndamage > 10) - status += "blistered" + if(burndamage > (limb_max_damage*0.8)) + status += LB.heavy_burn_msg + else if(burndamage > (limb_max_damage*0.2)) + status += LB.medium_burn_msg else if(burndamage > 0) - status += "numb" + status += LB.light_burn_msg + if(status == "") status = "OK" var/no_damage diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 9878130144..1f432ae0ee 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -43,6 +43,15 @@ var/species_flags_list = list() var/dmg_overlay_type //the type of damage overlay (if any) to use when this bodypart is bruised/burned. + //Damage messages used by help_shake_act() + var/light_brute_msg = "bruised" + var/medium_brute_msg = "battered" + var/heavy_brute_msg = "mangled" + + var/light_burn_msg = "numb" + var/medium_burn_msg = "blistered" + var/heavy_burn_msg = "peeling away" + /obj/item/bodypart/examine(mob/user) ..() if(brute_dam > 0) diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 6921d7e3a2..b255c32f11 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -1,4 +1,10 @@ +#define ROBOTIC_LIGHT_BRUTE_MSG "marred" +#define ROBOTIC_MEDIUM_BRUTE_MSG "dented" +#define ROBOTIC_HEAVY_BRUTE_MSG "falling apart" +#define ROBOTIC_LIGHT_BURN_MSG "scorched" +#define ROBOTIC_MEDIUM_BURN_MSG "charred" +#define ROBOTIC_HEAVY_BURN_MSG "smoldering" /obj/item/bodypart/l_arm/robot name = "cyborg left arm" @@ -10,6 +16,13 @@ icon_state = "borg_l_arm" status = BODYPART_ROBOTIC + light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG + medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG + heavy_brute_msg = ROBOTIC_HEAVY_BRUTE_MSG + + light_burn_msg = ROBOTIC_LIGHT_BURN_MSG + medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG + heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG /obj/item/bodypart/r_arm/robot name = "cyborg right arm" @@ -21,6 +34,13 @@ icon_state = "borg_r_arm" status = BODYPART_ROBOTIC + light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG + medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG + heavy_brute_msg = ROBOTIC_HEAVY_BRUTE_MSG + + light_burn_msg = ROBOTIC_LIGHT_BURN_MSG + medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG + heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG /obj/item/bodypart/l_leg/robot name = "cyborg left leg" @@ -32,6 +52,13 @@ icon_state = "borg_l_leg" status = BODYPART_ROBOTIC + light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG + medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG + heavy_brute_msg = ROBOTIC_HEAVY_BRUTE_MSG + + light_burn_msg = ROBOTIC_LIGHT_BURN_MSG + medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG + heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG /obj/item/bodypart/r_leg/robot name = "cyborg right leg" @@ -43,6 +70,13 @@ icon_state = "borg_r_leg" status = BODYPART_ROBOTIC + light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG + medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG + heavy_brute_msg = ROBOTIC_HEAVY_BRUTE_MSG + + light_burn_msg = ROBOTIC_LIGHT_BURN_MSG + medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG + heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG /obj/item/bodypart/chest/robot name = "cyborg torso" @@ -52,6 +86,15 @@ flags_1 = CONDUCT_1 icon_state = "borg_chest" status = BODYPART_ROBOTIC + + light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG + medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG + heavy_brute_msg = ROBOTIC_HEAVY_BRUTE_MSG + + light_burn_msg = ROBOTIC_LIGHT_BURN_MSG + medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG + heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + var/wired = 0 var/obj/item/stock_parts/cell/cell = null @@ -102,6 +145,15 @@ flags_1 = CONDUCT_1 icon_state = "borg_head" status = BODYPART_ROBOTIC + + light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG + medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG + heavy_brute_msg = ROBOTIC_HEAVY_BRUTE_MSG + + light_burn_msg = ROBOTIC_LIGHT_BURN_MSG + medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG + heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + var/obj/item/device/assembly/flash/handheld/flash1 = null var/obj/item/device/assembly/flash/handheld/flash2 = null @@ -189,3 +241,12 @@ icon = 'icons/mob/augmentation/surplus_augments.dmi' icon_state = "r_leg" max_damage = 20 + + +#undef ROBOTIC_LIGHT_BRUTE_MSG +#undef ROBOTIC_MEDIUM_BRUTE_MSG +#undef ROBOTIC_HEAVY_BRUTE_MSG + +#undef ROBOTIC_LIGHT_BURN_MSG +#undef ROBOTIC_MEDIUM_BURN_MSG +#undef ROBOTIC_HEAVY_BURN_MSG From adf4786470d9d930322f2faf2fc5db3a79158a6a Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Tue, 27 Mar 2018 20:56:39 +0300 Subject: [PATCH 025/114] Merge pull request #36617 from ShizCalev/logging-cleanup Improves some logging legibility --- code/__HELPERS/mobs.dm | 10 ++++++---- code/game/objects/items/implants/implant.dm | 2 +- code/game/turfs/open.dm | 2 -- code/modules/mob/living/carbon/carbon.dm | 8 ++++---- code/modules/mob/living/carbon/carbon_movement.dm | 2 +- code/modules/mob/living/living.dm | 4 ++-- code/modules/projectiles/projectile.dm | 2 +- code/modules/surgery/helpers.dm | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 36cf604d3a..064f8b675f 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -288,7 +288,7 @@ Proc for attack log creation, because really why not var/hp =" " if(living_target) - hp = "(NEWHP: [living_target.health])" + hp = " (NEWHP: [living_target.health]) " var/starget = "NON-EXISTENT SUBJECT" if(target) @@ -307,20 +307,22 @@ Proc for attack log creation, because really why not var/sobject = "" if(object) sobject = "[object]" + if(addition) + addition = " [addition]" var/sattackloc = "" if(attack_location) sattackloc = "([attack_location.x],[attack_location.y],[attack_location.z])" if(is_mob_user) - var/message = "has [what_done] [starget] with [sobject][addition] [hp] [sattackloc]" + var/message = "has [what_done] [starget][(sobject||addition) ? " with ":""][sobject][addition][hp][sattackloc]" user.log_message(message, INDIVIDUAL_ATTACK_LOG) if(is_mob_target) - var/message = "has been [what_done] by [ssource] with [sobject][addition] [hp] [sattackloc]" + var/message = "has been [what_done] by [ssource][(sobject||addition) ? " with ":""][sobject][addition][hp][sattackloc]" target.log_message(message, INDIVIDUAL_ATTACK_LOG) - log_attack("[ssource] [what_done] [starget] with [sobject][addition] [hp] [sattackloc]") + log_attack("[ssource] [what_done] [starget][(sobject||addition) ? " with ":""][sobject][addition][hp][sattackloc]") /proc/do_mob(mob/user , mob/target, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks = null) diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm index b49f325690..d1ff075ef2 100644 --- a/code/game/objects/items/implants/implant.dm +++ b/code/game/objects/items/implants/implant.dm @@ -70,7 +70,7 @@ H.sec_hud_set_implants() if(user) - add_logs(user, target, "implanted", object="[name]") + add_logs(user, target, "implanted", "\a [name]") return 1 diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index b8a05de431..143ae840f5 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -199,8 +199,6 @@ return 0 if(!(lube&SLIDE_ICE)) to_chat(C, "You slipped[ O ? " on the [O.name]" : ""]!") - C.log_message("Slipped[O ? " on the [O.name]" : ""][(lube&SLIDE)? " (LUBE)" : ""]!", INDIVIDUAL_ATTACK_LOG) - if(!(lube&SLIDE_ICE)) playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3) C.SendSignal(COMSIG_ADD_MOOD_EVENT, "slipped", /datum/mood_event/slipped) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index dc0b094128..e0c8f04030 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -169,9 +169,9 @@ var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors var/turf/end_T = get_turf(target) if(start_T && end_T) - var/start_T_descriptor = "tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]" - var/end_T_descriptor = "tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]" - add_logs(src, throwable_mob, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]") + var/start_T_descriptor = "tile in [get_area_name(start_T, TRUE)] ([start_T.x],[start_T.y],[start_T.z])" + var/end_T_descriptor = "tile at [get_area_name(end_T, TRUE)] ([end_T.x],[end_T.y],[end_T.z])" + add_logs(src, throwable_mob, "thrown", addition="grab from [start_T_descriptor] towards [end_T_descriptor]") else if(!(I.flags_1 & (NODROP_1|ABSTRACT_1))) thrown_thing = I @@ -185,7 +185,7 @@ if(thrown_thing) visible_message("[src] has thrown [thrown_thing].") - add_logs(src, thrown_thing, "has thrown") + add_logs(src, thrown_thing, "thrown") newtonian_move(get_dir(target, src)) thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src) diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 7ee828adb7..6fbd4b6f0a 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -24,7 +24,7 @@ if(movement_type & FLYING) return 0 if(!(lube&SLIDE_ICE)) - add_logs(src,, "slipped",, "on [O ? O.name : "floor"]") + add_logs(src, (O ? O : get_turf(src)), "slipped on the", null, ((lube & SLIDE) ? "(LUBE)" : null)) return loc.handle_slip(src, knockdown_amount, O, lube) /mob/living/carbon/Process_Spacemove(movement_dir = 0) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 2a0ac731cf..63ea389ebb 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -760,10 +760,10 @@ var/list/L = where if(what == who.get_item_for_held_index(L[2])) if(who.dropItemToGround(what)) - add_logs(src, who, "stripped", addition="of [what]") + add_logs(src, who, "stripped [what] off") if(what == who.get_item_by_slot(where)) if(who.dropItemToGround(what)) - add_logs(src, who, "stripped", addition="of [what]") + add_logs(src, who, "stripped [what] off") // The src mob is trying to place an item on someone // Override if a certain mob should be behave differently when placing items (can't, for example) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index ad1d0f76d0..e92393833c 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -324,7 +324,7 @@ /obj/item/projectile/proc/fire(angle, atom/direct_target) //If no angle needs to resolve it from xo/yo! if(!log_override && firer && original) - add_logs(firer, original, "fired at", src, " [get_area(src)]") + add_logs(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]") if(direct_target) if(prehit(direct_target)) direct_target.bullet_act(src, def_zone) diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index 2470146532..d74d7b6691 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -68,7 +68,7 @@ user.visible_message("[user] drapes [I] over [M]'s [parse_zone(selected_zone)] to prepare for \an [procedure.name].", \ "You drape [I] over [M]'s [parse_zone(selected_zone)] to prepare for \an [procedure.name].") - add_logs(user, M, "operated", addition="Operation type: [procedure.name], location: [selected_zone]") + add_logs(user, M, "operated on", null, "(OPERATION TYPE: [procedure.name]) (TARGET AREA: [selected_zone])") else to_chat(user, "You need to expose [M]'s [parse_zone(selected_zone)] first!") From 8c98e4769c1c430eaa9cd919da171228811b7e72 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Tue, 27 Mar 2018 10:53:06 -0700 Subject: [PATCH 027/114] Fixes hot potato coloration (#36655) * Fixes hot potato coloration * wupps --- code/game/objects/items/hot_potato.dm | 47 +++++++++++++++++++-------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm index 65bfd09f9c..9777deaf6d 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/code/game/objects/items/hot_potato.dm @@ -23,8 +23,31 @@ var/detonate_flash_range = 5 var/detonate_fire_range = 5 + var/active = FALSE + var/color_val = FALSE + var/datum/weakref/current + +/obj/item/hot_potato/Destroy() + if(active) + deactivate() + return ..() + +/obj/item/hot_potato/proc/colorize(mob/target) + //Clear color from old target + if(current) + var/mob/M = current.resolve() + if(istype(M)) + M.remove_atom_colour(FIXED_COLOUR_PRIORITY) + //Give to new target + current = null + //Swap colors + color_val = !color_val + if(istype(target)) + current = WEAKREF(target) + target.add_atom_colour(color_val? "#ffff00" : "#00ffff", FIXED_COLOUR_PRIORITY) + /obj/item/hot_potato/proc/detonate() var/atom/location = loc location.visible_message("[src] [detonate_explosion? "explodes" : "activates"]!", "[src] activates! You've ran out of time!") @@ -37,9 +60,6 @@ M.dropItemToGround(src, TRUE) qdel(src) -/obj/item/hot_potato/proc/is_active() - return isnull(detonation_timerid)? FALSE : TRUE - /obj/item/hot_potato/attack_self(mob/user) if(activate(timer, user)) user.visible_message("[user] squeezes [src], which promptly starts to flash red-hot colors!", "You squeeze [src], activating its countdown and attachment mechanism!", @@ -56,19 +76,18 @@ L.SetSleeping(0) L.SetUnconscious(0) L.reagents.add_reagent("muscle_stimulant", CLAMP(5 - L.reagents.get_reagent_amount("muscle_stimulant"), 0, 5)) //If you don't have legs or get bola'd, tough luck! - color_val = !color_val - L.add_atom_colour(color_val? "#ffff00" : "#00ffff", FIXED_COLOUR_PRIORITY) + colorize(L) /obj/item/hot_potato/examine(mob/user) . = ..() - if(is_active()) + if(active) to_chat(user, "[src] is flashing red-hot! You should probably get rid of it!") if(show_timer) to_chat(user, "[src]'s timer looks to be at [DisplayTimeText(activation_time - world.time)]!") /obj/item/hot_potato/equipped(mob/user) . = ..() - if(is_active()) + if(active) to_chat(user, "You have a really bad feeling about [src]!") /obj/item/hot_potato/afterattack(atom/target, mob/user, adjacent, params) @@ -99,7 +118,7 @@ if(.) add_logs(user, victim, "forced a hot potato with explosive variables ([detonate_explosion]-[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_flash_range]/[detonate_fire_range]) onto") user.visible_message("[user] forces [src] onto [victim]!", "You force [src] onto [victim]!", "You hear a mechanical click and a beep.") - user.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + colorize(null) else add_logs(user, victim, "tried to force a hot potato with explosive variables ([detonate_explosion]-[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_flash_range]/[detonate_fire_range]) onto") user.visible_message("[user] tried to force [src] onto [victim], but it could not attach!", "You try to force [src] onto [victim], but it is unable to attach!", "You hear a mechanical click and two buzzes.") @@ -107,10 +126,10 @@ /obj/item/hot_potato/dropped(mob/user) . = ..() - user.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + colorize(null) /obj/item/hot_potato/proc/activate(delay, mob/user) - if(is_active()) + if(active) return update_icon() if(sticky) @@ -122,6 +141,7 @@ var/turf/T = get_turf(src) message_admins("[user? "[ADMIN_LOOKUPFLW(user)] has primed [src]" : "A [src] has been primed"] (Timer:[delay],Explosive:[detonate_explosion],Range:[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range]) for detonation at [COORD(T)]([T.loc])") log_game("[user? "[user] has primed [src]" : "A [src] has been primed"] ([detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range]) for detonation at [COORD(T)]([T.loc])") + active = TRUE /obj/item/hot_potato/proc/deactivate() update_icon() @@ -130,12 +150,11 @@ deltimer(detonation_timerid) STOP_PROCESSING(SSfastprocess, src) detonation_timerid = null - if(ismob(loc)) - var/mob/user = loc - user.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + colorize(null) + active = FALSE /obj/item/hot_potato/update_icon() - icon_state = is_active()? icon_on : icon_off + icon_state = active? icon_on : icon_off /obj/item/hot_potato/syndicate detonate_light_range = 4 From 6e02f61b3722f8c7bfce0b2233cc866ed091b282 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Tue, 27 Mar 2018 20:52:03 +0300 Subject: [PATCH 029/114] Merge pull request #36734 from Robustin/colossusfix Colossus projectile runtime removal --- .../mob/living/simple_animal/hostile/megafauna/colossus.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 1cf031b0cc..b7015972fd 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -143,6 +143,7 @@ Difficulty: Very Hard INVOKE_ASYNC(src, .proc/spiral_shoot, TRUE) /mob/living/simple_animal/hostile/megafauna/colossus/proc/spiral_shoot(negative = FALSE, counter_start = 8) + var/turf/start_turf = get_step(src, pick(GLOB.alldirs)) var/counter = counter_start for(var/i in 1 to 80) if(negative) @@ -153,7 +154,7 @@ Difficulty: Very Hard counter = 1 if(counter < 1) counter = 16 - shoot_projectile(null, counter * 22.5) + shoot_projectile(start_turf, counter * 22.5) playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, 1) sleep(1) @@ -184,7 +185,7 @@ Difficulty: Very Hard angle_to_target = set_angle var/static/list/colossus_shotgun_shot_angles = list(12.5, 7.5, 2.5, -2.5, -7.5, -12.5) for(var/i in colossus_shotgun_shot_angles) - shoot_projectile(null, angle_to_target + i) + shoot_projectile(target_turf, angle_to_target + i) /mob/living/simple_animal/hostile/megafauna/colossus/proc/dir_shots(list/dirs) if(!islist(dirs)) From 130337797d7a4f607ba7d6e1d91d6bebc093192f Mon Sep 17 00:00:00 2001 From: yorii Date: Tue, 27 Mar 2018 16:05:23 +0200 Subject: [PATCH 031/114] Science goggles detect grenade reagents (#36477) * Science goggles detect grenade reagents * reversed output * minor improvements * new helper for counting stuff * spelling fixes --- code/__HELPERS/text.dm | 33 +++++++++++++++++++ .../objects/items/grenades/chem_grenade.dm | 12 +++++++ 2 files changed, 45 insertions(+) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 6c28a1262d..a840d6144a 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -734,3 +734,36 @@ GLOBAL_LIST_INIT(binary, list("0","1")) . = base if(rest) . += .(rest) + +//Replacement for the \th macro when you want the whole word output as text (first instead of 1st) +/proc/thtotext(number) + if(!isnum(number)) + return + switch(number) + if(1) + return "first" + if(2) + return "second" + if(3) + return "third" + if(4) + return "fourth" + if(5) + return "fifth" + if(6) + return "sixth" + if(7) + return "seventh" + if(8) + return "eighth" + if(9) + return "ninth" + if(10) + return "tenth" + if(11) + return "eleventh" + if(12) + return "twelfth" + else + return "[number]\th" + \ No newline at end of file diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index a127201e41..f2daf58b1a 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -27,6 +27,18 @@ /obj/item/grenade/chem_grenade/examine(mob/user) display_timer = (stage == READY && !nadeassembly) //show/hide the timer based on assembly state ..() + if(user.can_see_reagents()) + var/count = 0 + if(beakers.len) + to_chat(user, "You scan the grenade and detect the following reagents:") + for(var/obj/item/reagent_containers/glass/G in beakers) + var/textcount = thtotext(++count) + for(var/datum/reagent/R in G.reagents.reagent_list) + to_chat(user, "[R.volume] units of [R.name] in the [textcount] beaker.") + if(beakers.len == 1) + to_chat(user, "You detect no second beaker in the grenade.") + else + to_chat(user, "You scan the grenade, but detect nothing.") /obj/item/grenade/chem_grenade/attack_self(mob/user) From 4629039c38adb5eef4d1b03ba4d6285b92b4ccbe Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 28 Mar 2018 14:01:50 -0400 Subject: [PATCH 033/114] Adds config to allow ranks only from txt --- code/__HELPERS/roundend.dm | 2 +- .../configuration/entries/general.dm | 3 + code/modules/admin/admin_ranks.dm | 57 +++++++++++-------- code/modules/admin/permissionedit.dm | 4 ++ config/config.txt | 12 ++++ 5 files changed, 54 insertions(+), 24 deletions(-) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index b0e76bbcf3..870bd730f0 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -504,7 +504,7 @@ /datum/controller/subsystem/ticker/proc/save_admin_data() if(CONFIG_GET(flag/admin_legacy_system)) //we're already using legacy system so there's nothing to save return - else if(load_admins()) //returns true if there was a database failure and the backup was loaded from + else if(load_admins(TRUE)) //returns true if there was a database failure and the backup was loaded from return var/datum/DBQuery/query_admin_rank_update = SSdbcore.NewQuery("UPDATE [format_table_name("player")] p INNER JOIN [format_table_name("admin")] a ON p.ckey = a.ckey SET p.lastadminrank = a.rank") query_admin_rank_update.Execute() diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 0608baea8c..a0fb41ed12 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -129,6 +129,9 @@ /datum/config_entry/flag/enable_localhost_rank //Gives the !localhost! rank to any client connecting from 127.0.0.1 or ::1 protection = CONFIG_ENTRY_LOCKED +/datum/config_entry/flag/load_legacy_ranks_only //Loads admin ranks only from legacy admin_ranks.txt, while enabled ranks are mirrored to the database + protection = CONFIG_ENTRY_LOCKED + /datum/config_entry/string/hostedby /datum/config_entry/flag/norespawn diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index be54715215..c850340c78 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -113,7 +113,7 @@ GLOBAL_PROTECT(protected_ranks) return ((rank.rights & flag) == flag) //true only if right has everything in flag //load our rank - > rights associations -/proc/load_admin_ranks(dbfail) +/proc/load_admin_ranks(dbfail, no_update) if(IsAdminAdvancedProcCall()) to_chat(usr, "Admin Reload blocked: Advanced ProcCall detected.") return @@ -137,27 +137,38 @@ GLOBAL_PROTECT(protected_ranks) prev = next previous_rights = R.rights if(!CONFIG_GET(flag/admin_legacy_system) || dbfail) - var/datum/DBQuery/query_load_admin_ranks = SSdbcore.NewQuery("SELECT rank, flags, exclude_flags, can_edit_flags FROM [format_table_name("admin_ranks")]") - if(!query_load_admin_ranks.Execute()) - message_admins("Error loading admin ranks from database. Loading from backup.") - log_sql("Error loading admin ranks from database. Loading from backup.") - dbfail = 1 - else - while(query_load_admin_ranks.NextRow()) - var/skip - var/rank_name = query_load_admin_ranks.item[1] + if(CONFIG_GET(flag/load_legacy_ranks_only)) + if(!no_update) + var/list/sql_ranks = list() for(var/datum/admin_rank/R in GLOB.admin_ranks) - if(R.name == rank_name) //this rank was already loaded from txt override - skip = 1 - break - if(!skip) - var/rank_flags = text2num(query_load_admin_ranks.item[2]) - var/rank_exclude_flags = text2num(query_load_admin_ranks.item[3]) - var/rank_can_edit_flags = text2num(query_load_admin_ranks.item[4]) - var/datum/admin_rank/R = new(rank_name, rank_flags, rank_exclude_flags, rank_can_edit_flags) - if(!R) - continue - GLOB.admin_ranks += R + var/sql_rank = sanitizeSQL(R.name) + var/sql_flags = sanitizeSQL(R.include_rights) + var/sql_exclude_flags = sanitizeSQL(R.exclude_rights) + var/sql_can_edit_flags = sanitizeSQL(R.can_edit_rights) + sql_ranks += list(list("rank" = "'[sql_rank]'", "flags" = "[sql_flags]", "exclude_flags" = "[sql_exclude_flags]", "can_edit_flags" = "[sql_can_edit_flags]")) + SSdbcore.MassInsert(format_table_name("admin_ranks"), sql_ranks, duplicate_key = TRUE) + else + var/datum/DBQuery/query_load_admin_ranks = SSdbcore.NewQuery("SELECT rank, flags, exclude_flags, can_edit_flags FROM [format_table_name("admin_ranks")]") + if(!query_load_admin_ranks.Execute()) + message_admins("Error loading admin ranks from database. Loading from backup.") + log_sql("Error loading admin ranks from database. Loading from backup.") + dbfail = 1 + else + while(query_load_admin_ranks.NextRow()) + var/skip + var/rank_name = query_load_admin_ranks.item[1] + for(var/datum/admin_rank/R in GLOB.admin_ranks) + if(R.name == rank_name) //this rank was already loaded from txt override + skip = 1 + break + if(!skip) + var/rank_flags = text2num(query_load_admin_ranks.item[2]) + var/rank_exclude_flags = text2num(query_load_admin_ranks.item[3]) + var/rank_can_edit_flags = text2num(query_load_admin_ranks.item[4]) + var/datum/admin_rank/R = new(rank_name, rank_flags, rank_exclude_flags, rank_can_edit_flags) + if(!R) + continue + GLOB.admin_ranks += R //load ranks from backup file if(dbfail) var/backup_file = file("data/admins_backup.json") @@ -184,7 +195,7 @@ GLOBAL_PROTECT(protected_ranks) testing(msg) #endif -/proc/load_admins() +/proc/load_admins(no_update) var/dbfail if(!CONFIG_GET(flag/admin_legacy_system) && !SSdbcore.Connect()) message_admins("Failed to connect to database while loading admins. Loading from backup.") @@ -198,7 +209,7 @@ GLOBAL_PROTECT(protected_ranks) GLOB.admins.Cut() GLOB.protected_admins.Cut() GLOB.deadmins.Cut() - dbfail = load_admin_ranks(dbfail) + dbfail = load_admin_ranks(dbfail, no_update) //Clear profile access for(var/A in world.GetConfig("admin")) world.SetConfig("APP/admin", A, null) diff --git a/code/modules/admin/permissionedit.dm b/code/modules/admin/permissionedit.dm index b6d8c11e67..eb3969ce3a 100644 --- a/code/modules/admin/permissionedit.dm +++ b/code/modules/admin/permissionedit.dm @@ -82,6 +82,10 @@ if(D.rank in GLOB.protected_ranks) to_chat(usr, "Editing the flags of this rank is blocked by server configuration.") return + if(CONFIG_GET(flag/load_legacy_ranks_only) && (task == "rank" || task == "permissions")) + to_chat(usr, "Database rank loading is disabled, only temporary changes can be made to an admin's rank or permissions.") + use_db = FALSE + skip = TRUE if(check_rights(R_DBRANKS, FALSE)) if(!skip) if(!SSdbcore.Connect()) diff --git a/config/config.txt b/config/config.txt index a8c9cf13de..290052308a 100644 --- a/config/config.txt +++ b/config/config.txt @@ -35,6 +35,7 @@ ROUND_END_COUNTDOWN 90 ## This flag is automatically enabled if SQL_ENABLED isn't ADMIN_LEGACY_SYSTEM +<<<<<<< HEAD ## Comment this out if you want to use the SQL based mentor system, the legacy system uses mentors.txt. ## You need to set up your database to use the SQL based system. ## This flag is automatically enabled if SQL_ENABLED isn't @@ -42,6 +43,17 @@ MENTOR_LEGACY_SYSTEM #Mentors only see ckeys by default. Uncomment to have them only see mob name #MENTORS_MOBNAME_ONLY +======= +##Uncomment this to stop any admins loaded by the legacy system from having their rank edited by the permissions panel +#PROTECT_LEGACY_ADMINS + +##Uncomment this to stop any ranks loaded by the legacy system from having their flags edited by the permissions panel +#PROTECT_LEGACY_RANKS +>>>>>>> feb9290... Merge pull request #36554 from Jordie0608/tbhthisisntreallyalegacysystemanymore + +##Uncomment this to have admin ranks only loaded from the legacy admin_ranks.txt +##If enabled, each time admins are loaded ranks the database will be updated with the current ranks and their flags +#LOAD_LEGACY_RANKS_ONLY ## Comment this out if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. BAN_LEGACY_SYSTEM From 8f240d424644149aad20351c00ec054987a9b0a3 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Wed, 28 Mar 2018 18:13:55 +0300 Subject: [PATCH 034/114] Update interface.dm --- interface/interface.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/interface.dm b/interface/interface.dm index 27a47beeec..8a4ba5b96b 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -84,8 +84,9 @@ Admin: \tF3 = asay \tF5 = Aghost (admin-ghost) \tF6 = player-panel -\tF7 = admin-pm +\tF7 = Buildmode \tF8 = Invisimin +\tCtrl+F8 = Stealthmin "} mob.hotkey_help() @@ -219,4 +220,4 @@ Any-Mode: (hotkey doesn't need to be on) "} to_chat(src, hotkey_mode) - to_chat(src, other) \ No newline at end of file + to_chat(src, other) From d7cd4726a282c8900ea7344414986dfee61a60e2 Mon Sep 17 00:00:00 2001 From: RandomMarine Date: Sun, 25 Mar 2018 20:00:13 +0000 Subject: [PATCH 036/114] Fixes plasma window fire armor --- code/game/objects/structures/window.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index f923453f62..23171bb821 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -415,7 +415,7 @@ icon_state = "plasmawindow" reinf = FALSE heat_resistance = 25000 - armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100, "fire" = 00, "acid" = 100) + armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100) max_integrity = 150 explosion_block = 1 glass_type = /obj/item/stack/sheet/plasmaglass From efb3dceb3202c2fe8b69c918045fb3c18ac2594d Mon Sep 17 00:00:00 2001 From: MrDoomBringer Date: Wed, 28 Mar 2018 14:38:03 -0400 Subject: [PATCH 038/114] Fixes the cargo Express Console's description [wtf why is there a sprites tag] (#36765) * - Introduces a non-linear component to liver damage from alcohol so weak alcohol doesn't kill you instantly. (#36089) * mfw the space jews finally leave the drop pod buisiness gimme gimme the gee bee pee the fuck ahaha --- code/modules/cargo/expressconsole.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index d6b736ab31..4f5d7006d3 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -2,7 +2,7 @@ /obj/machinery/computer/cargo/express name = "express supply console" - desc = "This console allows the user to purchase a package for double the price,\ + desc = "This console allows the user to purchase a package \ with 1/40th of the delivery time: made possible by NanoTrasen's new \"Drop Pod Railgun\".\ All sales are near instantaneous - please choose carefully" icon_screen = "supply_express" @@ -75,8 +75,7 @@ data["siliconUser"] = user.has_unlimited_silicon_privilege data["points"] = SSshuttle.points data["supplies"] = list() - message = "For normally priced items, please use the standard Supply or Request Console. \ - Sales are near-instantaneous - please choose carefully." + message = "Sales are near-instantaneous - please choose carefully." if(SSshuttle.supplyBlocked) message = blockade_warning if(obj_flags & EMAGGED) From 8ff1fdd907d614463554239b48668d064a3571bd Mon Sep 17 00:00:00 2001 From: Jalleo Date: Wed, 28 Mar 2018 19:39:44 +0100 Subject: [PATCH 040/114] Little fix to RPED (#36610) * Why use a weird proc to check it than set a static list? Yes one is technically more expensive but better maintainability * Changes to what Cyberboss suggested (For performance reasons?) * oranges and Antur make sense with the && False its just a false return instead. * Man I need to read more areas of the codebase that entire proc being modified was not required with my list change...... --- code/modules/research/stock_parts.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index d00b5e3137..459c1a9955 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -17,13 +17,17 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi display_contents_with_number = 1 max_w_class = WEIGHT_CLASS_NORMAL max_combined_w_class = 100 + + can_hold = list( + /obj/item/reagent_containers/glass/beaker, + /obj/item/device/assembly/igniter, + /obj/item/stock_parts, + /obj/item/stack/ore/bluespace_crystal) + var/works_from_distance = 0 var/pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/rped.ogg' var/alt_sound = null -/obj/item/storage/part_replacer/can_be_inserted(obj/item/W, stop_messages = 0, mob/user) - return ..() && W.get_part_rating() - /obj/item/storage/part_replacer/afterattack(obj/machinery/T, mob/living/carbon/human/user, flag, params) if(flag) return From 7980b080e37280f62e33cc0161903e60365663e8 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sat, 24 Mar 2018 20:14:05 -0400 Subject: [PATCH 042/114] Restarting the controller no longer resets the config --- code/controllers/master.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 70552e0ccb..2b1e9bcda9 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -62,7 +62,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/static/current_ticklimit = TICK_LIMIT_RUNNING /datum/controller/master/New() - config = new + if(!config) + config = new // Highlander-style: there can only be one! Kill off the old and replace it with the new. if(!random_seed) From 75187908a348fa46cd964587cc3324dade333f66 Mon Sep 17 00:00:00 2001 From: XDTM Date: Wed, 28 Mar 2018 20:44:03 +0200 Subject: [PATCH 044/114] Fixes strobe shields' icon getting stuck (#36714) * Fixes strobe shields' icon getting stuck * src instead of get_turf(src) --- code/modules/assembly/flash.dm | 8 ++++---- icons/obj/items_and_weapons.dmi | Bin 120578 -> 121107 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 9f5b21962a..0c9735ce4d 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -266,22 +266,22 @@ return crit_fail = FALSE times_used = 0 - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) update_icon() flash.crit_fail = TRUE flash.update_icon() return ..() -/obj/item/device/assembly/flash/shield/update_icon(flash = 0) - item_state = "flashshield" +/obj/item/device/assembly/flash/shield/update_icon(flash = FALSE) + icon_state = "flashshield" item_state = "flashshield" if(crit_fail) icon_state = "riot" item_state = "riot" else if(flash) - item_state = "flashshield_flash" + icon_state = "flashshield_flash" item_state = "flashshield_flash" addtimer(CALLBACK(src, .proc/update_icon), 5) diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 03cf226b842c10a77c54a02b20bb8cead30bbd82..b0b01a2446b0a0cc8fa096357b595a25460fd634 100644 GIT binary patch delta 99622 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�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¦`sRXli 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 From 60091c50b56d6f4cbf5cf2ccba23a7be779cab00 Mon Sep 17 00:00:00 2001 From: Davidj361 Date: Wed, 28 Mar 2018 14:43:42 -0400 Subject: [PATCH 046/114] Fixes "ocular wardens don't target buckled mobs" (#36628) * Ocular wardens now shoot handcuffed and buckled, but not if they're spelled handcuffed. * Clock cultists can spell cuff sec cuffed carbon mobs, so the ocular doesn't shoot them. * Added in review suggestions * More oversight --- .../antagonists/clockcult/clock_helpers/slab_abilities.dm | 4 ++-- .../antagonists/clockcult/clock_structures/ocular_warden.dm | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm index 95a46705f0..fedcfa0e97 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm @@ -40,7 +40,7 @@ else if(L.stat) to_chat(ranged_ability_user, "\"There is use in shackling the dead, but for examples.\"") return TRUE - else if(L.handcuffed) + else if (istype(L.handcuffed,/obj/item/restraints/handcuffs/clockwork)) to_chat(ranged_ability_user, "\"They are already helpless, no?\"") return TRUE @@ -49,7 +49,7 @@ "You begin shaping replicant alloy into manacles around [L]'s wrists...") to_chat(L, "[ranged_ability_user] begins forming manacles around your wrists!") if(do_mob(ranged_ability_user, L, 30)) - if(!L.handcuffed) + if(!(istype(L.handcuffed,/obj/item/restraints/handcuffs/clockwork))) L.handcuffed = new/obj/item/restraints/handcuffs/clockwork(L) L.update_handcuffed() to_chat(ranged_ability_user, "You shackle [L].") diff --git a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm index 86d9497934..f6df9efbbe 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm @@ -112,8 +112,12 @@ continue if(is_servant_of_ratvar(L) || (L.has_trait(TRAIT_BLIND)) || L.anti_magic_check(TRUE, TRUE)) continue - if(L.stat || L.restrained() || L.buckled || L.lying) + if(L.stat || L.lying) continue + if (iscarbon(L)) + var/mob/living/carbon/c = L + if (istype(c.handcuffed,/obj/item/restraints/handcuffs/clockwork)) + continue if(ishostile(L)) var/mob/living/simple_animal/hostile/H = L if(("ratvar" in H.faction) || (!H.mind && "neutral" in H.faction)) From 8b1cf5bfceec745208d8e259695470be173f2501 Mon Sep 17 00:00:00 2001 From: Tacolizard Date: Wed, 28 Mar 2018 11:43:07 -0700 Subject: [PATCH 048/114] Fixes phobia word recognition (#36457) * fix * Update phobia.json * add plural detection --- code/datums/brain_damage/phobia.dm | 8 +++++--- strings/phobia.json | 24 +++++++++++++++--------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index a548af4e88..75c2f27631 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -71,14 +71,16 @@ if(!owner.can_hear() || world.time < next_scare) //words can't trigger you if you can't hear them *taps head* return message for(var/word in trigger_words) - if(findtext(raw_message, word)) + var/reg = regex(@"[^\l][REGEX_QUOTE(word)]*s[^\l]") + if(findtext(raw_message, reg)) addtimer(CALLBACK(src, .proc/freak_out, null, word), 10) //to react AFTER the chat message break return message /datum/brain_trauma/mild/phobia/on_say(message) for(var/word in trigger_words) - if(findtext(message, word)) + var/reg = regex(@"[^\l][REGEX_QUOTE(word)]*s[^\l]") + if(findtext(message, reg)) to_chat(owner, "You can't bring yourself to say the word \"[word]\"!") return "" return message @@ -114,4 +116,4 @@ owner.dizziness += 10 owner.confused += 10 owner.Jitter(10) - owner.stuttering += 10 \ No newline at end of file + owner.stuttering += 10 diff --git a/strings/phobia.json b/strings/phobia.json index d21e89aeb9..10fdbd9a0c 100644 --- a/strings/phobia.json +++ b/strings/phobia.json @@ -15,7 +15,7 @@ ], "security": [ - " sec ", + "sec", "security", "shitcurity", "baton", @@ -32,22 +32,22 @@ "chain of command", "heads of staff", "head of security", - " hos ", + "hos", "head of personnel", - " hop ", + "hop", "head of research", - " rd ", + "rd", "chief medical officer", - " cmo ", + "cmo", "chief engineer", - " ce ", + "ce", "captain", "deathsquad", "death squad", "alien", "xeno", "abductor", - " ayy", + "ayy", "gray", "grey", "ufo", @@ -66,7 +66,9 @@ "clown", "honk", "banana", - "slip" + "slip", + "slipped", + "slipping" ], "greytide": [ @@ -84,7 +86,11 @@ "lizard", "ligger", "hiss", - "wag" + "hissed", + "hissing", + "wag", + "wagged", + "wagging" ], "skeletons": [ From 6b48740f7edf8caab9d0b5119c42de11e7e03da3 Mon Sep 17 00:00:00 2001 From: Alomga <34215067+Alomga@users.noreply.github.com> Date: Thu, 29 Mar 2018 02:21:35 +0200 Subject: [PATCH 050/114] Tweaks stats of 4 virus symptoms (#36748) Makes Vitiligo, Revitiligo, Facial Hypertrichosis and Alopecia usefull instead of making your virus worse without contributing anything. Symptom that makes you pale shouldn't have worse stats that one that can kill. --- .../datums/diseases/advance/symptoms/beard.dm | 18 +++++------ .../diseases/advance/symptoms/shedding.dm | 8 ++--- code/datums/diseases/advance/symptoms/skin.dm | 32 +++++++++---------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/code/datums/diseases/advance/symptoms/beard.dm b/code/datums/diseases/advance/symptoms/beard.dm index c7a3ccec89..6b26183828 100644 --- a/code/datums/diseases/advance/symptoms/beard.dm +++ b/code/datums/diseases/advance/symptoms/beard.dm @@ -2,10 +2,10 @@ ////////////////////////////////////// Facial Hypertrichosis - Very very Noticable. - Decreases resistance slightly. - Decreases stage speed. - Reduced transmittability + No change to stealth. + Increases resistance. + Increases speed. + Slighlty increases transmittability Intense Level. BONUS @@ -18,10 +18,10 @@ BONUS name = "Facial Hypertrichosis" desc = "The virus increases hair production significantly, causing rapid beard growth." - stealth = -3 - resistance = -1 - stage_speed = -3 - transmittable = -1 + stealth = 0 + resistance = 3 + stage_speed = 2 + transmittable = 1 level = 4 severity = 1 symptom_delay_min = 18 @@ -48,4 +48,4 @@ BONUS to_chat(H, "You feel manly!") if(!(H.facial_hair_style == "Dwarf Beard") && !(H.facial_hair_style == "Very Long Beard")) H.facial_hair_style = pick("Dwarf Beard", "Very Long Beard") - H.update_hair() \ No newline at end of file + H.update_hair() diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/advance/symptoms/shedding.dm index c5bbb6bc7b..8946a83108 100644 --- a/code/datums/diseases/advance/symptoms/shedding.dm +++ b/code/datums/diseases/advance/symptoms/shedding.dm @@ -4,7 +4,7 @@ Alopecia Not Noticeable. Increases resistance slightly. - Reduces stage speed slightly. + Increases stage speed. Transmittable. Intense Level. @@ -19,8 +19,8 @@ BONUS desc = "The virus causes rapid shedding of head and body hair." stealth = 0 resistance = 1 - stage_speed = -1 - transmittable = 3 + stage_speed = 2 + transmittable = 2 level = 4 severity = 1 base_message_chance = 50 @@ -52,4 +52,4 @@ BONUS H.hair_style = "Bald" else H.hair_style = "Balding Hair" - H.update_hair() \ No newline at end of file + H.update_hair() diff --git a/code/datums/diseases/advance/symptoms/skin.dm b/code/datums/diseases/advance/symptoms/skin.dm index 014607eb44..300eecc80e 100644 --- a/code/datums/diseases/advance/symptoms/skin.dm +++ b/code/datums/diseases/advance/symptoms/skin.dm @@ -2,10 +2,10 @@ ////////////////////////////////////// Vitiligo - Extremely Noticable. - Decreases resistance slightly. - Reduces stage speed slightly. - Reduces transmission. + Hidden. + No change to resistance. + Increases stage speed. + Slightly increases transmittability. Critical Level. BONUS @@ -18,10 +18,10 @@ BONUS name = "Vitiligo" desc = "The virus destroys skin pigment cells, causing rapid loss of pigmentation in the host." - stealth = -3 - resistance = -1 - stage_speed = -1 - transmittable = -2 + stealth = 2 + resistance = 0 + stage_speed = 3 + transmittable = 1 level = 5 severity = 1 symptom_delay_min = 25 @@ -47,10 +47,10 @@ BONUS ////////////////////////////////////// Revitiligo - Extremely Noticable. - Decreases resistance slightly. - Reduces stage speed slightly. - Reduces transmission. + Slightly noticable. + Increases resistance. + Increases stage speed slightly. + Increases transmission. Critical Level. BONUS @@ -63,10 +63,10 @@ BONUS name = "Revitiligo" desc = "The virus causes increased production of skin pigment cells, making the host's skin grow darker over time." - stealth = -3 - resistance = -1 - stage_speed = -1 - transmittable = -2 + stealth = -1 + resistance = 3 + stage_speed = 1 + transmittable = 2 level = 5 severity = 1 symptom_delay_min = 7 From 9442a2905e8466cadfdae54e40cfa886f5ecd357 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 29 Mar 2018 02:35:26 -0700 Subject: [PATCH 052/114] Fixes blueprints exploit (#36625) * Fixes blueprints exploit * redundent qdeleted --- code/game/objects/items/blueprints.dm | 16 +++++++++++++--- code/modules/ruins/objects_and_mobs/sin_ruins.dm | 8 +++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index ad616e8ad3..9edd19795c 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -9,6 +9,7 @@ icon_state = "blueprints" attack_verb = list("attacked", "bapped", "hit") var/fluffnotice = "Nobody's gonna read this stuff!" + var/in_use = FALSE /obj/item/areaeditor/attack_self(mob/user) add_fingerprint(user) @@ -25,12 +26,16 @@ /obj/item/areaeditor/Topic(href, href_list) if(..()) - return + return TRUE if(!usr.canUseTopic(src)) usr << browse(null, "window=blueprints") - return + return TRUE if(href_list["create_area"]) + if(in_use) + return + in_use = TRUE create_area(usr) + in_use = FALSE updateUsrDialog() //Station blueprints!!! @@ -79,11 +84,16 @@ /obj/item/areaeditor/blueprints/Topic(href, href_list) - ..() + if(..()) + return if(href_list["edit_area"]) if(get_area_type()!=AREA_STATION) return + if(in_use) + return + in_use = TRUE edit_area() + in_use = FALSE if(href_list["exit_legend"]) legend = FALSE; if(href_list["view_legend"]) diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index 384f22282b..5bcc58ff87 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -82,15 +82,13 @@ var/mob/living/carbon/human/H = mover if(H.nutrition >= NUTRITION_LEVEL_FAT) H.visible_message("[H] pushes through [src]!", "You've seen and eaten worse than this.") - return 1 + return TRUE else to_chat(H, "You're repulsed by even looking at [src]. Only a pig could force themselves to go through it.") if(istype(mover, /mob/living/simple_animal/hostile/morph)) - return 1 + return TRUE else - return 0 - - + return FALSE /obj/structure/mirror/magic/pride //Pride's mirror: Used in the Pride ruin. name = "pride's mirror" From 85ef261c7669c0947d31dd80bc28ad5338c6b05b Mon Sep 17 00:00:00 2001 From: FrozenGuy5 <31222036+praisenarsie@users.noreply.github.com> Date: Thu, 29 Mar 2018 10:53:07 +0100 Subject: [PATCH 054/114] Capitalizes pathfinder (#36763) --- code/controllers/subsystem/pathfinder.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/pathfinder.dm b/code/controllers/subsystem/pathfinder.dm index fe503b0b7a..871eba49ad 100644 --- a/code/controllers/subsystem/pathfinder.dm +++ b/code/controllers/subsystem/pathfinder.dm @@ -1,5 +1,5 @@ SUBSYSTEM_DEF(pathfinder) - name = "pathfinder" + name = "Pathfinder" init_order = INIT_ORDER_PATH flags = SS_NO_FIRE var/datum/flowcache/mobs @@ -19,7 +19,7 @@ SUBSYSTEM_DEF(pathfinder) var/list/flow /datum/flowcache/New(var/n) - .=..() + . = ..() lcount = n run = 0 free = 1 From bf699ac9e6a7e5f0d1180d5af8be11304da21e6b Mon Sep 17 00:00:00 2001 From: kachnov Date: Thu, 29 Mar 2018 06:01:03 -0400 Subject: [PATCH 056/114] increases MAX_THROWING_DIST (#36702) * initial commit * refactor * oh that went first --- code/controllers/subsystem/throwing.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index a080f1a159..bfb7099ed2 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -1,4 +1,4 @@ -#define MAX_THROWING_DIST 512 // 2 z-levels on default width +#define MAX_THROWING_DIST 1280 // 5 z-levels on default width #define MAX_TICKS_TO_MAKE_UP 3 //how many missed ticks will we attempt to make up for this run. SUBSYSTEM_DEF(throwing) @@ -107,7 +107,7 @@ SUBSYSTEM_DEF(throwing) return dist_travelled++ - + if (dist_travelled > MAX_THROWING_DIST) finalize() return From 2aae805c1d6b1d2af035ee7248056c227da68ad6 Mon Sep 17 00:00:00 2001 From: Jordie Date: Thu, 29 Mar 2018 20:03:44 +1000 Subject: [PATCH 058/114] Fixes round-end report not generating sometimes. (#36679) * fixes some non-minded mobs breaking roundend report * actually a better handling --- code/__HELPERS/roundend.dm | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index b0e76bbcf3..d64424c0e8 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -20,7 +20,7 @@ if(isnewplayer(m)) continue if(m.mind) - if(m.stat != DEAD && !isbrain(m)) + if(m.stat != DEAD && !isbrain(m) && !iscameramob(m)) num_survivors++ mob_data += list("name" = m.name, "ckey" = ckey(m.mind.key)) if(isobserver(m)) @@ -41,9 +41,9 @@ if(iscyborg(L)) var/mob/living/silicon/robot/R = L mob_data += list("module" = R.module) - else - category = "others" - mob_data += list("typepath" = L.type) + else + category = "others" + mob_data += list("typepath" = m.type) if(!escaped) if(EMERGENCY_ESCAPED_OR_ENDGAMED && (m.onCentCom() || m.onSyndieBase())) escaped = "escapees" @@ -60,8 +60,12 @@ file_data["[escaped]"]["npcs"]["[initial(m.name)]"] = 1 else if(isobserver(m)) - file_data["[escaped]"] = mob_data + var/pos = length(file_data["[escaped]"]) + 1 + file_data["[escaped]"]["[pos]"] = mob_data else + if(!category) + category = "others" + mob_data += list("name" = m.name, "typepath" = m.type) var/pos = length(file_data["[escaped]"]["[category]"]) + 1 file_data["[escaped]"]["[category]"]["[pos]"] = mob_data var/datum/station_state/end_state = new /datum/station_state() From 9520546277eea333b302e3c8dc22e847641864eb Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Thu, 29 Mar 2018 09:34:22 -0400 Subject: [PATCH 060/114] Merge pull request #36772 from vuonojenmustaturska/dertpartment Removes derpartment --- code/game/gamemodes/objective.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 15ddee2669..b678f8cd0e 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -675,7 +675,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) //Picks as many people as it can from a department (Security,Engineer,Medical,Science) //and tasks the lings with killing and replacing them /datum/objective/changeling_team_objective/impersonate_department - explanation_text = "Ensure X derpartment are killed, impersonated, and replaced by Changelings" + explanation_text = "Ensure X department are killed, impersonated, and replaced by Changelings" var/command_staff_only = FALSE //if this is true, it picks command staff instead var/list/department_minds = list() var/list/department_real_names = list() @@ -823,7 +823,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) -//A subtype of impersonate_derpartment +//A subtype of impersonate_department //This subtype always picks as many command staff as it can (HoS,HoP,Cap,CE,CMO,RD) //and tasks the lings with killing and replacing them /datum/objective/changeling_team_objective/impersonate_department/impersonate_heads From de282f5201c69085186c96ea6ee7540a7010638b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 29 Mar 2018 19:10:37 -0500 Subject: [PATCH 062/114] [MIRROR] individual player panel now logs 100% of the time (#6176) * individual player panel now logs 100% of the time * logging (#36819) --- code/modules/admin/admin.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 5cdc58dae3..d1f58dfe7f 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -19,8 +19,7 @@ if(!check_rights()) return - if(!isobserver(usr)) - log_game("[key_name(usr)] checked the player panel while in game.") + log_admin("[key_name(usr)] checked the individual player panel for [key_name(M)][isobserver(usr)?"":" while in game"].") if(!M) to_chat(usr, "You seem to be selecting a mob that doesn't exist anymore.") From dc4b52bcfd6fdd9ebe0b8928f33d992c61944661 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 29 Mar 2018 17:09:36 -0700 Subject: [PATCH 063/114] logging (#36818) --- code/modules/admin/player_panel.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 670b22815d..8ddcc1b593 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -1,6 +1,7 @@ /datum/admins/proc/player_panel_new()//The new one if(!check_rights()) return + log_admin("[key_name(usr)] checked the player panel.") var/dat = "Player Panel" //javascript, the part that does most of the work~ @@ -307,4 +308,4 @@ "} - usr << browse(dat, "window=players;size=600x480") \ No newline at end of file + usr << browse(dat, "window=players;size=600x480") From 7bffe7110b3df3e3ac7c52a7a85487cf1482ae47 Mon Sep 17 00:00:00 2001 From: DavenPeace1 Date: Thu, 29 Mar 2018 02:19:23 -0300 Subject: [PATCH 064/114] OctopusTime --- .../mob/dead/new_player/sprite_accessories.dm | 4 ++++ modular_citadel/icons/mob/mam_taur.dmi | Bin 38387 -> 40155 bytes 2 files changed, 4 insertions(+) diff --git a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm index 5e733cfb6a..4271862c7a 100644 --- a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -850,6 +850,10 @@ name = "Naga" icon_state = "naga" +/datum/sprite_accessory/taur/octopus + name = "Octopus" + icon_state = "octopus" + /datum/sprite_accessory/taur/otie name = "Otie" icon_state = "otie" diff --git a/modular_citadel/icons/mob/mam_taur.dmi b/modular_citadel/icons/mob/mam_taur.dmi index 8cd02f862e4d81c5ef9b2d3a56ea72d68fdfcf10..dee50d45668a0804342c8abb2783dbc97f6edd39 100644 GIT binary patch delta 20296 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 From 002c5a2b7315d3e9ff8f8f97f777a22f3c9ec308 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 28 Mar 2018 22:31:30 -0500 Subject: [PATCH 065/114] ai icon --- code/modules/mob/living/silicon/ai/ai.dm | 5 +++-- icons/mob/AI.dmi | Bin 395833 -> 397529 bytes tgstation.dme | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 31df48e5e5..dcd42d96d4 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -171,7 +171,7 @@ if(incapacitated()) return - var/icontype = input("Please, select a display!", "AI", null/*, null*/) in list("Clown", "Monochrome", "Blue", "Inverted", "Firewall", "Green", "Red", "Static", "Red October", "House", "Heartline", "Hades", "Helios", "President", "Syndicat Meow", "Alien", "Too Deep", "Triumvirate", "Triumvirate-M", "Text", "Matrix", "Dorf", "Bliss", "Not Malf", "Fuzzy", "Goon", "Database", "Glitchman", "Murica", "Nanotrasen", "Gentoo", "Angel") + var/icontype = input("Please, select a display!", "AI", null/*, null*/) in list("Clown", "Monochrome", "Blue", "Inverted", "Firewall", "Green", "Red", "Static", "Red October", "House", "Heartline", "Hades", "Helios", "President", "Syndicat Meow", "Alien", "Too Deep", "Triumvirate", "Triumvirate-M", "Text", "Matrix", "Dorf", "Bliss", "Not Malf", "Fuzzy", "Goon", "Database", "Glitchman", "Murica", "Nanotrasen", "Gentoo", "Angel", "TechDemon") if(icontype == "Clown") icon_state = "ai-clown2" else if(icontype == "Monochrome") @@ -236,7 +236,8 @@ icon_state = "ai-gentoo" else if(icontype == "Angel") icon_state = "ai-angel" - + else if(icontype == "TechDemon") + icon_state = "tech_demon" /mob/living/silicon/ai/Stat() ..() if(statpanel("Status")) diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi index f4cb3e983b354f42c3e72be45c1b269a9cf1b9ce..e12792217baa8e87c3613dcdf9000a5cf54aa0a4 100644 GIT binary patch delta 14451 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 OaO9+vB}-ns_WyreTmh{B diff --git a/tgstation.dme b/tgstation.dme index 07746da3b9..b184f49d64 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2689,7 +2689,6 @@ #include "modular_citadel\code\modules\admin\topic.dm" #include "modular_citadel\code\modules\antagonists\cit_crewobjectives.dm" #include "modular_citadel\code\modules\antagonists\cit_miscreants.dm" -#include "modular_citadel\code\modules\antagonists\cult\blood_magic.dm" #include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_cargo.dm" #include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_civilian.dm" #include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_command.dm" @@ -2697,6 +2696,7 @@ #include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_medical.dm" #include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_science.dm" #include "modular_citadel\code\modules\antagonists\crew_objectives\cit_crewobjectives_security.dm" +#include "modular_citadel\code\modules\antagonists\cult\blood_magic.dm" #include "modular_citadel\code\modules\arousal\arousal.dm" #include "modular_citadel\code\modules\arousal\organs\breasts.dm" #include "modular_citadel\code\modules\arousal\organs\eggsack.dm" From cb4aa936dbb0fa0c6cd2c35716e9564b60bb2c4d Mon Sep 17 00:00:00 2001 From: LetterJay Date: Thu, 29 Mar 2018 09:47:35 -0500 Subject: [PATCH 066/114] Update ai.dm --- code/modules/mob/living/silicon/ai/ai.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index dcd42d96d4..efd6ada230 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -171,7 +171,7 @@ if(incapacitated()) return - var/icontype = input("Please, select a display!", "AI", null/*, null*/) in list("Clown", "Monochrome", "Blue", "Inverted", "Firewall", "Green", "Red", "Static", "Red October", "House", "Heartline", "Hades", "Helios", "President", "Syndicat Meow", "Alien", "Too Deep", "Triumvirate", "Triumvirate-M", "Text", "Matrix", "Dorf", "Bliss", "Not Malf", "Fuzzy", "Goon", "Database", "Glitchman", "Murica", "Nanotrasen", "Gentoo", "Angel", "TechDemon") + var/icontype = input("Please, select a display!", "AI", null/*, null*/) in list("Clown", "Monochrome", "Blue", "Inverted", "Firewall", "Green", "Red", "Static", "Red October", "House", "Heartline", "Hades", "Helios", "President", "Syndicat Meow", "Alien", "Too Deep", "Triumvirate", "Triumvirate-M", "Text", "Matrix", "Dorf", "Bliss", "Not Malf", "Fuzzy", "Goon", "Database", "Glitchman", "Murica", "Nanotrasen", "Gentoo", "Angel", "TechDemon") //CIT CHANGE - adds 'TechDemon if(icontype == "Clown") icon_state = "ai-clown2" else if(icontype == "Monochrome") @@ -236,7 +236,7 @@ icon_state = "ai-gentoo" else if(icontype == "Angel") icon_state = "ai-angel" - else if(icontype == "TechDemon") + else if(icontype == "TechDemon") //CIT CHANGE - adds 'TechDemon icon_state = "tech_demon" /mob/living/silicon/ai/Stat() ..() From 675b5570b8c7fc13c8158d0e0a3d03872e9fdf41 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sat, 31 Mar 2018 00:02:46 -0400 Subject: [PATCH 067/114] Merge pull request #36807 from vuonojenmustaturska/champrojectoragain Fixes some edge cases with chameleon projectors and sleepers --- code/game/machinery/Sleeper.dm | 7 ++++++- code/game/objects/items/devices/chameleonproj.dm | 5 ++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 52702868f7..cefc471d08 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -58,8 +58,13 @@ "You climb out of [src]!") open_machine() +/obj/machinery/sleeper/Exited(atom/movable/user) + if (!state_open && user == occupant) + container_resist(user) + /obj/machinery/sleeper/relaymove(mob/user) - container_resist(user) + if (!state_open) + container_resist(user) /obj/machinery/sleeper/open_machine() if(!state_open && !panel_open) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index a07d8d8d60..c7865ac576 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -28,7 +28,10 @@ disrupt() /obj/item/device/chameleon/attack_self(mob/user) - toggle(user) + if (isturf(user.loc) || istype(user.loc, /obj/structure) || active_dummy) + toggle(user) + else + to_chat(user, "You can't use [src] while inside something.") /obj/item/device/chameleon/afterattack(atom/target, mob/user , proximity) if(!proximity) From b26868a6b7a44c7f8fd7fd82f3f43efd7d9a40ba Mon Sep 17 00:00:00 2001 From: Robustin Date: Sat, 31 Mar 2018 00:02:09 -0400 Subject: [PATCH 069/114] Get_Flat_Human_Icon no longer draws asses that nobody wants (#36781) * Argument to limit excess icon work * 50% less icon for your icon * 75% less icon for your icon * Correction * statics the list, tweaks a default arg * Cardinal argument list * correct GLOB name --- code/__HELPERS/icons.dm | 27 ++++++--------------------- code/datums/datacore.dm | 14 +++++++++----- code/modules/antagonists/cult/cult.dm | 2 +- 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 0e5fff082c..be886298a7 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1041,7 +1041,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) return 0 //For creating consistent icons for human looking simple animals -/proc/get_flat_human_icon(icon_id, datum/job/J, datum/preferences/prefs, dummy_key) +/proc/get_flat_human_icon(icon_id, datum/job/J, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals) var/static/list/humanoid_icon_cache = list() if(!icon_id || !humanoid_icon_cache[icon_id]) var/mob/living/carbon/human/dummy/body = generate_or_wait_for_human_dummy(dummy_key) @@ -1053,26 +1053,11 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing") - - body.setDir(NORTH) - COMPILE_OVERLAYS(body) - var/icon/partial = getFlatIcon(body) - out_icon.Insert(partial,dir=NORTH) - - body.setDir(SOUTH) - COMPILE_OVERLAYS(body) - partial = getFlatIcon(body) - out_icon.Insert(partial,dir=SOUTH) - - body.setDir(WEST) - COMPILE_OVERLAYS(body) - partial = getFlatIcon(body) - out_icon.Insert(partial,dir=WEST) - - body.setDir(EAST) - COMPILE_OVERLAYS(body) - partial = getFlatIcon(body) - out_icon.Insert(partial,dir=EAST) + for(var/D in showDirs) + body.setDir(D) + COMPILE_OVERLAYS(body) + var/icon/partial = getFlatIcon(body) + out_icon.Insert(partial,dir=D) humanoid_icon_cache[icon_id] = out_icon dummy_key? unset_busy_human_dummy(dummy_key) : qdel(body) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index c22af19396..c88a86c092 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -199,6 +199,7 @@ /datum/datacore/proc/manifest_inject(mob/living/carbon/human/H, client/C) set waitfor = FALSE + var/static/list/show_directions = list(SOUTH, WEST) if(H.mind && (H.mind.assigned_role != H.mind.special_role)) var/assignment if(H.mind.assigned_role) @@ -212,11 +213,14 @@ var/id = num2hex(record_id_num++,6) if(!C) C = H.client - var/image = get_id_photo(H, C) + var/image = get_id_photo(H, C, show_directions) var/obj/item/photo/photo_front = new() var/obj/item/photo/photo_side = new() - photo_front.photocreate(null, icon(image, dir = SOUTH)) - photo_side.photocreate(null, icon(image, dir = WEST)) + for(var/D in show_directions) + if(D == SOUTH) + photo_front.photocreate(null, icon(image, dir = D)) + if(D == WEST || D == EAST) + photo_side.photocreate(null, icon(image, dir = D)) //These records should ~really~ be merged or something //General Record @@ -279,11 +283,11 @@ locked += L return -/datum/datacore/proc/get_id_photo(mob/living/carbon/human/H, client/C) +/datum/datacore/proc/get_id_photo(mob/living/carbon/human/H, client/C, show_directions = list(SOUTH)) var/datum/job/J = SSjob.GetJob(H.mind.assigned_role) var/datum/preferences/P if(!C) C = H.client if(C) P = C.prefs - return get_flat_human_icon(null, J, P, DUMMY_HUMAN_SLOT_MANIFEST) + return get_flat_human_icon(null, J, P, DUMMY_HUMAN_SLOT_MANIFEST, show_directions) diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index ae8bec2537..80947fec16 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -241,7 +241,7 @@ var/datum/job/sacjob = SSjob.GetJob(sac_objective.target.assigned_role) var/datum/preferences/sacface = sac_objective.target.current.client.prefs - var/icon/reshape = get_flat_human_icon(null, sacjob, sacface) + var/icon/reshape = get_flat_human_icon(null, sacjob, sacface, list(SOUTH)) reshape.Shift(SOUTH, 4) reshape.Shift(EAST, 1) reshape.Crop(7,4,26,31) From fb28072ef3446195cedf359e79ee7ab2b7c9c5e6 Mon Sep 17 00:00:00 2001 From: Jalleo Date: Sat, 31 Mar 2018 03:46:15 +0100 Subject: [PATCH 071/114] Removes a unused helper (#36811) --- code/__HELPERS/game.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 26b5ac65cc..1095e07e53 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -20,12 +20,6 @@ return null return format_text ? format_text(A.name) : A.name -/proc/get_area_by_name(N) //get area by its name - for(var/area/A in world) - if(A.name == N) - return A - return 0 - /proc/get_areas_in_range(dist=0, atom/center=usr) if(!dist) var/turf/T = get_turf(center) From 72348f6235e85080cf7ab6aaa7c74997bb5b3b37 Mon Sep 17 00:00:00 2001 From: Robustin Date: Fri, 30 Mar 2018 14:14:40 -0400 Subject: [PATCH 073/114] wow --- code/game/machinery/computer/aifixer.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index a158957ecb..60e71eeac8 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -84,7 +84,6 @@ occupier.adjustToxLoss(-1, 0) occupier.adjustBruteLoss(-1, 0) occupier.updatehealth() - occupier.updatehealth() if(occupier.health >= 0 && occupier.stat == DEAD) occupier.revive() return occupier.health < 100 @@ -92,9 +91,11 @@ /obj/machinery/computer/aifixer/process() if(..()) if(active) + var/oldstat = occupier.stat active = Fix() + if(oldstat != occupier.stat) + update_icon() updateDialog() - update_icon() /obj/machinery/computer/aifixer/Topic(href, href_list) if(..()) From 2b280caa9b8baf880fdfccb8c71d2c4f53c719f6 Mon Sep 17 00:00:00 2001 From: Davidj361 Date: Fri, 30 Mar 2018 15:08:24 -0400 Subject: [PATCH 075/114] Fixed table crafting with tools in surrounding area (#36786) --- code/modules/crafting/craft.dm | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 1a11ac9817..0df1d349ce 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -52,6 +52,7 @@ /datum/personal_crafting/proc/check_contents(datum/crafting_recipe/R, list/contents) + contents = contents["other"] main_loop: for(var/A in R.reqs) var/needed_amount = R.reqs[A] @@ -89,25 +90,30 @@ /datum/personal_crafting/proc/get_surroundings(mob/user) . = list() + .["tool_behaviour"] = list() + .["other"] = list() for(var/obj/item/I in get_environment(user)) if(I.flags_2 & HOLOGRAM_2) continue if(istype(I, /obj/item/stack)) var/obj/item/stack/S = I - .[I.type] += S.amount + .["other"][I.type] += S.amount + else if(I.tool_behaviour) + .["tool_behaviour"] += I.tool_behaviour else if(istype(I, /obj/item/reagent_containers)) var/obj/item/reagent_containers/RC = I if(RC.is_drainable()) for(var/datum/reagent/A in RC.reagents.reagent_list) - .[A.type] += A.volume - .[I.type] += 1 + .["other"][A.type] += A.volume + .["other"][I.type] += 1 /datum/personal_crafting/proc/check_tools(mob/user, datum/crafting_recipe/R, list/contents) if(!R.tools.len) return TRUE var/list/possible_tools = list() var/list/present_qualities = list() + present_qualities |= contents["tool_behaviour"] for(var/obj/item/I in user.contents) if(istype(I, /obj/item/storage)) for(var/obj/item/SI in I.contents) @@ -120,7 +126,7 @@ if(I.tool_behaviour) present_qualities.Add(I.tool_behaviour) - possible_tools += contents + possible_tools |= contents["other"] main_loop: for(var/A in R.tools) From d6083b0ff6d803d5de225335c86385ae442b605a Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 30 Mar 2018 13:40:27 -0500 Subject: [PATCH 077/114] Fixes staff of change borgs recieving AI laws (#36785) * Fixes staff of change borgs recieving AI laws * lawupdate --- code/modules/projectiles/projectile/magic.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 82fb4fc59d..803167484c 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -159,11 +159,12 @@ new_mob.invisibility = 0 new_mob.job = "Cyborg" var/mob/living/silicon/robot/Robot = new_mob + Robot.lawupdate = FALSE + Robot.connected_ai = null Robot.mmi.transfer_identity(M) //Does not transfer key/client. Robot.clear_inherent_laws(0) - Robot.clear_zeroth_law(0, 0) - Robot.connected_ai = null - + Robot.clear_zeroth_law(0) + if("slime") new_mob = new /mob/living/simple_animal/slime/random(M.loc) From 65097bb4e4380307625b93412bec881301966dfc Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 30 Mar 2018 02:34:24 -0700 Subject: [PATCH 079/114] runtime --- code/modules/clothing/spacesuits/flightsuit.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index 3008264d24..60a958735a 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -468,8 +468,8 @@ /obj/item/device/flightpack/proc/losecontrol(knockdown = FALSE, move = TRUE) usermessage("Warning: Control system not responding. Deactivating!", "boldwarning") - wearer.visible_message("[wearer]'s flight suit abruptly shuts off and they lose control!") if(wearer) + wearer.visible_message("[wearer]'s flight suit abruptly shuts off and they lose control!") if(move) while(momentum_x != 0 || momentum_y != 0) sleep(2) From 73d4e9b11c2f83ee081e8f550f168d35a845dfac Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 30 Mar 2018 12:26:13 -0400 Subject: [PATCH 081/114] Fixes chem dispenser icon desync --- .../chemistry/machinery/chem_dispenser.dm | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index c826b623cc..a9e673ee60 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -19,6 +19,7 @@ var/mutable_appearance/beaker_overlay var/working_state = "dispenser_working" var/nopower_state = "dispenser_nopower" + var/has_panel_overlay = TRUE var/macrotier = 1 var/obj/item/reagent_containers/beaker = null var/list/dispensable_reagents = list( @@ -70,6 +71,11 @@ QDEL_NULL(cell) return ..() +/obj/machinery/chem_dispenser/examine(mob/user) + ..() + if(panel_open) + to_chat(user, "[src]'s maintenance hatch is open!") + /obj/machinery/chem_dispenser/process() if (recharge_counter >= 4) if(!is_operational()) @@ -94,13 +100,13 @@ obj/machinery/chem_dispenser/proc/work_animation() /obj/machinery/chem_dispenser/power_change() ..() - if(!powered() && nopower_state) - icon_state = nopower_state - else - icon_state = initial(icon_state) + icon_state = "[(nopower_state && !powered()) ? nopower_state : initial(icon_state)]" -obj/machinery/chem_dispenser/update_icon() +/obj/machinery/chem_dispenser/update_icon() cut_overlays() + if(has_panel_overlay && panel_open) + add_overlay(mutable_appearance(icon, "[initial(icon_state)]_panel-o")) + if(beaker) beaker_overlay = display_beaker() add_overlay(beaker_overlay) @@ -263,7 +269,8 @@ obj/machinery/chem_dispenser/update_icon() /obj/machinery/chem_dispenser/attackby(obj/item/I, mob/user, params) if(default_unfasten_wrench(user, I)) return - if(default_deconstruction_screwdriver(user, "dispenser-o", "dispenser", I)) + if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) + update_icon() return if(exchange_parts(user, I)) @@ -383,6 +390,7 @@ obj/machinery/chem_dispenser/update_icon() anchored = TRUE icon = 'icons/obj/chemical.dmi' icon_state = "soda_dispenser" + has_panel_overlay = FALSE amount = 10 pixel_y = 6 layer = WALL_OBJ_LAYER From 9b53b3da2cbaa86ab30494be66fc3d840a038f87 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 30 Mar 2018 12:19:05 -0400 Subject: [PATCH 082/114] Merge pull request #36780 from KorPhaeron/oocban Fixes OOC ban not applying to admins --- code/modules/client/verbs/ooc.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 2da25dd5df..e9c4c29a5e 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -19,9 +19,9 @@ if(prefs.muted & MUTE_OOC) to_chat(src, "You cannot use OOC (muted).") return - if(jobban_isbanned(src.mob, "OOC")) - to_chat(src, "You have been banned from OOC.") - return + if(jobban_isbanned(src.mob, "OOC")) + to_chat(src, "You have been banned from OOC.") + return msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) var/raw_msg = msg @@ -277,7 +277,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR) set category = "OOC" set desc ="Ignore a player's messages on the OOC channel" - + var/see_ghost_names = isobserver(mob) var/list/choices = list() for(var/client/C in GLOB.clients) From c48b35a0b2a8c09d4c4f8736138bf3ac5578158d Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 30 Mar 2018 12:14:52 -0400 Subject: [PATCH 084/114] Merge pull request #36787 from Davidj361/36744-twistedHealthFix Removed health cost for Twisted Construction upon casting on a wrong object --- code/modules/antagonists/cult/blood_magic.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 30ab2da128..252d0e3d23 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -589,6 +589,7 @@ SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) else to_chat(user, "The spell will not work on [target]!") + return ..() //Armor: Gives the target a basic cultist combat loadout From 447008e625649f4e2ef249f45bb71435f2d6392a Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 30 Mar 2018 12:11:37 -0400 Subject: [PATCH 086/114] Merge pull request #36795 from robbym/master Fixes custom ticker logic (#36792) --- code/modules/integrated_electronics/subtypes/time.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/integrated_electronics/subtypes/time.dm b/code/modules/integrated_electronics/subtypes/time.dm index 86e5e99059..26bd1fc1d6 100644 --- a/code/modules/integrated_electronics/subtypes/time.dm +++ b/code/modules/integrated_electronics/subtypes/time.dm @@ -90,7 +90,7 @@ if(do_tick && !is_running) is_running = TRUE tick() - else if(is_running) + else if(!do_tick && is_running) is_running = FALSE From 360eb223b35ee4242610366d0a22de67a3f71c3e Mon Sep 17 00:00:00 2001 From: AlexTheSysop42 Date: Fri, 30 Mar 2018 12:06:03 -0400 Subject: [PATCH 088/114] Adds check to keep observers from being recognized as servants of ratvar (#36800) * Comments out code to try to fix a bug * fixes servant ghosts being trapped on Reebe * protip: next time don't commit to master * ghosts no longer count as servants * Undoes ghost check, moved to is_servant_of_ratvar * change istype to isliving --- code/game/gamemodes/clock_cult/clock_cult.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index bd6a8bf77d..603829a2d0 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -45,7 +45,7 @@ Credit where due: /////////// /proc/is_servant_of_ratvar(mob/M) - return istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/clockcult) + return isliving(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/clockcult) /proc/is_eligible_servant(mob/M) if(!istype(M)) From 6e64e8e60100295eb42b42cd2a286ee257adb79a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 30 Mar 2018 09:04:48 -0700 Subject: [PATCH 090/114] Failing to latejoin as a job when the latejoin panel is already open now makes a more descriptive error message (#36794) * job availability * avail * Boop --- code/__DEFINES/jobs.dm | 9 +++- .../modules/mob/dead/new_player/new_player.dm | 46 +++++++++++++------ 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 82acf13dcf..51b907f846 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -40,4 +40,11 @@ #define CHAPLAIN (1<<10) #define CLOWN (1<<11) #define MIME (1<<12) -#define ASSISTANT (1<<13) \ No newline at end of file +#define ASSISTANT (1<<13) + +#define JOB_AVAILABLE 0 +#define JOB_UNAVAILABLE_GENERIC 1 +#define JOB_UNAVAILABLE_BANNED 2 +#define JOB_UNAVAILABLE_PLAYTIME 3 +#define JOB_UNAVAILABLE_ACCOUNTAGE 4 +#define JOB_UNAVAILABLE_SLOTFULL 5 diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 2471593814..8930a02036 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -278,31 +278,47 @@ qdel(src) return TRUE -/mob/dead/new_player/proc/IsJobAvailable(rank) +/proc/get_job_unavailable_error_message(retval, jobtitle) + switch(retval) + if(JOB_AVAILABLE) + return "[jobtitle] is available." + if(JOB_UNAVAILABLE_GENERIC) + return "[jobtitle] is unavailable." + if(JOB_UNAVAILABLE_BANNED) + return "You are currently banned from [jobtitle]." + if(JOB_UNAVAILABLE_PLAYTIME) + return "You do not have enough relevant playtime for [jobtitle]." + if(JOB_UNAVAILABLE_ACCOUNTAGE) + return "Your account is not old enough for [jobtitle]." + if(JOB_UNAVAILABLE_SLOTFULL) + return "[jobtitle] is already filled to capacity." + return "Error: Unknown job availability." + +/mob/dead/new_player/proc/IsJobUnavailable(rank) var/datum/job/job = SSjob.GetJob(rank) if(!job) - return 0 + return JOB_UNAVAILABLE_GENERIC if((job.current_positions >= job.total_positions) && job.total_positions != -1) if(job.title == "Assistant") if(isnum(client.player_age) && client.player_age <= 14) //Newbies can always be assistants - return 1 + return JOB_AVAILABLE for(var/datum/job/J in SSjob.occupations) if(J && J.current_positions < J.total_positions && J.title != job.title) - return 0 + return JOB_UNAVAILABLE_SLOTFULL else - return 0 + return JOB_UNAVAILABLE_SLOTFULL if(jobban_isbanned(src,rank)) - return 0 - if(!job.player_old_enough(src.client)) - return 0 + return JOB_UNAVAILABLE_BANNED + if(!job.player_old_enough(client)) + return JOB_UNAVAILABLE_ACCOUNTAGE if(job.required_playtime_remaining(client)) - return 0 - return 1 - + return JOB_UNAVAILABLE_PLAYTIME + return JOB_AVAILABLE /mob/dead/new_player/proc/AttemptLateSpawn(rank) - if(!IsJobAvailable(rank)) - alert(src, "[rank] is not available. Please try another.") + var/error = IsJobUnavailable(rank) + if(error != JOB_AVAILABLE) + alert(src, get_job_unavailable_error_message(error, rank)) return FALSE if(SSticker.late_join_disabled) @@ -405,7 +421,7 @@ var/available_job_count = 0 for(var/datum/job/job in SSjob.occupations) - if(job && IsJobAvailable(job.title)) + if(job && IsJobUnavailable(job.title) == JOB_AVAILABLE) available_job_count++; @@ -428,7 +444,7 @@ dat += "
" var/job_count = 0 for(var/datum/job/job in SSjob.occupations) - if(job && IsJobAvailable(job.title)) + if(job && IsJobUnavailable(job.title) == JOB_AVAILABLE) job_count++; if (job_count > round(available_job_count / 2)) dat += "
" From 0273ee6d03749965df9be1d1995b27787540f07f Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 30 Mar 2018 11:59:19 -0400 Subject: [PATCH 092/114] Merge pull request #36803 from ShizCalev/chem-dispenser-exploit-fix [s] Fixes chem dispenser not actually requiring power --- .../chemistry/machinery/chem_dispenser.dm | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index c826b623cc..d5d8abe28a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -186,23 +186,32 @@ obj/machinery/chem_dispenser/update_icon() return switch(action) if("amount") + if(!is_operational()) + return var/target = text2num(params["target"]) if(target in beaker.possible_transfer_amounts) amount = target work_animation() . = TRUE if("dispense") + if(!is_operational() || QDELETED(cell)) + return var/reagent = params["reagent"] if(beaker && dispensable_reagents.Find(reagent)) var/datum/reagents/R = beaker.reagents var/free = R.maximum_volume - R.total_volume var/actual = min(amount, (cell.charge * powerefficiency)*10, free) + if(!cell.use(actual / powerefficiency)) + say("Not enough energy to complete operation!") + return R.add_reagent(reagent, actual) - cell.use(actual / powerefficiency) + work_animation() . = TRUE if("remove") + if(!is_operational()) + return var/amount = text2num(params["amount"]) if(beaker && amount in beaker.possible_transfer_amounts) beaker.reagents.remove_all(amount) @@ -217,6 +226,8 @@ obj/machinery/chem_dispenser/update_icon() update_icon() . = TRUE if("dispense_recipe") + if(!is_operational() || QDELETED(cell)) + return var/recipe_to_use = params["recipe"] var/list/chemicals_to_dispense = process_recipe_list(recipe_to_use) var/res = get_macro_resolution() @@ -228,16 +239,24 @@ obj/machinery/chem_dispenser/update_icon() var/free = R.maximum_volume - R.total_volume var/actual = min(round(chemicals_to_dispense[key], res), (cell.charge * powerefficiency)*10, free) if(actual) + if(!cell.use(actual / powerefficiency)) + say("Not enough energy to complete operation!") + return R.add_reagent(r_id, actual) - cell.use(actual / powerefficiency) work_animation() if("clear_recipes") + if(!is_operational()) + return var/yesno = alert("Clear all recipes?",, "Yes","No") if(yesno == "Yes") saved_recipes = list() if("add_recipe") + if(!is_operational()) + return var/name = stripped_input(usr,"Name","What do you want to name this recipe?", "Recipe", MAX_NAME_LEN) var/recipe = stripped_input(usr,"Recipe","Insert recipe with chem IDs") + if(!usr.canUseTopic(src, !issilicon(usr))) + return if(name && recipe) var/list/first_process = splittext(recipe, ";") if(!LAZYLEN(first_process)) From ca7f0796a265f04ff03a280f1758232104efc8ac Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 30 Mar 2018 11:58:57 -0400 Subject: [PATCH 094/114] Merge pull request #36805 from ShizCalev/chemmaster-power-change-cleanup Cleans up duplicate chem_master power_change() proc --- code/modules/reagents/chemistry/machinery/chem_master.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 96b454cc71..ef3088e82a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -73,12 +73,6 @@ if (prob(50)) qdel(src) -/obj/machinery/chem_master/power_change() - if(powered()) - stat &= ~NOPOWER - else - stat |= NOPOWER - /obj/machinery/chem_master/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", I)) return From c97d4e097084f0a112883750c1d09492571d63d6 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 30 Mar 2018 11:58:37 -0400 Subject: [PATCH 096/114] Merge pull request #36796 from neersighted/delete_perms Make the delete verb check for SPAWN|DEBUG --- code/modules/admin/verbs/randomverbs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 5c87293b73..3e1a12bdec 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -553,7 +553,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Admin" set name = "Delete" - if(!check_rights(R_ADMIN)) + if(!check_rights(R_SPAWN|R_DEBUG)) return admin_delete(A) From d29eb299ec1d6b557f649be4eab326ca276b8dc6 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Thu, 29 Mar 2018 11:42:02 -0400 Subject: [PATCH 098/114] Fixes silicons unable to remotely use chemmaster --- .../reagents/chemistry/machinery/chem_master.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 96b454cc71..ddc9e55b8e 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -223,7 +223,7 @@ return vol_each = min(reagents.total_volume / amount, 50) var/name = stripped_input(usr,"Name:","Name your pill!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return var/obj/item/reagent_containers/pill/P @@ -237,7 +237,7 @@ reagents.trans_to(P,vol_each) else var/name = stripped_input(usr, "Name:", "Name your pack!", reagents.get_master_reagent_name(), MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return var/obj/item/reagent_containers/food/condiment/pack/P = new/obj/item/reagent_containers/food/condiment/pack(drop_location()) @@ -259,7 +259,7 @@ return vol_each = min(reagents.total_volume / amount, 40) var/name = stripped_input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return var/obj/item/reagent_containers/pill/P @@ -277,7 +277,7 @@ if(condi) var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return var/obj/item/reagent_containers/food/condiment/P = new(drop_location()) P.originalname = name @@ -290,7 +290,7 @@ amount_full = round(reagents.total_volume / 30) vol_part = reagents.total_volume % 30 var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE)) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return var/obj/item/reagent_containers/glass/bottle/P From 7f444532329d435393c04adef48918fb78941ca8 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 30 Mar 2018 03:27:26 -0500 Subject: [PATCH 100/114] Being buckled to an object means space wind wont pull you (#36783) * Being buckled to an object means space wind wont pull you * Puts check in the proper place --- code/modules/mob/living/living.dm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 63ea389ebb..55019dbefc 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -618,23 +618,25 @@ return pick("trails_1", "trails_2") /mob/living/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) - if (client && client.move_delay >= world.time + world.tick_lag*2) + if(buckled) + return + if(client && client.move_delay >= world.time + world.tick_lag*2) pressure_resistance_prob_delta -= 30 var/list/turfs_to_check = list() - if (has_limbs) + if(has_limbs) var/turf/T = get_step(src, angle2dir(dir2angle(direction)+90)) if (T) turfs_to_check += T T = get_step(src, angle2dir(dir2angle(direction)-90)) - if (T) + if(T) turfs_to_check += T - for (var/t in turfs_to_check) + for(var/t in turfs_to_check) T = t - if (T.density) + if(T.density) pressure_resistance_prob_delta -= 20 continue for (var/atom/movable/AM in T) From c932f3ae522b80f9fea0eb9fee608f085b7d8aa3 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 31 Mar 2018 05:12:36 -0700 Subject: [PATCH 102/114] fixes a drinking glass smash runtime (#36826) * smash runtime * qdeling --- code/modules/food_and_drinks/drinks/drinks.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index d6426cf20d..7a0a8f5f5a 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -110,6 +110,8 @@ /obj/item/reagent_containers/food/drinks/proc/smash(atom/target, mob/thrower, ranged = FALSE) if(!isGlass) return + if(QDELING(src) || !target) //Invalid loc + return if(bartender_check(target) && ranged) return var/obj/item/broken_bottle/B = new (loc) From d47686c88ea63866ebe7889102f86703dd8b9c3c Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 30 Mar 2018 13:05:05 -0400 Subject: [PATCH 104/114] Removes empty New() --- .../machinery/components/trinary_devices/filter.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 5281c3bad7..35dcb81ce2 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -31,9 +31,6 @@ if(frequency) radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) -/obj/machinery/atmospherics/components/trinary/filter/New() - ..() - /obj/machinery/atmospherics/components/trinary/filter/Destroy() SSradio.remove_object(src,frequency) return ..() From 5a6a8c332a8e2d68dfe44c0f33f8b85a3db88444 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 31 Mar 2018 05:13:36 -0700 Subject: [PATCH 106/114] Buildmode GC (#36828) --- code/modules/admin/verbs/buildmode.dm | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 2b6b893b59..d53234db23 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -17,6 +17,11 @@ ..() src.bd = bd +/obj/screen/buildmode/Destroy() + bd.buttons -= src + bd = null + return ..() + /obj/screen/buildmode/mode icon_state = "buildmode1" name = "Toggle Mode" @@ -102,8 +107,12 @@ /datum/buildmode/Destroy() stored = null - for(var/button in buttons) - qdel(button) + QDEL_LIST(buttons) + throw_atom = null + holder = null + preview.Cut() + cornerA = null + cornerB = null return ..() /datum/buildmode/proc/create_buttons() From d36fac0662d6c3474aabc18abff5e400d9ada381 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sat, 31 Mar 2018 21:49:15 -0500 Subject: [PATCH 107/114] another donator item --- icons/mob/custom_w.dmi | Bin 21441 -> 22236 bytes icons/obj/custom.dmi | Bin 16475 -> 16605 bytes .../code/modules/client/loadout/__donator.dm | 6 ++++++ .../modules/custom_loadout/custom_items.dm | 6 ++++++ 4 files changed, 12 insertions(+) diff --git a/icons/mob/custom_w.dmi b/icons/mob/custom_w.dmi index 1b70b86779a1a4ff5bc4c24f866ed5943fc9fcf7..6b17cc3acba750a95bbd9b3876b8f586b44ac2e7 100644 GIT binary patch literal 22236 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 literal 21441 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'}aX$>rS2b0bcPoljwNZaj;mVLdb3(HWI7_O|%% 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 Ysy1S9ae^7pniF(aP3KM-+A{S208pSNg8%>k diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi index 2a63ddd1e149d2a367c0b93f676343c44dfc497c..de5fce96a5660dada61316fc92860f930afb8d63 100644 GIT binary patch literal 16605 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 diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 0db74b8ed2..d8744a660b 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -259,3 +259,9 @@ datum/gear/darksabresheath path = /obj/item/reagent_containers/food/drinks/flask/steel cost = 2 ckeywhitelist = list("johnnyvitrano") + +/datum/gear/paperhat + name = "Paper Hat" + category = slot_head + path = /obj/item/clothing/head/paperhat + ckeywhitelist = list("kered2") diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index 9fde1349b4..c3421976fb 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -333,3 +333,9 @@ item_state = "wintergreencloak" w_class = WEIGHT_CLASS_SMALL body_parts_covered = CHEST|GROIN|LEGS|ARMS + +/obj/item/clothing/head/paperhat + name = "paperhat" + desc = "A piece of paper folded into neat little hat." + icon_state = "paperhat" + item_state = "paperhat" From 7c6845b750693eafa8999fdc4d32f1652abca216 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 1 Apr 2018 01:17:28 -0400 Subject: [PATCH 108/114] Merge pull request #36824 from Robustin/mblood Monkeys can now die of bloodloss --- code/modules/mob/living/blood.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 41715d650d..68c6ed5c83 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -20,6 +20,8 @@ //Blood regeneration if there is some space if(blood_volume < BLOOD_VOLUME_NORMAL) blood_volume += 0.1 // regenerate blood VERY slowly + if(blood_volume < BLOOD_VOLUME_OKAY) + adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1)) // Takes care blood loss and regeneration /mob/living/carbon/human/handle_blood() From d27541d5fbc58f44ea0d6e8f44604e17081e584c Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 1 Apr 2018 01:18:48 -0400 Subject: [PATCH 110/114] Merge pull request #36840 from 81Denton/singulo-power Fixes singularity power output --- code/modules/power/singularity/singularity.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 3c7d00b3fd..ad83fb31a2 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -114,7 +114,7 @@ /obj/singularity/process() if(current_size >= STAGE_TWO) move() - radiation_pulse(src, min(5000, (energy*3)+1000), RAD_DISTANCE_COEFFICIENT*0.5) + radiation_pulse(src, min(5000, (energy*4.5)+1000), RAD_DISTANCE_COEFFICIENT*0.5) if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit event() eat() From 75a49c53c819d3d5cb47ae2f4a87482825911499 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 1 Apr 2018 04:06:10 -0500 Subject: [PATCH 112/114] Fixes dogborg sitting (#6112) --- .../modules/mob/living/silicon/robot/robot.dm | 2 ++ .../modules/mob/living/silicon/robot/robot.dm | 19 ++++++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 2a3af029dd..6fce5a15f3 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -159,6 +159,8 @@ toner = tonermax diag_hud_set_borgcell() + verbs += /mob/living/proc/lay_down //CITADEL EDIT gimmie rest verb kthx + //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO /mob/living/silicon/robot/Destroy() if(mmi && mind)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm index 34970bc283..da77421a2f 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm @@ -1,10 +1,19 @@ +mob/living/silicon + no_vore = TRUE + /mob/living/silicon/robot var/dogborg = FALSE /mob/living/silicon/robot/lay_down() - if(resting) - cut_overlays() - icon_state = "[module.cyborg_base_icon]-rest" - else - icon_state = "[module.cyborg_base_icon]" + ..() + update_canmove() + +/mob/living/silicon/robot/update_canmove() + ..() + if(client && stat != DEAD && dogborg == TRUE) + if(resting) + cut_overlays() + icon_state = "[module.cyborg_base_icon]-rest" + else + icon_state = "[module.cyborg_base_icon]" update_icons() \ No newline at end of file From 610a001ad513e5008185989907f3df5dc6a20cc9 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 1 Apr 2018 04:37:57 -0500 Subject: [PATCH 113/114] Update computer_ui.dm --- code/modules/modular_computers/computers/item/computer_ui.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index c8ca119e89..5759a24dc2 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -1,10 +1,7 @@ -<<<<<<< HEAD -======= /obj/item/device/modular_computer/attack_self(mob/user) . = ..() ui_interact(user) - ->>>>>>> ba5a78b... Merge pull request #36743 from ShizCalev/modular-comp-ui_interact-runtime + // Operates TGUI /obj/item/device/modular_computer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) if(!enabled) From 88f328651f20f932bb90892e2fe552bcf54485e7 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 1 Apr 2018 04:39:21 -0500 Subject: [PATCH 114/114] Update food_reagents.dm --- code/modules/reagents/chemistry/reagents/food_reagents.dm | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 8b035de0b5..45838de5e7 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -615,9 +615,6 @@ to_chat(M, "Your eyes sting!") M.blind_eyes(2) - -<<<<<<< HEAD -======= /datum/reagent/consumable/nutriment/stabilized name = "Stabilized Nutriment" id = "stabilizednutriment" @@ -630,8 +627,7 @@ if(M.nutrition > NUTRITION_LEVEL_FULL - 25) M.nutrition -= 3*nutriment_factor ..() - ->>>>>>> 8637339... Nutriment can get you fat again. + ////Lavaland Flora Reagents//// @@ -689,4 +685,4 @@ description = "The sorrow and melancholy of a thousand bereaved clowns, forever denied their Honkmechs." nutriment_factor = 5 * REAGENTS_METABOLISM color = "#eef442" // rgb: 238, 244, 66 - taste_description = "mournful honking" \ No newline at end of file + taste_description = "mournful honking"