diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3f03f4c1a4e..248426de34b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -102,7 +102,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - map_path: [example, tradeship, exodus, ministation, shaded_hills, away_sites_testing, modpack_testing, planets_testing] + map_path: [example, tradeship, exodus, ministation, shaded_hills, karzefeste, away_sites_testing, modpack_testing, planets_testing] steps: - uses: actions/checkout@v3 - name: Setup Cache diff --git a/maps/karzerfeste/areas/_area.dm b/maps/karzerfeste/areas/_area.dm new file mode 100644 index 00000000000..6781b9f9eb3 --- /dev/null +++ b/maps/karzerfeste/areas/_area.dm @@ -0,0 +1,2 @@ +/area/karzerfeste + name = "Burg Karzerfeste" diff --git a/maps/karzerfeste/jobs/_job.dm b/maps/karzerfeste/jobs/_job.dm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/maps/karzerfeste/karzerfeste.dm b/maps/karzerfeste/karzerfeste.dm new file mode 100644 index 00000000000..e8b4a21d359 --- /dev/null +++ b/maps/karzerfeste/karzerfeste.dm @@ -0,0 +1,27 @@ +#if !defined(USING_MAP_DATUM) + + #include "../../mods/content/matchmaking/_matchmaking.dme" + #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" + #include "../../mods/content/scaling_descriptors.dm" + #include "../../mods/species/drakes/_drakes.dme" // include before _fantasy.dme so overrides work + #include "../../mods/content/fantasy/_fantasy.dme" + #include "../../mods/pyrelight/_pyrelight.dme" // include after _fantasy.dme so overrides work + + #include "areas/_area.dm" + #include "jobs/_job.dm" + #include "levels/_level.dm" + #include "levels/strata.dm" + #include "outfits/_outfit.dm" + + #include "karzerfeste_currency.dm" + #include "karzerfeste_events.dm" + #include "karzerfeste_map.dm" + #include "karzerfeste_skills.dm" + #include "karzerfeste_testing.dm" + #include "karzerfeste_turfs.dm" + + #define USING_MAP_DATUM /datum/map/karzerfeste + +#elif !defined(MAP_OVERRIDE) + #warn A map has already been included, ignoring Berg Karzerfeste +#endif diff --git a/maps/karzerfeste/karzerfeste_currency.dm b/maps/karzerfeste/karzerfeste_currency.dm new file mode 100644 index 00000000000..f1c06d4735e --- /dev/null +++ b/maps/karzerfeste/karzerfeste_currency.dm @@ -0,0 +1,12 @@ +/datum/map/shaded_hills + starting_cash_choices = list( + /decl/starting_cash_choice/none, + /decl/starting_cash_choice/cash + ) + default_currency = /decl/currency/imperial + salary_modifier = 0.05 // turn the 300-400 base into 15-20 base + +/// Functionally identical to its parent type, but with a different name since it's not defined until later. +/decl/starting_cash_choice/none + name = "none" + uid = "starting_cash_none" diff --git a/maps/karzerfeste/karzerfeste_define.dm b/maps/karzerfeste/karzerfeste_define.dm new file mode 100644 index 00000000000..3758f52ecb9 --- /dev/null +++ b/maps/karzerfeste/karzerfeste_define.dm @@ -0,0 +1,56 @@ +/datum/map/karzerfeste + name = "karzerfeste" + full_name = "Burg Karzerfeste" + path = "karzerfeste" + station_name = "Burg Karzerfeste" + station_short = "Karzerfeste" + + // Leaving these for later replacement. + dock_name = "shaded heights" + boss_name = "the Splinter Kingdoms" + boss_short = "Splinter Kingdoms" + company_name = "whispers from the Deep" + company_short = "the Deep" + system_name = "Downlands" + + default_spawn = /decl/spawnpoint/arrivals + allowed_latejoin_spawns = list( + /decl/spawnpoint/arrivals + ) + map_tech_level = MAP_TECH_LEVEL_MEDIEVAL + survival_box_choices = list() + passport_type = null + _available_backpacks = list( + /decl/backpack_outfit/sack + ) + lobby_screens = list( + 'maps/karzerfeste/pyre_light.png' + ) + lobby_tracks = list( + /decl/music_track/dhaka, + /decl/music_track/teller, + /decl/music_track/suonatore + ) + credit_sound = list( + 'sound/music/Miris-Magic-Dance.ogg' + ) + game_year = -914 // in 2024, the year should be 1110, roughly a century after the fall of the Imperial Aegis + + char_preview_bgstate_options = list( + "000", + "midgrey", + "FFF", + "wood" = /turf/floor/wood::color, + "mud", + "grass" = /turf/floor/natural/grass::color, + "rock" = /turf/floor/natural/rock/basalt::color, + "brick" = /turf/wall/brick/sandstone::color + ) + +/decl/backpack_outfit/sack + is_default = TRUE + +// TODO replace this +/datum/map/karzerfeste/get_map_info() + return "You're in the [station_name] of the [system_name], nestled between the mountains and the river and bisected by the decaying Queens' Road. On all sides, you are surrounded by untamed wilds, with only a small ruined fort, rebuilt into an inn, to the east as a sign of civilisation. \ + Far from the control of [boss_name], you are free to carve forward a path to survival for yourself and your comrades however you wish. Strike the earth!" diff --git a/maps/karzerfeste/karzerfeste_events.dm b/maps/karzerfeste/karzerfeste_events.dm new file mode 100644 index 00000000000..cd2b3aa8673 --- /dev/null +++ b/maps/karzerfeste/karzerfeste_events.dm @@ -0,0 +1,20 @@ +/datum/map/shaded_hills + event_container_mundane = /datum/event_container/mundane/fantasy + event_container_moderate = /datum/event_container/moderate/fantasy + event_container_major = /datum/event_container/major/fantasy + +// TODO: more appropriate events. +/datum/event_container/mundane/fantasy + available_events = list( + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 100) + ) + +/datum/event_container/moderate/fantasy + available_events = list( + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 100) + ) + +/datum/event_container/major/fantasy + available_events = list( + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 100) + ) diff --git a/maps/karzerfeste/karzerfeste_map.dm b/maps/karzerfeste/karzerfeste_map.dm new file mode 100644 index 00000000000..662ee989762 --- /dev/null +++ b/maps/karzerfeste/karzerfeste_map.dm @@ -0,0 +1,21 @@ +/datum/map/karzefeste + default_liquid_fuel_type = /decl/material/liquid/nutriment/plant_oil + loadout_categories = list( + /decl/loadout_category/fantasy/clothing, + /decl/loadout_category/fantasy/utility + ) + +/datum/map/karzefeste/finalize_map_generation() + . = ..() + var/static/list/banned_weather = list( + /decl/state/weather/snow/medium, + /decl/state/weather/snow/heavy, + /decl/state/weather/snow + ) + var/datum/level_data/region = SSmapping.levels_by_id["karzefeste_region"] + if(istype(region)) // if this is false, something has badly exploded + SSweather.setup_weather_system(region, banned_states = banned_weather) + +/decl/spawnpoint/arrivals + name = "Queens' Road" + spawn_announcement = null diff --git a/maps/karzerfeste/karzerfeste_skills.dm b/maps/karzerfeste/karzerfeste_skills.dm new file mode 100644 index 00000000000..a7a86be4c5e --- /dev/null +++ b/maps/karzerfeste/karzerfeste_skills.dm @@ -0,0 +1,15 @@ +// Removal of space skills +/datum/map/shaded_hills/get_available_skill_types() + . = ..() + . -= list( + SKILL_EVA, + SKILL_MECH, + SKILL_PILOT, + SKILL_COMPUTER, + SKILL_FORENSICS, + SKILL_ELECTRICAL, + SKILL_ATMOS, + SKILL_ENGINES, + SKILL_DEVICES, + SKILL_CONSTRUCTION, // Anything using this should be replaced with another skill. + ) diff --git a/maps/karzerfeste/karzerfeste_testing.dm b/maps/karzerfeste/karzerfeste_testing.dm new file mode 100644 index 00000000000..5adbc61c706 --- /dev/null +++ b/maps/karzerfeste/karzerfeste_testing.dm @@ -0,0 +1,5 @@ +/datum/map/karzerfeste + apc_test_exempt_areas = list( + /area/space = NO_SCRUBBER|NO_VENT|NO_APC, + /area/karzerfeste = NO_SCRUBBER|NO_VENT|NO_APC + ) diff --git a/maps/karzerfeste/karzerfeste_turfs.dm b/maps/karzerfeste/karzerfeste_turfs.dm new file mode 100644 index 00000000000..91bef775565 --- /dev/null +++ b/maps/karzerfeste/karzerfeste_turfs.dm @@ -0,0 +1,8 @@ +/turf/wall/natural/basalt/karzerfeste + strata_override = /decl/strata/karzerfeste + +/turf/wall/natural/random/basalt/karzerfeste + strata_override = /decl/strata/karzerfeste + +/turf/wall/natural/random/high_chance/basalt/karzerfeste + strata_override = /decl/strata/karzerfeste diff --git a/maps/karzerfeste/levels/_level.dm b/maps/karzerfeste/levels/_level.dm new file mode 100644 index 00000000000..26b98934586 --- /dev/null +++ b/maps/karzerfeste/levels/_level.dm @@ -0,0 +1,53 @@ +/datum/level_data/player_level/karzerfeste + use_global_exterior_ambience = FALSE + base_area = null + base_turf = /turf/floor/natural/dirt + abstract_type = /datum/level_data/player_level/karzerfeste + ambient_light_level = 1 + ambient_light_color = "#f3e6ca" + strata = /decl/strata/karzerfeste + exterior_atmosphere = list( + /decl/material/gas/oxygen = MOLES_O2STANDARD, + /decl/material/gas/nitrogen = MOLES_N2STANDARD + ) + daycycle_type = /datum/daycycle/karzerfeste + daycycle_id = "daycycle_karzerfeste" + template_edge_padding = 0 // we use a strictly delineated subarea, no need for this guard + var/submap_budget = 0 + var/submap_category = null + var/submap_area + var/list/mobs_to_spawn = list() + +/datum/daycycle/karzerfeste + cycle_duration = 2 HOURS // 1 hour of daylight, 1 hour of night + +// Randomized time of day to start at. +/datum/daycycle/karzerfeste/New() + time_in_cycle = rand(cycle_duration) + ..() + +/datum/level_data/player_level/karzerfeste/get_subtemplate_areas(template_category, blacklist, whitelist) + return submap_area ? (islist(submap_area) ? submap_area : list(submap_area)) : null + +/datum/level_data/player_level/karzerfeste/get_subtemplate_budget() + return submap_budget + +/datum/level_data/player_level/karzerfeste/get_subtemplate_category() + return submap_category + +/datum/level_data/player_level/karzerfeste/after_generate_level() + . = ..() + if(length(mobs_to_spawn)) + for(var/list/mob_category in mobs_to_spawn) + var/list/mob_types = mob_category[1] + var/mob_turf = mob_category[2] + var/mob_count = mob_category[3] + var/sanity = 1000 + while(mob_count && sanity) + sanity-- + var/turf/place_mob_at = locate(rand(level_inner_min_x, level_inner_max_x), rand(level_inner_min_y, level_inner_max_y), level_z) + if(istype(place_mob_at, mob_turf) && !(locate(/mob/living) in place_mob_at)) + var/mob_type = pickweight(mob_types) + new mob_type(place_mob_at) + mob_count-- + CHECK_TICK diff --git a/maps/karzerfeste/levels/strata.dm b/maps/karzerfeste/levels/strata.dm new file mode 100644 index 00000000000..829d04beb89 --- /dev/null +++ b/maps/karzerfeste/levels/strata.dm @@ -0,0 +1,18 @@ +// Simplified metal list. +/decl/strata/karzerfeste + name = "mountainous rock" + base_materials = list(/decl/material/solid/stone/basalt) + default_strata_candidate = FALSE + ores_sparse = list( + /decl/material/solid/quartz, + /decl/material/solid/graphite, + /decl/material/solid/tetrahedrite, + /decl/material/solid/hematite + ) + ores_rich = list( + /decl/material/solid/gemstone/diamond, + /decl/material/solid/metal/gold, + /decl/material/solid/metal/platinum, + /decl/material/solid/densegraphite, + /decl/material/solid/galena + ) diff --git a/maps/karzerfeste/outfits/_outfit.dm b/maps/karzerfeste/outfits/_outfit.dm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/maps/karzerfeste/pyre_light.png b/maps/karzerfeste/pyre_light.png new file mode 100644 index 00000000000..dd385e04c87 Binary files /dev/null and b/maps/karzerfeste/pyre_light.png differ diff --git a/nebula.dme b/nebula.dme index b8da2631e3b..4baf0fc7b58 100644 --- a/nebula.dme +++ b/nebula.dme @@ -4029,6 +4029,8 @@ #include "maps\away_sites_testing\away_sites_testing_define.dm" #include "maps\example\example_define.dm" #include "maps\exodus\exodus_define.dm" +#include "maps\karzerfeste\karzerfeste.dm" +#include "maps\karzerfeste\karzerfeste_define.dm" #include "maps\ministation\ministation_define.dm" #include "maps\modpack_testing\modpack_testing_define.dm" #include "maps\planets_testing\planets_testing_define.dm" @@ -4048,7 +4050,6 @@ #include "maps\random_ruins\exoplanet_ruins\spider_nest\spider_nest.dm" #include "maps\random_ruins\exoplanet_ruins\tar_anomaly\tar_anomaly.dm" #include "maps\random_ruins\space_ruins\space_ruins.dm" -#include "maps\shaded_hills\shaded_hills.dm" #include "maps\shaded_hills\shaded_hills_define.dm" #include "maps\tradeship\tradeship_define.dm" #include "maps\~mapsystem\map_preferences.dm"