Skip to content

Commit

Permalink
Increases the "fun" level of singularities (and some fixes because wo…
Browse files Browse the repository at this point in the history
…o sidetracking) (#2589)

Co-authored-by: Bokkiewokkie <[email protected]>
  • Loading branch information
DeltaFire15 and Bokkiewokkie authored Jan 12, 2024
1 parent 7c8be88 commit eba4fe9
Show file tree
Hide file tree
Showing 10 changed files with 154 additions and 40 deletions.
5 changes: 5 additions & 0 deletions code/__DEFINES/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -403,3 +403,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_SUIT_SENSORS "suit_sensors"
///Mob is tracked by nanites, and on glob suit sensors list
#define TRAIT_NANITE_SENSORS "nanite_sensors"

//NSV13 traits
#define TRAIT_NODAMPENERS "nodampeners" //! Prevents a ship with this trait from using dampeners.
#define TRAIT_SOURCE_OVERMAP_BLACKHOLE "overmap_singularity"
//NSV13 traits end
5 changes: 4 additions & 1 deletion code/_globalvars/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,10 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_DOOR_PRYER" = TRAIT_DOOR_PRYER,
"TRAIT_FISH_SAFE_STORAGE" = TRAIT_FISH_SAFE_STORAGE,
"TRAIT_FISH_CASE_COMPATIBILE" = TRAIT_FISH_CASE_COMPATIBILE
)
),
/obj/structure/overmap = list(
"TRAIT_NODAMPENERS" = TRAIT_NODAMPENERS
),
))

/// value -> trait name, generated on use from trait_by_type global
Expand Down
7 changes: 6 additions & 1 deletion code/modules/mob/living/silicon/silicon.dm
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,12 @@
return FALSE

/mob/living/silicon/handle_high_gravity(gravity)
return
//NSV13 - silicons are not fully grav immune, only very resistant.
if(gravity <= GRAVITY_DAMAGE_TRESHOLD + 5) //5G additional tolerance. Magicnumber to avoid touching base defines.
return
gravity -= 5 //3 is base tolerance, this adds 5 onto it for the total of 8.
return ..()
//NSV13 end.

/mob/living/silicon/rust_heretic_act()
adjustBruteLoss(500)
Expand Down
1 change: 1 addition & 0 deletions nsv13.dme
Original file line number Diff line number Diff line change
Expand Up @@ -3923,6 +3923,7 @@
#include "nsv13\code\modules\mob\dead\observer\oberserver.dm"
#include "nsv13\code\modules\mob\living\carbon\carbon.dm"
#include "nsv13\code\modules\mob\living\carbon\examine_tgui.dm"
#include "nsv13\code\modules\mob\living\carbon\human\human.dm"
#include "nsv13\code\modules\mob\living\carbon\human\nsv_emotes.dm"
#include "nsv13\code\modules\mob\living\carbon\human\nsv_human_helpers.dm"
#include "nsv13\code\modules\mob\living\carbon\human\species_types\catgirl.dm"
Expand Down
114 changes: 86 additions & 28 deletions nsv13/code/controllers/subsystem/starsystem.dm
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ Returns a faction datum by its name (case insensitive!)
owner = sys_info["owner"],
hidden = sys_info["hidden"],
sector = sys_info["sector"],
adjacency_list = json_decode(sys_info["adjacency_list"]),
adjacency_list = json_decode(sys_info["adjacency_list"]) || list(),
//Optional props. Recommended, but can be left blank.
threat_level = LAZYACCESS(sys_info, "threat_level") || THREAT_LEVEL_NONE,
is_capital = LAZYACCESS(sys_info, "is_capital") || FALSE,
Expand All @@ -143,7 +143,7 @@ Returns a faction datum by its name (case insensitive!)
)
systems += next
}
catch(var/exception/e){
catch(var/exception/e){ //Please avoid using trycatch, you CANNOT debug try-catch. It's doesn't RUNTIME TRACK trycatch. Breakpoints do not trigger in trycatch. Fix runtimes or failure proof the system instead so nobody has to manually tear apart the trycatch while debugging.
message_admins("WARNING: Invalid star system in json: [sys_info["name"]] ([e]). Skipping...")
continue
}
Expand Down Expand Up @@ -184,13 +184,7 @@ Returns a faction datum by its name (case insensitive!)
for(var/datum/star_system/S in systems)
if(S == null || istype(S, /datum/star_system/random))
continue
var/list/initial_adjacency_list = initial(S.adjacency_list) //Don't copy adjacency changes from wormholes or badmins (this is just a lazy fix right now)
var/list/adjusted_adjacency_list = initial_adjacency_list.Copy()
//Don't cache randomized systems in adjacency matrices.
for(var/system_name in adjusted_adjacency_list)
var/datum/star_system/SS = system_by_id(system_name)
if(istype(SS, /datum/star_system/random))
adjusted_adjacency_list.Remove(system_name)
var/list/adjusted_adjacency_list = S.initial_adjacencies.Copy() //Don't copy adjacency changes from wormholes or badmins
/*var/list/adjusted_wormhole_connections = S.wormhole_connections.Copy() Not saving this right now, since wormholes spawn randomly
for(var/system_name in adjusted_wormhole_connections)
var/datum/star_system/SS = system_by_id(system_name)
Expand All @@ -209,7 +203,7 @@ Returns a faction datum by its name (case insensitive!)
"system_traits"=isnum(S.system_traits) ? S.system_traits : NONE,
"is_capital"=S.is_capital,
"adjacency_list"=json_encode(adjusted_adjacency_list),
"wormhole_connections"=S.wormhole_connections,
"wormhole_connections"=/*json_encode(S.wormhole_connections)*/json_encode(list()), //If you want to to have mapped wormholes stay, copy how I do adjacency lists or tell me. Do not initial and do not preserve random ones like it would if I just fixed the saving. -Delta
"fleet_type" = S.fleet_type,
//Coords, props.
"x" = S.x,
Expand Down Expand Up @@ -421,6 +415,8 @@ Returns a faction datum by its name (case insensitive!)
var/system_traits = NONE
var/is_capital = FALSE
var/list/adjacency_list = list() //Which systems are near us, by name
///List of adjacencies this system started with. Should never be edited. Cannot be initialed due to the json loading to system adjacencies.
var/list/initial_adjacencies = list()
var/occupying_z = 0 //What Z-level is this currently stored on? This will always be a number, as Z-levels are "held" by ships.
var/list/wormhole_connections = list() //Where did we dun go do the wormhole to honk
var/fleet_type = null //Wanna start this system with a fleet in it?
Expand Down Expand Up @@ -449,6 +445,12 @@ Returns a faction datum by its name (case insensitive!)
message_admins("WARNING: Invalid startup_proc declared for [name]! Review your defines (~L438, starsystem.dm), please.")
return 1

/datum/star_system/vv_edit_var(var_name, var_value)
var/list/banned_edits = list(NAMEOF(src, initial_adjacencies))
if(var_name in banned_edits)
return FALSE //Don't you dare break the json.
return ..()

/datum/star_system/New(name, desc, threat_level, alignment, owner, hidden, system_type, system_traits, is_capital, adjacency_list, wormhole_connections, fleet_type, x, y, parallax_property, visitable, sector, is_hypergate, preset_trader, audio_cues, startup_proc)
. = ..()
//Load props first.
Expand All @@ -471,7 +473,9 @@ Returns a faction datum by its name (case insensitive!)
if(is_capital)
src.is_capital = is_capital
if(adjacency_list)
src.adjacency_list = adjacency_list
var/list/cast_adjacency_list = adjacency_list
src.adjacency_list = cast_adjacency_list
src.initial_adjacencies = cast_adjacency_list.Copy()
if(wormhole_connections)
src.wormhole_connections = wormhole_connections
if(fleet_type)
Expand Down Expand Up @@ -598,6 +602,11 @@ Returns a faction datum by its name (case insensitive!)
pixel_y = -64
specialist_research_type = TECHWEB_POINT_TYPE_WORMHOLE

#define OVERMAP_SINGULARITY_PROX_GRAVITY 2
#define OVERMAP_SINGULARITY_REDSHIFT_GRAV 3.5
#define OVERMAP_SINGULARITY_DANGER_GRAV 5
#define OVERMAP_SINGULARITY_DEATH_GRAV 40

/obj/effect/overmap_anomaly/singularity
name = "Black hole"
desc = "A peek into the void between worlds. These stellar demons consume everything in their path. Including you. Scanning this singularity could lead to groundbreaking discoveries in the field of quantum physics!"
Expand All @@ -606,12 +615,22 @@ Returns a faction datum by its name (case insensitive!)
research_points = 20000 //These things are pretty damn valuable, for their risk of course.
pixel_x = -64
pixel_y = -64
///Overmap objects currently being in range of the black hole
var/list/affecting = list()
///Assoc list that tracks which grav we already made the ship suffer
var/list/grav_tracker = list()
///Previous colors of overmaps before being discolored, to preserve fighters
var/list/cached_colours = list()
var/event_horizon_range = 15 //Point of no return. Getting this close will require an emergency FTL jump or shuttle call.
///Range closer than which things get a lot more dangerous.
var/event_horizon_range = 15
///Range closer than which starts discoloring everything into red
var/redshift_range = 30
var/influence_range = 100
var/base_pull_strength = 0.10
///Total range of the black hole influence
var/influence_range = 90 //Slightly less since it loops now.
///Gravity pull when being close
var/inner_pull_strength = 0.2 //Somewhat more since the vectors get correctly calced now.
///Gravity pull while far away
var/outer_pull_strength = 0.1

/obj/effect/overmap_anomaly/singularity/Initialize(mapload)
. = ..()
Expand All @@ -626,45 +645,84 @@ Returns a faction datum by its name (case insensitive!)
for(var/obj/structure/overmap/OM as() in GLOB.overmap_objects) //Has to go through global overmaps due to anomalies not referencing their system - probably something to change one day.
if(LAZYFIND(affecting, OM))
continue
if(get_dist(src, OM) <= influence_range && OM.z == z)
if(OM.z != z)
continue
if(overmap_dist(src, OM) <= influence_range)
affecting += OM
grav_tracker[OM] = 0
cached_colours[OM] = OM.color //So that say, a yellow fighter doesnt get its paint cleared by redshifting
OM.relay(S='nsv13/sound/effects/ship/falling.ogg', message="<span class='warning'>You feel weighed down.</span>", loop=TRUE, channel=CHANNEL_HEARTBEAT)
ADD_TRAIT(OM, TRAIT_NODAMPENERS, TRAIT_SOURCE_OVERMAP_BLACKHOLE)
OM.disable_dampeners()
RegisterSignal(OM, COMSIG_PARENT_QDELETING, PROC_REF(handle_affecting_del))
for(var/obj/structure/overmap/OM as() in affecting)
if(get_dist(src, OM) > influence_range || !z || OM.z != z)
if(overmap_dist(src, OM) > influence_range || !z || OM.z != z)
stop_affecting(OM)
continue
var/incidence = get_dir(OM, src)
var/dist = get_dist(src, OM)
var/grav_level = OVERMAP_SINGULARITY_PROX_GRAVITY
if(dist <= redshift_range)
var/redshift ="#[num2hex(130-dist,2)][num2hex(0,2)][num2hex(0,2)]"
OM.color = redshift
for(var/mob/M in OM.mobs_in_ship)
M?.client?.color = redshift
grav_level = OVERMAP_SINGULARITY_REDSHIFT_GRAV
if(dist < event_horizon_range) //This var name kind of lies since the event horizon is actually at dist 2. I guess this is just the "it gets serious" distance.
grav_level = OVERMAP_SINGULARITY_DANGER_GRAV
else
if(grav_tracker[OM] >= OVERMAP_SINGULARITY_REDSHIFT_GRAV)
OM.color = cached_colours[OM] //Reset color, do not reset cache since we are still in proximity.
for(var/mob/M in OM.mobs_in_ship)
M?.client?.color = null
if(dist <= 2)
affecting -= OM
OM.current_system?.remove_ship(OM)
for(var/area/crushed as() in OM.linked_areas)
if(istype(crushed, /area/space))
continue
crushed.has_gravity = OVERMAP_SINGULARITY_DEATH_GRAV //You are dead.
qdel(OM)
continue
if(grav_tracker[OM] != grav_level)
for(var/area/crushed as() in OM.linked_areas)
if(istype(crushed, /area/space))
continue
crushed.has_gravity = grav_level
grav_tracker[OM] = grav_level
dist = (dist > 0) ? dist : 1
var/pull_strength = (dist > event_horizon_range) ? 0.005 : base_pull_strength
var/succ_impulse = !OM.brakes ? pull_strength/dist*dist : (OM.forward_maxthrust / 10) + (pull_strength/dist*dist) //STOP RESISTING THE SUCC
if(incidence & NORTH)
OM.velocity.e += succ_impulse
if(incidence & SOUTH)
OM.velocity.e -= succ_impulse
if(incidence & EAST)
OM.velocity.a += succ_impulse
if(incidence & WEST)
OM.velocity.a -= succ_impulse
var/pull_strength = (dist > event_horizon_range) ? outer_pull_strength : inner_pull_strength
var/succ_impulse = !OM.brakes ? pull_strength/dist*dist : (OM.forward_maxthrust / 10) + (pull_strength/dist*dist) //STOP RESISTING THE SUCC - is this meant to be inverse square? Missing a () in that case.. probably more 'fun' this way though since very low velocities get zerod - Delta.
var/relative_angle = overmap_angle(OM, src) % 360
var/x_succ = (succ_impulse * sin(relative_angle)) //I LOVE circle math I LOVE pi. (these two lines get the x and y component of the gravity vector)
var/y_succ = (succ_impulse * cos(relative_angle))
OM.velocity.a += x_succ
OM.velocity.e += y_succ

/obj/effect/overmap_anomaly/singularity/proc/stop_affecting(obj/structure/overmap/OM = null)
if(OM)
affecting -= OM
REMOVE_TRAIT(OM, TRAIT_NODAMPENERS, TRAIT_SOURCE_OVERMAP_BLACKHOLE)
OM.stop_relay(CHANNEL_HEARTBEAT)
OM.color = cached_colours[OM]
cached_colours[OM] = null
for(var/mob/M in OM.mobs_in_ship)
M?.client?.color = null
for(var/area/crushed as() in OM.linked_areas)
if(istype(crushed, /area/space))
continue
crushed.has_gravity = initial(crushed.has_gravity)
grav_tracker -= OM
UnregisterSignal(OM, COMSIG_PARENT_QDELETING)

/obj/effect/overmap_anomaly/singularity/proc/handle_affecting_del(obj/structure/overmap/deleting)
affecting -= deleting
grav_tracker -= deleting
cached_colours[deleting] = null
UnregisterSignal(deleting, COMSIG_PARENT_QDELETING)

#undef OVERMAP_SINGULARITY_PROX_GRAVITY
#undef OVERMAP_SINGULARITY_REDSHIFT_GRAV
#undef OVERMAP_SINGULARITY_DANGER_GRAV
#undef OVERMAP_SINGULARITY_DEATH_GRAV

/obj/effect/overmap_anomaly/wormhole/Initialize(mapload)
. = ..()
Expand Down
24 changes: 18 additions & 6 deletions nsv13/code/modules/mob/living/carbon/carbon.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
// resides in it's own proc just in case we've already got a trait checked list
/mob/living/proc/gravity_crush(gravity, harmlev = 1)
var/range
var/Oloss = gravity * rand(1, 1.3)
var/Oloss = gravity * (rand(10, 13) * 0.1) //Rand with min-maxbound only creates whole numbers.
switch(harmlev)
if(1) // high G (i.e hacked gravity generator)
range = rand(1, 25)
range = rand(3, 25) //Low intensity high-grav doesn't knock you out flat.
if(2) // Very high G (i.e fighter high G burns)
range = rand(1, 16)
Oloss *= 0.5
Expand All @@ -17,9 +17,9 @@

switch(range)
if(1 to 2)
losebreath += 0.8 + gravity/3
if(3 to 4)
Sleeping(10 + losebreath * 3)
if(3 to 4)
losebreath += 0.8 + gravity/3
if(5 to 7)
if(!IsKnockdown())
Knockdown(gravity * 5)
Expand All @@ -46,6 +46,18 @@
to_chat(src, "<span class='danger'>You struggle to catch a breath.</span>")

/mob/living/carbon/handle_high_gravity(gravity)
if(HAS_TRAIT(src, TRAIT_GFORCE_WEAKNESS))
gravity_crush(gravity)
if(HAS_TRAIT(src, TRAIT_GFORCE_WEAKNESS) || gravity > GRAVITY_DAMAGE_TRESHOLD)
var/harmlev_level = 1
switch(gravity)
if(1 to 4) //A bunch of science journals say above ~4G gets not very fun but our game starts having grav damage at >3G, so low-intensity internal damage it is
harmlev_level = 1
if(4 to 8)
harmlev_level = 2
if(8 to INFINITY) //We're entering the bone zone of gravity.
harmlev_level = 3
else
var/effective_gravity = gravity
if(!HAS_TRAIT(src, TRAIT_GFORCE_WEAKNESS))
effective_gravity -= GRAVITY_DAMAGE_TRESHOLD //For non-grav-weak people, your gravity tolerance is substracted from the pain.
gravity_crush(effective_gravity, harmlev_level)
..()
11 changes: 11 additions & 0 deletions nsv13/code/modules/mob/living/carbon/human/human.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/mob/living/carbon/human/handle_high_gravity(gravity)
if(!wear_suit || !head)
return ..()
if(!istype(wear_suit, /obj/item/clothing/suit/space/hardsuit) || !istype(head, /obj/item/clothing/head/helmet/space/hardsuit))
return ..()
if(istype(wear_suit, /obj/item/clothing/suit/space/hardsuit/skinsuit) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/skinsuit)) //I dislike these being hardsuit subtypes.
return ..()
gravity -= 1 //Wearing a full hardsuit gives you 1G of bonus grav tolerance, at least in how much your body can withstand. Movement is very difficult regardless.
if(gravity <= 1) //This is fine.
return
return ..()
6 changes: 3 additions & 3 deletions nsv13/code/modules/overmap/ai-skynet.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1970,7 +1970,7 @@ Seek a ship thich we'll station ourselves around
/obj/structure/overmap/proc/move_toward(atom/target, ram_target = FALSE, ignore_all_collisions = FALSE)
brakes = FALSE
move_mode = NORTH
inertial_dampeners = TRUE
enable_dampeners()
if(!target || QDELETED(target))
if(defense_target) //Maybe it's defending a ship, it'll still need to find its way home.
target = defense_target
Expand Down Expand Up @@ -2011,10 +2011,10 @@ Seek a ship thich we'll station ourselves around
if(blocked) //Time to do some evasive. Determine the object's direction to evade in the opposite direction.
if(blocked.velocity.a > 0)
move_mode = EAST //The ship should still drift forward / backwards, but in this case let's not accelerate into an asteroid shall we...
inertial_dampeners = FALSE
disable_dampeners()
if(blocked.velocity.a <= 0)
move_mode = WEST
inertial_dampeners = FALSE
disable_dampeners()
return


Expand Down
18 changes: 18 additions & 0 deletions nsv13/code/modules/overmap/overmap.dm
Original file line number Diff line number Diff line change
Expand Up @@ -723,6 +723,24 @@ Proc to spool up a new Z-level for a player ship and assign it a treadmill.
else
return null

/obj/structure/overmap/proc/enable_dampeners(mob/user)
if(HAS_TRAIT(src, TRAIT_NODAMPENERS))
if(user)
to_chat(user, "<span class='danger'>WARNING: Inertia Dampeners Unavailable! Potential causes: Gravity above tolerance, malfunctions, damage, spontanious bluespace displacement.</span>")
return FALSE
inertial_dampeners = TRUE
return TRUE

/obj/structure/overmap/proc/disable_dampeners(mob/user)
inertial_dampeners = FALSE
return TRUE

/obj/structure/overmap/proc/toggle_dampeners(mob/user)
if(inertial_dampeners)
return disable_dampeners(user)
else
return enable_dampeners(user)

/obj/structure/overmap/relaymove(mob/user, direction)
if(user != pilot || pilot.incapacitated())
return
Expand Down
3 changes: 2 additions & 1 deletion nsv13/code/modules/overmap/verbs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@

if(!verb_check() || !can_brake())
return
inertial_dampeners = !inertial_dampeners
if(!toggle_dampeners(user = usr))
return
to_chat(usr, "<span class='notice'>Inertial assistance system [inertial_dampeners ? "ONLINE" : "OFFLINE"].</span>")

/obj/structure/overmap/verb/toggle_move_mode()
Expand Down

0 comments on commit eba4fe9

Please sign in to comment.