From 54347bc356725e7b5aee5a093b3279a753079385 Mon Sep 17 00:00:00 2001 From: Fe_ed Date: Wed, 10 Jul 2024 10:52:30 +0300 Subject: [PATCH] Module: Cleanup 2 (#2) * auto_cell.dm; explosion.dm; vomitwave.dm * attachment_handler.dm; overlay_lighting.dm * shrapnel_removal.dm; yautja_tracked_item.dm * necoarc.dm * _game_mode.dm * crash.dm * distress.dm; nuclear_war.dm * All greyscale files + json * clown.dm; job_exp.dm * job.dm; marines.dm; militarypolice.dm; necoarc.dm; pred.dm * squads.dm; shipside.dm; sons_of_mars_shipside.dm; xenomorph.dm * keybindings * loadout * looping_sounds * status_effects * datums --- .../datums/autocells/auto_cell.dm | 0 .../datums/autocells/explosion.dm | 0 .../datums/autocells/vomitwave.dm | 0 code/datums/components/overlay_lighting.dm | 27 +- code/datums/elements/shrapnel_removal.dm | 13 +- .../datums/elements/yautja_tracked_item.dm | 0 .../datums/emergency_calls/necoarc.dm | 0 .../code => code}/datums/flaying.dm | 0 code/datums/gamemodes/_game_mode.dm | 137 +++++++++- code/datums/gamemodes/crash.dm | 3 + .../datums/gamemodes/distress.dm | 0 code/datums/gamemodes/nuclear_war.dm | 1 + code/datums/greyscale/greyscale_configs.dm | 30 +++ code/datums/greyscale/json_configs/cape.json | 244 ++---------------- .../json_configs/cape_highlight.json | 159 +----------- .../greyscale/json_configs/xenonaut_mk1.json | 0 .../code => code}/datums/jobs/job/clown.dm | 0 code/datums/jobs/job/job.dm | 8 + code/datums/jobs/job/job_exp.dm | 25 +- code/datums/jobs/job/marines.dm | 20 ++ .../datums/jobs/job/militarypolice.dm | 0 .../code => code}/datums/jobs/job/necoarc.dm | 0 .../code => code}/datums/jobs/job/pred.dm | 0 code/datums/jobs/job/shipside.dm | 95 +++++-- code/datums/jobs/job/sons_of_mars_shipside.dm | 4 +- code/datums/jobs/job/xenomorph.dm | 5 +- code/datums/jobs/squads.dm | 10 +- code/datums/keybinding/communication.dm | 48 ++++ code/datums/keybinding/mob.dm | 10 +- code/datums/keybinding/xeno.dm | 155 ++++++++++- .../_item_representation.dm | 8 + code/datums/loadout/loadout_manager.dm | 19 +- .../datums/looping_sounds/miscellaneous.dm | 0 code/datums/namepool.dm | 3 + code/datums/shuttles.dm | 12 +- code/datums/skills.dm | 27 ++ code/datums/status_effects/debuffs.dm | 16 ++ code/datums/status_effects/xeno_buffs.dm | 98 ++++++- .../mob/modular/capes_highlight_saro.dmi | Bin .../mob/modular/capes_saro.dmi | Bin .../mob/modular/xenonauten_mk1.dmi | Bin .../datums/components/attachment_handler.dm | 2 - .../datums/components/overlay_lighting.dm | 61 ----- .../code/datums/elements/shrapnel_removal.dm | 80 ------ .../code/datums/gamemodes/_game_mode.dm | 143 ---------- modular_RUtgmc/code/datums/gamemodes/crash.dm | 21 -- .../code/datums/gamemodes/nuclear_war.dm | 2 - .../datums/greyscale/greyscale_configs.dm | 27 -- .../datums/greyscale/json_configs/cape.json | 66 ----- .../json_configs/cape_highlight.json | 52 ---- modular_RUtgmc/code/datums/jobs/job/job.dm | 8 - .../code/datums/jobs/job/job_exp.dm | 75 ------ .../code/datums/jobs/job/marines.dm | 20 -- .../code/datums/jobs/job/shipside.dm | 158 ------------ .../datums/jobs/job/sons_of_mars_shipside.dm | 6 - .../code/datums/jobs/job/xenomorph.dm | 5 - modular_RUtgmc/code/datums/jobs/squads.dm | 15 -- .../code/datums/keybinding/communication.dm | 48 ---- modular_RUtgmc/code/datums/keybinding/mob.dm | 6 - modular_RUtgmc/code/datums/keybinding/xeno.dm | 155 ----------- .../_item_representation.dm | 39 --- .../code/datums/loadout/loadout_manager.dm | 47 ---- modular_RUtgmc/code/datums/namepool.dm | 2 - modular_RUtgmc/code/datums/shuttles.dm | 9 - modular_RUtgmc/code/datums/skills.dm | 66 ----- .../code/datums/status_effects/debuffs.dm | 14 - .../code/datums/status_effects/xeno_buffs.dm | 94 ------- modular_RUtgmc/includes.dm | 36 --- tgmc.dme | 12 + 69 files changed, 730 insertions(+), 1716 deletions(-) rename {modular_RUtgmc/code => code}/datums/autocells/auto_cell.dm (100%) rename {modular_RUtgmc/code => code}/datums/autocells/explosion.dm (100%) rename {modular_RUtgmc/code => code}/datums/autocells/vomitwave.dm (100%) rename {modular_RUtgmc/code => code}/datums/elements/yautja_tracked_item.dm (100%) rename {modular_RUtgmc/code => code}/datums/emergency_calls/necoarc.dm (100%) rename {modular_RUtgmc/code => code}/datums/flaying.dm (100%) rename {modular_RUtgmc/code => code}/datums/gamemodes/distress.dm (100%) rename {modular_RUtgmc/code => code}/datums/greyscale/json_configs/xenonaut_mk1.json (100%) rename {modular_RUtgmc/code => code}/datums/jobs/job/clown.dm (100%) rename {modular_RUtgmc/code => code}/datums/jobs/job/militarypolice.dm (100%) rename {modular_RUtgmc/code => code}/datums/jobs/job/necoarc.dm (100%) rename {modular_RUtgmc/code => code}/datums/jobs/job/pred.dm (100%) rename {modular_RUtgmc/code => code}/datums/looping_sounds/miscellaneous.dm (100%) rename modular_RUtgmc/icons/mob/modular/capes_highlight.dmi => icons/mob/modular/capes_highlight_saro.dmi (100%) rename modular_RUtgmc/icons/mob/modular/capes.dmi => icons/mob/modular/capes_saro.dmi (100%) rename modular_RUtgmc/icons/mob/modular/xenonauten.dmi => icons/mob/modular/xenonauten_mk1.dmi (100%) delete mode 100644 modular_RUtgmc/code/datums/components/attachment_handler.dm delete mode 100644 modular_RUtgmc/code/datums/components/overlay_lighting.dm delete mode 100644 modular_RUtgmc/code/datums/elements/shrapnel_removal.dm delete mode 100644 modular_RUtgmc/code/datums/gamemodes/_game_mode.dm delete mode 100644 modular_RUtgmc/code/datums/gamemodes/crash.dm delete mode 100644 modular_RUtgmc/code/datums/gamemodes/nuclear_war.dm delete mode 100644 modular_RUtgmc/code/datums/greyscale/greyscale_configs.dm delete mode 100644 modular_RUtgmc/code/datums/greyscale/json_configs/cape.json delete mode 100644 modular_RUtgmc/code/datums/greyscale/json_configs/cape_highlight.json delete mode 100644 modular_RUtgmc/code/datums/jobs/job/job.dm delete mode 100644 modular_RUtgmc/code/datums/jobs/job/job_exp.dm delete mode 100644 modular_RUtgmc/code/datums/jobs/job/marines.dm delete mode 100644 modular_RUtgmc/code/datums/jobs/job/shipside.dm delete mode 100644 modular_RUtgmc/code/datums/jobs/job/sons_of_mars_shipside.dm delete mode 100644 modular_RUtgmc/code/datums/jobs/job/xenomorph.dm delete mode 100644 modular_RUtgmc/code/datums/jobs/squads.dm delete mode 100644 modular_RUtgmc/code/datums/keybinding/communication.dm delete mode 100644 modular_RUtgmc/code/datums/keybinding/mob.dm delete mode 100644 modular_RUtgmc/code/datums/keybinding/xeno.dm delete mode 100644 modular_RUtgmc/code/datums/loadout/item_representation/_item_representation.dm delete mode 100644 modular_RUtgmc/code/datums/loadout/loadout_manager.dm delete mode 100644 modular_RUtgmc/code/datums/namepool.dm delete mode 100644 modular_RUtgmc/code/datums/shuttles.dm delete mode 100644 modular_RUtgmc/code/datums/skills.dm delete mode 100644 modular_RUtgmc/code/datums/status_effects/debuffs.dm delete mode 100644 modular_RUtgmc/code/datums/status_effects/xeno_buffs.dm diff --git a/modular_RUtgmc/code/datums/autocells/auto_cell.dm b/code/datums/autocells/auto_cell.dm similarity index 100% rename from modular_RUtgmc/code/datums/autocells/auto_cell.dm rename to code/datums/autocells/auto_cell.dm diff --git a/modular_RUtgmc/code/datums/autocells/explosion.dm b/code/datums/autocells/explosion.dm similarity index 100% rename from modular_RUtgmc/code/datums/autocells/explosion.dm rename to code/datums/autocells/explosion.dm diff --git a/modular_RUtgmc/code/datums/autocells/vomitwave.dm b/code/datums/autocells/vomitwave.dm similarity index 100% rename from modular_RUtgmc/code/datums/autocells/vomitwave.dm rename to code/datums/autocells/vomitwave.dm diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index 883df8d5dc6..6c516ddaa7a 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -29,7 +29,7 @@ ///For light sources that can be turned on and off. var/overlay_lighting_flags = NONE - /* RUTGMC DELETION START + ///Cache of the possible light overlays, according to size. var/static/list/light_overlays = list( "32" = 'icons/effects/light_overlays/light_32.dmi', @@ -43,8 +43,25 @@ "288" = 'icons/effects/light_overlays/light_288.dmi', "320" = 'icons/effects/light_overlays/light_320.dmi', "352" = 'icons/effects/light_overlays/light_352.dmi', + "384" = 'icons/effects/light_overlays/light_384.dmi', + "416" = 'icons/effects/light_overlays/light_416.dmi', + "448" = 'icons/effects/light_overlays/light_448.dmi', + "480" = 'icons/effects/light_overlays/light_480.dmi', + "512" = 'icons/effects/light_overlays/light_512.dmi', + "544" = 'icons/effects/light_overlays/light_544.dmi', + "576" = 'icons/effects/light_overlays/light_576.dmi', + "608" = 'icons/effects/light_overlays/light_608.dmi', + "640" = 'icons/effects/light_overlays/light_640.dmi', + "672" = 'icons/effects/light_overlays/light_672.dmi', + "704" = 'icons/effects/light_overlays/light_704.dmi', + "736" = 'icons/effects/light_overlays/light_736.dmi', + "768" = 'icons/effects/light_overlays/light_768.dmi', + "800" = 'icons/effects/light_overlays/light_800.dmi', + "832" = 'icons/effects/light_overlays/light_832.dmi', + "864" = 'icons/effects/light_overlays/light_864.dmi', + "896" = 'icons/effects/light_overlays/light_896.dmi', + "928" = 'icons/effects/light_overlays/light_928.dmi', ) - RUTGMC DELETION END */ ///Overlay effect to cut into the darkness and provide light. var/image/visible_mask @@ -218,15 +235,13 @@ make_luminosity_update() - /* RUTGMC DELETION START -///Changes the range which the light reaches. 0 means no light, 6 is the maximum value. /datum/component/overlay_lighting/proc/set_range(atom/source, new_range) SIGNAL_HANDLER if(range == new_range) return if(range == 0) turn_off() - range = clamp(CEILING(new_range, 0.5), 1, 6) + range = clamp(CEILING(new_range, 0.5), 1, 15) var/pixel_bounds = ((range - 1) * 64) + 32 lumcount_range = CEILING(range, 1) if(current_holder && overlay_lighting_flags & LIGHTING_ON) @@ -243,7 +258,7 @@ current_holder.underlays += visible_mask if(overlay_lighting_flags & LIGHTING_ON) make_luminosity_update() - RUTGMC DELETION END */ + ///Changes the intensity/brightness of the light by altering the visual object's alpha. /datum/component/overlay_lighting/proc/set_power(atom/source, new_power) diff --git a/code/datums/elements/shrapnel_removal.dm b/code/datums/elements/shrapnel_removal.dm index 7cc2573d36b..8363305051c 100644 --- a/code/datums/elements/shrapnel_removal.dm +++ b/code/datums/elements/shrapnel_removal.dm @@ -1,4 +1,3 @@ -/* RUTGMC DELETION, SHRAPNEL REMOVAL FOR KNIVES /datum/element/shrapnel_removal element_flags = ELEMENT_BESPOKE argument_hash_start_idx = 2 @@ -6,13 +5,16 @@ var/do_after_time ///Fumble time for unskilled users var/fumble_duration + ///Additional damage for removing something with improvised tools + var/additional_damage -/datum/element/shrapnel_removal/Attach(datum/target, duration, fumble_time) +/datum/element/shrapnel_removal/Attach(datum/target, duration, fumble_time, damage) . = ..() if(!isitem(target) || (duration < 1)) return ELEMENT_INCOMPATIBLE do_after_time = duration fumble_duration = fumble_time ? fumble_time : do_after_time + additional_damage = damage ? damage : 5 RegisterSignal(target, COMSIG_ITEM_ATTACK, PROC_REF(on_attack)) /datum/element/shrapnel_removal/Detach(datum/source, force) @@ -21,6 +23,8 @@ /datum/element/shrapnel_removal/proc/on_attack(datum/source, mob/living/M, mob/living/user) SIGNAL_HANDLER + if(user.a_intent != INTENT_HELP) + return INVOKE_ASYNC(src, PROC_REF(attempt_remove), source, M, user) return COMPONENT_ITEM_NO_ATTACK @@ -69,9 +73,8 @@ I.unembed_ourself(FALSE) if(skill < SKILL_MEDICAL_PRACTICED) user.visible_message(span_notice("[user] violently rips out [I] from [target]!"), span_notice("You violently rip out [I] from [target]!")) - targetlimb.take_damage_limb(30 * (SKILL_MEDICAL_PRACTICED - skill), 0, FALSE, FALSE) + targetlimb.take_damage_limb(5 + additional_damage * (SKILL_MEDICAL_PRACTICED - skill), 0, FALSE, FALSE) else user.visible_message(span_notice("[user] pulls out [I] from [target]!"), span_notice("You pull out [I] from [target]!")) - targetlimb.take_damage_limb(15, 0, FALSE, FALSE) + targetlimb.take_damage_limb(rand(3, 7), 0, FALSE, FALSE) break -*/ diff --git a/modular_RUtgmc/code/datums/elements/yautja_tracked_item.dm b/code/datums/elements/yautja_tracked_item.dm similarity index 100% rename from modular_RUtgmc/code/datums/elements/yautja_tracked_item.dm rename to code/datums/elements/yautja_tracked_item.dm diff --git a/modular_RUtgmc/code/datums/emergency_calls/necoarc.dm b/code/datums/emergency_calls/necoarc.dm similarity index 100% rename from modular_RUtgmc/code/datums/emergency_calls/necoarc.dm rename to code/datums/emergency_calls/necoarc.dm diff --git a/modular_RUtgmc/code/datums/flaying.dm b/code/datums/flaying.dm similarity index 100% rename from modular_RUtgmc/code/datums/flaying.dm rename to code/datums/flaying.dm diff --git a/code/datums/gamemodes/_game_mode.dm b/code/datums/gamemodes/_game_mode.dm index 0cbe77d118a..e130c1b1f14 100644 --- a/code/datums/gamemodes/_game_mode.dm +++ b/code/datums/gamemodes/_game_mode.dm @@ -46,6 +46,17 @@ GLOBAL_VAR(common_report) //Contains common part of roundend report ///What factions are used in this gamemode, typically TGMC and xenos var/list/factions = list(FACTION_TERRAGOV, FACTION_ALIEN) + var/list/predators = list() + + var/pred_current_num = 0 //How many are there now? + var/pred_per_players = 20 //Preds per player + var/pred_start_count = 0 //The initial count of predators + + var/pred_additional_max = 0 + var/pred_leader_count = 0 //How many Leader preds are active + var/pred_leader_max = 1 //How many Leader preds are permitted. Currently fixed to 1. May add admin verb to adjust this later. + var/quickbuild_points_flags = NONE + //Distress call variables. var/list/datum/emergency_call/all_calls = list() //initialized at round start and stores the datums. var/datum/emergency_call/picked_call = null //Which distress call is currently active @@ -61,7 +72,7 @@ GLOBAL_VAR(common_report) //Contains common part of roundend report ///If the gamemode has a whitelist of valid ground maps. Whitelist overrides the blacklist var/list/whitelist_ground_maps ///If the gamemode has a blacklist of disallowed ground maps - var/list/blacklist_ground_maps = list(MAP_DELTA_STATION, MAP_PRISON_STATION, MAP_LV_624, MAP_WHISKEY_OUTPOST, MAP_OSCAR_OUTPOST, MAP_FORT_PHOBOS) + var/list/blacklist_ground_maps = list(MAP_DELTA_STATION, MAP_WHISKEY_OUTPOST, MAP_OSCAR_OUTPOST, MAP_FORT_PHOBOS) ///if fun tads are enabled by default var/enable_fun_tads = FALSE @@ -135,6 +146,9 @@ GLOBAL_VAR(common_report) //Contains common part of roundend report var/datum/db_query/query_round_game_mode = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET [sql] WHERE id = :roundid", list("roundid" = GLOB.round_id)) query_round_game_mode.Execute() qdel(query_round_game_mode) + if(flags_round_type & MODE_SILO_RESPAWN) + var/datum/hive_status/normal/HN = GLOB.hive_datums[XENO_HIVE_NORMAL] + HN.RegisterSignals(SSdcs, list(COMSIG_GLOB_OPEN_TIMED_SHUTTERS_LATE, COMSIG_GLOB_OPEN_SHUTTERS_EARLY), TYPE_PROC_REF(/datum/hive_status/normal, set_siloless_collapse_timer)) /datum/game_mode/proc/new_player_topic(mob/new_player/NP, href, list/href_list) return FALSE @@ -945,6 +959,17 @@ GLOBAL_LIST_INIT(bioscan_locations, list( handle_larva_timer(dcs, source, items) handle_xeno_respawn_timer(dcs, source, items) + if(isobserver(source)) + var/siloless_countdown = SSticker.mode.get_siloless_collapse_countdown() + if(siloless_countdown) + items +="Silo less hive collapse timer: [siloless_countdown]" + else if(isxeno(source)) + var/mob/living/carbon/xenomorph/xeno_source = source + if(xeno_source.hivenumber == XENO_HIVE_NORMAL) + var/siloless_countdown = SSticker.mode.get_siloless_collapse_countdown() + if(siloless_countdown) + items +="Silo less hive collapse timer: [siloless_countdown]" + /// Displays the orphan hivemind collapse timer, if applicable /datum/game_mode/proc/handle_collapse_timer(datum/dcs, mob/source, list/items) if (isxeno(source)) @@ -976,3 +1001,113 @@ GLOBAL_LIST_INIT(bioscan_locations, list( items += "Xeno respawn timer: READY" else items += "Xeno respawn timer: [(status_value / 60) % 60]:[add_leading(num2text(status_value % 60), 2, "0")]" + +/// called to check for updates that might require starting/stopping the siloless collapse timer +/datum/game_mode/proc/update_silo_death_timer(datum/hive_status/silo_owner) + return + +///starts the timer to end the round when no silo is left +/datum/game_mode/proc/get_siloless_collapse_countdown() + return + +/datum/game_mode/proc/predator_round() + switch(CONFIG_GET(number/pred_round)) + if(0) + return + if(1) + if(!prob(CONFIG_GET(number/pred_round_chance))) + return + + var/datum/job/PJ = SSjob.GetJobType(/datum/job/predator) + var/new_pred_max = min(max(round(length(GLOB.clients) * PREDATOR_TO_TOTAL_SPAWN_RATIO), 1), 4) + PJ.total_positions = new_pred_max + PJ.max_positions = new_pred_max + flags_round_type |= MODE_PREDATOR + +/datum/game_mode/proc/initialize_predator(mob/living/carbon/human/new_predator, client/player, ignore_pred_num = FALSE) + predators[lowertext(player.ckey)] = list("Name" = new_predator.real_name, "Status" = "Alive") + if(!ignore_pred_num) + pred_current_num++ + +/datum/game_mode/proc/get_whitelisted_predators(readied = 1) + // Assemble a list of active players who are whitelisted. + var/players[] = new + + var/mob/new_player/new_pred + for(var/mob/player in GLOB.player_list) + if(!player.client) continue //No client. DCed. + if(isyautja(player)) continue //Already a predator. Might be dead, who knows. + if(readied) //Ready check for new players. + new_pred = player + if(!istype(new_pred)) continue //Have to be a new player here. + if(!new_pred.ready) continue //Have to be ready. + else + if(!istype(player,/mob/dead)) continue //Otherwise we just want to grab the ghosts. + + if(GLOB.roles_whitelist[player.ckey] & WHITELIST_PREDATOR) //Are they whitelisted? + if(!player.client.prefs) + player.client.prefs = new /datum/preferences(player.client) //Somehow they don't have one. + + if(player.client.prefs.job_preferences[JOB_PREDATOR] > 0) //Are their prefs turned on? + if(!player.mind) //They have to have a key if they have a client. + player.mind_initialize() //Will work on ghosts too, but won't add them to active minds. + players += player.mind + return players + +#define calculate_pred_max (length(GLOB.player_list) / pred_per_players + pred_additional_max + pred_start_count) + +/datum/game_mode/proc/check_predator_late_join(mob/pred_candidate, show_warning = TRUE) + if(!pred_candidate?.client) // Nigga, how?! + return + + var/datum/job/job = SSjob.GetJobType(/datum/job/predator) + + if(!job) + if(show_warning) + to_chat(pred_candidate, span_warning("Something went wrong!")) + return + + if(show_warning && alert(pred_candidate, "Confirm joining the hunt. You will join as \a [lowertext(job.get_whitelist_status(GLOB.roles_whitelist, pred_candidate.client))] predator", "Confirm", "Yes", "No") != "Yes") + return + + if(!(GLOB.roles_whitelist[pred_candidate.ckey] & WHITELIST_PREDATOR)) + if(show_warning) + to_chat(pred_candidate, span_warning("You are not whitelisted! You may apply on the forums to be whitelisted as a predator.")) + return + + if(is_banned_from(ckey(pred_candidate.key), JOB_PREDATOR)) + if(show_warning) + to_chat(pred_candidate, span_warning("You are banned.")) + return + + if(!(flags_round_type & MODE_PREDATOR)) + if(show_warning) + to_chat(pred_candidate, span_warning("There is no Hunt this round! Maybe the next one.")) + return + + if(pred_candidate.ckey in predators) + if(show_warning) + to_chat(pred_candidate, span_warning("You already were a Yautja! Give someone else a chance.")) + return + + if(get_desired_status(pred_candidate.client.prefs.yautja_status, WHITELIST_COUNCIL) == WHITELIST_NORMAL) + var/pred_max = calculate_pred_max + if(pred_current_num >= pred_max) + if(show_warning) + to_chat(pred_candidate, span_warning("Only [pred_max] predators may spawn this round, but Councillors and Ancients do not count.")) + return + + return TRUE + +#undef calculate_pred_max + +/datum/game_mode/proc/join_predator(mob/pred_candidate) + var/datum/job/job = SSjob.GetJobType(/datum/job/predator) + var/datum/preferences/prefs = pred_candidate.client.prefs + var/spawn_type = job.return_spawn_type(prefs) + var/mob/living/carbon/human/new_predator = new spawn_type() + new_predator.forceMove(job.return_spawn_turf(pred_candidate, pred_candidate.client)) + new_predator.ckey = pred_candidate.ckey + new_predator.apply_assigned_role_to_spawn(job) + job.after_spawn(new_predator) + qdel(pred_candidate) diff --git a/code/datums/gamemodes/crash.dm b/code/datums/gamemodes/crash.dm index 34116d13181..98b9ec0021b 100644 --- a/code/datums/gamemodes/crash.dm +++ b/code/datums/gamemodes/crash.dm @@ -10,6 +10,7 @@ /datum/job/terragov/squad/smartgunner = 1, /datum/job/terragov/squad/leader = 1, /datum/job/terragov/medical/professor = 1, + /datum/job/terragov/medical/medicalofficer = 1, /datum/job/terragov/silicon/synthetic = 1, /datum/job/terragov/command/fieldcommander = 1, /datum/job/xenomorph = FREE_XENO_AT_START @@ -74,6 +75,8 @@ SSshuttle.moveShuttleToDock(shuttle.id, actual_crash_site, TRUE) // FALSE = instant arrival addtimer(CALLBACK(src, PROC_REF(crash_shuttle), actual_crash_site), 10 MINUTES) + GLOB.start_squad_landmarks_list = null + /datum/game_mode/infestation/crash/post_setup() . = ..() diff --git a/modular_RUtgmc/code/datums/gamemodes/distress.dm b/code/datums/gamemodes/distress.dm similarity index 100% rename from modular_RUtgmc/code/datums/gamemodes/distress.dm rename to code/datums/gamemodes/distress.dm diff --git a/code/datums/gamemodes/nuclear_war.dm b/code/datums/gamemodes/nuclear_war.dm index 3d958f2d560..19edc0242a5 100644 --- a/code/datums/gamemodes/nuclear_war.dm +++ b/code/datums/gamemodes/nuclear_war.dm @@ -4,6 +4,7 @@ silo_scaling = 1.5 flags_round_type = MODE_INFESTATION|MODE_LATE_OPENING_SHUTTER_TIMER|MODE_XENO_RULER|MODE_PSY_POINTS|MODE_PSY_POINTS_ADVANCED|MODE_DEAD_GRAB_FORBIDDEN|MODE_HIJACK_POSSIBLE|MODE_SILO_RESPAWN|MODE_SILOS_SPAWN_MINIONS|MODE_ALLOW_XENO_QUICKBUILD flags_xeno_abilities = ABILITY_NUCLEARWAR + quickbuild_points_flags = MODE_GENERAL_QUICKBUILD_POINTS valid_job_types = list( /datum/job/terragov/command/captain = 1, /datum/job/terragov/command/fieldcommander = 1, diff --git a/code/datums/greyscale/greyscale_configs.dm b/code/datums/greyscale/greyscale_configs.dm index ca9e02ab3e0..7276807de8f 100644 --- a/code/datums/greyscale/greyscale_configs.dm +++ b/code/datums/greyscale/greyscale_configs.dm @@ -659,3 +659,33 @@ /datum/greyscale_config/broken_man icon_file = 'icons/mob/human_face.dmi' json_config = 'code/datums/greyscale/json_configs/broken_man.json' + +//Capes +/datum/greyscale_config/cape + icon_file = 'icons/mob/modular/capes_saro.dmi' + json_config = 'code/datums/greyscale/json_configs/cape.json' + + +//Cape highlights +/datum/greyscale_config/cape_highlight + icon_file = 'icons/mob/modular/capes_highlight_saro.dmi' + json_config = 'code/datums/greyscale/json_configs/cape_highlight.json' + + +//Xenonauten MK1 +/datum/greyscale_config/xenonaut/mk1 + icon_file = 'icons/mob/modular/xenonauten_mk1.dmi' + json_config = 'code/datums/greyscale/json_configs/xenonaut_mk1.json' + prefix = "med_" + +/datum/greyscale_config/xenonaut/mk1/light + prefix = "light_" + +/datum/greyscale_config/xenonaut/mk1/medium + prefix = "med_" + +/datum/greyscale_config/xenonaut/mk1/heavy + prefix = "heavy_" + +/datum/greyscale_config/xenonaut/helm/mk1 + icon_file = 'icons/mob/modular/xenonauten_mk1.dmi' diff --git a/code/datums/greyscale/json_configs/cape.json b/code/datums/greyscale/json_configs/cape.json index c675cfb642e..9614a74ccb3 100644 --- a/code/datums/greyscale/json_configs/cape.json +++ b/code/datums/greyscale/json_configs/cape.json @@ -1,258 +1,66 @@ { - "cape_scarf round": [ - { - "type": "hyperscale", - "icon_state": "scarf_round" - } - ], - "cape_striped": [ - { - "type": "hyperscale", - "icon_state": "striped" - } - ], - "cape_striped_h": [ - { - "type": "hyperscale", - "icon_state": "striped_h" - } - ], - "cape_geist": [ - { - "type": "hyperscale", - "icon_state": "geist" - } - ], - "cape_geist_h": [ - { - "type": "hyperscale", - "icon_state": "geist_h" - } - ], - "cape_scarf tied": [ - { - "type": "hyperscale", - "icon_state": "scarf_tied" - } - ], - "cape_ghille": [ - { - "type": "hyperscale", - "icon_state": "ghille" - } - ], - "cape_ghille (right)": [ - { - "type": "hyperscale", - "icon_state": "ghille_right" - } - ], - "cape_ghille (left)": [ - { - "type": "hyperscale", - "icon_state": "ghille_left" - } - ], - "cape_ghille (alt)": [ - { - "type": "hyperscale", - "icon_state": "ghille_2" - } - ], - "cape_drifter": [ - { - "type": "hyperscale", - "icon_state": "drifter" - } - ], - "cape_scarf": [ - { - "type": "hyperscale", - "icon_state": "scarf" - } - ], - "cape_scarf_h": [ - { - "type": "hyperscale", - "icon_state": "scarf_h" - } - ], - "cape_normal": [ - { - "type": "hyperscale", - "icon_state": "normal" - } - ], - "cape_normal_h": [ - { - "type": "hyperscale", - "icon_state": "normal_h" - } - ], - "cape_short": [ - { - "type": "hyperscale", - "icon_state": "short" - } - ], - "cape_short_h": [ - { - "type": "hyperscale", - "icon_state": "short_h" - } - ], - "cape_shredded": [ - { - "type": "hyperscale", - "icon_state": "shredded" - } - ], - "cape_shredded_h": [ - { - "type": "hyperscale", - "icon_state": "shredded_h" - } - ], - "cape_half": [ - { - "type": "hyperscale", - "icon_state": "half" - } - ], - "cape_half_h": [ - { - "type": "hyperscale", - "icon_state": "half_h" - } - ], - "cape_full": [ - { - "type": "hyperscale", - "icon_state": "full" - } - ], - "cape_full_h": [ - { - "type": "hyperscale", - "icon_state": "full_h" - } - ], - "cape_back": [ - { - "type": "hyperscale", - "icon_state": "back" - } - ], - "cape_cover": [ - { - "type": "hyperscale", - "icon_state": "cover_1" - } - ], - "cape_cover (alt)": [ - { - "type": "hyperscale", - "icon_state": "cover_2" - } - ], - "cape_overlord": [ - { - "type": "hyperscale", - "icon_state": "overlord" - } - ], - "cape_overlord (alt 1)": [ - { - "type": "hyperscale", - "icon_state": "overlord_2" - } - ], - "cape_overlord (alt 2)": [ - { - "type": "hyperscale", - "icon_state": "overlord_3" - } - ], - "cape_shoal": [ - { - "type": "hyperscale", - "icon_state": "shoal" - } - ], - "cape_shoal (back)": [ + "cape_kama": [ { "type": "hyperscale", - "icon_state": "shoal_back" + "icon_state": "kama" } ], - "cape_star": [ + "cape_kilt": [ { "type": "hyperscale", - "icon_state": "star" - } - ], - "cape_shoal (alt)": [ + "icon_state": "kilt" + }, { - "type": "hyperscale", - "icon_state": "shoal_2" + "type":"icon_state", + "icon_state":"kilt_no_color", + "blend_mode":"overlay" } ], - "cape_rapier (right)": [ + "cape_kilt (alt)": [ { "type": "hyperscale", - "icon_state": "rapier_right" - } - ], - "cape_rapier (left)": [ + "icon_state": "kilt_alt" + }, { - "type": "hyperscale", - "icon_state": "rapier_left" + "type":"icon_state", + "icon_state":"kilt_no_color", + "blend_mode":"overlay" } ], - "cape_jacket": [ + "cape_long": [ { "type": "hyperscale", - "icon_state": "jacket" + "icon_state": "long" } ], - "cape_kama": [ + "cape_long_h": [ { "type": "hyperscale", - "icon_state": "kama" + "icon_state": "long_h" } ], - "cape_kilt": [ + "cape_regaly": [ { "type": "hyperscale", - "icon_state": "kilt" - }, - { - "type":"icon_state", - "icon_state":"kilt_no_color", - "blend_mode":"overlay" + "icon_state": "regaly" } ], - "cape_kilt (alt)": [ + "cape_regaly_h": [ { "type": "hyperscale", - "icon_state": "kilt_alt" - }, - { - "type":"icon_state", - "icon_state":"kilt_no_color", - "blend_mode":"overlay" + "icon_state": "regaly_h" } ], - "cape_short (old)": [ + "cape_onelong": [ { "type": "hyperscale", - "icon_state": "old_short" + "icon_state": "onelong" } ], - "cape_short (old)_h": [ + "cape_onelong_h": [ { "type": "hyperscale", - "icon_state": "old_short_h" + "icon_state": "onelong_h" } ] } diff --git a/code/datums/greyscale/json_configs/cape_highlight.json b/code/datums/greyscale/json_configs/cape_highlight.json index b1372c924ac..a6c8e1dc506 100644 --- a/code/datums/greyscale/json_configs/cape_highlight.json +++ b/code/datums/greyscale/json_configs/cape_highlight.json @@ -1,11 +1,4 @@ { - "highlight_none":[ - { - "type": "icon_state", - "icon_state": "empty", - "blend_mode": "overlay" - } - ], "highlight_kama":[ { "type": "hyperscale", @@ -18,166 +11,42 @@ "icon_state": "kilt" } ], - "highlight_scarf":[ - { - "type": "hyperscale", - "icon_state": "scarf" - } - ], - "highlight_scarf_h":[ - { - "type": "hyperscale", - "icon_state": "scarf_h" - } - ], - "highlight_normal":[ - { - "type": "hyperscale", - "icon_state": "normal" - } - ], - "highlight_normal_h":[ - { - "type": "hyperscale", - "icon_state": "normal_h" - } - ], - "highlight_normal (alt)":[ - { - "type": "hyperscale", - "icon_state": "normal_alt" - } - ], - "highlight_normal (alt)_h":[ - { - "type": "hyperscale", - "icon_state": "normal_alt_h" - } - ], - "highlight_short":[ - { - "type": "hyperscale", - "icon_state": "short" - } - ], - "highlight_short_h":[ - { - "type": "hyperscale", - "icon_state": "short_h" - } - ], - "highlight_shredded":[ - { - "type": "hyperscale", - "icon_state": "shredded" - } - ], - "highlight_shredded_h":[ - { - "type": "hyperscale", - "icon_state": "shredded_h" - } - ], - "highlight_half":[ - { - "type": "hyperscale", - "icon_state": "half" - } - ], - "highlight_half_h":[ - { - "type": "hyperscale", - "icon_state": "half_h" - } - ], - "highlight_full":[ - { - "type": "hyperscale", - "icon_state": "full" - } - ], - "highlight_full_h":[ - { - "type": "hyperscale", - "icon_state": "full_h" - } - ], - "highlight_back":[ - { - "type": "hyperscale", - "icon_state": "back" - } - ], - "highlight_cover":[ - { - "type": "hyperscale", - "icon_state": "cover" - } - ], - "highlight_cover (alt)":[ - { - "type": "hyperscale", - "icon_state": "cover_2" - } - ], - "highlight_overlord":[ - { - "type": "hyperscale", - "icon_state": "overlord" - } - ], - "highlight_overlord (alt)":[ - { - "type": "hyperscale", - "icon_state": "overlord_2" - } - ], - "highlight_overlord (alt 2)":[ - { - "type": "hyperscale", - "icon_state": "overlord_3" - } - ], - "highlight_shoal":[ - { - "type": "hyperscale", - "icon_state": "shoal" - } - ], - "highlight_shoal (alt)":[ + "highlight_long":[ { "type": "hyperscale", - "icon_state": "shoal_2" + "icon_state": "long" } ], - "highlight_shoal (back)":[ + "highlight_long_h":[ { "type": "hyperscale", - "icon_state": "shoal_back" + "icon_state": "long" } ], - "highlight_star":[ + + "highlight_regaly":[ { "type": "hyperscale", - "icon_state": "star" + "icon_state": "regaly" } ], - "highlight_rapier left":[ + "highlight_regaly_h":[ { "type": "hyperscale", - "icon_state": "rapier_left" + "icon_state": "regaly_h" } ], - "highlight_rapier right":[ + "highlight_onelong":[ { "type": "hyperscale", - "icon_state": "rapier_right" + "icon_state": "onelong" } ], - "highlight_jacket":[ + + "highlight_onelong_h":[ { "type": "hyperscale", - "icon_state": "jacket" + "icon_state": "onelong" } ] } diff --git a/modular_RUtgmc/code/datums/greyscale/json_configs/xenonaut_mk1.json b/code/datums/greyscale/json_configs/xenonaut_mk1.json similarity index 100% rename from modular_RUtgmc/code/datums/greyscale/json_configs/xenonaut_mk1.json rename to code/datums/greyscale/json_configs/xenonaut_mk1.json diff --git a/modular_RUtgmc/code/datums/jobs/job/clown.dm b/code/datums/jobs/job/clown.dm similarity index 100% rename from modular_RUtgmc/code/datums/jobs/job/clown.dm rename to code/datums/jobs/job/clown.dm diff --git a/code/datums/jobs/job/job.dm b/code/datums/jobs/job/job.dm index 2d14d825425..f2038fb83e7 100644 --- a/code/datums/jobs/job/job.dm +++ b/code/datums/jobs/job/job.dm @@ -74,6 +74,9 @@ GLOBAL_PROTECT(exp_specialmap) ///string; typepath for the icon that this job will show on the minimap var/minimap_icon + ///Gear preset name used for council snowflakes ;) + var/list/datum/outfit/gear_preset_whitelist = list() + /datum/job/New() if(outfit) if(!ispath(outfit, /datum/outfit)) @@ -81,6 +84,11 @@ GLOBAL_PROTECT(exp_specialmap) else outfit = new outfit //Can be improved to reference a singleton. +/datum/job/proc/get_whitelist_status(list/roles_whitelist, client/player) + if(!roles_whitelist) + return FALSE + + return WHITELIST_NORMAL /datum/job/proc/after_spawn(mob/living/L, mob/M, latejoin = FALSE) //do actions on L but send messages to M as the key may not have been transferred_yet if(isnull(L)) diff --git a/code/datums/jobs/job/job_exp.dm b/code/datums/jobs/job/job_exp.dm index 1c1617512ec..52b1fe3a273 100644 --- a/code/datums/jobs/job/job_exp.dm +++ b/code/datums/jobs/job/job_exp.dm @@ -78,8 +78,7 @@ GLOBAL_PROTECT(exp_to_update) else exp_data[category] = 0 for(var/category in GLOB.exp_specialmap) - //if(category == EXP_TYPE_SPECIAL) // ORIGINAL - if(category == EXP_TYPE_XENO) // RUTGMC ADDITION + if(category == EXP_TYPE_XENO) if(GLOB.exp_specialmap[category]) for(var/innercat in GLOB.exp_specialmap[category]) if(play_records[innercat]) @@ -147,15 +146,16 @@ GLOBAL_PROTECT(exp_to_update) return pure_numeric ? exp_living : get_exp_format(exp_living) -/* RUTGMC DELETION /proc/get_exp_format(expnum) if(expnum > 60) - return num2text(round(expnum / 60)) + "h" + num2text(round(expnum % 60)) + "m" + if(round(expnum % 60) > 0) + return num2text(round(expnum / 60)) + "h" + num2text(round(expnum % 60)) + "m" + else + return num2text(round(expnum / 60)) + "h" else if(expnum > 0) return num2text(expnum) + "m" else return "0h" -*/ /proc/update_exp(mins, ann = FALSE) @@ -265,3 +265,18 @@ GLOBAL_PROTECT(exp_to_update) return FALSE var/my_exp = C.prefs.exp[ROLE_XENOMORPH] return my_exp < XP_REQ_UNSEASONED + +/client/proc/facehugger_exp_update(stat = 0) + if(!CONFIG_GET(flag/use_exp_tracking)) + return -1 + if(!SSdbcore.Connect()) + return -1 + if(!isnum(stat) || !stat) + return -1 + + LAZYINITLIST(GLOB.exp_to_update) + GLOB.exp_to_update.Add(list(list( + "job" = EXP_TYPE_FACEHUGGER_STAT, + "ckey" = ckey, + "minutes" = stat))) + prefs.exp[EXP_TYPE_FACEHUGGER_STAT] += stat diff --git a/code/datums/jobs/job/marines.dm b/code/datums/jobs/job/marines.dm index d5be9dbed75..3abab6bc09a 100644 --- a/code/datums/jobs/job/marines.dm +++ b/code/datums/jobs/job/marines.dm @@ -4,6 +4,10 @@ selection_color = "#ffeeee" exp_type_department = EXP_TYPE_MARINES +/datum/job/terragov/squad/proc/spawn_by_squads(squad) + if(!(title in GLOB.start_squad_landmarks_list[squad])) + return pick(GLOB.start_squad_landmarks_list[squad][SQUAD_MARINE]) + return pick(GLOB.start_squad_landmarks_list[squad][title]) /datum/job/terragov/squad/after_spawn(mob/living/carbon/C, mob/M, latejoin = FALSE) . = ..() @@ -90,6 +94,10 @@ What you lack alone, you gain standing shoulder to shoulder with the men and wom access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_ENGPREP, ACCESS_CIVILIAN_ENGINEERING, ACCESS_MARINE_REMOTEBUILD, ACCESS_MARINE_ENGINEERING) minimal_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_ENGPREP, ACCESS_CIVILIAN_ENGINEERING, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_REMOTEBUILD, ACCESS_MARINE_ENGINEERING) skills_type = /datum/skills/combat_engineer + + exp_type = EXP_TYPE_MARINES + exp_requirements = XP_REQ_UNSEASONED + display_order = JOB_DISPLAY_ORDER_SUQAD_ENGINEER outfit = /datum/outfit/job/marine/engineer job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS @@ -151,6 +159,10 @@ Your squaddies will look to you when it comes to construction in the field of ba access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDPREP, ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CHEMISTRY) minimal_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDPREP, ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_DROPSHIP) skills_type = /datum/skills/combat_medic + + exp_type = EXP_TYPE_MEDICAL + exp_requirements = XP_REQ_UNSEASONED + display_order = JOB_DISPLAY_ORDER_SQUAD_CORPSMAN outfit = /datum/outfit/job/marine/corpsman job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS @@ -211,6 +223,10 @@ You may not be a fully-fledged doctor, but you stand between life and death when access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SMARTPREP) minimal_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SMARTPREP, ACCESS_MARINE_DROPSHIP) skills_type = /datum/skills/smartgunner + + exp_type = EXP_TYPE_MARINES + exp_requirements = XP_REQ_UNSEASONED + display_order = JOB_DISPLAY_ORDER_SQUAD_SMARTGUNNER outfit = /datum/outfit/job/marine/smartgunner job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS @@ -304,6 +320,10 @@ You can serve a variety of roles, so choose carefully."}) access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP) minimal_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP) skills_type = /datum/skills/sl + + exp_type = EXP_TYPE_MARINES + exp_requirements = XP_REQ_INTERMEDIATE + display_order = JOB_DISPLAY_ORDER_SQUAD_LEADER outfit = /datum/outfit/job/marine/leader exp_requirements = XP_REQ_INTERMEDIATE diff --git a/modular_RUtgmc/code/datums/jobs/job/militarypolice.dm b/code/datums/jobs/job/militarypolice.dm similarity index 100% rename from modular_RUtgmc/code/datums/jobs/job/militarypolice.dm rename to code/datums/jobs/job/militarypolice.dm diff --git a/modular_RUtgmc/code/datums/jobs/job/necoarc.dm b/code/datums/jobs/job/necoarc.dm similarity index 100% rename from modular_RUtgmc/code/datums/jobs/job/necoarc.dm rename to code/datums/jobs/job/necoarc.dm diff --git a/modular_RUtgmc/code/datums/jobs/job/pred.dm b/code/datums/jobs/job/pred.dm similarity index 100% rename from modular_RUtgmc/code/datums/jobs/job/pred.dm rename to code/datums/jobs/job/pred.dm diff --git a/code/datums/jobs/job/shipside.dm b/code/datums/jobs/job/shipside.dm index a44e1317b68..e82078c7ebe 100644 --- a/code/datums/jobs/job/shipside.dm +++ b/code/datums/jobs/job/shipside.dm @@ -24,8 +24,8 @@ /datum/outfit/job/command/captain, /datum/outfit/job/command/captain/robot, ) - exp_requirements = XP_REQ_EXPERT exp_type = EXP_TYPE_REGULAR_ALL + exp_requirements = XP_REQ_EXPERT job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_ISCOMMAND|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_ALWAYS_VISIBLE_ON_MINIMAP|JOB_FLAG_LOUDER_TTS jobworth = list( /datum/job/xenomorph = LARVA_POINTS_SHIPSIDE, @@ -60,13 +60,25 @@ Godspeed, captain! And remember, you are not above the law."}) var/playtime_mins = user?.client?.get_exp(title) if(!playtime_mins || playtime_mins < 1 ) return + new_human.dropItemToGround(new_human.head) switch(playtime_mins) if(0 to 1500) // starting new_human.wear_id.paygrade = "O6" - if(1501 to 7500) // 25hrs + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/marine/captain/black, SLOT_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/captain_cloak_red, SLOT_BACK) + if(1501 to 3000) // 25hrs new_human.wear_id.paygrade = "O7" - if(7501 to INFINITY) //125 hrs + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/highcap/captain/black, SLOT_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/captain_cloak_red, SLOT_BACK) + if(3001 to 4500) //50 hrs new_human.wear_id.paygrade = "O8" + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/marine/captain, SLOT_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/captain_cloak_red/white, SLOT_BACK) + if(4501 to INFINITY) //75 hrs + new_human.wear_id.paygrade = "O9" + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/highcap/captain, SLOT_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/captain_cloak_red/white, SLOT_BACK) + /datum/job/terragov/command/captain/campaign outfit = /datum/outfit/job/command/captain/campaign @@ -77,14 +89,16 @@ Godspeed, captain! And remember, you are not above the law."}) jobtype = /datum/job/terragov/command/captain id = /obj/item/card/id/gold - belt = /obj/item/storage/holster/belt/pistol/smart_pistol/full ears = /obj/item/radio/headset/mainship/mcom w_uniform = /obj/item/clothing/under/marine/officer/command shoes = /obj/item/clothing/shoes/marinechief/captain gloves = /obj/item/clothing/gloves/marine/techofficer/captain - head = /obj/item/clothing/head/tgmcberet/tan r_store = /obj/item/storage/pouch/general/large/command l_store = /obj/item/hud_tablet/leadership + belt = /obj/item/storage/holster/blade/officer/sabre/full + glasses = /obj/item/clothing/glasses/sunglasses/aviator/yellow + head = null + back = FALSE /datum/outfit/job/command/captain/robot species = SPECIES_COMBAT_ROBOT @@ -117,8 +131,8 @@ Godspeed, captain! And remember, you are not above the law."}) /datum/outfit/job/command/fieldcommander, /datum/outfit/job/command/fieldcommander/robot, ) - exp_requirements = XP_REQ_EXPERIENCED - exp_type = EXP_TYPE_REGULAR_ALL + exp_type = EXP_TYPE_MARINES + exp_requirements = XP_REQ_EXPERT job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_ISCOMMAND|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS|JOB_FLAG_ALWAYS_VISIBLE_ON_MINIMAP|JOB_FLAG_LOUDER_TTS jobworth = list( /datum/job/xenomorph = LARVA_POINTS_SHIPSIDE, @@ -253,8 +267,8 @@ Make the TGMC proud!"}) /datum/outfit/job/command/staffofficer, /datum/outfit/job/command/staffofficer/robot, ) - exp_requirements = XP_REQ_INTERMEDIATE exp_type = EXP_TYPE_REGULAR_ALL + exp_requirements = XP_REQ_EXPERIENCED job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_ISCOMMAND|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS|JOB_FLAG_ALWAYS_VISIBLE_ON_MINIMAP jobworth = list( /datum/job/xenomorph = LARVA_POINTS_SHIPSIDE, @@ -283,15 +297,22 @@ You are in charge of logistics and the overwatch system. You are also in line to return var/mob/living/carbon/human/new_human = new_mob var/playtime_mins = user?.client?.get_exp(title) + new_human.dropItemToGround(new_human.head) if(!playtime_mins || playtime_mins < 1 ) return switch(playtime_mins) if(0 to 1500) // starting new_human.wear_id.paygrade = "O3" + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/marine/staff, SLOT_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/officer_cloak_red, SLOT_BACK) if(1501 to 3000) // 25 hrs new_human.wear_id.paygrade = "O4" + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/highcap/staff, SLOT_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/officer_cloak_red, SLOT_BACK) if(3001 to INFINITY) // 50 hrs new_human.wear_id.paygrade = "O5" + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/highcap/staff, SLOT_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/officer_cloak_red/alt, SLOT_BACK) /datum/job/terragov/command/staffofficer/campaign outfit = /datum/outfit/job/command/staffofficer/campaign @@ -304,11 +325,13 @@ You are in charge of logistics and the overwatch system. You are also in line to id = /obj/item/card/id/silver belt = /obj/item/storage/holster/belt/pistol/m4a3/officer ears = /obj/item/radio/headset/mainship/mcom - w_uniform = /obj/item/clothing/under/marine/officer/bridge - shoes = /obj/item/clothing/shoes/marine/full - head = /obj/item/clothing/head/tgmccap/ro r_store = /obj/item/storage/pouch/general/large l_store = /obj/item/binoculars/tactical + back = FALSE + head = null + w_uniform = /obj/item/clothing/under/marine/whites/blacks + shoes = /obj/item/clothing/shoes/laceup + /datum/outfit/job/command/staffofficer/robot @@ -335,8 +358,8 @@ You are in charge of logistics and the overwatch system. You are also in line to skills_type = /datum/skills/pilot display_order = JOB_DISPLAY_ORDER_PILOT_OFFICER outfit = /datum/outfit/job/command/pilot - exp_requirements = XP_REQ_EXPERT exp_type = EXP_TYPE_REGULAR_ALL + exp_requirements = XP_REQ_EXPERIENCED job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_PROVIDES_SQUAD_HUD jobworth = list( /datum/job/xenomorph = LARVA_POINTS_SHIPSIDE_STRONG, @@ -371,14 +394,12 @@ You are in charge of logistics and the overwatch system. You are also in line to if(6001 to INFINITY) // 100 hrs new_human.wear_id.paygrade = "O2" -/* RUTGMC DELETION /datum/job/terragov/command/pilot/radio_help_message(mob/M) . = ..() to_chat(M, {"Your job is to support marines with either close air support via the Condor, or mobile dropship support with the Tadpole. -While you are in charge of all aerial crafts the Alamo does not require supervision outside of turning automatic mode on or off at crucial times, and you are expected to choose between the Condor and Tadpole. +While you are in charge of all aerial crafts the Normandy does not require supervision outside of turning automatic mode on or off at crucial times, and you are expected to choose between the Condor and Tadpole. Though you are a warrant officer, your authority is limited to the dropship and your chosen aerial craft, where you have authority over the enlisted personnel. "}) -*/ /datum/outfit/job/command/pilot name = PILOT_OFFICER @@ -408,8 +429,8 @@ Though you are a warrant officer, your authority is limited to the dropship and minimal_access = list(ACCESS_MARINE_WO, ACCESS_MARINE_PREP, ACCESS_MARINE_MECH, ACCESS_CIVILIAN_PUBLIC, ACCESS_MARINE_BRIDGE, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_LOGISTICS, ACCESS_MARINE_CARGO) display_order = JOB_DISPLAY_ORDER_MECH_PILOT outfit = /datum/outfit/job/command/mech_pilot - exp_requirements = XP_REQ_EXPERT - exp_type = EXP_TYPE_REGULAR_ALL + exp_type = EXP_TYPE_MARINES + exp_requirements = XP_REQ_EXPERIENCED job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS|JOB_FLAG_ALWAYS_VISIBLE_ON_MINIMAP job_points_needed = 80 jobworth = list( @@ -479,8 +500,8 @@ You can serve your Division in a variety of roles, so choose carefully."}) skills_type = /datum/skills/ce display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER outfit = /datum/outfit/job/engineering/chief - exp_requirements = XP_REQ_EXPERIENCED - exp_type = EXP_TYPE_REGULAR_ALL + exp_type = EXP_TYPE_ENGINEERING + exp_requirements = XP_REQ_INTERMEDIATE job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_ISCOMMAND|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD jobworth = list( /datum/job/xenomorph = LARVA_POINTS_SHIPSIDE, @@ -555,6 +576,8 @@ You are also next in the chain of command, should the bridge crew fall in the li skills_type = /datum/skills/st display_order = JOB_DISPLAY_ORDER_SHIP_TECH outfit = /datum/outfit/job/engineering/tech + exp_type = EXP_TYPE_REGULAR_ALL + exp_requirements = XP_REQ_INTERMEDIATE job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_PROVIDES_SQUAD_HUD jobworth = list( /datum/job/xenomorph = LARVA_POINTS_SHIPSIDE, @@ -631,8 +654,8 @@ requisitions line and later on to be ready to send supplies for marines who are skills_type = /datum/skills/ro display_order = JOB_DISPLAY_ORDER_REQUISITIONS_OFFICER outfit = /datum/outfit/job/requisitions/officer - exp_requirements = XP_REQ_UNSEASONED exp_type = EXP_TYPE_REGULAR_ALL + exp_requirements = XP_REQ_EXPERIENCED job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_ISCOMMAND|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD jobworth = list( /datum/job/xenomorph = LARVA_POINTS_SHIPSIDE, @@ -714,8 +737,8 @@ A happy ship is a well-functioning ship."}) /datum/outfit/job/medical/professor, /datum/outfit/job/medical/professor/robot, ) - exp_requirements = XP_REQ_EXPERIENCED - exp_type = EXP_TYPE_REGULAR_ALL + exp_type = EXP_TYPE_MEDICAL + exp_requirements = XP_REQ_INTERMEDIATE job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_ISCOMMAND|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD jobworth = list( /datum/job/xenomorph = LARVA_POINTS_SHIPSIDE, @@ -800,6 +823,8 @@ Make sure that the doctors and nurses are doing their jobs and keeping the marin /datum/outfit/job/medical/medicalofficer, /datum/outfit/job/medical/medicalofficer/robot, ) + exp_type = EXP_TYPE_REGULAR_ALL + exp_requirements = XP_REQ_INTERMEDIATE job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_PROVIDES_SQUAD_HUD jobworth = list( /datum/job/xenomorph = LARVA_POINTS_SHIPSIDE, @@ -886,6 +911,8 @@ You are also an expert when it comes to medication and treatment. If you do not /datum/outfit/job/medical/researcher, /datum/outfit/job/medical/researcher/robot, ) + exp_type = EXP_TYPE_MEDICAL + exp_requirements = XP_REQ_INTERMEDIATE job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ALLOWS_PREFS_GEAR|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_ALWAYS_VISIBLE_ON_MINIMAP jobworth = list( /datum/job/xenomorph = LARVA_POINTS_SHIPSIDE, @@ -972,6 +999,8 @@ It is also recommended that you gear up like a regular marine, or your 'internsh skills_type = /datum/skills/civilian display_order = JOB_DISPLAY_ORDER_CORPORATE_LIAISON outfit = /datum/outfit/job/civilian/liaison + exp_type = EXP_TYPE_REGULAR_ALL + exp_requirements = XP_REQ_INTERMEDIATE job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_PROVIDES_BANK_ACCOUNT|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_PROVIDES_SQUAD_HUD jobworth = list( /datum/job/xenomorph = LARVA_POINTS_SHIPSIDE, @@ -1044,8 +1073,8 @@ Use your office fax machine to communicate with corporate headquarters or to acq minimal_access = ALL_ACCESS display_order = JOB_DISPLAY_ORDER_SYNTHETIC outfit = /datum/outfit/job/civilian/synthetic - exp_requirements = XP_REQ_EXPERIENCED exp_type = EXP_TYPE_REGULAR_ALL + exp_requirements = XP_REQ_EXPERT job_flags = JOB_FLAG_SPECIALNAME|JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_ADDTOMANIFEST|JOB_FLAG_ISCOMMAND|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS|JOB_FLAG_ALWAYS_VISIBLE_ON_MINIMAP job_points_needed = 40 jobworth = list( @@ -1075,7 +1104,6 @@ Use your office fax machine to communicate with corporate headquarters or to acq return /datum/skills/early_synthetic return ..() -/* RUTGMC DELETION /datum/job/terragov/silicon/synthetic/after_spawn(mob/living/carbon/new_mob, mob/user, latejoin = FALSE) . = ..() if(!ishuman(new_mob)) @@ -1089,9 +1117,22 @@ Use your office fax machine to communicate with corporate headquarters or to acq new_human.wear_id.paygrade = "Mk.I" if(601 to 3000) // 10 to 50 hrs new_human.wear_id.paygrade = "Mk.II" - if(3001 to INFINITY) // more than 50 hrs + if(3001 to 6000) // 50 to 100 hrs new_human.wear_id.paygrade = "Mk.III" -*/ + if(6001 to 9000) // 100 to 150 hrs + new_human.wear_id.paygrade = "Mk.IV" + if(9001 to 12000) // 150 to 200 hrs + new_human.wear_id.paygrade = "Mk.V" + if(12001 to 15000) // 200 to 250 hrs + new_human.wear_id.paygrade = "Mk.VI" + if(15001 to 18000) // 250 to 300 hrs + new_human.wear_id.paygrade = "Mk.VII" + if(18001 to 21000) // 300 to 350 hrs + new_human.wear_id.paygrade = "Mk.VIII" + if(21001 to 60000) // 350 to 1000 hrs + new_human.wear_id.paygrade = "Mk.IX" + if(60001 to INFINITY) // 1000 hrs and more + new_human.wear_id.paygrade = "Mk.X" /datum/job/terragov/silicon/synthetic/radio_help_message(mob/M) . = ..() @@ -1123,7 +1164,7 @@ In addition, being a Synthetic gives you knowledge in every field and specializa supervisors = "your laws and the human crew" exp_requirements = XP_REQ_INTERMEDIATE exp_type = EXP_TYPE_REGULAR_ALL - exp_type_department = EXP_TYPE_SILICON + exp_requirements = XP_REQ_EXPERIENCED display_order = JOB_DISPLAY_ORDER_AI skills_type = /datum/skills/ai job_flags = JOB_FLAG_SPECIALNAME|JOB_FLAG_LATEJOINABLE|JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_OVERRIDELATEJOINSPAWN|JOB_FLAG_ISCOMMAND|JOB_FLAG_BOLD_NAME_ON_SELECTION diff --git a/code/datums/jobs/job/sons_of_mars_shipside.dm b/code/datums/jobs/job/sons_of_mars_shipside.dm index e0145fab067..c52d7adddbf 100644 --- a/code/datums/jobs/job/sons_of_mars_shipside.dm +++ b/code/datums/jobs/job/sons_of_mars_shipside.dm @@ -277,14 +277,12 @@ You are in charge of logistics and the overwatch system. You are also in line to if(30001 to INFINITY) // 500 hrs new_human.wear_id.paygrade = "SOM_W6" -/* RUTGMC DELETION /datum/job/som/command/pilot/radio_help_message(mob/M) . = ..() to_chat(M, {"Your job is to support marines with either close air support via the Condor, or mobile dropship support with the Tadpole. -While you are in charge of all aerial crafts the Alamo does not require supervision outside of turning automatic mode on or off at crucial times, and you are expected to choose between the Condor and Tadpole. +While you are in charge of all aerial crafts the Normandy does not require supervision outside of turning automatic mode on or off at crucial times, and you are expected to choose between the Condor and Tadpole. Though you are a warrant officer, your authority is limited to the dropship and your chosen aerial craft, where you have authority over the enlisted personnel. "}) -*/ /datum/outfit/job/som/command/pilot name = SOM_PILOT_OFFICER diff --git a/code/datums/jobs/job/xenomorph.dm b/code/datums/jobs/job/xenomorph.dm index cd44a5baa6d..98bf3b4551e 100644 --- a/code/datums/jobs/job/xenomorph.dm +++ b/code/datums/jobs/job/xenomorph.dm @@ -61,7 +61,7 @@ supervisors = "Queen mother" selection_color = "#8972AA" display_order = JOB_DISPLAY_ORDER_XENO_QUEEN - exp_requirements = XP_REQ_EXPERIENCED + exp_requirements = XP_REQ_INTERMEDIATE job_flags = JOB_FLAG_ROUNDSTARTJOINABLE|JOB_FLAG_NOHEADSET|JOB_FLAG_OVERRIDELATEJOINSPAWN|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_HIDE_CURRENT_POSITIONS|JOB_FLAG_LOUDER_TTS jobworth = list(/datum/job/survivor/rambo = SURVIVOR_POINTS_REGULAR) html_description = {" @@ -86,3 +86,6 @@ /datum/job/xenomorph/queen/handle_special_preview(client/parent) parent.show_character_previews(image('icons/Xeno/castes/larva.dmi', icon_state = "Larva", dir = SOUTH)) return TRUE + +/datum/job/xenomorph/facehugger + job_flags = JOB_FLAG_NOHEADSET|JOB_FLAG_OVERRIDELATEJOINSPAWN diff --git a/code/datums/jobs/squads.dm b/code/datums/jobs/squads.dm index dec013864a2..0ea83a21482 100644 --- a/code/datums/jobs/squads.dm +++ b/code/datums/jobs/squads.dm @@ -32,6 +32,8 @@ ///Faction of that squad var/faction = FACTION_TERRAGOV + var/list/squad_orbital_beacons = list() + /datum/squad/alpha name = "Alpha" @@ -141,13 +143,6 @@ ) /datum/squad/New(set_color, set_name) - if(set_color) - color = set_color - if(set_name) - name = set_name - - ..() - tracking_id = SSdirection.init_squad(name, squad_leader) for(var/state in GLOB.playable_squad_icons) @@ -159,6 +154,7 @@ var/icon_state = lowertext(name) + "_" + state GLOB.minimap_icons[icon_state] = icon2base64(top) + /datum/squad/Destroy(force, ...) for(var/mob/living/carbon/human/squaddie AS in marines_list) remove_from_squad(squaddie) diff --git a/code/datums/keybinding/communication.dm b/code/datums/keybinding/communication.dm index c5247546b8b..448616366e4 100644 --- a/code/datums/keybinding/communication.dm +++ b/code/datums/keybinding/communication.dm @@ -40,3 +40,51 @@ full_name = "Local OOC(LOOC)" keybind_signal = COMSIG_KB_CLIENT_LOOC_DOWN +/datum/keybinding/client/communication/say/down(client/user) + . = ..() + if(.) + return + winset(user, null, "command=[user.tgui_say_create_open_command(SAY_CHANNEL)]") + return TRUE + +/datum/keybinding/client/communication/radio/down(client/user) + . = ..() + if(.) + return + winset(user, null, "command=[user.tgui_say_create_open_command(RADIO_CHANNEL)]") + return TRUE + +/datum/keybinding/client/communication/ooc/down(client/user) + . = ..() + if(.) + return + winset(user, null, "command=[user.tgui_say_create_open_command(OOC_CHANNEL)]") + return TRUE + +/datum/keybinding/client/communication/me/down(client/user) + . = ..() + if(.) + return + winset(user, null, "command=[user.tgui_say_create_open_command(ME_CHANNEL)]") + return TRUE + +/datum/keybinding/client/communication/xooc/down(client/user) + . = ..() + if(.) + return + winset(user, null, "command=[user.tgui_say_create_open_command(XOOC_CHANNEL)]") + return TRUE + +/datum/keybinding/client/communication/mooc/down(client/user) + . = ..() + if(.) + return + winset(user, null, "command=[user.tgui_say_create_open_command(MOOC_CHANNEL)]") + return TRUE + +/datum/keybinding/client/communication/looc/down(client/user) + . = ..() + if(.) + return + winset(user, null, "command=[user.tgui_say_create_open_command(LOOC_CHANNEL)]") + return TRUE diff --git a/code/datums/keybinding/mob.dm b/code/datums/keybinding/mob.dm index d5719bfc502..7fec8b2caf7 100644 --- a/code/datums/keybinding/mob.dm +++ b/code/datums/keybinding/mob.dm @@ -162,20 +162,12 @@ description = "" keybind_signal = COMSIG_KB_MOB_DROPITEM_DOWN -/* RUTGMC DELETION /datum/keybinding/mob/drop_item/down(client/user) . = ..() if(.) return - var/mob/M = user.mob - var/obj/item/I = M.get_active_held_item() - if(!I) - to_chat(user, span_warning("You have nothing to drop in your hand!")) - else - user.mob.dropItemToGround(I) + user.mob.drop_item_v() return TRUE -*/ - /datum/keybinding/mob/examine hotkey_keys = list("Shift") diff --git a/code/datums/keybinding/xeno.dm b/code/datums/keybinding/xeno.dm index 249a1715554..d6489299253 100644 --- a/code/datums/keybinding/xeno.dm +++ b/code/datums/keybinding/xeno.dm @@ -285,7 +285,7 @@ full_name = "Carrier: Place Trap" description = "" keybind_signal = COMSIG_XENOABILITY_PLACE_TRAP - hotkey_keys = list("Q") + hotkey_keys = list("G") /datum/keybinding/xeno/spawn_hugger name = "spawn_hugger" @@ -329,12 +329,20 @@ hotkey_keys = list("Q") /datum/keybinding/xeno/cresttoss - name = "cresttoss" - full_name = "Crusher: Crest Toss" + name = "cresttoss_away" + full_name = "Crusher: Crest Toss Away" + description = "Fling an adjacent target away from you." description = "" keybind_signal = COMSIG_XENOABILITY_CRESTTOSS hotkey_keys = list("E") +/datum/keybinding/xeno/cresttoss_behind + name = "cresttoss_behind" + full_name = "Crusher: Crest Toss Behind" + description = "Fling an adjacent target behind you." + keybind_signal = COMSIG_XENOABILITY_CRESTTOSS_BEHIND + hotkey_keys = list("R") + /datum/keybinding/xeno/advance name = "advance" full_name = "Crusher: Rapid Advance" @@ -1159,3 +1167,144 @@ RU TGMC EDIT PUPPETEER REMOVAL*/ full_name = "Behemoth: Primal Wrath" description = "Unleash your wrath. Enhances your abilities, changing their functionality and allowing them to apply a damage over time debuff." keybind_signal = COMSIG_XENOABILITY_PRIMAL_WRATH + +/datum/keybinding/xeno/tearing_tail + name = "Tearing Tail" + full_name = "Panther: Tearing Tail" + description = "Hit all adjacent units around you, poisoning them toxin for their mind." + keybind_signal = COMSIG_XENOABILITY_TEARING_TAIL + hotkey_keys = list("R") + +/datum/keybinding/xeno/panther_pounce + name = "panther_pounce" + full_name = "Panther: Pounce" + description = "" + keybind_signal = COMSIG_XENOABILITY_PANTHER_POUNCE + hotkey_keys = list("E") + +/datum/keybinding/xeno/adrenaline_jump + name = "Adrenaline Jump" + full_name = "Panther: Adrenaline Jump" + description = "Jump from some distance to target, knocking them down." + keybind_signal = COMSIG_XENOABILITY_ADRENALINE_JUMP + hotkey_keys = list("F") + +/datum/keybinding/xeno/evasive_maneuvers + name = "Toggle evasive maneuvers" + full_name = "Panther: Evasive Maneuvers" + description = "Toggle evasive action, forcing non-friendly projectiles that would hit you to miss." + keybind_signal = COMSIG_XENOABILITY_EVASIVE_MANEUVERS + hotkey_keys = list("Q") + +/datum/keybinding/xeno/adrenaline_rush + name = "Adrenaline rush" + full_name = "Panther: Adrenaline Rush" + description = "Move faster." + keybind_signal = COMSIG_XENOABILITY_ADRENALINE_RUSH + hotkey_keys = list("V") + +/datum/keybinding/xeno/panther_select_reagent + name = "Select Reagent" + full_name = "Panther: Select Reagent" + description = "Cycles through reagents to choose one for Defiler abilities." + keybind_signal = COMSIG_XENOABILITY_PANTHER_SELECT_REAGENT + hotkey_keys = list("V") + +/datum/keybinding/xeno/dump_acid + name = "dump_acid" + full_name = "Boiler: Dump Acid" + description = "" + keybind_signal = COMSIG_XENOABILITY_DUMP_ACID + hotkey_keys = list("Q") + +/datum/keybinding/xeno/psychic_grab + name = "psychic_grab" + full_name = "Shrike: Psychic Grab" + description = "" + keybind_signal = COMSIG_XENOABILITY_PSYCHIC_GRAB + hotkey_keys = list("X") + +/datum/keybinding/xeno/plasma_screech + name = "plasma_screech" + full_name = "Queen: Plasma Screech" + description = "Screech that increases plasma regeneration for nearby xenos." + keybind_signal = COMSIG_XENOABILITY_PLASMA_SCREECH + +/datum/keybinding/xeno/frenzy_screech + name = "frenzy_screech" + full_name = "Queen: Frenzy Screech" + description = "Screech that increases damage for nearby xenos." + keybind_signal = COMSIG_XENOABILITY_FRENZY_SCREECH + +/datum/keybinding/xeno/phantom + name = "phantom" + full_name = "Chimera: Phantom" + description = "Create a physical clone and hide in shadows." + keybind_signal = COMSIG_XENOABILITY_CHIMERA_PHANTOM + hotkey_keys = list("R") + +/datum/keybinding/xeno/abduction + name = "abduction" + full_name = "Chimera: Abduction" + description = "Abduct the prey." + keybind_signal = COMSIG_XENOABILITY_CHIMERA_ABDUCTION + hotkey_keys = list("Q") + +/datum/keybinding/xeno/chimera_blink + name = "chimera_blink" + full_name = "Chimera: Blink" + description = "Teleport to a space a short distance away within line of sight. Can teleport mobs you're dragging with you at the cost of higher cooldown." + keybind_signal = COMSIG_XENOABILITY_CHIMERA_BLINK + hotkey_keys = list("E") + +/datum/keybinding/xeno/warp_blast + name = "warp_blast" + full_name = "Chimera: Warp Blast" + description = "Create a pure force explosion that damages and knockbacks targets around." + keybind_signal = COMSIG_XENOABILITY_CHIMERA_WARP_BLAST + hotkey_keys = list("F") + +/datum/keybinding/xeno/bodyswap + name = "bodyswap" + full_name = "Chimera: Bodyswap" + description = "Swap places with another alien." + keybind_signal = COMSIG_XENOABILITY_CHIMERA_BODYSWAP + hotkey_keys = list("X") + +/datum/keybinding/xeno/crippling_strike + name = "crippling_strike" + full_name = "Chimera: Crippling Strike" + description = "Toggle on to enable crippling attacks" + keybind_signal = COMSIG_XENOABILITY_CHIMERA_CRIPPLING_STRIKE + +/datum/keybinding/xeno/hugger_pounce + name = "hugger_pounce" + full_name = "Facehugger: Pounce" + description = "Leap at your target and knock them down, if you jump close you will hug the target." + keybind_signal = COMSING_XENOABILITY_HUGGER_POUNCE + hotkey_keys = list("E") + +/datum/keybinding/xeno/roar + name = "Roar" + full_name = "Predalien: Roar" + description = "Give bonuses to teamates and deactivate hitech utilities." + keybind_signal = COMSIG_XENOABILITY_ROAR + +/datum/keybinding/xeno/smash + name = "Smash" + full_name = "Predalien: Smash" + description = "Stomp and stun your enemies." + keybind_signal = COMSIG_XENOABILITY_SMASH + +/datum/keybinding/xeno/devastate + name = "Devastate" + full_name = "Predalien: Devastate" + description = "Rip enemy gut." + keybind_signal = COMSIG_XENOABILITY_DEVASTATE + +/datum/keybinding/xeno/short_spray_acid + name = "short_spray_acid" + full_name = "Praetorian: Short Acid Spray" + description = "Sprays some acid" + keybind_signal = COMSIG_XENOABILITY_SHORT_SPRAY_ACID + hotkey_keys = list("E") diff --git a/code/datums/loadout/item_representation/_item_representation.dm b/code/datums/loadout/item_representation/_item_representation.dm index cfad25fc228..6848a183c6f 100644 --- a/code/datums/loadout/item_representation/_item_representation.dm +++ b/code/datums/loadout/item_representation/_item_representation.dm @@ -12,6 +12,8 @@ var/variant /// If it's allowed to bypass the vendor check var/bypass_vendor_check = FALSE + ///If the item has hair concealing changed, save it. + var/hair_concealing_option /datum/item_representation/New(obj/item/item_to_copy) if(!item_to_copy) @@ -25,6 +27,9 @@ variant = key break + if(item_to_copy.current_hair_concealment && item_to_copy.colorable_allowed & HAIR_CONCEALING_CHANGE_ALLOWED) + hair_concealing_option = item_to_copy.current_hair_concealment + if(!item_to_copy.greyscale_config) return colors = item_to_copy.greyscale_colors @@ -51,6 +56,9 @@ if(item.current_variant && item.colorable_allowed & ICON_STATE_VARIANTS_ALLOWED) item.current_variant = GLOB.loadout_variant_keys[variant] item.update_icon() + if(item.colorable_allowed & HAIR_CONCEALING_CHANGE_ALLOWED) + item.current_hair_concealment = hair_concealing_option + item.switch_hair_concealment_flags(user) return item /** diff --git a/code/datums/loadout/loadout_manager.dm b/code/datums/loadout/loadout_manager.dm index cc855ce1ede..e1c06ec38f4 100644 --- a/code/datums/loadout/loadout_manager.dm +++ b/code/datums/loadout/loadout_manager.dm @@ -159,8 +159,6 @@ . = ..() user.client?.prefs.save_loadout_list(loadouts_data, CURRENT_LOADOUT_VERSION) -/* RUTGMC DELETION, CAPES -///Recursive function to update attachment lists. /datum/loadout_manager/proc/update_attachments(list/datum/item_representation/armor_module/attachments, version) for(var/datum/item_representation/armor_module/module AS in attachments) if(version < 13) @@ -177,7 +175,7 @@ attachments.Add(new_module) if(version < 14) if(ispath(module.item_type, /obj/item/armor_module/armor/cape)) - module.variant = NORMAL + module.variant = CAPE_LONG if(module.item_type == /obj/item/armor_module/armor/cape/kama) module.variant = CAPE_KAMA else if(module.item_type != /obj/item/armor_module/armor/cape) @@ -185,15 +183,6 @@ new_cape.item_type = /obj/item/armor_module/armor/cape new_cape.attachments = module.attachments new_cape.colors = module.colors - switch(module.item_type) - if(/obj/item/armor_module/armor/cape/half) - new_cape.variant = CAPE_HALF - if(/obj/item/armor_module/armor/cape/scarf) - new_cape.variant = CAPE_SCARF - if(/obj/item/armor_module/armor/cape/short) - new_cape.variant = CAPE_SHORT - if(/obj/item/armor_module/armor/cape/short/classic) - new_cape.variant = CAPE_SHORT_OLD attachments.Remove(module) attachments.Add(new_cape) if(ispath(module.item_type, /obj/item/armor_module/armor/cape_highlight)) @@ -206,11 +195,6 @@ new_highlight.attachments = module.attachments new_highlight.colors = module.colors new_highlight.variant = CAPE_HIGHLIGHT_NONE - switch(module.item_type) - if(/obj/item/armor_module/armor/cape_highlight/half) - new_highlight.variant = CAPE_HALF - if(/obj/item/armor_module/armor/cape_highlight/scarf) - new_highlight.variant = CAPE_SCARF attachments.Remove(module) attachments.Add(new_highlight) if(ispath(module.item_type, /obj/item/armor_module/armor/visor/marine/eva/skull)) @@ -222,7 +206,6 @@ new_glyph.item_type = /obj/item/armor_module/armor/visor_glyph/old module.attachments.Add(new_glyph) update_attachments(module.attachments, version) -*/ ///Modifies a legacy loadout to make it valid for the current loadout version /datum/loadout_manager/proc/legacy_version_fix(datum/loadout/loadout, loadout_name, loadout_job, datum/tgui/ui) diff --git a/modular_RUtgmc/code/datums/looping_sounds/miscellaneous.dm b/code/datums/looping_sounds/miscellaneous.dm similarity index 100% rename from modular_RUtgmc/code/datums/looping_sounds/miscellaneous.dm rename to code/datums/looping_sounds/miscellaneous.dm diff --git a/code/datums/namepool.dm b/code/datums/namepool.dm index 20f422009ef..03cccdd5774 100644 --- a/code/datums/namepool.dm +++ b/code/datums/namepool.dm @@ -47,6 +47,9 @@ GLOBAL_LIST_EMPTY_TYPED(operation_namepool, /datum/operation_namepool) /datum/namepool/sectoid/get_random_name() return "Sectoid [rand(1,9)]X[ascii2text(rand(65, 87))]" //65 to 87 is (uppercase) A to W +/datum/namepool/necoarc/get_random_name() + return "Neco Arc [rand(1,9)]X[ascii2text(rand(65, 87))]" //65 to 87 is (uppercase) A to W + /datum/namepool/vatborn/ firstname_male_pool = "names/first_male" firstname_female_pool = "names/first_female" diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index 4468122b114..c209d5101e6 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -106,13 +106,15 @@ // Shuttles start here: /datum/map_template/shuttle/dropship_one - shuttle_id = SHUTTLE_ALAMO - name = "Alamo" - -/datum/map_template/shuttle/dropship_two + prefix = "_maps/~RUTGMC/shuttles/" shuttle_id = SHUTTLE_NORMANDY name = "Normandy" +/datum/map_template/shuttle/dropship_two + prefix = "_maps/~RUTGMC/shuttles/" + shuttle_id = SHUTTLE_ALAMO + name = "Alamo" + /datum/map_template/shuttle/cas shuttle_id = SHUTTLE_CAS name = "Condor Jet" @@ -174,7 +176,7 @@ shuttle_id = SHUTTLE_DISTRESS_UPP name = "Distress UPP" -/datum/map_template/shuttle/small_ert/ufo +/datum/map_template/shuttle/small_ert/ufo shuttle_id = SHUTTLE_DISTRESS_UFO name = "Small UFO" diff --git a/code/datums/skills.dm b/code/datums/skills.dm index be7d9ad26c1..de0aacadccd 100644 --- a/code/datums/skills.dm +++ b/code/datums/skills.dm @@ -391,6 +391,7 @@ engineer, construction, leadership, medical, surgery, pilot, police, powerloader powerloader = SKILL_POWERLOADER_MASTER firearms = SKILL_FIREARMS_TRAINED smartgun = SKILL_SMART_TRAINED + swordplay = SKILL_SWORDPLAY_TRAINED /datum/skills/fo @@ -403,6 +404,8 @@ engineer, construction, leadership, medical, surgery, pilot, police, powerloader police = SKILL_POLICE_MP powerloader = SKILL_POWERLOADER_TRAINED cqc = SKILL_CQC_TRAINED + swordplay = SKILL_SWORDPLAY_TRAINED + smartgun = SKILL_SMART_TRAINED /datum/skills/so name = STAFF_OFFICER @@ -411,6 +414,7 @@ engineer, construction, leadership, medical, surgery, pilot, police, powerloader medical = SKILL_MEDICAL_PRACTICED surgery = SKILL_SURGERY_AMATEUR police = SKILL_POLICE_MP + swordplay = SKILL_SWORDPLAY_TRAINED /datum/skills/pilot name = PILOT_OFFICER @@ -466,6 +470,7 @@ engineer, construction, leadership, medical, surgery, pilot, police, powerloader construction = SKILL_CONSTRUCTION_METAL engineer = SKILL_ENGINEER_METAL police = SKILL_POLICE_MP + swordplay = SKILL_SWORDPLAY_TRAINED /datum/skills/sl name = SQUAD_LEADER @@ -475,6 +480,7 @@ engineer, construction, leadership, medical, surgery, pilot, police, powerloader leadership = SKILL_LEAD_EXPERT medical = SKILL_MEDICAL_NOVICE surgery = SKILL_SURGERY_AMATEUR + swordplay = SKILL_SWORDPLAY_TRAINED /datum/skills/sl/clf name = "CLF leader" @@ -570,6 +576,7 @@ engineer, construction, leadership, medical, surgery, pilot, police, powerloader rifles = SKILL_RIFLES_TRAINED shotguns = SKILL_SHOTGUNS_TRAINED heavy_weapons = SKILL_HEAVY_WEAPONS_TRAINED + swordplay = SKILL_SWORDPLAY_TRAINED /datum/skills/commando/medic name = "Commando Medic" @@ -595,6 +602,7 @@ engineer, construction, leadership, medical, surgery, pilot, police, powerloader rifles = SKILL_RIFLES_TRAINED shotguns = SKILL_SHOTGUNS_TRAINED heavy_weapons = SKILL_HEAVY_WEAPONS_TRAINED + swordplay = SKILL_SWORDPLAY_TRAINED /datum/skills/admiral name = "Admiral" @@ -604,6 +612,7 @@ engineer, construction, leadership, medical, surgery, pilot, police, powerloader surgery = SKILL_SURGERY_AMATEUR police = SKILL_POLICE_FLASH powerloader = SKILL_POWERLOADER_TRAINED + swordplay = SKILL_SWORDPLAY_TRAINED /datum/skills/spatial_agent name = "Spatial Agent" @@ -625,6 +634,7 @@ engineer, construction, leadership, medical, surgery, pilot, police, powerloader police = SKILL_POLICE_MP powerloader = SKILL_POWERLOADER_MASTER large_vehicle = SKILL_LARGE_VEHICLE_TRAINED + swordplay = SKILL_SWORDPLAY_TRAINED /* Deathsquad */ /datum/skills/deathsquad @@ -690,6 +700,7 @@ engineer, construction, leadership, medical, surgery, pilot, police, powerloader heavy_weapons = SKILL_HEAVY_WEAPONS_TRAINED smartgun = SKILL_SMART_USE // can use smartgun + swordplay = SKILL_SWORDPLAY_TRAINED // higher SL skills engineer = SKILL_ENGINEER_ENGI @@ -716,6 +727,7 @@ engineer, construction, leadership, medical, surgery, pilot, police, powerloader smgs = SKILL_SMGS_TRAINED heavy_weapons = SKILL_HEAVY_WEAPONS_TRAINED smartgun = SKILL_SMART_TRAINED + swordplay = SKILL_SWORDPLAY_TRAINED //endurance = 0 - does nothing engineer = SKILL_ENGINEER_PLASTEEL @@ -764,3 +776,18 @@ engineer, construction, leadership, medical, surgery, pilot, police, powerloader name = "Skeleton" cqc = SKILL_CQC_TRAINED melee_weapons = SKILL_MELEE_TRAINED + +/datum/skills/yautja/warrior + name = "Yautja Warrior" + + engineer = SKILL_ENGINEER_ENGI + construction = SKILL_CONSTRUCTION_MASTER + firearms = SKILL_FIREARMS_TRAINED + medical = SKILL_MEDICAL_MASTER + cqc = SKILL_CQC_MASTER + surgery = SKILL_SURGERY_EXPERT + melee_weapons = SKILL_MELEE_SUPER + pistols = SKILL_PISTOLS_TRAINED + rifles = SKILL_RIFLES_TRAINED + police = SKILL_POLICE_MP + swordplay = SKILL_SWORDPLAY_TRAINED diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index c4587bf9e58..4a024481fd6 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -31,6 +31,22 @@ REMOVE_TRAIT(owner, TRAIT_STAGGERED, TRAIT_STATUS_EFFECT(id)) owner.adjust_mob_scatter(-5) +//OFFGUARD SLOWDOWN +/datum/status_effect/incapacitating/offguard_slowdown + id = "offguard_slow" + status_type = STATUS_EFFECT_REPLACE + var/off_guard_slowdown = 9 + +/datum/status_effect/incapacitating/offguard_slowdown/on_apply() + . = ..() + if(!.) + return + owner.add_movespeed_modifier(MOVESPEED_ID_OFF_GUARD_SLOWDOWN, TRUE, 0, NONE, TRUE, off_guard_slowdown) + +/datum/status_effect/incapacitating/offguard_slowdown/on_remove() + owner.remove_movespeed_modifier(MOVESPEED_ID_OFF_GUARD_SLOWDOWN) + return ..() + //STUN /datum/status_effect/incapacitating/stun id = "stun" diff --git a/code/datums/status_effects/xeno_buffs.dm b/code/datums/status_effects/xeno_buffs.dm index cfa6d290f99..45ee88b8ce2 100644 --- a/code/datums/status_effects/xeno_buffs.dm +++ b/code/datums/status_effects/xeno_buffs.dm @@ -619,15 +619,48 @@ owner.remove_filter(list("[id]1", "[id]2")) /datum/status_effect/xeno_feast/tick() + . = ..() var/mob/living/carbon/xenomorph/X = owner - if(X.plasma_stored < plasma_drain) - to_chat(X, span_notice("Our feast has come to an end...")) - X.remove_status_effect(STATUS_EFFECT_XENO_FEAST) + if(!X) return var/heal_amount = X.maxHealth*0.08 - HEAL_XENO_DAMAGE(X, heal_amount, FALSE) - adjustOverheal(X, heal_amount / 2) - X.use_plasma(plasma_drain) + for(var/mob/living/carbon/xenomorph/target_xeno AS in cheap_get_xenos_near(X, 4)) + if(target_xeno == X) + continue + if(target_xeno.faction != X.faction) + continue + HEAL_XENO_DAMAGE(target_xeno, heal_amount, FALSE) + adjustOverheal(target_xeno, heal_amount / 2) + new /obj/effect/temp_visual/healing(get_turf(target_xeno)) + + +// *************************************** +// *********** FRENZY SCREECH +// *************************************** +/datum/status_effect/frenzy_screech + id = "frenzy_screech" + status_type = STATUS_EFFECT_REFRESH + var/mob/living/carbon/xenomorph/buff_owner + var/modifier + +/datum/status_effect/frenzy_screech/on_creation(mob/living/new_owner, set_duration, damage_modifier) + duration = set_duration + owner = new_owner + modifier = damage_modifier + return ..() + +/datum/status_effect/frenzy_screech/on_apply() + if(!isxeno(owner)) + return FALSE + buff_owner = owner + buff_owner.xeno_melee_damage_modifier += modifier + owner.add_filter("frenzy_screech_outline", 3, outline_filter(1, COLOR_VIVID_RED)) + return TRUE + +/datum/status_effect/frenzy_screech/on_remove() + buff_owner.xeno_melee_damage_modifier -= modifier + owner.remove_filter("frenzy_screech_outline") + return ..() // *************************************** // *********** Plasma Fruit buff @@ -826,6 +859,59 @@ scale = 0.6 rotation = 0 spin = 0 + + +// *************************************** +// *********** Buff +// *************************************** +/atom/movable/screen/alert/status_effect/xeno_buff + name = "Empowered" + desc = "Your damage ands speed boosted for short time period." + +/datum/status_effect/xeno_buff + id = "buff" + duration = -1 + status_type = STATUS_EFFECT_MULTIPLE + alert_type = /atom/movable/screen/alert/status_effect/xeno_buff + + var/bonus_damage = 0 + var/bonus_speed = 0 + +/datum/status_effect/xeno_buff/on_creation(atom/A, mob/from = null, ttl = 35, bonus_damage = 0, bonus_speed = 0) + if(!isxeno(A)) + qdel(src) + return + + . = ..() + + to_chat(A, span_xenonotice("You feel empowered")) + + var/mob/living/carbon/xenomorph/X = A + X.melee_damage += bonus_damage + + X.xeno_caste.speed -= bonus_speed + + src.bonus_damage = bonus_damage + src.bonus_speed = bonus_speed + + + X.add_filter("overbonus_vis", 1, outline_filter(4 * (bonus_damage / 50), "#cf0b0b60")); \ + + addtimer(CALLBACK(src, PROC_REF(end_bonuses)), ttl) + +/datum/status_effect/xeno_buff/proc/end_bonuses() + if(owner) + to_chat(owner, span_xenonotice("You no longer feel empowered")) + var/mob/living/carbon/xenomorph/X = owner + X.melee_damage -= bonus_damage + + X.xeno_caste.speed += bonus_speed + + X.remove_filter("overbonus_vis"); + + qdel(src) + + /* RU TGMC EDIT // *************************************** // *********** Blessings diff --git a/modular_RUtgmc/icons/mob/modular/capes_highlight.dmi b/icons/mob/modular/capes_highlight_saro.dmi similarity index 100% rename from modular_RUtgmc/icons/mob/modular/capes_highlight.dmi rename to icons/mob/modular/capes_highlight_saro.dmi diff --git a/modular_RUtgmc/icons/mob/modular/capes.dmi b/icons/mob/modular/capes_saro.dmi similarity index 100% rename from modular_RUtgmc/icons/mob/modular/capes.dmi rename to icons/mob/modular/capes_saro.dmi diff --git a/modular_RUtgmc/icons/mob/modular/xenonauten.dmi b/icons/mob/modular/xenonauten_mk1.dmi similarity index 100% rename from modular_RUtgmc/icons/mob/modular/xenonauten.dmi rename to icons/mob/modular/xenonauten_mk1.dmi diff --git a/modular_RUtgmc/code/datums/components/attachment_handler.dm b/modular_RUtgmc/code/datums/components/attachment_handler.dm deleted file mode 100644 index c1db6551102..00000000000 --- a/modular_RUtgmc/code/datums/components/attachment_handler.dm +++ /dev/null @@ -1,2 +0,0 @@ -/datum/component/attachment_handler/apply_custom(datum/source, mutable_appearance/standing) - . = ..() diff --git a/modular_RUtgmc/code/datums/components/overlay_lighting.dm b/modular_RUtgmc/code/datums/components/overlay_lighting.dm deleted file mode 100644 index d937efb2c42..00000000000 --- a/modular_RUtgmc/code/datums/components/overlay_lighting.dm +++ /dev/null @@ -1,61 +0,0 @@ -#define LIGHTING_ON (1<<0) // ума не приложу почему он не видит такой же дефайн от файла который оверрайдят - -/datum/component/overlay_lighting - - var/static/list/light_overlays = list( - "32" = 'icons/effects/light_overlays/light_32.dmi', - "64" = 'icons/effects/light_overlays/light_64.dmi', - "96" = 'icons/effects/light_overlays/light_96.dmi', - "128" = 'icons/effects/light_overlays/light_128.dmi', - "160" = 'icons/effects/light_overlays/light_160.dmi', - "192" = 'icons/effects/light_overlays/light_192.dmi', - "224" = 'icons/effects/light_overlays/light_224.dmi', - "256" = 'icons/effects/light_overlays/light_256.dmi', - "288" = 'icons/effects/light_overlays/light_288.dmi', - "320" = 'icons/effects/light_overlays/light_320.dmi', - "352" = 'icons/effects/light_overlays/light_352.dmi', - "384" = 'icons/effects/light_overlays/light_384.dmi', - "416" = 'icons/effects/light_overlays/light_416.dmi', - "448" = 'icons/effects/light_overlays/light_448.dmi', - "480" = 'icons/effects/light_overlays/light_480.dmi', - "512" = 'icons/effects/light_overlays/light_512.dmi', - "544" = 'icons/effects/light_overlays/light_544.dmi', - "576" = 'icons/effects/light_overlays/light_576.dmi', - "608" = 'icons/effects/light_overlays/light_608.dmi', - "640" = 'icons/effects/light_overlays/light_640.dmi', - "672" = 'icons/effects/light_overlays/light_672.dmi', - "704" = 'icons/effects/light_overlays/light_704.dmi', - "736" = 'icons/effects/light_overlays/light_736.dmi', - "768" = 'icons/effects/light_overlays/light_768.dmi', - "800" = 'icons/effects/light_overlays/light_800.dmi', - "832" = 'icons/effects/light_overlays/light_832.dmi', - "864" = 'icons/effects/light_overlays/light_864.dmi', - "896" = 'icons/effects/light_overlays/light_896.dmi', - "928" = 'icons/effects/light_overlays/light_928.dmi', - ) - -/datum/component/overlay_lighting/proc/set_range(atom/source, new_range) - SIGNAL_HANDLER - if(range == new_range) - return - if(range == 0) - turn_off() - range = clamp(CEILING(new_range, 0.5), 1, 15) - var/pixel_bounds = ((range - 1) * 64) + 32 - lumcount_range = CEILING(range, 1) - if(current_holder && overlay_lighting_flags & LIGHTING_ON) - current_holder.underlays -= visible_mask - visible_mask.icon = light_overlays["[pixel_bounds]"] - if(pixel_bounds == 32) - visible_mask.transform = null - return - var/offset = (pixel_bounds - 32) * 0.5 - var/matrix/transform = new - transform.Translate(-offset, -offset) - visible_mask.transform = transform - if(current_holder && overlay_lighting_flags & LIGHTING_ON) - current_holder.underlays += visible_mask - if(overlay_lighting_flags & LIGHTING_ON) - make_luminosity_update() - -#undef LIGHTING_ON diff --git a/modular_RUtgmc/code/datums/elements/shrapnel_removal.dm b/modular_RUtgmc/code/datums/elements/shrapnel_removal.dm deleted file mode 100644 index 8363305051c..00000000000 --- a/modular_RUtgmc/code/datums/elements/shrapnel_removal.dm +++ /dev/null @@ -1,80 +0,0 @@ -/datum/element/shrapnel_removal - element_flags = ELEMENT_BESPOKE - argument_hash_start_idx = 2 - ///Channel time per shrap removal - var/do_after_time - ///Fumble time for unskilled users - var/fumble_duration - ///Additional damage for removing something with improvised tools - var/additional_damage - -/datum/element/shrapnel_removal/Attach(datum/target, duration, fumble_time, damage) - . = ..() - if(!isitem(target) || (duration < 1)) - return ELEMENT_INCOMPATIBLE - do_after_time = duration - fumble_duration = fumble_time ? fumble_time : do_after_time - additional_damage = damage ? damage : 5 - RegisterSignal(target, COMSIG_ITEM_ATTACK, PROC_REF(on_attack)) - -/datum/element/shrapnel_removal/Detach(datum/source, force) - . = ..() - UnregisterSignal(source, COMSIG_ITEM_ATTACK) - -/datum/element/shrapnel_removal/proc/on_attack(datum/source, mob/living/M, mob/living/user) - SIGNAL_HANDLER - if(user.a_intent != INTENT_HELP) - return - INVOKE_ASYNC(src, PROC_REF(attempt_remove), source, M, user) - return COMPONENT_ITEM_NO_ATTACK - -/datum/element/shrapnel_removal/proc/attempt_remove(obj/item/removaltool, mob/living/M, mob/living/user) - if(!ishuman(M)) - M.balloon_alert(user, "You only know how to remove shrapnel from humans!") - return - var/mob/living/carbon/human/target = M - var/datum/limb/targetlimb = user.client.prefs.toggles_gameplay & RADIAL_MEDICAL ? radial_medical(target, user) : target.get_limb(user.zone_selected) - if(!targetlimb) //radial_medical can return null - return - if(!has_shrapnel(targetlimb)) - M.balloon_alert(user, "There is nothing in limb!") - return - var/skill = user.skills.getRating(SKILL_MEDICAL) - if(skill < SKILL_MEDICAL_PRACTICED) - user.visible_message(span_notice("[user] fumbles around with the [removaltool]."), - span_notice("You fumble around figuring out how to use [removaltool].")) - if(!do_after(user, fumble_duration * (SKILL_MEDICAL_PRACTICED - skill), NONE, target, BUSY_ICON_UNSKILLED)) - return - user.visible_message(span_notice("[user] starts searching for shrapnel in [target] with the [removaltool]."), span_notice("You start searching for shrapnel in [target] with the [removaltool].")) - if(!do_after(user, do_after_time, NONE, target, BUSY_ICON_MEDICAL)) - to_chat(user, span_notice("You stop searching for shrapnel in [target]")) - return - remove_shrapnel(user, target, targetlimb, skill) - //iterates over the rest of the patient's limbs, attempting to remove shrapnel - for(targetlimb AS in target.limbs) - while(has_shrapnel(targetlimb)) - if(!do_after(user, do_after_time, NONE, target, BUSY_ICON_MEDICAL)) - to_chat(user, span_notice("You stop searching for shrapnel in [target]")) - return - remove_shrapnel(user, target, targetlimb, skill) - to_chat(user, span_notice("You remove the last of the shrapnel from [target]")) - -///returns TRUE if the argument limb has any shrapnel in it -/datum/element/shrapnel_removal/proc/has_shrapnel(datum/limb/targetlimb) - for (var/obj/item/I in targetlimb.implants) - if(!is_type_in_list(I, GLOB.known_implants)) - return TRUE - return FALSE - -/datum/element/shrapnel_removal/proc/remove_shrapnel(mob/living/user, mob/living/target, datum/limb/targetlimb, skill) - for(var/obj/item/I AS in targetlimb.implants) - if(is_type_in_list(I, GLOB.known_implants)) - continue - I.unembed_ourself(FALSE) - if(skill < SKILL_MEDICAL_PRACTICED) - user.visible_message(span_notice("[user] violently rips out [I] from [target]!"), span_notice("You violently rip out [I] from [target]!")) - targetlimb.take_damage_limb(5 + additional_damage * (SKILL_MEDICAL_PRACTICED - skill), 0, FALSE, FALSE) - else - user.visible_message(span_notice("[user] pulls out [I] from [target]!"), span_notice("You pull out [I] from [target]!")) - targetlimb.take_damage_limb(rand(3, 7), 0, FALSE, FALSE) - break diff --git a/modular_RUtgmc/code/datums/gamemodes/_game_mode.dm b/modular_RUtgmc/code/datums/gamemodes/_game_mode.dm deleted file mode 100644 index e8b121c9550..00000000000 --- a/modular_RUtgmc/code/datums/gamemodes/_game_mode.dm +++ /dev/null @@ -1,143 +0,0 @@ -/datum/game_mode - var/list/predators = list() - - var/pred_current_num = 0 //How many are there now? - var/pred_per_players = 20 //Preds per player - var/pred_start_count = 0 //The initial count of predators - - var/pred_additional_max = 0 - var/pred_leader_count = 0 //How many Leader preds are active - var/pred_leader_max = 1 //How many Leader preds are permitted. Currently fixed to 1. May add admin verb to adjust this later. - var/quickbuild_points_flags = NONE - - blacklist_ground_maps = list(MAP_DELTA_STATION, MAP_WHISKEY_OUTPOST, MAP_OSCAR_OUTPOST, MAP_FORT_PHOBOS) - -/datum/game_mode/post_setup() - if(flags_round_type & MODE_SILO_RESPAWN) - var/datum/hive_status/normal/HN = GLOB.hive_datums[XENO_HIVE_NORMAL] - HN.RegisterSignals(SSdcs, list(COMSIG_GLOB_OPEN_TIMED_SHUTTERS_LATE, COMSIG_GLOB_OPEN_SHUTTERS_EARLY), TYPE_PROC_REF(/datum/hive_status/normal, set_siloless_collapse_timer)) - return ..() - -/// called to check for updates that might require starting/stopping the siloless collapse timer -/datum/game_mode/proc/update_silo_death_timer(datum/hive_status/silo_owner) - return - -///starts the timer to end the round when no silo is left -/datum/game_mode/proc/get_siloless_collapse_countdown() - return - -///Add gamemode related items to statpanel -/datum/game_mode/get_status_tab_items(datum/dcs, mob/source, list/items) - . = ..() - if(isobserver(source)) - var/siloless_countdown = SSticker.mode.get_siloless_collapse_countdown() - if(siloless_countdown) - items +="Silo less hive collapse timer: [siloless_countdown]" - else if(isxeno(source)) - var/mob/living/carbon/xenomorph/xeno_source = source - if(xeno_source.hivenumber == XENO_HIVE_NORMAL) - var/siloless_countdown = SSticker.mode.get_siloless_collapse_countdown() - if(siloless_countdown) - items +="Silo less hive collapse timer: [siloless_countdown]" - -/datum/game_mode/proc/predator_round() - switch(CONFIG_GET(number/pred_round)) - if(0) - return - if(1) - if(!prob(CONFIG_GET(number/pred_round_chance))) - return - - var/datum/job/PJ = SSjob.GetJobType(/datum/job/predator) - var/new_pred_max = min(max(round(length(GLOB.clients) * PREDATOR_TO_TOTAL_SPAWN_RATIO), 1), 4) - PJ.total_positions = new_pred_max - PJ.max_positions = new_pred_max - flags_round_type |= MODE_PREDATOR - -/datum/game_mode/proc/initialize_predator(mob/living/carbon/human/new_predator, client/player, ignore_pred_num = FALSE) - predators[lowertext(player.ckey)] = list("Name" = new_predator.real_name, "Status" = "Alive") - if(!ignore_pred_num) - pred_current_num++ - -/datum/game_mode/proc/get_whitelisted_predators(readied = 1) - // Assemble a list of active players who are whitelisted. - var/players[] = new - - var/mob/new_player/new_pred - for(var/mob/player in GLOB.player_list) - if(!player.client) continue //No client. DCed. - if(isyautja(player)) continue //Already a predator. Might be dead, who knows. - if(readied) //Ready check for new players. - new_pred = player - if(!istype(new_pred)) continue //Have to be a new player here. - if(!new_pred.ready) continue //Have to be ready. - else - if(!istype(player,/mob/dead)) continue //Otherwise we just want to grab the ghosts. - - if(GLOB.roles_whitelist[player.ckey] & WHITELIST_PREDATOR) //Are they whitelisted? - if(!player.client.prefs) - player.client.prefs = new /datum/preferences(player.client) //Somehow they don't have one. - - if(player.client.prefs.job_preferences[JOB_PREDATOR] > 0) //Are their prefs turned on? - if(!player.mind) //They have to have a key if they have a client. - player.mind_initialize() //Will work on ghosts too, but won't add them to active minds. - players += player.mind - return players - -#define calculate_pred_max (length(GLOB.player_list) / pred_per_players + pred_additional_max + pred_start_count) - -/datum/game_mode/proc/check_predator_late_join(mob/pred_candidate, show_warning = TRUE) - if(!pred_candidate?.client) // Nigga, how?! - return - - var/datum/job/job = SSjob.GetJobType(/datum/job/predator) - - if(!job) - if(show_warning) - to_chat(pred_candidate, span_warning("Something went wrong!")) - return - - if(show_warning && alert(pred_candidate, "Confirm joining the hunt. You will join as \a [lowertext(job.get_whitelist_status(GLOB.roles_whitelist, pred_candidate.client))] predator", "Confirm", "Yes", "No") != "Yes") - return - - if(!(GLOB.roles_whitelist[pred_candidate.ckey] & WHITELIST_PREDATOR)) - if(show_warning) - to_chat(pred_candidate, span_warning("You are not whitelisted! You may apply on the forums to be whitelisted as a predator.")) - return - - if(is_banned_from(ckey(pred_candidate.key), JOB_PREDATOR)) - if(show_warning) - to_chat(pred_candidate, span_warning("You are banned.")) - return - - if(!(flags_round_type & MODE_PREDATOR)) - if(show_warning) - to_chat(pred_candidate, span_warning("There is no Hunt this round! Maybe the next one.")) - return - - if(pred_candidate.ckey in predators) - if(show_warning) - to_chat(pred_candidate, span_warning("You already were a Yautja! Give someone else a chance.")) - return - - if(get_desired_status(pred_candidate.client.prefs.yautja_status, WHITELIST_COUNCIL) == WHITELIST_NORMAL) - var/pred_max = calculate_pred_max - if(pred_current_num >= pred_max) - if(show_warning) - to_chat(pred_candidate, span_warning("Only [pred_max] predators may spawn this round, but Councillors and Ancients do not count.")) - return - - return TRUE - -#undef calculate_pred_max - -/datum/game_mode/proc/join_predator(mob/pred_candidate) - var/datum/job/job = SSjob.GetJobType(/datum/job/predator) - var/datum/preferences/prefs = pred_candidate.client.prefs - var/spawn_type = job.return_spawn_type(prefs) - var/mob/living/carbon/human/new_predator = new spawn_type() - new_predator.forceMove(job.return_spawn_turf(pred_candidate, pred_candidate.client)) - new_predator.ckey = pred_candidate.ckey - new_predator.apply_assigned_role_to_spawn(job) - job.after_spawn(new_predator) - qdel(pred_candidate) diff --git a/modular_RUtgmc/code/datums/gamemodes/crash.dm b/modular_RUtgmc/code/datums/gamemodes/crash.dm deleted file mode 100644 index c1c64c22403..00000000000 --- a/modular_RUtgmc/code/datums/gamemodes/crash.dm +++ /dev/null @@ -1,21 +0,0 @@ - -/datum/game_mode/infestation/crash/pre_setup() - . = ..() - //It's a crutch. It's wrong. But it works, and I'm too young to fix it. - //Please somebody rework the squad spawn point code. - //Also here we delete all squad spawn points, so marines spawn on the crash shuttle instead of the ship. - GLOB.start_squad_landmarks_list = null - -/datum/game_mode/infestation/crash - valid_job_types = list( - /datum/job/terragov/squad/standard = -1, - /datum/job/terragov/squad/engineer = 1, - /datum/job/terragov/squad/corpsman = 1, - /datum/job/terragov/squad/smartgunner = 1, - /datum/job/terragov/squad/leader = 1, - /datum/job/terragov/medical/professor = 1, - /datum/job/terragov/medical/medicalofficer = 1, - /datum/job/terragov/silicon/synthetic = 1, - /datum/job/terragov/command/fieldcommander = 1, - /datum/job/xenomorph = FREE_XENO_AT_START - ) diff --git a/modular_RUtgmc/code/datums/gamemodes/nuclear_war.dm b/modular_RUtgmc/code/datums/gamemodes/nuclear_war.dm deleted file mode 100644 index f5ce81e4bb8..00000000000 --- a/modular_RUtgmc/code/datums/gamemodes/nuclear_war.dm +++ /dev/null @@ -1,2 +0,0 @@ -/datum/game_mode/infestation/nuclear_war - quickbuild_points_flags = MODE_GENERAL_QUICKBUILD_POINTS diff --git a/modular_RUtgmc/code/datums/greyscale/greyscale_configs.dm b/modular_RUtgmc/code/datums/greyscale/greyscale_configs.dm deleted file mode 100644 index 66bd76dcf94..00000000000 --- a/modular_RUtgmc/code/datums/greyscale/greyscale_configs.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/greyscale_config/xenonaut/mk1 - icon_file = 'modular_RUtgmc/icons/mob/modular/xenonauten.dmi' - json_config = 'modular_RUtgmc/code/datums/greyscale/json_configs/xenonaut_mk1.json' - prefix = "med_" - -/datum/greyscale_config/xenonaut/mk1/light - prefix = "light_" - -/datum/greyscale_config/xenonaut/mk1/medium - prefix = "med_" - -/datum/greyscale_config/xenonaut/mk1/heavy - prefix = "heavy_" - -/datum/greyscale_config/xenonaut/helm/mk1 - icon_file = 'modular_RUtgmc/icons/mob/modular/xenonauten.dmi' - -//Capes -/datum/greyscale_config/cape - icon_file = 'modular_RUtgmc/icons/mob/modular/capes.dmi' - json_config = 'modular_RUtgmc/code/datums/greyscale/json_configs/cape.json' - - -//Cape highlights -/datum/greyscale_config/cape_highlight - icon_file = 'modular_RUtgmc/icons/mob/modular/capes_highlight.dmi' - json_config = 'modular_RUtgmc/code/datums/greyscale/json_configs/cape_highlight.json' diff --git a/modular_RUtgmc/code/datums/greyscale/json_configs/cape.json b/modular_RUtgmc/code/datums/greyscale/json_configs/cape.json deleted file mode 100644 index 9614a74ccb3..00000000000 --- a/modular_RUtgmc/code/datums/greyscale/json_configs/cape.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "cape_kama": [ - { - "type": "hyperscale", - "icon_state": "kama" - } - ], - "cape_kilt": [ - { - "type": "hyperscale", - "icon_state": "kilt" - }, - { - "type":"icon_state", - "icon_state":"kilt_no_color", - "blend_mode":"overlay" - } - ], - "cape_kilt (alt)": [ - { - "type": "hyperscale", - "icon_state": "kilt_alt" - }, - { - "type":"icon_state", - "icon_state":"kilt_no_color", - "blend_mode":"overlay" - } - ], - "cape_long": [ - { - "type": "hyperscale", - "icon_state": "long" - } - ], - "cape_long_h": [ - { - "type": "hyperscale", - "icon_state": "long_h" - } - ], - "cape_regaly": [ - { - "type": "hyperscale", - "icon_state": "regaly" - } - ], - "cape_regaly_h": [ - { - "type": "hyperscale", - "icon_state": "regaly_h" - } - ], - "cape_onelong": [ - { - "type": "hyperscale", - "icon_state": "onelong" - } - ], - "cape_onelong_h": [ - { - "type": "hyperscale", - "icon_state": "onelong_h" - } - ] -} diff --git a/modular_RUtgmc/code/datums/greyscale/json_configs/cape_highlight.json b/modular_RUtgmc/code/datums/greyscale/json_configs/cape_highlight.json deleted file mode 100644 index a6c8e1dc506..00000000000 --- a/modular_RUtgmc/code/datums/greyscale/json_configs/cape_highlight.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "highlight_kama":[ - { - "type": "hyperscale", - "icon_state": "kama" - } - ], - "highlight_kilt": [ - { - "type": "hyperscale", - "icon_state": "kilt" - } - ], - "highlight_long":[ - { - "type": "hyperscale", - "icon_state": "long" - } - ], - "highlight_long_h":[ - { - "type": "hyperscale", - "icon_state": "long" - } - ], - - "highlight_regaly":[ - { - "type": "hyperscale", - "icon_state": "regaly" - } - ], - "highlight_regaly_h":[ - { - "type": "hyperscale", - "icon_state": "regaly_h" - } - ], - "highlight_onelong":[ - { - "type": "hyperscale", - "icon_state": "onelong" - } - ], - - "highlight_onelong_h":[ - { - "type": "hyperscale", - "icon_state": "onelong" - } - ] -} diff --git a/modular_RUtgmc/code/datums/jobs/job/job.dm b/modular_RUtgmc/code/datums/jobs/job/job.dm deleted file mode 100644 index 93137dea36b..00000000000 --- a/modular_RUtgmc/code/datums/jobs/job/job.dm +++ /dev/null @@ -1,8 +0,0 @@ -/datum/job - var/list/datum/outfit/gear_preset_whitelist = list()//Gear preset name used for council snowflakes ;) - -/datum/job/proc/get_whitelist_status(list/roles_whitelist, client/player) - if(!roles_whitelist) - return FALSE - - return WHITELIST_NORMAL diff --git a/modular_RUtgmc/code/datums/jobs/job/job_exp.dm b/modular_RUtgmc/code/datums/jobs/job/job_exp.dm deleted file mode 100644 index a4f4c6b54a9..00000000000 --- a/modular_RUtgmc/code/datums/jobs/job/job_exp.dm +++ /dev/null @@ -1,75 +0,0 @@ -/client/proc/facehugger_exp_update(stat = 0) - if(!CONFIG_GET(flag/use_exp_tracking)) - return -1 - if(!SSdbcore.Connect()) - return -1 - if(!isnum(stat) || !stat) - return -1 - - LAZYINITLIST(GLOB.exp_to_update) - GLOB.exp_to_update.Add(list(list( - "job" = EXP_TYPE_FACEHUGGER_STAT, - "ckey" = ckey, - "minutes" = stat))) - prefs.exp[EXP_TYPE_FACEHUGGER_STAT] += stat - -/proc/get_exp_format(expnum) - if(expnum > 60) - if(round(expnum % 60) > 0) - return num2text(round(expnum / 60)) + "h" + num2text(round(expnum % 60)) + "m" - else - return num2text(round(expnum / 60)) + "h" - else if(expnum > 0) - return num2text(expnum) + "m" - else - return "0h" - -/client/get_exp_report() - if(!CONFIG_GET(flag/use_exp_tracking)) - return "Tracking is disabled in the server configuration file." - var/list/play_records = prefs.exp - if(!length(play_records)) - set_exp_from_db() - play_records = prefs.exp - if(!length(play_records)) - return "[key] has no records." - var/return_text = list() - return_text += "