From afa006d28055d244e5bae9c7941832a235ddbbf9 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 8 May 2020 15:02:38 -0700 Subject: [PATCH 01/79] ok --- code/modules/projectiles/projectile.dm | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 432ef97dcb..961e7d6803 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -38,6 +38,8 @@ var/trajectory_ignore_forcemove = FALSE //instructs forceMove to NOT reset our trajectory to the new location! var/speed = 0.8 //Amount of deciseconds it takes for projectile to travel + /// "leftover" ticks and stuff yeah. hey when are we rewriting projectiles for the eighth time to do something smarter like incrementing x pixels until it meets a goal instead of for(var/i in 1 to required_moves)? + var/tick_moves_leftover = 0 var/Angle = 0 var/original_angle = 0 //Angle at firing var/nondirectional_sprite = FALSE //Set TRUE to prevent projectiles from having their sprites rotated based on firing angle @@ -350,13 +352,22 @@ /obj/item/projectile/Process_Spacemove(movement_dir = 0) return TRUE //Bullets don't drift in space -/obj/item/projectile/process() +/obj/item/projectile/process(wait) if(!loc || !fired || !trajectory) fired = FALSE return PROCESS_KILL if(paused || !isturf(loc)) return - pixel_move(1, FALSE) + var/ds = (SSprojectiles.flags & SS_TICKER)? (wait * world.tick_lag) : wait + var/required_moves = ds / speed + var/leftover = MODULUS(required_moves, 1) + tick_moves_leftover += leftover + required_moves = round(required_moves) + if(tick_moves_leftover > 1) + required_moves += round(tick_moves_leftover) + tick_moves_leftover = MODULUS(tick_moves_leftover, 1) + for(var/i in required_moves) + pixel_move(1, FALSE) /obj/item/projectile/proc/fire(angle, atom/direct_target) if(fired_from) From 1872f556aca7f7a1e707edd2a91f001f02682a60 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 8 May 2020 15:09:02 -0700 Subject: [PATCH 02/79] woops --- code/modules/projectiles/projectile.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 961e7d6803..71aa78da4b 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -366,7 +366,7 @@ if(tick_moves_leftover > 1) required_moves += round(tick_moves_leftover) tick_moves_leftover = MODULUS(tick_moves_leftover, 1) - for(var/i in required_moves) + for(var/i in 1 to required_moves) pixel_move(1, FALSE) /obj/item/projectile/proc/fire(angle, atom/direct_target) From 4cd5e0890248bccc04086056b0991bc32bbd160f Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 8 May 2020 21:27:36 -0700 Subject: [PATCH 03/79] sigh --- code/__DEFINES/maths.dm | 2 ++ .../subsystem/processing/projectiles.dm | 9 +++-- code/modules/projectiles/projectile.dm | 34 ++++++++----------- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index e418b8b4c6..f0bc34870b 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -209,3 +209,5 @@ /// Make sure something is a boolean TRUE/FALSE 1/0 value, since things like bitfield & bitflag doesn't always give 1s and 0s. #define FORCE_BOOLEAN(x) ((x)? TRUE : FALSE) + +#define TILES_TO_PIXELS(tiles) (tiles * world.icon_size) diff --git a/code/controllers/subsystem/processing/projectiles.dm b/code/controllers/subsystem/processing/projectiles.dm index 8cd63c6949..e4733e226f 100644 --- a/code/controllers/subsystem/processing/projectiles.dm +++ b/code/controllers/subsystem/processing/projectiles.dm @@ -3,19 +3,18 @@ PROCESSING_SUBSYSTEM_DEF(projectiles) wait = 1 stat_tag = "PP" flags = SS_NO_INIT|SS_TICKER - var/global_pixel_speed = 2 - var/global_iterations_per_move = 16 + var/global_pixel_increment_amount = 2 /datum/controller/subsystem/processing/projectiles/proc/set_pixel_speed(new_speed) - global_pixel_speed = new_speed + global_pixel_increment_amount = new_speed for(var/i in processing) var/obj/item/projectile/P = i if(istype(P)) //there's non projectiles on this too. - P.set_pixel_speed(new_speed) + P.set_pixel_increment_amount(new_speed) /datum/controller/subsystem/processing/projectiles/vv_edit_var(var_name, var_value) switch(var_name) - if(NAMEOF(src, global_pixel_speed)) + if(NAMEOF(src, global_pixel_increment_amount)) set_pixel_speed(var_value) return TRUE else diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 71aa78da4b..55426bf2aa 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -37,9 +37,12 @@ var/datum/point/vector/trajectory var/trajectory_ignore_forcemove = FALSE //instructs forceMove to NOT reset our trajectory to the new location! - var/speed = 0.8 //Amount of deciseconds it takes for projectile to travel - /// "leftover" ticks and stuff yeah. hey when are we rewriting projectiles for the eighth time to do something smarter like incrementing x pixels until it meets a goal instead of for(var/i in 1 to required_moves)? - var/tick_moves_leftover = 0 + /// Pixels moved per second. + var/pixels_per_second = TILES_TO_PIXELS(12.5) + /// The number of pixels we increment by. THIS IS NOT SPEED, DO NOT TOUCH THIS UNLESS YOU KNOW WHAT YOU ARE DOING. In general, lower values means more linetrace accuracy up to a point at cost of performance. + var/pixel_increment_amount + /// "leftover" tick pixelss and stuff yeah, so we don't round off things and introducing tracing inaccuracy. + var/pixels_tick_leftover = 0 var/Angle = 0 var/original_angle = 0 //Angle at firing var/nondirectional_sprite = FALSE //Set TRUE to prevent projectiles from having their sprites rotated based on firing angle @@ -340,7 +343,7 @@ var/datum/point/vector/current = trajectory if(!current) var/turf/T = get_turf(src) - current = new(T.x, T.y, T.z, pixel_x, pixel_y, isnull(forced_angle)? Angle : forced_angle, SSprojectiles.global_pixel_speed) + current = new(T.x, T.y, T.z, pixel_x, pixel_y, isnull(forced_angle)? Angle : forced_angle, pixel_increment_amount || SSprojectiles.global_pixel_increment_amount) var/datum/point/vector/v = current.return_vector_after_increments(moves * SSprojectiles.global_iterations_per_move) return v.return_turf() @@ -358,16 +361,9 @@ return PROCESS_KILL if(paused || !isturf(loc)) return - var/ds = (SSprojectiles.flags & SS_TICKER)? (wait * world.tick_lag) : wait - var/required_moves = ds / speed - var/leftover = MODULUS(required_moves, 1) - tick_moves_leftover += leftover - required_moves = round(required_moves) - if(tick_moves_leftover > 1) - required_moves += round(tick_moves_leftover) - tick_moves_leftover = MODULUS(tick_moves_leftover, 1) - for(var/i in 1 to required_moves) - pixel_move(1, FALSE) + var/required_pixels = (pixels_per_second * (((SSprojectiles.flags & SS_TICKER)? (wait * world.tick_lag) : wait) * 0.1)) + pixels_tick_leftover + pixel_move(round(required_pixels, pixel_increment_amount), FALSE) + pixels_tick_leftover = MODULUS(required_pixels, pixel_increment_amount) /obj/item/projectile/proc/fire(angle, atom/direct_target) if(fired_from) @@ -399,7 +395,7 @@ trajectory_ignore_forcemove = TRUE forceMove(starting) trajectory_ignore_forcemove = FALSE - trajectory = new(starting.x, starting.y, starting.z, pixel_x, pixel_y, Angle, SSprojectiles.global_pixel_speed) + trajectory = new(starting.x, starting.y, starting.z, pixel_x, pixel_y, Angle, pixel_increment_amount || SSprojectiles.global_pixel_increment_amount) last_projectile_move = world.time fired = TRUE if(hitscan) @@ -478,7 +474,7 @@ return //Kill! pixel_move(1, TRUE) -/obj/item/projectile/proc/pixel_move(trajectory_multiplier, hitscanning = FALSE) +/obj/item/projectile/proc/pixel_move(times, hitscanning = FALSE, trajectory_multiplier = 1) if(!loc || !trajectory) return last_projectile_move = world.time @@ -489,7 +485,7 @@ if(homing) process_homing() var/forcemoved = FALSE - for(var/i in 1 to SSprojectiles.global_iterations_per_move) + for(var/i in 1 to times) trajectory.increment(trajectory_multiplier) var/turf/T = trajectory.return_turf() if(!istype(T)) @@ -513,8 +509,8 @@ if(QDELETED(src)) return if(!hitscanning && !forcemoved) - pixel_x = trajectory.return_px() - trajectory.mpx * trajectory_multiplier * SSprojectiles.global_iterations_per_move - pixel_y = trajectory.return_py() - trajectory.mpy * trajectory_multiplier * SSprojectiles.global_iterations_per_move + pixel_x = trajectory.return_px() - trajectory.mpx * times * trajectory_multiplier + pixel_y = trajectory.return_py() - trajectory.mpy * times * trajectory_multiplier animate(src, pixel_x = trajectory.return_px(), pixel_y = trajectory.return_py(), time = 1, flags = ANIMATION_END_NOW) Range() From e684c6e574c9b4a99d46b4e65b583d39193f1e93 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 8 May 2020 22:40:07 -0700 Subject: [PATCH 04/79] ok --- .../hostile/megafauna/demonic_frost_miner.dm | 12 ++++++------ code/modules/projectiles/projectile.dm | 3 ++- code/modules/projectiles/projectile/beams.dm | 2 +- .../projectiles/projectile/bullets/ferromagnetic.dm | 3 ++- .../modules/projectiles/projectile/bullets/sniper.dm | 4 ++-- .../projectile/energy/nuclear_particle.dm | 2 +- code/modules/projectiles/projectile/energy/stun.dm | 2 +- code/modules/projectiles/projectile/magic.dm | 2 +- 8 files changed, 16 insertions(+), 14 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index 3d106021de..6a9e1b7e8d 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -108,7 +108,7 @@ Difficulty: Extremely Hard icon_state = "ice_1" damage = 20 armour_penetration = 100 - speed = 10 + pixels_per_second = TILES_TO_PIXELS(1) homing_turn_speed = 30 damage_type = BURN @@ -122,7 +122,7 @@ Difficulty: Extremely Hard icon_state = "nuclear_particle" damage = 5 armour_penetration = 100 - speed = 4 + pixels_per_second = TILES_TO_PIXELS(2.5) damage_type = BRUTE /obj/item/projectile/ice_blast @@ -130,7 +130,7 @@ Difficulty: Extremely Hard icon_state = "ice_2" damage = 15 armour_penetration = 100 - speed = 4 + pixels_per_second = TILES_TO_PIXELS(2.5) damage_type = BRUTE /obj/item/projectile/ice_blast/on_hit(atom/target, blocked = FALSE) @@ -184,7 +184,7 @@ Difficulty: Extremely Hard if(!startloc || !endloc) break var/obj/item/projectile/ice_blast/P = new(startloc) - P.speed *= projectile_speed_multiplier + P.pixels_per_second *= projectile_speed_multiplier P.preparePixelProjectile(endloc, startloc, null, angle + rand(-10, 10)) P.firer = firer if(original) @@ -200,7 +200,7 @@ Difficulty: Extremely Hard if(!endloc) break var/obj/item/projectile/P = new /obj/item/projectile/snowball(startloc) - P.speed *= projectile_speed_multiplier + P.pixels_per_second *= projectile_speed_multiplier P.preparePixelProjectile(endloc, startloc, null, rand(-spread, spread)) P.firer = src if(target) @@ -219,7 +219,7 @@ Difficulty: Extremely Hard if(!endloc) break var/obj/item/projectile/P = new /obj/item/projectile/ice_blast(startloc) - P.speed *= projectile_speed_multiplier + P.pixels_per_second *= projectile_speed_multiplier P.preparePixelProjectile(endloc, startloc, null, spread) P.firer = src if(target) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 55426bf2aa..1992a02ca1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -337,6 +337,7 @@ return TRUE return FALSE +/// one move is a tile. /obj/item/projectile/proc/return_predicted_turf_after_moves(moves, forced_angle) //I say predicted because there's no telling that the projectile won't change direction/location in flight. if(!trajectory && isnull(forced_angle) && isnull(Angle)) return FALSE @@ -344,7 +345,7 @@ if(!current) var/turf/T = get_turf(src) current = new(T.x, T.y, T.z, pixel_x, pixel_y, isnull(forced_angle)? Angle : forced_angle, pixel_increment_amount || SSprojectiles.global_pixel_increment_amount) - var/datum/point/vector/v = current.return_vector_after_increments(moves * SSprojectiles.global_iterations_per_move) + var/datum/point/vector/v = current.return_vector_after_increments(TILES_TO_PIXELS(moves) / (pixel_increment_amount || SSprojectiles.global_pixel_increment_amount)) return v.return_turf() /obj/item/projectile/proc/return_pathing_turfs_in_moves(moves, forced_angle) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index ee081d57d6..2f12f0f69b 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -74,7 +74,7 @@ flag = "energy" hitsound = 'sound/weapons/tap.ogg' eyeblur = 0 - speed = 0.6 + pixels_per_second = TILES_TO_PIXELS(16.667) impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE tracer_type = /obj/effect/projectile/tracer/disabler diff --git a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm index 2d66e25256..84b105c372 100644 --- a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm +++ b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm @@ -3,6 +3,7 @@ damage = 20 armour_penetration = 20 light_range = 3 + pixels_per_Second = TILES_TO_PIXELS(16.667) speed = 0.6 range = 35 light_color = LIGHT_COLOR_RED @@ -39,7 +40,7 @@ armour_penetration = 20 movement_type = FLYING | UNSTOPPABLE range = 20 - speed = 0.8 + pixels_per_second = TILES_TO_PIXELS(12.5) light_range = 4 light_color = LIGHT_COLOR_RED diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index 5e3ae53806..f69b62a149 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -2,7 +2,7 @@ /obj/item/projectile/bullet/p50 name =".50 bullet" - speed = 0.4 + pixels_per_second = TILES_TO_PIXELS(25) damage = 70 knockdown = 100 dismemberment = 50 @@ -43,5 +43,5 @@ /obj/item/projectile/bullet/p50/penetrator/shuttle //Nukeop Shuttle Variety icon_state = "gaussstrong" damage = 25 - speed = 0.3 + pixels_per_second = TILES_TO_PIXELS(33.33) range = 16 diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm index e08f806fe5..ed98aa283c 100644 --- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -5,7 +5,7 @@ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE flag = "rad" irradiate = 5000 - speed = 0.4 + pixels_per_Second = TILES_TO_PIXELS(25) hitsound = 'sound/weapons/emitter2.ogg' impact_type = /obj/effect/projectile/impact/xray var/static/list/particle_colors = list( diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index e3449a0c1d..83b753e0a3 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -10,7 +10,7 @@ jitter = 20 hitsound = 'sound/weapons/taserhit.ogg' range = 14 - speed = 0.6 + pixels_per_second = TILES_TO_PIXELS(16.667) tracer_type = /obj/effect/projectile/tracer/stun muzzle_type = /obj/effect/projectile/muzzle/stun impact_type = /obj/effect/projectile/impact/stun diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index cb5b280c5e..1694afdaa2 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -435,7 +435,7 @@ damage = 15 damage_type = BURN nodamage = 0 - speed = 0.3 + pixels_per_Second = TILES_TO_PIXELS(33.33) flag = "magic" var/tesla_power = 20000 From 6d6239a8b448f07cf6ffdd81249c2e671676e357 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 8 May 2020 22:59:51 -0700 Subject: [PATCH 05/79] kay --- code/__DEFINES/maths.dm | 2 +- code/__DEFINES/misc.dm | 3 +++ code/game/objects/items/robot/robot_items.dm | 8 ++++---- code/modules/mining/equipment/kinetic_crusher.dm | 2 +- code/modules/projectiles/projectile.dm | 3 ++- .../projectiles/projectile/bullets/ferromagnetic.dm | 2 +- .../projectiles/projectile/energy/nuclear_particle.dm | 2 +- code/modules/projectiles/projectile/special/curse.dm | 2 +- code/world.dm | 1 + 9 files changed, 15 insertions(+), 10 deletions(-) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index f0bc34870b..24726b8058 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -210,4 +210,4 @@ /// Make sure something is a boolean TRUE/FALSE 1/0 value, since things like bitfield & bitflag doesn't always give 1s and 0s. #define FORCE_BOOLEAN(x) ((x)? TRUE : FALSE) -#define TILES_TO_PIXELS(tiles) (tiles * world.icon_size) +#define TILES_TO_PIXELS(tiles) (tiles * PIXELS) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 42095aba41..3b5b16d923 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -9,6 +9,9 @@ #define TEXT_EAST "[EAST]" #define TEXT_WEST "[WEST]" +/// world.icon_size +#define PIXELS 32 + //These get to go at the top, because they're special //You can use these defines to get the typepath of the currently running proc/verb (yes procs + verbs are objects) /* eg: diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index abb2d12a1f..0b6f9c55c8 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -419,7 +419,7 @@ A.BB.damage = hitdamage if(hitdamage) A.BB.nodamage = FALSE - A.BB.speed = 0.5 + A.BB.pixels_per_second = TILES_TO_PIXELS(20) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) A.fire_casing(target, user, params, 0, 0, null, 0, src) user.visible_message("[user] blasts a flying lollipop at [target]!") @@ -434,7 +434,7 @@ A.BB.damage = hitdamage if(hitdamage) A.BB.nodamage = FALSE - A.BB.speed = 0.5 + A.BB.pixels_per_second = TILES_TO_PIXELS(20) A.BB.color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) playsound(src.loc, 'sound/weapons/bulletflyby3.ogg', 50, 1) A.fire_casing(target, user, params, 0, 0, null, 0, src) @@ -671,13 +671,13 @@ if(track_projectile) tracked[P] = P.damage P.damage *= projectile_damage_coefficient - P.speed *= projectile_speed_coefficient + P.pixels_per_second *= projectile_speed_coefficient P.add_overlay(projectile_effect) /obj/item/borg/projectile_dampen/proc/restore_projectile(obj/item/projectile/P) tracked -= P P.damage *= (1/projectile_damage_coefficient) - P.speed *= (1/projectile_speed_coefficient) + P.pixels_per_second *= (1/projectile_speed_coefficient) P.cut_overlay(projectile_effect) /********************************************************************** diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 1fd1b31b69..dcd8e1a4ae 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -417,7 +417,7 @@ marker.icon_state = "chronobolt" marker.damage = bonus_value marker.nodamage = FALSE - marker.speed = 2 + marker.pixels_per_second = TILES_TO_PIXELS(5) deadly_shot = FALSE /obj/item/crusher_trophy/blaster_tubes/on_mark_detonation(mob/living/target, mob/living/user) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 1992a02ca1..dac6e0c33f 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -448,7 +448,8 @@ else return ..() -/obj/item/projectile/proc/set_pixel_speed(new_speed) +/obj/item/projectile/proc/set_pixel_increment_amount(new_speed) + pixel_increment_amount = new_speed if(trajectory) trajectory.set_speed(new_speed) return TRUE diff --git a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm index 84b105c372..4f506a4de3 100644 --- a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm +++ b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm @@ -3,7 +3,7 @@ damage = 20 armour_penetration = 20 light_range = 3 - pixels_per_Second = TILES_TO_PIXELS(16.667) + pixels_per_second = TILES_TO_PIXELS(16.667) speed = 0.6 range = 35 light_color = LIGHT_COLOR_RED diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm index ed98aa283c..6cbe258560 100644 --- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -5,7 +5,7 @@ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE flag = "rad" irradiate = 5000 - pixels_per_Second = TILES_TO_PIXELS(25) + pixels_per_second = TILES_TO_PIXELS(25) hitsound = 'sound/weapons/emitter2.ogg' impact_type = /obj/effect/projectile/impact/xray var/static/list/particle_colors = list( diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index 99aa922622..d967540e6a 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -10,7 +10,7 @@ damage_type = BURN damage = 10 knockdown = 20 - speed = 2 + pixels_per_second = TILES_TO_PIXELS(5) range = 16 movement_type = FLYING | UNSTOPPABLE var/datum/beam/arm diff --git a/code/world.dm b/code/world.dm index 344ca9be79..1a6be04bc1 100644 --- a/code/world.dm +++ b/code/world.dm @@ -9,6 +9,7 @@ hub = "Exadv1.spacestation13" name = "/tg/ Station 13" fps = 20 + icon_size = PIXELS #ifdef FIND_REF_NO_CHECK_TICK loop_checks = FALSE #endif From 19072abe370ec63115b83c2badc93a9069201ca9 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 8 May 2020 23:01:05 -0700 Subject: [PATCH 06/79] compile --- .../mob/living/simple_animal/hostile/megafauna/colossus.dm | 2 +- .../living/simple_animal/hostile/mining_mobs/elites/herald.dm | 2 +- code/modules/projectiles/projectile/bullets/ferromagnetic.dm | 1 - code/modules/projectiles/projectile/magic.dm | 2 +- modular_citadel/code/modules/projectiles/guns/pumpenergy.dm | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 73fb9d4e48..2a9a807a6b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -210,7 +210,7 @@ Difficulty: Very Hard icon_state= "chronobolt" damage = 25 armour_penetration = 100 - speed = 2 + pixels_per_second = TILES_TO_PIXELS(5) eyeblur = 0 damage_type = BRUTE pass_flags = PASSTABLE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index 884e3bb989..c2d9eb4205 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -218,7 +218,7 @@ icon_state= "chronobolt" damage = 15 armour_penetration = 60 - speed = 2 + pixels_per_second = TILES_TO_PIXELS(5) eyeblur = 0 damage_type = BRUTE pass_flags = PASSTABLE diff --git a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm index 4f506a4de3..78deff601f 100644 --- a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm +++ b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm @@ -4,7 +4,6 @@ armour_penetration = 20 light_range = 3 pixels_per_second = TILES_TO_PIXELS(16.667) - speed = 0.6 range = 35 light_color = LIGHT_COLOR_RED diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 1694afdaa2..982fe8b222 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -435,7 +435,7 @@ damage = 15 damage_type = BURN nodamage = 0 - pixels_per_Second = TILES_TO_PIXELS(33.33) + pixels_per_second = TILES_TO_PIXELS(33.33) flag = "magic" var/tesla_power = 20000 diff --git a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm index bcc156a22e..03a124e306 100644 --- a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm +++ b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm @@ -178,7 +178,7 @@ name = "positron blast" damage = 80 range = 14 - speed = 0.6 + pixels_per_second = TILES_TO_PIXELS(16.667) icon_state = "disablerslug" /obj/item/projectile/beam/pump From 0f157204eb27dd6b1ee689fa46a93dbca2fe8235 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 8 May 2020 23:02:41 -0700 Subject: [PATCH 07/79] compile --- .../living/simple_animal/hostile/megafauna/blood_drunk_miner.dm | 1 + code/world.dm | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index fd278eb438..72475b6d3b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -75,6 +75,7 @@ Difficulty: Medium /obj/item/projectile/kinetic/miner damage = 40 + pixels_per_secdon = TILES_TO_PIXELS(11.111) speed = 0.9 icon_state = "ka_tracer" range = MINER_DASH_RANGE diff --git a/code/world.dm b/code/world.dm index 1a6be04bc1..344ca9be79 100644 --- a/code/world.dm +++ b/code/world.dm @@ -9,7 +9,6 @@ hub = "Exadv1.spacestation13" name = "/tg/ Station 13" fps = 20 - icon_size = PIXELS #ifdef FIND_REF_NO_CHECK_TICK loop_checks = FALSE #endif From a66aad9b70a33896e406ef40c5cae27eb3214e2b Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 8 May 2020 23:03:44 -0700 Subject: [PATCH 08/79] compile --- .../simple_animal/hostile/megafauna/blood_drunk_miner.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 72475b6d3b..b18fe1a54d 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -75,8 +75,7 @@ Difficulty: Medium /obj/item/projectile/kinetic/miner damage = 40 - pixels_per_secdon = TILES_TO_PIXELS(11.111) - speed = 0.9 + pixels_per_second = TILES_TO_PIXELS(11.111) icon_state = "ka_tracer" range = MINER_DASH_RANGE From a380e718726ffff67daae38e9fb2121db51ec8ac Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 9 May 2020 00:16:29 -0700 Subject: [PATCH 09/79] a --- code/modules/projectiles/projectile.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index dac6e0c33f..2bda65c608 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -396,7 +396,9 @@ trajectory_ignore_forcemove = TRUE forceMove(starting) trajectory_ignore_forcemove = FALSE - trajectory = new(starting.x, starting.y, starting.z, pixel_x, pixel_y, Angle, pixel_increment_amount || SSprojectiles.global_pixel_increment_amount) + if(isnull(pixel_increment_amount)) + pixel_increment_amount = SSprojectiles.global_pixel_increment_amount + trajectory = new(starting.x, starting.y, starting.z, pixel_x, pixel_y, Angle, pixel_increment_amount) last_projectile_move = world.time fired = TRUE if(hitscan) From b30dd2c1f2c667dc7fd09a68626da79ba90ef601 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 9 May 2020 08:06:42 -0700 Subject: [PATCH 10/79] okay --- code/__HELPERS/angles.dm | 39 ++++++++++++++++++++++ code/__HELPERS/unsorted.dm | 24 -------------- code/modules/projectiles/projectile.dm | 46 +++++++++++++------------- tgstation.dme | 1 + 4 files changed, 63 insertions(+), 47 deletions(-) create mode 100644 code/__HELPERS/angles.dm diff --git a/code/__HELPERS/angles.dm b/code/__HELPERS/angles.dm new file mode 100644 index 0000000000..aa39ee4f6e --- /dev/null +++ b/code/__HELPERS/angles.dm @@ -0,0 +1,39 @@ +/proc/get_projectile_angle(atom/source, atom/target) + var/sx = source.x * world.icon_size + var/sy = source.y * world.icon_size + var/tx = target.x * world.icon_size + var/ty = target.y * world.icon_size + var/atom/movable/AM + if(ismovable(source)) + AM = source + sx += AM.step_x + sy += AM.step_y + if(ismovable(target)) + AM = target + tx += AM.step_x + ty += AM.step_y + return SIMPLIFY_DEGREES(arctan(tx - sx, ty - sy)) + +/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. + if(!start || !end) + return 0 + var/dy + var/dx + dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) + dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x) + if(!dy) + return (dx>=0)?90:270 + .=arctan(dx/dy) + if(dy<0) + .+=180 + else if(dx<0) + .+=360 + +/proc/Get_Pixel_Angle(var/y, var/x)//for getting the angle when animating something's pixel_x and pixel_y + if(!y) + return (x>=0)?90:270 + .=arctan(x/y) + if(y<0) + .+=180 + else if(x<0) + .+=360 diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 13ac820778..08bcf58292 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -17,30 +17,6 @@ var/textb = copytext(HTMLstring, 6, 8) return rgb(255 - hex2num(textr), 255 - hex2num(textg), 255 - hex2num(textb)) -/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. - if(!start || !end) - return 0 - var/dy - var/dx - dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) - dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x) - if(!dy) - return (dx>=0)?90:270 - .=arctan(dx/dy) - if(dy<0) - .+=180 - else if(dx<0) - .+=360 - -/proc/Get_Pixel_Angle(var/y, var/x)//for getting the angle when animating something's pixel_x and pixel_y - if(!y) - return (x>=0)?90:270 - .=arctan(x/y) - if(y<0) - .+=180 - else if(x<0) - .+=360 - //Returns location. Returns null if no location was found. /proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = FALSE, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) /* diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 2bda65c608..f7ef721cba 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -32,7 +32,6 @@ //Fired processing vars var/fired = FALSE //Have we been fired yet var/paused = FALSE //for suspending the projectile midair - var/last_projectile_move = 0 var/time_offset = 0 var/datum/point/vector/trajectory var/trajectory_ignore_forcemove = FALSE //instructs forceMove to NOT reset our trajectory to the new location! @@ -78,12 +77,16 @@ //Homing var/homing = FALSE var/atom/homing_target - var/homing_turn_speed = 10 //Angle per tick. + /// How fast the projectile turns towards its homing targets, in angle per second. + var/homing_turn_speed = 100 var/homing_inaccuracy_min = 0 //in pixels for these. offsets are set once when setting target. var/homing_inaccuracy_max = 0 var/homing_offset_x = 0 var/homing_offset_y = 0 + /// How many deciseconds are each hitscan movement considered + var/hitscan_movement_decisecond_equivalency = 0.1 + var/ignore_source_check = FALSE var/damage = 10 @@ -362,9 +365,10 @@ return PROCESS_KILL if(paused || !isturf(loc)) return + var/required_pixels = (pixels_per_second * (((SSprojectiles.flags & SS_TICKER)? (wait * world.tick_lag) : wait) * 0.1)) + pixels_tick_leftover - pixel_move(round(required_pixels, pixel_increment_amount), FALSE) pixels_tick_leftover = MODULUS(required_pixels, pixel_increment_amount) + pixel_move(FLOOR(required_pixels / pixel_increment_amount, pixel_increment_amount), FALSE) /obj/item/projectile/proc/fire(angle, atom/direct_target) if(fired_from) @@ -387,7 +391,7 @@ qdel(src) return var/turf/target = locate(clamp(starting + xo, 1, world.maxx), clamp(starting + yo, 1, world.maxy), starting.z) - setAngle(Get_Angle(src, target)) + setAngle(get_projectile_angle(src, target)) original_angle = Angle if(!nondirectional_sprite) var/matrix/M = new @@ -399,7 +403,6 @@ if(isnull(pixel_increment_amount)) pixel_increment_amount = SSprojectiles.global_pixel_increment_amount trajectory = new(starting.x, starting.y, starting.z, pixel_x, pixel_y, Angle, pixel_increment_amount) - last_projectile_move = world.time fired = TRUE if(hitscan) process_hitscan() @@ -476,20 +479,26 @@ if(!QDELETED(src)) qdel(src) return //Kill! - pixel_move(1, TRUE) + pixel_move(1, TRUE, hitscan_movement_decisecond_equivalency) /obj/item/projectile/proc/pixel_move(times, hitscanning = FALSE, trajectory_multiplier = 1) if(!loc || !trajectory) return - last_projectile_move = world.time if(!nondirectional_sprite && !hitscanning) var/matrix/M = new M.Turn(Angle) transform = M - if(homing) - process_homing() var/forcemoved = FALSE + var/turf/oldloc = loc + var/old_px = pixel_x + var/old_py = pixel_y for(var/i in 1 to times) + // HOMING START - Too expensive to proccall at this point. + if(homing_target) + // No datum/points, too expensive. + var/angle = closer_angle_difference(Angle, get_projectile_angle(src, homing_target)) + setAngle(Angle + clamp(angle, -homing_turn_speed, homing_turn_speed)) + // HOMING END trajectory.increment(trajectory_multiplier) var/turf/T = trajectory.return_turf() if(!istype(T)) @@ -513,20 +522,11 @@ if(QDELETED(src)) return if(!hitscanning && !forcemoved) - pixel_x = trajectory.return_px() - trajectory.mpx * times * trajectory_multiplier - pixel_y = trajectory.return_py() - trajectory.mpy * times * trajectory_multiplier - animate(src, pixel_x = trajectory.return_px(), pixel_y = trajectory.return_py(), time = 1, flags = ANIMATION_END_NOW) + pixel_x = ((oldloc.x - x) * world.icon_size) + old_px + pixel_y = ((oldloc.y - y) * world.icon_size) + old_py + animate(src, pixel_x = trajectory.return_px(), pixel_y = trajectory.return_py(), time = ((SSprojectiles.flags & SS_TICKER)? (SSprojectiles.wait * world.tick_lag) : SSprojectiles.wait), flags = ANIMATION_END_NOW) Range() -/obj/item/projectile/proc/process_homing() //may need speeding up in the future performance wise. - if(!homing_target) - return FALSE - var/datum/point/PT = RETURN_PRECISE_POINT(homing_target) - PT.x += clamp(homing_offset_x, 1, world.maxx) - PT.y += clamp(homing_offset_y, 1, world.maxy) - var/angle = closer_angle_difference(Angle, angle_between_points(RETURN_PRECISE_POINT(src), PT)) - setAngle(Angle + clamp(angle, -homing_turn_speed, homing_turn_speed)) - /obj/item/projectile/proc/set_homing_target(atom/A) if(!A || (!isturf(A) && !isturf(A.loc))) return FALSE @@ -575,7 +575,7 @@ if(targloc || !params) yo = targloc.y - curloc.y xo = targloc.x - curloc.x - setAngle(Get_Angle(src, targloc) + spread) + setAngle(get_projectile_angle(src, targloc) + spread) if(isliving(source) && params) var/list/calculated = calculate_projectile_angle_and_pixel_offsets(source, params) @@ -586,7 +586,7 @@ else if(targloc) yo = targloc.y - curloc.y xo = targloc.x - curloc.x - setAngle(Get_Angle(src, targloc) + spread) + setAngle(get_projectile_angle(src, targloc) + spread) else stack_trace("WARNING: Projectile [type] fired without either mouse parameters, or a target atom to aim at!") qdel(src) diff --git a/tgstation.dme b/tgstation.dme index dc02385b48..c594c0d07f 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -135,6 +135,7 @@ #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" +#include "code\__HELPERS\angles.dm" #include "code\__HELPERS\areas.dm" #include "code\__HELPERS\AStar.dm" #include "code\__HELPERS\cmp.dm" From 824d967241550aa519de5179538de2849b31b10b Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 9 May 2020 08:26:54 -0700 Subject: [PATCH 11/79] i love math --- code/__HELPERS/angles.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__HELPERS/angles.dm b/code/__HELPERS/angles.dm index aa39ee4f6e..a3fc2404bd 100644 --- a/code/__HELPERS/angles.dm +++ b/code/__HELPERS/angles.dm @@ -12,7 +12,7 @@ AM = target tx += AM.step_x ty += AM.step_y - return SIMPLIFY_DEGREES(arctan(tx - sx, ty - sy)) + return SIMPLIFY_DEGREES(arctan(ty - sy, tx - sx)) /proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. if(!start || !end) From 4f68eacfaaaf1256ee5fad3abb68e813c3da56e1 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 9 May 2020 08:40:15 -0700 Subject: [PATCH 12/79] aa --- code/modules/projectiles/projectile.dm | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index f7ef721cba..95133b65e9 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -35,13 +35,16 @@ var/time_offset = 0 var/datum/point/vector/trajectory var/trajectory_ignore_forcemove = FALSE //instructs forceMove to NOT reset our trajectory to the new location! + /// "leftover" pixels for Range() calculation as pixel_move() was moved to simulated semi-pixel movement and Range() is in tiles. + var/pixels_range_leftover = 0 + /// "leftover" tick pixels and stuff yeah, so we don't round off things and introducing tracing inaccuracy. + var/pixels_tick_leftover = 0 /// Pixels moved per second. var/pixels_per_second = TILES_TO_PIXELS(12.5) /// The number of pixels we increment by. THIS IS NOT SPEED, DO NOT TOUCH THIS UNLESS YOU KNOW WHAT YOU ARE DOING. In general, lower values means more linetrace accuracy up to a point at cost of performance. var/pixel_increment_amount - /// "leftover" tick pixelss and stuff yeah, so we don't round off things and introducing tracing inaccuracy. - var/pixels_tick_leftover = 0 + var/Angle = 0 var/original_angle = 0 //Angle at firing var/nondirectional_sprite = FALSE //Set TRUE to prevent projectiles from having their sprites rotated based on firing angle @@ -94,7 +97,8 @@ var/nodamage = 0 //Determines if the projectile will skip any damage inflictions var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb var/projectile_type = /obj/item/projectile - var/range = 50 //This will de-increment every step. When 0, it will deletze the projectile. + /// Range of the projectile, de-incrementing every step. The projectile deletes itself at 0. This is in tiles. + var/range = 50 var/decayedRange //stores original range var/reflect_range_decrease = 5 //amount of original range that falls off when reflecting, so it doesn't go forever var/is_reflectable = FALSE // Can it be reflected or not? @@ -126,6 +130,10 @@ permutated = list() decayedRange = range +/** + * Artificially modified to be called at around every world.icon_size pixels of movement. + * WARNING: Range() can only be called once per pixel_increment_amount pixels. + */ /obj/item/projectile/proc/Range() range-- if(range <= 0 && loc) @@ -367,8 +375,11 @@ return var/required_pixels = (pixels_per_second * (((SSprojectiles.flags & SS_TICKER)? (wait * world.tick_lag) : wait) * 0.1)) + pixels_tick_leftover - pixels_tick_leftover = MODULUS(required_pixels, pixel_increment_amount) - pixel_move(FLOOR(required_pixels / pixel_increment_amount, pixel_increment_amount), FALSE) + if(required_pixels > pixel_increment_amount) + pixels_tick_leftover = MODULUS(required_pixels, pixel_increment_amount) + pixel_move(FLOOR(required_pixels / pixel_increment_amount, pixel_increment_amount), FALSE) + else + pixels_tick_leftover += required_pixels /obj/item/projectile/proc/fire(angle, atom/direct_target) if(fired_from) @@ -521,11 +532,14 @@ step_towards(src, T) if(QDELETED(src)) return + pixels_tick_leftover += pixel_increment_amount + if(pixels_tick_leftover > world.icon_size) + Range() + pixels_tick_leftover -= world.icon_size if(!hitscanning && !forcemoved) pixel_x = ((oldloc.x - x) * world.icon_size) + old_px pixel_y = ((oldloc.y - y) * world.icon_size) + old_py animate(src, pixel_x = trajectory.return_px(), pixel_y = trajectory.return_py(), time = ((SSprojectiles.flags & SS_TICKER)? (SSprojectiles.wait * world.tick_lag) : SSprojectiles.wait), flags = ANIMATION_END_NOW) - Range() /obj/item/projectile/proc/set_homing_target(atom/A) if(!A || (!isturf(A) && !isturf(A.loc))) From 707ef069ef1f88b2e6f342e8275064e5bec4b228 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 9 May 2020 08:45:56 -0700 Subject: [PATCH 13/79] why --- code/modules/projectiles/projectile.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 95133b65e9..dc395707f1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -375,7 +375,7 @@ return var/required_pixels = (pixels_per_second * (((SSprojectiles.flags & SS_TICKER)? (wait * world.tick_lag) : wait) * 0.1)) + pixels_tick_leftover - if(required_pixels > pixel_increment_amount) + if(required_pixels >= pixel_increment_amount) pixels_tick_leftover = MODULUS(required_pixels, pixel_increment_amount) pixel_move(FLOOR(required_pixels / pixel_increment_amount, pixel_increment_amount), FALSE) else @@ -532,10 +532,10 @@ step_towards(src, T) if(QDELETED(src)) return - pixels_tick_leftover += pixel_increment_amount - if(pixels_tick_leftover > world.icon_size) + pixels_range_leftover += pixel_increment_amount + if(pixels_range_leftover > world.icon_size) Range() - pixels_tick_leftover -= world.icon_size + pixels_range_leftover -= world.icon_size if(!hitscanning && !forcemoved) pixel_x = ((oldloc.x - x) * world.icon_size) + old_px pixel_y = ((oldloc.y - y) * world.icon_size) + old_py From 5bc19fd8e31b70b33657e52fd22d8e6152ad373e Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 9 May 2020 09:08:14 -0700 Subject: [PATCH 14/79] math lmao --- code/modules/projectiles/projectile.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index dc395707f1..1c676d0db2 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -377,9 +377,9 @@ var/required_pixels = (pixels_per_second * (((SSprojectiles.flags & SS_TICKER)? (wait * world.tick_lag) : wait) * 0.1)) + pixels_tick_leftover if(required_pixels >= pixel_increment_amount) pixels_tick_leftover = MODULUS(required_pixels, pixel_increment_amount) - pixel_move(FLOOR(required_pixels / pixel_increment_amount, pixel_increment_amount), FALSE) + pixel_move(FLOOR(required_pixels / pixel_increment_amount, 1), FALSE) else - pixels_tick_leftover += required_pixels + pixels_tick_leftover = required_pixels /obj/item/projectile/proc/fire(angle, atom/direct_target) if(fired_from) From 6993aa20ce6a10606b8b79c8b888a3d16868d153 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 9 May 2020 09:18:57 -0700 Subject: [PATCH 15/79] ok --- code/modules/mob/living/carbon/human/human.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5d097c0f54..2623574a73 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1059,6 +1059,9 @@ if(health_deficiency >= 40) add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown, TRUE, (health_deficiency-39) / 75) add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying, TRUE, (health_deficiency-39) / 25) + else + remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) + remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying) else remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying) From c94644ee31a2c624ff222ff2480705bb7b7138cd Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 9 May 2020 13:47:11 -0700 Subject: [PATCH 16/79] ok --- code/modules/projectiles/projectile.dm | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 1c676d0db2..72a88d6518 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -87,7 +87,7 @@ var/homing_offset_x = 0 var/homing_offset_y = 0 - /// How many deciseconds are each hitscan movement considered + /// How many deciseconds are each hitscan movement considered. Used for homing and other things that use seconds for timing rather than ticks. var/hitscan_movement_decisecond_equivalency = 0.1 var/ignore_source_check = FALSE @@ -373,11 +373,12 @@ return PROCESS_KILL if(paused || !isturf(loc)) return - - var/required_pixels = (pixels_per_second * (((SSprojectiles.flags & SS_TICKER)? (wait * world.tick_lag) : wait) * 0.1)) + pixels_tick_leftover + + var/ds = (SSprojectiles.flags & SS_TICKER)? (wait * world.tick_lag) : wait + var/required_pixels = (pixels_per_second * ds * 0.1) + pixels_tick_leftover if(required_pixels >= pixel_increment_amount) pixels_tick_leftover = MODULUS(required_pixels, pixel_increment_amount) - pixel_move(FLOOR(required_pixels / pixel_increment_amount, 1), FALSE) + pixel_move(FLOOR(required_pixels / pixel_increment_amount, 1), FALSE, ) else pixels_tick_leftover = required_pixels @@ -417,6 +418,7 @@ fired = TRUE if(hitscan) process_hitscan() + return if(!(datum_flags & DF_ISPROCESSING)) START_PROCESSING(SSprojectiles, src) pixel_move(1, FALSE) //move it now! @@ -478,6 +480,7 @@ beam_segments[beam_index] = null //record start. /obj/item/projectile/proc/process_hitscan() + var/ttm = round(world.icon_size / pixel_increment_amount, 1) var/safety = range * 10 record_hitscan_start(RETURN_POINT_VECTOR_INCREMENT(src, Angle, MUZZLE_EFFECT_PIXEL_INCREMENT, 1)) while(loc && !QDELETED(src)) @@ -490,9 +493,15 @@ if(!QDELETED(src)) qdel(src) return //Kill! - pixel_move(1, TRUE, hitscan_movement_decisecond_equivalency) + pixel_move(ttm, TRUE, hitscan_movement_decisecond_equivalency) -/obj/item/projectile/proc/pixel_move(times, hitscanning = FALSE, trajectory_multiplier = 1) +/** + * The proc to make the projectile go, using a simulated pixel movement line trace. + * Note: deciseconds_equivalent is currently only used for homing, times is the number of times to move pixel_increment_amount. + * Trajectory multiplier directly modifies the factor of pixel_increment_amount to go per time. + * It's complicated, so probably just don'ot mess with this unless you know what you're doing. + */ +/obj/item/projectile/proc/pixel_move(times, hitscanning = FALSE, deciseconds_equivalent = world.tick_lag, trajectory_multiplier = 1) if(!loc || !trajectory) return if(!nondirectional_sprite && !hitscanning) @@ -508,7 +517,8 @@ if(homing_target) // No datum/points, too expensive. var/angle = closer_angle_difference(Angle, get_projectile_angle(src, homing_target)) - setAngle(Angle + clamp(angle, -homing_turn_speed, homing_turn_speed)) + var/max_turn = homing_turn_speed * deciseconds_equivalent * 0.1 + setAngle(Angle + clamp(angle, -max_turn, max_turn)) // HOMING END trajectory.increment(trajectory_multiplier) var/turf/T = trajectory.return_turf() @@ -535,6 +545,8 @@ pixels_range_leftover += pixel_increment_amount if(pixels_range_leftover > world.icon_size) Range() + if(QDELETED(src)) + return pixels_range_leftover -= world.icon_size if(!hitscanning && !forcemoved) pixel_x = ((oldloc.x - x) * world.icon_size) + old_px From 40eeb1d9b89a7e9511fe5a914f807edd1510751c Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sun, 10 May 2020 14:38:50 +0200 Subject: [PATCH 17/79] A little airlock electronics tgui Fix, courtesy of YakumoChen --- tgui-next/packages/tgui/interfaces/AirlockElectronics.js | 4 ++-- tgui-next/packages/tgui/public/tgui.bundle.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tgui-next/packages/tgui/interfaces/AirlockElectronics.js b/tgui-next/packages/tgui/interfaces/AirlockElectronics.js index 680849e649..f42afd1de2 100644 --- a/tgui-next/packages/tgui/interfaces/AirlockElectronics.js +++ b/tgui-next/packages/tgui/interfaces/AirlockElectronics.js @@ -79,7 +79,7 @@ export const AirlockElectronics = props => { />