diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index fa2e1ff9de0a..fc720d2c96fd 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -213,15 +213,19 @@
#define ATMOS_TANK_AIRMIX "o2=2644;n2=10580;TEMP=293.15"
#define ATMOS_TANK_FUEL "o2=33000;plasma=66000;TEMP=293.15"
-//LAVALAND
+//PLANETARY
/// what pressure you have to be under to increase the effect of equipment meant for lavaland
#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 90
+#define ICEMOON_DEFAULT_ATMOS "ICEMOON_ATMOS"
+#define GAS_GIANT_ATMOS "GAS_GIANT_ATMOS"
+#define PLASMA_GIANT_ATMOS "PLASMA_GIANT_ATMOS"
+#define WASTEPLANET_DEFAULT_ATMOS "WASTEPLANET_ATMOS"
+#define LAVALAND_DEFAULT_ATMOS "LAVALAND_ATMOS"
//ATMOS MIX IDS
-#define LAVALAND_DEFAULT_ATMOS "LAVALAND_ATMOS"
-#define ICEMOON_DEFAULT_ATMOS "ICEMOON_ATMOS"
-#define WASTEPLANET_DEFAULT_ATMOS "WASTEPLANET_ATMOS"
+
+
//ATMOSIA GAS MONITOR TAGS
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index d0c1add8f578..9b9ecd05cb91 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -152,6 +152,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define ZAP_DEFAULT_FLAGS ZAP_MACHINE_EXPLOSIVE | ZAP_ALLOW_DUPLICATES | ZAP_OBJ_DAMAGE | ZAP_MOB_DAMAGE | ZAP_MOB_STUN
#define ZAP_FUSION_FLAGS ZAP_OBJ_DAMAGE | ZAP_MOB_DAMAGE | ZAP_MOB_STUN
+#define ZAP_STORM_FLAGS ZAP_OBJ_DAMAGE | ZAP_MOB_DAMAGE | ZAP_MOB_STUN
#define ZAP_SUPERMATTER_FLAGS ZAP_GIVES_RESEARCH
#define ZAP_TESLA_FLAGS ZAP_DEFAULT_FLAGS | ZAP_GIVES_RESEARCH
diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm
index ae039936ab4c..b6b75cc8d8c8 100644
--- a/code/__DEFINES/maths.dm
+++ b/code/__DEFINES/maths.dm
@@ -273,6 +273,8 @@
else if(dx < 0)
. += 360
+//Magnitude. used for ship velocity
+#define MAGNITUDE(a, b) (sqrt(a ** 2 + b ** 2))
/// Converts a probability/second chance to probability/seconds_per_tick chance
/// For example, if you want an event to happen with a 10% per second chance, but your proc only runs every 5 seconds, do `if(prob(100*SPT_PROB_RATE(0.1, 5)))`
@@ -282,5 +284,3 @@
/// Like SPT_PROB_RATE but easier to use, simply put `if(SPT_PROB(10, 5))`
#define SPT_PROB(prob_per_second_percent, seconds_per_tick) (prob(100*SPT_PROB_RATE((prob_per_second_percent)/100, (seconds_per_tick))))
-
-#define MAGNITUDE(a, b) (sqrt(a ** 2 + b ** 2))
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 3c73c0397378..1a9a2a9d7316 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -419,6 +419,7 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE)))
#define GAUSSIAN_BLUR(filter_size) filter(type="blur", size=filter_size)
#define STANDARD_GRAVITY 1 //Anything above this is high gravity, anything below no grav
+#define GAS_GIANT_GRAVITY 2
#define GRAVITY_DAMAGE_TRESHOLD 3 //Starting with this value gravity will start to damage mobs
#define CAMERA_NO_GHOSTS 0
diff --git a/code/__DEFINES/overmap.dm b/code/__DEFINES/overmap.dm
index 6e49e393b8d8..cb220b54672b 100644
--- a/code/__DEFINES/overmap.dm
+++ b/code/__DEFINES/overmap.dm
@@ -32,6 +32,8 @@
#define DYNAMIC_WORLD_REEBE "reebe" //celestial bodies
#define DYNAMIC_WORLD_ASTEROID "asteroid"
#define DYNAMIC_WORLD_SPACERUIN "space"
+#define DYNAMIC_WORLD_GAS_GIANT "gas giant"
+#define DYNAMIC_WORLD_PLASMA_GIANT "plasma giant"
/// Make sure you are adding new planet types to this, in order as seen above preferrably
#define DYNAMIC_WORLD_LIST_ALL list(\
@@ -44,7 +46,9 @@
DYNAMIC_WORLD_WASTEPLANET,\
DYNAMIC_WORLD_REEBE,\
DYNAMIC_WORLD_ASTEROID,\
- DYNAMIC_WORLD_SPACERUIN)
+ DYNAMIC_WORLD_SPACERUIN,\
+ DYNAMIC_WORLD_GAS_GIANT,\
+ DYNAMIC_WORLD_PLASMA_GIANT)
//Possible ship states
#define OVERMAP_SHIP_IDLE "idle"
diff --git a/code/datums/atmosphere/planetary.dm b/code/datums/atmosphere/planetary.dm
index cd5c3bfce376..85bbf13c52a9 100644
--- a/code/datums/atmosphere/planetary.dm
+++ b/code/datums/atmosphere/planetary.dm
@@ -53,6 +53,46 @@
minimum_temp = 180
maximum_temp = 180
+/datum/atmosphere/gas_giant
+ id = GAS_GIANT_ATMOS
+
+ base_gases = list(
+ GAS_N2=10,
+ GAS_NITROUS=10,
+ )
+ normal_gases = list(
+ GAS_O2=5,
+ GAS_H2O=7,
+ GAS_N2=5,
+ GAS_NITROUS=7,
+ GAS_CO2=5,
+ )
+ restricted_gases = list(
+ GAS_NITROUS=7,
+ )
+ restricted_chance = 1
+
+ minimum_pressure = WARNING_HIGH_PRESSURE + 175
+ maximum_pressure = HAZARD_HIGH_PRESSURE + 1000
+
+ minimum_temp = 30 //number i pulled out of my ass
+ maximum_temp = 120
+
+/datum/atmosphere/gas_giant/plasma
+ id = PLASMA_GIANT_ATMOS
+
+ base_gases = list(
+ GAS_PLASMA=10,
+ )
+ normal_gases = list(
+ GAS_PLASMA=10,
+ GAS_CO2=5,
+ )
+ restricted_gases = list(
+ GAS_PLASMA=0.1,
+ )
+ restricted_chance = 1
+
/datum/atmosphere/wasteplanet
id = WASTEPLANET_DEFAULT_ATMOS
diff --git a/code/datums/mapgen/single_biome/Gas_Giant.dm b/code/datums/mapgen/single_biome/Gas_Giant.dm
new file mode 100644
index 000000000000..ff904db06853
--- /dev/null
+++ b/code/datums/mapgen/single_biome/Gas_Giant.dm
@@ -0,0 +1,36 @@
+/datum/map_generator/single_biome/gas_giant
+ use_cellautomata = FALSE
+
+ biome_type = /datum/biome/gas_giant
+ area_type = /area/overmap_encounter/planetoid/gas_giant
+
+/datum/biome/gas_giant
+ open_turf_types = list(/turf/open/chasm/gas_giant)
+
+ flora_spawn_list = list(
+ )
+ feature_spawn_list = null
+ mob_spawn_list = list(
+ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher
+ //in the future, I'd like to add something like.
+ //The slylandro, or really any floating gas bag species, it'd be cool
+ )
+
+
+/datum/map_generator/single_biome/plasma_giant
+ use_cellautomata = FALSE
+
+ biome_type = /datum/biome/plasma_giant
+ area_type = /area/overmap_encounter/planetoid/gas_giant
+
+
+/datum/biome/plasma_giant
+ open_turf_types = list(/turf/open/chasm/gas_giant/plasma)
+
+ flora_spawn_list = list(
+ )
+ feature_spawn_list = null
+ mob_spawn_list = list(
+ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher
+
+ )
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index b898c1eded77..7e9d90bb482f 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -334,6 +334,29 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
if(prob(20))
explosion(src.loc,2,4,6,8)
+/obj/effect/meteor/carp
+ name = "high velocity space carp"
+ desc = "What the devil?"
+ icon_state = "carp"
+ hits = 1
+ hitpwr = 0
+ pass_flags = PASSTABLE
+ meteorsound = 'sound/effects/blobattack.ogg'
+ meteordrop = list(/mob/living/simple_animal/hostile/carp)
+ dropamt = 1
+
+/obj/effect/meteor/carp/big
+ name = "high velocity space carp"
+ desc = "What the devil?"
+ icon = 'icons/mob/broadMobs.dmi'
+ icon_state = "megacarp"
+ hits = 1
+ hitpwr = 1
+ pass_flags = PASSTABLE
+ meteordrop = list(/mob/living/simple_animal/hostile/carp/megacarp)
+ dropamt = 1
+
+
//////////////////////////
//Spookoween meteors
/////////////////////////
diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm
index 6d1c3ad7f082..3c8340bb284b 100644
--- a/code/game/objects/effects/anomalies/_anomalies.dm
+++ b/code/game/objects/effects/anomalies/_anomalies.dm
@@ -146,3 +146,6 @@
. = ..()
if(user.research_scanner == TRUE)
to_chat(user, span_notice("If harvested, this anomaly would be worth [research_value] research points."))
+
+/obj/effect/anomaly/throw_atom_into_space()
+ qdel(src)
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index ad355b32af3d..b07a53870730 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -1017,6 +1017,17 @@
/obj/effect/anomaly/plasmasoul/planetary,
/obj/effect/anomaly/melter/planetary,
)
+
+/obj/effect/spawner/lootdrop/anomaly/storm
+ loot = list(
+ /obj/effect/anomaly/flux,
+ /obj/effect/anomaly/pyro,
+ /obj/effect/anomaly/sparkler,
+ /obj/effect/anomaly/veins,
+ /obj/effect/anomaly/phantom,
+ /obj/effect/anomaly/melter,
+ )
+
//wasteplanet things
/obj/effect/spawner/lootdrop/waste/grille_or_trash
diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm
index 538a81aa26e8..96c90e4a3d64 100644
--- a/code/game/turfs/open/chasm.dm
+++ b/code/game/turfs/open/chasm.dm
@@ -115,3 +115,31 @@
underlay_appearance.icon = 'icons/turf/floors.dmi'
underlay_appearance.icon_state = "dirt"
return TRUE
+
+//gas giant "chasm"
+/turf/open/chasm/gas_giant
+ name = "void"
+ desc = "The gas that makes up the gas giant. You can't see further, but you're fairly sure if you slipped in, you'd be dead."
+ icon = 'icons/turf/floors.dmi'
+ icon_state = "reebemap" //to-do. Don't use Rebee Sprite
+ layer = SPACE_LAYER
+ baseturfs = /turf/open/chasm/gas_giant
+ planetary_atmos = TRUE
+ initial_gas_mix = GAS_GIANT_ATMOS
+ color = COLOR_DARK_MODERATE_ORANGE
+ light_range = 2
+ light_power = 0.6
+ light_color = COLOR_DARK_MODERATE_ORANGE
+ smoothing_flags = NONE
+ smoothing_groups = null
+ canSmoothWith = null
+ tiled_dirt = FALSE
+
+/turf/open/chasm/gas_giant/Initialize(mapload, inherited_virtual_z)
+ . = ..()
+ icon_state = "reebegame"
+
+/turf/open/chasm/gas_giant/plasma
+ light_color = COLOR_PURPLE
+ color = COLOR_PURPLE
+ initial_gas_mix = PLASMA_GIANT_ATMOS
diff --git a/code/game/turfs/open/space/transit.dm b/code/game/turfs/open/space/transit.dm
index 629433bb81a1..bc9789cf4f3a 100644
--- a/code/game/turfs/open/space/transit.dm
+++ b/code/game/turfs/open/space/transit.dm
@@ -37,8 +37,8 @@
if(iseffect(src))
return
if(isliving(src))
- var/mob/living/poor_soul = src // This may not seem like much, but if you toss someone out
- poor_soul.apply_damage_type(50, BRUTE) // and they go through like four tiles, they're goners
+ var/mob/living/poor_soul = src // This may not seem like much, but if you toss someone out
+ poor_soul.apply_damage_type(25, BRUTE) // and they go through like four tiles, they're goners
return
qdel(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index c3d52a2006b4..a9292c2738ac 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -139,6 +139,9 @@
add_dead_carp_overlay()
..()
+/mob/living/simple_animal/hostile/carp/throw_atom_into_space()
+ return
+
/mob/living/simple_animal/hostile/carp/tamed()
. = ..()
can_buckle = TRUE
diff --git a/code/modules/overmap/missions/acquire_mission.dm b/code/modules/overmap/missions/acquire_mission.dm
index 57b37512214c..6ae295213496 100644
--- a/code/modules/overmap/missions/acquire_mission.dm
+++ b/code/modules/overmap/missions/acquire_mission.dm
@@ -107,6 +107,39 @@
weight = 1
objective_type = /obj/item/strange_crystal
+/*
+Acquire: Anomaly
+*/
+
+/datum/mission/acquire/anomaly
+ name = "Anomaly core requested"
+ weight = 8
+ value = 3000
+ duration = 40 MINUTES
+ dur_mod_range = 0.2
+ container_type = /obj/item/storage/box/anomaly
+ objective_type = /obj/item/assembly/signaler/anomaly
+ num_wanted = 1
+
+/datum/mission/acquire/anomaly/New(...)
+ var/group = pick(list(
+ "Cybersun Industries",
+ "CMM-GOLD",
+ "Nanotrasen Anomalous Studies Division",
+ "The Naturalienwissenschaftlicher Studentenverbindungs-Verband",
+ "The Central Solarian Anomaly Research Agency",
+ "DeForest Medical R&D",
+ "A strange lizard on the outpost"
+ ))
+
+ desc = "[group] has requested that a ship [pick(list("procure", "grab", "acquire", "find", "locate"))] \
+ an anomaly core for [pick(list("research", "analysis", "technical development", "closer inspection", "some reason"))]. \
+ They've offered to pay well, so we're relaying this mission to you"
+ . = ..()
+
+
+
+
/*
Acquire: The Creature
*/
@@ -184,7 +217,7 @@
/datum/mission/acquire/aquarium
name = "Fish needed for my aquarium"
- weight = 14
+ weight = 6
value = 750
duration = 60 MINUTES
val_mod_range = 0.2
@@ -210,7 +243,7 @@
/datum/mission/acquire/aquarium/rare
name = "Rare fish needed for my aquarium!"
- weight = 8
+ weight = 1
value = 1500
val_mod_range = 0.3
@@ -236,7 +269,7 @@
/datum/mission/acquire/fish_cook
name = "Fish needed for my meal"
- weight = 8
+ weight = 3
duration = 40 MINUTES
val_mod_range = 0.2
objective_type = /obj/item/fish
@@ -307,3 +340,20 @@
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_items = 3
+
+/obj/item/storage/box/anomaly
+ name = "anomaly case"
+ desc = "A metallic box made to store anomaly cores. They aren't always the safest to lug around."
+ icon = 'icons/obj/nuke_tools.dmi'
+ icon_state = "core_container_sealed" //it'd be neat if I could figure out how to make this seal but that's a problem for me in 6 months
+ item_state = "tile"
+ lefthand_file = 'icons/mob/inhands/misc/tiles_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/tiles_righthand.dmi'
+ foldable = null
+
+/obj/item/storage/box/anomaly/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_combined_w_class = WEIGHT_CLASS_NORMAL
+ STR.max_w_class = WEIGHT_CLASS_NORMAL
+ STR.max_items = 1
diff --git a/code/modules/overmap/missions/research_mission.dm b/code/modules/overmap/missions/research_mission.dm
index f43c50ffc958..181d1a4d9ba4 100644
--- a/code/modules/overmap/missions/research_mission.dm
+++ b/code/modules/overmap/missions/research_mission.dm
@@ -3,7 +3,7 @@
desc = "We require data on the behavior of electrical storms in the system for an ongoing study. \
Please anchor the attached sensor array to your ship and fly it through the storms.\
It must be powered to collect the data. "
- value = 1500 // base value, before adding bonus for number of things to fly through
+ value = 3000 // base value, before adding bonus for number of things to fly through
duration = 30 MINUTES
weight = 8
@@ -62,6 +62,7 @@
desc = "We require data on the behavior of ion storms in the system for an ongoing study. \
Please anchor the attached sensor array to your ship and fly it through the storms. \
It must be powered to collect the data."
+ value = 3500
objective_type = /datum/overmap/event/emp
/datum/mission/research/meteor
@@ -69,10 +70,29 @@
desc = "We require data on the behavior of asteroid fields in the system for an ongoing study. \
Please anchor the attached sensor array to your ship and fly it through the fields. \
It must be powered to collect the data."
- value = 2000
+ value = 4000
weight = 4
objective_type = /datum/overmap/event/meteor
+/datum/mission/research/carp
+ name = "Carp migration research mission"
+ desc = "We require data on the migration patterns of space carp for an ongoing study. \
+ Please anchor the attached sensor array to your ship and fly it through the fields. \
+ It must be powered to collect the data."
+ value = 2000
+ weight = 4
+ num_wanted = 3
+ objective_type = /datum/overmap/event/meteor/carp
+
+/datum/mission/research/dust
+ name = "dust research mission"
+ desc = "We require data on the density of space dust for updated navcharts. \
+ Please anchor the attached sensor array to your ship and fly it through the fields. \
+ It must be powered to collect the data."
+ value = 1000
+ weight = 4
+ objective_type = /datum/overmap/event/meteor/dust
+
/*
Research mission scanning machine
*/
diff --git a/code/modules/overmap/objects/dynamic_datum.dm b/code/modules/overmap/objects/dynamic_datum.dm
index 3ae5ac1d45dc..deecae61e3ea 100644
--- a/code/modules/overmap/objects/dynamic_datum.dm
+++ b/code/modules/overmap/objects/dynamic_datum.dm
@@ -41,6 +41,9 @@
///The X bounds of the virtual z level
var/vlevel_width = QUADRANT_MAP_SIZE
+ //controls what kind of sound we play when we land and the maptext comes up
+ var/landing_sound
+
/datum/overmap/dynamic/Initialize(position, load_now=TRUE, ...)
. = ..()
@@ -80,9 +83,11 @@
/datum/overmap/dynamic/post_docked(datum/overmap/ship/controlled/dock_requester)
if(planet_name)
- for(var/mob/M as anything in GLOB.player_list)
- if(dock_requester.shuttle_port.is_in_shuttle_bounds(M))
- M.play_screen_text("[planet_name]
[station_time_timestamp_fancy("hh:mm")]")
+ for(var/mob/Mob as anything in GLOB.player_list)
+ if(dock_requester.shuttle_port.is_in_shuttle_bounds(Mob))
+ Mob.play_screen_text("[planet_name]
[station_time_timestamp_fancy("hh:mm")]")
+ playsound(Mob, landing_sound, 50)
+
/datum/overmap/dynamic/post_undocked(datum/overmap/dock_requester)
if(preserve_level)
@@ -113,10 +118,17 @@
probabilities = list()
for(var/datum/planet_type/planet_type as anything in subtypesof(/datum/planet_type))
probabilities[initial(planet_type.planet)] = initial(planet_type.weight)
-
planet = SSmapping.planet_types[force_encounter ? force_encounter : pickweightAllowZero(probabilities)]
- Rename(planet.name)
+
+ if(planet.planet !=DYNAMIC_WORLD_ASTEROID && planet.planet != DYNAMIC_WORLD_SPACERUIN) //these aren't real planets
+ planet_name = "[gen_planet_name()]"
+ Rename(planet_name)
+ token.name = "[planet_name]" + " ([planet.name])"
+ if(planet.planet == DYNAMIC_WORLD_ASTEROID || planet.planet == DYNAMIC_WORLD_SPACERUIN)
+ Rename(planet.name)
+ token.name = "[planet.name]"
+
token.icon_state = planet.icon_state
token.desc = planet.desc
token.color = planet.color
@@ -124,6 +136,8 @@
default_baseturf = planet.default_baseturf
mapgen = planet.mapgen
weather_controller_type = planet.weather_controller_type
+ landing_sound = planet.landing_sound
+ preserve_level = planet.preserve_level //it came to me while I was looking at chickens
if(vlevel_height >= 255 && vlevel_width >= 255) //little easter egg
planet_name = "LV-[pick(rand(11111,99999))]"
@@ -262,6 +276,8 @@
area_flags = HIDDEN_AREA | CAVES_ALLOWED | FLORA_ALLOWED | MOB_SPAWN_ALLOWED //allows jaunters to work
ambientsounds = REEBE
-
-
-
+/area/overmap_encounter/planetoid/gas_giant
+ name = "\improper Gas Giant"
+ sound_environment = SOUND_ENVIRONMENT_MOUNTAINS
+ ambientsounds = REEBE
+ has_gravity = GAS_GIANT_GRAVITY
diff --git a/code/modules/overmap/objects/event_datum.dm b/code/modules/overmap/objects/event_datum.dm
index 5b969dd13f2a..8ee2136e0d02 100644
--- a/code/modules/overmap/objects/event_datum.dm
+++ b/code/modules/overmap/objects/event_datum.dm
@@ -11,10 +11,12 @@
var/spread_chance = 0
///How many additional tiles to spawn at once in the selected orbit. Used with OVERMAP_GENERATOR_SOLAR.
var/chain_rate = 0
+ var/desc
/datum/overmap/event/Initialize(position, ...)
. = ..()
SSovermap.events += src
+ token.desc = desc
/datum/overmap/event/Destroy()
. = ..()
@@ -24,29 +26,30 @@
* The main proc for calling other procs. Called by SSovermap.
*/
/datum/overmap/event/proc/apply_effect()
- for(var/datum/overmap/ship/controlled/S in get_nearby_overmap_objects())
+ for(var/datum/overmap/ship/controlled/Ship in get_nearby_overmap_objects())
if(prob(chance_to_affect))
- affect_ship(S)
+ affect_ship(Ship)
/**
* The proc called on all ships that are currently being affected.
*/
-/datum/overmap/event/proc/affect_ship(datum/overmap/ship/controlled/S)
+/datum/overmap/event/proc/affect_ship(datum/overmap/ship/controlled/Ship)
return
-///METEOR STORMS - Bounces harmlessly off the shield... unless your shield is breached
+///METEOR STORMS - explodes your ship if you go too fast
/datum/overmap/event/meteor
- name = "asteroid storm (moderate)"
+ name = "asteroid field (moderate)"
+ desc = "An area of space rich with asteroids, going fast through here could prove dangerous"
token_icon_state = "meteor1"
chance_to_affect = 15
spread_chance = 50
chain_rate = 4
+ var/safe_speed = 3
var/list/meteor_types = list(
/obj/effect/meteor/dust=3,
/obj/effect/meteor/medium=8,
- /obj/effect/meteor/big=3,
- /obj/effect/meteor/flaming=1,
+ /obj/effect/meteor/big=1,
/obj/effect/meteor/irradiated=3
)
@@ -57,38 +60,46 @@
token.light_color = "#a08444"
token.update_icon()
-/datum/overmap/event/meteor/affect_ship(datum/overmap/ship/controlled/S)
- spawn_meteor(meteor_types, S.shuttle_port.get_virtual_level(), 0)
+/datum/overmap/event/meteor/apply_effect()
+ for(var/datum/overmap/ship/controlled/Ship in get_nearby_overmap_objects())
+ if(Ship.get_speed() > safe_speed)
+ var/how_fast = (Ship.get_speed() - safe_speed)
+ if(prob(chance_to_affect + how_fast))
+ affect_ship(Ship)
+
+/datum/overmap/event/meteor/affect_ship(datum/overmap/ship/controlled/Ship)
+ spawn_meteor(meteor_types, Ship.shuttle_port.get_virtual_level(), 0)
/datum/overmap/event/meteor/minor
- name = "asteroid storm (minor)"
+ name = "asteroid field (minor)"
chain_rate = 3
meteor_types = list(
+ /obj/effect/meteor/dust=12,
/obj/effect/meteor/medium=4,
- /obj/effect/meteor/big=8,
- /obj/effect/meteor/flaming=3,
- /obj/effect/meteor/irradiated=3
+ /obj/effect/meteor/irradiated=2
)
/datum/overmap/event/meteor/major
- name = "asteroid storm (major)"
+ name = "asteroid field (major)"
spread_chance = 25
chain_rate = 6
meteor_types = list(
- /obj/effect/meteor/medium=5,
- /obj/effect/meteor/big=75,
+ /obj/effect/meteor/medium=50,
+ /obj/effect/meteor/big=25,
/obj/effect/meteor/flaming=10,
/obj/effect/meteor/irradiated=10,
/obj/effect/meteor/tunguska = 1
)
-///ION STORM - Causes EMP pulses on the shuttle, wreaking havoc on the shields
+///ION STORM - explodes your IPCs
/datum/overmap/event/emp
name = "ion storm (moderate)"
+ desc = "A heavily ionized area of space, prone to causing electromagnetic pulses in ships"
token_icon_state = "ion1"
spread_chance = 20
chain_rate = 2
- var/strength = 3
+ chance_to_affect = 20
+ var/strength = 4
/datum/overmap/event/emp/Initialize(position, ...)
. = ..()
@@ -105,25 +116,28 @@
for(var/mob/M as anything in GLOB.player_list)
if(S.shuttle_port.is_in_shuttle_bounds(M))
M.playsound_local(S.shuttle_port, 'sound/weapons/ionrifle.ogg', strength)
- shake_camera(M, 10, strength)
/datum/overmap/event/emp/minor
name = "ion storm (minor)"
chain_rate = 1
strength = 1
+ chance_to_affect = 15
/datum/overmap/event/emp/major
name = "ion storm (major)"
+ chance_to_affect = 25
chain_rate = 4
- strength = 5
+ strength = 6
-///ELECTRICAL STORM - Zaps places in the shuttle
+///ELECTRICAL STORM - explodes your computer and IPCs
/datum/overmap/event/electric
name = "electrical storm (moderate)"
+ desc = "A spatial anomaly, an unfortunately common sight on the frontier. Disturbing it tends to lead to intense electrical discharges"
token_icon_state = "electrical1"
chance_to_affect = 15
spread_chance = 30
chain_rate = 3
+ var/zap_flag = ZAP_STORM_FLAGS
var/max_damage = 15
var/min_damage = 5
@@ -137,11 +151,10 @@
/datum/overmap/event/electric/affect_ship(datum/overmap/ship/controlled/S)
var/datum/virtual_level/ship_vlevel = S.shuttle_port.get_virtual_level()
var/turf/source = ship_vlevel.get_side_turf(pick(GLOB.cardinals))
- tesla_zap(source, 10, TESLA_DEFAULT_POWER, ZAP_TESLA_FLAGS)
+ tesla_zap(source, 10, TESLA_DEFAULT_POWER, zap_flag)
for(var/mob/M as anything in GLOB.player_list)
if(S.shuttle_port.is_in_shuttle_bounds(M))
M.playsound_local(source, 'sound/magic/lightningshock.ogg', rand(min_damage / 10, max_damage / 10))
- shake_camera(M, 10, rand(min_damage / 10, max_damage / 10))
/datum/overmap/event/electric/minor
name = "electrical storm (minor)"
@@ -156,9 +169,11 @@
chain_rate = 6
max_damage = 20
min_damage = 10
+ zap_flag = ZAP_TESLA_FLAGS
/datum/overmap/event/nebula
name = "nebula"
+ desc = "There's coffee in here"
token_icon_state = "nebula"
chain_rate = 8
spread_chance = 75
@@ -172,6 +187,7 @@
/datum/overmap/event/wormhole
name = "wormhole"
+ desc = "A hole through space. If you go through here, you might end up anywhere."
token_icon_state = "wormhole"
spread_chance = 0
chain_rate = 0
@@ -227,6 +243,95 @@
if(5)
return"#6d80c7"
+//Carp "meteors" - throws carp at the ship
+
+/datum/overmap/event/meteor/carp
+ name = "carp migration (moderate)"
+ desc = "A migratory school of space carp. They travel at high speeds, and flying through them may cause them to impact your ship"
+ token_icon_state = "carp1"
+ chance_to_affect = 15
+ spread_chance = 50
+ chain_rate = 4
+ safe_speed = 2
+ meteor_types = list(
+ /obj/effect/meteor/carp=16,
+ /obj/effect/meteor/carp/big=1, //numbers I pulled out of my ass
+ )
+
+/datum/overmap/event/meteor/carp/Initialize(position, ...)
+ . = ..()
+ token.icon_state = "carp[rand(1, 4)]"
+ token.color = "#7b1ca8"
+ token.light_color = "#7b1ca8"
+ token.update_icon()
+
+
+/datum/overmap/event/meteor/carp/minor
+ name = "carp migration (minor)"
+ token_icon_state = "carp1"
+ chance_to_affect = 5
+ spread_chance = 25
+ chain_rate = 4
+ meteor_types = list(
+ /obj/effect/meteor/carp=8
+ )
+
+
+/datum/overmap/event/meteor/carp/major
+ name = "carp migration (major)"
+ token_icon_state = "carp1"
+ chance_to_affect = 25
+ spread_chance = 25
+ chain_rate = 4
+ meteor_types = list(
+ /obj/effect/meteor/carp=7,
+ /obj/effect/meteor/carp/big=1,
+ )
+
+// dust clouds throw dust if you go Way Fast
+
+/datum/overmap/event/meteor/dust
+ name = "dust cloud"
+ desc = "A cloud of spaceborne dust. Relatively harmless, unless you're travelling at relative speeds"
+ token_icon_state = "carp1"
+ chance_to_affect = 30
+ spread_chance = 50
+ chain_rate = 4
+ safe_speed = 7
+ meteor_types = list(
+ /obj/effect/meteor/dust=3,
+ )
+
+/datum/overmap/event/meteor/dust/Initialize(position, ...)
+ . = ..()
+ token.icon_state = "dust[rand(1, 4)]"
+ token.color = "#506469" //we should make these defines
+ token.light_color = "#506469"
+ token.update_icon()
+
+/datum/overmap/event/anomaly
+ name = "anomaly field"
+ desc = "A highly anomalous area of space, disturbing it leads to the manifestation of odd spatial phenomena"
+ token_icon_state = "anomaly1"
+ chance_to_affect = 10
+ spread_chance = 35
+ chain_rate = 6
+
+/datum/overmap/event/anomaly/Initialize(position, ...)
+ . = ..()
+ token.icon_state = "anomaly[rand(1, 4)]"
+ token.color = "#c46a24"
+ token.light_color = "#c46a24"
+ token.update_icon()
+
+/datum/overmap/event/anomaly/affect_ship(datum/overmap/ship/controlled/S)
+ var/area/source_area = pick(S.shuttle_port.shuttle_areas)
+ var/source_object = pick(source_area.contents)
+ new /obj/effect/spawner/lootdrop/anomaly/storm(get_turf(source_object))
+ for(var/mob/M as anything in GLOB.player_list)
+ if(S.shuttle_port.is_in_shuttle_bounds(M))
+ M.playsound_local(S.shuttle_port, 'sound/effects/bamf.ogg', 100)
+
GLOBAL_LIST_INIT(overmap_event_pick_list, list(
/datum/overmap/event/wormhole = 10,
/datum/overmap/event/nebula = 60,
@@ -238,6 +343,11 @@ GLOBAL_LIST_INIT(overmap_event_pick_list, list(
/datum/overmap/event/emp/major = 45,
/datum/overmap/event/meteor/minor = 45,
/datum/overmap/event/meteor = 40,
- /datum/overmap/event/meteor/major = 35
+ /datum/overmap/event/meteor/major = 35,
+ /datum/overmap/event/meteor/carp/minor = 45,
+ /datum/overmap/event/meteor/carp = 35,
+ /datum/overmap/event/meteor/carp/major = 20,
+ /datum/overmap/event/meteor/dust = 50,
+ /datum/overmap/event/anomaly = 10
))
diff --git a/code/modules/overmap/objects/outpost.dm b/code/modules/overmap/objects/outpost.dm
index 4350e074c115..4ea930098c6b 100644
--- a/code/modules/overmap/objects/outpost.dm
+++ b/code/modules/overmap/objects/outpost.dm
@@ -15,7 +15,7 @@
fill_missions()
addtimer(CALLBACK(src, .proc/fill_missions), 10 MINUTES, TIMER_STOPPABLE|TIMER_LOOP|TIMER_DELETE_ME)
var/station_icon_num
- station_icon_num = rand(1,5)
+ station_icon_num = rand(1,4)
token.icon_state = "station_[station_icon_num]"
/datum/overmap/dynamic/outpost/get_jump_to_turf()
diff --git a/code/modules/overmap/objects/star.dm b/code/modules/overmap/objects/star.dm
index 6dfca56def15..b031c467754c 100644
--- a/code/modules/overmap/objects/star.dm
+++ b/code/modules/overmap/objects/star.dm
@@ -5,10 +5,13 @@
var/color_vary = 0
/datum/overmap/star/Initialize(position, ...)
- Rename(gen_star_name())
+ var/name = gen_star_name()
+ Rename(name)
+ set_station_name(name)
token.desc = token_desc
alter_token_appearance()
+
/datum/overmap/star/proc/gen_star_name()
return "[pick(GLOB.star_names)] [pick(GLOB.greek_letters)]"
diff --git a/code/modules/overmap/planets/planet_types.dm b/code/modules/overmap/planets/planet_types.dm
index def4d21f39ac..05128d928bc9 100644
--- a/code/modules/overmap/planets/planet_types.dm
+++ b/code/modules/overmap/planets/planet_types.dm
@@ -9,10 +9,12 @@
var/icon_state = "globe"
var/color = "#ffffff"
var/weight = 20
+ var/preserve_level = FALSE
+ var/landing_sound
/datum/planet_type/lava
name = "lava planet"
- desc = "A very weak energy signal originating from a planet with lots of seismic and volcanic activity."
+ desc = "A planet rife with seismic and volcanic activity. High temperatures and dangerous xenofauna render it dangerous for the unprepared."
planet = DYNAMIC_WORLD_LAVA
icon_state = "globe_2"
color = COLOR_ORANGE
@@ -20,10 +22,12 @@
default_baseturf = /turf/open/floor/plating/asteroid/basalt/lava
weather_controller_type = /datum/weather_controller/lavaland
ruin_type = RUINTYPE_LAVA
+ landing_sound = 'sound/effects/planet_landing_2.ogg'
+
/datum/planet_type/ice
name = "frozen planet"
- desc = "A very weak energy signal originating from a planet with traces of water and extremely low temperatures."
+ desc = "A frozen planet covered in thick snow, thicker ice, and dangerous predators."
planet = DYNAMIC_WORLD_ICE
icon_state = "globe_2"
color = COLOR_BLUE_LIGHT
@@ -31,10 +35,11 @@
default_baseturf = /turf/open/floor/plating/asteroid/snow/icemoon
weather_controller_type = /datum/weather_controller/snow_planet
ruin_type = RUINTYPE_ICE
+ landing_sound = 'sound/effects/planet_landing_2.ogg'
/datum/planet_type/jungle
name = "jungle planet"
- desc = "A very weak energy signal originating from a planet teeming with life."
+ desc = "A densely forested world, filled with vines, animals, and underbrush. Surprisingly habitable with a machete."
planet = DYNAMIC_WORLD_JUNGLE
icon_state = "globe_2"
color = COLOR_LIME
@@ -42,10 +47,11 @@
default_baseturf = /turf/open/floor/plating/dirt/jungle
weather_controller_type = /datum/weather_controller/lush
ruin_type = RUINTYPE_JUNGLE
+ landing_sound = 'sound/effects/planet_landing_1.ogg'
/datum/planet_type/rock
name = "rock planet"
- desc = "A very weak energy signal originating from a iron rich and rocky planet."
+ desc = "A rocky red world in the midst of terraforming. While some plants have taken hold, it is widely hostile to life."
planet = DYNAMIC_WORLD_ROCKPLANET
icon_state = "globe_2"
color = "#bd1313"
@@ -53,10 +59,11 @@
default_baseturf = /turf/open/floor/plating/asteroid
weather_controller_type = /datum/weather_controller/rockplanet
ruin_type = RUINTYPE_ROCK
+ landing_sound = 'sound/effects/planet_landing_2.ogg'
/datum/planet_type/sand
name = "sand planet"
- desc = "A very weak energy signal originating from a planet with many traces of silica."
+ desc = "A formerly vibrant world, turned to sand by the ravages of the ICW. The survivors of it are long mad by now."
planet = DYNAMIC_WORLD_SAND
icon_state = "globe_2"
color = COLOR_GRAY
@@ -64,10 +71,11 @@
default_baseturf = /turf/open/floor/plating/asteroid/whitesands
weather_controller_type = /datum/weather_controller/desert
ruin_type = RUINTYPE_SAND
+ landing_sound = 'sound/effects/planet_landing_2.ogg'
/datum/planet_type/beach
name = "beach planet"
- desc = "A very weak energy signal originating from a warm, oxygen rich planet."
+ desc = "The platonic ideal of vacation spots. Warm, comfortable temperatures, and a breathable atmosphere."
planet = DYNAMIC_WORLD_BEACHPLANET
icon_state = "globe"
color = "#c6b597"
@@ -75,6 +83,7 @@
default_baseturf = /turf/open/floor/plating/asteroid/sand/lit
weather_controller_type = /datum/weather_controller/lush
ruin_type = RUINTYPE_BEACH
+ landing_sound = 'sound/effects/planet_landing_1.ogg'
/datum/planet_type/reebe
name = "???"
@@ -100,6 +109,7 @@
default_baseturf = /turf/open/space
weather_controller_type = null
ruin_type = null // asteroid ruins when
+ landing_sound = 'sound/effects/planet_landing_1.ogg'
/datum/planet_type/spaceruin
name = "weak energy signal"
@@ -111,10 +121,11 @@
default_baseturf = /turf/open/space
weather_controller_type = null
ruin_type = RUINTYPE_SPACE
+ landing_sound = 'sound/effects/planet_landing_2.ogg'
/datum/planet_type/waste
name = "waste disposal planet"
- desc = "A very weak energy signal originating from a planet marked as waste disposal."
+ desc = "A highly oxygenated world, coated in garbage, radiation, and rust."
planet = DYNAMIC_WORLD_WASTEPLANET
icon_state = "globe_2"
color = "#a9883e"
@@ -122,3 +133,30 @@
default_baseturf = /turf/open/floor/plating/asteroid/wasteplanet
weather_controller_type = /datum/weather_controller/chlorine
ruin_type = RUINTYPE_WASTE
+ landing_sound = 'sound/effects/planet_landing_2.ogg'
+
+/datum/planet_type/gas_giant
+ name = "gas giant"
+ desc = "A floating ball of gas, with high gravity and even higher pressure."
+ planet = DYNAMIC_WORLD_GAS_GIANT
+ icon_state = "globe"
+ color = COLOR_DARK_MODERATE_ORANGE
+ mapgen = /datum/map_generator/single_biome/gas_giant
+ default_baseturf = /turf/open/chasm/gas_giant
+ weather_controller_type = null
+ ruin_type = null //it's a Gas Giant. Not Cloud fuckin City
+ weight = 0
+ preserve_level = TRUE
+ landing_sound = 'sound/effects/planet_landing_1.ogg'
+
+/datum/planet_type/plasma_giant
+ name = "plasma giant"
+ desc = "The backbone of interstellar travel, the mighty plasma giant allows fuel collection to take place."
+ planet = DYNAMIC_WORLD_PLASMA_GIANT
+ color = COLOR_PURPLE
+ mapgen = /datum/map_generator/single_biome/plasma_giant
+ default_baseturf = /turf/open/chasm/gas_giant/plasma
+ weight = 0
+ icon_state = "globe"
+ preserve_level = TRUE
+ landing_sound = 'sound/effects/planet_landing_1.ogg'
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 18057ac93fef..d17f94af19ae 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -17,6 +17,9 @@
ricochet_chance = 80
reflectable = REFLECT_NORMAL
+/obj/projectile/beam/throw_atom_into_space()
+ return
+
/obj/projectile/beam/laser
tracer_type = /obj/effect/projectile/tracer/laser
diff --git a/icons/misc/overmap.dmi b/icons/misc/overmap.dmi
index 4d622bd064cd..f0c9f6e44677 100644
Binary files a/icons/misc/overmap.dmi and b/icons/misc/overmap.dmi differ
diff --git a/icons/obj/meteor.dmi b/icons/obj/meteor.dmi
index 84faabcc1881..3e37c229ec93 100644
Binary files a/icons/obj/meteor.dmi and b/icons/obj/meteor.dmi differ
diff --git a/shiptest.dme b/shiptest.dme
index 6496bbd65b03..7999c6740ca0 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -664,6 +664,7 @@
#include "code\datums\mapgen\planetary\WasteGenerator.dm"
#include "code\datums\mapgen\single_biome\_SingleBiome.dm"
#include "code\datums\mapgen\single_biome\AsteroidCaves.dm"
+#include "code\datums\mapgen\single_biome\Gas_Giant.dm"
#include "code\datums\mapgen\single_biome\ReebeGenerator.dm"
#include "code\datums\martial\_martial.dm"
#include "code\datums\martial\boxing.dm"
@@ -3059,9 +3060,9 @@
#include "code\modules\reagents\reagent_containers\chem_pack.dm"
#include "code\modules\reagents\reagent_containers\dropper.dm"
#include "code\modules\reagents\reagent_containers\glass.dm"
-#include "code\modules\reagents\reagent_containers\jug.dm"
#include "code\modules\reagents\reagent_containers\hypospray.dm"
#include "code\modules\reagents\reagent_containers\hypovial.dm"
+#include "code\modules\reagents\reagent_containers\jug.dm"
#include "code\modules\reagents\reagent_containers\maunamug.dm"
#include "code\modules\reagents\reagent_containers\medigel.dm"
#include "code\modules\reagents\reagent_containers\mortar.dm"
diff --git a/sound/effects/planet_landing_1.ogg b/sound/effects/planet_landing_1.ogg
new file mode 100644
index 000000000000..1581c1f9955a
Binary files /dev/null and b/sound/effects/planet_landing_1.ogg differ
diff --git a/sound/effects/planet_landing_2.ogg b/sound/effects/planet_landing_2.ogg
new file mode 100644
index 000000000000..bd206161173c
Binary files /dev/null and b/sound/effects/planet_landing_2.ogg differ