diff --git a/_maps/shuttles/independent/independent_dwayne_anomaly.dmm b/_maps/shuttles/independent/independent_dwayne_anomaly.dmm index e85beee33a7a..6086c45d5cb2 100644 --- a/_maps/shuttles/independent/independent_dwayne_anomaly.dmm +++ b/_maps/shuttles/independent/independent_dwayne_anomaly.dmm @@ -416,10 +416,6 @@ /obj/item/clothing/under/utility, /obj/item/clothing/under/utility/skirt, /obj/item/clothing/under/utility/skirt, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/shoes/workboots, -/obj/item/clothing/shoes/workboots, /obj/item/clothing/suit/jacket/leather/duster, /obj/item/clothing/suit/jacket/leather/duster, /obj/item/clothing/gloves/fingerless, diff --git a/code/__DEFINES/overmap.dm b/code/__DEFINES/overmap.dm index 912632608f8e..dff5be258558 100644 --- a/code/__DEFINES/overmap.dm +++ b/code/__DEFINES/overmap.dm @@ -50,6 +50,8 @@ #define DYNAMIC_WORLD_TEST "test" +#define DYNAMIC_WORLD_JUNGLE_INFESTED "jungle_infested" + //Possible ship states #define OVERMAP_SHIP_IDLE "idle" #define OVERMAP_SHIP_FLYING "flying" @@ -113,3 +115,9 @@ #define SHIPMODULE_HELMCONSOLE "helm_console" #define SHIPMODULE_TRANSPONDER "transponder" +//Sector types +#define GREEN_STAR "green star" //Starter area +#define YELLOW_STAR "yellow star" //Mid, controlled area +#define RED_STAR "red star" //Hard, contested area +#define BLACK_ORBIT "black orbit" //Neutral, ffa +#define MIDNIGHT_SUN "midnight sun" //Enemy territory, such as pirate bases or infested systems diff --git a/code/controllers/subsystem/missions.dm b/code/controllers/subsystem/missions.dm index 9a7c18add23c..f26d40d56a84 100644 --- a/code/controllers/subsystem/missions.dm +++ b/code/controllers/subsystem/missions.dm @@ -46,8 +46,8 @@ SUBSYSTEM_DEF(missions) // should probably come up with a better solution for this // hierarchical weighting? would need to distinguish between "real" and "fake" missions -/datum/controller/subsystem/missions/proc/get_weighted_mission_type() - var/static/list/weighted_missions +/datum/controller/subsystem/missions/proc/get_weighted_mission_type(list/overmaptally, list/basemissions) + /*var/static/list/weighted_missions if(!weighted_missions) weighted_missions = list() var/list/mission_types = subtypesof(/datum/mission) @@ -56,7 +56,22 @@ SUBSYSTEM_DEF(missions) continue if(mis_type::weight > 0) weighted_missions[mis_type] = mis_type::weight - return pickweight_float(weighted_missions) + return pickweight_float(weighted_missions)*/ + var/list/doablemissionlist = list() + for(var/opmission in basemissions) + if(ispath(opmission, /datum/mission/outpost/survey)) + var/datum/mission/outpost/survey/sv = new opmission //This thing is choking on cock and wasting precious processing power and memory, but thankfully it is only called sparesely and I have no better idea how to do this... + for(var/ptvar in sv.target_planets) + if(overmaptally[ptvar]) + doablemissionlist[opmission] = basemissions[opmission] + else if(ispath(opmission, /datum/mission/outpost/research)) + var/datum/mission/outpost/research/rsc = opmission + if(overmaptally[rsc.objective_type]) + doablemissionlist[opmission] = basemissions[opmission] + else if(ispath(opmission, /datum/mission/outpost/drill)) + doablemissionlist[opmission] = basemissions[opmission] + return pickweight_float(doablemissionlist) + /datum/controller/subsystem/missions/proc/get_researcher_name() var/group = pick(list( diff --git a/code/controllers/subsystem/overmap.dm b/code/controllers/subsystem/overmap.dm index 4ed1681b5417..0123de41f6a8 100644 --- a/code/controllers/subsystem/overmap.dm +++ b/code/controllers/subsystem/overmap.dm @@ -56,7 +56,10 @@ SUBSYSTEM_DEF(overmap) dynamic_encounters = list() events = list() - default_system = create_new_star_system(new /datum/overmap_star_system/shiptest) + //default_system = create_new_star_system(new /datum/overmap_star_system/shiptest) + default_system = create_new_star_system(new /datum/overmap_star_system/greenstar) + create_new_star_system(new /datum/overmap_star_system/yellowstar) + create_new_star_system(new /datum/overmap_star_system/redstar) return ..() /datum/controller/subsystem/overmap/proc/spawn_new_star_system(datum/overmap_star_system/system_to_spawn=/datum/overmap_star_system) @@ -282,6 +285,8 @@ SUBSYSTEM_DEF(overmap) ///Type of the star var/datum/overmap/star/startype + var/sector_type = YELLOW_STAR + ///Defines which generator to use for the overmap var/generator_type ///List of all overmap objects in the star system. @@ -345,6 +350,10 @@ SUBSYSTEM_DEF(overmap) //can our pallete be selected randomly roundstart? set to no for subtypes or if you dont change the pallete var/can_be_selected_randomly = TRUE + var/rewardmult = 1 + + var/list/mission_catalogue = list() + COOLDOWN_DECLARE(dynamic_despawn_cooldown) /datum/overmap_star_system/New(generate_now=TRUE) @@ -355,7 +364,7 @@ SUBSYSTEM_DEF(overmap) if(!starname) starname = gen_star_name() //we reuse this for the name of the star if name isnt defined, like a uncharted sector or something if(!name) - name = starname //we then give it here + name = starname + " (" + sector_type +")"//we then give it here overmap_objects = list() controlled_ships = list() outposts = list() @@ -593,7 +602,7 @@ SUBSYSTEM_DEF(overmap) ) vlevel.reserve_margin(QUADRANT_SIZE_BORDER) - + mapgen.difficulty = dynamic_datum.difficulty mapgen.pre_generation(dynamic_datum) // the generataed turfs start unpopulated (i.e. no flora / fauna / etc.). we add that AFTER placing the ruin, relying on the ruin's areas to determine what gets populated @@ -918,6 +927,49 @@ SUBSYSTEM_DEF(overmap) return list("x" = edge_x, "y" = edge_y) +/datum/overmap_star_system/proc/get_overmap_planet_types() + var/list/tally = list() + for(var/overmap_object in overmap_objects) + if(istype(overmap_object,/datum/overmap/dynamic)) + var/datum/overmap/dynamic/d = overmap_object + if(d.planet) + if(tally[d.planet.type]) + tally[d.planet.type] += 1 + else + tally[d.planet.type] = 1 + return tally + +/datum/overmap_star_system/proc/get_overmap_planet_drillable_types() + var/list/tally = list() + for(var/overmap_object in overmap_objects) + if(istype(overmap_object,/datum/overmap/dynamic)) + var/datum/overmap/dynamic/d = overmap_object + if(d.planet && d.planet.vein) + if(tally[d.planet.type]) + tally[d.planet.type] += 1 + else + tally[d.planet.type] = 1 + return tally + +/datum/overmap_star_system/proc/get_overmap_object_types() + var/list/tally = list() + for(var/overmap_object in overmap_objects) + if(istype(overmap_object,/datum/overmap/dynamic)) + var/datum/overmap/dynamic/d = overmap_object + if(d.planet) + if(tally[d.planet.type]) + tally[d.planet.type] += 1 + else + tally[d.planet.type] = 1 + else if(istype(overmap_object, /datum/overmap/event)) + var/datum/overmap/event/e = overmap_object + if(tally[e.basetype]) + tally[e.basetype] += 1 + else + tally[e.basetype] = 1 + return tally + + //meant to be a duplicate of default to be selectable in the spawn menu /datum/overmap_star_system/wilderness can_be_selected_randomly = FALSE @@ -1120,3 +1172,81 @@ SUBSYSTEM_DEF(overmap) The [span_notice("MODIF. OVERMAP")] tool is similar in usuage to BUILD ADV but to manipulate the overmap only. "} return ..() + +/datum/overmap_star_system/greenstar + + has_outpost = TRUE + encounters_refresh = TRUE + //main colors, used for dockable terrestrials, and background + secondary_color = "#1d4627" + overmap_icon_state = "overmap" + sector_type = GREEN_STAR + dynamic_probabilities = list( + DYNAMIC_WORLD_BEACHPLANET = 50, + DYNAMIC_WORLD_DESERT = 5, + DYNAMIC_WORLD_JUNGLE = 10, + DYNAMIC_WORLD_MOON = 20, + DYNAMIC_WORLD_ASTEROID = 20 + ) + mission_catalogue = list(\ + /datum/mission/outpost/survey/garden = 20, + /datum/mission/outpost/research/meteor = 5, + /datum/mission/outpost/research/carp = 5, + /datum/mission/outpost/research/dust = 5, + /datum/mission/outpost/research/radstorm = 5, + /datum/mission/outpost/research/ion = 5, + /datum/mission/outpost/research/flare = 5, + /datum/mission/outpost/drill = 10, + /datum/mission/outpost/drill/classtwo = 5, + /datum/mission/outpost/drill/classthree = 1 + ) + + rewardmult = 0.5 + + +/datum/overmap_star_system/yellowstar + + has_outpost = TRUE + secondary_color = "#524f28" + overmap_icon_state = "overmap" + sector_type = YELLOW_STAR + dynamic_probabilities = list( + DYNAMIC_WORLD_WASTEPLANET = 10, + DYNAMIC_WORLD_DESERT = 20, + DYNAMIC_WORLD_JUNGLE = 5, + DYNAMIC_WORLD_LAVA = 20, + DYNAMIC_WORLD_SAND = 20, + DYNAMIC_WORLD_ROCKPLANET = 5, + DYNAMIC_WORLD_ICE = 20, + DYNAMIC_WORLD_MOON = 20, + DYNAMIC_WORLD_ASTEROID = 20, + DYNAMIC_WORLD_SPACERUIN = 20 + ) + mission_catalogue = list(\ + /datum/mission/outpost/survey/garden/waste = 10, + /datum/mission/outpost/survey/garden/ice = 10, + /datum/mission/outpost/survey/garden/arid = 10, + /datum/mission/outpost/drill = 10, + /datum/mission/outpost/drill/classtwo = 30, + /datum/mission/outpost/drill/classthree = 10 + ) + rewardmult = 1 + +/datum/overmap_star_system/redstar + has_outpost = TRUE + secondary_color = "#522828" + overmap_icon_state = "overmap" + sector_type = RED_STAR + dynamic_probabilities = list( + DYNAMIC_WORLD_WASTEPLANET = 50, + DYNAMIC_WORLD_LAVA = 50, + DYNAMIC_WORLD_ICE = 50, + DYNAMIC_WORLD_JUNGLE_INFESTED = 50, + DYNAMIC_WORLD_SPACERUIN = 40 + ) + mission_catalogue = list(\ + /datum/mission/outpost/drill = 5, + /datum/mission/outpost/drill/classtwo = 10, + /datum/mission/outpost/drill/classthree = 50 + ) + rewardmult = 2 diff --git a/code/datums/anomaly_loadout/anomaly_loadouts.dm b/code/datums/anomaly_loadout/anomaly_loadouts.dm index 741b7bc786db..3bcdcfe2cd48 100644 --- a/code/datums/anomaly_loadout/anomaly_loadouts.dm +++ b/code/datums/anomaly_loadout/anomaly_loadouts.dm @@ -578,10 +578,10 @@ "price" = 600, "faction" = FALSE, ) - GLOB.anomaly_loadout_utility_indie[/obj/item/storage/box/emptysandbags] = list( - "name" = "box of empty sandbags", - "desc" = "Fortifications on a budget", - "price" = 150, + GLOB.anomaly_loadout_utility_indie[/obj/item/stack/sandbags_empty/full] = list( + "name" = "50 empty sandbags", + "desc" = "Fortifications on a budget. Sand sold seperately. Can also be filled with snow!", + "price" = 100, "faction" = FALSE, ) GLOB.anomaly_loadout_utility_indie[/obj/item/grenade/smokebomb] = list( diff --git a/code/datums/mapgen/_MapGenerator.dm b/code/datums/mapgen/_MapGenerator.dm index 87be782987e0..db01b7916064 100644 --- a/code/datums/mapgen/_MapGenerator.dm +++ b/code/datums/mapgen/_MapGenerator.dm @@ -1,8 +1,11 @@ /// Management class used to handle successive calls used to generate a list of turfs. /datum/map_generator + var/difficulty = 1 /// Gets the overmap object this is tied to and do checks before generating /datum/map_generator/proc/pre_generation(datum/overmap/our_planet) + var/datum/overmap/dynamic/actual_our_planet = our_planet + difficulty = actual_our_planet.difficulty return /// Goes through the planet's turfs again, for touchups or more importantly, greebles. diff --git a/code/datums/mapgen/_biome.dm b/code/datums/mapgen/_biome.dm index 02c527b41042..80b99b24472d 100644 --- a/code/datums/mapgen/_biome.dm +++ b/code/datums/mapgen/_biome.dm @@ -65,7 +65,7 @@ /// The features and creatures compare against and add to the lists passed to determine /// if they can spawn at the tested turf. This method of checking reduces the amount of /// time spent populating a planet. -/datum/biome/proc/populate_turf(turf/gen_turf, list/feature_list, list/mob_list) +/datum/biome/proc/populate_turf(turf/gen_turf, list/feature_list, list/mob_list, difficultymod) if(isclosedturf(gen_turf)) return @@ -98,12 +98,15 @@ if(can_spawn) spawned_feature = new feature_type(open_turf) + if(istype(spawned_feature, /obj/structure/vein)) + var/obj/structure/vein/v = spawned_feature + v.difficultymod = difficultymod // insert at the head of the list, so the most recent features get checked first feature_list.Insert(1, spawned_feature) open_turf.flags_1 |= NO_LAVA_GEN_1 //MOB SPAWNING HERE - if(length(mob_spawn_list_expanded) && !spawned_flora && !spawned_feature && prob(mob_spawn_chance) && (a_flags & MOB_SPAWN_ALLOWED)) + if(length(mob_spawn_list_expanded) && !spawned_flora && !spawned_feature && prob(mob_spawn_chance*difficultymod) && (a_flags & MOB_SPAWN_ALLOWED)) var/atom/picked_mob = pick(mob_spawn_list_expanded) var/can_spawn = TRUE diff --git a/code/datums/mapgen/planetary/AsteroidGenerator.dm b/code/datums/mapgen/planetary/AsteroidGenerator.dm index 77aaab08dae6..085322316ebf 100644 --- a/code/datums/mapgen/planetary/AsteroidGenerator.dm +++ b/code/datums/mapgen/planetary/AsteroidGenerator.dm @@ -95,7 +95,7 @@ return mountain_height = nearby_event.mountain_height_override - return TRUE + difficulty = 1 /datum/biome/asteroid open_turf_types = list( diff --git a/code/datums/mapgen/planetary/JungleGenerator.dm b/code/datums/mapgen/planetary/JungleGenerator.dm index da64603297fb..59f596c603fc 100644 --- a/code/datums/mapgen/planetary/JungleGenerator.dm +++ b/code/datums/mapgen/planetary/JungleGenerator.dm @@ -1,6 +1,6 @@ /datum/map_generator/planet_generator/jungle perlin_zoom = 65 - mountain_height = 0.85 + mountain_height = 0.60 primary_area_type = /area/overmap_encounter/planetoid/jungle diff --git a/code/datums/mapgen/planetary/JungleInfestedGenerator.dm b/code/datums/mapgen/planetary/JungleInfestedGenerator.dm new file mode 100644 index 000000000000..f906095c152b --- /dev/null +++ b/code/datums/mapgen/planetary/JungleInfestedGenerator.dm @@ -0,0 +1,218 @@ +/datum/map_generator/planet_generator/jungle_infested + perlin_zoom = 65 + mountain_height = 0.30 + + primary_area_type = /area/overmap_encounter/planetoid/jungle_infested + + biome_table = list( + BIOME_COLDEST = list( + BIOME_LOWEST_HUMIDITY = /datum/biome/jungle_wasteland, + BIOME_LOW_HUMIDITY = /datum/biome/jungle_wasteland, + BIOME_MEDIUM_HUMIDITY = /datum/biome/jungle_infested/plains, + BIOME_HIGH_HUMIDITY = /datum/biome/jungle_infested/plains, + BIOME_HIGHEST_HUMIDITY = /datum/biome/mudlands + ), + BIOME_COLD = list( + BIOME_LOWEST_HUMIDITY = /datum/biome/jungle_wasteland, + BIOME_LOW_HUMIDITY = /datum/biome/jungle_infested/plains, + BIOME_MEDIUM_HUMIDITY = /datum/biome/jungle_infested, + BIOME_HIGH_HUMIDITY = /datum/biome/mudlands, + BIOME_HIGHEST_HUMIDITY = /datum/biome/mudlands + ), + BIOME_WARM = list( + BIOME_LOWEST_HUMIDITY = /datum/biome/jungle_infested, + BIOME_LOW_HUMIDITY = /datum/biome/jungle_infested, + BIOME_MEDIUM_HUMIDITY = /datum/biome/mudlands, + BIOME_HIGH_HUMIDITY = /datum/biome/mudlands, + BIOME_HIGHEST_HUMIDITY = /datum/biome/jungle_infested + ), + BIOME_TEMPERATE = list( + BIOME_LOWEST_HUMIDITY = /datum/biome/jungle_infested/dense, + BIOME_LOW_HUMIDITY = /datum/biome/mudlands, + BIOME_MEDIUM_HUMIDITY = /datum/biome/jungle/water, + BIOME_HIGH_HUMIDITY = /datum/biome/jungle/water, + BIOME_HIGHEST_HUMIDITY = /datum/biome/mudlands + ), + BIOME_HOT = list( + BIOME_LOWEST_HUMIDITY = /datum/biome/jungle_infested, + BIOME_LOW_HUMIDITY = /datum/biome/jungle_infested, + BIOME_MEDIUM_HUMIDITY = /datum/biome/jungle_infested/dense, + BIOME_HIGH_HUMIDITY = /datum/biome/jungle_infested/dense, + BIOME_HIGHEST_HUMIDITY = /datum/biome/jungle_infested/dense + ), + BIOME_HOTTEST = list( + BIOME_LOWEST_HUMIDITY = /datum/biome/jungle_infested/dense, + BIOME_LOW_HUMIDITY = /datum/biome/jungle_infested/dense, + BIOME_MEDIUM_HUMIDITY = /datum/biome/mudlands, + BIOME_HIGH_HUMIDITY = /datum/biome/jungle/water, + BIOME_HIGHEST_HUMIDITY = /datum/biome/jungle/water + ) + ) + + cave_biome_table = list( + BIOME_COLDEST_CAVE = list( + BIOME_LOWEST_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_LOW_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_MEDIUM_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_HIGH_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_HIGHEST_HUMIDITY = /datum/biome/cave/jungle_infested + ), + BIOME_COLD_CAVE = list( + BIOME_LOWEST_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_LOW_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_MEDIUM_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_HIGH_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_HIGHEST_HUMIDITY = /datum/biome/cave/jungle_infested + ), + BIOME_WARM_CAVE = list( + BIOME_LOWEST_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_LOW_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_MEDIUM_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_HIGH_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_HIGHEST_HUMIDITY = /datum/biome/cave/jungle_infested + ), + BIOME_HOT_CAVE = list( + BIOME_LOWEST_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_LOW_HUMIDITY = /datum/biome/cave/jungle_infested, + BIOME_MEDIUM_HUMIDITY = /datum/biome/cave/lush_infested, + BIOME_HIGH_HUMIDITY = /datum/biome/cave/lush_infested, + BIOME_HIGHEST_HUMIDITY = /datum/biome/cave/lush_infested + ) + ) + +/datum/biome/jungle_infested + open_turf_types = list(/turf/open/floor/plating/asteroid/dirt/grass/jungle = 1) + flora_spawn_list = list( + /obj/structure/flora/grass/jungle = 1, + /obj/structure/flora/grass/jungle/b = 1, + /obj/structure/flora/tree/jungle = 3, + /obj/structure/flora/rock/jungle = 1, + /obj/structure/flora/junglebush = 1, + /obj/structure/flora/junglebush/b = 1, + /obj/structure/flora/junglebush/c = 1, + /obj/structure/flora/junglebush/large = 1, + /obj/structure/spacevine/dense = 8, + /obj/structure/spacevine/dense = 2, + /obj/structure/flora/ash/garden = 1, + ) + flora_spawn_chance = 75 + mob_spawn_chance = 5 + mob_spawn_list = list( + /mob/living/simple_animal/hostile/poison/giant_spider/hunter = 10, + /mob/living/simple_animal/hostile/poison/giant_spider/tarantula = 10, + /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper = 10, + /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife = 10, + ) + + feature_spawn_chance = 1.4 + feature_spawn_list = list( + /obj/structure/vein/jungle_infested = 2, + /obj/structure/vein/jungle_infested/classtwo = 2, + /obj/structure/vein/jungle_infested/classtwo/rare = 4, + /obj/structure/vein/jungle_infested/classthree = 2, + /obj/structure/vein/jungle_infested/classthree/rare = 6, + /obj/effect/greeble_spawner/grass_patch_spawner/dark_jungle = 20, + /obj/effect/greeble_spawner/grass_patch_spawner/yellow_jungle = 50, + ) + +/datum/biome/jungle_infested/dense + flora_spawn_chance = 85 + open_turf_types = list(/turf/open/floor/plating/asteroid/dirt/grass/jungle = 1, /turf/open/floor/plating/asteroid/dirt/jungle/dark = 9) + flora_spawn_list = list( + /obj/structure/flora/grass/jungle = 1, + /obj/structure/flora/grass/jungle/b = 1, + /obj/structure/flora/tree/jungle = 5, + /obj/structure/flora/rock/jungle = 1, + /obj/structure/flora/junglebush = 1, + /obj/structure/flora/junglebush/b = 1, + /obj/structure/flora/junglebush/c = 1, + /obj/structure/flora/junglebush/large = 1, + /obj/structure/spacevine/dense = 20, + /obj/structure/flora/ash/garden = 1, + ) + mob_spawn_chance = 5 + feature_spawn_chance = 2 + +/datum/biome/jungle_infested/plains + open_turf_types = list(/turf/open/floor/plating/asteroid/dirt/grass/jungle = 1) + flora_spawn_chance = 50 + mob_spawn_chance = 10 + mob_spawn_list = list( + /mob/living/simple_animal/hostile/poison/giant_spider/hunter = 10, + /mob/living/simple_animal/hostile/poison/giant_spider/tarantula = 10, + /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper = 10, + /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife = 10, + ) + +/datum/biome/cave/jungle_infested + open_turf_types = list(/turf/open/floor/plating/asteroid/dirt/jungle = 10, /turf/open/floor/plating/asteroid/dirt/jungle/dark = 10) + closed_turf_types = list(/turf/closed/mineral/random/jungle_infested = 1) + flora_spawn_chance = 5 + flora_spawn_list = list( + /obj/structure/flora/rock/jungle = 1, + /obj/structure/flora/rock/pile = 1, + /obj/structure/flora/rock = 1, + /obj/structure/flora/ash/space = 1, + /obj/structure/flora/ash/leaf_shroom = 1, + /obj/structure/flora/ash/cap_shroom = 1, + /obj/structure/flora/ash/stem_shroom = 1, + /obj/structure/flora/ash/puce = 1, + ) + mob_spawn_chance = 20 + mob_spawn_list = list( + /mob/living/simple_animal/hostile/alien = 5, + /mob/living/simple_animal/hostile/alien/sentinel = 5, + /mob/living/simple_animal/hostile/alien/queen = 1, + /mob/living/simple_animal/hostile/alien/drone = 5, + ) + feature_spawn_chance = 40 + feature_spawn_list = list( + /obj/structure/alien/weeds/node = 60, + /obj/structure/alien/egg/grown = 10, + /obj/item/pickaxe/rusted = 1, + /obj/effect/spawner/random/anomaly/jungle = 2, + /obj/structure/vein/jungle_infested = 8, + /obj/structure/vein/jungle_infested/classtwo = 4, + ) + + +/datum/biome/cave/lush_infested + open_turf_types = list(/turf/open/floor/plating/asteroid/dirt/grass/jungle = 1) + closed_turf_types = list(/turf/closed/mineral/random/jungle_infested = 1) + flora_spawn_chance = 50 + flora_spawn_list = list( + /obj/structure/flora/tree/jungle/small = 1, + /obj/structure/flora/ausbushes/brflowers = 1, + /obj/structure/flora/ausbushes/fernybush = 1, + /obj/structure/flora/ausbushes/fullgrass = 1, + /obj/structure/flora/ausbushes/genericbush = 1, + /obj/structure/flora/ausbushes/grassybush = 1, + /obj/structure/flora/ausbushes/lavendergrass = 1, + /obj/structure/flora/ausbushes/lavendergrass = 1, + /obj/structure/flora/ausbushes/leafybush = 1, + /obj/structure/flora/ausbushes/palebush = 1, + /obj/structure/flora/ausbushes/pointybush = 1, + /obj/structure/flora/ausbushes/ppflowers = 1, + /obj/structure/flora/ausbushes/reedbush = 1, + /obj/structure/flora/ausbushes/sparsegrass = 1, + /obj/structure/flora/ausbushes/stalkybush = 1, + /obj/structure/flora/ausbushes/stalkybush = 1, + /obj/structure/flora/ausbushes/sunnybush = 1, + /obj/structure/flora/ausbushes/ywflowers = 1, + /obj/structure/spacevine/dense = 20, + /obj/structure/spacevine/dense = 20, + /obj/structure/flora/rock/jungle = 1, + /obj/structure/flora/ash/garden = 1, + /obj/structure/flora/ash/space/voidmelon = 1 + ) + mob_spawn_chance = 20 + mob_spawn_list = list( + /mob/living/simple_animal/hostile/alien = 1, + /mob/living/simple_animal/hostile/alien/sentinel = 1, + /mob/living/simple_animal/hostile/alien/drone = 1, + ) + feature_spawn_chance = 60 + feature_spawn_list = list( + /obj/structure/alien/weeds/node = 20, + /obj/structure/alien/egg/grown = 10, + ) diff --git a/code/datums/mapgen/planetary/_PlanetGenerator.dm b/code/datums/mapgen/planetary/_PlanetGenerator.dm index b99714f6e6f5..9c93ad8c919e 100644 --- a/code/datums/mapgen/planetary/_PlanetGenerator.dm +++ b/code/datums/mapgen/planetary/_PlanetGenerator.dm @@ -59,6 +59,7 @@ var/list/turf_biome_cache + /datum/map_generator/planet_generator/New(...) // initialize the perlin seeds height_seed = rand(0, 50000) @@ -100,7 +101,7 @@ return var/datum/biome/turf_biome = get_biome(gen_turf) - turf_biome.populate_turf(gen_turf, created_features, created_mobs) + turf_biome.populate_turf(gen_turf, created_features, created_mobs, difficulty) /// Checks the turf biome cache for the biome of the passed turf; if none is found, it is generated. /datum/map_generator/planet_generator/proc/get_biome(turf/a_turf) diff --git a/code/datums/mapgen/single_biome/_SingleBiome.dm b/code/datums/mapgen/single_biome/_SingleBiome.dm index 3f793dc7df70..7262f864590c 100644 --- a/code/datums/mapgen/single_biome/_SingleBiome.dm +++ b/code/datums/mapgen/single_biome/_SingleBiome.dm @@ -58,4 +58,4 @@ if(!(A.area_flags & CAVES_ALLOWED)) return - biome.populate_turf(gen_turf, created_features, created_mobs) + biome.populate_turf(gen_turf, created_features, created_mobs, difficulty) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 3e3032cd0dd4..0aefb5d31372 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -133,7 +133,7 @@ deconstruct() /obj/structure/barricade/sandbags/make_debris() - new /obj/item/stack/sheet/mineral/sandbags(get_turf(src), 1) + new /obj/item/stack/sandbags(get_turf(src), 3) /obj/structure/barricade/sandbags/examine(mob/user) . = ..() diff --git a/code/game/machinery/shuttle/shuttle_engine.dm b/code/game/machinery/shuttle/shuttle_engine.dm index a94e30757b5c..49341df92157 100644 --- a/code/game/machinery/shuttle/shuttle_engine.dm +++ b/code/game/machinery/shuttle/shuttle_engine.dm @@ -81,3 +81,9 @@ if(do_after(user, MIN_TOOL_SOUND_DELAY, target=src)) enabled = !enabled to_chat(user, "You [enabled ? "enable" : "disable"] [src].") + +/obj/machinery/power/shuttle/engine/proc/operational() + return TRUE + +/obj/machinery/power/shuttle/engine/proc/disable(time) + return diff --git a/code/game/machinery/shuttle/shuttle_engine_types.dm b/code/game/machinery/shuttle/shuttle_engine_types.dm index f54d139ae261..7a9852dc7cd2 100644 --- a/code/game/machinery/shuttle/shuttle_engine_types.dm +++ b/code/game/machinery/shuttle/shuttle_engine_types.dm @@ -205,9 +205,19 @@ icon_state_closed = "burst" icon_state_open = "burst_open" thrust = 10 + var/disableuntil = 0 ///Amount, in kilojoules, needed for a full burn. var/power_per_burn = 50000 +/obj/machinery/power/shuttle/engine/electric/operational() + if(world.time >= disableuntil) + return TRUE + else + return FALSE + +/obj/machinery/power/shuttle/engine/electric/disable(time) + disableuntil = world.time + time + /obj/machinery/power/shuttle/engine/electric/bad name = "Outdated Ion Thruster" circuit = /obj/item/circuitboard/machine/shuttle/engine/electric/bad diff --git a/code/game/objects/items/barricades/sandbags.dm b/code/game/objects/items/barricades/sandbags.dm new file mode 100644 index 000000000000..32aaa1f75fd1 --- /dev/null +++ b/code/game/objects/items/barricades/sandbags.dm @@ -0,0 +1,109 @@ +/obj/item/stack/sandbags_empty + name = "empty sandbags" + desc = "Some empty sandbags, best to fill them up with some sand if you want to use them." + singular_name = "sandbag" + icon_state = "sandbag_stack" + //worn_icon_state = "sandbag_stack" + lefthand_file = 'icons/mob/inhands/barricades/stacks_left.dmi' + righthand_file = 'icons/mob/inhands/barricades/stacks_right.dmi' + force = 2 + throw_speed = 5 + throw_range = 20 + max_amount = 50 + attack_verb = list("hits", "bludgeons", "whacks") + //number_of_extra_variants = 3 + + +/obj/item/stack/sandbags_empty/attackby(obj/item/I, mob/user, params) + . = ..() + if(.) + return + + if(istype(I, /obj/item/stack/ore/glass)) + var/obj/item/stack/ore/glass/G = I + to_chat(user, span_notice("You fill the sandbag.")) + var/obj/item/stack/sandbags/newsandbags = new /obj/item/stack/sandbags(drop_location()) + + if (Adjacent(user) && !issilicon(user)) + user.put_in_hands(newsandbags) + G.use(1) + use(1) + + else if(istype(I, /obj/item/stack/sheet/mineral/snow)) + var/obj/item/stack/S = I + to_chat(user, span_notice("You fill the sandbag... snowbag? You fill it.")) + new /obj/item/stack/sandbags(user.loc) + //new_bags.add_to_stacks(user) + S.use(1) + use(1) + +///To be used for cloth crafting +/obj/item/stack/sandbags_empty/five + amount = 5 + +//half a max stack +/obj/item/stack/sandbags_empty/half + amount = 25 + +//max stack +/obj/item/stack/sandbags_empty/full + amount = 50 + +//Full sandbags +/obj/item/stack/sandbags + name = "sandbags" + desc = "Some bags filled with sand. For now, just cumbersome, but soon to be used for fortifications." + singular_name = "sandbag" + icon_state = "sandbag_pile" + //worn_icon_state = "sandbag_pile" + lefthand_file = 'icons/mob/inhands/barricades/stacks_left.dmi' + righthand_file = 'icons/mob/inhands/barricades/stacks_right.dmi' + force = 9 + throwforce = 15 + throw_speed = 5 + throw_range = 20 + max_amount = 25 + attack_verb = list("hits", "bludgeons", "whacks") + merge_type = /obj/item/stack/sandbags + + +/obj/item/stack/sandbags/Initialize(mapload, new_amount, merge = TRUE) + . = ..() + update_appearance() + +/obj/item/stack/sandbags/examine(mob/user) + . = ..() + . += span_notice("Alt click while selected to empty [src].") + +/obj/item/stack/sandbags/large_stack + amount = 25 + + +/obj/item/stack/sandbags/get_main_recipes() + . = ..() + . += list(new/datum/stack_recipe("sandbag barricade", /obj/structure/advbarricade/sandbags, 5, time = 2 SECONDS, window_checks = TRUE)) + +/obj/item/stack/sandbags/AltClick(mob/user) + . = ..() + if(get_amount() < 1) + return + if(!do_after(user, 0.5 SECONDS, IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE, user)) + return + user.balloon_alert(user, "You start emptying [src].") + while(get_amount() > 0) + if(!do_after(user, 0.5 SECONDS, IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE, user)) + user.balloon_alert(user, "You stop emptying [src].") + break + // check if we can stuff it into the user's hands + if(!use(1)) + break + if(amount < 1) + user.balloon_alert(user, "You finish emptying [src].") + var/obj/item/stack/sandbag = user.get_inactive_held_item() + if(istype(sandbag, /obj/item/stack/sandbags_empty) && sandbag.add(1)) + continue + var/obj/item/stack/sandbags_empty/E = new(get_turf(user)) + if(!sandbag && user.put_in_hands(E)) + continue + //E.add_to_stacks(user) + diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 6701569352ef..79744db12065 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -54,7 +54,7 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ * Sandbags */ -/obj/item/stack/sheet/mineral/sandbags +/*/obj/item/stack/sheet/mineral/sandbags name = "sandbags" icon_state = "sandbags" singular_name = "sandbag" @@ -87,7 +87,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ G.use(1) else return ..() - +*/ /* * Diamond */ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 0f730ab7b7b0..34135debebc0 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -252,7 +252,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("towel", /obj/item/towel, 2), \ new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \ new/datum/stack_recipe("double bedsheet", /obj/item/bedsheet/double, 4), \ - new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \ + new/datum/stack_recipe("empty sandbag", /obj/item/stack/sandbags_empty/five, 1), \ null, \ new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1), \ new/datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 3), \ diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 66841bd85417..a04e7136ca46 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -542,6 +542,7 @@ STR.set_holdable(list(/obj/item/ammo_casing/spent/,/obj/item/ammo_casing)) STR.max_w_class = WEIGHT_CLASS_TINY STR.max_items = 500 + STR.max_combined_w_class = 500 /obj/item/storage/bag/bullet/equipped(mob/user) . = ..() diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index be1fd38f9d7c..3623f8db91e1 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1075,13 +1075,6 @@ new /obj/item/food/grown/cabbage(src) new /obj/item/food/grown/chili(src) -/obj/item/storage/box/emptysandbags - name = "box of empty sandbags" - illustration = "sandbag" - -/obj/item/storage/box/emptysandbags/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/emptysandbag(src) /obj/item/storage/box/rndboards name = "\proper the liberator's legacy" diff --git a/code/game/objects/structures/barricade/advbarricade.dm b/code/game/objects/structures/barricade/advbarricade.dm new file mode 100644 index 000000000000..301aa048ef68 --- /dev/null +++ b/code/game/objects/structures/barricade/advbarricade.dm @@ -0,0 +1,248 @@ +/obj/structure/advbarricade + climbable = TRUE + anchored = TRUE + density = TRUE + layer = BELOW_OBJ_LAYER + flags_1 = ON_BORDER_1 + obj_flags = CAN_BE_HIT + //resistance_flags = XENO_DAMAGEABLE + //allow_pass_flags = PASS_DEFENSIVE_STRUCTURE|PASSABLE|PASS_WALKOVER + //climb_delay = 2 SECONDS + //interaction_flags = INTERACT_CHECK_INCAPACITATED + max_integrity = 100 + //barrier_flags = HANDLE_BARRIER_CHANCE + ///The type of stack the barricade dropped when disassembled if any. + var/stack_type + ///The amount of stack dropped when disassembled at full health + var/stack_amount = 5 + ///to specify a non-zero amount of stack to drop when destroyed + var/destroyed_stack_amount = 0 + var/base_acid_damage = 2 + var/barricade_type = "barricade" //"metal", "plasteel", etc. + ///Whether this barricade has damaged states + var/can_change_dmg_state = TRUE + ///Whether we can open/close this barrricade and thus go over it + var/closed = FALSE + ///Can this barricade type be wired + var/can_wire = FALSE + ///is this barriade wired? + var/is_wired = FALSE + ///Important for boolet passthrough, I believe? + var/faction + climbable = TRUE + +/obj/structure/advbarricade/Initialize(mapload, mob/user) + . = ..() + update_icon() + var/static/list/connections = list( + COMSIG_ATOM_EXIT = PROC_REF(on_try_exit) + ) + AddElement(/datum/element/connect_loc, connections) + if(user) + faction = user.faction + +/obj/structure/advbarricade/proc/handle_barrier_chance(mob/living/M) + return prob(max(30,(100.0*atom_integrity)/max_integrity)) + +/obj/structure/advbarricade/examine(mob/user) + . = ..() + if(is_wired) + . += span_info("There is a length of wire strewn across the top of this barricade.") + switch((atom_integrity / max_integrity) * 100) + if(75 to INFINITY) + . += span_info("It appears to be in good shape.") + if(50 to 75) + . += span_warning("It's slightly damaged, but still very functional.") + if(25 to 50) + . += span_warning("It's quite beat up, but it's holding together.") + if(-INFINITY to 25) + . += span_warning("It's crumbling apart, just a few more blows will tear it apart.") + +/obj/structure/advbarricade/proc/on_try_exit(datum/source, atom/movable/mover, direction) + + if(mover == src) + return + if(!(direction & dir)) + return + if(!density) + return + if(mover.throwing) + return + if(mover.movement_type & (PHASING | FLYING | FLOATING)) + return + return COMPONENT_ATOM_BLOCK_EXIT + +/obj/structure/advbarricade/CanAllowThrough(atom/movable/mover, turf/target) + if(get_dir(loc, target) & dir) + if(is_wired && density && ismob(mover)) + return FALSE + + return ..() + +/*/obj/structure/advbarricade/attack_animal(mob/user) + return attack_alien(user)*/ + +/*/obj/structure/advbarricade/attack_alien(mob/living/carbon/xenomorph/xeno_attacker, damage_amount = xeno_attacker.xeno_caste.melee_damage, damage_type = BRUTE, armor_type = MELEE, effects = TRUE, armor_penetration = xeno_attacker.xeno_caste.melee_ap, isrightclick = FALSE) + if(xeno_attacker.status_flags & INCORPOREAL) + return FALSE + + if(is_wired) + balloon_alert(xeno_attacker, "Wire slices into us") + xeno_attacker.apply_damage(15, blocked = MELEE , sharp = TRUE, updating_health = TRUE) + + return ..() +*/ + +/obj/structure/advbarricade/attackby(obj/item/I, mob/user, params) + . = ..() + if(.) + return + + /*if(!istype(I, /obj/item/stack/barbed_wire) || !can_wire) + return + + var/obj/item/stack/barbed_wire/B = I + + balloon_alert_to_viewers("Setting up wire...") + if(!do_after(user, 2 SECONDS, NONE, src, BUSY_ICON_BUILD) || !can_wire) + return + + playsound(loc, 'sound/effects/barbed_wire_movement.ogg', 25, 1) + + B.use(1) + wire() + */ + +/obj/structure/advbarricade/proc/wire() + can_wire = FALSE + is_wired = TRUE + climbable = FALSE + modify_max_integrity(max_integrity + 50) + update_icon() + +/obj/structure/advbarricade/wirecutter_act(mob/living/user, obj/item/I) + if(!is_wired) + return FALSE + + balloon_alert_to_viewers("Removing wire...") + + if(!do_after(user, 2 SECONDS, NONE, src)) + return TRUE + + playsound(loc, 'sound/items/wirecutter.ogg', 25, TRUE) + balloon_alert_to_viewers("Removes the barbed wire") + modify_max_integrity(max_integrity - 50) + can_wire = TRUE + is_wired = FALSE + climbable = TRUE + update_icon() + //new /obj/item/stack/barbed_wire(loc) + + +/obj/structure/advbarricade/deconstruct(disassembled = TRUE, mob/living/blame_mob) + /*if(disassembled && is_wired) + new /obj/item/stack/barbed_wire(loc) TODO : BARBED WIRES!!!!*/ + if(stack_type) + var/stack_amt + if(!disassembled && destroyed_stack_amount) + stack_amt = destroyed_stack_amount + else + stack_amt = round(stack_amount * (atom_integrity/max_integrity)) //Get an amount of sheets back equivalent to remaining health. Obviously, fully destroyed means 0 + + if(stack_amt) + new stack_type (loc, stack_amt) + return ..() + +/obj/structure/advbarricade/ex_act(severity) + switch(severity) + if(EXPLODE_DEVASTATE) + deconstruct(FALSE) + return + if(EXPLODE_HEAVY) + take_damage(rand(33, 66), BRUTE, BOMB) + if(EXPLODE_LIGHT) + take_damage(rand(10, 33), BRUTE, BOMB) + update_icon() + +/obj/structure/advbarricade/setDir(newdir) + . = ..() + update_icon() + +/obj/structure/advbarricade/update_icon_state() + . = ..() + var/damage_state + var/percentage = (atom_integrity / max_integrity) * 100 + switch(percentage) + if(-INFINITY to 25) + damage_state = 3 + if(25 to 50) + damage_state = 2 + if(50 to 75) + damage_state = 1 + if(75 to INFINITY) + damage_state = 0 + if(!closed) + if(can_change_dmg_state) + icon_state = "[barricade_type]_[damage_state]" + else + icon_state = "[barricade_type]" + switch(dir) + if(SOUTH) + layer = ABOVE_MOB_LAYER + if(NORTH) + layer = initial(layer) - 0.01 + else + layer = initial(layer) + if(!anchored) + layer = initial(layer) + else + if(can_change_dmg_state) + icon_state = "[barricade_type]_closed_[damage_state]" + else + icon_state = "[barricade_type]_closed" + layer = OBJ_LAYER + +/obj/structure/advbarricade/update_overlays() + . = ..() + if(is_wired) + if(!closed) + . += image(icon, icon_state = "[barricade_type]_wire") + else + . += image(icon, icon_state = "[barricade_type]_closed_wire") + + +/obj/structure/advbarricade/verb/rotate() + set name = "Rotate Barricade Counter-Clockwise" + set category = "IC.Object" + set src in oview(1) + + if(anchored) + balloon_alert(usr, "It's fastened to the floor") + return FALSE + + setDir(turn(dir, 90)) + +/obj/structure/advbarricade/verb/revrotate() + set name = "Rotate Barricade Clockwise" + set category = "IC.Object" + set src in oview(1) + + if(anchored) + balloon_alert(usr, "It's fastened to the floor") + return FALSE + + setDir(turn(dir, 270)) + + +/obj/structure/advbarricade/AltClick(mob/living/user) + if(anchored) + balloon_alert(usr, "It's fastened to the floor") + return FALSE + + setDir(turn(dir, 270)) + +/obj/structure/advbarricade/CanPass(atom/movable/mover, border_dir) + . = ..() + if(border_dir & dir) + return . || mover.throwing || mover.movement_type & (FLYING | FLOATING) + return TRUE \ No newline at end of file diff --git a/code/game/objects/structures/barricade/barricade.dm b/code/game/objects/structures/barricade/barricade.dm new file mode 100644 index 000000000000..96b342d9b876 --- /dev/null +++ b/code/game/objects/structures/barricade/barricade.dm @@ -0,0 +1,86 @@ +/obj/structure/advbarricade/sandbags + name = "sandbag barricade" + desc = "A bunch of bags filled with sand, stacked into a small wall. Surprisingly sturdy, albeit labour intensive to set up. Trusted to do the job since 1914." + icon = 'icons/obj/structures/barricades/sandbags.dmi' + icon_state = "sandbag_0" + max_integrity = 325 + barricade_type = "sandbag" + //soft_armor = list(MELEE = 0, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 0, BIO = 100, FIRE = 80, ACID = 40) + //coverage = 128 + //bar_material = 3 //For some raisin the barricade flags get undefined and I'm not sure if I want to redefine them. Just pretend that SAND is written here, the value remains the same. + can_wire = TRUE + climbable = TRUE + CanAtmosPass = ATMOS_PASS_PROC + flags_1 = ON_BORDER_1 + + +/obj/structure/advbarricade/sandbags/update_icon() + . = ..() + if(dir == SOUTH) + pixel_y = -7 + else if(dir == NORTH) + pixel_y = 7 + else + pixel_y = 0 + +/obj/structure/advbarricade/sandbags/MouseDrop(over_object, src_location, over_location) + . = ..() + if(over_object == usr && Adjacent(usr)) + if(src.flags_1 & NODECONSTRUCT_1) + return + if(!usr.canUseTopic(src, BE_CLOSE, ismonkey(usr))) + return + usr.visible_message(span_notice("[usr] begins pulling apart \the [src.name]..."), span_notice("You begin pulling apart \the [src.name]...")) + if(do_after(usr, 30, usr)) + deconstruct() + +/obj/structure/advbarricade/sandbags/attackby(obj/item/I, mob/user, params) + . = ..() + if(.) + return + + /*if(istype(I, /obj/item/tool/shovel) && user.a_intent != INTENT_HARM) + var/obj/item/tool/shovel/ET = I + if(ET.folded) + return TRUE + balloon_alert_to_viewers("disassembling...") + if(!do_after(user, ET.shovelspeed, NONE, src, BUSY_ICON_BUILD)) + return TRUE + user.visible_message(span_notice("[user] disassembles [src]."), + span_notice("You disassemble [src].")) + deconstruct(!get_self_acid()) + return TRUE + */ + if(istype(I, /obj/item/stack/sandbags)) + if(atom_integrity == max_integrity) + balloon_alert(user, "Already repaired") + return + var/obj/item/stack/sandbags/D = I + if(D.get_amount() < 1) + balloon_alert(user, "Not enough sandbags") + return + balloon_alert_to_viewers("Replacing sandbags...") + + if(!do_after(user, 3 SECONDS) || atom_integrity >= max_integrity) + return + + /*if(get_self_acid()) + balloon_alert(user, "It's melting!") + return*/ + + if(!D.use(1)) + return + + repair_damage(max_integrity * 0.2) //Each sandbag restores 20% of max health as 5 sandbags = 1 sandbag barricade. + balloon_alert_to_viewers("Repaired") + update_icon() + +/*/obj/structure/barricade/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + if(.) + return + + if(border_dir == dir) + return FALSE + return TRUE/ +*/ diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 05230e17bdbf..8d9dc8b67ffe 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -75,7 +75,7 @@ new /obj/item/holosign_creator/engineering(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/glasses/meson/engine(src) - new /obj/item/storage/box/emptysandbags(src) + new /obj/item/stack/sandbags_empty/full(src) new /obj/item/storage/bag/construction(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm index 893a86e77d96..9615bedef071 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm @@ -60,7 +60,7 @@ new /obj/item/stack/sheet/plasteel(src, 50) new /obj/item/stack/sheet/metal(src, 50) new /obj/item/stack/sheet/glass(src, 50) - new /obj/item/stack/sheet/mineral/sandbags(src, 30) + new /obj/item/stack/sandbags_empty/full(src) new /obj/item/clothing/shoes/magboots(src) new /obj/item/storage/box/smart_metal_foam(src) for(var/i in 1 to 3) diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 61ce73f78f65..f285fcc3a731 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -944,3 +944,22 @@ /turf/closed/mineral/random/moon/lit turf_type = /turf/open/floor/plating/asteroid/moon_coarse/dark/lit baseturfs = /turf/open/floor/plating/asteroid/moon_coarse/dark/lit + + +/turf/closed/mineral/random/jungle_infested + name = "bauxite" + desc = "Silt and mud are mummified, taking a rigid shape in the morning sun." + icon = 'icons/turf/walls/jungle_wall.dmi' + smooth_icon = 'icons/turf/walls/jungle_wall.dmi' + icon_state = "jungle_wall-0" + base_icon_state = "jungle_wall" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + canSmoothWith = list(SMOOTH_GROUP_MINERAL_WALLS) + turf_type = /turf/open/floor/plating/dirt/jungle + baseturfs = /turf/open/floor/plating/dirt/jungle + + mineralChance = 50 + + mineralSpawnChanceList = list(/obj/item/stack/ore/uranium = 2, /obj/item/stack/ore/diamond = 10, /obj/item/stack/ore/gold = 30, + /obj/item/stack/ore/silver = 20, /obj/item/stack/ore/iron = 20, /obj/item/stack/ore/titanium = 4 + ) diff --git a/code/modules/cargo/blackmarket/packs/misc.dm b/code/modules/cargo/blackmarket/packs/misc.dm index 00f2ac113108..190b200f185d 100644 --- a/code/modules/cargo/blackmarket/packs/misc.dm +++ b/code/modules/cargo/blackmarket/packs/misc.dm @@ -130,7 +130,7 @@ stock_max = 10 availability_prob = 30 -/datum/blackmarket_item/misc/capture_closet +/*/datum/blackmarket_item/misc/capture_closet name = "Lifeform Containment Unit" desc = "A reinforced containment unit for holding fauna. Won't work on anything that actually has two brain cells to rub together though." item = /obj/structure/closet/mob_capture @@ -138,6 +138,6 @@ cost_min = 250 cost_max = 750 stock_max = 3 - availability_prob = 30 + availability_prob = 30*/ diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index 05b1375ef2ff..11ac714ff6fd 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -43,7 +43,7 @@ // Prices have been heavily nerfed from the original values; mining is boring, so it shouldn't be a good way to make money. /datum/export/material/diamond - cost = 125 + cost = 100 unit_name = "cm3 of diamond" ///my gay ass does not need industrial quantities of diamonds extracted with the blood of hungry kepori. elasticity_coeff = 0.004 @@ -56,32 +56,32 @@ material_id = /datum/material/plasma /datum/export/material/uranium - cost = 25 + cost = 20 unit_name = "cm3 of uranium" sell_floor = 20 material_id = /datum/material/uranium /datum/export/material/gold - cost = 30 + cost = 20 unit_name = "cm3 of gold" sell_floor = 10 material_id = /datum/material/gold /datum/export/material/silver - cost = 15 + cost = 10 unit_name = "cm3 of silver" sell_floor = 10 material_id = /datum/material/silver /datum/export/material/titanium - cost = 30 + cost = 20 unit_name = "cm3 of titanium" sell_floor = 15 material_id = /datum/material/titanium /datum/export/material/bscrystal unit_name = "bluespace crystals" - cost = 75 + cost = 50 sell_floor = 50 material_id = /datum/material/bluespace diff --git a/code/modules/cargo/packs/sec_supply.dm b/code/modules/cargo/packs/sec_supply.dm index b9f698209463..871a65424726 100644 --- a/code/modules/cargo/packs/sec_supply.dm +++ b/code/modules/cargo/packs/sec_supply.dm @@ -28,9 +28,9 @@ /datum/supply_pack/sec_supply/empty_sandbags name = "Empty Sandbags" - desc = "Contains one box of seven empty sandbags for deployable cover in the field. Sand not included." - contains = list(/obj/item/storage/box/emptysandbags) - cost = 150 + desc = "Contains 50 empty sandbags for deployable cover in the field. Sand not included." + contains = list(/obj/item/stack/sandbags_empty/full) + cost = 100 crate_name = "sandbag crate" /datum/supply_pack/sec_supply/maintenance_kit diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 5d3b19b072c5..7e3f987071aa 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -48,8 +48,7 @@ /obj/structure/closet/secure_closet/miner/PopulateContents() ..() - new /obj/item/stack/sheet/mineral/sandbags(src, 5) - new /obj/item/storage/box/emptysandbags(src) + new /obj/item/stack/sandbags_empty/full(src) new /obj/item/shovel(src) new /obj/item/pickaxe/mini(src) new /obj/item/radio/headset/headset_cargo/mining(src) diff --git a/code/modules/mining/ore_veins.dm b/code/modules/mining/ore_veins.dm index cc3b4ba57d11..12b44414de18 100644 --- a/code/modules/mining/ore_veins.dm +++ b/code/modules/mining/ore_veins.dm @@ -29,13 +29,13 @@ GLOBAL_LIST_EMPTY(ore_veins) //Contents won't be randomized if the list isn't empty on initialize var/list/vein_contents = list() //Allows subtyped veins to determine how long it takes to mine one mining charge - var/mine_time_multiplier = 1 + var/mine_time_multiplier = 2 //Allows subtyped veins to determine how much loot is dropped per drop_ore call - var/drop_rate_amount_min = 15 - var/drop_rate_amount_max = 20 + var/drop_rate_amount_min = 1 + var/drop_rate_amount_max = 50 ///variables for the mob spawners we generate - var/max_mobs = 3 - var/spawn_time = 10 SECONDS + var/max_mobs = 5 + var/spawn_time = 8 SECONDS var/mob_types = list( /mob/living/simple_animal/hostile/asteroid/goliath/beast/nest = 60, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest = 20, @@ -54,8 +54,8 @@ GLOBAL_LIST_EMPTY(ore_veins) var/currently_spawning = FALSE ///how far away can we create mob_spawners? - var/spawn_distance_min = 4 - var/spawn_distance_max = 6 + var/spawn_distance_min = 6 + var/spawn_distance_max = 8 ///a list of currently active spawners created by the vein. Used to keep us from going insane when we turn them on / off @@ -68,7 +68,7 @@ GLOBAL_LIST_EMPTY(ore_veins) ///how long will our spawners create mobs for? var/wave_length = 45 SECONDS ///how long is our break after we do enough waves? - var/wave_downtime = 1 MINUTES + var/wave_downtime = 10 SECONDS ///var for a timer var/wave_timer @@ -78,6 +78,8 @@ GLOBAL_LIST_EMPTY(ore_veins) ///the drill currently digging us var/obj/machinery/drill/our_drill + var/difficultymod = 1 + //Generates amount of ore able to be pulled from the vein (mining_charges) and types of ore within it (vein_contents) /obj/structure/vein/Initialize() . = ..() @@ -136,7 +138,7 @@ GLOBAL_LIST_EMPTY(ore_veins) COOLDOWN_START(src, wave_timer, wave_length) if(!increment_wave_tally()) return FALSE - var/breaches_to_spawn = clamp(vein_class, 1, vein_class - length(active_spawners)) + var/breaches_to_spawn = clamp((vein_class * difficultymod), 2, (vein_class * difficultymod) - length(active_spawners)) for(var/mob_index in 1 to breaches_to_spawn) if(length(active_spawners) >= vein_class) return @@ -146,7 +148,7 @@ GLOBAL_LIST_EMPTY(ore_veins) var/obj/effect/drill_spawner/bug_breach = new /obj/effect/drill_spawner(spawning_tile) active_spawners += bug_breach bug_breach.our_vein = src - bug_breach.AddComponent(spawner_type, mob_types, spawn_time, faction, spawn_text, max_mobs, spawn_sound, spawner_distance_min, spawner_distance_max) + bug_breach.AddComponent(spawner_type, mob_types, spawn_time, faction, spawn_text, ceil(max_mobs * difficultymod) + 1, spawn_sound, spawner_distance_min, spawner_distance_max) bug_breach.start_death_timer(wave_length - 5 SECONDS) /obj/structure/vein/proc/pick_tile(list/peel) @@ -178,6 +180,7 @@ GLOBAL_LIST_EMPTY(ore_veins) //Pulls a random ore from the vein list per vein_class /obj/structure/vein/proc/drop_ore(multiplier,obj/machinery/drill/current) + multiplier *= difficultymod var/list/adjacent_turfs = get_adjacent_open_turfs(current) var/drop_location = src.loc //Backup in case we can't find an adjacent turf if(adjacent_turfs.len) @@ -213,7 +216,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/gold = 2, /obj/item/stack/ore/bluespace_crystal = 1, ) - max_mobs = 2 + max_mobs = 6 mob_types = list( /mob/living/simple_animal/hostile/asteroid/goliath/beast/nest = 60, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/nest = 30, @@ -242,7 +245,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/gold = 2, /obj/item/stack/ore/bluespace_crystal = 1, ) - max_mobs = 3 //Best not to go past 6 due to balance and lag reasons + max_mobs = 10 //Best not to go past 6 due to balance and lag reasons spawn_time = 8 SECONDS mob_types = list( /mob/living/simple_animal/hostile/asteroid/goliath/beast/nest = 60, @@ -350,7 +353,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/bluespace_crystal = 4, /obj/item/stack/ore/ice = 8, ) - max_mobs = 6 + max_mobs = 40 spawn_time = 8 SECONDS //Jungle @@ -394,7 +397,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/diamond = 10, /obj/item/stack/ore/titanium = 4, ) - max_mobs = 2 + max_mobs = 6 spawn_time = 15 SECONDS /obj/structure/vein/jungle/classtwo/rare @@ -424,7 +427,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/titanium = 4, ) //jungle mobs are kind of fucking hard, less max - max_mobs = 3 + max_mobs = 10 spawn_time = 10 SECONDS /obj/structure/vein/jungle/classthree/rare @@ -493,7 +496,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/diamond = 6, ) - max_mobs = 6 + max_mobs = 10 spawn_time = 8 SECONDS /obj/structure/vein/sand/classthree/rare @@ -541,7 +544,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/bluespace_crystal = 1, ) - max_mobs = 3 + max_mobs = 6 spawn_time = 10 SECONDS /obj/structure/vein/rockplanet/classthree @@ -564,7 +567,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/bluespace_crystal = 4, ) - max_mobs = 3 + max_mobs = 10 spawn_time = 8 SECONDS /obj/structure/vein/rockplanet/classfour @@ -629,7 +632,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/uranium = 5, /obj/item/stack/ore/diamond = 2, ) - max_mobs = 3 + max_mobs = 6 spawn_time = 10 SECONDS /obj/structure/vein/moon/classthree @@ -691,7 +694,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/diamond = 7, /obj/item/stack/ore/titanium = 5, ) - max_mobs = 3 + max_mobs = 6 spawn_time = 10 SECONDS /obj/structure/vein/desert/classthree @@ -712,7 +715,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/titanium = 7, ) - max_mobs = 3 + max_mobs = 10 spawn_time = 8 SECONDS @@ -738,7 +741,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/diamond = 1, ) - max_mobs = 3 + max_mobs = 10 spawn_time = 5 SECONDS ///His greed was his downfall var/greed_chance = 20 @@ -746,7 +749,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/structure/vein/shrouded/Initialize() . = ..() if(prob(greed_chance)) - max_mobs = 15 + max_mobs = 10 /obj/structure/vein/shrouded/classtwo mining_charges = 10 @@ -839,7 +842,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/bluespace_crystal = 3, ) - max_mobs = 3 + max_mobs = 6 spawn_time = 10 SECONDS /obj/structure/vein/asteroid/classtwo/rare @@ -871,7 +874,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/bluespace_crystal = 5, ) - max_mobs = 3 + max_mobs = 10 spawn_time = 8 SECONDS /obj/structure/vein/asteroid/classthree/rare @@ -924,7 +927,7 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/bluespace_crystal = 3, ) - max_mobs = 3 + max_mobs = 6 spawn_time = 10 SECONDS /obj/structure/vein/waterplanet/classthree @@ -949,6 +952,98 @@ GLOBAL_LIST_EMPTY(ore_veins) /obj/item/stack/ore/bluespace_crystal = 5, ) - max_mobs = 3 + max_mobs = 10 spawn_time = 8 SECONDS +/obj/structure/vein/jungle_infested + + mining_charges = 20 + // class 1 has easy mobs, the ones you find on the surface + mob_types = list( + /mob/living/simple_animal/hostile/poison/giant_spider/hunter = 10, + /mob/living/simple_animal/hostile/poison/giant_spider/tarantula = 10, + /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper = 10, + /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife = 10, + /mob/living/simple_animal/hostile/alien = 5, + /mob/living/simple_animal/hostile/alien/sentinel = 5, + /mob/living/simple_animal/hostile/alien/queen = 1, + /mob/living/simple_animal/hostile/alien/drone = 5, + + ) + + //same surface ore drop rate too... + ore_list = list( + /obj/item/stack/ore/iron = 50, + /obj/item/stack/ore/gold = 30, + /obj/item/stack/ore/silver = 20, + /obj/item/stack/ore/uranium = 10, + /obj/item/stack/ore/diamond = 10, + /obj/item/stack/ore/titanium = 1, + ) + +/obj/structure/vein/jungle_infested/classtwo + mining_charges = 50 + vein_class = 2 + //We then start to introduce the unused jungle mobs... slowly. <-- nah we live we die we wipe + mob_types = list( + /mob/living/simple_animal/hostile/poison/giant_spider/hunter = 10, + /mob/living/simple_animal/hostile/poison/giant_spider/tarantula = 10, + /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper = 10, + /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife = 10, + /mob/living/simple_animal/hostile/alien = 50, + /mob/living/simple_animal/hostile/alien/sentinel = 50, + /mob/living/simple_animal/hostile/alien/queen = 10, + /mob/living/simple_animal/hostile/alien/drone = 50, + /mob/living/simple_animal/hostile/jungle/seedling = 30, + /mob/living/simple_animal/hostile/jungle/mega_arachnid = 40, + ) + ore_list = list( + /obj/item/stack/ore/iron = 40, + /obj/item/stack/ore/gold = 20, + /obj/item/stack/ore/silver = 10, + /obj/item/stack/ore/uranium = 10, + /obj/item/stack/ore/diamond = 10, + /obj/item/stack/ore/titanium = 4, + ) + max_mobs = 6 + spawn_time = 15 SECONDS + +/obj/structure/vein/jungle_infested/classtwo/rare + mining_charges = 80 + vein_class = 2 + ore_list = list( + /obj/item/stack/ore/gold = 10, + /obj/item/stack/ore/diamond = 5, + ) + +/obj/structure/vein/jungle_infested/classthree + mining_charges = 80 + vein_class = 3 + //This really bints your bogos and deactivates your iguana + mob_types = list( + /mob/living/simple_animal/hostile/alien = 100, + /mob/living/simple_animal/hostile/alien/sentinel = 100, + /mob/living/simple_animal/hostile/alien/queen = 100, + /mob/living/simple_animal/hostile/alien/drone = 100, + /mob/living/simple_animal/hostile/jungle/seedling = 30, + /mob/living/simple_animal/hostile/jungle/mega_arachnid = 40, + ) + ore_list = list( + /obj/item/stack/ore/iron = 10, + /obj/item/stack/ore/uranium = 10, + /obj/item/stack/ore/gold = 10, + /obj/item/stack/ore/silver = 10, + /obj/item/stack/ore/diamond = 10, + /obj/item/stack/ore/titanium = 4, + ) + //jungle mobs are kind of fucking hard, less max + max_mobs = 10 + spawn_time = 10 SECONDS + +/obj/structure/vein/jungle_infested/classthree/rare + mining_charges = 100 + vein_class = 3 + ore_list = list( + /obj/item/stack/ore/gold = 10, + /obj/item/stack/ore/diamond = 10, + ) diff --git a/code/modules/missions/dynamic/signaled.dm b/code/modules/missions/dynamic/signaled.dm index a9583c7bb5de..c698eb9edde2 100644 --- a/code/modules/missions/dynamic/signaled.dm +++ b/code/modules/missions/dynamic/signaled.dm @@ -73,6 +73,7 @@ return ..() /obj/machinery/drill/mission/mine_success() + . = ..() num_current++ if(num_current == num_wanted) diff --git a/code/modules/missions/outpost/_outpost.dm b/code/modules/missions/outpost/_outpost.dm index 8126b5f3f7bd..adbac48b030d 100644 --- a/code/modules/missions/outpost/_outpost.dm +++ b/code/modules/missions/outpost/_outpost.dm @@ -1,6 +1,6 @@ /datum/mission/outpost acceptable = TRUE - + /datum/mission/outpost/New(_outpost) source_outpost = _outpost RegisterSignal(mission_location, COMSIG_PARENT_QDELETING, PROC_REF(on_vital_delete)) diff --git a/code/modules/missions/outpost/acquire_mission.dm b/code/modules/missions/outpost/acquire_mission.dm index b3d3cf43421e..34e901d1db21 100644 --- a/code/modules/missions/outpost/acquire_mission.dm +++ b/code/modules/missions/outpost/acquire_mission.dm @@ -69,7 +69,7 @@ Acquire: The Creature */ -/datum/mission/outpost/acquire/creature +/*/datum/mission/outpost/acquire/creature name = "" desc = "" value = 1500 @@ -135,3 +135,4 @@ if(M.loc == src) return FALSE return ..() +*/ \ No newline at end of file diff --git a/code/modules/missions/outpost/drill_mission.dm b/code/modules/missions/outpost/drill_mission.dm index 948c9a3c7c17..e9fc61b02c02 100644 --- a/code/modules/missions/outpost/drill_mission.dm +++ b/code/modules/missions/outpost/drill_mission.dm @@ -27,11 +27,10 @@ var/spawn_punchcard = TRUE var/bonus_text = TRUE -/datum/mission/outpost/drill/generate_mission_details() - . = ..() - selected_planet = pick(available_planets) - num_wanted = rand(num_wanted-2,num_wanted+2) - value += num_wanted*100 + +/datum/mission/outpost/drill/proc/setplanet(pickedplanet) + + selected_planet = pickedplanet name = "Class [class_wanted] [selected_planet.name] core sample mission" desc = "We require geological information from a neighboring [selected_planet.name]. \ Please anchor the drill in place and defend it until it has gathered enough samples.\ @@ -40,13 +39,18 @@ desc += " \n\nA punchcard will be provided for ease of locating a [selected_planet.name]. \ A 500 credit bonus will be applied for not using one." +/datum/mission/outpost/drill/generate_mission_details() + . = ..() + num_wanted = rand(num_wanted-2,num_wanted+2) + value += num_wanted*100 + /datum/mission/outpost/drill/accept(datum/overmap/ship/controlled/acceptor, turf/accept_loc) . = ..() sampler = spawn_bound(/obj/machinery/drill/mission, accept_loc, VARSET_CALLBACK(src, sampler, null)) sampler.mission_class = class_wanted sampler.num_wanted = num_wanted - sampler.orevein_wanted = available_planets[selected_planet] + sampler.orevein_wanted = selected_planet.vein sampler.name += " (Class [class_wanted] [selected_planet.name])" if(spawn_punchcard) @@ -128,7 +132,7 @@ /datum/mission/outpost/drill/rareplanet/generate_mission_details() . = ..() - name = "Class [class_wanted] rare [selected_planet.name] core sample mission" + /*name = "Class [class_wanted] rare [selected_planet.name] core sample mission" desc = "We have discovered a rare [selected_planet.name] and wish to study it's geology. \ Please anchor the drill in place and defend it until it has gathered enough samples. \ Not much information on these planets are known, caution is advised. \ @@ -144,7 +148,7 @@ if(bonus_text) desc += " \n\nA punchcard will be provided for ease of locating a [selected_planet.name].\ - A 500 credit bonus will be applied for not using one." + A 500 credit bonus will be applied for not using one."*/ /datum/mission/outpost/drill/rareplanet/classtwo name = "Class 2 rare core sample mission" diff --git a/code/modules/missions/outpost/garden_scan.dm b/code/modules/missions/outpost/garden_scan.dm index bfae9439b8b7..f368eb59e36e 100644 --- a/code/modules/missions/outpost/garden_scan.dm +++ b/code/modules/missions/outpost/garden_scan.dm @@ -13,6 +13,7 @@ var/num_wanted = 1 var/allow_subtypes = FALSE var/count_stacks = TRUE + var/list/target_planets /datum/mission/outpost/survey/accept(datum/overmap/ship/controlled/acceptor, turf/accept_loc) . = ..() @@ -63,6 +64,7 @@ var/danger_bonus = 50 var/garden_string = "lush gardens" var/planet_hint ="Beach and Jungle" + target_planets = list(/datum/planet_type/jungle, /datum/planet_type/beach) /datum/mission/outpost/survey/garden/New(...) if(!name) @@ -83,6 +85,7 @@ danger_bonus = 100 garden_string = "sickly gardens" planet_hint = "Waste" + target_planets = list(/datum/planet_type/waste) /datum/mission/outpost/survey/garden/ice value = 2000 @@ -92,6 +95,7 @@ danger_bonus = 75 garden_string = "chilly gardens" planet_hint = "Ice" + target_planets = list(/datum/planet_type/ice) /datum/mission/outpost/survey/garden/arid value = 2000 @@ -101,6 +105,7 @@ danger_bonus = 75 garden_string = "rock gardens" planet_hint = "Rock" + target_planets = list(/datum/planet_type/rock) //Survey: we like chemicals diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 6006b6af4874..5c71ecd2e9a4 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -295,7 +295,7 @@ if(!client.prefs.randomise[RANDOM_NAME]) // do they have random names enabled var/name = client.prefs.real_name for(var/datum/overmap/ship/controlled/shippe as anything in SSovermap.controlled_ships) - if(!length(ship.manifest)) + if(!length(shippe.manifest)) continue for(var/crewmember in ship.manifest) if(name == crewmember) diff --git a/code/modules/mob/dead/new_player/ship_select.dm b/code/modules/mob/dead/new_player/ship_select.dm index 7f510b72bb67..4cd138606e60 100644 --- a/code/modules/mob/dead/new_player/ship_select.dm +++ b/code/modules/mob/dead/new_player/ship_select.dm @@ -104,7 +104,7 @@ var/ship_loc var/datum/overmap_star_system/selected_system //the star system we want to spawn in - if(length(SSovermap.outposts) > 1) + /*if(length(SSovermap.outposts) > 1) var/datum/overmap/outpost/temp_loc = input(spawnee, "Select outpost to spawn at") as null|anything in SSovermap.outposts if(!temp_loc) return @@ -112,7 +112,10 @@ ship_loc = temp_loc else ship_loc = SSovermap.outposts[1] - selected_system = SSovermap.tracked_star_systems[1] + selected_system = SSovermap.tracked_star_systems[1]*/ + //Force green star for now. + ship_loc = SSovermap.outposts[1] + selected_system = SSovermap.tracked_star_systems[1] if(!selected_system) CRASH("Ship attemped to be bought at spawn menu, but spawning outpost was not selected! This is bad!") //if selected_system didnt get selected, we nope out, this is very bad diff --git a/code/modules/mob/living/simple_animal/hostile/advhuman/advhuman.dm b/code/modules/mob/living/simple_animal/hostile/advhuman/advhuman.dm new file mode 100644 index 000000000000..3fd7baead40b --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/advhuman/advhuman.dm @@ -0,0 +1,54 @@ +/mob/living/simple_animal/hostile/human/advanced + var/datum/advhuman_personality/personality + +/*/mob/living/simple_animal/hostile/human/Initialize(mapload) + . = ..() + if(mob_spawner) + apply_dynamic_human_appearance(src, species_path = species_spawner, mob_spawn_path = mob_spawner, r_hand = r_hand, l_hand = l_hand) + if(ispath(r_hand,/obj/item/gun)) + var/obj/item/gun/our_gun = r_hand + spread = our_gun.spread + else if(ispath(l_hand, /obj/item/gun)) + var/obj/item/gun/our_gun = l_hand + spread = our_gun.spread + + if(ispath(armor_base, /obj/item/clothing)) + //sigh. if only we could get the initial() value of list vars + var/obj/item/clothing/instance = new armor_base() + armor = instance.armor + qdel(instance) + +/mob/living/simple_animal/hostile/human/drop_loot() + . = ..() + if(!human_loot) + return + if(mob_spawner) + new mob_spawner(loc) + if(r_hand && weapon_drop_chance) + if(prob(weapon_drop_chance)) + var/obj/item/gun/ballistic/cosmetic_damage = new r_hand(loc) + if(istype(cosmetic_damage)) + cosmetic_damage.gun_wear = rand(cosmetic_damage.wear_minor_threshold, cosmetic_damage.wear_maximum) //my free gun... it's bowowken... + else + visible_message(span_danger("[src]'s [r_hand.name] is destroyed as they collapse!")) + if(l_hand && weapon_drop_chance) + if(prob(weapon_drop_chance)) + var/obj/item/gun/ballistic/cosmetic_damage = new l_hand(loc) + if(istype(cosmetic_damage)) + cosmetic_damage.gun_wear = rand(cosmetic_damage.wear_minor_threshold, cosmetic_damage.wear_maximum) + else + visible_message(span_danger("[src]'s [l_hand.name] is destroyed as they collapse!")) + + +/mob/living/simple_animal/hostile/human/vv_edit_var(var_name, var_value) + switch(var_name) + if (NAMEOF(src, armor_base)) + if(ispath(var_value, /obj/item/clothing)) + var/obj/item/clothing/temp = new var_value + armor = temp.armor + qdel(temp) + datum_flags |= DF_VAR_EDITED + return TRUE + return FALSE + . = ..() +*/ \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/antlion.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/antlion.dm index 232667802bcd..abfa94637499 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/antlion.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/antlion.dm @@ -9,11 +9,11 @@ emote_hear = list("clicks its mandibles") emote_see = list("shakes the sand off itself") - health = 35 - maxHealth = 35 + health = 50 + maxHealth = 50 melee_damage_lower = 10 - melee_damage_upper = 10 + melee_damage_upper = 30 attack_verb_continuous = "bites" attack_verb_simple = "bite" attack_sound = 'sound/weapons/bite.ogg' @@ -95,12 +95,12 @@ icon_living = "queen" icon_dead = "queen_dead" mob_size = MOB_SIZE_LARGE - health = 175 - maxHealth = 175 - melee_damage_lower = 25 - melee_damage_upper = 25 + health = 200 + maxHealth = 200 + melee_damage_lower = 30 + melee_damage_upper = 50 - heal_amount = 20 + heal_amount = 10 /mob/living/simple_animal/hostile/asteroid/antlion/mega/Initialize() . = ..() diff --git a/code/modules/mob_spawner/burrow.dm b/code/modules/mob_spawner/burrow.dm index b3c5e6798614..4a0c3ac24d45 100644 --- a/code/modules/mob_spawner/burrow.dm +++ b/code/modules/mob_spawner/burrow.dm @@ -107,3 +107,11 @@ GLOBAL_LIST_INIT(ore_probability, list( /mob/living/simple_animal/hostile/asteroid/hivelord, /mob/living/simple_animal/hostile/carp ) + +/obj/structure/spawner/burrow/jungle_infested_planet + mob_types = list( + /mob/living/simple_animal/hostile/alien, + /mob/living/simple_animal/hostile/alien/sentinel, + /mob/living/simple_animal/hostile/alien/drone, + ) + diff --git a/code/modules/overmap/_overmap_datum.dm b/code/modules/overmap/_overmap_datum.dm index aa00290591ba..02af92577551 100644 --- a/code/modules/overmap/_overmap_datum.dm +++ b/code/modules/overmap/_overmap_datum.dm @@ -337,17 +337,42 @@ return "ERROR: Unable to do this currently! Reduce speed or undock!" if(interact_target.docked_to || interact_target.docking) return "ERROR: Unable to do this currently! Target is docked or docking!" - + /* var/list/dockables = get_dockable_locations(src) if(!dockables.len) return "ERROR: No open ports on [src]." choice = tgui_input_list(usr, "Select where to dock [interact_target]?", "Dock at", dockables) if(!choice) + return "Interaction canceled."*/ + choice = tgui_input_list(usr, "Are you sure you want to interdict [interact_target]? Both of your engines will be drained!", "Interdiction", list("Yes","Cancel")) + if(!choice || choice == "Cancel") return "Interaction canceled." - return interact_target.Dock(src, choice) + return DoInterdiction(src, interact_target) //if nothing returns, return choice? return choice +/datum/overmap/proc/DoInterdiction(mob/living/user, datum/overmap/interact_target) + var/datum/overmap/ship/controlled/interdicter = src + var/datum/overmap/ship/controlled/interdicted = interact_target + //Fry ion thrusters for supposedly 10 minutes + for(var/obj/machinery/power/shuttle/engine/real_engine as anything in interdicter.shuttle_port.get_engines()) + real_engine.disable(6000) + for(var/obj/machinery/power/shuttle/engine/real_engine as anything in interdicted.shuttle_port.get_engines()) + real_engine.disable(6000) + //Blare a loud fucking warning + priority_announce("!!! INTERDICTING [interact_target] !!!", "ALL HANDS ON DECK, PERPARE FOR COMBAT!", 'sound/effects/Interdiction.ogg', sender_override = name, zlevel =interdicter.shuttle_port.virtual_z()) + priority_announce("!!! BEING INTERDICTED BY [interdicter] !!!", "ALL HANDS ON DECK, PERPARE FOR COMBAT!", 'sound/effects/Interdiction.ogg', sender_override = name, zlevel = interdicted.shuttle_port.virtual_z()) + //Dock in empty spess + var/datum/overmap/dynamic/empty/empty_space = locate() in current_overmap.overmap_container[x][y] + if(!empty_space) + empty_space = new(list("x" = x, "y" = y), current_overmap) + if(empty_space) + interdicter.Dock(empty_space) + //Two ships cannot dock at the same time so this is the worst solution I could come up with + addtimer(CALLBACK(interdicted, PROC_REF(Dock), empty_space, null, TRUE), 12 SECONDS) + + + /** * This handles the interaction on the target, rather than on the interactor. * Useful for special behavior on the target. Otherwise, return choice @@ -520,6 +545,21 @@ return /** + * Currently mainly used to check if all the engines are fried + */ +/datum/overmap/proc/canUndock() + return TRUE + + +/** + * Delay with which the ships should undock. + */ + +/datum/overmap/proc/UndockTime() + return 10 SECONDS + +/** + * Undocks from the object this datum is docked to currently, and places it back on the overmap at the position of the object that was previously docked to. */ /datum/overmap/proc/Undock(force = FALSE) @@ -530,11 +570,11 @@ if(docking) return docking = TRUE - - if(dock_time && !force) - dock_timer_id = addtimer(CALLBACK(src, PROC_REF(complete_undock)), dock_time) - else - complete_undock() + if(canUndock()) + if(UndockTime() && !force) + dock_timer_id = addtimer(CALLBACK(src, PROC_REF(complete_undock)), UndockTime()) + else + complete_undock() /** * Called after [datum/overmap/proc/Undock], either instantly or after a time depending on the [datum/overmap/var/dock_time] variable. diff --git a/code/modules/overmap/objects/dynamic_datum.dm b/code/modules/overmap/objects/dynamic_datum.dm index 5c078399c40b..51a260330a51 100644 --- a/code/modules/overmap/objects/dynamic_datum.dm +++ b/code/modules/overmap/objects/dynamic_datum.dm @@ -67,11 +67,13 @@ ///Do we selfloop? If so the borders of the map connect to the other side of the planet. Not recommended. var/selfloop + var/difficulty + /datum/overmap/dynamic/Initialize(position, datum/overmap_star_system/system_spawned_in, load_now=TRUE, ...) . = ..() SSovermap.dynamic_encounters += src current_overmap.dynamic_encounters += src - + difficulty = system_spawned_in.rewardmult vlevel_height = CONFIG_GET(number/overmap_encounter_size) vlevel_width = CONFIG_GET(number/overmap_encounter_size) if(load_now) @@ -122,7 +124,7 @@ if(planet_name) 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("hh:mm")]") + Mob.play_screen_text("[dock_requester.name]
[current_overmap.name]
[Mob.real_name]
[planet_name]
[station_time_timestamp("hh:mm")]") playsound(Mob, landing_sound, 50) @@ -605,3 +607,13 @@ light_range = 2 light_power = 0.6 light_color = COLOR_DARK_MODERATE_ORANGE + + +/area/overmap_encounter/planetoid/jungle_infested + name = "\improper Jungle Infested Planetoid" + sound_environment = SOUND_ENVIRONMENT_FOREST + ambience_index = AMBIENCE_AWAY + light_range = 0.5 + light_power = 0.25 + light_color = COLOR_DARK_PURPLE + diff --git a/code/modules/overmap/objects/event_datum.dm b/code/modules/overmap/objects/event_datum.dm index fef80b5718d7..e10d985d50ff 100644 --- a/code/modules/overmap/objects/event_datum.dm +++ b/code/modules/overmap/objects/event_datum.dm @@ -19,6 +19,7 @@ var/datum/map_generator/empty_space_mapgen /// Override the mountain value of the mapgen to this value. var/mountain_height_override + var/basetype /datum/overmap/event/Initialize(position, datum/overmap_star_system/system_spawned_in, set_lifespan,...) . = ..() @@ -85,7 +86,6 @@ spread_chance = 50 chain_rate = 4 interference_power = 15 - empty_space_mapgen = /datum/map_generator/planet_generator/asteroid var/safe_speed = 3 @@ -100,6 +100,8 @@ /obj/item/stack/ore/iron, ) + basetype = /datum/overmap/event/meteor + /datum/overmap/event/meteor/alter_token_appearance() icon_suffix = "[rand(1, 4)]" ..() @@ -172,6 +174,9 @@ chance_to_affect = 30 interference_power = 100 var/strength = 4 + basetype = /datum/overmap/event/emp + + /datum/overmap/event/emp/alter_token_appearance() icon_suffix = "[rand(1, 4)]" @@ -238,6 +243,8 @@ chance_to_affect = 20 interference_power = 20 var/strength = 4 + + basetype = /datum/overmap/event/flare /datum/overmap/event/flare/alter_token_appearance() icon_suffix = "[rand(1, 4)]" @@ -306,6 +313,8 @@ var/zap_flag = ZAP_STORM_FLAGS var/max_damage = 3000 var/min_damage = 1000 + + basetype = /datum/overmap/event/electric /datum/overmap/event/electric/alter_token_appearance() icon_suffix = "[rand(1, 4)]" @@ -360,6 +369,8 @@ //list of ships we are currently affecting so we can stop flicking the lights when they leave var/list/affected_ships = list() + + basetype = /datum/overmap/event/nebula /datum/overmap/event/nebula/alter_token_appearance() . = ..() @@ -419,6 +430,8 @@ interference_power = 40 ///The currently linked wormhole var/datum/overmap/event/wormhole/other_wormhole + + basetype = /datum/overmap/event/wormhole /datum/overmap/event/wormhole/Initialize(position, datum/overmap_star_system/system_spawned_in, set_lifespan, _other_wormhole, ...) . = ..() @@ -461,6 +474,8 @@ /obj/effect/meteor/carp/big=1, //numbers I pulled out of my ass ) primary_ores = null + + basetype = /datum/overmap/event/meteor/carp /datum/overmap/event/meteor/carp/alter_token_appearance() icon_suffix = "[rand(1, 4)]" @@ -507,6 +522,8 @@ /obj/effect/meteor/dust=3, ) primary_ores = null + + basetype = /datum/overmap/event/meteor/dust /datum/overmap/event/meteor/dust/alter_token_appearance() icon_suffix = "[rand(1, 4)]" @@ -523,6 +540,8 @@ chance_to_affect = 10 spread_chance = 35 chain_rate = 6 + + basetype = /datum/overmap/event/anomaly /datum/overmap/event/anomaly/Initialize(position, datum/overmap_star_system/system_spawned_in, set_lifespan, ...) . = ..() @@ -571,6 +590,8 @@ GLOBAL_LIST_INIT(overmap_event_pick_list, list( chance_to_affect = 60 interference_power = 40 var/strength = 20 + + basetype = /datum/overmap/event/rad /datum/overmap/event/rad/alter_token_appearance() icon_suffix = "[rand(1, 4)]" @@ -624,6 +645,9 @@ GLOBAL_LIST_INIT(overmap_event_pick_list, list( empty_space_mapgen = /datum/map_generator/planet_generator/asteroid + + basetype = /datum/overmap/event/meteor/debris + /datum/overmap/event/meteor/debris/alter_token_appearance() . = ..() if(blocks_sight) diff --git a/code/modules/overmap/objects/outpost/outpost.dm b/code/modules/overmap/objects/outpost/outpost.dm index 565ef3627ecc..162c28fafe5d 100644 --- a/code/modules/overmap/objects/outpost/outpost.dm +++ b/code/modules/overmap/objects/outpost/outpost.dm @@ -157,9 +157,20 @@ /datum/overmap/outpost/proc/fill_missions() max_missions = min(10 + (SSovermap.controlled_ships.len * 2), 25) + var/list/overmaptally = current_overmap.get_overmap_object_types() + var/list/basemissions = current_overmap.mission_catalogue while(LAZYLEN(missions) < max_missions) - var/mission_type = SSmissions.get_weighted_mission_type() + var/mission_type = SSmissions.get_weighted_mission_type(overmaptally, basemissions) + var/datum/mission/outpost/M = new mission_type(src) + if(istype(M,/datum/mission/outpost/drill)) + var/list/overmapplanettally = current_overmap.get_overmap_planet_drillable_types() + if(overmapplanettally.len == 0) + continue + var/datum/overmap/dynamic/planet = pickweight_float(overmapplanettally) + var/datum/mission/outpost/drill/megadeath = M + megadeath.setplanet(planet) + M.mission_reward *= current_overmap.rewardmult LAZYADD(missions, M) /datum/overmap/outpost/proc/load_main_level() diff --git a/code/modules/overmap/planets/planet_types.dm b/code/modules/overmap/planets/planet_types.dm index c0421d3314e6..b816cb05d2ca 100644 --- a/code/modules/overmap/planets/planet_types.dm +++ b/code/modules/overmap/planets/planet_types.dm @@ -31,6 +31,8 @@ var/selfloop = FALSE ///How much of a radio message we mess up on nearby or on landed/orbitting ships var/interference_power = 0 + ///What vein it has + var/obj/structure/vein/vein = null /datum/planet_type/lava @@ -51,6 +53,7 @@ /obj/item/stack/ore/plasma, ) + vein = /obj/structure/vein/lavaland /datum/planet_type/ice name = "frozen planetoid" @@ -69,6 +72,8 @@ /obj/item/stack/ore/gold, ) + vein = /obj/structure/vein/ice + /datum/planet_type/jungle name = "jungle planetoid" desc = "A densely forested world, filled with vines, animals, and underbrush. Surprisingly habitable with a machete." @@ -84,6 +89,8 @@ /obj/item/stack/ore/gold, /obj/item/stack/ore/diamond, //this isnt very common, but it's more common here than every other planet, so i list it here ) + vein = /obj/structure/vein/jungle + /datum/planet_type/rock name = "rock planetoid" @@ -99,6 +106,7 @@ primary_ores = list(\ /obj/item/stack/ore/iron, ) + vein = /obj/structure/vein/rockplanet /datum/planet_type/sand name = "salty sand planetoid" @@ -115,6 +123,7 @@ /obj/item/stack/ore/iron, /obj/item/stack/ore/titanium, ) + vein = /obj/structure/vein/sand /datum/planet_type/beach @@ -168,6 +177,7 @@ /obj/item/stack/ore/plasma, /obj/item/stack/ore/iron, ) + vein = /obj/structure/vein/asteroid /datum/planet_type/spaceruin name = "weak energy signal" @@ -248,6 +258,7 @@ /obj/item/stack/ore/plasma, /obj/item/stack/ore/iron, ) + vein = /obj/structure/vein/waterplanet /datum/planet_type/desert name = "desert planetoid" @@ -265,6 +276,7 @@ primary_ores = list( /obj/item/stack/ore/gold, ) + vein = /obj/structure/vein/desert /datum/planet_type/shrouded name = "shrouded planetoid" @@ -286,6 +298,7 @@ /obj/item/stack/ore/plasma, /obj/item/stack/ore/iron, ) + vein = /obj/structure/vein/shrouded /datum/planet_type/moon name = "planetoid moon" @@ -304,6 +317,8 @@ /obj/item/stack/ore/iron, /obj/item/stack/ore/titanium, ) + vein = /obj/structure/vein/moon + /datum/planet_type/battlefield name = "battlefield planetoid" @@ -409,3 +424,21 @@ /datum/map_generator/single_turf/waterball turf_type = /turf/open/water/stormy_planet_lit area_type = /area/overmap_encounter/planetoid/waterball + + +/datum/planet_type/jungle_infested + name = "infested jungle planetoid" + desc = "A planet with a vibrant ecosystem... maybe a bit too vibrant... suprisingly uninhabitable, even with a machette." + planet = DYNAMIC_WORLD_JUNGLE_INFESTED + icon_state = "jungle" + color = COLOR_PURPLE + mapgen = /datum/map_generator/planet_generator/jungle_infested + default_baseturf = /turf/open/floor/plating/dirt/jungle + gravity = STANDARD_GRAVITY + weather_controller_type = /datum/weather_controller/lush + ruin_type = RUINTYPE_JUNGLE + primary_ores = list(\ + /obj/item/stack/ore/gold, + /obj/item/stack/ore/diamond, //this isnt very common, but it's more common here than every other planet, so i list it here + ) + vein = /obj/structure/vein/jungle_infested diff --git a/code/modules/overmap/ships/controlled_ship_datum.dm b/code/modules/overmap/ships/controlled_ship_datum.dm index 1949f738eb22..8e143ca53465 100644 --- a/code/modules/overmap/ships/controlled_ship_datum.dm +++ b/code/modules/overmap/ships/controlled_ship_datum.dm @@ -7,6 +7,7 @@ */ /datum/overmap/ship/controlled token_type = /obj/overmap/rendered + ///When undocking, try to use UndockTime() instead! dock_time = 10 SECONDS interaction_options = list(INTERACTION_OVERMAP_DOCK, INTERACTION_OVERMAP_QUICKDOCK, INTERACTION_OVERMAP_HAIL, INTERACTION_OVERMAP_INTERDICTION) @@ -223,12 +224,18 @@ if(force) SSshuttle.transit_requesters -= shuttle_port SSshuttle.generate_transit_dock(shuttle_port) // We need a port, NOW. + if(canUndock()) + priority_announce("Beginning undocking procedures. Completion in [UndockTime()/10] seconds.", "Docking Announcement", sender_override = name, zlevel = shuttle_port.virtual_z()) + addtimer(CALLBACK(src, PROC_REF(playUndockingSound)), UndockTime() - (10 SECONDS)) + else + priority_announce("Undocking failed! No working engines!", "Hardware Error!", sender_override = name, zlevel = shuttle_port.virtual_z()) + return + . = ..() + dock_time = dock_time_temp // Set it back to the original value if it was changed - priority_announce("Beginning undocking procedures. Completion in [dock_time/10] seconds.", "Docking Announcement", sender_override = name, zlevel = shuttle_port.virtual_z()) +/datum/overmap/ship/controlled/proc/playUndockingSound() shuttle_port.play_engine_sound(shuttle_port, shuttle_port.takeoff_sound) - . = ..() - dock_time = dock_time_temp // Set it back to the original value if it was changed /datum/overmap/ship/controlled/complete_undock() shuttle_port.initiate_docking(shuttle_port.assigned_transit) @@ -536,6 +543,21 @@ if(our_helm) our_helm.cancel_jump() +/datum/overmap/ship/controlled/UndockTime() + var/base = 1 MINUTES + for(var/obj/machinery/power/shuttle/engine/real_engine as anything in shuttle_port.get_engines()) + if(real_engine.enabled && real_engine.operational() && (real_engine.return_fuel() > 2)) + base -= 10 SECONDS + if(base < 10 SECONDS) + return 10 SECONDS + return base + +/datum/overmap/ship/controlled/canUndock() + for(var/obj/machinery/power/shuttle/engine/real_engine as anything in shuttle_port.get_engines()) + if(real_engine.enabled && real_engine.operational() && (real_engine.return_fuel() > 2)) + return TRUE + return FALSE + /obj/item/key/ship name = "ship key" diff --git a/config/game_options.txt b/config/game_options.txt index 0af3f850f753..0f42029a6108 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -518,7 +518,7 @@ MAX_DYNAMIC_MISSIONS 0.66 ## The time required before a ship is allowed to bluespace jump. -1 disables it entirely ## In deciseconds, valid values are -1 to INFINITY -BLUESPACE_JUMP_WAIT 12000 +BLUESPACE_JUMP_WAIT -1 ## Whether this server is an authentication server #AUTH_ONLY diff --git a/icons/mob/inhands/barricades/stacks_left.dmi b/icons/mob/inhands/barricades/stacks_left.dmi new file mode 100644 index 000000000000..3c655c16ef3f Binary files /dev/null and b/icons/mob/inhands/barricades/stacks_left.dmi differ diff --git a/icons/mob/inhands/barricades/stacks_right.dmi b/icons/mob/inhands/barricades/stacks_right.dmi new file mode 100644 index 000000000000..932eeecc6763 Binary files /dev/null and b/icons/mob/inhands/barricades/stacks_right.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index a9d1562a2b35..fd13530c91ea 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/structures/barricades/barbedwire.dmi b/icons/obj/structures/barricades/barbedwire.dmi new file mode 100644 index 000000000000..24e3c6e49732 Binary files /dev/null and b/icons/obj/structures/barricades/barbedwire.dmi differ diff --git a/icons/obj/structures/barricades/concrete.dmi b/icons/obj/structures/barricades/concrete.dmi new file mode 100644 index 000000000000..b9ea08b9c685 Binary files /dev/null and b/icons/obj/structures/barricades/concrete.dmi differ diff --git a/icons/obj/structures/barricades/folding.dmi b/icons/obj/structures/barricades/folding.dmi new file mode 100644 index 000000000000..72742b90db95 Binary files /dev/null and b/icons/obj/structures/barricades/folding.dmi differ diff --git a/icons/obj/structures/barricades/metal.dmi b/icons/obj/structures/barricades/metal.dmi new file mode 100644 index 000000000000..34b5d012cd79 Binary files /dev/null and b/icons/obj/structures/barricades/metal.dmi differ diff --git a/icons/obj/structures/barricades/misc.dmi b/icons/obj/structures/barricades/misc.dmi new file mode 100644 index 000000000000..bc0336db3a48 Binary files /dev/null and b/icons/obj/structures/barricades/misc.dmi differ diff --git a/icons/obj/structures/barricades/plasteel.dmi b/icons/obj/structures/barricades/plasteel.dmi new file mode 100644 index 000000000000..f63beefedaa8 Binary files /dev/null and b/icons/obj/structures/barricades/plasteel.dmi differ diff --git a/icons/obj/structures/barricades/sandbags.dmi b/icons/obj/structures/barricades/sandbags.dmi new file mode 100644 index 000000000000..4b5a3d98a047 Binary files /dev/null and b/icons/obj/structures/barricades/sandbags.dmi differ diff --git a/icons/obj/structures/barricades/upgrades.dmi b/icons/obj/structures/barricades/upgrades.dmi new file mode 100644 index 000000000000..cede84d9a5dd Binary files /dev/null and b/icons/obj/structures/barricades/upgrades.dmi differ diff --git a/shiptest.dme b/shiptest.dme index e6e8845376ea..af32364f3f03 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -830,6 +830,7 @@ #include "code\datums\mapgen\planetary\BeachGenerator.dm" #include "code\datums\mapgen\planetary\desertGenerator.dm" #include "code\datums\mapgen\planetary\JungleGenerator.dm" +#include "code\datums\mapgen\planetary\JungleInfestedGenerator.dm" #include "code\datums\mapgen\planetary\LavaGenerator.dm" #include "code\datums\mapgen\planetary\moon_generator.dm" #include "code\datums\mapgen\planetary\RockGenerator.dm" @@ -3733,4 +3734,7 @@ #include "interface\menu.dm" #include "interface\stylesheet.dm" #include "interface\skin.dmf" +#include "code\game\objects\items\barricades\sandbags.dm" +#include "code\game\objects\structures\barricade\barricade.dm" +#include "code\game\objects\structures\barricade\advbarricade.dm" // END_INCLUDE diff --git a/sound/effects/Interdiction.ogg b/sound/effects/Interdiction.ogg new file mode 100644 index 000000000000..87e54a985751 Binary files /dev/null and b/sound/effects/Interdiction.ogg differ