From 9c365487578f37db40f037b600a45d58e5d40935 Mon Sep 17 00:00:00 2001 From: MalorMorfin <95427566+MalorMorfin@users.noreply.github.com> Date: Thu, 12 Dec 2024 05:43:18 +1000 Subject: [PATCH 01/32] Storage close fix (#782) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * QOL рюкзаки не закрываются если суваемый предмет слишком большой * better --- code/game/objects/items/storage/storage.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index ae2a01f306a..b09d08d9829 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -557,7 +557,8 @@ return do_refill(I, user) if(!can_be_inserted(I)) - open(user) + if(!user.s_active) // Don't close open storage menu if can't insert something, if storage dosen't open it will be open + open(user) return FALSE return handle_item_insertion(I, FALSE, user) From 0585d54c62c9823866270e7f6c186e08455cfe86 Mon Sep 17 00:00:00 2001 From: spaghetti <48985748+definitelynotspaghetti@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:44:29 +0300 Subject: [PATCH 02/32] Hugger statistics (#790) * hugger statistics * s Signed-off-by: spaghetti <48985748+definitelynotspaghetti@users.noreply.github.com> * Update strippable.dm --------- Signed-off-by: spaghetti <48985748+definitelynotspaghetti@users.noreply.github.com> --- code/datums/elements/strippable.dm | 3 +++ code/datums/gamemodes/_game_mode.dm | 4 ++++ code/datums/round_statistics.dm | 2 ++ code/modules/mob/living/carbon/human/inventory.dm | 2 ++ code/modules/surgery/organs_internal.dm | 1 + 5 files changed, 12 insertions(+) diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index 37f2943a0f4..1984663ad0a 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -285,6 +285,9 @@ if(!source.dropItemToGround(item)) return FALSE + if(istype(item, /obj/item/clothing/mask/facehugger)) + GLOB.round_statistics.failed_impregnations++ + source.log_message("[key_name(source)] has been stripped of [item] by [key_name(user)]", LOG_ATTACK, color="red") user.log_message("[key_name(source)] has been stripped of [item] by [key_name(user)]", LOG_ATTACK, color="red", log_globally=FALSE) diff --git a/code/datums/gamemodes/_game_mode.dm b/code/datums/gamemodes/_game_mode.dm index 0de7a051b96..6b07ef7da91 100644 --- a/code/datums/gamemodes/_game_mode.dm +++ b/code/datums/gamemodes/_game_mode.dm @@ -406,6 +406,10 @@ GLOBAL_LIST_INIT(bioscan_locations, list( parts += "[SSevacuation.human_escaped] marines manage to evacuate, among [SSevacuation.initial_human_on_ship] that were on ship when xenomorphs arrived." if(GLOB.round_statistics.now_pregnant) parts += "[GLOB.round_statistics.now_pregnant] people infected among which [GLOB.round_statistics.total_larva_burst] burst. For a [(GLOB.round_statistics.total_larva_burst / max(GLOB.round_statistics.now_pregnant, 1)) * 100]% successful delivery rate!" + if(GLOB.round_statistics.failed_impregnations) + parts += "[GLOB.round_statistics.failed_impregnations] failed impregnations." + if(GLOB.round_statistics.larva_surgically_removed) + parts += "[GLOB.round_statistics.larva_surgically_removed] larvas surgically removed before burst." if(length(GLOB.round_statistics.workout_counts)) for(var/faction in GLOB.round_statistics.workout_counts) parts += "The [faction] faction did [GLOB.round_statistics.workout_counts[faction]] workout sets." diff --git a/code/datums/round_statistics.dm b/code/datums/round_statistics.dm index 415d30f50a0..29de3a19d47 100644 --- a/code/datums/round_statistics.dm +++ b/code/datums/round_statistics.dm @@ -64,6 +64,8 @@ GLOBAL_DATUM_INIT(round_statistics, /datum/round_statistics, new) var/rocket_shells_fired = 0 var/queen_screech = 0 var/now_pregnant = 0 + var/failed_impregnations = 0 + var/larva_surgically_removed = 0 var/sentinel_drain_stings = 0 var/sentinel_neurotoxin_stings = 0 var/ozelomelyn_stings = 0 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index cef924ff4b3..cc6852b1135 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -547,6 +547,8 @@ if(!Adjacent(M)|| !I || I != M.get_item_by_slot(slot_to_process)) return M.dropItemToGround(I) + if(istype(I, /obj/item/clothing/mask/facehugger)) + GLOB.round_statistics.failed_impregnations++ log_combat(src, M, "removed [key_name(I)] ([slot_to_process])") if(isidcard(I)) message_admins("[ADMIN_TPMONTY(src)] took the [I] of [ADMIN_TPMONTY(M)].") diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 8063e541617..c8d8c89c40e 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -56,6 +56,7 @@ else A.forceMove(target.loc) target.status_flags &= ~XENO_HOST + GLOB.round_statistics.larva_surgically_removed++ affected.createwound(CUT, rand(0,20), 1) target.updatehealth() From b5cd6f0d768104f8cc9d95328eba3a8897cb96c2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 19:50:15 +0000 Subject: [PATCH 03/32] Automatic changelog for PR #782 [ci skip] --- html/changelogs/AutoChangeLog-pr-782.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-782.yml diff --git a/html/changelogs/AutoChangeLog-pr-782.yml b/html/changelogs/AutoChangeLog-pr-782.yml new file mode 100644 index 00000000000..0356e0ad257 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-782.yml @@ -0,0 +1,4 @@ +author: "MalorMorfin" +delete-after: True +changes: + - bugfix: "Теперь если положить слишком большей предмет в хранилище оно не закроется." \ No newline at end of file From 824cefb901c66123e8b352c4380b2ff954638fed Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 19:50:24 +0000 Subject: [PATCH 04/32] Automatic changelog for PR #790 [ci skip] --- html/changelogs/AutoChangeLog-pr-790.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-790.yml diff --git a/html/changelogs/AutoChangeLog-pr-790.yml b/html/changelogs/AutoChangeLog-pr-790.yml new file mode 100644 index 00000000000..4ea9399b4a4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-790.yml @@ -0,0 +1,4 @@ +author: "definitelynotspaghetti" +delete-after: True +changes: + - rscadd: "Добавлена статистика количества проваленных заражений и количества хирургических удалений лярв до бёрста." \ No newline at end of file From cf206eee4b75312ed99cb3def8d07eb99371bce7 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 12 Dec 2024 00:37:30 +0000 Subject: [PATCH 05/32] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-782.yml | 4 ---- html/changelogs/AutoChangeLog-pr-790.yml | 4 ---- html/changelogs/archive/2024-12.yml | 16 ++++++++++++++++ 3 files changed, 16 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-782.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-790.yml diff --git a/html/changelogs/AutoChangeLog-pr-782.yml b/html/changelogs/AutoChangeLog-pr-782.yml deleted file mode 100644 index 0356e0ad257..00000000000 --- a/html/changelogs/AutoChangeLog-pr-782.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MalorMorfin" -delete-after: True -changes: - - bugfix: "Теперь если положить слишком большей предмет в хранилище оно не закроется." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-790.yml b/html/changelogs/AutoChangeLog-pr-790.yml deleted file mode 100644 index 4ea9399b4a4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-790.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "definitelynotspaghetti" -delete-after: True -changes: - - rscadd: "Добавлена статистика количества проваленных заражений и количества хирургических удалений лярв до бёрста." \ No newline at end of file diff --git a/html/changelogs/archive/2024-12.yml b/html/changelogs/archive/2024-12.yml index 9045cf69bf8..9e8ac0180d0 100644 --- a/html/changelogs/archive/2024-12.yml +++ b/html/changelogs/archive/2024-12.yml @@ -342,3 +342,19 @@ - rscdel: "\u0434\u0435\u0444\u0430\u0439\u043D\u044B \u0432\u0440\u0435\u0439\u0437\ \u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u044B \u0438\u0437 \u043A\u043E\u043B\ \u0430" +2024-12-12: + MalorMorfin: + - bugfix: "\u0422\u0435\u043F\u0435\u0440\u044C \u0435\u0441\u043B\u0438 \u043F\u043E\ + \u043B\u043E\u0436\u0438\u0442\u044C \u0441\u043B\u0438\u0448\u043A\u043E\u043C\ + \ \u0431\u043E\u043B\u044C\u0448\u0435\u0439 \u043F\u0440\u0435\u0434\u043C\u0435\ + \u0442 \u0432 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043E\u043D\ + \u043E \u043D\u0435 \u0437\u0430\u043A\u0440\u043E\u0435\u0442\u0441\u044F." + definitelynotspaghetti: + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u0441\u0442\u0430\ + \u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u043A\u043E\u043B\u0438\u0447\u0435\ + \u0441\u0442\u0432\u0430 \u043F\u0440\u043E\u0432\u0430\u043B\u0435\u043D\u043D\ + \u044B\u0445 \u0437\u0430\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u0438 \u043A\ + \u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0445\u0438\u0440\u0443\ + \u0440\u0433\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0443\u0434\u0430\u043B\ + \u0435\u043D\u0438\u0439 \u043B\u044F\u0440\u0432 \u0434\u043E \u0431\u0451\u0440\ + \u0441\u0442\u0430." From 022081699e19d9701c547db63b429f83cedf3d5e Mon Sep 17 00:00:00 2001 From: MalorMorfin <95427566+MalorMorfin@users.noreply.github.com> Date: Thu, 12 Dec 2024 20:14:47 +1000 Subject: [PATCH 06/32] Port parallax (#769) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Port parallax Портировал основное для работы чуть фикшеного параллакса * Удалил лишние проки паралакса * clean var почистил лишние... * /2 is *0.5 now * review fix * Planet don't move in shuttle --- code/__DEFINES/preferences.dm | 4 - code/_onclick/hud/parallax.dm | 233 +++++++++++---------- code/modules/client/client_defines.dm | 11 +- code/modules/client/client_procs.dm | 3 + code/modules/mob/dead/observer/observer.dm | 3 - code/modules/shuttle/on_move.dm | 2 - 6 files changed, 133 insertions(+), 123 deletions(-) diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index b9943fbb4ff..76746e3d27a 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -92,10 +92,6 @@ #define PARALLAX_LOW 2 #define PARALLAX_DISABLE 3 //this option must be the highest number -#define PARALLAX_DELAY_DEFAULT world.tick_lag -#define PARALLAX_DELAY_MED 1 -#define PARALLAX_DELAY_LOW 2 - #define PIXEL_SCALING_AUTO 0 #define PIXEL_SCALING_1X 1 #define PIXEL_SCALING_1_2X 1.5 diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 5a1eaf9f4da..581e8df8b26 100644 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -4,6 +4,9 @@ var/client/C = screenmob.client if (!apply_parallax_pref(viewmob)) //don't want shit computers to crash when specing someone with insane parallax, so use the viewer's pref return + if(isnull(C.parallax_rock)) + C.parallax_rock = new(null, src) + C.screen |= C.parallax_rock if(!length(C.parallax_layers_cached)) C.parallax_layers_cached = list() @@ -19,7 +22,7 @@ if (length(C.parallax_layers) > C.parallax_layers_max) C.parallax_layers.len = C.parallax_layers_max - C.screen |= (C.parallax_layers) + C.parallax_rock.vis_contents = C.parallax_layers var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] if(screenmob != mymob) C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen @@ -32,11 +35,10 @@ 0, 0, 0, 0 ) - /datum/hud/proc/remove_parallax(mob/viewmob) var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client - C.screen -= (C.parallax_layers_cached) + C.screen -= (C.parallax_rock) var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] if(screenmob != mymob) C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen @@ -48,33 +50,32 @@ var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client if(C.prefs) - var/pref = C.prefs.parallax - if (isnull(pref)) - pref = PARALLAX_HIGH - switch(C.prefs.parallax) + var/parallax_selection = C?.prefs.parallax || PARALLAX_HIGH + + switch(parallax_selection) if (PARALLAX_INSANE) - C.parallax_throttle = FALSE + C.do_parallax_animations = TRUE C.parallax_layers_max = 5 return TRUE + if(PARALLAX_HIGH) + C.do_parallax_animations = TRUE + C.parallax_layers_max = 4 + return TRUE + if (PARALLAX_MED) - C.parallax_throttle = PARALLAX_DELAY_MED + C.do_parallax_animations = TRUE C.parallax_layers_max = 3 return TRUE if (PARALLAX_LOW) - C.parallax_throttle = PARALLAX_DELAY_LOW + C.do_parallax_animations = FALSE C.parallax_layers_max = 1 return TRUE if (PARALLAX_DISABLE) return FALSE - //This is high parallax. - C.parallax_throttle = PARALLAX_DELAY_DEFAULT - C.parallax_layers_max = 4 - return TRUE - /datum/hud/proc/update_parallax_pref(mob/viewmob) if(is_ground_level(viewmob.z)) return @@ -83,83 +84,68 @@ update_parallax(viewmob) // This sets which way the current shuttle is moving (returns true if the shuttle has stopped moving so the caller can append their animation) -/datum/hud/proc/set_parallax_movedir(new_parallax_movedir, skip_windups, mob/viewmob) +/datum/hud/proc/set_parallax_movedir(new_parallax_movedir = NONE, skip_windups, mob/viewmob) . = FALSE var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client if(new_parallax_movedir == C.parallax_movedir) return - var/animatedir = new_parallax_movedir - if(new_parallax_movedir == FALSE) - var/animate_time = 0 - for(var/thing in C.parallax_layers) - var/atom/movable/screen/parallax_layer/L = thing - L.icon_state = initial(L.icon_state) - L.update_o(C.view) - var/T = PARALLAX_LOOP_TIME / L.speed - if (T > animate_time) - animate_time = T - C.dont_animate_parallax = world.time + min(animate_time, PARALLAX_LOOP_TIME) - animatedir = C.parallax_movedir - - var/matrix/newtransform - switch(animatedir) + + var/animation_dir = new_parallax_movedir || C.parallax_movedir + var/matrix/new_transform + switch(animation_dir) if(NORTH) - newtransform = matrix(1, 0, 0, 0, 1, 480) + new_transform = matrix(1, 0, 0, 0, 1, 480) if(SOUTH) - newtransform = matrix(1, 0, 0, 0, 1,-480) + new_transform = matrix(1, 0, 0, 0, 1,-480) if(EAST) - newtransform = matrix(1, 0, 480, 0, 1, 0) + new_transform = matrix(1, 0, 480, 0, 1, 0) if(WEST) - newtransform = matrix(1, 0,-480, 0, 1, 0) - - var/shortesttimer - if(!skip_windups) - for(var/thing in C.parallax_layers) - var/atom/movable/screen/parallax_layer/L = thing - - var/T = PARALLAX_LOOP_TIME / L.speed - if (isnull(shortesttimer)) - shortesttimer = T - if (T < shortesttimer) - shortesttimer = T - L.transform = newtransform - animate(L, transform = matrix(), time = T, easing = QUAD_EASING | (new_parallax_movedir ? EASE_IN : EASE_OUT), flags = ANIMATION_END_NOW) - if (new_parallax_movedir) - L.transform = newtransform - animate(transform = matrix(), time = T) //queue up another animate so lag doesn't create a shutter + new_transform = matrix(1, 0,-480, 0, 1, 0) + + var/longest_timer = 0 + for(var/key in C.parallax_animate_timers) + deltimer(C.parallax_animate_timers[key]) + C.parallax_animate_timers = list() + for(var/atom/movable/screen/parallax_layer/layer as anything in C.parallax_layers) + var/scaled_time = PARALLAX_LOOP_TIME / layer.speed + if(new_parallax_movedir == NONE) // If we're stopping, we need to stop on the same dime, yeah? + scaled_time = PARALLAX_LOOP_TIME + longest_timer = max(longest_timer, scaled_time) + + if(layer.absolute) + break + + if(skip_windups) + update_parallax_motionblur(C, layer, new_parallax_movedir, new_transform) + continue - C.parallax_movedir = new_parallax_movedir - if (C.parallax_animate_timer) - deltimer(C.parallax_animate_timer) - var/datum/callback/CB = CALLBACK(src, PROC_REF(update_parallax_motionblur), C, animatedir, new_parallax_movedir, newtransform) - if(skip_windups || !shortesttimer) //shorttest timer can be null/0 if we don't have any parallax layers (ie the pref is off) - CB.Invoke() - else - C.parallax_animate_timer = addtimer(CB, min(shortesttimer, PARALLAX_LOOP_TIME), TIMER_CLIENT_TIME|TIMER_STOPPABLE) + layer.transform = new_transform + animate(layer, transform = matrix(), time = scaled_time, easing = QUAD_EASING | (new_parallax_movedir ? EASE_IN : EASE_OUT)) + if (new_parallax_movedir == NONE) + continue + //queue up another animate so lag doesn't create a shutter + animate(transform = new_transform, time = 0) + animate(transform = matrix(), time = scaled_time * 0.5) + C.parallax_animate_timers[layer] = addtimer(CALLBACK(src, PROC_REF(update_parallax_motionblur), C, layer, new_parallax_movedir, new_transform), scaled_time, TIMER_CLIENT_TIME|TIMER_STOPPABLE) + C.dont_animate_parallax = world.time + min(longest_timer, PARALLAX_LOOP_TIME) + C.parallax_movedir = new_parallax_movedir -/datum/hud/proc/update_parallax_motionblur(client/C, animatedir, new_parallax_movedir, matrix/newtransform) +/datum/hud/proc/update_parallax_motionblur(client/C, atom/movable/screen/parallax_layer/layer, new_parallax_movedir, matrix/new_transform) if(!C) return - C.parallax_animate_timer = FALSE - for(var/thing in C.parallax_layers) - var/atom/movable/screen/parallax_layer/L = thing - if (!new_parallax_movedir) - animate(L) - continue - - var/newstate = initial(L.icon_state) - var/T = PARALLAX_LOOP_TIME / L.speed - - if (newstate in icon_states(L.icon)) - L.icon_state = newstate - L.update_o(C.view) - - L.transform = newtransform - - animate(L, transform = matrix(), time = T, loop = -1, flags = ANIMATION_END_NOW) - animate(transform = matrix(), time = T) + C.parallax_animate_timers -= layer + + // If we are moving in a direction, we used the QUAD_EASING function with EASE_IN + // This means our position function is x^2. This is always LESS then the linear we're using here + // But if we just used the same time delay, our rate of change would mismatch. f'(1) = 2x for quad easing, rather then the 1 we get for linear + // (This is because of how derivatives work right?) + // Because of this, while our actual rate of change from before was PARALLAX_LOOP_TIME, our perceived rate of change was PARALLAX_LOOP_TIME / 2 (lower == faster). + // Let's account for that here + var/scaled_time = (PARALLAX_LOOP_TIME / layer.speed) * 0.5 + animate(layer, transform = new_transform, time = 0, loop = -1, flags = ANIMATION_END_NOW) + animate(transform = matrix(), time = scaled_time) /datum/hud/proc/update_parallax(mob/viewmob) var/mob/screenmob = viewmob || mymob @@ -167,19 +153,16 @@ var/turf/posobj = get_turf(C.eye) if(!posobj) return - var/area/areaobj = posobj.loc + var/area/areaobj = posobj.loc // Update the movement direction of the parallax if necessary (for shuttles) set_parallax_movedir(areaobj.parallax_movedir, FALSE, screenmob) - var/force + var/force = FALSE if(!C.previous_turf || (C.previous_turf.z != posobj.z)) C.previous_turf = posobj force = TRUE - if (!force && world.time < C.last_parallax_shift+C.parallax_throttle) - return - //Doing it this way prevents parallax layers from "jumping" when you change Z-Levels. var/offset_x = posobj.x - C.previous_turf.x var/offset_y = posobj.y - C.previous_turf.y @@ -187,33 +170,53 @@ if(!offset_x && !offset_y && !force) return - var/last_delay = world.time - C.last_parallax_shift - last_delay = min(last_delay, C.parallax_throttle) + var/glide_rate = round(world.icon_size / screenmob.glide_size * world.tick_lag, world.tick_lag) C.previous_turf = posobj - C.last_parallax_shift = world.time - for(var/atom/movable/screen/parallax_layer/parallax_layer as anything in C.parallax_layers) - parallax_layer.update_status(screenmob) - if (parallax_layer.view_sized != C.view) - parallax_layer.update_o(C.view) + var/largest_change = max(abs(offset_x), abs(offset_y)) + var/max_allowed_dist = (glide_rate / world.tick_lag) + 1 + // If we aren't already moving/don't allow parallax, have made some movement, and that movement was smaller then our "glide" size, animate + var/run_parralax = (C.do_parallax_animations && glide_rate && !areaobj.parallax_movedir && C.dont_animate_parallax <= world.time && largest_change <= max_allowed_dist) + for(var/atom/movable/screen/parallax_layer/parallax_layer as anything in C.parallax_layers) + var/our_speed = parallax_layer.speed + var/change_x + var/change_y + var/old_x = parallax_layer.offset_x + var/old_y = parallax_layer.offset_y if(parallax_layer.absolute) - parallax_layer.offset_x = -(posobj.x - SSparallax.planet_x_offset) * parallax_layer.speed - parallax_layer.offset_y = -(posobj.y - SSparallax.planet_y_offset) * parallax_layer.speed + // We use change here so the typically large absolute objects (just lavaland for now) don't jitter so much + change_x = (posobj.x - SSparallax.planet_x_offset) * our_speed + old_x + change_y = (posobj.y - SSparallax.planet_y_offset) * our_speed + old_y else - parallax_layer.offset_x -= offset_x * parallax_layer.speed - parallax_layer.offset_y -= offset_y * parallax_layer.speed + change_x = offset_x * our_speed + change_y = offset_y * our_speed - if(parallax_layer.offset_x > 240) + // This is how we tile parralax sprites + // It doesn't use change because we really don't want to animate this + if(old_x - change_x > 240) parallax_layer.offset_x -= 480 - if(parallax_layer.offset_x < -240) + parallax_layer.pixel_w = parallax_layer.offset_x + else if(old_x - change_x < -240) parallax_layer.offset_x += 480 - if(parallax_layer.offset_y > 240) + parallax_layer.pixel_w = parallax_layer.offset_x + if(old_y - change_y > 240) parallax_layer.offset_y -= 480 - if(parallax_layer.offset_y < -240) + parallax_layer.pixel_z = parallax_layer.offset_y + else if(old_y - change_y < -240) parallax_layer.offset_y += 480 - - parallax_layer.screen_loc = "CENTER-7:[round(parallax_layer.offset_x,1)],CENTER-7:[round(parallax_layer.offset_y,1)]" + parallax_layer.pixel_z = parallax_layer.offset_y + + parallax_layer.offset_x -= change_x + parallax_layer.offset_y -= change_y + // Now that we have our offsets, let's do our positioning + // We're going to use an animate to "glide" that last movement out, so it looks nicer + // Don't do any animates if we're not actually moving enough distance yeah? thanks lad + if(run_parralax && (largest_change * our_speed > 1)) + animate(parallax_layer, pixel_w = round(parallax_layer.offset_x, 1), pixel_z = round(parallax_layer.offset_y, 1), time = glide_rate) + else + parallax_layer.pixel_w = round(parallax_layer.offset_x, 1) + parallax_layer.pixel_z = round(parallax_layer.offset_y, 1) /atom/movable/proc/update_parallax_contents() for(var/mob/client_mob as anything in client_mobs_in_contents) @@ -225,18 +228,26 @@ var/area/areaobj = get_area(client.eye) hud_used.set_parallax_movedir(areaobj.parallax_movedir, TRUE) +// Root object for parallax, all parallax layers are drawn onto this +INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_home) +/atom/movable/screen/parallax_home + icon = null + blend_mode = BLEND_ADD + plane = PLANE_SPACE_PARALLAX + screen_loc = "CENTER-7,CENTER-7" + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + /atom/movable/screen/parallax_layer icon = 'icons/effects/parallax.dmi' + appearance_flags = APPEARANCE_UI | KEEP_TOGETHER + blend_mode = BLEND_ADD + plane = PLANE_SPACE_PARALLAX + mouse_opacity = MOUSE_OPACITY_TRANSPARENT var/speed = 1 var/offset_x = 0 var/offset_y = 0 var/view_sized var/absolute = FALSE - blend_mode = BLEND_ADD - plane = PLANE_SPACE_PARALLAX - screen_loc = "CENTER-7,CENTER-7" - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - /atom/movable/screen/parallax_layer/Initialize(mapload, datum/hud/hud_owner, view) . = ..() @@ -248,20 +259,24 @@ if (!view) view = world.view + var/static/parallax_scaler = world.icon_size / 480 + + // Turn the view size into a grid of correctly scaled overlays var/list/viewscales = getviewsize(view) - var/countx = CEILING((viewscales[1] * 0.5) / (480 / world.icon_size), 1) + 1 - var/county = CEILING((viewscales[2] * 0.5) / (480 / world.icon_size), 1) + 1 + // This could be half the size but we need to provide space for parallax movement on mob movement, and movement on scroll from shuttles, so like this instead + var/countx = (CEILING((viewscales[1] * 0.5) * parallax_scaler, 1) + 1) + var/county = (CEILING((viewscales[2] * 0.5) * parallax_scaler, 1) + 1) var/list/new_overlays = new for(var/x in -countx to countx) for(var/y in -county to county) if(x == 0 && y == 0) continue var/mutable_appearance/texture_overlay = mutable_appearance(icon, icon_state) - texture_overlay.transform = matrix(1, 0, x*480, 0, 1, y*480) + texture_overlay.pixel_w += 480 * x + texture_overlay.pixel_z += 480 * y new_overlays += texture_overlay cut_overlays() add_overlay(new_overlays) - view_sized = view /atom/movable/screen/parallax_layer/proc/update_status(mob/M) return diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 75f5c56a2b3..acd8d5957b1 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -100,17 +100,18 @@ var/list/parallax_layers var/list/parallax_layers_cached + var/atom/movable/screen/parallax_home/parallax_rock var/atom/movable/movingmob var/turf/previous_turf ///world.time of when we can state animate()ing parallax again var/dont_animate_parallax - ///world.time of last parallax update - var/last_parallax_shift - ///ds between parallax updates - var/parallax_throttle = 0 var/parallax_movedir = 0 var/parallax_layers_max = 4 - var/parallax_animate_timer + /// Timers for the area directional animation, one for each layer + var/list/parallax_animate_timers + /// Do we want to do parallax animations at all? + /// Exists to prevent laptop fires + var/do_parallax_animations = TRUE var/datum/db_query/clan_info diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 9e7275b0a53..62ed09df94f 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -421,6 +421,9 @@ QDEL_LIST_ASSOC_VAL(char_render_holders) SSping.currentrun -= src QDEL_NULL(tooltips) + QDEL_NULL(parallax_rock) + QDEL_LIST(parallax_layers_cached) + parallax_layers = null Master.UpdateTickRate() SSambience.ambience_listening_clients -= src ..() //Even though we're going to be hard deleted there are still some things like signals that want to know the destroy is happening diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ec4b8235c5f..4c498312334 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -306,7 +306,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) set_glide_size(glide_size_override) if(newloc) abstract_move(newloc) - update_parallax_contents() else abstract_move(get_turf(src)) //Get out of closets and such as a ghost if((direct & NORTH) && y < world.maxy) @@ -432,8 +431,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) return abstract_move(pick(get_area_turfs(A))) - update_parallax_contents() - /mob/dead/observer/verb/follow_ghost() set category = "Ghost" diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index e2e48ad8d80..315189f1cc9 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -117,8 +117,6 @@ All ShuttleMove procs go here if(rotation) shuttleRotate(rotation) - update_parallax_contents() - return TRUE /atom/movable/proc/lateShuttleMove(turf/oldT, list/movement_force, move_dir) From 0dc968646817e1a453a0912dbc70c0219e1229fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 10:15:04 +0000 Subject: [PATCH 07/32] Automatic changelog for PR #769 [ci skip] --- html/changelogs/AutoChangeLog-pr-769.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-769.yml diff --git a/html/changelogs/AutoChangeLog-pr-769.yml b/html/changelogs/AutoChangeLog-pr-769.yml new file mode 100644 index 00000000000..f39ff47f7b9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-769.yml @@ -0,0 +1,4 @@ +author: "MalorMorfin" +delete-after: True +changes: + - bugfix: "Параллакс меньше нагружает систему" \ No newline at end of file From 6ee4bf1d152d9072f416827577023934786e9f4c Mon Sep 17 00:00:00 2001 From: homexp13 <52973135+homexp13@users.noreply.github.com> Date: Thu, 12 Dec 2024 13:17:45 +0300 Subject: [PATCH 08/32] shiza_yidi (#767) --- code/modules/projectiles/attachables/rail.dm | 12 +----------- code/modules/projectiles/attachables/scope.dm | 2 -- code/modules/projectiles/guns/rifles.dm | 1 - 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/code/modules/projectiles/attachables/rail.dm b/code/modules/projectiles/attachables/rail.dm index 98507e5e8f8..85bf00d5f60 100644 --- a/code/modules/projectiles/attachables/rail.dm +++ b/code/modules/projectiles/attachables/rail.dm @@ -13,17 +13,7 @@ desc = "A B7 smart scope. Does not have a zoom feature, but allows you to take aim and fire through allies. \nNo drawbacks." icon_state = "b7" slot = ATTACHMENT_SLOT_RAIL - damage_mod = -0.15 - -/obj/item/attachable/b7_scope/on_attach(attaching_item, mob/user) - . = ..() - var/obj/item/weapon/gun/attaching_gun = attaching_item - ENABLE_BITFIELD(attaching_gun.flags_gun_features, GUN_IFF) - -/obj/item/attachable/b7_scope/on_detach(detaching_item, mob/user) - . = ..() - var/obj/item/weapon/gun/detaching_gun = detaching_item - DISABLE_BITFIELD(detaching_gun.flags_gun_features, GUN_IFF) + add_aim_mode = TRUE /obj/item/attachable/m16sight name = "M16 iron sights" diff --git a/code/modules/projectiles/attachables/scope.dm b/code/modules/projectiles/attachables/scope.dm index b0f46efe416..017edd8809c 100644 --- a/code/modules/projectiles/attachables/scope.dm +++ b/code/modules/projectiles/attachables/scope.dm @@ -28,7 +28,6 @@ name = "T-47 rail scope" desc = "A marine standard mounted zoom sight scope. Allows zoom by activating the attachment." icon_state = "marinescope" - add_aim_mode = TRUE /obj/item/attachable/scope/nightvision name = "T-46 Night vision scope" @@ -208,7 +207,6 @@ scope_zoom_mod = TRUE has_nightvision = FALSE zoom_allow_movement = TRUE - add_aim_mode = TRUE zoom_slowdown = 0.3 zoom_tile_offset = 5 zoom_viewsize = 0 diff --git a/code/modules/projectiles/guns/rifles.dm b/code/modules/projectiles/guns/rifles.dm index 4d5cbd8ce0c..38fc4077c68 100644 --- a/code/modules/projectiles/guns/rifles.dm +++ b/code/modules/projectiles/guns/rifles.dm @@ -1029,7 +1029,6 @@ starting_attachment_types = list(/obj/item/attachable/stock/t60stock) gun_skill_category = SKILL_HEAVY_WEAPONS attachable_offset = list("muzzle_x" = 42, "muzzle_y" = 21,"rail_x" = 6, "rail_y" = 23, "under_x" = 26, "under_y" = 15, "stock_x" = 8, "stock_y" = 13) - actions_types = list(/datum/action/item_action/aim_mode) aim_fire_delay = 0.15 SECONDS aim_speed_modifier = 5.3 From 3982cb6dd55fe63e897c11db17126fb96ef6ee39 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 10:23:23 +0000 Subject: [PATCH 09/32] Automatic changelog for PR #767 [ci skip] --- html/changelogs/AutoChangeLog-pr-767.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-767.yml diff --git a/html/changelogs/AutoChangeLog-pr-767.yml b/html/changelogs/AutoChangeLog-pr-767.yml new file mode 100644 index 00000000000..18aad383155 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-767.yml @@ -0,0 +1,6 @@ +author: "homexp13" +delete-after: True +changes: + - rscdel: "б7 не даёт ифф, а даёт аим мод" + - rscdel: "скоупы не дают аим мод" + - rscdel: "у мг 60 удалён аим мода" \ No newline at end of file From 13622dec6543fa1b0b99f0d1e3959451e3985eb3 Mon Sep 17 00:00:00 2001 From: MalorMorfin <95427566+MalorMorfin@users.noreply.github.com> Date: Fri, 13 Dec 2024 03:33:14 +1000 Subject: [PATCH 10/32] Change FK88 ammo cost in factory and add granade launcher ammo (#786) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * cost change and grande launcher can crafted * review fix 1 * выпел говна --- code/modules/reqs/supplypacks/vehicles.dm | 6 ++++++ code/modules/reqtorio/assembly_crafts.dm | 23 ++++++++++++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/code/modules/reqs/supplypacks/vehicles.dm b/code/modules/reqs/supplypacks/vehicles.dm index fdd194a6908..9fa5f8776af 100644 --- a/code/modules/reqs/supplypacks/vehicles.dm +++ b/code/modules/reqs/supplypacks/vehicles.dm @@ -31,6 +31,12 @@ cost = 10 containertype = /obj/structure/closet/crate/ammo +/datum/supply_packs/vehicles/tank_glauncher + name = "Tank grenade laucnher magazine" + contains = list(/obj/item/ammo_magazine/tank/tank_glauncher) + cost = 10 + containertype = /obj/structure/closet/crate/ammo + /datum/supply_packs/vehicles/motorbike name = "All-Terrain Motorbike" cost = 400 diff --git a/code/modules/reqtorio/assembly_crafts.dm b/code/modules/reqtorio/assembly_crafts.dm index 3ce29de44dc..dcc19278db3 100644 --- a/code/modules/reqtorio/assembly_crafts.dm +++ b/code/modules/reqtorio/assembly_crafts.dm @@ -308,25 +308,30 @@ WEAPONS /datum/assembly_craft/weapons/ltb_shells name = "LTB tank shell" - input = list(/obj/item/stack/sheet/jeweler_steel = 1, /obj/item/stack/gun_powder = 5) + input = list(/obj/item/stack/sheet/jeweler_steel = 1, /obj/item/stack/gun_powder = 2) output = list(/obj/item/ammo_magazine/tank/ltb_cannon = 1) /datum/assembly_craft/weapons/ltb_cannon_apfds name = "LTB tank APFDS shell" - input = list(/obj/item/stack/sheet/jeweler_steel = 2, /obj/item/stack/gun_powder = 3) + input = list(/obj/item/stack/sheet/jeweler_steel = 1, /obj/item/stack/gun_powder = 2) output = list(/obj/item/ammo_magazine/tank/ltb_cannon/apfds = 1) /datum/assembly_craft/weapons/ltb_cannon_TOW name = "TOW Launcher Magazine" - input = list(/obj/item/stack/sheet/jeweler_steel = 3, /obj/item/stack/gun_powder = 6) + input = list(/obj/item/stack/sheet/jeweler_steel = 2, /obj/item/stack/gun_powder = 1) output = list(/obj/item/ammo_magazine/tank/towlauncher = 1) +/datum/assembly_craft/weapons/gl_explosive_tank_ammo + name = "Tank grenade launcher magazine" + input = list(/obj/item/stack/sheet/jeweler_steel = 1, /obj/item/stack/gun_powder = 1) + output = list(/obj/item/ammo_magazine/tank/tank_glauncher = 1) + /datum/assembly_craft/weapons/heavy_isg_he - name = "A 15cm HE shell for the FK-88 mounted flak gun." - input = list(/obj/item/stack/sheet/jeweler_steel = 25, /obj/item/stack/gun_powder = 30) - output = list(/obj/item/ammo_magazine/heavy_isg/he = 1) + name = "A 155mm HE shell for the FK-88 mounted flak gun." + input = list(/obj/item/stack/sheet/jeweler_steel = 5, /obj/item/stack/gun_powder = 6) // 35 + 48 points + output = list(/obj/item/ammo_magazine/heavy_isg/he = 1) // 83 points +- /datum/assembly_craft/weapons/heavy_isg_sabot - name = "A 15cm APFDS shell for the FK-88 mounted flak gun" - input = list(/obj/item/stack/sheet/jeweler_steel = 30, /obj/item/stack/gun_powder = 25) - output = list(/obj/item/ammo_magazine/heavy_isg/sabot = 1) + name = "A 155mm APFDS shell for the FK-88 mounted flak gun" + input = list(/obj/item/stack/sheet/jeweler_steel = 5, /obj/item/stack/gun_powder = 7) // 35 + 56 points + output = list(/obj/item/ammo_magazine/heavy_isg/sabot = 1) // 91 points +- From 9832ee059e7fc0741d5aa7771d854a3b716aaa7d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 17:42:36 +0000 Subject: [PATCH 11/32] Automatic changelog for PR #786 [ci skip] --- html/changelogs/AutoChangeLog-pr-786.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-786.yml diff --git a/html/changelogs/AutoChangeLog-pr-786.yml b/html/changelogs/AutoChangeLog-pr-786.yml new file mode 100644 index 00000000000..5569a95eb96 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-786.yml @@ -0,0 +1,6 @@ +author: "MalorMorfin" +delete-after: True +changes: + - rscadd: "Добавил Grenade launcher magazine в завод и карго" + - balance: "Изменил цену боезапаса танка в заводе" + - balance: "Изменил цену боезапаса фк в заводе" \ No newline at end of file From 68dc48cb28bda69e81910de2e40abf9418f4f72a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 13 Dec 2024 00:37:57 +0000 Subject: [PATCH 12/32] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-767.yml | 6 ------ html/changelogs/AutoChangeLog-pr-769.yml | 4 ---- html/changelogs/AutoChangeLog-pr-786.yml | 6 ------ html/changelogs/archive/2024-12.yml | 20 ++++++++++++++++++++ 4 files changed, 20 insertions(+), 16 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-767.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-769.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-786.yml diff --git a/html/changelogs/AutoChangeLog-pr-767.yml b/html/changelogs/AutoChangeLog-pr-767.yml deleted file mode 100644 index 18aad383155..00000000000 --- a/html/changelogs/AutoChangeLog-pr-767.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "homexp13" -delete-after: True -changes: - - rscdel: "б7 не даёт ифф, а даёт аим мод" - - rscdel: "скоупы не дают аим мод" - - rscdel: "у мг 60 удалён аим мода" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-769.yml b/html/changelogs/AutoChangeLog-pr-769.yml deleted file mode 100644 index f39ff47f7b9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-769.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MalorMorfin" -delete-after: True -changes: - - bugfix: "Параллакс меньше нагружает систему" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-786.yml b/html/changelogs/AutoChangeLog-pr-786.yml deleted file mode 100644 index 5569a95eb96..00000000000 --- a/html/changelogs/AutoChangeLog-pr-786.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "MalorMorfin" -delete-after: True -changes: - - rscadd: "Добавил Grenade launcher magazine в завод и карго" - - balance: "Изменил цену боезапаса танка в заводе" - - balance: "Изменил цену боезапаса фк в заводе" \ No newline at end of file diff --git a/html/changelogs/archive/2024-12.yml b/html/changelogs/archive/2024-12.yml index 9e8ac0180d0..b2081db672d 100644 --- a/html/changelogs/archive/2024-12.yml +++ b/html/changelogs/archive/2024-12.yml @@ -358,3 +358,23 @@ \u0440\u0433\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0443\u0434\u0430\u043B\ \u0435\u043D\u0438\u0439 \u043B\u044F\u0440\u0432 \u0434\u043E \u0431\u0451\u0440\ \u0441\u0442\u0430." +2024-12-13: + MalorMorfin: + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B Grenade launcher magazine\ + \ \u0432 \u0437\u0430\u0432\u043E\u0434 \u0438 \u043A\u0430\u0440\u0433\u043E" + - balance: "\u0418\u0437\u043C\u0435\u043D\u0438\u043B \u0446\u0435\u043D\u0443\ + \ \u0431\u043E\u0435\u0437\u0430\u043F\u0430\u0441\u0430 \u0442\u0430\u043D\u043A\ + \u0430 \u0432 \u0437\u0430\u0432\u043E\u0434\u0435" + - balance: "\u0418\u0437\u043C\u0435\u043D\u0438\u043B \u0446\u0435\u043D\u0443\ + \ \u0431\u043E\u0435\u0437\u0430\u043F\u0430\u0441\u0430 \u0444\u043A \u0432\ + \ \u0437\u0430\u0432\u043E\u0434\u0435" + - bugfix: "\u041F\u0430\u0440\u0430\u043B\u043B\u0430\u043A\u0441 \u043C\u0435\u043D\ + \u044C\u0448\u0435 \u043D\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0441\ + \u0438\u0441\u0442\u0435\u043C\u0443" + homexp13: + - rscdel: "\u04317 \u043D\u0435 \u0434\u0430\u0451\u0442 \u0438\u0444\u0444, \u0430\ + \ \u0434\u0430\u0451\u0442 \u0430\u0438\u043C \u043C\u043E\u0434" + - rscdel: "\u0441\u043A\u043E\u0443\u043F\u044B \u043D\u0435 \u0434\u0430\u044E\u0442\ + \ \u0430\u0438\u043C \u043C\u043E\u0434" + - rscdel: "\u0443 \u043C\u0433 60 \u0443\u0434\u0430\u043B\u0451\u043D \u0430\u0438\ + \u043C \u043C\u043E\u0434\u0430" From be312b22a7b7b450e03ffa01e0cf95f10cdf8bbe Mon Sep 17 00:00:00 2001 From: RUTGMC4429 <102372528+RUTGMC4429@users.noreply.github.com> Date: Fri, 13 Dec 2024 05:01:27 +0100 Subject: [PATCH 13/32] =?UTF-8?q?=D0=9A=D0=BE=D0=B4=D0=B5=D0=BA=D1=81=20?= =?UTF-8?q?=D0=BE=D0=B3=D0=BD=D0=B5=D1=81=D1=82=D1=80=D0=B5=D0=BB=D0=B0=20?= =?UTF-8?q?2.0=20(#802)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * stats_attach * attach_done * ammo_info * other_weapons * review_changes_optim * Update code/modules/codex/entries/guns_codex.dm Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> Signed-off-by: RUTGMC4429 <102372528+RUTGMC4429@users.noreply.github.com> --------- Signed-off-by: RUTGMC4429 <102372528+RUTGMC4429@users.noreply.github.com> Co-authored-by: jaja4429+git@gmail.com Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> --- code/modules/codex/entries/guns_codex.dm | 174 +++++++++++++++-------- 1 file changed, 116 insertions(+), 58 deletions(-) diff --git a/code/modules/codex/entries/guns_codex.dm b/code/modules/codex/entries/guns_codex.dm index 3af34845eca..ab4c6a29f78 100644 --- a/code/modules/codex/entries/guns_codex.dm +++ b/code/modules/codex/entries/guns_codex.dm @@ -13,87 +13,145 @@ /obj/item/weapon/gun/get_mechanics_info() . = ..() var/list/traits = list() + traits += "----------------------------------------------------------" + traits += "Caliber: [caliber]" if(flags_gun_features & GUN_WIELDED_FIRING_ONLY) - traits += "This can only be fired with a two-handed grip." - else - traits += "It's best fired with a two-handed grip." - - - if(HAS_TRAIT(src, TRAIT_GUN_SAFETY)) - traits += "It has a safety switch. Alt-Click it to toggle safety." - - if(scope_zoom) //flawed, unless you check the codex for the first time when the scope is attached, this won't show. works for sniper rifles though. - traits += "It has a magnifying optical scope. It can be toggled with Use Scope verb." - - if(burst_amount > 2) - traits += "It has multiple firemodes. Click the Toggle Burst Fire button to change it." - - - traits += "
Caliber: [caliber]" - + traits += "Can only be fired with a two-handed grip." + if(burst_amount > 1) + traits += "Can fire in short bursts." if(max_shells) - traits += "It can normally hold [max_shells] rounds." - + traits += "Normally holds [max_shells] rounds." if(max_shots) traits += "Its maximum capacity is normally [max_shots] shots worth of power." var/list/loading_ways = list() if(load_method & SINGLE_CASING) - loading_ways += "loose [caliber] rounds." + loading_ways += "loose [caliber] rounds" if(load_method & SPEEDLOADER) - loading_ways += "speedloaders." + loading_ways += "speedloaders" if(load_method & MAGAZINE) - loading_ways += "magazines." + loading_ways += "magazines" if(load_method & CELL) - loading_ways += "cells." + loading_ways += "cells" if(load_method & POWERPACK) - loading_ways += "it's powerpack." - traits += "Can be loaded using [english_list(loading_ways)]" + loading_ways += "it's powerpack" + traits += "Can be loaded using: [english_list(loading_ways)]:" + + if(allowed_ammo_types) + for(var/i in allowed_ammo_types) + var/obj/item/ammo_magazine/mag = i + if(!mag.default_ammo) //no ammo in mag - just print the name, otherwise add stats + traits += mag.name + continue + + var/datum/ammo/bullet/def_ammo = mag.default_ammo + if(!mag.default_ammo.damage) + continue + var/damage_text = "DMG:[def_ammo.damage]" + if(def_ammo.bonus_projectiles_amount > 0) + damage_text += "x[def_ammo.bonus_projectiles_amount]" + var/ap_text = "AP:[def_ammo.penetration+def_ammo.additional_xeno_penetration]" + var/falloff_text = "FLF:-[def_ammo.damage_falloff]/tile" + var/size_text = "AMMO: [mag.max_rounds]" + traits += mag.name + traits += "-> [damage_text], [ap_text], [falloff_text], [size_text]" - if(attachable_allowed) - traits += "
You can attach:" - for(var/X in attachable_allowed) - var/obj/item/attachable/A = X - traits += "[initial(A.name)]" - - traits += "
Basic Statistics for this weapon are as follows:" + if(load_method & SINGLE_CASING) + //check is done based on caliber only + for (var/i in typesof(/obj/item/ammo_magazine/handful)) + var/obj/item/ammo_magazine/handful/mag = i + if(mag.caliber != caliber) + continue + if(!mag.default_ammo) //no ammo in mag - just print the name, otherwise add stats + traits += mag.name + continue + + var/datum/ammo/bullet/def_ammo = mag.default_ammo + if(!mag.default_ammo.damage) + continue + var/damage_text = "DMG:[def_ammo.damage]" + if(def_ammo.bonus_projectiles_amount > 0) + damage_text += "x[def_ammo.bonus_projectiles_amount]" + var/ap_text = "AP:[def_ammo.penetration+def_ammo.additional_xeno_penetration]" + var/falloff_text = "FLF:-[def_ammo.damage_falloff]/tile" + traits += def_ammo.name + traits += "-> [damage_text], [ap_text], [falloff_text]" + + traits += "Examine the ammo holders or ammunition for more info." + + traits += "----------------------------------------------------------" if(w_class) traits += "Size: [w_class]" - if(force) - traits += "Base melee damage: [force]" - if(accuracy_mult) - traits += "Accuracy: [((accuracy_mult - 1) * 100) > 0 ? "+[(accuracy_mult - 1) * 100]" : "[(accuracy_mult - 1) * 100]"]%" - if(damage_mult) - traits += "Damage modifier: [((damage_mult - 1) * 100) > 0 ? "+[(damage_mult - 1) * 100]" : "[(damage_mult - 1) * 100]"]%" - if(damage_falloff_mult) - traits += "Damage falloff: -[damage_falloff_mult] per tile travelled." - if(recoil) - traits += "Recoil: [recoil]" - if(scatter) - traits += "Scatter angle: [scatter]" - if(burst_scatter_mult) - traits += "Burst scatter angle multiplier: x[burst_scatter_mult]" - if(accuracy_mult_unwielded) - traits += "Accuracy unwielded modifier: [((accuracy_mult_unwielded - 1) * 100) > 0 ? "+[(accuracy_mult_unwielded - 1) * 100]" : "[(accuracy_mult_unwielded - 1) * 100]"]%" - if(recoil_unwielded) - traits += "Recoil Unwielded: [recoil_unwielded]" - if(scatter_unwielded) - traits += "Unwielded Scatter angle: [scatter_unwielded > 0 ? "+[scatter_unwielded]" : "[scatter_unwielded]"]" - if(movement_acc_penalty_mult) - traits += "Movement unwielded penalty modifier: -[(movement_acc_penalty_mult * 0.15) * 100]%" if(fire_delay) traits += "Time between single-fire: [fire_delay * 0.1] seconds" - if(wield_delay) - traits += "Wield delay: [wield_delay * 0.1] seconds" if(burst_amount > 1) traits += "Shots fired on burst mode: [burst_amount]" - traits += "Time between burst-fire: [(min((burst_delay * 2), (fire_delay * 3))) * 0.1] seconds" + traits += "Time between bursts: [((burst_amount-1)*burst_delay + fire_delay + extra_delay) * 0.1] seconds" if(/datum/action/item_action/aim_mode in actions_types) traits += "Can be aimed with to shoot past allies." traits += "Time between aimed shots: [(fire_delay + aim_fire_delay) * 0.1] seconds" + if(wield_delay) + traits += "Wield delay: [wield_delay * 0.1] seconds" + if(force) + traits += "Melee damage: [force]" + if(damage_mult <> 1) + traits += "Damage multiplier: x[damage_mult]" + if(damage_falloff_mult <> 1) + traits += "Damage falloff multiplier: x[damage_falloff_mult]" + if(accuracy_mult <> 1) + traits += "Accuracy multiplier: x[accuracy_mult]" + if(accuracy_mult_unwielded) + traits += "Accuracy unwielded multiplier: x[accuracy_mult_unwielded]" + if(movement_acc_penalty_mult) + traits += "Moving accuracy (flat malus): -[(movement_acc_penalty_mult * 3)]%" + if(recoil) + traits += "Recoil: [recoil]" + if(recoil_unwielded) + traits += "Recoil unwielded: [recoil_unwielded]" + if(scatter) + traits += "Scatter angle: [scatter]" + if(scatter_unwielded) + traits += "Unwielded scatter angle: [scatter_unwielded]" + if(burst_scatter_mult <> 1) + traits += "Burst scatter angle multiplier: x[burst_scatter_mult]" - traits += "
" + traits += "----------------------------------------------------------" + if(attachable_allowed) + var/list/attachments_header_text = list( + ATTACHMENT_SLOT_RAIL = "Rail attachments:", + ATTACHMENT_SLOT_UNDER = "Handguard attachments:", + ATTACHMENT_SLOT_MUZZLE = "Muzzle attachments:", + ATTACHMENT_SLOT_STOCK = "Stock attachments:", + ATTACHMENT_BARREL_MOD = "Barrel attachments:", + "other" = "Other attachments:" + ) + var/list/attachments_text = list( + ATTACHMENT_SLOT_RAIL = list(), + ATTACHMENT_SLOT_UNDER = list(), + ATTACHMENT_SLOT_MUZZLE = list(), + ATTACHMENT_SLOT_STOCK = list(), + ATTACHMENT_BARREL_MOD = list(), + "other" = list() + ) + + for(var/att in attachable_allowed) + var/obj/item/attachable/A = att + if(A.slot in attachments_text) + attachments_text[A.slot] += A.name + else + attachments_text["other"] += A.name + for(var/i in attachments_text) + var/list/attach_list_of_type = attachments_text[i] + if(length(attach_list_of_type) <= 0) + continue + + traits += attachments_header_text[i] + attachments_text[i] = sortList(attachments_text[i]) + traits += attachments_text[i] + + traits += "----------------------------------------------------------" + traits += "How to use:
" var/list/entries = SScodex.retrieve_entries_for_string(general_codex_key) var/datum/codex_entry/general_entry = LAZYACCESS(entries, 1) if(general_entry?.mechanics_text) From 1bf1e8f5b7d0855a90f67c8b9415df4837fd94d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 04:01:46 +0000 Subject: [PATCH 14/32] Automatic changelog for PR #802 [ci skip] --- html/changelogs/AutoChangeLog-pr-802.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-802.yml diff --git a/html/changelogs/AutoChangeLog-pr-802.yml b/html/changelogs/AutoChangeLog-pr-802.yml new file mode 100644 index 00000000000..cf57be67f13 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-802.yml @@ -0,0 +1,4 @@ +author: "RUTGMC4429" +delete-after: True +changes: + - qol: "Кодекс (осмотр) оружия показывает больше информации" \ No newline at end of file From b7e745cf1d586b13fab17c3ec1a09287d1079748 Mon Sep 17 00:00:00 2001 From: spaghetti <48985748+definitelynotspaghetti@users.noreply.github.com> Date: Fri, 13 Dec 2024 11:53:54 +0300 Subject: [PATCH 15/32] Xeno upgrades nerf (#762) * xeno upgrades nerf * Update xeno_buffs.dm Signed-off-by: spaghetti <48985748+definitelynotspaghetti@users.noreply.github.com> --------- Signed-off-by: spaghetti <48985748+definitelynotspaghetti@users.noreply.github.com> --- code/__DEFINES/xeno.dm | 1 + code/datums/status_effects/xeno_buffs.dm | 18 +++++++++--------- code/game/objects/structures/xeno/resin.dm | 4 ++++ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm index 7d2feb02846..7361dc4576a 100644 --- a/code/__DEFINES/xeno.dm +++ b/code/__DEFINES/xeno.dm @@ -34,6 +34,7 @@ #define DEFILER_TRANSVITOX "Transvitox" #define DEFILER_OZELOMELYN "Ozelomelyn" #define DEFILER_ACID "Sulphuric acid" +#define DEFILER_SANGUINAL "Sanguinal" //Panther tearing tail reagents #define PANTHER_HEMODILE "Hemodile" diff --git a/code/datums/status_effects/xeno_buffs.dm b/code/datums/status_effects/xeno_buffs.dm index f2c4b73dc51..9102a75f204 100644 --- a/code/datums/status_effects/xeno_buffs.dm +++ b/code/datums/status_effects/xeno_buffs.dm @@ -973,7 +973,7 @@ status_type = STATUS_EFFECT_UNIQUE alert_type = /atom/movable/screen/alert/status_effect/upgrade_carapace var/mob/living/carbon/xenomorph/buff_owner - var/armor_buff_per_chamber = 5 + var/armor_buff_per_chamber = 2.5 var/chamber_scaling = 0 /datum/status_effect/upgrade_carapace/on_apply() @@ -1010,8 +1010,8 @@ status_type = STATUS_EFFECT_UNIQUE alert_type = /atom/movable/screen/alert/status_effect/upgrade_regeneration var/mob/living/carbon/xenomorph/buff_owner - var/regen_buff_per_chamber = 0.05 - var/sunder_regen_per_chamber = 0.33 + var/regen_buff_per_chamber = 0.008 + var/sunder_regen_per_chamber = 0.166 var/chamber_scaling = 0 /datum/status_effect/upgrade_regeneration/on_apply() @@ -1044,7 +1044,7 @@ status_type = STATUS_EFFECT_UNIQUE alert_type = /atom/movable/screen/alert/status_effect/upgrade_vampirism var/mob/living/carbon/xenomorph/buff_owner - var/leech_buff_per_chamber = 0.033 + var/leech_buff_per_chamber = 0.016 var/chamber_scaling = 0 /datum/status_effect/upgrade_vampirism/on_apply() @@ -1199,7 +1199,7 @@ DEFILER_OZELOMELYN = image('icons/Xeno/actions.dmi', icon_state = DEFILER_OZELOMELYN), DEFILER_HEMODILE = image('icons/Xeno/actions.dmi', icon_state = DEFILER_HEMODILE), DEFILER_TRANSVITOX = image('icons/Xeno/actions.dmi', icon_state = DEFILER_TRANSVITOX), - DEFILER_NEUROTOXIN = image('icons/Xeno/actions.dmi', icon_state = DEFILER_NEUROTOXIN), + DEFILER_SANGUINAL = image('icons/Xeno/actions.dmi', icon_state = DEFILER_SANGUINAL), DEFILER_ACID = image('icons/Xeno/actions.dmi', icon_state = DEFILER_ACID), ) var/datum/status_effect/upgrade_toxin/effect = attached_effect @@ -1224,12 +1224,12 @@ var/mob/living/carbon/xenomorph/buff_owner var/toxin_amount_per_chamber = 1 var/chamber_scaling = 0 - var/datum/reagent/toxin/injected_reagent = /datum/reagent/toxin/xeno_neurotoxin + var/datum/reagent/toxin/injected_reagent = /datum/reagent/toxin/xeno_transvitox var/list/selectable_reagents = list( /datum/reagent/toxin/xeno_ozelomelyn, /datum/reagent/toxin/xeno_hemodile, /datum/reagent/toxin/xeno_transvitox, - /datum/reagent/toxin/xeno_neurotoxin, + /datum/reagent/toxin/xeno_sanguinal, /datum/reagent/toxin/acid, ) @@ -1290,7 +1290,7 @@ alert_type = /atom/movable/screen/alert/status_effect/upgrade_pheromones var/mob/living/carbon/xenomorph/buff_owner var/datum/aura_bearer/current_aura - var/phero_power_per_chamber = 1 + var/phero_power_per_chamber = 0.5 var/phero_power_base = 1 var/chamber_scaling = 0 var/emitted_aura = AURA_XENO_RECOVERY @@ -1348,7 +1348,7 @@ var/chamber_scaling = 0 var/list/selectable_trails = list( /obj/effect/xenomorph/spray, - /obj/alien/resin/sticky/thin, + /obj/alien/resin/sticky/thin/temporary, ) /datum/status_effect/upgrade_trail/on_apply() diff --git a/code/game/objects/structures/xeno/resin.dm b/code/game/objects/structures/xeno/resin.dm index cbaa5bfdb6a..0cb4b98b86c 100644 --- a/code/game/objects/structures/xeno/resin.dm +++ b/code/game/objects/structures/xeno/resin.dm @@ -80,3 +80,7 @@ ignore_weed_destruction = FALSE refundable = FALSE + +/obj/alien/resin/sticky/thin/temporary/Initialize(mapload) + . = ..() + addtimer(CALLBACK(src, PROC_REF(obj_destruction), MELEE), 3 SECONDS) From 0fe8c310e029def738b8e429b1ef5a82eed25cde Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 08:54:12 +0000 Subject: [PATCH 16/32] Automatic changelog for PR #762 [ci skip] --- html/changelogs/AutoChangeLog-pr-762.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-762.yml diff --git a/html/changelogs/AutoChangeLog-pr-762.yml b/html/changelogs/AutoChangeLog-pr-762.yml new file mode 100644 index 00000000000..fa20a2e330d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-762.yml @@ -0,0 +1,9 @@ +author: "definitelynotspaghetti" +delete-after: True +changes: + - rscadd: "Липкая резина исчезает со временем." + - rscadd: "Нейротоксин заменен на сангвинал" + - balance: "Армор теперь увеличивается только на 2.5 за чамбер вместо 5." + - balance: "Реген за чамбер 0.05 -> 0.008. Сандер 0.33 -> 0.166" + - balance: "Вампиризм за чамбер 0.033 -> 0.016" + - balance: "Сила фер за чамбер 1 -> 0.5" \ No newline at end of file From 84e177397d459c7ce7c10d08b9c0c24e11e41d56 Mon Sep 17 00:00:00 2001 From: siegluck <110900393+siegluck@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:12:38 +0300 Subject: [PATCH 17/32] =?UTF-8?q?=D0=9A=D0=BE=D0=BB=D0=BE=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=80=D1=82=20=D0=B2=20=D0=BE=D1=80=D1=83=D0=B6?= =?UTF-8?q?=D0=B5=D0=B9=D0=BD=D0=BE=D0=BC=20=D0=B2=D0=B5=D0=BD=D0=B4=D0=BE?= =?UTF-8?q?=D1=80=D0=B5=20(#812)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * deck * gear --- code/game/objects/machinery/vending/marine_vending.dm | 3 +++ code/modules/client/preferences_gear.dm | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/code/game/objects/machinery/vending/marine_vending.dm b/code/game/objects/machinery/vending/marine_vending.dm index a1de33614e8..f19db4d76ed 100644 --- a/code/game/objects/machinery/vending/marine_vending.dm +++ b/code/game/objects/machinery/vending/marine_vending.dm @@ -236,6 +236,7 @@ /obj/item/compass = -1, /obj/item/tool/hand_labeler = -1, /obj/item/toy/deck/kotahi = -1, + /obj/item/toy/deck = -1, /obj/item/deployable_floodlight = 5, ), ) @@ -462,6 +463,7 @@ /obj/item/compass = -1, /obj/item/tool/hand_labeler = -1, /obj/item/toy/deck/kotahi = -1, + /obj/item/toy/deck = -1, /obj/item/deployable_floodlight = 5, ), ) @@ -720,6 +722,7 @@ /obj/item/compass = -1, /obj/item/tool/hand_labeler = -1, /obj/item/toy/deck/kotahi = -1, + /obj/item/toy/deck = -1, /obj/item/deployable_floodlight = -1, /obj/item/fulton_extraction_pack = -1, /obj/item/facepaint/premium = -1, diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index bef8e440b6b..6ace189e8b8 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -228,6 +228,12 @@ GLOBAL_LIST_INIT(gear_datums, populate_gear_list()) /datum/gear/kotahi slot = SLOT_IN_BACKPACK +/datum/gear/cards + display_name = "Deck of cards" + path = /obj/item/toy/deck + cost = 2 + slot = SLOT_IN_BACKPACK + /datum/gear/pig display_name = "Pig toy" path = /obj/item/toy/plush/pig From 0f52bfd6e545f9a6cfaa714b914d50f4c7093962 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 09:12:59 +0000 Subject: [PATCH 18/32] Automatic changelog for PR #812 [ci skip] --- html/changelogs/AutoChangeLog-pr-812.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-812.yml diff --git a/html/changelogs/AutoChangeLog-pr-812.yml b/html/changelogs/AutoChangeLog-pr-812.yml new file mode 100644 index 00000000000..7b628c29ae6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-812.yml @@ -0,0 +1,4 @@ +author: "siegluck" +delete-after: True +changes: + - rscadd: "Колода кард теперь есть в оружейном вендоре и в преф меню" \ No newline at end of file From 35a556ec7717c72f8d5e6e1e39bb25d910482736 Mon Sep 17 00:00:00 2001 From: siegluck <110900393+siegluck@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:16:50 +0300 Subject: [PATCH 19/32] imialy (#811) --- code/game/objects/machinery/vending/vending_types.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/machinery/vending/vending_types.dm b/code/game/objects/machinery/vending/vending_types.dm index e91489f81cb..3f4f2315066 100644 --- a/code/game/objects/machinery/vending/vending_types.dm +++ b/code/game/objects/machinery/vending/vending_types.dm @@ -161,6 +161,7 @@ /obj/item/storage/pill_bottle/spaceacillin = 6, /obj/item/storage/pill_bottle/alkysine = 6, /obj/item/storage/pill_bottle/imidazoline = 6, + /obj/item/storage/pill_bottle/imialky = 6, /obj/item/storage/pill_bottle/hypervene = 6, ), "Hypospray" = list ( @@ -264,6 +265,7 @@ /obj/item/storage/pill_bottle/spaceacillin = -1, /obj/item/storage/pill_bottle/alkysine = -1, /obj/item/storage/pill_bottle/imidazoline = -1, + /obj/item/storage/pill_bottle/imialky = -1, /obj/item/storage/pill_bottle/quickclot = -1, /obj/item/storage/pill_bottle/hypervene = -1, /obj/item/storage/pill_bottle/russian_red = -1, From defa66b009b71b1f0ad44d5ef7d3b598cf44eafb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 09:20:53 +0000 Subject: [PATCH 20/32] Automatic changelog for PR #811 [ci skip] --- html/changelogs/AutoChangeLog-pr-811.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-811.yml diff --git a/html/changelogs/AutoChangeLog-pr-811.yml b/html/changelogs/AutoChangeLog-pr-811.yml new file mode 100644 index 00000000000..9e5f34c2df1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-811.yml @@ -0,0 +1,4 @@ +author: "siegluck" +delete-after: True +changes: + - qol: "Имиалки теперь есть в ограниченном количестве в Наномед Плюс." \ No newline at end of file From 50a52eda7c332463bb6632d0f9476d307652028a Mon Sep 17 00:00:00 2001 From: Istrelok2107 Date: Fri, 13 Dec 2024 12:35:09 +0300 Subject: [PATCH 21/32] New speedboost reagent for marines MasTac (#610) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * modified: code/__DEFINES/colors.dm modified: code/__DEFINES/loadout.dm modified: code/game/objects/items/reagent_containers/autoinjectors.dm modified: code/game/objects/machinery/vending/marine_vending.dm modified: code/modules/reagents/reactions/other.dm modified: code/modules/reagents/reagents/medical.dm modified: code/modules/reqs/medical.dm * Update code/modules/reagents/reactions/other.dm Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> Signed-off-by: Istrelok2107 * Update code/modules/reagents/reagents/medical.dm Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> Signed-off-by: Istrelok2107 * Update code/modules/reagents/reactions/other.dm Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> Signed-off-by: Istrelok2107 * Update code/modules/reagents/reagents/medical.dm Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> Signed-off-by: Istrelok2107 * Update code/modules/reagents/reagents/medical.dm Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> Signed-off-by: Istrelok2107 * Update code/modules/reagents/reagents/medical.dm Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> Signed-off-by: Istrelok2107 * modified: code/__DEFINES/colors.dm modified: code/__DEFINES/loadout.dm modified: code/game/objects/items/reagent_containers/autoinjectors.dm modified: code/game/objects/machinery/vending/marine_vending.dm modified: code/modules/reagents/reactions/other.dm modified: code/modules/reagents/reagents/medical.dm modified: code/modules/reqs/medical.dm * modified: code/modules/reagents/reagents/medical.dm * modified: code/modules/reagents/reagents/medical.dm * modified: code/modules/reagents/reactions/other.dm * modified: code/modules/reagents/reagents/medical.dm * modified: code/modules/reqs/medical.dm * modified: code/modules/reagents/reagents/medical.dm * modified: code/__DEFINES/loadout.dm * helg fetish * xenohud+fix * modified: code/game/data_huds/human.dm modified: code/game/objects/items/reagent_containers/autoinjectors.dm modified: code/modules/reagents/reactions/other.dm modified: code/modules/reagents/reagents/medical.dm * потестил в вальггале, надо чтобы реже сердце било * Update code/modules/reagents/reagents/medical.dm Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> Signed-off-by: Istrelok2107 * Дешевле на 5 очков Signed-off-by: Istrelok2107 * ранний ретурн * уэээ * удаление ретурна * Update code/modules/reagents/reagents/medical.dm Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> Signed-off-by: Istrelok2107 * nerf * antidupe * fix * Update code/modules/reagents/reagents/medical.dm Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> Signed-off-by: Istrelok2107 * Update code/modules/reagents/reagents/medical.dm Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> Signed-off-by: Istrelok2107 * grammar * grammar2 * readability * helgshiza * Revert "helgshiza" This reverts commit b3b4c7cf6bb275ac1f22d89af082411354bb9a87. * Revert "readability" This reverts commit bf62cc9f8dea1b6bf5ccf39cc00adedd04a91b8f. * SHIZA * Update medical.dm Signed-off-by: Helg2 <93882977+Helg2@users.noreply.github.com> * shiza nerf * нолик * no fun allowed antidupe * conflict * Delete code/modules/reqs/medical.dm Signed-off-by: Istrelok2107 * mikola shiza * rename * modified: code/__DEFINES/loadout.dm modified: code/modules/reqs/supplypacks/medical.dm * Update code/game/objects/items/reagent_containers/autoinjectors.dm Signed-off-by: Helg2 <93882977+Helg2@users.noreply.github.com> --------- Signed-off-by: Istrelok2107 Signed-off-by: Helg2 <93882977+Helg2@users.noreply.github.com> Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> --- code/__DEFINES/colors.dm | 1 + code/__DEFINES/loadout.dm | 1 + code/game/data_huds/human.dm | 5 ++ .../items/reagent_containers/autoinjectors.dm | 10 ++++ .../machinery/vending/marine_vending.dm | 1 + code/modules/reagents/reactions/other.dm | 5 ++ code/modules/reagents/reagents/medical.dm | 51 ++++++++++++++++++ code/modules/reqs/supplypacks/medical.dm | 18 +++++++ icons/mob/hud/reagent.dmi | Bin 1084 -> 1250 bytes 9 files changed, 92 insertions(+) diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 8c4a76f18b5..e96ab06c7f3 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -169,6 +169,7 @@ #define COLOR_REAGENT_SULFASALAZINE "#266930" #define COLOR_REAGENT_DIBORANE "#1800a3" #define COLOR_REAGENT_STIMULON "#19C832" +#define COLOR_REAGENT_NEUROFRENZY "#062c48" //Color defines used by toxin #define COLOR_TOXIN_TOXIN "#CF3600" // rgb: 207, 54, 0 diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm index 93397daaae6..7085b173c53 100644 --- a/code/__DEFINES/loadout.dm +++ b/code/__DEFINES/loadout.dm @@ -102,6 +102,7 @@ GLOBAL_LIST_INIT(marine_gear_listed_products, list( /obj/structure/closet/crate/mortar_ammo/mortar_kit = list(CAT_MARINE, "Mortar kit", 35, "orange3"), /obj/structure/closet/crate/mortar_ammo/howitzer_kit = list(CAT_MARINE, "Howitzer kit", 35, "orange3"), /obj/structure/closet/crate/mortar_ammo/mlrs_kit = list(CAT_MARINE, "MLRS kit", 35, "orange3"), + /obj/item/reagent_containers/hypospray/autoinjector/neurofrenzy = list(CAT_MARINE, "N-F neurostimulator", 20, "cyan"), /obj/item/reagent_containers/hypospray/autoinjector/oxycodone = list(CAT_MARINE, "Oxycodone autoinjector", 5, "cyan"), /obj/item/reagent_containers/hypospray/autoinjector/russian_red = list(CAT_MARINE, "Emergency autoinjector", 10, "cyan"), /obj/item/reagent_containers/hypospray/autoinjector/synaptizine = list(CAT_MARINE, "Synaptizine autoinjector", 8, "cyan"), diff --git a/code/game/data_huds/human.dm b/code/game/data_huds/human.dm index e9727291307..37c0c1a8be7 100644 --- a/code/game/data_huds/human.dm +++ b/code/game/data_huds/human.dm @@ -218,6 +218,7 @@ var/static/image/ifosfamide_image = image('icons/mob/hud/reagent.dmi', icon_state = "ifosfamide") var/static/image/jellyjuice_image = image('icons/mob/hud/reagent.dmi', icon_state = "jellyjuice") var/static/image/russianred_image = image('icons/mob/hud/reagent.dmi', icon_state = "russian_red") + var/static/image/neurofrenzy_image = image('icons/mob/hud/reagent.dmi', icon_state = "neurofrenzy") var/neurotox_amount = reagents.get_reagent_amount(/datum/reagent/toxin/xeno_neurotoxin) var/hemodile_amount = reagents.get_reagent_amount(/datum/reagent/toxin/xeno_hemodile) @@ -228,6 +229,7 @@ var/medicalnanites_amount = reagents.get_reagent_amount(/datum/reagent/medicalnanites) var/russianred_amount = reagents.get_reagent_amount(/datum/reagent/medicine/russian_red) var/ifosfamide_amount = reagents.get_reagent_amount(/datum/reagent/medicine/ifosfamide) + var/neurofrenzy_amount = reagents.get_reagent_amount(/datum/reagent/neurofrenzy) if(neurotox_amount > 10) //Blinking image for particularly high concentrations xeno_reagent.overlays += neurotox_high_image @@ -270,6 +272,9 @@ if(jellyjuice_amount > 0) xeno_reagent.overlays += jellyjuice_image + if(neurofrenzy_amount > 0) + xeno_reagent.overlays += neurofrenzy_image + hud_list[XENO_REAGENT_HUD] = xeno_reagent ///Displays active xeno specific debuffs diff --git a/code/game/objects/items/reagent_containers/autoinjectors.dm b/code/game/objects/items/reagent_containers/autoinjectors.dm index 061ca7fd61e..a35312ed065 100644 --- a/code/game/objects/items/reagent_containers/autoinjectors.dm +++ b/code/game/objects/items/reagent_containers/autoinjectors.dm @@ -370,3 +370,13 @@ /obj/item/reagent_containers/hypospray/autoinjector/yautja/interact(mob/user) return + +/obj/item/reagent_containers/hypospray/autoinjector/neurofrenzy + name = "neurofrenzy autoinjector" + desc = "An auto-injector loaded with 1 unit neurostimulant. !DO NOT USE WITH MEDICAL NANITES!" + icon_state = "RedWhite" + amount_per_transfer_from_this = 1 + volume = 1 + list_reagents = list(/datum/reagent/neurofrenzy = 1) + free_refills = FALSE + description_overlay = "Nf" diff --git a/code/game/objects/machinery/vending/marine_vending.dm b/code/game/objects/machinery/vending/marine_vending.dm index f19db4d76ed..f08dd4bf704 100644 --- a/code/game/objects/machinery/vending/marine_vending.dm +++ b/code/game/objects/machinery/vending/marine_vending.dm @@ -1069,6 +1069,7 @@ /obj/item/reagent_containers/hypospray/autoinjector/neuraline = -1, /obj/item/reagent_containers/hypospray/autoinjector/peridaxon_plus = -1, /obj/item/reagent_containers/hypospray/autoinjector/quickclotplus = -1, + /obj/item/reagent_containers/hypospray/autoinjector/neurofrenzy = -1, )) /obj/machinery/vending/MarineMed/Blood diff --git a/code/modules/reagents/reactions/other.dm b/code/modules/reagents/reactions/other.dm index a6b5d5c74a6..bf487f4cf34 100644 --- a/code/modules/reagents/reactions/other.dm +++ b/code/modules/reagents/reactions/other.dm @@ -18,6 +18,11 @@ results = list(/datum/reagent/toxin/sleeptoxin = 5) required_reagents = list(/datum/reagent/toxin/chloralhydrate = 1, /datum/reagent/consumable/sugar = 4) +/datum/chemical_reaction/sleeptoxin_two + name = "Sleeptoxin" + results = list(/datum/reagent/toxin/sleeptoxin = 0.5) + required_reagents = list(/datum/reagent/toxin/xeno_hemodile = 0.5, /datum/reagent/neurofrenzy = 0.1) + /datum/chemical_reaction/mutagen name = "Unstable mutagen" results = list(/datum/reagent/toxin/mutagen = 3) diff --git a/code/modules/reagents/reagents/medical.dm b/code/modules/reagents/reagents/medical.dm index 12fce353b35..f719f74be84 100644 --- a/code/modules/reagents/reagents/medical.dm +++ b/code/modules/reagents/reagents/medical.dm @@ -1678,3 +1678,54 @@ /datum/reagent/medicine/ifosfamide/overdose_crit_process(mob/living/L, metabolism) L.adjustToxLoss(4*effect_str) + +/datum/reagent/neurofrenzy + name = "NeuroFrenzy" + description = "This is a neurostimulating substance that causes the brain to maintain an increased heart rate." + color = COLOR_REAGENT_NEUROFRENZY + custom_metabolism = 0 + scannable = TRUE + taste_description = "sour coffee" + overdose_threshold = 10 + overdose_crit_threshold = 10 + trait_flags = TACHYCARDIC + purge_rate = 10 + purge_list = list( + /datum/reagent/medicalnanites, + /datum/reagent/medicine/peridaxon, + /datum/reagent/medicine/peridaxon_plus, + ) + +/datum/reagent/neurofrenzy/on_mob_add(mob/living/our_living, metabolism) + our_living.add_movespeed_modifier(type, TRUE, 0, NONE, TRUE, -0.4) + to_chat(our_living, span_userdanger("You feel like your heart could stop at any moment.")) + +/datum/reagent/neurofrenzy/on_mob_life(mob/living/our_living, metabolism) + . = ..() + if(volume < 1) + our_living.reagents.remove_reagent(/datum/reagent/neurofrenzy, 3) + return //antiduplicate + + if(volume < 5) + our_living.reagents.add_reagent(/datum/reagent/neurofrenzy, 0.5) + switch(current_cycle) + if(1 to 40) + our_living.adjustStaminaLoss((4) * effect_str) + our_living.jitter(2) + if(3) + to_chat(our_living, span_notice("Your heart is jumping out of your chest.")) + if(41) + to_chat(our_living, span_warning("It seems that your body has become accustomed to new conditions. But the heart is working hard.")) + if(45 to INFINITY) + if(prob(99.775)) + return + to_chat(our_living, span_userdanger("OUUH MY HEART")) + our_living.adjustOxyLoss(30) + var/mob/living/carbon/human/our_human = our_living + var/datum/internal_organ/heart/our_heart = our_human.get_organ_slot(ORGAN_SLOT_HEART) + our_heart?.take_damage(15, TRUE) + +/datum/reagent/neurofrenzy/on_mob_delete(mob/living/our_living, metabolism) + to_chat(our_living, span_userdanger("It seems that something has stopped pushing your heart with force.")) + our_living.remove_movespeed_modifier(type) + our_living.Paralyze(2 SECONDS) diff --git a/code/modules/reqs/supplypacks/medical.dm b/code/modules/reqs/supplypacks/medical.dm index 002bd52361f..e047d97a555 100644 --- a/code/modules/reqs/supplypacks/medical.dm +++ b/code/modules/reqs/supplypacks/medical.dm @@ -324,6 +324,24 @@ contains = list(/obj/item/reagent_containers/hypospray/autoinjector/oxycodone) cost = 20 +/datum/supply_packs/medical/nf_neurostimulator + name = "N-F neurostimulator injector" + notes = "contains M-S neurostimulator auto injector." + contains = list(/obj/item/reagent_containers/hypospray/autoinjector/neurofrenzy) + cost = 140 + +/datum/supply_packs/medical/nf_neurostimulator_kit + name = "N-F neurostimulator kit" + notes = "contains 5 N-F neurostimulator auto injectors." + contains = list( + /obj/item/reagent_containers/hypospray/autoinjector/neurofrenzy, + /obj/item/reagent_containers/hypospray/autoinjector/neurofrenzy, + /obj/item/reagent_containers/hypospray/autoinjector/neurofrenzy, + /obj/item/reagent_containers/hypospray/autoinjector/neurofrenzy, + /obj/item/reagent_containers/hypospray/autoinjector/neurofrenzy, + ) + cost = 500 + /datum/supply_packs/medical/neuraline_kit name ="large neuraline kit" notes = "contains five neuraline injectors" diff --git a/icons/mob/hud/reagent.dmi b/icons/mob/hud/reagent.dmi index e89b1e9efe0b3a8d35f2efcc9039ae97699c81c3..ff0dfb9c8c091e52ae341e2c79fc4e13f7ce333b 100644 GIT binary patch delta 1167 zcmV;A1aSMj2;vDPiBL{Q4GJ0x0000DNk~Le0002s0002s2m=5B04?*H(*OVf#*rmt zf6Q$F|C}=b5+ndBQUFJa7$g8TQUF|v003>wi_8Esod3K3Gguv3X(VitDwnezy3PpK zBme+X004>r0HP?O;Gy8^uT|OGKVZOygo*gFgJB3D_b5Sz`($* z8}noU0004WQchCy=W7i38{yY=tq{Q>V&7r*Z#;qU+e0;@?x zK~#90?cLc@6HydK;Z9C>1I=`j(2NQw$e;oWGN=K3|EIEt+@8I=vMU}F)+cw16xkG& zi~N-`Nff<)qZg|?m!?@3?oAaQuj=RdQl961p)V_aMd?K$_gs3sQ@X03f3Gertx8W| zZFzZ3>gy{j>r&q+iVdl6Zf=SP%3am-1Mdfe@Sm6;dOsWredPUU6z)ageNhOH-}2Sh z)LqpZ)CUSbU|1h0^ih4F(DehisuQN}s=VCZ+1W1haNphA+m-tM!NI=N>pxMczbmUR zt-DZHA<>62i9FW zaJKuNX0opZ4{&V{9*`>gUDj>i3wE=~z9t;l5Dt|0yR6&3H@gGdeJ=bmt?hTt$-Un8 zq~5N7;SK-*000000QhGIb(_Y5+-52kK*d-rJSn)`<*Q#ZSN z{Auc%ho@hr4gdfE000000000006_P<`nSk^Tz$iMfqU}&^7`_;z&&}begm%y+>__= zpRxEGn)4q2MZhKU|KV-z0000000000%$eA4-M{&L&?U~&VWaPN@%O>%Hx#wA4{H0M zwy(v0k+60E000000002y%>Vw;9P3AStovK+{ZJKqzccTDn%JN3Gw*+z*!!J*|I@_Y h@7VtU001!0{sLcuj_%r?nmzyk002ovPDHLkV1l)ZI-vjn delta 1000 zcmV2m=5B0B!b@ZvX%Qw2>ub ze*h9B04h=dM~cjC003>w|C}>3oc|ak05(zpT#5jT%mBOpGb8{2QUCyo007JY0RI3p zSRGnvBy5r@m%zZlvmLt52-l)0qTr$6>agnZ#PR>k|MsNGlmGw#0d!JMQvg8b*k%9# z0SbClSad{Xb7OL8aCB*JZU6vyoSl=we`>=p42I9~Q-t;!#*&Whw99B2J*=+~%&gQZ zwlyrfUH0^ITbA_D;ShY0#ApA%B)lx&Ht*YAx&GLSBX~w~n8wGIFPe*z#$L_t(|obB0NQ`$fjfMLQW3&al=Fe1`QMcaz4 z*vi<7{r~@~Y&I9Y*>f0oI+?-u8SY*%duB3Tob7ZJS+|z8)s4yXqKJ1@*V>-7wk!0$ z(g#W}OSxO=_o}Wv>h+GK2ORhN$5KBT3{IqeT9&6$9}b5p17vRG+-MYke+Aswx$#)& z6XzzAcrQ!m%2N3KncIEd{t9IyKS2BsWMe;o&?kNXq3Z*j?M8U}0Jb`xPR}bF?-#S# zh14(S^Gm7wS4ip~s@*5rRko_CX(c_Ns%A=`%e^d>-&aCcx$s}WwbzRx&yCst!~g&Q z0001Z7wYZ1u%EAM^8P=*f0)YZn&Jzu>a(Dv^pbZG$Jr2%}G1`waG z-VZeU_vite9zCE5J$k@g+3y!hSMLX!{kt$gO&Fji3?T3K3#F^~e*=C$?>F#L_ur6v ze7|pu-2Luf>fv@E-T?pr0001he|@}KB=tRfx?U!A+127Esqf)>d7IQ_i<{3$eGkjq zFG(E$00000003~HzTT~pdh701_es5VtNU+B{os9nSSR(?J**#-dh6DYKax5C00000 z0DyPt=hLR`BcyrSIy|?1gfyGyU;p<3zhAaVy>&0!*QDOM?dzYU4gdfE0002sK>Y;= WAT7EAq6P^70000 Date: Fri, 13 Dec 2024 14:36:10 +0500 Subject: [PATCH 22/32] PTRD (#706) * Cargo + fix * Duplicate * ASRS without acces (for SDMM) * Undo ASRS --- code/modules/projectiles/guns/mounted.dm | 12 ++++++++++++ code/modules/projectiles/mounted.dm | 2 +- code/modules/reqs/supplypacks/imports.dm | 10 ++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/mounted.dm index b1c0264513a..be70063a366 100644 --- a/code/modules/projectiles/guns/mounted.dm +++ b/code/modules/projectiles/guns/mounted.dm @@ -522,6 +522,18 @@ undeploy_time = 0.25 SECONDS movement_acc_penalty_mult = 20 // Good luck hitting on the move, bruv +/obj/item/weapon/gun/clf_heavyrifle/imported + name = "\improper PTR-41/1785I1" + desc = "PTR-41/1785I1 is an imported version of the original PTR-41 with a replacement receiver, making it possible to install the more common T-47 sight on it. However, the replacement also introduced some inconvenience, which is why it takes longer to shoot while aiming. Otherwise, it is an almost complete copy. While one could use it while standing it is obviously not a great idea. It is recommended to be used while the bipod is deployed. It uses 14.5mm high velocity rounds that will certainly leave a hole in whatever unfortunate soul is hit by it." + attachable_allowed = list( + /obj/item/attachable/motiondetector, + /obj/item/attachable/magnetic_harness, + /obj/item/attachable/flashlight/under, + /obj/item/attachable/stock/clf_heavyrifle, + /obj/item/attachable/scope/marine, + ) + + aim_fire_delay = 3 SECONDS //------------------------------------------------------- //AT-36 Anti Tank Gun diff --git a/code/modules/projectiles/mounted.dm b/code/modules/projectiles/mounted.dm index 29c24350083..93038d9c8c3 100644 --- a/code/modules/projectiles/mounted.dm +++ b/code/modules/projectiles/mounted.dm @@ -94,7 +94,7 @@ ADD_TRAIT(src, TRAIT_GUN_RELOADING, GUN_TRAIT) var/obj/item/weapon/gun/gun = get_internal_item() - if(length(gun?.chamber_items)) + if(length(gun?.chamber_items) && gun.reciever_flags != AMMO_RECIEVER_HANDFULS) gun.unload(user) update_appearance() diff --git a/code/modules/reqs/supplypacks/imports.dm b/code/modules/reqs/supplypacks/imports.dm index d83c4704a12..489c494f5a8 100644 --- a/code/modules/reqs/supplypacks/imports.dm +++ b/code/modules/reqs/supplypacks/imports.dm @@ -2,6 +2,16 @@ group = "Imports" containertype = /obj/structure/closet/crate/weapon +/datum/supply_packs/imports/clf_heavyrifle/imported + name = "PTR-41/1785I1" + contains = list(/obj/item/weapon/gun/clf_heavyrifle/imported) + cost = 350 + +/datum/supply_packs/imports/clf_heavyrifle/imported/ammo + name = "PTR-41/1785I1 ammo box" + contains = list(/obj/item/shotgunbox/clf_heavyrifle) + cost = 100 + /datum/supply_packs/imports/m41a name = "PR-11 Pulse Rifle" contains = list(/obj/item/weapon/gun/rifle/m41a) From 1f5b9679699dd90ac223a74653a09d154086a918 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 09:37:23 +0000 Subject: [PATCH 23/32] Automatic changelog for PR #610 [ci skip] --- html/changelogs/AutoChangeLog-pr-610.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-610.yml diff --git a/html/changelogs/AutoChangeLog-pr-610.yml b/html/changelogs/AutoChangeLog-pr-610.yml new file mode 100644 index 00000000000..624ade2fd7a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-610.yml @@ -0,0 +1,4 @@ +author: "Istrelok2107" +delete-after: True +changes: + - rscadd: "Введен нейростимулирующий реагент за очки маринов и в карго. HEAVY BUT FAAAAST!!!" \ No newline at end of file From 802362e38abd772dddde86ca260a79e80459c40b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 09:38:03 +0000 Subject: [PATCH 24/32] Automatic changelog for PR #706 [ci skip] --- html/changelogs/AutoChangeLog-pr-706.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-706.yml diff --git a/html/changelogs/AutoChangeLog-pr-706.yml b/html/changelogs/AutoChangeLog-pr-706.yml new file mode 100644 index 00000000000..582a440e8cb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-706.yml @@ -0,0 +1,7 @@ +author: "CheBokJam" +delete-after: True +changes: + - rscadd: "Добавлены в карго ПТРД и коробка патронов для него за 350 и 100 поинтов соответственно." + - balance: "Задержка между выстрелами в аиме 2 -> 3 сек." + - balance: "На ПТРД ставится Т-47." + - bugfix: "Исправлена ошибка, когда в установленный на землю ПТРД нельзя было зарядить больше двух патронов." \ No newline at end of file From aa6fd7e77bc5b17f8767c829680e1502d478cc7d Mon Sep 17 00:00:00 2001 From: siegluck <110900393+siegluck@users.noreply.github.com> Date: Fri, 13 Dec 2024 14:18:07 +0300 Subject: [PATCH 25/32] Smoking update (#809) * new_cig_icons * more_cigs_in_vendor * remove_old_icons --- .../machinery/vending/marine_vending.dm | 4 ++++ icons/obj/clothing/masks.dmi | Bin 26513 -> 26961 bytes 2 files changed, 4 insertions(+) diff --git a/code/game/objects/machinery/vending/marine_vending.dm b/code/game/objects/machinery/vending/marine_vending.dm index f08dd4bf704..14f06175454 100644 --- a/code/game/objects/machinery/vending/marine_vending.dm +++ b/code/game/objects/machinery/vending/marine_vending.dm @@ -752,6 +752,10 @@ isshared = TRUE products = list( /obj/item/storage/fancy/cigarettes/luckystars = -1, + /obj/item/storage/fancy/cigarettes/dromedaryco = -1, + /obj/item/storage/fancy/cigarettes/kpack = -1, + /obj/item/storage/fancy/cigarettes/lady_finger = -1, + /obj/item/storage/fancy/cigarettes = -1, /obj/item/storage/fancy/chemrettes = -1, /obj/item/storage/box/matches = -1, /obj/item/tool/lighter/random = -1, diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index b7ecf3b3df33caf439c9ffa988d2be2d44cf2393..e5f534cf2883825721e0ec688bb8d7e7e60d84c2 100644 GIT binary patch literal 26961 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 bE{7-PuJA`;J6E0v0YC6_R%c7kxZVFR89CB1 literal 26513 zcmc$_bx<79w>3IIa1U-F3BiJe;5rZjgy6y5-6gmM2uaY8;O_3O0|a+>8QfuTXXZ7( zdvDeI-XCAp`|4Fas-~Fkp6Thc&pvDKwe~*0loX_Ku_&=XAP}z1r;lGiAf$HSm4Sf< zoDmtXX9j_gzk8`_x_&fsF>$tXbhUD@2Z20Na^pu8mfjKcj3(z-tS*#d$zqEfX1XeO zBeDAiSQ;xD6A4AyG7g?yh_Gg`KR>gO^zQ!*_J?}(`1kCrUmcG=X3vQ%X>k3pe0W*6 zzJE|}UCZ~@s*)sm&^mYCRgebJ_3>A?dP=Gqi`fTa9Vg||1+mB|D6HK8JbA}Eb~uX` z?%+vipe6)?%4Oz37%t%$`WGo69hz$o|=S0z@nS!Ac$)s=5=Y6sa z8U>@}lu{o>M;rFGP?=;*-pEYe@`6*-O3{@m{~(PM_kFX(c*(>gWF?4@VRk5rHI_xM zBq1|U@I%NXlqG(FxLJNomv;HA4BBGK2pkiZl3nf^7~GWbv!g(_y}C3EVH`*=oH}2) zWoGz8`Fm>zrB0p>Oq=m3mDWpC4BbK^E+Ikr^=xwBA-tufV=bw4 zT?u?!kYDJbIp{sY_nlUHtNd>i-4{Rfw{^evL(n8Uf499?IHlaz?2l|}UnlNm&B-&w z-C&?aH{_MinBQQ?=eI-(BkLCww$>nb>dH0Abd8d|&Q-qtTZlKCjE>XCAo z>gl1nHID!jRf&Cg&X5@VJD6T#4w;=mshCx~9hFV9yWUoNiu9Sheo5|8*wmM>y3fUs zj0Uybfh+G^tWV2g7_ySDkj!K-Fp27Z|CW0%$NTAL3Y4}}VCW4})lmPN#CsRLM)MJu zw4v*g(d(sa&omdD!oos~z?T?-^=lh@s07c%37#pwL}LO@dC(gNJYCRu{ojX>G<}db zL2%u_Ku?$0;$efD8#M`8wy-fDoC$1If@f>{1wCYhgves1vnPUI@o0unyPhpR2ktTU zEKl@CEcKJ&v^3&RNI6ZF;fgN(>(@E@lP-BDa-5Qqxd91=I^tgdfBFP`GQc<#lQB#7 zr@FdpT}&aqXhuyirb3#qJQ5RAAKlxxXaPJn>UEYuLRRaKU)e!3Wr&9EIHQh0)FgP8 zWSHxu-aCh~_l`=st>;*y#LaSKB(cv439}M2#_p_KpWUoE95)-|J!H0(P9BM=DtZMZ zCB60WMJXsOL>`0O-=SGvE-%0Q32{Ft=1+$DLqrN

BgOLr3C_hgoKLo~H6Hi-(V=o*7 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 From 98393374b02ca87ecabf74a97b46b3b7355a1821 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 11:18:25 +0000 Subject: [PATCH 26/32] Automatic changelog for PR #809 [ci skip] --- html/changelogs/AutoChangeLog-pr-809.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-809.yml diff --git a/html/changelogs/AutoChangeLog-pr-809.yml b/html/changelogs/AutoChangeLog-pr-809.yml new file mode 100644 index 00000000000..1a7e6a76507 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-809.yml @@ -0,0 +1,5 @@ +author: "siegluck" +delete-after: True +changes: + - rscadd: "В сигаретном вендоре теперь больше видов сигарет." + - image: "Спрайты сигарет и сигар теперь меньше." \ No newline at end of file From 45303e65a4d1181e40ac792b072ed9cd9372ed3f Mon Sep 17 00:00:00 2001 From: Helg2 <93882977+Helg2@users.noreply.github.com> Date: Fri, 13 Dec 2024 13:24:21 +0200 Subject: [PATCH 27/32] Update abilities_runner.dm (#805) --- .../living/carbon/xenomorph/castes/runner/abilities_runner.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/runner/abilities_runner.dm b/code/modules/mob/living/carbon/xenomorph/castes/runner/abilities_runner.dm index b7d95433db1..19657b78405 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/runner/abilities_runner.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/runner/abilities_runner.dm @@ -59,7 +59,7 @@ owner.balloon_alert(owner, "Savage ready") owner.playsound_local(owner, 'sound/effects/alien/newlarva.ogg', 25, 0, 1) STOP_PROCESSING(SSprocessing, src) - UnregisterSignal(COMSIG_QDELETING) + UnregisterSignal(owner, COMSIG_QDELETING) return button.cut_overlay(visual_references[VREF_MUTABLE_SAVAGE_COOLDOWN]) var/mutable_appearance/cooldown = visual_references[VREF_MUTABLE_SAVAGE_COOLDOWN] From ca5ac5f99c16f33ae8ad513c4102d951b6ac0caf Mon Sep 17 00:00:00 2001 From: Helg2 <93882977+Helg2@users.noreply.github.com> Date: Fri, 13 Dec 2024 13:24:40 +0200 Subject: [PATCH 28/32] Update TGS_Talos.dmm (#807) --- _maps/map_files/Talos/TGS_Talos.dmm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/_maps/map_files/Talos/TGS_Talos.dmm b/_maps/map_files/Talos/TGS_Talos.dmm index 5e6a4e0f6d9..96358d28992 100644 --- a/_maps/map_files/Talos/TGS_Talos.dmm +++ b/_maps/map_files/Talos/TGS_Talos.dmm @@ -3152,15 +3152,17 @@ /turf/open/floor/plating, /area/mainship/squads/req) "bNa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer1, /obj/structure/cable, /obj/effect/ai_node, /obj/structure/disposalpipe/junction/flipped{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden/layer1{ + dir = 4 + }, /turf/open/floor/plating/plating_catwalk/dark, /area/mainship/hallways/port_hallway) "bNx" = ( From 6629505a8e8e7a9164cdd3b37b273f80915c1bf9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 11:26:31 +0000 Subject: [PATCH 29/32] Automatic changelog for PR #805 [ci skip] --- html/changelogs/AutoChangeLog-pr-805.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-805.yml diff --git a/html/changelogs/AutoChangeLog-pr-805.yml b/html/changelogs/AutoChangeLog-pr-805.yml new file mode 100644 index 00000000000..4fd25bc3731 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-805.yml @@ -0,0 +1,4 @@ +author: "Helg2" +delete-after: True +changes: + - bugfix: "Исправил то что паунс раннера не дерегистрировал сигнал для удаления." \ No newline at end of file From 12bb130dac81c6ed4d226e948f7b3a546590f83d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 11:26:36 +0000 Subject: [PATCH 30/32] Automatic changelog for PR #807 [ci skip] --- html/changelogs/AutoChangeLog-pr-807.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-807.yml diff --git a/html/changelogs/AutoChangeLog-pr-807.yml b/html/changelogs/AutoChangeLog-pr-807.yml new file mode 100644 index 00000000000..03ff56c69c4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-807.yml @@ -0,0 +1,4 @@ +author: "Helg2" +delete-after: True +changes: + - map: "[Талос] Исправлено то что вентиляция из комнаты танкистов никуда не вела." \ No newline at end of file From 0ff544d744cf5320e2494536c22b9bf4f87d950d Mon Sep 17 00:00:00 2001 From: kukur <39864130+kukurua@users.noreply.github.com> Date: Fri, 13 Dec 2024 16:54:23 +0500 Subject: [PATCH 31/32] Now crate can be pulled out of the APC. (#770) * Now crate can be pulled out of the APC. * We use the easy_load_list list instead of the explicitly specified things for unloading * These two returns are superfluous here * Update interior_tank.dm * Update code/datums/interior/interior_tank.dm Signed-off-by: Helg2 <93882977+Helg2@users.noreply.github.com> * Update interior_tank.dm Signed-off-by: Helg2 <93882977+Helg2@users.noreply.github.com> * Update interior_tank.dm Signed-off-by: Helg2 <93882977+Helg2@users.noreply.github.com> * Update interior_tank.dm Signed-off-by: Helg2 <93882977+Helg2@users.noreply.github.com> --------- Signed-off-by: Helg2 <93882977+Helg2@users.noreply.github.com> Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> --- code/__DEFINES/is_helpers.dm | 2 ++ code/datums/interior/interior_tank.dm | 29 ++++++++++++++++----- code/modules/vehicles/armored/_multitile.dm | 2 +- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index a8f2014d69b..4d32691a921 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -229,6 +229,8 @@ #define isladder(A) (istype(A, /obj/structure/ladder)) +#define iscrate(A) (istype(A, /obj/structure/closet/crate)) + #define ismachinery(A) (istype(A, /obj/machinery)) #define ispowermachinery(A) (istype(A, /obj/machinery/power)) diff --git a/code/datums/interior/interior_tank.dm b/code/datums/interior/interior_tank.dm index 2a8bb9cf408..b062ab19e4e 100644 --- a/code/datums/interior/interior_tank.dm +++ b/code/datums/interior/interior_tank.dm @@ -117,15 +117,30 @@ . = ..() owner.interior.mob_leave(user) -/turf/closed/interior/tank/door/MouseDrop_T(atom/movable/dropping, mob/M) - if(!ismob(dropping)) - return ..() - owner.interior.mob_leave(dropping) +/turf/closed/interior/tank/door/MouseDrop_T(atom/movable/dropping, mob/user) + if(ismob(dropping)) + owner.interior.mob_leave(dropping) + return + if(is_type_in_typecache(dropping.type, owner.easy_load_list)) + if(isitem(dropping)) + user.temporarilyRemoveItemFromInventory(dropping) + dropping.forceMove(owner.exit_location(dropping)) + user.balloon_alert(user, "item thrown outside") + return + return ..() /turf/closed/interior/tank/door/grab_interact(obj/item/grab/grab, mob/user, base_damage, is_sharp) - if(!ismob(grab.grabbed_thing)) - return ..() - owner.interior.mob_leave(grab.grabbed_thing) + if(ismob(grab.grabbed_thing)) + user.balloon_alert(user, grab.grabbed_thing.name + " thrown outside") + owner.interior.mob_leave(grab.grabbed_thing) + return + if(is_type_in_typecache(grab.grabbed_thing.type, owner.easy_load_list)) + if(isitem(grab.grabbed_thing.type)) + user.temporarilyRemoveItemFromInventory(grab.grabbed_thing) + user.balloon_alert(user, "item thrown outside") + grab.grabbed_thing.forceMove(owner.exit_location(grab.grabbed_thing)) + return + return ..() ///returns where we want to spit out new enterers /turf/closed/interior/tank/door/proc/get_enter_location() diff --git a/code/modules/vehicles/armored/_multitile.dm b/code/modules/vehicles/armored/_multitile.dm index 9ce8a6a24e0..5ccfad8a89c 100644 --- a/code/modules/vehicles/armored/_multitile.dm +++ b/code/modules/vehicles/armored/_multitile.dm @@ -34,7 +34,7 @@ /obj/vehicle/sealed/armored/multitile/enter_locations(atom/movable/entering_thing) return list(get_step_away(get_step(src, REVERSE_DIR(dir)), src, 2)) -/obj/vehicle/sealed/armored/multitile/exit_location(mob/M) +/obj/vehicle/sealed/armored/multitile/exit_location(atom/movable/M) return pick(enter_locations(M)) /obj/vehicle/sealed/armored/multitile/enter_checks(mob/entering_mob, loc_override = FALSE) From 5a4c7d68128c65c704af7977326560ecd36365de Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 11:54:41 +0000 Subject: [PATCH 32/32] Automatic changelog for PR #770 [ci skip] --- html/changelogs/AutoChangeLog-pr-770.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-770.yml diff --git a/html/changelogs/AutoChangeLog-pr-770.yml b/html/changelogs/AutoChangeLog-pr-770.yml new file mode 100644 index 00000000000..0eace74dd8d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-770.yml @@ -0,0 +1,4 @@ +author: "kukur" +delete-after: True +changes: + - bugfix: "Из БТРа теперь можно вытаскивать ящики." \ No newline at end of file