"
- var/forced_faction
- if(candidate.faction in SSticker.mode.get_joinable_factions(FALSE))
- forced_faction = candidate.faction
- else
- forced_faction = tgui_input_list(candidate, "What faction do you want to join", "Faction choice", SSticker.mode.get_joinable_factions(TRUE))
- if(!forced_faction)
- return
- dat += "
"
- for(var/cat in SSjob.active_joinable_occupations_by_category)
- var/list/category = SSjob.active_joinable_occupations_by_category[cat]
- var/datum/job/job_datum = category[1] //use the color of the first job in the category (the department head) as the category color
- dat += " "
- dat += "
"
- var/datum/browser/popup = new(candidate, "latechoices", "Choose Occupation", 680, 580)
- popup.add_stylesheet("latechoices", 'html/browser/latechoices.css')
- popup.set_content(jointext(dat, ""))
- popup.open(FALSE)
-
-/datum/game_mode/hvh/campaign/Topic(href, href_list[])
- switch(href_list["campaign_choice"])
- if("SelectedJob")
- if(!SSticker)
- return
- var/mob/candidate = locate(href_list["player"])
- if(!candidate.client)
- return
-
- if(!GLOB.enter_allowed)
- to_chat(candidate, span_warning("Spawning currently disabled, please observe."))
- return
-
- var/mob/new_player/ready_candidate = new()
- candidate.client.screen.Cut()
- ready_candidate.name = candidate.key
- ready_candidate.key = candidate.key
-
- var/datum/job/job_datum = locate(href_list["job_selected"])
-
- if(attrition_respawn(ready_candidate, job_datum))
- if(isobserver(candidate))
- qdel(candidate)
- return
-
- ready_candidate.client.screen.Cut()
- candidate.name = ready_candidate.key
- candidate.key = ready_candidate.key
-
-///Actually respawns the player, if still able
-/datum/game_mode/hvh/campaign/proc/attrition_respawn(mob/new_player/ready_candidate, datum/job/job_datum)
- if(!ready_candidate.IsJobAvailable(job_datum, TRUE))
- to_chat(usr, "Selected job is not available.")
- return
- if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING)
- to_chat(usr, "The mission is either not ready, or has already finished!")
- return
- if(!GLOB.enter_allowed)
- to_chat(usr, "Spawning currently disabled, please observe.")
- return
- if(!ready_candidate.client.prefs.random_name)
- var/name_to_check = ready_candidate.client.prefs.real_name
- if(job_datum.job_flags & JOB_FLAG_SPECIALNAME)
- name_to_check = job_datum.get_special_name(ready_candidate.client)
- if(CONFIG_GET(flag/prevent_dupe_names) && GLOB.real_names_joined.Find(name_to_check))
- to_chat(usr, "Someone has already joined the mission with this character name. Please pick another.")
- return
- if(!SSjob.AssignRole(ready_candidate, job_datum, TRUE))
- to_chat(usr, "Failed to assign selected role.")
- return
-
- stat_list[job_datum.faction].active_attrition_points -= job_datum.job_cost
- LateSpawn(ready_candidate)
- return TRUE
-
-///Check which jobs are valid, to add to the job selector menu
-/datum/game_mode/hvh/campaign/proc/IsJobAvailable(mob/candidate, datum/job/job, faction)
- if(!job)
- return FALSE
- if(job.faction != faction)
- return FALSE
- if((job.current_positions >= job.total_positions) && job.total_positions != -1)
- return FALSE
- if(job.job_cost > stat_list[faction].active_attrition_points)
- return FALSE
- if(is_banned_from(candidate.ckey, job.title))
- return FALSE
- if(QDELETED(candidate))
- return FALSE
- if(!job.player_old_enough(candidate.client))
- return FALSE
- if(job.required_playtime_remaining(candidate.client))
- return FALSE
- if(!job.special_check_latejoin(candidate.client))
- return FALSE
- return TRUE
-
-///Sets up newly spawned players with the campaign status verb
-/datum/game_mode/hvh/campaign/proc/register_faction_member(datum/source, mob/living/carbon/human/new_member)
- SIGNAL_HANDLER
- if(!(new_member.faction in factions))
- return
- add_verb(new_member, /mob/living/proc/open_faction_stats_ui)
-
-///Opens up the players campaign status UI
-/mob/living/proc/open_faction_stats_ui()
- set name = "Campaign Status"
- set desc = "Check the status of your faction in the campaign."
- set category = "IC"
-
- var/datum/faction_stats/your_faction = GLOB.faction_stats_datums[faction]
- if(!your_faction)
- return
- your_faction.interact(src)
diff --git a/code/datums/gamemodes/campaign/campaign_mission.dm b/code/datums/gamemodes/campaign/campaign_mission.dm
deleted file mode 100644
index 390d9636986b6..0000000000000
--- a/code/datums/gamemodes/campaign/campaign_mission.dm
+++ /dev/null
@@ -1,376 +0,0 @@
-/datum/campaign_mission
- ///name of the mission
- var/name
- ///map name for this mission
- var/map_name
- ///path of map for this mission
- var/map_file
- ///map_traits, defaults to ZTRAIT_AWAY
- var/list/map_traits = list(ZTRAIT_AWAY = TRUE)
- ///Lightings colours for the map. Typically all the same for consistancy, but not required
- var/list/map_light_colours = list(COLOR_WHITE, COLOR_WHITE, COLOR_WHITE, COLOR_WHITE)
- ///Light levels for the map
- var/list/map_light_levels = list(200, 100, 75, 50)
- ///Optional delay for each faction to be able to deploy, typically used in attacker/defender missions
- var/list/shutter_open_delay = list(
- "starting_faction" = 0,
- "hostile_faction" = 0,
- )
- ///Any mission behavior flags
- var/mission_flags = null
- ///faction that chose the mission
- var/starting_faction
- ///faction that did not choose the mission
- var/hostile_faction
- ///current state of the mission
- var/mission_state = MISSION_STATE_NEW
- ///winning faction of the mission
- var/winning_faction
- ///specific mission outcome
- var/outcome
- ///The current gamemode. Var as its referred to often
- var/datum/game_mode/hvh/campaign/mode
- ///The victory conditions for this mission for the starting faction, for display purposes
- var/starting_faction_objective_description = "Loading mission objectives"
- ///The victory conditions for this mission for the hostile faction, for display purposes
- var/hostile_faction_objective_description = "Loading mission objectives"
- ///Detailed mission description for the starting faction
- var/starting_faction_mission_brief = "starting faction mission brief here"
- ///Detailed mission description for the hostile faction
- var/hostile_faction_mission_brief = "hostile faction mission brief here"
- ///Any additional rewards for the starting faction, for display purposes
- var/starting_faction_additional_rewards = "starting faction mission rewards here"
- ///Any additional rewards for the hostile faction, for display purposes
- var/hostile_faction_additional_rewards = "hostile faction mission rewards here"
- ///Victory point rewards for the mission type
- var/list/victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(0, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(0, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 0),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 0),
- )
- ///attrition point rewards for the mission type
- var/list/attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(0, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(0, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 0),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 0),
- )
- /// Timer used to calculate how long till mission ends
- var/game_timer
- ///The length of time until mission ends, if timed
- var/max_game_time = null
- ///Whether the max game time has been reached
- var/max_time_reached = FALSE
- ///Delay from shutter drop until game timer starts
- var/game_timer_delay = 1 MINUTES //test num
- ///Map text intro message for the start of the mission
- var/list/intro_message = list(
- "starting_faction" = "starting faction intro text here",
- "hostile_faction" = "hostile faction intro text here",
- )
- var/list/outro_message = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(
- "starting_faction" = "Major victory All mission objectives achieved, outstanding work!",
- "hostile_faction" = "Major loss All surviving forces fallback, we'll get them next time.",
- ),
- MISSION_OUTCOME_MINOR_VICTORY = list(
- "starting_faction" = "Minor victory That's a successful operation team, nice work. Head back to base!",
- "hostile_faction" = "Minor loss Pull back all forces, we'll get them next time.",
- ),
- MISSION_OUTCOME_DRAW = list(
- "starting_faction" = "Draw Mission objectives not met, pull back and regroup.",
- "hostile_faction" = "Draw Enemy operation disrupted, they're getting nothing out of this one. Good work.",
- ),
- MISSION_OUTCOME_MINOR_LOSS = list(
- "starting_faction" = "Minor loss starting faction intro text here",
- "hostile_faction" = "Minor victory Excellent work, the enemy operation is in disarray. Get ready for the next move.",
- ),
- MISSION_OUTCOME_MAJOR_LOSS = list(
- "starting_faction" = "Major loss All surviving forces retreat. The operation is a failure.",
- "hostile_faction" = "Major victory Enemy forces routed, outstanding work! Regroup and get ready to counter attack!",
- ),
- )
- ///Operation name for starting faction
- var/op_name_starting
- ///Operation name for hostile faction
- var/op_name_hostile
- ///Possible rewards for a major victory, used by Generate_rewards()
- var/list/major_victory_reward_table = list()
- ///Possible rewards for a minor victory, used by Generate_rewards()
- var/list/minor_victory_reward_table = list()
- ///Possible rewards for a minor loss, used by Generate_rewards()
- var/list/minor_loss_reward_table = list()
- ///Possible rewards for a major loss, used by Generate_rewards()
- var/list/major_loss_reward_table = list()
- ///Possible rewards for a draw, used by Generate_rewards()
- var/list/draw_reward_table = list()
-
-/datum/campaign_mission/New(initiating_faction)
- . = ..()
-
- mode = SSticker.mode
- if(!istype(mode))
- CRASH("campaign_mission loaded without campaign game mode")
-
- starting_faction = initiating_faction
- for(var/faction in mode.factions) //this is pretty clunky but eh
- if(faction == starting_faction)
- continue
- hostile_faction = faction
-
- op_name_starting = GLOB.operation_namepool[/datum/operation_namepool].get_random_name()
- op_name_hostile = GLOB.operation_namepool[/datum/operation_namepool].get_random_name()
-
- load_mission_brief() //late loaded so we can ref the specific factions etc
-
-/datum/campaign_mission/Destroy(force, ...)
- STOP_PROCESSING(SSslowprocess, src)
- return ..()
-
-/datum/campaign_mission/process()
- if(!check_mission_progress())
- return
- end_mission()
- return PROCESS_KILL
-
-///Sets up the mission once it has been selected
-/datum/campaign_mission/proc/load_mission()
- play_selection_intro()
- load_map()
- addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/campaign_mission, load_objective_description)), 5 SECONDS) //will be called before the map is entirely loaded otherwise, but this is cringe
- addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/campaign_mission, start_mission)), 2 MINUTES)
-
-///Generates a new z level for the mission
-/datum/campaign_mission/proc/load_map()
- var/datum/space_level/new_level = load_new_z_level(map_file, map_name, TRUE, map_traits)
- set_z_lighting(new_level.z_value, map_light_colours[1], map_light_levels[1], map_light_colours[2], map_light_levels[2], map_light_colours[3], map_light_levels[3], map_light_colours[4], map_light_levels[4])
-
- SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CAMPAIGN_MISSION_LOADED, new_level.z_value)
-
-///Generates the mission brief for the mission if it needs to be late loaded
-/datum/campaign_mission/proc/load_mission_brief()
- return
-
-///Generates the objective description for the mission if it needs to be late loaded
-/datum/campaign_mission/proc/load_objective_description()
- return
-
-///Generates status tab info for the mission
-/datum/campaign_mission/proc/get_status_tab_items(mob/source, list/items)
- items += "Mission: [name]"
- items += "Area of operation: [map_name]"
- items += ""
-
- if(max_time_reached)
- items += "Mission status: Mission complete"
- items += ""
- else if(game_timer)
- items += "Mission time remaining: [mission_end_countdown()]"
- items += ""
-
- if(source.faction == starting_faction || source.faction == FACTION_NEUTRAL)
- items += "[starting_faction] mission objectives:"
- items += splittext(starting_faction_objective_description, ".")
- items += ""
- if(source.faction == hostile_faction || source.faction == FACTION_NEUTRAL)
- items += "[hostile_faction] mission objectives:"
- items += splittext(hostile_faction_objective_description, ".")
- items += ""
-
-///Generates mission rewards, if there is variability involved
-/datum/campaign_mission/proc/Generate_rewards(reward_amount = 1, faction)
- if(!faction)
- return
-
- var/reward_table
- switch(outcome)
- if(MISSION_OUTCOME_MAJOR_VICTORY)
- reward_table = major_victory_reward_table
- if(MISSION_OUTCOME_MINOR_VICTORY)
- reward_table = minor_victory_reward_table
- if(MISSION_OUTCOME_MINOR_LOSS)
- reward_table = minor_loss_reward_table
- if(MISSION_OUTCOME_MAJOR_LOSS)
- reward_table = major_loss_reward_table
- if(MISSION_OUTCOME_DRAW)
- reward_table = draw_reward_table
-
- for(var/i = 1 to reward_amount)
- var/obj/reward = pickweight(reward_table)
- new reward(get_turf(pick(GLOB.campaign_reward_spawners[faction])))
-
-///Checks mission end criteria, and ends the mission if met
-/datum/campaign_mission/proc/check_mission_progress()
- return FALSE
-
-///sets up the timer for the mission
-/datum/campaign_mission/proc/set_mission_timer()
- if(!iscampaigngamemode(SSticker.mode))
- return
-
- game_timer = addtimer(VARSET_CALLBACK(src, max_time_reached, TRUE), max_game_time, TIMER_STOPPABLE)
-
-///accesses the timer for status panel
-/datum/campaign_mission/proc/mission_end_countdown()
- if(max_time_reached)
- return "Mission finished"
- var/eta = timeleft(game_timer) * 0.1
- if(eta > 0)
- return "[(eta / 60) % 60]:[add_leading(num2text(eta % 60), 2, "0")]"
-
-///Mission start proper
-/datum/campaign_mission/proc/start_mission()
- SHOULD_CALL_PARENT(TRUE)
- if(!shutter_open_delay["starting_faction"])
- SEND_GLOBAL_SIGNAL(GLOB.faction_to_campaign_door_signal[starting_faction])
- else
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(send_global_signal), GLOB.faction_to_campaign_door_signal[starting_faction]), shutter_open_delay["starting_faction"])
-
- if(!shutter_open_delay["hostile_faction"])
- SEND_GLOBAL_SIGNAL(GLOB.faction_to_campaign_door_signal[hostile_faction])
- else
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(send_global_signal), GLOB.faction_to_campaign_door_signal[hostile_faction]), shutter_open_delay["hostile_faction"])
-
- START_PROCESSING(SSslowprocess, src) //this may be excessive
- play_start_intro()
-
- if(max_game_time)
- addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/campaign_mission, set_mission_timer)), game_timer_delay)
-
- mission_state = MISSION_STATE_ACTIVE
-
-///Mission end wrap up
-/datum/campaign_mission/proc/end_mission()
- SHOULD_CALL_PARENT(TRUE)
- QDEL_LIST(GLOB.campaign_objectives) //clean up objectives for any future missions
- QDEL_LIST(GLOB.patrol_point_list) //purge all existing links, cutting off the current ground map. Start point links are auto severed, and will reconnect to new points when a new map is loaded and upon use.
- STOP_PROCESSING(SSslowprocess, src)
- mission_state = MISSION_STATE_FINISHED
- apply_outcome()
- play_outro()
- SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CLOSE_CAMPAIGN_SHUTTERS)
- SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CAMPAIGN_MISSION_ENDED, winning_faction)
- for(var/datum/outfit/quick/outfit AS in GLOB.quick_loadouts)
- outfit.quantity = initial(outfit.quantity)
-
-
-///Intro when the mission is selected
-/datum/campaign_mission/proc/play_selection_intro()
- to_chat(world, span_round_header("|[name]|"))
- to_chat(world, span_round_body("Next mission selected by [starting_faction] as [name] on the battlefield of [map_name]."))
- for(var/mob/player AS in GLOB.player_list)
- player.playsound_local(null, 'sound/ambience/votestart.ogg', 10, 1)
-
-///Intro when the mission is started
-/datum/campaign_mission/proc/play_start_intro()
- map_text_broadcast(starting_faction, intro_message["starting_faction"], op_name_starting)
- map_text_broadcast(hostile_faction, intro_message["hostile_faction"], op_name_hostile)
-
-///Outro when the mission is finished
-/datum/campaign_mission/proc/play_outro() //todo: make generic
- to_chat(world, span_round_header("|[starting_faction] [outcome]|"))
- log_game("[outcome]\nMission: [name]")
- to_chat(world, span_round_body("Thus ends the story of the brave men and women of both the [starting_faction] and [hostile_faction], and their struggle on [map_name]."))
-
- map_text_broadcast(starting_faction, outro_message[outcome]["starting_faction"], op_name_starting)
- map_text_broadcast(hostile_faction, outro_message[outcome]["hostile_faction"], op_name_hostile)
-
-///Applies the correct outcome for the mission
-/datum/campaign_mission/proc/apply_outcome()
- switch(outcome)
- if(MISSION_OUTCOME_MAJOR_VICTORY)
- apply_major_victory()
- if(MISSION_OUTCOME_MINOR_VICTORY)
- apply_minor_victory()
- if(MISSION_OUTCOME_DRAW)
- apply_draw()
- if(MISSION_OUTCOME_MINOR_LOSS)
- apply_minor_loss()
- if(MISSION_OUTCOME_MAJOR_LOSS)
- apply_major_loss()
- else
- CRASH("mission ended with no outcome set")
-
- modify_attrition_points(attrition_point_rewards[outcome][1], attrition_point_rewards[outcome][2])
- apply_victory_points(victory_point_rewards[outcome][1], victory_point_rewards[outcome][2])
-
- //reset attrition points - unused points are lost
- mode.stat_list[starting_faction].active_attrition_points = 0
- mode.stat_list[hostile_faction].active_attrition_points = 0
-
-///Apply outcomes for major win
-/datum/campaign_mission/proc/apply_major_victory()
- winning_faction = starting_faction
-
-///Apply outcomes for minor win
-/datum/campaign_mission/proc/apply_minor_victory()
- winning_faction = starting_faction
-
-///Apply outcomes for draw
-/datum/campaign_mission/proc/apply_draw()
- winning_faction = hostile_faction
-
-///Apply outcomes for minor loss
-/datum/campaign_mission/proc/apply_minor_loss()
- winning_faction = hostile_faction
-
-///Apply outcomes for major loss
-/datum/campaign_mission/proc/apply_major_loss()
- winning_faction = hostile_faction
-
-///gives any victory points earned in the mission
-/datum/campaign_mission/proc/apply_victory_points(start_team_points, hostile_team_points)
- mode.stat_list[starting_faction].victory_points += start_team_points
- mode.stat_list[hostile_faction].victory_points += hostile_team_points
-
-///Modifies a faction's attrition points
-/datum/campaign_mission/proc/modify_attrition_points(start_team_points, hostile_team_points)
- mode.stat_list[starting_faction].total_attrition_points += start_team_points
- mode.stat_list[hostile_faction].total_attrition_points += hostile_team_points
-
-///checks how many marines and SOM are still alive
-/datum/campaign_mission/proc/count_humans(list/z_levels = SSmapping.levels_by_trait(ZTRAIT_AWAY), count_flags) //todo: make new Z's not away levels, or ensure ground and away is consistant in behavior
- var/list/team_one_alive = list()
- var/list/team_one_dead = list()
- var/list/team_two_alive = list()
- var/list/team_two_dead = list()
-
- for(var/z in z_levels)
- //counts the live marines and SOM
- for(var/i in GLOB.humans_by_zlevel["[z]"])
- var/mob/living/carbon/human/H = i
- if(!istype(H))
- continue
- if(count_flags & COUNT_IGNORE_HUMAN_SSD && !H.client)
- continue
- if(H.faction == starting_faction)
- team_one_alive += H
- else //assumption here that there is only 2 teams
- team_two_alive += H
- //counts the dead marines and SOM
- for(var/i in GLOB.dead_human_list)
- var/mob/living/carbon/human/H = i
- if(!istype(H))
- continue
- if(H.faction == starting_faction)
- team_one_dead += H
- else
- team_two_dead += H
-
- return list(team_one_alive, team_two_alive, team_one_dead, team_two_dead)
-
-///Sends a maptext message to a specified faction
-/datum/campaign_mission/proc/map_text_broadcast(faction, message, title = "OVERWATCH", atom/movable/screen/text/screen_text/picture/display_picture, sound_effect = "sound/effects/CIC_order.ogg")
- if(!faction || !message)
- return
- if(!display_picture)
- display_picture = GLOB.faction_to_portrait[faction] ? GLOB.faction_to_portrait[faction] : /atom/movable/screen/text/screen_text/picture/potrait/unknown
-
- for(var/mob/living/carbon/human/human AS in GLOB.alive_human_list)
- if(human.faction != faction)
- continue
- human.playsound_local(null, sound_effect, 10, 1)
- human.play_screen_text("[title] " + "[message]", display_picture)
diff --git a/code/datums/gamemodes/campaign/campaign_reward_jobs.dm b/code/datums/gamemodes/campaign/campaign_reward_jobs.dm
deleted file mode 100644
index d5e4896de4cf7..0000000000000
--- a/code/datums/gamemodes/campaign/campaign_reward_jobs.dm
+++ /dev/null
@@ -1,624 +0,0 @@
-//militia jobs
-/datum/job/som/mercenary/militia
- title = "Colonial militia standard"
- paygrade = "militia1"
- comm_title = "militia"
- job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS
- html_description = {"
- Difficulty:Moderate
- You answer to the commanding officer
- Duty: Help defend your colony by supporting your sympathetic faction. Follow their instructions and help achieve their goals.
- "}
- job_cost = 0
- multiple_outfits = TRUE
-
-/datum/job/som/mercenary/militia/radio_help_message(mob/M)
- . = ..()
- to_chat(M, {"\nYou are a volunteer member of a local militia group. You are lending your support to the faction you believe is truly helping your colony.
-What you lack in equipment and military training you make up in bravery and conviction. Fight for Blood! Fight for home!"})
-
-/datum/job/som/mercenary/militia/standard
- minimap_icon = "private"
- outfit = /datum/outfit/job/som/militia/standard/uzi
- multiple_outfits = TRUE
- outfits = list(
- /datum/outfit/job/som/militia/standard/uzi,
- /datum/outfit/job/som/militia/standard/skorpion,
- /datum/outfit/job/som/militia/standard/mpi_km,
- /datum/outfit/job/som/militia/standard/shotgun,
- /datum/outfit/job/som/militia/standard/fanatic,
- /datum/outfit/job/som/militia/standard/som_smg,
- /datum/outfit/job/som/militia/standard/mpi_grenadier,
- )
-
-/datum/outfit/job/som/militia/standard
- name = "Militia Standard"
- jobtype = /datum/job/som/mercenary/militia/standard
-
- id = /obj/item/card/id/silver
- ears = /obj/item/radio/headset/distress/dutch
- w_uniform = /obj/item/clothing/under/colonist
- shoes = /obj/item/clothing/shoes/marine/clf/full
- wear_suit = /obj/item/clothing/suit/storage/faction/militia
- gloves = /obj/item/clothing/gloves/black
- head = /obj/item/clothing/head/strawhat
- r_store = /obj/item/storage/pouch/medical_injectors/firstaid
- l_store = /obj/item/storage/pill_bottle/zoom
- back = /obj/item/storage/backpack/lightpack
-
-
-/datum/outfit/job/som/militia/standard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_SUIT)
-
- H.equip_to_slot_or_del(new /obj/item/tool/crowbar/red, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/molotov, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/molotov, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_BACKPACK)
-
-/datum/outfit/job/som/militia/standard/uzi
- belt = /obj/item/storage/belt/knifepouch
- suit_store = /obj/item/weapon/gun/smg/uzi/mag_harness
-
-
-/datum/outfit/job/som/militia/standard/uzi/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
-
-/datum/outfit/job/som/militia/standard/skorpion
- belt = /obj/item/weapon/gun/shotgun/double/sawn
- suit_store = /obj/item/weapon/gun/smg/skorpion/mag_harness
-
-/datum/outfit/job/som/militia/standard/skorpion/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
-
-/datum/outfit/job/som/militia/standard/mpi_km
- belt = /obj/item/storage/belt/marine/som
- suit_store = /obj/item/weapon/gun/rifle/mpi_km/standard
-
-
-/datum/outfit/job/som/militia/standard/mpi_km/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km, SLOT_IN_BELT)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/molotov, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/molotov, SLOT_IN_BACKPACK)
-
-/datum/outfit/job/som/militia/standard/shotgun
- belt = /obj/item/storage/belt/shotgun
- suit_store = /obj/item/weapon/gun/shotgun/pump/standard
-
-/datum/outfit/job/som/militia/standard/shotgun/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BELT)
-
- H.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/medium_stack, SLOT_IN_BACKPACK)
-
-/datum/outfit/job/som/militia/standard/fanatic
- head = /obj/item/clothing/head/headband/rambo
- wear_suit = /obj/item/clothing/suit/storage/marine/boomvest
- belt = /obj/item/weapon/gun/shotgun/double/sawn
- suit_store = /obj/item/weapon/gun/smg/skorpion/mag_harness
-
-/datum/outfit/job/som/militia/standard/fanatic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/phosphorus/upp, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
-
-/datum/outfit/job/som/militia/standard/som_smg
- belt = /obj/item/storage/belt/marine/som
- suit_store = /obj/item/weapon/gun/smg/som/basic
-
-
-/datum/outfit/job/som/militia/standard/som_smg/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/som, SLOT_IN_BELT)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/molotov, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/molotov, SLOT_IN_BACKPACK)
-
-/datum/outfit/job/som/militia/standard/mpi_grenadier
- belt = /obj/item/storage/belt/marine/som
- suit_store = /obj/item/weapon/gun/rifle/mpi_km/black/grenadier
-
-
-/datum/outfit/job/som/militia/standard/mpi_grenadier/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km/black, SLOT_IN_BELT)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_BACKPACK)
-
-/datum/job/som/mercenary/militia/medic
- title = "Militial Medic"
- paygrade = "militia2"
- minimap_icon = "medic"
- skills_type = /datum/skills/combat_medic
- outfit = /datum/outfit/job/som/militia/medic/uzi
- outfits = list(
- /datum/outfit/job/som/militia/medic/uzi,
- /datum/outfit/job/som/militia/medic/skorpion,
- /datum/outfit/job/som/militia/medic/paladin,
- )
-
-/datum/outfit/job/som/militia/medic
- name = "Militia Medic"
- jobtype = /datum/job/som/mercenary/militia/medic
-
- id = /obj/item/card/id/silver
- belt = /obj/item/storage/belt/lifesaver/full/upp
- ears = /obj/item/radio/headset/distress/dutch
- head = /obj/item/clothing/head/tgmcberet/bloodred
- w_uniform = /obj/item/clothing/under/colonist
- shoes = /obj/item/clothing/shoes/marine/clf/full
- wear_suit = /obj/item/clothing/suit/storage/faction/militia
- gloves = /obj/item/clothing/gloves/black
- glasses = /obj/item/clothing/glasses/hud/health
- suit_store = /obj/item/weapon/gun/smg/skorpion
- l_store = /obj/item/storage/pouch/medical_injectors/medic
- back = /obj/item/storage/backpack/lightpack
-
-
-/datum/outfit/job/som/militia/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_SUIT)
-
- H.equip_to_slot_or_del(new /obj/item/defibrillator, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/roller, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/radio, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/crowbar/red, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/molotov, SLOT_IN_BACKPACK)
-
-/datum/outfit/job/som/militia/medic/uzi
- suit_store = /obj/item/weapon/gun/smg/uzi/mag_harness
- r_store = /obj/item/storage/holster/flarepouch
-
-/datum/outfit/job/som/militia/medic/uzi/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/uzi/extended, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/grenade_launcher/single_shot/flare, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flare, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flare, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flare, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flare, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flare, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flare, SLOT_IN_R_POUCH)
-
-/datum/outfit/job/som/militia/medic/skorpion
- suit_store = /obj/item/weapon/gun/smg/skorpion/mag_harness
- r_store = /obj/item/storage/holster/flarepouch
-
-/datum/outfit/job/som/militia/medic/skorpion/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/skorpion, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/grenade_launcher/single_shot/flare, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flare, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flare, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flare, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flare, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flare, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flare, SLOT_IN_R_POUCH)
-
-/datum/outfit/job/som/militia/medic/paladin
- suit_store = /obj/item/weapon/gun/shotgun/pump/cmb/mag_harness
- r_store = /obj/item/storage/pouch/shotgun
-
-/datum/outfit/job/som/militia/medic/paladin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/buckshot, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/flechette, SLOT_IN_R_POUCH)
-
-/datum/job/som/mercenary/militia/leader
- title = "Militia Leader"
- paygrade = "militia3"
- minimap_icon = "leader"
- skills_type = /datum/skills/sl
- outfit = /datum/outfit/job/som/militia/leader/assault_rifle
- outfits = list(
- /datum/outfit/job/som/militia/leader/assault_rifle,
- /datum/outfit/job/som/militia/leader/mpi_km,
- /datum/outfit/job/som/militia/leader/som_rifle,
- /datum/outfit/job/som/militia/leader/upp_rifle,
- /datum/outfit/job/som/militia/leader/lmg_d,
- )
-
-/datum/outfit/job/som/militia/leader
- name = "Militia Leader"
- jobtype = /datum/job/som/mercenary/militia/leader
-
- id = /obj/item/card/id/silver
- belt = /obj/item/storage/belt/marine
- ears = /obj/item/radio/headset/distress/dutch
- w_uniform = /obj/item/clothing/under/colonist/webbing
- shoes = /obj/item/clothing/shoes/marine/clf/full
- wear_suit = /obj/item/clothing/suit/storage/faction/militia
- gloves = /obj/item/clothing/gloves/black
- head = /obj/item/clothing/head/militia
- glasses = /obj/item/clothing/glasses/hud/health
- r_store = /obj/item/storage/pouch/pistol
- l_store = /obj/item/storage/pouch/medical_injectors/firstaid
- back = /obj/item/storage/backpack/lightpack
-
-
-/datum/outfit/job/som/militia/leader/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/binoculars, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/radio, SLOT_IN_SUIT)
-
- H.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/medium_stack, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/radio, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/tool/crowbar/red, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/storage/box/m94, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/molotov, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/molotov, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/highpower, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/highpower, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/highpower(H), SLOT_IN_R_POUCH)
-
-/datum/outfit/job/som/militia/leader/assault_rifle
- suit_store = /obj/item/weapon/gun/rifle/m16/ugl
-
-/datum/outfit/job/som/militia/leader/assault_rifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m16, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m16, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m16, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m16, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m16, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m16, SLOT_IN_BELT)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_ACCESSORY)
-
-/datum/outfit/job/som/militia/leader/mpi_km
- suit_store = /obj/item/weapon/gun/rifle/mpi_km/grenadier
- belt = /obj/item/storage/belt/marine/som
-
-/datum/outfit/job/som/militia/leader/mpi_km/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/mpi_km, SLOT_IN_BELT)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_ACCESSORY)
-
-/datum/outfit/job/som/militia/leader/som_rifle
- suit_store = /obj/item/weapon/gun/rifle/som/basic
- belt = /obj/item/storage/belt/marine/som
-
-/datum/outfit/job/som/militia/leader/som_rifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som, SLOT_IN_BELT)
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/smoke_burst, SLOT_IN_ACCESSORY)
-
-/datum/outfit/job/som/militia/leader/upp_rifle
- suit_store = /obj/item/weapon/gun/rifle/type71/flamer/standard
-
-/datum/outfit/job/som/militia/leader/upp_rifle/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/type71, SLOT_IN_BELT)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_ACCESSORY)
-
-/datum/outfit/job/som/militia/leader/lmg_d
- suit_store = /obj/item/weapon/gun/rifle/lmg_d/magharness
- belt = /obj/item/storage/belt/marine/som
-
-/datum/outfit/job/som/militia/leader/lmg_d/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
-
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg_d, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg_d, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg_d, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg_d, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg_d, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/lmg_d, SLOT_IN_BELT)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/stick, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, SLOT_IN_ACCESSORY)
-
-//Freelancers
-/datum/job/freelancer/standard/campaign_bonus
- faction = FACTION_TERRAGOV
- job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS
- job_cost = 0
-
-/datum/job/freelancer/medic/campaign_bonus
- faction = FACTION_TERRAGOV
- job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS
- job_cost = 0
-
-/datum/job/freelancer/grenadier/campaign_bonus
- faction = FACTION_TERRAGOV
- job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS
- outfits = list(
- /datum/outfit/job/freelancer/grenadier,
- /datum/outfit/job/freelancer/grenadier/one,
- )
- job_cost = 0
-
-/datum/job/freelancer/leader/campaign_bonus
- faction = FACTION_TERRAGOV
- job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS
- outfits = list(
- /datum/outfit/job/freelancer/leader,
- /datum/outfit/job/freelancer/leader/one,
- )
- job_cost = 0
-
-//PMC
-/datum/job/pmc/standard/campaign_bonus
- faction = FACTION_TERRAGOV
- job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS
- job_cost = 0
-
-/datum/job/pmc/gunner/campaign_bonus
- faction = FACTION_TERRAGOV
- job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS
- job_cost = 0
-
-/datum/job/pmc/leader/campaign_bonus
- faction = FACTION_TERRAGOV
- job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS
- job_cost = 0
-
-//ICC
-/datum/job/icc/standard/campaign_bonus
- faction = FACTION_SOM
- job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS
- job_cost = 0
-
-/datum/job/icc/guard/campaign_bonus
- faction = FACTION_SOM
- job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS
- job_cost = 0
-
-/datum/job/icc/medic/campaign_bonus
- faction = FACTION_SOM
- job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS
- multiple_outfits = FALSE
- job_cost = 0
-
-/datum/job/icc/leader/campaign_bonus
- faction = FACTION_SOM
- job_flags = JOB_FLAG_LATEJOINABLE|JOB_FLAG_BOLD_NAME_ON_SELECTION|JOB_FLAG_PROVIDES_SQUAD_HUD|JOB_FLAG_CAN_SEE_ORDERS
- job_cost = 0
-
-//TGMC combat robots
-/datum/job/terragov/squad/standard/campaign_robot
- title = SQUAD_ROBOT
- outfit = /datum/outfit/job/tgmc/campaign_robot
- multiple_outfits = TRUE
- outfits = list(
- /datum/outfit/job/tgmc/campaign_robot/machine_gunner,
- /datum/outfit/job/tgmc/campaign_robot/guardian,
- /datum/outfit/job/tgmc/campaign_robot/jetpack,
- )
- job_cost = 0
-
-/datum/job/terragov/squad/standard/campaign_robot/radio_help_message(mob/M)
- . = ..()
- to_chat(M, {"\nYou are a cold, unfeeling machine built for war, controlled by TGMC.
-Your metal body is immune to pain and chemical warfare, and resistant against fire and radiation, although you lack the mobility of your human counterparts.
-Fight for TGMC, and attempt to achieve all objectives given to you."})
-
-/datum/outfit/job/tgmc/campaign_robot
- name = "Combat robot"
- jobtype = /datum/job/terragov/squad/standard/campaign_robot
-
- id = /obj/item/card/id/silver
- ears = /obj/item/radio/headset/mainship
- w_uniform = /obj/item/clothing/under/marine/robotic/webbing
- wear_suit = /obj/item/clothing/suit/modular/robot/heavy/tyr
- head = /obj/item/clothing/head/modular/robot/heavy/tyr
- r_store = /obj/item/storage/pouch/pistol
- l_store = /obj/item/storage/pouch/grenade/combat_patrol
- back = /obj/item/storage/backpack/marine/satchel
-
- belt = /obj/item/storage/belt/marine/te_cells
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine/gyro
-
-/datum/outfit/job/tgmc/campaign_robot/pre_equip(mob/living/carbon/human/H, visualsOnly)
- . = ..()
- H.set_species("Combat Robot")
-
-/datum/outfit/job/tgmc/campaign_robot/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/tool/crowbar, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/tool/weldingtool, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/sandbags/large_stack, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/tool/shovel/etool, SLOT_IN_SUIT)
-
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/inaprovaline, SLOT_IN_HEAD)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_HEAD)
-
-/datum/outfit/job/tgmc/campaign_robot/machine_gunner
- r_store = /obj/item/storage/pouch/pistol
- belt = /obj/item/storage/belt/sparepouch
- suit_store = /obj/item/weapon/gun/rifle/standard_gpmg/machinegunner
-
-/datum/outfit/job/tgmc/campaign_robot/machine_gunner/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/standard_gpmg, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/standard_gpmg, SLOT_IN_BELT)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/standard_gpmg, SLOT_IN_BELT)
-
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
-
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_R_POUCH)
-
- H.equip_to_slot_or_del(new /obj/item/tool/weldingtool, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/standard_gpmg, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/standard_gpmg, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/standard_gpmg, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
-
-/datum/outfit/job/tgmc/campaign_robot/guardian
- r_store = /obj/item/storage/pouch/pistol
- belt = /obj/item/storage/belt/marine/te_cells
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine/gyro
- r_hand = /obj/item/weapon/shield/riot/marine
-
-/datum/outfit/job/tgmc/campaign_robot/guardian/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
-
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/vp70/tactical(H), SLOT_IN_R_POUCH)
-
- H.equip_to_slot_or_del(new /obj/item/tool/weldingtool, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/stack/cable_coil, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_BACKPACK)
-
-/datum/outfit/job/tgmc/campaign_robot/jetpack
- wear_suit = /obj/item/clothing/suit/modular/robot/heavy/shield
- r_store = /obj/item/storage/pouch/magazine/large
- belt = /obj/item/storage/belt/marine/te_cells
- suit_store = /obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine/mag_harness
- r_hand = /obj/item/jetpack_marine
-
-/datum/outfit/job/tgmc/campaign_robot/jetpack/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
-
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/lasrifle, SLOT_IN_R_POUCH)
diff --git a/code/datums/gamemodes/campaign/campaign_rewards.dm b/code/datums/gamemodes/campaign/campaign_rewards.dm
deleted file mode 100644
index 51b413715f775..0000000000000
--- a/code/datums/gamemodes/campaign/campaign_rewards.dm
+++ /dev/null
@@ -1,593 +0,0 @@
-//specific rewards won during a campaign game
-
-//todo: move to the actual define page
-//campaign reward defines
-
-///Whether this reward has been completed used and has no further effect
-#define REWARD_CONSUMED (1<<0)
-///This reward must be explicitly activated
-#define REWARD_ACTIVATED_EFFECT (1<<1)
-///This reward is active as soon as it is won
-#define REWARD_IMMEDIATE_EFFECT (1<<2)
-///This reward has a passive effect
-#define REWARD_PASSIVE_EFFECT (1<<3)
-///Can't activate unless mission is starting or started
-#define REWARD_ACTIVE_MISSION_ONLY (1<<4)
-///Temporarily unusable
-#define REWARD_DISABLED (1<<5)
-///Currently active, used for UI purposes
-#define REWARD_ACTIVE (1<<6)
-///debuff, used for UI purposes
-#define REWARD_DEBUFF (1<<7)
-
-/datum/campaign_reward
- ///Name of this reward
- var/name = "Placeholder reward"
- ///Basic description
- var/desc = "This is a reward. It's a placeholder"
- ///Detailed description
- var/detailed_desc = "This is a placeholder reward. You shouldn't see this, it does nothing at all."
- ///The faction associated with these stats
- var/datum/faction_stats/faction
- ///reward related flags
- var/reward_flags = REWARD_ACTIVATED_EFFECT
- ///Number of times this can be used
- var/uses = 1
- ///Cost in attrition points if this reward is purchased
- var/cost = 1
-
- var/ui_icon = "test"
-
-/datum/campaign_reward/New(datum/faction_stats/winning_faction)
- . = ..()
- faction = winning_faction
- if(reward_flags & REWARD_IMMEDIATE_EFFECT)
- immediate_effect()
- if(reward_flags & REWARD_PASSIVE_EFFECT)
- passive_effect()
-
-/datum/campaign_reward/Destroy(force, ...)
- faction = null
- return ..()
-
-///Triggers any active effects of this reward
-/datum/campaign_reward/proc/activated_effect() //this shit should probably be in some checker proc for sanity
- SHOULD_CALL_PARENT(TRUE)
- if((reward_flags & REWARD_CONSUMED) || reward_flags & REWARD_DISABLED || uses <= 0)
- return FALSE
-
- if(reward_flags & REWARD_ACTIVE_MISSION_ONLY)
- var/datum/game_mode/hvh/campaign/mode = SSticker.mode
- var/datum/campaign_mission/current_mission = mode.current_mission
- if(!current_mission || (current_mission.mission_state == MISSION_STATE_FINISHED))
- to_chat(faction.faction_leader, span_warning("Unavailable until next mission confirmed."))
- return
-
- uses --
- if(uses <= 0)
- reward_flags |= REWARD_CONSUMED
- return TRUE
-
-///Triggers any immediate effects of this reward
-/datum/campaign_reward/proc/immediate_effect()
- return
-///Triggers any passive effects of this reward
-/datum/campaign_reward/proc/passive_effect() //functionally identical to immediate effect, but specifically intended to be removable, and displayed differently in the UI
- return
-
-/datum/campaign_reward/proc/remove_passive_effect()
- return
-
-///Deactivates the asset once the mission is over
-/datum/campaign_reward/proc/deactivate()
- SIGNAL_HANDLER
- reward_flags &= ~REWARD_ACTIVE
- UnregisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_MISSION_ENDED)
-
-//Parent for all 'spawn stuff' rewards
-/datum/campaign_reward/equipment
- ///list of objects to spawn when this reward is activated
- var/list/obj/equipment_to_spawn = list()
-
-/datum/campaign_reward/equipment/activated_effect()
- . = ..()
- if(!.)
- return
-
- var/turf/spawn_location = get_turf(pick(GLOB.campaign_reward_spawners[faction.faction]))
- playsound(spawn_location,'sound/effects/phasein.ogg', 80, FALSE)
- for(var/obj/object AS in equipment_to_spawn)
- new object(spawn_location)
-
-/datum/campaign_reward/equipment/power_armor
- name = "B18 consignment"
- desc = "Three sets of B18 power armor."
- detailed_desc = "Your battalion has been assigned a number of B18 power armor sets, available at your request. B18 is TGMC's premier infantry armor, providing superior protection, mobility and an advanced automedical system."
- uses = 3
- cost = 15
- ui_icon = "b18"
- equipment_to_spawn = list(
- /obj/item/clothing/head/helmet/marine/specialist,
- /obj/item/clothing/gloves/marine/specialist,
- /obj/item/clothing/suit/storage/marine/specialist,
- )
-
-/datum/campaign_reward/equipment/gorgon_armor
- name = "Gorgon consignment"
- desc = "Five sets of Gorgon power armor."
- detailed_desc = "Your battalion has been assigned a number of Gorgon power armor sets, available at your request. Gorgon armor is the SOM's elite infantry armor, providing superior protection and an automedical system without significantly compromising on speed."
- uses = 5
- cost = 10
- ui_icon = "gorgon"
- equipment_to_spawn = list(
- /obj/item/clothing/head/modular/som/leader,
- /obj/item/clothing/suit/modular/som/heavy/leader/valk,
- )
-
-/datum/campaign_reward/equipment/medkit_basic
- name = "Medical supplies"
- desc = "A small number of medkits."
- detailed_desc = "A number of medkits with some basic medical supplies."
- ui_icon = "medkit"
- uses = 2
- cost = 1
- equipment_to_spawn = list(
- /obj/effect/supply_drop/medical_basic,
- )
-
-/datum/campaign_reward/equipment/materials_pack
- name = "Construction supplies"
- desc = "Metal, plasteel and sandbags."
- detailed_desc = "A significant quantity of metal, plasteel and sandbags. Perfect for fortifying a defensive position"
- ui_icon = "materials"
- uses = 1
- cost = 4
- equipment_to_spawn = list(
- /obj/item/storage/box/crate/loot/materials_pack,
- /obj/item/tool/shovel/etool,
- /obj/item/tool/shovel/etool,
- /obj/item/tool/shovel/etool,
- )
-
-/datum/campaign_reward/equipment/mech_heavy
- name = "Heavy combat mech"
- desc = "One heavy combat mech."
- detailed_desc = "Your battalion has been assigned a single Vanguard heavy combat mech. The Vanguard has extreme durability and offensive capability. Able to wade through the thickest of fighting with ease, it is the TGMC's premier assault mech, although its speed and maneuverability are somewhat lackluster."
- ui_icon = "heavy_mech"
- uses = 1
- equipment_to_spawn = list(
- /obj/vehicle/sealed/mecha/combat/greyscale/vanguard/noskill,
- /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/heavy_cannon,
- /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser_projector,
- /obj/item/mecha_ammo/vendable/heavycannon,
- /obj/item/mecha_ammo/vendable/heavycannon,
- /obj/item/mecha_ammo/vendable/heavycannon,
- )
-
-//Parent for all bonus role rewards
-/datum/campaign_reward/bonus_job
- ///list of bonus jobs to grant for this reward
- var/list/datum/job/bonus_job_list = list()
-
-/datum/campaign_reward/bonus_job/activated_effect()
- . = ..()
- if(!.)
- return
-
- for(var/job_type in bonus_job_list)
- var/datum/job/bonus_job = SSjob.type_occupations[job_type]
- bonus_job.add_job_positions(bonus_job_list[job_type])
-
- reward_flags |= REWARD_ACTIVE
-
- RegisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_MISSION_ENDED, TYPE_PROC_REF(/datum/campaign_reward, deactivate), override = TRUE) //you could use this multiple times per mission
-
-///Removes the job slots once the mission is over
-/datum/campaign_reward/bonus_job/deactivate()
- . = ..()
- for(var/job_type in bonus_job_list)
- var/datum/job/bonus_job = SSjob.type_occupations[job_type]
- bonus_job.set_job_positions(0)
-
-/datum/campaign_reward/bonus_job/colonial_militia
- name = "Colonial militia support"
- desc = "A colonial militia squad to augment our forces"
- detailed_desc = "A large number of militia job slots are opened at no attrition cost. \
- A local colonial militia sympathetic to our cause has offered a squad to support our troops. Equipped with lesser arms and armor than our own troops, but fairly numerous."
- ui_icon = "militia"
- bonus_job_list = list(
- /datum/job/som/mercenary/militia/leader = 1,
- /datum/job/som/mercenary/militia/medic = 2,
- /datum/job/som/mercenary/militia/standard = 9,
- )
-
-//TODO: create new jobs
-/datum/campaign_reward/bonus_job/freelancer
- name = "Freelancer team"
- desc = "A squad of freelance guns for hire to support our forces"
- detailed_desc = "A moderate number of freelancer job slots are opened at no attrition cost. \
- A contract has been bought for a squad of freelancers to augment our forces. With comparable equipment and training, they can help turn the tables when our forces are stretched thin."
- ui_icon = "freelancers"
- bonus_job_list = list(
- /datum/job/freelancer/leader/campaign_bonus = 1,
- /datum/job/freelancer/grenadier/campaign_bonus = 2,
- /datum/job/freelancer/medic/campaign_bonus = 1,
- /datum/job/freelancer/standard/campaign_bonus = 5,
- )
-
-/datum/campaign_reward/bonus_job/icc
- name = "ICC strike team"
- desc = "A squad of ICC soldiers to support our forces"
- detailed_desc = "A moderate number of ICC job slots are opened at no attrition cost. \
- The ICC have authorised a small, local detachment of their troops to aid us in our conflict. They are well armed and armored, and could prove a valuable advantage in a fight."
- ui_icon = "icc"
- bonus_job_list = list(
- /datum/job/icc/leader/campaign_bonus = 1,
- /datum/job/icc/guard/campaign_bonus = 2,
- /datum/job/icc/medic/campaign_bonus = 1,
- /datum/job/icc/standard/campaign_bonus = 6,
- )
-
-/datum/campaign_reward/bonus_job/pmc
- name = "PMC security detail"
- desc = "An elite PMC team to assist in a joint operation"
- detailed_desc = "A small number of PMC job slots are opened at no attrition cost. \
- NanoTrasen have authorised a small team of their PMC contractors to assist us in combat. With superior arms and armor, they a powerful tactical asset."
- ui_icon = "pmc"
- bonus_job_list = list(
- /datum/job/pmc/leader/campaign_bonus = 1,
- /datum/job/pmc/gunner/campaign_bonus = 2,
- /datum/job/pmc/standard/campaign_bonus = 4,
- )
-
-/datum/campaign_reward/bonus_job/combat_robots
- name = "Combat robots"
- desc = "A shipment of combat robots to bolster your forces"
- detailed_desc = "A four combat robot job slots are opened at no attrition cost. \
- Combat robots are tough to kill, being immune to pain and chemicals, and resist both fire and radiation. They suffer from low mobility however."
- ui_icon = "combat_robots"
- cost = 6
- bonus_job_list = list(
- /datum/job/terragov/squad/standard/campaign_robot = 4,
- )
-
-//Parent for all passive attrition modifiers
-/datum/campaign_reward/attrition_modifier
- reward_flags = REWARD_PASSIVE_EFFECT|REWARD_ACTIVE
- ///Modifier to faction passive attrition gain
- var/attrition_mod = 0
-
-/datum/campaign_reward/attrition_modifier/passive_effect()
- . = ..()
- faction.attrition_gain_multiplier += attrition_mod
-
-/datum/campaign_reward/attrition_modifier/remove_passive_effect()
- faction.attrition_gain_multiplier -= attrition_mod
- reward_flags |= REWARD_CONSUMED
-
-/datum/campaign_reward/attrition_modifier/Destroy(force, ...)
- if(!(reward_flags & REWARD_CONSUMED))
- remove_passive_effect()
- return ..()
-
-/datum/campaign_reward/attrition_modifier/bonus_standard
- name = "Improved supply lines"
- desc = "+20% passive Attrition Point gain"
- detailed_desc = "Improved supply lines allow for the smooth transfer of men and materiel, allowing for the deployment of more combat forces."
- attrition_mod = 0.2
- ui_icon = "logistics_buff"
-
-/datum/campaign_reward/attrition_modifier/malus_standard
- name = "Degraded supply lines"
- desc = "-20% passive Attrition Point gain"
- detailed_desc = "Damage to our supply lines have increased the difficulty and time required to move men and materiel, resulting in a lower deployment of combat forces."
- attrition_mod = -0.2
- ui_icon = "logistics_malus"
- reward_flags = REWARD_PASSIVE_EFFECT|REWARD_DEBUFF
-
-/datum/campaign_reward/attrition_modifier/malus_teleporter
- name = "Bluespace logistics disabled"
- desc = "-20% passive Attrition Point gain"
- detailed_desc = "The loss of our teleporter arrays has increased the difficulty and time required to move men and materiel, resulting in a lower deployment of combat forces."
- attrition_mod = -0.2
- ui_icon = "bluespace_logistics_malus"
- reward_flags = REWARD_PASSIVE_EFFECT|REWARD_DEBUFF
-
-/datum/campaign_reward/teleporter_disabled
- name = "Teleporter Array disabled"
- desc = "Teleporter Array has been permenantly disabled"
- detailed_desc = "The Bluespace drive powering all Teleporter Arrays in the conflict zone has been destroyed, rending all Teleporter Arrays inoperable. You'll have to deploy the old fashion way from here on out."
- reward_flags = REWARD_IMMEDIATE_EFFECT|REWARD_DEBUFF
- ui_icon = "tele_broken"
-
-/datum/campaign_reward/teleporter_disabled/immediate_effect()
- for(var/obj/structure/teleporter_array/teleporter AS in GLOB.teleporter_arrays)
- if(teleporter.faction != faction.faction)
- continue
- teleporter.teleporter_status = TELEPORTER_ARRAY_INOPERABLE
- to_chat(faction.faction_leader, span_warning("Error: The Teleporter Array has been rendered permanently inoperable."))
- return
-
-/datum/campaign_reward/teleporter_charges
- name = "Delegated Teleporter Array access"
- desc = "+2 uses of the Teleporter Array"
- detailed_desc = "Central command have allocated the battalion with two additional uses of the Teleporter Array. Its extremely costly to run and demand is high across the conflict zone, so make them count."
- ui_icon = "tele_uses"
- uses = 3
- cost = 6
-
-/datum/campaign_reward/teleporter_charges/activated_effect()
- . = ..()
- if(!.)
- return
-
- for(var/obj/structure/teleporter_array/teleporter AS in GLOB.teleporter_arrays)
- if(teleporter.faction != faction.faction)
- continue
- teleporter.charges ++
- to_chat(faction.faction_leader, span_warning("An additional activation of the Teleporter Array is now ready for use."))
- return
-
-/datum/campaign_reward/teleporter_enabled
- name = "Enable Teleporter Array"
- desc = "Enables the use of the Teleporter Array for the current or next mission"
- detailed_desc = "Established a link between our Teleporter Array and its master Bluespace drive, allowing its operation during the current or next mission."
- ui_icon = "tele_enabled"
- uses = 2
- cost = 5
- reward_flags = REWARD_ACTIVATED_EFFECT|REWARD_ACTIVE_MISSION_ONLY
-
-/datum/campaign_reward/teleporter_enabled/activated_effect()
- var/obj/structure/teleporter_array/friendly_teleporter
- for(var/obj/structure/teleporter_array/teleporter AS in GLOB.teleporter_arrays)
- if(teleporter.faction != faction.faction)
- continue
- if(teleporter.teleporter_status == TELEPORTER_ARRAY_INOPERABLE)
- to_chat(faction.faction_leader, span_warning("The Teleporter Array has been permanently disabled due to the destruction of the linked Bluespace drive."))
- return
- friendly_teleporter = teleporter
- break
- if(!friendly_teleporter)
- CRASH("no teleporter found")
- . = ..()
- if(!.)
- return
-
- friendly_teleporter.teleporter_status = TELEPORTER_ARRAY_READY
- to_chat(faction.faction_leader, span_warning("Teleporter Array powered up. Link to Bluespace drive confirmed. Ready for teleportation."))
- reward_flags |= REWARD_ACTIVE
- RegisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_MISSION_ENDED, TYPE_PROC_REF(/datum/campaign_reward, deactivate))
-
-/datum/campaign_reward/droppod_refresh
- name = "Rearm drop pod bays"
- desc = "replace all used drop pods"
- detailed_desc = "Replace all drop pods that have been previously deployed with refurbished units or ones from fleet storage, ready for immediate use."
- ui_icon = "droppod_refresh"
- uses = 1
- cost = 10
-
-/datum/campaign_reward/droppod_refresh/activated_effect()
- . = ..()
- if(!.)
- return
-
- for(var/obj/structure/drop_pod_launcher/launcher AS in GLOB.droppod_bays)
- launcher.refresh_pod()
- to_chat(faction.faction_leader, span_warning("All drop pods have been restocked."))
- return
-
-/datum/campaign_reward/droppod_enabled
- name = "Enable drop pods"
- desc = "Enables the use of drop pods for the current or next mission"
- detailed_desc = "Repositions the ship to allow for orbital drop pod insertion during the current or next mission."
- ui_icon = "droppod_active"
- uses = 3
- cost = 9
- reward_flags = REWARD_ACTIVATED_EFFECT|REWARD_ACTIVE_MISSION_ONLY
-
-/datum/campaign_reward/droppod_enabled/activated_effect()
- var/datum/game_mode/hvh/campaign/mode = SSticker.mode
- var/datum/campaign_mission/current_mission = mode.current_mission
- if(current_mission.mission_flags & MISSION_DISALLOW_DROPPODS)
- to_chat(faction.faction_leader, span_warning("External factors prevent the ship from repositioning at this time. Drop pods unavailable."))
- return
-
- . = ..()
- if(!.)
- return
-
- SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CAMPAIGN_ENABLE_DROPPODS)
- to_chat(faction.faction_leader, span_warning("Ship repositioned, drop pods are now ready for use."))
- reward_flags |= REWARD_ACTIVE
- RegisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_MISSION_ENDED, TYPE_PROC_REF(/datum/campaign_reward, deactivate))
-
-/datum/campaign_reward/droppod_disable
- name = "Disable drop pods"
- desc = "Prevents the enemy from using drop pods in the current or next mission"
- detailed_desc = "Ground to Space weapon systems are activated to prevent TGMC close orbit support ships from positioning themselves for drop pod orbital assaults during the current or next mission."
- ui_icon = "droppod_broken"
- uses = 2
- reward_flags = REWARD_ACTIVATED_EFFECT|REWARD_ACTIVE_MISSION_ONLY
-
-/datum/campaign_reward/droppod_disable/activated_effect()
- var/datum/game_mode/hvh/campaign/mode = SSticker.mode
- var/datum/campaign_mission/current_mission = mode.current_mission
- if(current_mission.mission_flags & MISSION_DISALLOW_DROPPODS)
- to_chat(faction.faction_leader, span_warning("Enemy drop pods already unable to deploy during this mission."))
- return
-
- . = ..()
- if(!.)
- return
-
- current_mission.mission_flags |= MISSION_DISALLOW_DROPPODS
- SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CAMPAIGN_DISABLE_DROPPODS)
- to_chat(faction.faction_leader, span_warning("Orbital deterrence systems activated. Enemy drop pods disabled for this mission."))
-
-/datum/campaign_reward/fire_support
- name = "CAS mission"
- desc = "Close Air Support is deployed to support this mission."
- detailed_desc = "A limited number of Close Air Support attack runs are available via tactical binoculars for this mission. Excellent for disrupting dug in enemy positions."
- ui_icon = "cas"
- uses = 1
- cost = 10
- reward_flags = REWARD_ACTIVATED_EFFECT|REWARD_ACTIVE_MISSION_ONLY
- var/list/fire_support_types = list(
- FIRESUPPORT_TYPE_GUN = 4,
- FIRESUPPORT_TYPE_ROCKETS = 2,
- FIRESUPPORT_TYPE_CRUISE_MISSILE = 1,
- )
-
-/datum/campaign_reward/fire_support/activated_effect()
- var/datum/game_mode/hvh/campaign/mode = SSticker.mode
- var/datum/campaign_mission/current_mission = mode.current_mission
- if(current_mission.mission_flags & MISSION_DISALLOW_FIRESUPPORT)
- to_chat(faction.faction_leader, span_warning("Fire support unavailable during this mission."))
- return
-
- . = ..()
- if(!.)
- return
-
- for(var/firesupport_type in fire_support_types)
- var/datum/fire_support/fire_support_option = GLOB.fire_support_types[firesupport_type]
- fire_support_option.enable_firesupport(fire_support_types[firesupport_type])
-
- reward_flags |= REWARD_ACTIVE
- RegisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_MISSION_ENDED, TYPE_PROC_REF(/datum/campaign_reward, deactivate), override = TRUE) //you could use this multiple times per mission
-
-///Turns off the fire support and resets its uses
-/datum/campaign_reward/fire_support/deactivate()
- . = ..()
- for(var/firesupport_type in fire_support_types)
- var/datum/fire_support/fire_support_option = GLOB.fire_support_types[firesupport_type]
- fire_support_option.disable()
-
-/datum/campaign_reward/fire_support/som_cas
- fire_support_types = list(
- FIRESUPPORT_TYPE_VOLKITE = 3,
- FIRESUPPORT_TYPE_INCEND_ROCKETS = 2,
- FIRESUPPORT_TYPE_RAD_MISSILE = 2,
- )
-
-/datum/campaign_reward/fire_support/mortar
- name = "Mortar support"
- desc = "Mortar teams are activated to provide firesupport for this mission."
- detailed_desc = "A limited number of mortar strikes are available via tactical binoculars for this mission. Excellent for disrupting dug in enemy positions."
- ui_icon = "mortar"
- cost = 6
- fire_support_types = list(
- FIRESUPPORT_TYPE_HE_MORTAR = 6,
- FIRESUPPORT_TYPE_INCENDIARY_MORTAR = 3,
- FIRESUPPORT_TYPE_SMOKE_MORTAR = 2,
- FIRESUPPORT_TYPE_ACID_SMOKE_MORTAR = 2,
- )
-
-/datum/campaign_reward/fire_support/som_mortar
- name = "Mortar support"
- desc = "Mortar teams are activated to provide firesupport for this mission."
- detailed_desc = "A limited number of mortar strikes are available via tactical binoculars for this mission. Excellent for disrupting dug in enemy positions."
- ui_icon = "mortar"
- cost = 6
- fire_support_types = list(
- FIRESUPPORT_TYPE_HE_MORTAR_SOM = 6,
- FIRESUPPORT_TYPE_INCENDIARY_MORTAR_SOM = 3,
- FIRESUPPORT_TYPE_SMOKE_MORTAR_SOM = 2,
- FIRESUPPORT_TYPE_SATRAPINE_SMOKE_MORTAR = 2,
- )
-
-//This is a malus effect, some other active disabling ability may belong to the team doing the disabling
-/datum/campaign_reward/reward_disabler
- name = "REWARD_DISABLER"
- desc = "base type of disabler, you shouldn't see this."
- detailed_desc = "Why can you see this? Report on github."
- uses = 2
- reward_flags = REWARD_IMMEDIATE_EFFECT|REWARD_DEBUFF
- ///The types of rewards disabled
- var/list/types_disabled
- ///Any mission flags that will override this disabler
- var/override_flags = NONE
- ///Rewards currently disabled. Recorded to reenable later
- var/list/types_currently_disabled = list()
-
-/datum/campaign_reward/reward_disabler/activated_effect()
- var/datum/game_mode/hvh/campaign/mode = SSticker.mode
- var/datum/campaign_mission/current_mission = mode.current_mission
- if(current_mission.mission_flags & override_flags) //already disabled, don't need this
- return
-
- . = ..()
- if(!.)
- return
-
- for(var/datum/campaign_reward/reward_type AS in faction.faction_rewards)
- if(reward_type.type in types_disabled)
- reward_type.reward_flags |= REWARD_DISABLED
- types_currently_disabled += reward_type
-
- RegisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_MISSION_ENDED, TYPE_PROC_REF(/datum/campaign_reward, deactivate))
- if(!uses)
- UnregisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_MISSION_LOADED)
- reward_flags &= ~REWARD_DEBUFF
-
-/datum/campaign_reward/reward_disabler/immediate_effect()
- RegisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_MISSION_LOADED, TYPE_PROC_REF(/datum/campaign_reward, activated_effect))
-
-/datum/campaign_reward/reward_disabler/deactivate()
- for(var/datum/campaign_reward/reward_type AS in types_currently_disabled)
- reward_type.reward_flags &= ~REWARD_DISABLED
- types_currently_disabled.Cut()
- UnregisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_MISSION_ENDED)
-
-/datum/campaign_reward/reward_disabler/tgmc_cas
- name = "CAS disabled"
- desc = "CAS fire support temporarily disabled."
- detailed_desc = "Hostile actions have resulted in the temporary loss of our access to close air support"
- ui_icon = "cas_disabled"
- types_disabled = list(/datum/campaign_reward/fire_support)
- override_flags = MISSION_DISALLOW_FIRESUPPORT
-
-/datum/campaign_reward/reward_disabler/som_cas
- name = "CAS disabled"
- desc = "CAS fire support temporarily disabled."
- detailed_desc = "Hostile actions have resulted in the temporary loss of our access to close air support"
- ui_icon = "cas_disabled"
- types_disabled = list(/datum/campaign_reward/fire_support/som_cas)
- override_flags = MISSION_DISALLOW_FIRESUPPORT
-
-/datum/campaign_reward/reward_disabler/tgmc_mortar
- name = "Mortar support disabled"
- desc = "Mortar fire support temporarily disabled."
- detailed_desc = "Hostile actions have resulted in the temporary loss of our access to mortar fire support"
- ui_icon = "mortar_disabled"
- types_disabled = list(/datum/campaign_reward/fire_support/mortar)
- override_flags = MISSION_DISALLOW_FIRESUPPORT
-
-/datum/campaign_reward/reward_disabler/tgmc_mortar/long
- uses = 3
-
-/datum/campaign_reward/reward_disabler/som_mortar
- name = "Mortar support disabled"
- desc = "Mortar fire support temporarily disabled."
- detailed_desc = "Hostile actions have resulted in the temporary loss of our access to mortar fire support"
- ui_icon = "mortar_disabled"
- types_disabled = list(/datum/campaign_reward/fire_support/som_mortar)
- override_flags = MISSION_DISALLOW_FIRESUPPORT
-
-/datum/campaign_reward/reward_disabler/som_mortar/long
- uses = 3
-
-/datum/campaign_reward/reward_disabler/drop_pods
- name = "Drop pods disabled"
- desc = "Drop pod access temporarily disabled."
- detailed_desc = "Hostile actions have resulted in the temporary loss of our access to drop pod deployment"
- ui_icon = "droppod_disabled"
- types_disabled = list(/datum/campaign_reward/droppod_enabled)
- override_flags = MISSION_DISALLOW_DROPPODS
-
-/datum/campaign_reward/reward_disabler/drop_pods
- name = "Teleporter disabled"
- desc = "Teleporter temporarily disabled."
- detailed_desc = "Hostile actions have resulted in the temporary loss of our access to teleporter deployment"
- ui_icon = "tele_disabled"
- types_disabled = list(/datum/campaign_reward/teleporter_enabled)
diff --git a/code/datums/gamemodes/campaign/faction_stats.dm b/code/datums/gamemodes/campaign/faction_stats.dm
deleted file mode 100644
index 6aed8a75e9b28..0000000000000
--- a/code/datums/gamemodes/campaign/faction_stats.dm
+++ /dev/null
@@ -1,357 +0,0 @@
-///Default assets a faction starts with
-GLOBAL_LIST_INIT(campaign_default_assets, list(
- FACTION_TERRAGOV = list(
- /datum/campaign_reward/equipment/mech_heavy,
- /datum/campaign_reward/bonus_job/freelancer,
- /datum/campaign_reward/fire_support,
- /datum/campaign_reward/droppod_refresh,
- /datum/campaign_reward/droppod_enabled,
- ),
- FACTION_SOM = list(
- /datum/campaign_reward/equipment/mech_heavy,
- /datum/campaign_reward/bonus_job/colonial_militia,
- /datum/campaign_reward/fire_support/som_cas,
- /datum/campaign_reward/teleporter_charges,
- /datum/campaign_reward/teleporter_enabled,
- ),
-))
-///Default assets a faction can purchase
-GLOBAL_LIST_INIT(campaign_default_purchasable_assets, list(
- FACTION_TERRAGOV = list(
- /datum/campaign_reward/fire_support,
- /datum/campaign_reward/fire_support/mortar,
- /datum/campaign_reward/droppod_refresh,
- /datum/campaign_reward/droppod_enabled,
- /datum/campaign_reward/equipment/power_armor,
- /datum/campaign_reward/bonus_job/combat_robots,
- /datum/campaign_reward/equipment/medkit_basic,
- /datum/campaign_reward/equipment/materials_pack,
- ),
- FACTION_SOM = list(
- /datum/campaign_reward/fire_support/som_cas,
- /datum/campaign_reward/fire_support/som_mortar,
- /datum/campaign_reward/teleporter_charges,
- /datum/campaign_reward/teleporter_enabled,
- /datum/campaign_reward/equipment/gorgon_armor,
- /datum/campaign_reward/equipment/medkit_basic,
- /datum/campaign_reward/equipment/materials_pack,
- ),
-))
-///The weighted potential mission pool by faction
-GLOBAL_LIST_INIT(campaign_mission_pool, list(
- FACTION_TERRAGOV = list(
- /datum/campaign_mission/tdm = 10,
- /datum/campaign_mission/tdm/lv624= 10,
- /datum/campaign_mission/tdm/desparity= 10,
- /datum/campaign_mission/destroy_mission/fire_support_raid= 10,
- /datum/campaign_mission/capture_mission= 10,
- /datum/campaign_mission/tdm/mech_wars= 10,
- ),
- FACTION_SOM = list(
- /datum/campaign_mission/tdm = 10,
- /datum/campaign_mission/tdm/lv624= 10,
- /datum/campaign_mission/tdm/desparity= 10,
- /datum/campaign_mission/destroy_mission/fire_support_raid= 10,
- /datum/campaign_mission/capture_mission= 10,
- /datum/campaign_mission/tdm/mech_wars= 10,
- ),
-))
-
-/datum/faction_stats
- interaction_flags = INTERACT_UI_INTERACT
- ///The faction associated with these stats
- var/faction
- ///The decision maker for this leader
- var/mob/faction_leader
- ///Victory points earned by this faction
- var/victory_points = 0
- ///Dictates how many respawns this faction has access to overall
- var/total_attrition_points = 30
- ///How many attrition points have been dedicated to the current mission
- var/active_attrition_points = 0
- ///Multiplier on the passive attrition point gain for this faction
- var/attrition_gain_multiplier = 1
- ///Future missions this faction can currently choose from
- var/list/datum/campaign_mission/available_missions = list()
- ///Missions this faction has succesfully completed
- var/list/datum/campaign_mission/finished_missions = list()
- ///List of all rewards the faction has earnt this campaign
- var/list/datum/campaign_reward/faction_rewards = list()
- ///List of all rewards the faction can currently purchase
- var/list/datum/campaign_reward/purchasable_rewards = list()
- ///Any special behavior flags for the faction
- var/stats_flags = NONE
-
-/datum/faction_stats/New(new_faction)
- . = ..()
- faction = new_faction
- GLOB.faction_stats_datums[faction] = src
- for(var/asset in GLOB.campaign_default_assets[faction])
- add_reward(asset)
- for(var/asset in GLOB.campaign_default_purchasable_assets[faction])
- purchasable_rewards += asset
- for(var/i = 1 to CAMPAIGN_STANDARD_MISSION_QUANTITY)
- generate_new_mission()
- RegisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_MISSION_ENDED, PROC_REF(mission_end))
-
-/datum/faction_stats/Destroy(force, ...)
- GLOB.faction_stats_datums -= faction
- return ..()
-
-///Randomly adds a new mission to the available pool
-/datum/faction_stats/proc/generate_new_mission()
- if(length(available_missions) >= CAMPAIGN_STANDARD_MISSION_QUANTITY)
- return
- var/datum/campaign_mission/selected_mission = pickweight(GLOB.campaign_mission_pool[faction])
- add_new_mission(selected_mission)
- GLOB.campaign_mission_pool[faction] -= selected_mission
-
-///Adds a mission to the available mission pool
-/datum/faction_stats/proc/add_new_mission(datum/campaign_mission/new_mission)
- available_missions[new_mission] = new new_mission(faction)
-
-///Returns the faction's leader, selecting one if none is available
-/datum/faction_stats/proc/get_selector()
- if(!faction_leader || faction_leader.stat != CONSCIOUS || !(faction_leader.client))
- choose_faction_leader()
-
- return faction_leader
-
-///Elects a new faction leader
-/datum/faction_stats/proc/choose_faction_leader()
- faction_leader = null
- var/list/possible_candidates = GLOB.alive_human_list_faction[faction]
- if(!length(possible_candidates))
- return //army of ghosts
-
- var/list/ranks = GLOB.ranked_jobs_by_faction[faction]
- if(ranks)
- var/list/senior_rank_list = list()
- for(var/senior_rank in ranks)
- for(var/mob/living/carbon/human/candidate AS in possible_candidates)
- if(candidate.job.title == senior_rank)
- senior_rank_list += candidate
- if(!length(senior_rank_list))
- senior_rank_list.Cut()
- continue
- faction_leader = pick(senior_rank_list)
-
- if(!faction_leader)
- faction_leader = pick(possible_candidates)
-
- //add some sound effect and maybe a map text thing
- to_chat(faction_leader, span_highdanger("You have been promoted to the role of commander for your faction. It is your responsibility to determine your side's course of action, and how to best utilise the resources at your disposal."))
-
-///Adds a new reward to the faction for use
-/datum/faction_stats/proc/add_reward(datum/campaign_reward/new_reward)
- if(faction_rewards[new_reward]) //todo: should passive/instant rewards reproc? probably
- var/datum/campaign_reward/existing_reward = faction_rewards[new_reward]
- existing_reward.uses += initial(existing_reward.uses)
- existing_reward.reward_flags &= ~REWARD_CONSUMED
- else
- faction_rewards[new_reward] = new new_reward(src)
-
-///handles post mission wrap up for the faction
-/datum/faction_stats/proc/mission_end(datum/source, winning_faction)
- SIGNAL_HANDLER
- if(faction == winning_faction)
- stats_flags |= MISSION_SELECTION_ALLOWED
- else
- stats_flags &= ~MISSION_SELECTION_ALLOWED
-
- total_attrition_points += round(length(GLOB.clients) * 0.5 * attrition_gain_multiplier)
- for(var/mob/living/carbon/human/human_mob AS in GLOB.alive_human_list_faction[faction])
- human_mob.revive(TRUE)
- human_mob.forceMove(pick(GLOB.spawns_by_job[human_mob.job.type]))
- var/obj/item/card/id/user_id = human_mob.get_idcard()
- if(user_id)
- user_id.can_buy_loadout = TRUE //they can buy a new loadout if they want
-
- addtimer(CALLBACK(src, PROC_REF(get_selector)), AFTER_MISSION_LEADER_DELAY) //if the leader died, we load a new one after a minute to give respawns some time
-
-//UI stuff//
-
-/datum/faction_stats/ui_interact(mob/living/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(ui)
- return
- ui = new(user, src, "CampaignMenu")
- ui.open()
-
-/datum/faction_stats/ui_state(mob/user)
- return GLOB.conscious_state
-
-/datum/faction_stats/ui_data(mob/living/user)
- . = ..()
- var/datum/game_mode/hvh/campaign/current_mode = SSticker.mode
- if(!istype(current_mode))
- CRASH("campaign_mission loaded without campaign game mode")
-
- var/list/data = list()
- var/ui_theme
- switch(faction)
- if(FACTION_SOM)
- ui_theme = "som"
- else
- ui_theme = "ntos"
- data["ui_theme"] = ui_theme
-
- //complex ones
- var/list/current_mission_data = list()
- var/datum/campaign_mission/current_mission = current_mode.current_mission
- current_mission_data["name"] = current_mission.name
- current_mission_data["map_name"] = current_mission.map_name
- current_mission_data["starting_faction"] = current_mission.starting_faction
- current_mission_data["hostile_faction"] = current_mission.hostile_faction
- current_mission_data["winning_faction"] = current_mission.winning_faction
- current_mission_data["outcome"] = current_mission.outcome
- current_mission_data["objective_description"] = (faction == current_mission.starting_faction ? current_mission.starting_faction_objective_description : current_mission.hostile_faction_objective_description)
- current_mission_data["mission_brief"] = (faction == current_mission.starting_faction ? current_mission.starting_faction_mission_brief : current_mission.hostile_faction_mission_brief)
- current_mission_data["mission_rewards"] = (faction == current_mission.starting_faction ? current_mission.starting_faction_additional_rewards : current_mission.hostile_faction_additional_rewards)
- data["current_mission"] = current_mission_data
-
- var/list/available_missions_data = list()
- for(var/i in available_missions)
- var/datum/campaign_mission/potential_mission = available_missions[i]
- var/list/mission_data = list() //each relevant bit of info regarding the mission is added to the list. Many more to come
- mission_data["typepath"] = "[potential_mission.type]"
- mission_data["name"] = potential_mission.name
- mission_data["map_name"] = potential_mission.map_name
- mission_data["objective_description"] = potential_mission.starting_faction_objective_description
- mission_data["mission_brief"] = potential_mission.starting_faction_mission_brief
- mission_data["mission_rewards"] = potential_mission.starting_faction_additional_rewards
- available_missions_data += list(mission_data)
- data["available_missions"] = available_missions_data
-
- var/list/finished_missions_data = list()
- for(var/datum/campaign_mission/finished_mission AS in finished_missions)
- var/list/mission_data = list() //each relevant bit of info regarding the mission is added to the list. Many more to come
- mission_data["name"] = finished_mission.name
- mission_data["map_name"] = finished_mission.map_name
- mission_data["starting_faction"] = finished_mission.starting_faction
- mission_data["hostile_faction"] = finished_mission.hostile_faction
- mission_data["winning_faction"] = finished_mission.winning_faction
- mission_data["outcome"] = finished_mission.outcome
- mission_data["objective_description"] = (faction == finished_mission.starting_faction ? finished_mission.starting_faction_objective_description : finished_mission.hostile_faction_objective_description)
- mission_data["mission_brief"] = (faction == finished_mission.starting_faction ? finished_mission.starting_faction_mission_brief : finished_mission.hostile_faction_mission_brief)
- mission_data["mission_rewards"] = (faction == finished_mission.starting_faction ? finished_mission.starting_faction_additional_rewards : finished_mission.hostile_faction_additional_rewards)
- finished_missions_data += list(mission_data)
- data["finished_missions"] = finished_missions_data
-
- var/list/faction_rewards_data = list()
- for(var/i in faction_rewards)
- var/datum/campaign_reward/reward = faction_rewards[i]
- var/list/reward_data = list() //each relevant bit of info regarding the reward is added to the list. Many more to come
- reward_data["name"] = reward.name
- reward_data["type"] = "[reward.type]"
- reward_data["desc"] = reward.desc
- reward_data["detailed_desc"] = reward.detailed_desc
- reward_data["uses_remaining"] = reward.uses
- reward_data["uses_original"] = initial(reward.uses)
- reward_data["icon"] = (reward.ui_icon)
- reward_data["currently_active"] = !!(reward.reward_flags & REWARD_ACTIVE)
- reward_data["is_debuff"] = !!(reward.reward_flags & REWARD_DEBUFF)
- faction_rewards_data += list(reward_data)
- data["faction_rewards_data"] = faction_rewards_data
-
- var/list/purchasable_rewards_data = list()
- for(var/datum/campaign_reward/reward AS in purchasable_rewards)
- var/list/reward_data = list()
- reward_data["name"] = initial(reward.name)
- reward_data["type"] = initial(reward)
- reward_data["desc"] = initial(reward.desc)
- reward_data["detailed_desc"] = initial(reward.detailed_desc)
- reward_data["uses_remaining"] = initial(reward.uses)
- reward_data["uses_original"] = initial(reward.uses)
- reward_data["cost"] = initial(reward.cost)
- reward_data["icon"] = initial(reward.ui_icon)
- purchasable_rewards_data += list(reward_data)
- data["purchasable_rewards_data"] = purchasable_rewards_data
-
- //simple ones
- data["active_attrition_points"] = active_attrition_points
- data["total_attrition_points"] = total_attrition_points
- data["faction_leader"] = faction_leader
- data["victory_points"] = victory_points
- data["faction"] = faction
- data["icons"] = GLOB.campaign_icons
-
- return data
-
-/datum/faction_stats/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
- . = ..()
- if(.)
- return
-
- var/datum/game_mode/hvh/campaign/current_mode = SSticker.mode
- if(!istype(current_mode))
- CRASH("campaign_mission loaded without campaign game mode")
-
- var/mob/user = usr
- if(user != faction_leader)
- to_chat(user, "Only your faction's commander can do this.")
- return
-
- switch(action)
- if("set_attrition_points")
- if(current_mode.current_mission?.mission_state != MISSION_STATE_NEW)
- to_chat(user, "Current mission already ongoing, unable to assign more personnel at this time.")
- return
- total_attrition_points += active_attrition_points
- active_attrition_points = 0 //reset, you can change your mind up until the mission starts
- var/choice = tgui_input_number(user, "How much manpower would you like to dedicate to this mission?", "Attrition Point selection", 0, total_attrition_points, 0, 60 SECONDS)
- if(!choice)
- choice = 0
- total_attrition_points -= choice
- active_attrition_points = choice
- for(var/mob/living/carbon/human/faction_member AS in GLOB.alive_human_list_faction[faction])
- faction_member.playsound_local(null, 'sound/effects/CIC_order.ogg', 30, 1)
- to_chat(faction_member, "[faction_leader] has assigned [choice] attrition points for the next mission.")
- return TRUE
-
- if("set_next_mission")
- var/new_mission = text2path(params["new_mission"])
- if(!new_mission)
- return
- if(!available_missions[new_mission])
- return
- var/datum/campaign_mission/choice = available_missions[new_mission]
- if(current_mode.current_mission?.mission_state != MISSION_STATE_FINISHED)
- to_chat(user, "Current mission still ongoing!")
- return
- if(!(stats_flags & MISSION_SELECTION_ALLOWED))
- to_chat(user, "The opposing side has the initiative, win a mission to regain it.")
- return
- current_mode.load_new_mission(choice)
- available_missions -= new_mission
- return TRUE
-
- if("activate_reward")
- var/selected_reward = text2path(params["selected_reward"])
- if(!selected_reward)
- return
- if(!faction_rewards[selected_reward])
- return
- var/datum/campaign_reward/choice = faction_rewards[selected_reward]
- if(!choice.activated_effect())
- return
- for(var/mob/living/carbon/human/faction_member AS in GLOB.alive_human_list_faction[faction])
- faction_member.playsound_local(null, 'sound/effects/CIC_order.ogg', 30, 1)
- to_chat(faction_member, "[user] has activated the [choice.name] campaign asset.")
- return TRUE
-
- if("purchase_reward")
- var/datum/campaign_reward/selected_reward = text2path(params["selected_reward"])
- if(!selected_reward)
- return
- if(!(selected_reward in purchasable_rewards))
- return
- if(initial(selected_reward.cost) > total_attrition_points)
- to_chat(user, "[initial(selected_reward.cost) - total_attrition_points] more attrition points required.")
- return
- add_reward(selected_reward)
- total_attrition_points -= initial(selected_reward.cost)
- for(var/mob/living/carbon/human/faction_member AS in GLOB.alive_human_list_faction[faction])
- faction_member.playsound_local(null, 'sound/effects/CIC_order.ogg', 30, 1)
- to_chat(faction_member, "[user] has purchased the [initial(selected_reward.name)] campaign asset.")
- return TRUE
diff --git a/code/datums/gamemodes/campaign/missions/asat_capture.dm b/code/datums/gamemodes/campaign/missions/asat_capture.dm
deleted file mode 100644
index 4438051b125da..0000000000000
--- a/code/datums/gamemodes/campaign/missions/asat_capture.dm
+++ /dev/null
@@ -1,80 +0,0 @@
-//ASAT capture mission
-/datum/campaign_mission/capture_mission/asat
- name = "ASAT capture"
- map_name = "Orion Outpost"
- map_file = '_maps/map_files/Campaign maps/jungle_test/jungle_outpost.dmm'
- max_game_time = 20 MINUTES
- victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(3, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(1, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 1),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 3),
- )
- attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(20, 5),
- MISSION_OUTCOME_MINOR_VICTORY = list(15, 10),
- MISSION_OUTCOME_DRAW = list(10, 10),
- MISSION_OUTCOME_MINOR_LOSS = list(10, 15),
- MISSION_OUTCOME_MAJOR_LOSS = list(5, 20),
- )
-
- starting_faction_mission_brief = "A TGMC ASAT battery has been detected in this location. It forms part if their space defense grid across the planet and so is a valuable installation to them. \
- Although the destruction of this site is unlikely to weaken their space defenses appreciably, \
- the capture of these weapons would provide us with a unique opportunity to bypass parts of their own ship defenses. \
- Capture as many of the weapons as possible so we can put them to proper use."
- hostile_faction_mission_brief = "SOM forces are moving towards one our our ASAT installations in this location. \
- The loss of this installation would weaken our space defense grid which currently guarantees our orbital superiority. \
- Protect the ASAT weapons at all costs. Do not allow them to be destroyed or to fall into enemy hands."
- starting_faction_additional_rewards = "Additional ICC support, ability to counteract TGMC drop pod usage"
- hostile_faction_additional_rewards = "Preserve the ability to use drop pods uncontested"
-
- min_capture_amount = 3
-
-
-/datum/campaign_mission/capture_mission/asat/load_objective_description()
- starting_faction_objective_description = "Major Victory:Capture all [objectives_total] ASAT systems.[min_capture_amount ? " Minor Victory: Capture at least [min_capture_amount] ASAT systems." : ""]"
- hostile_faction_objective_description = "Major Victory:Prevent the capture of all [objectives_total] ASAT systems.[min_capture_amount ? " Minor Victory: Prevent the capture of atleast [min_capture_amount] ASAT systems." : ""]"
-
-/datum/campaign_mission/capture_mission/asat/check_mission_progress()
- if(outcome)
- return TRUE
-
- if(!game_timer)
- return FALSE
-
- if(!max_time_reached && objectives_remaining) //todo: maybe a check in case both teams wipe each other out at the same time...
- return FALSE
-
- if(capture_count["starting_faction"] >= objectives_total)
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_VICTORY]")
- outcome = MISSION_OUTCOME_MAJOR_VICTORY
- else if(min_capture_amount && (capture_count["starting_faction"] >= min_capture_amount))
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_VICTORY]")
- outcome = MISSION_OUTCOME_MINOR_VICTORY
- else if(capture_count["starting_faction"] > 0)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_LOSS]")
- outcome = MISSION_OUTCOME_MINOR_LOSS
- else
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_LOSS]")
- outcome = MISSION_OUTCOME_MAJOR_LOSS
-
- return TRUE
-
-/datum/campaign_mission/capture_mission/asat/apply_major_victory()
- . = ..()
- var/datum/faction_stats/som_team = mode.stat_list[starting_faction]
- som_team.add_reward(/datum/campaign_reward/droppod_disable)
- som_team.add_reward(/datum/campaign_reward/bonus_job/icc)
-
-/datum/campaign_mission/capture_mission/asat/apply_minor_victory()
- . = ..()
- var/datum/faction_stats/som_team = mode.stat_list[starting_faction]
- som_team.add_reward(/datum/campaign_reward/droppod_disable)
-
-/datum/campaign_mission/capture_mission/asat/apply_minor_loss()
- . = ..()
-
-/datum/campaign_mission/capture_mission/asat/apply_major_loss()
- . = ..()
-
diff --git a/code/datums/gamemodes/campaign/missions/base_rescue.dm b/code/datums/gamemodes/campaign/missions/base_rescue.dm
deleted file mode 100644
index 7fccc50905f00..0000000000000
--- a/code/datums/gamemodes/campaign/missions/base_rescue.dm
+++ /dev/null
@@ -1,95 +0,0 @@
-//placeholder
-/datum/campaign_mission/base_rescue
- name = "Combat patrol"
- map_name = "Orion Outpost"
- map_file = '_maps/map_files/Campaign maps/jungle_test/jungle_outpost.dmm'
- starting_faction_objective_description = null
- hostile_faction_objective_description = null
- max_game_time = 20 MINUTES
- victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(3, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(1, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 1),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 3),
- )
- attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(20, 5),
- MISSION_OUTCOME_MINOR_VICTORY = list(15, 10),
- MISSION_OUTCOME_DRAW = list(10, 10),
- MISSION_OUTCOME_MINOR_LOSS = list(10, 15),
- MISSION_OUTCOME_MAJOR_LOSS = list(5, 20),
- )
- starting_faction_mission_brief = null
- hostile_faction_mission_brief = null
- starting_faction_additional_rewards = null
- hostile_faction_additional_rewards = null
-
-/datum/campaign_mission/base_rescue/play_start_intro()
- intro_message = list(
- "starting_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [hostile_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- "hostile_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [starting_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- )
- . = ..()
-
-/datum/campaign_mission/base_rescue/check_mission_progress()
- if(outcome)
- return TRUE
-
- if(!game_timer)
- return
-
- ///pulls the number of both factions, dead or alive
- var/list/player_list = count_humans(count_flags = COUNT_IGNORE_ALIVE_SSD)
- var/num_team_one = length(player_list[1])
- var/num_team_two = length(player_list[2])
- var/num_dead_team_one = length(player_list[3])
- var/num_dead_team_two = length(player_list[4])
-
- if(num_team_two && num_team_one && !max_time_reached)
- return //fighting is ongoing
-
- //major victor for wiping out the enemy, or draw if both sides wiped simultaneously somehow
- if(!num_team_two)
- if(!num_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //everyone died at the same time, no one wins
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_VICTORY]") //starting team wiped the hostile team
- outcome = MISSION_OUTCOME_MAJOR_VICTORY
- return TRUE
-
- if(!num_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_LOSS]") //hostile team wiped the starting team
- outcome = MISSION_OUTCOME_MAJOR_LOSS
- return TRUE
-
- //minor victories for more kills or draw for equal kills
- if(num_dead_team_two > num_dead_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_VICTORY]") //starting team got more kills
- outcome = MISSION_OUTCOME_MINOR_VICTORY
- return TRUE
- if(num_dead_team_one > num_dead_team_two)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_LOSS]") //hostile team got more kills
- outcome = MISSION_OUTCOME_MINOR_LOSS
- return TRUE
-
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //equal number of kills, or any other edge cases
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
-
-//todo: remove these if nothing new is added
-/datum/campaign_mission/base_rescue/apply_major_victory()
- . = ..()
-
-/datum/campaign_mission/base_rescue/apply_minor_victory()
- . = ..()
-
-/datum/campaign_mission/base_rescue/apply_draw()
- winning_faction = pick(starting_faction, hostile_faction)
-
-/datum/campaign_mission/base_rescue/apply_minor_loss()
- . = ..()
-
-/datum/campaign_mission/base_rescue/apply_major_loss()
- . = ..()
diff --git a/code/datums/gamemodes/campaign/missions/comm_uplink.dm b/code/datums/gamemodes/campaign/missions/comm_uplink.dm
deleted file mode 100644
index a7a1a49d436c4..0000000000000
--- a/code/datums/gamemodes/campaign/missions/comm_uplink.dm
+++ /dev/null
@@ -1,95 +0,0 @@
-//placeholder
-/datum/campaign_mission/comm_uplink
- name = "Combat patrol"
- map_name = "Orion Outpost"
- map_file = '_maps/map_files/Campaign maps/jungle_test/jungle_outpost.dmm'
- starting_faction_objective_description = null
- hostile_faction_objective_description = null
- max_game_time = 20 MINUTES
- victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(3, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(1, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 1),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 3),
- )
- attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(20, 5),
- MISSION_OUTCOME_MINOR_VICTORY = list(15, 10),
- MISSION_OUTCOME_DRAW = list(10, 10),
- MISSION_OUTCOME_MINOR_LOSS = list(10, 15),
- MISSION_OUTCOME_MAJOR_LOSS = list(5, 20),
- )
- starting_faction_mission_brief = null
- hostile_faction_mission_brief = null
- starting_faction_additional_rewards = null
- hostile_faction_additional_rewards = null
-
-/datum/campaign_mission/comm_uplink/play_start_intro()
- intro_message = list(
- "starting_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [hostile_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- "hostile_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [starting_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- )
- . = ..()
-
-/datum/campaign_mission/comm_uplink/check_mission_progress()
- if(outcome)
- return TRUE
-
- if(!game_timer)
- return
-
- ///pulls the number of both factions, dead or alive
- var/list/player_list = count_humans(count_flags = COUNT_IGNORE_ALIVE_SSD)
- var/num_team_one = length(player_list[1])
- var/num_team_two = length(player_list[2])
- var/num_dead_team_one = length(player_list[3])
- var/num_dead_team_two = length(player_list[4])
-
- if(num_team_two && num_team_one && !max_time_reached)
- return //fighting is ongoing
-
- //major victor for wiping out the enemy, or draw if both sides wiped simultaneously somehow
- if(!num_team_two)
- if(!num_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //everyone died at the same time, no one wins
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_VICTORY]") //starting team wiped the hostile team
- outcome = MISSION_OUTCOME_MAJOR_VICTORY
- return TRUE
-
- if(!num_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_LOSS]") //hostile team wiped the starting team
- outcome = MISSION_OUTCOME_MAJOR_LOSS
- return TRUE
-
- //minor victories for more kills or draw for equal kills
- if(num_dead_team_two > num_dead_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_VICTORY]") //starting team got more kills
- outcome = MISSION_OUTCOME_MINOR_VICTORY
- return TRUE
- if(num_dead_team_one > num_dead_team_two)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_LOSS]") //hostile team got more kills
- outcome = MISSION_OUTCOME_MINOR_LOSS
- return TRUE
-
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //equal number of kills, or any other edge cases
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
-
-//todo: remove these if nothing new is added
-/datum/campaign_mission/comm_uplink/apply_major_victory()
- . = ..()
-
-/datum/campaign_mission/comm_uplink/apply_minor_victory()
- . = ..()
-
-/datum/campaign_mission/comm_uplink/apply_draw()
- winning_faction = pick(starting_faction, hostile_faction)
-
-/datum/campaign_mission/comm_uplink/apply_minor_loss()
- . = ..()
-
-/datum/campaign_mission/comm_uplink/apply_major_loss()
- . = ..()
diff --git a/code/datums/gamemodes/campaign/missions/destroy_mission.dm b/code/datums/gamemodes/campaign/missions/destroy_mission.dm
deleted file mode 100644
index 59aaf5e0c3d9c..0000000000000
--- a/code/datums/gamemodes/campaign/missions/destroy_mission.dm
+++ /dev/null
@@ -1,134 +0,0 @@
-/////basic destroy stuff mission////////
-/datum/campaign_mission/destroy_mission
- name = "Target Destruction" //(tm)
- map_name = "Ice Caves"
- map_file = '_maps/map_files/icy_caves/icy_caves.dmm'
- max_game_time = 20 MINUTES
- victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(3, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(1, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 1),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 3),
- )
- attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(20, 5),
- MISSION_OUTCOME_MINOR_VICTORY = list(15, 10),
- MISSION_OUTCOME_DRAW = list(10, 10),
- MISSION_OUTCOME_MINOR_LOSS = list(10, 15),
- MISSION_OUTCOME_MAJOR_LOSS = list(5, 20),
- )
- ///Total number of objectives at round start
- var/objectives_total = 3
- ///number of targets destroyed for a minor victory
- var/min_destruction_amount = 2 //placeholder number
- ///How many objectives currently destroyed
- var/objectives_destroyed = 0
- ///Overwatch messages for destroying objectives
- var/list/objective_destruction_messages = list(
- "first" = list(
- "starting_faction" = "First objective destroyed, keep it up!",
- "hostile_faction" = "We've lost an objective, regroup and drive them back!",
- ),
- "second" = list(
- "starting_faction" = "Another objective destroyed, press the advantage!",
- "hostile_faction" = "We've lost another objective, get it together team!",
- ),
- "third" = list(
- "starting_faction" = "Objective down, nice work team!",
- "hostile_faction" = "We've lost another, shore up those defences!",
- ),
- "second_last" = list(
- "starting_faction" = "Scratch another, that's just one to go. Finish them off!",
- "hostile_faction" = "Objective destroyed, protect the last objective at all costs!",
- ),
- "last" = list(
- "starting_faction" = "All objectives destroyed, outstanding!",
- "hostile_faction" = "All objectives destroyed, fallback, fallback!",
- ),
- )
-
-/datum/campaign_mission/destroy_mission/load_mission()
- . = ..()
- RegisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_OBJECTIVE_DESTROYED, PROC_REF(objective_destroyed))
- objectives_total = length(GLOB.campaign_objectives)
- if(!objectives_total)
- CRASH("Destroy mission loaded with no objectives to destroy!")
-
-/datum/campaign_mission/destroy_mission/load_objective_description()
- starting_faction_objective_description = "Major Victory:Destroy all [objectives_total] targets.[min_destruction_amount ? " Minor Victory: Destroy at least [min_destruction_amount] targets." : ""]"
- hostile_faction_objective_description = "Major Victory: Protect all [objectives_total] assets from destruction.[min_destruction_amount ? " Minor Victory: Protect at least [objectives_total - min_destruction_amount + 1] assets." : ""]"
-
-/datum/campaign_mission/destroy_mission/get_status_tab_items(mob/source, list/items)
- . = ..()
-
- items += "Objectives destroyed: [objectives_destroyed]"
- items += ""
- items += "Objectives remaining: [objectives_total - objectives_destroyed]"
- items += ""
-
-/datum/campaign_mission/destroy_mission/end_mission()
- UnregisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_OBJECTIVE_DESTROYED)
- return ..()
-
-/datum/campaign_mission/destroy_mission/check_mission_progress()
- if(outcome)
- return TRUE
-
- if(!game_timer)
- return FALSE
-
- if(!length(GLOB.campaign_objectives))
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_VICTORY]")
- outcome = MISSION_OUTCOME_MAJOR_VICTORY
- return TRUE
-
- if(!max_time_reached) //if there is still time on the clock, game continues UNLESS attacking side is completely spent
- if(mode.stat_list[starting_faction].active_attrition_points)
- return FALSE //attacking team still has more bodies to throw into the fight
- var/list/player_list = count_humans(count_flags = COUNT_IGNORE_ALIVE_SSD)
- if(length(player_list[1]))
- return FALSE //attacking team still has living guys
-
- if(min_destruction_amount && objectives_destroyed >= min_destruction_amount) //Destroyed at least the minimum required
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_VICTORY]")
- outcome = MISSION_OUTCOME_MINOR_VICTORY
- else if(objectives_destroyed > 0) //Destroyed atleast 1 target
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_LOSS]")
- outcome = MISSION_OUTCOME_MINOR_LOSS
- else //Destroyed nothing
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_LOSS]")
- outcome = MISSION_OUTCOME_MAJOR_LOSS
- return TRUE
-
-//todo: remove these if nothing new is added
-/datum/campaign_mission/destroy_mission/apply_major_victory()
- . = ..()
-
-/datum/campaign_mission/destroy_mission/apply_minor_victory()
- . = ..()
-
-/datum/campaign_mission/destroy_mission/apply_minor_loss()
- . = ..()
-
-/datum/campaign_mission/destroy_mission/apply_major_loss()
- . = ..()
-
-///Handles the destruction of an objective
-/datum/campaign_mission/destroy_mission/proc/objective_destroyed(datum/source, atom/destroyed_objective)
- SIGNAL_HANDLER
- objectives_destroyed ++
- var/message_to_play
- if(objectives_destroyed == objectives_total)
- message_to_play = "last"
- else if(objectives_destroyed == objectives_total - 1)
- message_to_play = "second_last"
- else if(objectives_destroyed == 1)
- message_to_play = "first"
- else if(objectives_destroyed == 2)
- message_to_play = "second"
- else //catch all if a mission has a million objectives
- message_to_play = "third"
-
- map_text_broadcast(starting_faction, objective_destruction_messages[message_to_play]["starting_faction"], "[destroyed_objective] destroyed")
- map_text_broadcast(hostile_faction, objective_destruction_messages[message_to_play]["hostile_faction"], "[destroyed_objective] destroyed")
diff --git a/code/datums/gamemodes/campaign/missions/final_mission.dm b/code/datums/gamemodes/campaign/missions/final_mission.dm
deleted file mode 100644
index df4862b72b5f6..0000000000000
--- a/code/datums/gamemodes/campaign/missions/final_mission.dm
+++ /dev/null
@@ -1,96 +0,0 @@
-//placeholder
-/datum/campaign_mission/final_mission
- name = "Combat patrol"
- map_name = "Orion Outpost"
- map_file = '_maps/map_files/Campaign maps/jungle_test/jungle_outpost.dmm'
- starting_faction_objective_description = null
- hostile_faction_objective_description = null
- max_game_time = 20 MINUTES
- victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(3, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(1, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 1),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 3),
- )
- attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(20, 5),
- MISSION_OUTCOME_MINOR_VICTORY = list(15, 10),
- MISSION_OUTCOME_DRAW = list(10, 10),
- MISSION_OUTCOME_MINOR_LOSS = list(10, 15),
- MISSION_OUTCOME_MAJOR_LOSS = list(5, 20),
- )
-
- starting_faction_mission_brief = null
- hostile_faction_mission_brief = null
- starting_faction_additional_rewards = null
- hostile_faction_additional_rewards = null
-
-/datum/campaign_mission/final_mission/play_start_intro()
- intro_message = list(
- "starting_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [hostile_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- "hostile_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [starting_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- )
- . = ..()
-
-/datum/campaign_mission/final_mission/check_mission_progress()
- if(outcome)
- return TRUE
-
- if(!game_timer)
- return
-
- ///pulls the number of both factions, dead or alive
- var/list/player_list = count_humans(count_flags = COUNT_IGNORE_ALIVE_SSD)
- var/num_team_one = length(player_list[1])
- var/num_team_two = length(player_list[2])
- var/num_dead_team_one = length(player_list[3])
- var/num_dead_team_two = length(player_list[4])
-
- if(num_team_two && num_team_one && !max_time_reached)
- return //fighting is ongoing
-
- //major victor for wiping out the enemy, or draw if both sides wiped simultaneously somehow
- if(!num_team_two)
- if(!num_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //everyone died at the same time, no one wins
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_VICTORY]") //starting team wiped the hostile team
- outcome = MISSION_OUTCOME_MAJOR_VICTORY
- return TRUE
-
- if(!num_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_LOSS]") //hostile team wiped the starting team
- outcome = MISSION_OUTCOME_MAJOR_LOSS
- return TRUE
-
- //minor victories for more kills or draw for equal kills
- if(num_dead_team_two > num_dead_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_VICTORY]") //starting team got more kills
- outcome = MISSION_OUTCOME_MINOR_VICTORY
- return TRUE
- if(num_dead_team_one > num_dead_team_two)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_LOSS]") //hostile team got more kills
- outcome = MISSION_OUTCOME_MINOR_LOSS
- return TRUE
-
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //equal number of kills, or any other edge cases
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
-
-//todo: remove these if nothing new is added
-/datum/campaign_mission/final_mission/apply_major_victory()
- . = ..()
-
-/datum/campaign_mission/final_mission/apply_minor_victory()
- . = ..()
-
-/datum/campaign_mission/final_mission/apply_draw()
- winning_faction = pick(starting_faction, hostile_faction)
-
-/datum/campaign_mission/final_mission/apply_minor_loss()
- . = ..()
-
-/datum/campaign_mission/final_mission/apply_major_loss()
- . = ..()
diff --git a/code/datums/gamemodes/campaign/missions/fire_support_raid.dm b/code/datums/gamemodes/campaign/missions/fire_support_raid.dm
deleted file mode 100644
index 40c9843f0f933..0000000000000
--- a/code/datums/gamemodes/campaign/missions/fire_support_raid.dm
+++ /dev/null
@@ -1,62 +0,0 @@
-//disabling some of the enemy's firesupport options
-/datum/campaign_mission/destroy_mission/fire_support_raid
- name = "Fire support raid"
- map_name = "Lunar base BD-832"
- map_file = '_maps/map_files/Campaign maps/jungle_test/jungle_outpost.dmm'
- objectives_total = 5
- min_destruction_amount = 3
- max_game_time = 20 MINUTES
- victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(3, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(1, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 1),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 3),
- )
- attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(20, 5),
- MISSION_OUTCOME_MINOR_VICTORY = list(15, 10),
- MISSION_OUTCOME_DRAW = list(10, 10),
- MISSION_OUTCOME_MINOR_LOSS = list(10, 15),
- MISSION_OUTCOME_MAJOR_LOSS = list(5, 20),
- )
-
- starting_faction_additional_rewards = "Severely degrade enemy fire support options in the future"
- hostile_faction_additional_rewards = "Protect our fire support options so they can still be used in the future"
-
-/datum/campaign_mission/destroy_mission/fire_support_raid/play_start_intro()
- intro_message = list(
- "starting_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Locate and destroy all [objectives_total] [hostile_faction] fire support installations before further [hostile_faction] reinforcements can arrive. Good hunting!",
- "hostile_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Protect all [objectives_total] fire support installations until reinforcements arrive. Eliminate all [starting_faction] forces and secure the area.",
- )
- return ..()
-
-/datum/campaign_mission/destroy_mission/load_mission_brief()
- starting_faction_mission_brief = "A [hostile_faction] fire support position has been identified in this area. This key location provides fire support to [hostile_faction] forces across the region. \
- By destroying this outpost we can silence their guns and greatly weaken the enemy's forces. \
- Move quickly and destroy all fire support installations before they have time to react."
- hostile_faction_mission_brief = "[starting_faction] forces have been detected moving against our fire support installation in this area. \
- Repel the enemy and protect the installations until reinforcements can arrive. \
- Loss of these fire support installations will significantly weaken our forces across this region."
-
-/datum/campaign_mission/destroy_mission/fire_support_raid/apply_major_victory()
- . = ..()
- var/datum/faction_stats/hostile_team = mode.stat_list[hostile_faction]
- if(hostile_faction == FACTION_TERRAGOV)
- hostile_team.add_reward(/datum/campaign_reward/reward_disabler/tgmc_mortar/long)
- else if(hostile_faction == FACTION_SOM)
- hostile_team.add_reward(/datum/campaign_reward/reward_disabler/som_mortar/long)
-
-/datum/campaign_mission/destroy_mission/fire_support_raid/apply_minor_victory()
- . = ..()
- var/datum/faction_stats/hostile_team = mode.stat_list[hostile_faction]
- if(hostile_faction == FACTION_TERRAGOV)
- hostile_team.add_reward(/datum/campaign_reward/reward_disabler/tgmc_mortar)
- else if(hostile_faction == FACTION_SOM)
- hostile_team.add_reward(/datum/campaign_reward/reward_disabler/som_mortar)
-
-/datum/campaign_mission/destroy_mission/fire_support_raid/apply_minor_loss()
- . = ..()
-
-/datum/campaign_mission/destroy_mission/fire_support_raid/apply_major_loss()
- . = ..()
diff --git a/code/datums/gamemodes/campaign/missions/loot_capture.dm b/code/datums/gamemodes/campaign/missions/loot_capture.dm
deleted file mode 100644
index 18ae9148ab97d..0000000000000
--- a/code/datums/gamemodes/campaign/missions/loot_capture.dm
+++ /dev/null
@@ -1,145 +0,0 @@
-//Loot capture mission
-/datum/campaign_mission/capture_mission
- name = "Capture mission"
- map_name = "Jungle outpost SR-422"
- map_file = '_maps/map_files/Campaign maps/jungle_test/jungle_outpost.dmm'
- map_traits = list(ZTRAIT_AWAY = TRUE, ZTRAIT_RAIN = TRUE)
- map_light_colours = list(LIGHT_COLOR_PALE_GREEN, LIGHT_COLOR_PALE_GREEN, LIGHT_COLOR_PALE_GREEN, LIGHT_COLOR_PALE_GREEN)
- max_game_time = 20 MINUTES
- mission_flags = MISSION_DISALLOW_DROPPODS
- victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(3, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(1, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 1),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 3),
- )
- attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(20, 5),
- MISSION_OUTCOME_MINOR_VICTORY = list(15, 10),
- MISSION_OUTCOME_DRAW = list(10, 10),
- MISSION_OUTCOME_MINOR_LOSS = list(10, 15),
- MISSION_OUTCOME_MAJOR_LOSS = list(5, 20),
- )
- intro_message = list(
- "starting_faction" = "Locate and extract all phoron crates in the ao before the enemy does.",
- "hostile_faction" = "Locate and extract all phoron crates in the ao before the enemy does.",
- )
- starting_faction_mission_brief = "Hostile forces have been building a stock pile of valuable phoron in this location. \
- Before they have the chance to ship it out, your forces are being sent to intercept and liberate these supplies to hamper the enemy's war effort. \
- Hostile forces will likely be aiming to evacuate as much phoron out of the ao as well. Get to the phoron first and fulton out as much as you can."
- hostile_faction_mission_brief = "Enemy forces are moving to steal a stockpile of valuable phoron. \
- Send in your forces to fulton out the phoron as quickly as possible, before they can get to it first."
- starting_faction_additional_rewards = "Additional supplies for every phoron crate captured"
- hostile_faction_additional_rewards = "Additional supplies for every phoron crate captured"
- ///Total number of objectives at round start
- var/objectives_total = 3
- ///number of targets to capture for a minor victory
- var/min_capture_amount = 10 //placeholder number
- ///How many objectives currently remaining
- var/objectives_remaining = 0
- ///How many objects extracted by each team
- var/list/capture_count = list(
- "starting_faction" = 0,
- "hostile_faction" = 0,
- )
-
-/datum/campaign_mission/capture_mission/load_mission()
- . = ..()
- RegisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_CAPTURE_OBJECTIVE_CAPTURED, PROC_REF(objective_extracted))
- objectives_total = length(GLOB.campaign_objectives)
- objectives_remaining = objectives_total
- if(!objectives_total)
- CRASH("Destroy mission loaded with no objectives to extract!")
-
-/datum/campaign_mission/capture_mission/load_objective_description()
- starting_faction_objective_description = "Major Victory:Capture all [objectives_total] targets.[min_capture_amount ? " Minor Victory: Capture at least [min_capture_amount] targets." : ""]"
- hostile_faction_objective_description = "Major Victory:Capture all [objectives_total] targets.[min_capture_amount ? " Minor Victory: Capture at least [min_capture_amount] targets." : ""]"
-
-/datum/campaign_mission/capture_mission/get_status_tab_items(mob/source, list/items)
- . = ..()
-
- items += "[starting_faction] objectives captured: [capture_count["starting_faction"]]"
- items += "[hostile_faction] objectives captured: [capture_count["hostile_faction"]]"
- items += ""
- items += "Objectives remaining: [objectives_remaining]"
- items += ""
-
-
-/datum/campaign_mission/capture_mission/end_mission()
- UnregisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_CAPTURE_OBJECTIVE_CAPTURED)
- return ..()
-
-/datum/campaign_mission/capture_mission/check_mission_progress()
- if(outcome)
- return TRUE
-
- if(!game_timer)
- return FALSE
-
- if(!max_time_reached && objectives_remaining) //todo: maybe a check in case both teams wipe each other out at the same time...
- return FALSE
-
- if(capture_count["starting_faction"] >= objectives_total)
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_VICTORY]")
- outcome = MISSION_OUTCOME_MAJOR_VICTORY
- else if(capture_count["hostile_faction"] >= objectives_total)
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_LOSS]")
- outcome = MISSION_OUTCOME_MAJOR_LOSS
- else if(min_capture_amount && (capture_count["starting_faction"] >= min_capture_amount))
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_VICTORY]")
- outcome = MISSION_OUTCOME_MINOR_VICTORY
- else if(min_capture_amount && (capture_count["hostile_faction"] >= min_capture_amount))
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_LOSS]")
- outcome = MISSION_OUTCOME_MINOR_LOSS
- else
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]")
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
-
-/datum/campaign_mission/capture_mission/apply_major_victory()
- . = ..()
- objective_reward_bonus()
-
-/datum/campaign_mission/capture_mission/apply_minor_victory()
- . = ..()
- objective_reward_bonus()
-
-/datum/campaign_mission/capture_mission/apply_minor_loss()
- . = ..()
- objective_reward_bonus()
-
-/datum/campaign_mission/capture_mission/apply_major_loss()
- . = ..()
- objective_reward_bonus()
-
-/datum/campaign_mission/capture_mission/apply_draw()
- . = ..()
- objective_reward_bonus()
-
-///Handles the effect of an objective being claimed
-/datum/campaign_mission/capture_mission/proc/objective_extracted(datum/source, obj/structure/campaign_objective/capture_objective/fultonable/objective, mob/living/user)
- SIGNAL_HANDLER
- var/capturing_team
- var/losing_team
- objectives_remaining --
- if(objective.owning_faction == starting_faction)
- capture_count["starting_faction"] ++
- capturing_team = starting_faction
- losing_team = hostile_faction
- else if(objective.owning_faction == hostile_faction)
- capture_count["hostile_faction"] ++
- capturing_team = hostile_faction
- losing_team = starting_faction
-
- map_text_broadcast(capturing_team, "[objective] secured, well done. [objectives_remaining] left in play!", "Objective extracted")
- map_text_broadcast(losing_team, "We've lost a [objective], secure the remaining [objectives_remaining] objectives!", "Objective lost")
-
-///The addition rewards for capturing objectives, regardless of outcome
-/datum/campaign_mission/capture_mission/proc/objective_reward_bonus()
- var/starting_team_bonus = capture_count["starting_faction"] * 5
- var/hostile_team_bonus = capture_count["hostile_faction"] * 5 //todo: maybe a lower reward for the home team here, its supposed to be their supplies after all...
-
- modify_attrition_points(starting_team_bonus, hostile_team_bonus)
- map_text_broadcast(starting_faction, "[starting_team_bonus] bonus attrition points awarded for the capture of [capture_count["starting_faction"]] objectives", "Bonus reward")
- map_text_broadcast(hostile_faction, "[hostile_team_bonus] bonus attrition points awarded for the capture of [capture_count["hostile_faction"]] objectives", "Bonus reward")
diff --git a/code/datums/gamemodes/campaign/missions/mech_wars.dm b/code/datums/gamemodes/campaign/missions/mech_wars.dm
deleted file mode 100644
index bb4bbbd06e595..0000000000000
--- a/code/datums/gamemodes/campaign/missions/mech_wars.dm
+++ /dev/null
@@ -1,93 +0,0 @@
-//mech on mech violence
-/datum/campaign_mission/tdm/mech_wars
- name = "Mech war"
- map_name = "Orion Outpost"
- map_file = '_maps/map_files/Campaign maps/jungle_test/jungle_outpost.dmm'
- starting_faction_objective_description = null
- hostile_faction_objective_description = null
- max_game_time = 20 MINUTES
- victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(3, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(1, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 1),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 3),
- )
- attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(20, 5),
- MISSION_OUTCOME_MINOR_VICTORY = list(15, 10),
- MISSION_OUTCOME_DRAW = list(10, 10),
- MISSION_OUTCOME_MINOR_LOSS = list(10, 15),
- MISSION_OUTCOME_MAJOR_LOSS = list(5, 20),
- )
-
- starting_faction_additional_rewards = "Mechanised units will be allocated to your battalion."
- hostile_faction_additional_rewards = "Mechanised units will be allocated to your battalion."
-
-/datum/campaign_mission/tdm/mech_wars/play_start_intro()
- intro_message = list(
- "starting_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [hostile_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- "hostile_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [starting_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- )
- . = ..()
-
-/datum/campaign_mission/tdm/mech_wars/load_mission_brief()
- . = ..()
- starting_faction_mission_brief = "[hostile_faction] mechanised forces have been identified staging in this region, in advance of a suspected strike against our lines. \
- A heavy mechanised force of our own has been authorised for deployment to crush their forces before they can strike. \
- Unleash the full power of our mechanised units and crush all enemy forces in the ao while preserving your own forces. Good hunting"
- hostile_faction_mission_brief = "A large [starting_faction] mechanised force has been detected enroute towards one of our staging points in this region. \
- Our mechanised forces here are vital to our future plans. The enemy assault has given us a unique opportunity to destroy a significant portion of their mechanised forces with a swift counter attack. \
- Eliminate all hostiles you come across while preserving your own forces. Good hunting."
-
-/datum/campaign_mission/tdm/mech_wars/load_mission()
- . = ..()
- for(var/obj/effect/landmark/campaign/mech_spawner/spawner AS in GLOB.campaign_mech_spawners[starting_faction])
- spawner.spawn_mech()
- for(var/obj/effect/landmark/campaign/mech_spawner/spawner AS in GLOB.campaign_mech_spawners[hostile_faction])
- spawner.spawn_mech()
-
-//todo: proper rewards
-/datum/campaign_mission/tdm/mech_wars/apply_major_victory()
- winning_faction = starting_faction
- var/datum/faction_stats/winning_team = mode.stat_list[starting_faction]
- winning_team.add_reward(/datum/campaign_reward/equipment/mech_heavy)
-
-/datum/campaign_mission/tdm/mech_wars/apply_minor_victory()
- winning_faction = starting_faction
- var/datum/faction_stats/winning_team = mode.stat_list[starting_faction]
- winning_team.add_reward(/datum/campaign_reward/equipment/mech_heavy)
-
-/datum/campaign_mission/tdm/mech_wars/apply_draw()
- winning_faction = hostile_faction
-
-/datum/campaign_mission/tdm/mech_wars/apply_minor_loss()
- winning_faction = hostile_faction
- var/datum/faction_stats/winning_team = mode.stat_list[hostile_faction]
- winning_team.add_reward(/datum/campaign_reward/equipment/mech_heavy)
-
-/datum/campaign_mission/tdm/mech_wars/apply_major_loss()
- winning_faction = hostile_faction
- var/datum/faction_stats/winning_team = mode.stat_list[hostile_faction]
- winning_team.add_reward(/datum/campaign_reward/equipment/mech_heavy)
-
-/obj/effect/landmark/campaign/mech_spawner
- name = "tgmc_mech_spawner"
- icon_state = "mech"
- var/faction = FACTION_TERRAGOV
- var/obj/vehicle/sealed/mecha/combat/greyscale/mech_type = /obj/vehicle/sealed/mecha/combat/greyscale/vanguard/noskill
-
-/obj/effect/landmark/campaign/mech_spawner/Initialize(mapload)
- . = ..()
- GLOB.campaign_mech_spawners[faction] += list(src)
-
-/obj/effect/landmark/campaign/mech_spawner/Destroy()
- GLOB.campaign_mech_spawners[faction] -= src
- return ..()
-
-/obj/effect/landmark/campaign/mech_spawner/proc/spawn_mech()
- new mech_type(loc)
-
-/obj/effect/landmark/campaign/mech_spawner/som
- name = "som_mech_spawner"
- faction = FACTION_SOM
diff --git a/code/datums/gamemodes/campaign/missions/patrol_mission.dm b/code/datums/gamemodes/campaign/missions/patrol_mission.dm
deleted file mode 100644
index 92cddc3e10d27..0000000000000
--- a/code/datums/gamemodes/campaign/missions/patrol_mission.dm
+++ /dev/null
@@ -1,152 +0,0 @@
-/////basic tdm mission - i.e. combat patrol
-/datum/campaign_mission/tdm
- name = "Combat patrol"
- map_name = "Orion Outpost"
- //map_file = '_maps/map_files/Orion_Military_Outpost/orionoutpost.dmm' //testing new map
- map_file = '_maps/map_files/Campaign maps/jungle_test/jungle_outpost.dmm'
- starting_faction_objective_description = "Major Victory: Wipe out all hostiles in the area of operation. Minor Victory: Eliminate more hostiles than you lose."
- hostile_faction_objective_description = "Major Victory: Wipe out all hostiles in the area of operation. Minor Victory: Eliminate more hostiles than you lose."
- max_game_time = 20 MINUTES
- victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(3, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(1, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 1),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 3),
- )
- attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(20, 5),
- MISSION_OUTCOME_MINOR_VICTORY = list(15, 10),
- MISSION_OUTCOME_DRAW = list(10, 10),
- MISSION_OUTCOME_MINOR_LOSS = list(10, 15),
- MISSION_OUTCOME_MAJOR_LOSS = list(5, 20),
- )
-
- starting_faction_mission_brief = "Hostile forces have been attempting to expand the territory under their control in this area.\
- Although this territory is of limited direct strategic value, \
- to prevent them from establishing a permanent presence in the area command has ordered your battalion to execute force recon patrols to locate and eliminate any hostile presence. \
- Eliminate all hostiles you come across while preserving your own forces. Good hunting."
- hostile_faction_mission_brief = "Intelligence indicates that hostile forces are massing for a coordinated push to dislodge us from territory where we are aiming to establish a permanent presence. \
- Your battalion has been issued orders to regroup and counter attack the enemy push before they can make any progress, and kill their ambitions in this region. \
- Eliminate all hostiles you come across while preserving your own forces. Good hunting."
- starting_faction_additional_rewards = "If the enemy force is wiped out entirely, additional supplies can be diverted to your battalion."
- hostile_faction_additional_rewards = "If the enemy force is wiped out entirely, additional supplies can be diverted to your battalion."
-
- major_victory_reward_table = list(
- /obj/effect/supply_drop/medical_basic = 7,
- /obj/effect/supply_drop/marine_sentry = 5,
- /obj/effect/supply_drop/recoilless_rifle = 3,
- /obj/effect/supply_drop/armor_upgrades = 5,
- /obj/effect/supply_drop/mmg = 4,
- /obj/effect/supply_drop/zx_shotgun = 3,
- /obj/effect/supply_drop/minigun = 3,
- /obj/effect/supply_drop/scout = 3,
- )
- minor_victory_reward_table = list(
- /obj/effect/supply_drop/medical_basic = 7,
- /obj/effect/supply_drop/marine_sentry = 5,
- /obj/effect/supply_drop/recoilless_rifle = 3,
- /obj/effect/supply_drop/armor_upgrades = 5,
- /obj/effect/supply_drop/mmg = 4,
- )
- minor_loss_reward_table = list(
- /obj/effect/supply_drop/medical_basic = 7,
- /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/cope = 5,
- /obj/effect/supply_drop/som_rpg = 3,
- /obj/effect/supply_drop/som_armor_upgrades = 5,
- /obj/effect/supply_drop/charger = 4,
- )
- major_loss_reward_table = list(
- /obj/effect/supply_drop/medical_basic = 7,
- /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/cope = 5,
- /obj/effect/supply_drop/som_rpg = 3,
- /obj/effect/supply_drop/som_armor_upgrades = 5,
- /obj/effect/supply_drop/charger = 4,
- /obj/effect/supply_drop/culverin = 3,
- /obj/effect/supply_drop/blink_kit = 3,
- /obj/effect/supply_drop/som_shotgun_burst = 3,
- )
-
-/datum/campaign_mission/tdm/play_start_intro()
- intro_message = list(
- "starting_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [hostile_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- "hostile_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [starting_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- )
- . = ..()
-
-/datum/campaign_mission/tdm/check_mission_progress()
- if(outcome)
- return TRUE
-
- if(!game_timer)
- return
-
- ///pulls the number of both factions, dead or alive
- var/list/player_list = count_humans(count_flags = COUNT_IGNORE_ALIVE_SSD)
- var/num_start_team = length(player_list[1])
- var/num_hostile_team = length(player_list[2])
- var/num_dead_start_team = length(player_list[3])
- var/num_dead_hostile_team = length(player_list[4])
-
- if(num_hostile_team && num_start_team && !max_time_reached)
- return //fighting is ongoing
-
- //major victor for wiping out the enemy, or draw if both sides wiped simultaneously somehow
- if(!num_hostile_team)
- if(!num_start_team)
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //everyone died at the same time, no one wins
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_VICTORY]") //starting team wiped the hostile team
- outcome = MISSION_OUTCOME_MAJOR_VICTORY
- return TRUE
-
- if(!num_start_team)
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_LOSS]") //hostile team wiped the starting team
- outcome = MISSION_OUTCOME_MAJOR_LOSS
- return TRUE
-
- //minor victories for more kills or draw for equal kills
- if(num_dead_hostile_team > num_dead_start_team)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_VICTORY]") //starting team got more kills
- outcome = MISSION_OUTCOME_MINOR_VICTORY
- return TRUE
- if(num_dead_start_team > num_dead_hostile_team)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_LOSS]") //hostile team got more kills
- outcome = MISSION_OUTCOME_MINOR_LOSS
- return TRUE
-
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //equal number of kills, or any other edge cases
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
-
-/datum/campaign_mission/tdm/apply_major_victory()
- . = ..()
- Generate_rewards(3, starting_faction)
-
-/datum/campaign_mission/tdm/apply_minor_victory()
- . = ..()
- Generate_rewards(1, starting_faction)
-
-/datum/campaign_mission/tdm/apply_draw()
- winning_faction = pick(starting_faction, hostile_faction)
-
-/datum/campaign_mission/tdm/apply_minor_loss()
- . = ..()
- Generate_rewards(1, hostile_faction)
-
-/datum/campaign_mission/tdm/apply_major_loss()
- . = ..()
- Generate_rewards(3, hostile_faction)
-
-
-///test missions
-/datum/campaign_mission/tdm/lv624
- name = "Combat patrol 2"
- map_name = "LV-624"
- map_file = '_maps/map_files/LV624/LV624.dmm' //todo: make modulars work with late load
-
-/datum/campaign_mission/tdm/desparity
- name = "Combat patrol 3"
- map_name = "Desparity"
- map_file = '_maps/map_files/desparity/desparity.dmm'
diff --git a/code/datums/gamemodes/campaign/missions/raiding_base.dm b/code/datums/gamemodes/campaign/missions/raiding_base.dm
deleted file mode 100644
index 9d799b3ff9824..0000000000000
--- a/code/datums/gamemodes/campaign/missions/raiding_base.dm
+++ /dev/null
@@ -1,96 +0,0 @@
-//placeholder
-/datum/campaign_mission/raiding_base
- name = "Combat patrol"
- map_name = "Orion Outpost"
- map_file = '_maps/map_files/Campaign maps/jungle_test/jungle_outpost.dmm'
- starting_faction_objective_description = null
- hostile_faction_objective_description = null
- max_game_time = 20 MINUTES
- victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(3, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(1, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 1),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 3),
- )
- attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(20, 5),
- MISSION_OUTCOME_MINOR_VICTORY = list(15, 10),
- MISSION_OUTCOME_DRAW = list(10, 10),
- MISSION_OUTCOME_MINOR_LOSS = list(10, 15),
- MISSION_OUTCOME_MAJOR_LOSS = list(5, 20),
- )
-
- starting_faction_mission_brief = null
- hostile_faction_mission_brief = null
- starting_faction_additional_rewards = null
- hostile_faction_additional_rewards = null
-
-/datum/campaign_mission/raiding_base/play_start_intro()
- intro_message = list(
- "starting_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [hostile_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- "hostile_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [starting_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- )
- . = ..()
-
-/datum/campaign_mission/raiding_base/check_mission_progress()
- if(outcome)
- return TRUE
-
- if(!game_timer)
- return
-
- ///pulls the number of both factions, dead or alive
- var/list/player_list = count_humans(count_flags = COUNT_IGNORE_ALIVE_SSD)
- var/num_team_one = length(player_list[1])
- var/num_team_two = length(player_list[2])
- var/num_dead_team_one = length(player_list[3])
- var/num_dead_team_two = length(player_list[4])
-
- if(num_team_two && num_team_one && !max_time_reached)
- return //fighting is ongoing
-
- //major victor for wiping out the enemy, or draw if both sides wiped simultaneously somehow
- if(!num_team_two)
- if(!num_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //everyone died at the same time, no one wins
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_VICTORY]") //starting team wiped the hostile team
- outcome = MISSION_OUTCOME_MAJOR_VICTORY
- return TRUE
-
- if(!num_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_LOSS]") //hostile team wiped the starting team
- outcome = MISSION_OUTCOME_MAJOR_LOSS
- return TRUE
-
- //minor victories for more kills or draw for equal kills
- if(num_dead_team_two > num_dead_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_VICTORY]") //starting team got more kills
- outcome = MISSION_OUTCOME_MINOR_VICTORY
- return TRUE
- if(num_dead_team_one > num_dead_team_two)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_LOSS]") //hostile team got more kills
- outcome = MISSION_OUTCOME_MINOR_LOSS
- return TRUE
-
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //equal number of kills, or any other edge cases
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
-
-//todo: remove these if nothing new is added
-/datum/campaign_mission/raiding_base/apply_major_victory()
- . = ..()
-
-/datum/campaign_mission/raiding_base/apply_minor_victory()
- . = ..()
-
-/datum/campaign_mission/raiding_base/apply_draw()
- winning_faction = pick(starting_faction, hostile_faction)
-
-/datum/campaign_mission/raiding_base/apply_minor_loss()
- . = ..()
-
-/datum/campaign_mission/raiding_base/apply_major_loss()
- . = ..()
diff --git a/code/datums/gamemodes/campaign/missions/spearhead_assault.dm b/code/datums/gamemodes/campaign/missions/spearhead_assault.dm
deleted file mode 100644
index b1bd2decdb1c0..0000000000000
--- a/code/datums/gamemodes/campaign/missions/spearhead_assault.dm
+++ /dev/null
@@ -1,96 +0,0 @@
-//placeholder
-/datum/campaign_mission/spearhead_assault
- name = "Combat patrol"
- map_name = "Orion Outpost"
- map_file = '_maps/map_files/Campaign maps/jungle_test/jungle_outpost.dmm'
- starting_faction_objective_description = null
- hostile_faction_objective_description = null
- max_game_time = 20 MINUTES
- victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(3, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(1, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 1),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 3),
- )
- attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(20, 5),
- MISSION_OUTCOME_MINOR_VICTORY = list(15, 10),
- MISSION_OUTCOME_DRAW = list(10, 10),
- MISSION_OUTCOME_MINOR_LOSS = list(10, 15),
- MISSION_OUTCOME_MAJOR_LOSS = list(5, 20),
- )
-
- starting_faction_mission_brief = null
- hostile_faction_mission_brief = null
- starting_faction_additional_rewards = null
- hostile_faction_additional_rewards = null
-
-/datum/campaign_mission/spearhead_assault/play_start_intro()
- intro_message = list(
- "starting_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [hostile_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- "hostile_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [starting_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- )
- . = ..()
-
-/datum/campaign_mission/spearhead_assault/check_mission_progress()
- if(outcome)
- return TRUE
-
- if(!game_timer)
- return
-
- ///pulls the number of both factions, dead or alive
- var/list/player_list = count_humans(count_flags = COUNT_IGNORE_ALIVE_SSD)
- var/num_team_one = length(player_list[1])
- var/num_team_two = length(player_list[2])
- var/num_dead_team_one = length(player_list[3])
- var/num_dead_team_two = length(player_list[4])
-
- if(num_team_two && num_team_one && !max_time_reached)
- return //fighting is ongoing
-
- //major victor for wiping out the enemy, or draw if both sides wiped simultaneously somehow
- if(!num_team_two)
- if(!num_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //everyone died at the same time, no one wins
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_VICTORY]") //starting team wiped the hostile team
- outcome = MISSION_OUTCOME_MAJOR_VICTORY
- return TRUE
-
- if(!num_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_LOSS]") //hostile team wiped the starting team
- outcome = MISSION_OUTCOME_MAJOR_LOSS
- return TRUE
-
- //minor victories for more kills or draw for equal kills
- if(num_dead_team_two > num_dead_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_VICTORY]") //starting team got more kills
- outcome = MISSION_OUTCOME_MINOR_VICTORY
- return TRUE
- if(num_dead_team_one > num_dead_team_two)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_LOSS]") //hostile team got more kills
- outcome = MISSION_OUTCOME_MINOR_LOSS
- return TRUE
-
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //equal number of kills, or any other edge cases
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
-
-//todo: remove these if nothing new is added
-/datum/campaign_mission/spearhead_assault/apply_major_victory()
- . = ..()
-
-/datum/campaign_mission/spearhead_assault/apply_minor_victory()
- . = ..()
-
-/datum/campaign_mission/spearhead_assault/apply_draw()
- winning_faction = pick(starting_faction, hostile_faction)
-
-/datum/campaign_mission/spearhead_assault/apply_minor_loss()
- . = ..()
-
-/datum/campaign_mission/spearhead_assault/apply_major_loss()
- . = ..()
diff --git a/code/datums/gamemodes/campaign/missions/supply_raid.dm b/code/datums/gamemodes/campaign/missions/supply_raid.dm
deleted file mode 100644
index 144e3016c5bcb..0000000000000
--- a/code/datums/gamemodes/campaign/missions/supply_raid.dm
+++ /dev/null
@@ -1,96 +0,0 @@
-//placeholder
-/datum/campaign_mission/supply_raid
- name = "Combat patrol"
- map_name = "Orion Outpost"
- map_file = '_maps/map_files/Campaign maps/jungle_test/jungle_outpost.dmm'
- starting_faction_objective_description = null
- hostile_faction_objective_description = null
- max_game_time = 20 MINUTES
- victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(3, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(1, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 1),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 3),
- )
- attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(20, 5),
- MISSION_OUTCOME_MINOR_VICTORY = list(15, 10),
- MISSION_OUTCOME_DRAW = list(10, 10),
- MISSION_OUTCOME_MINOR_LOSS = list(10, 15),
- MISSION_OUTCOME_MAJOR_LOSS = list(5, 20),
- )
-
- starting_faction_mission_brief = null
- hostile_faction_mission_brief = null
- starting_faction_additional_rewards = null
- hostile_faction_additional_rewards = null
-
-/datum/campaign_mission/supply_raid/play_start_intro()
- intro_message = list(
- "starting_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [hostile_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- "hostile_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Eliminate all [starting_faction] resistance in the AO. Reinforcements are limited so preserve your forces as best you can. Good hunting!",
- )
- . = ..()
-
-/datum/campaign_mission/supply_raid/check_mission_progress()
- if(outcome)
- return TRUE
-
- if(!game_timer)
- return
-
- ///pulls the number of both factions, dead or alive
- var/list/player_list = count_humans(count_flags = COUNT_IGNORE_ALIVE_SSD)
- var/num_team_one = length(player_list[1])
- var/num_team_two = length(player_list[2])
- var/num_dead_team_one = length(player_list[3])
- var/num_dead_team_two = length(player_list[4])
-
- if(num_team_two && num_team_one && !max_time_reached)
- return //fighting is ongoing
-
- //major victor for wiping out the enemy, or draw if both sides wiped simultaneously somehow
- if(!num_team_two)
- if(!num_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //everyone died at the same time, no one wins
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_VICTORY]") //starting team wiped the hostile team
- outcome = MISSION_OUTCOME_MAJOR_VICTORY
- return TRUE
-
- if(!num_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_MAJOR_LOSS]") //hostile team wiped the starting team
- outcome = MISSION_OUTCOME_MAJOR_LOSS
- return TRUE
-
- //minor victories for more kills or draw for equal kills
- if(num_dead_team_two > num_dead_team_one)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_VICTORY]") //starting team got more kills
- outcome = MISSION_OUTCOME_MINOR_VICTORY
- return TRUE
- if(num_dead_team_one > num_dead_team_two)
- message_admins("Mission finished: [MISSION_OUTCOME_MINOR_LOSS]") //hostile team got more kills
- outcome = MISSION_OUTCOME_MINOR_LOSS
- return TRUE
-
- message_admins("Mission finished: [MISSION_OUTCOME_DRAW]") //equal number of kills, or any other edge cases
- outcome = MISSION_OUTCOME_DRAW
- return TRUE
-
-//todo: remove these if nothing new is added
-/datum/campaign_mission/supply_raid/apply_major_victory()
- . = ..()
-
-/datum/campaign_mission/supply_raid/apply_minor_victory()
- . = ..()
-
-/datum/campaign_mission/supply_raid/apply_draw()
- winning_faction = pick(starting_faction, hostile_faction)
-
-/datum/campaign_mission/supply_raid/apply_minor_loss()
- . = ..()
-
-/datum/campaign_mission/supply_raid/apply_major_loss()
- . = ..()
diff --git a/code/datums/gamemodes/campaign/missions/teleporter_raid.dm b/code/datums/gamemodes/campaign/missions/teleporter_raid.dm
deleted file mode 100644
index 55d78572128bf..0000000000000
--- a/code/datums/gamemodes/campaign/missions/teleporter_raid.dm
+++ /dev/null
@@ -1,62 +0,0 @@
-//disabling SOM's ability to teleport deploy
-/datum/campaign_mission/destroy_mission/teleporter_raid
- name = "Teleporter control raid"
- map_name = "Lunar base BD-832"
- map_file = '_maps/map_files/Campaign maps/jungle_test/jungle_outpost.dmm'
- map_traits = list(ZTRAIT_AWAY = TRUE, ZTRAIT_GRAVITY = 0.4) //moon gravity
- objectives_total = 1
- min_destruction_amount = 0
- objective_destruction_messages = list(
- "last" = list(
- "starting_faction" = "Bluespace core destroyed, outstanding work marines!",
- "hostile_faction" = "Bluespace core destroyed, mission failed. All forces retreat!",
- ),
- )
- starting_faction_objective_description = "Major Victory: Destroy the SOM Bluespace core at all costs"
- hostile_faction_objective_description = "Major Victory: Protect the Bluespace core at all costs"
- max_game_time = 20 MINUTES
- victory_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(3, 0),
- MISSION_OUTCOME_MINOR_VICTORY = list(1, 0),
- MISSION_OUTCOME_DRAW = list(0, 0),
- MISSION_OUTCOME_MINOR_LOSS = list(0, 1),
- MISSION_OUTCOME_MAJOR_LOSS = list(0, 3),
- )
- attrition_point_rewards = list(
- MISSION_OUTCOME_MAJOR_VICTORY = list(20, 5),
- MISSION_OUTCOME_MINOR_VICTORY = list(15, 10),
- MISSION_OUTCOME_DRAW = list(10, 10),
- MISSION_OUTCOME_MINOR_LOSS = list(10, 15),
- MISSION_OUTCOME_MAJOR_LOSS = list(5, 20),
- )
-
- starting_faction_mission_brief = "Intelligence has pinpointed the SOM's Bluespace core on this remote lunar base. The core powers all SOM teleporter arrays in the system. \
- If we can destroy the core, we'll completely disable the SOM's ability to deploy forces into the field, crippling their mobility. \
- Move quickly and destroy the core at all costs, expect heavy resistance."
- hostile_faction_mission_brief = "Emergency scramble order received: TGMC forces detected enroute to lunar Bluespace core facility. \
- Protect the Bluespace core at all costs, without it all teleporter arrays in the system will be permanently disabled, severely restricting our mobility. \
- Eliminate all TGMC forces you encounter and secure the facility, or hold them off until further reinforcements can arrive."
- starting_faction_additional_rewards = "Permanently disable the SOM's ability to deploy via teleportation and impair their logistic network"
- hostile_faction_additional_rewards = "Additional use of the teleporter array will be granted if the Bluespace core can be protected"
-
-/datum/campaign_mission/destroy_mission/teleporter_raid/play_start_intro()
- intro_message = list(
- "starting_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Locate and destroy the [hostile_faction] Bluespace core before further [hostile_faction] reinforcements can arrive. All other considerations are secondary. Good hunting!",
- "hostile_faction" = "[map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Protect the Bluespace core at all costs! Eliminate all [starting_faction] forces and secure the base, reinforcements are enroute, hold them off until they arrive.",
- )
- . = ..()
-
-/datum/campaign_mission/destroy_mission/teleporter_raid/load_objective_description()
- return
-
-/datum/campaign_mission/destroy_mission/teleporter_raid/apply_major_victory()
- . = ..()
- var/datum/faction_stats/som_team = mode.stat_list[hostile_faction]
- som_team.add_reward(/datum/campaign_reward/teleporter_disabled)
- som_team.add_reward(/datum/campaign_reward/attrition_modifier/malus_teleporter)
-
-/datum/campaign_mission/destroy_mission/teleporter_raid/apply_major_loss()
- . = ..()
- var/datum/faction_stats/som_team = mode.stat_list[hostile_faction]
- som_team.add_reward(/datum/campaign_reward/teleporter_enabled)
- som_team.add_reward(/datum/campaign_reward/teleporter_charges)
diff --git a/code/datums/gamemodes/combat_patrol.dm b/code/datums/gamemodes/combat_patrol.dm
index 8cbc8ae1bbafa..f1604c667d191 100644
--- a/code/datums/gamemodes/combat_patrol.dm
+++ b/code/datums/gamemodes/combat_patrol.dm
@@ -1,12 +1,29 @@
-/datum/game_mode/hvh/combat_patrol
+/datum/game_mode/combat_patrol
name = "Combat Patrol"
config_tag = "Combat Patrol"
flags_round_type = MODE_LATE_OPENING_SHUTTER_TIMER|MODE_TWO_HUMAN_FACTIONS|MODE_HUMAN_ONLY
shutters_drop_time = 3 MINUTES
+ flags_xeno_abilities = ABILITY_CRASH
+ time_between_round = 0 HOURS
+ factions = list(FACTION_TERRAGOV, FACTION_SOM)
+ valid_job_types = list(
+ /datum/job/terragov/squad/engineer = 4,
+ /datum/job/terragov/squad/corpsman = 8,
+ /datum/job/terragov/squad/smartgunner = 4,
+ /datum/job/terragov/squad/leader = 4,
+ /datum/job/terragov/squad/standard = -1,
+ /datum/job/som/squad/leader = 4,
+ /datum/job/som/squad/veteran = 2,
+ /datum/job/som/squad/engineer = 4,
+ /datum/job/som/squad/medic = 8,
+ /datum/job/som/squad/standard = -1,
+ )
+ job_points_needed_by_job_type = list(
+ /datum/job/som/squad/veteran = 5, //Every 5 non vets join, a new vet slot opens
+ )
whitelist_ship_maps = list(MAP_COMBAT_PATROL_BASE)
blacklist_ship_maps = null
blacklist_ground_maps = list(MAP_WHISKEY_OUTPOST, MAP_OSCAR_OUTPOST)
- bioscan_interval = 3 MINUTES
/// Timer used to calculate how long till round ends
var/game_timer
///The length of time until round ends.
@@ -17,23 +34,58 @@
var/wave_timer_length = 5 MINUTES
///Whether the max game time has been reached
var/max_time_reached = FALSE
+ /// Time between two bioscan
+ var/bioscan_interval = 3 MINUTES
///Delay from shutter drop until game timer starts
var/game_timer_delay = 5 MINUTES
-/datum/game_mode/hvh/combat_patrol/announce()
+
+/datum/game_mode/combat_patrol/post_setup()
+ . = ..()
+ for(var/area/area_to_lit AS in GLOB.sorted_areas)
+ switch(area_to_lit.ceiling)
+ if(CEILING_NONE to CEILING_GLASS)
+ area_to_lit.set_base_lighting(COLOR_WHITE, 200)
+ if(CEILING_METAL)
+ area_to_lit.set_base_lighting(COLOR_WHITE, 100)
+ if(CEILING_UNDERGROUND to CEILING_UNDERGROUND_METAL)
+ area_to_lit.set_base_lighting(COLOR_WHITE, 75)
+ if(CEILING_DEEP_UNDERGROUND to CEILING_DEEP_UNDERGROUND_METAL)
+ area_to_lit.set_base_lighting(COLOR_WHITE, 50)
+
+/datum/game_mode/combat_patrol/announce()
to_chat(world, "The current game mode is - Combat Patrol!")
to_chat(world, "The TGMC and SOM both lay claim to this planet. Across contested areas, small combat patrols frequently clash in their bid to enforce their respective claims. Seek and destroy any hostiles you encounter, good hunting!")
-/datum/game_mode/hvh/combat_patrol/setup_blockers()
+//sets TGMC and SOM squads
+/datum/game_mode/combat_patrol/set_valid_squads()
+ SSjob.active_squads[FACTION_TERRAGOV] = list()
+ SSjob.active_squads[FACTION_SOM] = list()
+ for(var/key in SSjob.squads)
+ var/datum/squad/squad = SSjob.squads[key]
+ if(squad.faction == FACTION_TERRAGOV || squad.faction == FACTION_SOM) //We only want Marine and SOM squads, future proofs if more faction squads are added
+ SSjob.active_squads[squad.faction] += squad
+ return TRUE
+
+/datum/game_mode/combat_patrol/get_joinable_factions(should_look_balance)
+ if(should_look_balance)
+ if(length(GLOB.alive_human_list_faction[FACTION_TERRAGOV]) > length(GLOB.alive_human_list_faction[FACTION_SOM]) * MAX_UNBALANCED_RATIO_TWO_HUMAN_FACTIONS)
+ return list(FACTION_SOM)
+ if(length(GLOB.alive_human_list_faction[FACTION_SOM]) > length(GLOB.alive_human_list_faction[FACTION_TERRAGOV]) * MAX_UNBALANCED_RATIO_TWO_HUMAN_FACTIONS)
+ return list(FACTION_TERRAGOV)
+ return list(FACTION_TERRAGOV, FACTION_SOM)
+
+/datum/game_mode/combat_patrol/setup_blockers()
. = ..()
//Starts the round timer when the game starts proper
- var/datum/game_mode/hvh/combat_patrol/D = SSticker.mode
- addtimer(CALLBACK(D, TYPE_PROC_REF(/datum/game_mode/hvh/combat_patrol, set_game_timer)), SSticker.round_start_time + shutters_drop_time + game_timer_delay) //game cannot end until at least 5 minutes after shutter drop
- addtimer(CALLBACK(D, TYPE_PROC_REF(/datum/game_mode/hvh/combat_patrol, respawn_wave)), SSticker.round_start_time + shutters_drop_time) //starts wave respawn on shutter drop and begins timer
- addtimer(CALLBACK(D, TYPE_PROC_REF(/datum/game_mode/hvh/combat_patrol, intro_sequence)), SSticker.round_start_time + shutters_drop_time - 10 SECONDS) //starts intro sequence 10 seconds before shutter drop
+ var/datum/game_mode/combat_patrol/D = SSticker.mode
+ addtimer(CALLBACK(D, TYPE_PROC_REF(/datum/game_mode/combat_patrol, set_game_timer)), SSticker.round_start_time + shutters_drop_time + game_timer_delay) //game cannot end until at least 5 minutes after shutter drop
+ addtimer(CALLBACK(D, TYPE_PROC_REF(/datum/game_mode/combat_patrol, respawn_wave)), SSticker.round_start_time + shutters_drop_time) //starts wave respawn on shutter drop and begins timer
+ addtimer(CALLBACK(D, TYPE_PROC_REF(/datum/game_mode/combat_patrol, intro_sequence)), SSticker.round_start_time + shutters_drop_time - 10 SECONDS) //starts intro sequence 10 seconds before shutter drop
TIMER_COOLDOWN_START(src, COOLDOWN_BIOSCAN, SSticker.round_start_time + shutters_drop_time + bioscan_interval)
-/datum/game_mode/hvh/combat_patrol/intro_sequence()
+///plays the intro sequence
+/datum/game_mode/combat_patrol/proc/intro_sequence()
var/op_name_tgmc = GLOB.operation_namepool[/datum/operation_namepool].get_random_name()
var/op_name_som = GLOB.operation_namepool[/datum/operation_namepool].get_random_name()
for(var/mob/living/carbon/human/human AS in GLOB.alive_human_list)
@@ -42,7 +94,18 @@
else
human.play_screen_text("[op_name_som] " + "[SSmapping.configs[GROUND_MAP].map_name] " + "[GAME_YEAR]-[time2text(world.realtime, "MM-DD")] [stationTimestamp("hh:mm")] " + "Shokk Infantry Platoon " + "[human.job.title], [human] ", /atom/movable/screen/text/screen_text/picture/shokk)
-/datum/game_mode/hvh/combat_patrol/game_end_countdown()
+///round timer
+/datum/game_mode/combat_patrol/proc/set_game_timer()
+ if(!iscombatpatrolgamemode(SSticker.mode))
+ return
+ var/datum/game_mode/combat_patrol/D = SSticker.mode
+
+ if(D.game_timer)
+ return
+
+ D.game_timer = addtimer(CALLBACK(D, TYPE_PROC_REF(/datum/game_mode/combat_patrol, set_game_end)), max_game_time, TIMER_STOPPABLE)
+
+/datum/game_mode/combat_patrol/game_end_countdown()
if(!game_timer)
return
var/eta = timeleft(game_timer) * 0.1
@@ -51,14 +114,17 @@
else
return "Patrol finished"
-/datum/game_mode/hvh/combat_patrol/wave_countdown()
+/datum/game_mode/combat_patrol/wave_countdown()
if(!wave_timer)
return
var/eta = timeleft(wave_timer) * 0.1
if(eta > 0)
return "[(eta / 60) % 60]:[add_leading(num2text(eta % 60), 2, "0")]"
-/datum/game_mode/hvh/combat_patrol/process()
+/datum/game_mode/combat_patrol/proc/set_game_end()
+ max_time_reached = TRUE
+
+/datum/game_mode/combat_patrol/process()
if(round_finished)
return PROCESS_KILL
@@ -66,8 +132,106 @@
return
announce_bioscans_marine_som()
+// make sure you don't turn 0 into a false positive
+#define BIOSCAN_DELTA(count, delta) count ? max(0, count + rand(-delta, delta)) : 0
+
+///Annonce to everyone the number of xeno and marines on ship and ground
+/datum/game_mode/combat_patrol/proc/announce_bioscans_marine_som(show_locations = TRUE, delta = 2, announce_marines = TRUE, announce_som = TRUE)
+ TIMER_COOLDOWN_START(src, COOLDOWN_BIOSCAN, bioscan_interval)
+ //pulls the number of marines and SOM
+ var/list/player_list = count_humans(count_flags = COUNT_IGNORE_ALIVE_SSD)
+ var/list/som_list = player_list[1]
+ var/list/tgmc_list = player_list[2]
+ var/num_som = length(player_list[1])
+ var/num_tgmc = length(player_list[2])
+ var/tgmc_location
+ var/som_location
+
+ if(num_som)
+ som_location = get_area(pick(player_list[1]))
+ if(num_tgmc)
+ tgmc_location = get_area(pick(player_list[2]))
+
+ //Adjust the randomness there so everyone gets the same thing
+ var/num_tgmc_delta = BIOSCAN_DELTA(num_tgmc, delta)
+ var/num_som_delta = BIOSCAN_DELTA(num_som, delta)
+
+ //announcement for SOM
+ var/som_scan_name = "Long Range Tactical Bioscan Status"
+ var/som_scan_input = {"Bioscan complete.
+
+Sensors indicate [num_tgmc_delta || "no"] unknown lifeform signature[num_tgmc_delta > 1 ? "s":""] present in the area of operations[tgmc_location ? ", including one at: [tgmc_location]":""]"}
+
+ if(announce_som)
+ priority_announce(som_scan_input, som_scan_name, sound = 'sound/AI/bioscan.ogg', receivers = (som_list + GLOB.observer_list))
+
+ //announcement for TGMC
+ var/marine_scan_name = "Long Range Tactical Bioscan Status"
+ var/marine_scan_input = {"Bioscan complete.
+
+Sensors indicate [num_som_delta || "no"] unknown lifeform signature[num_som_delta > 1 ? "s":""] present in the area of operations[som_location ? ", including one at: [som_location]":""]"}
+
+ if(announce_marines)
+ priority_announce(marine_scan_input, marine_scan_name, sound = 'sound/AI/bioscan.ogg', receivers = (tgmc_list + GLOB.observer_list))
+
+ log_game("Bioscan. [num_tgmc] active TGMC personnel[tgmc_location ? " Location: [tgmc_location]":""] and [num_som] active SOM personnel[som_location ? " Location: [som_location]":""]")
+
+ for(var/i in GLOB.observer_list)
+ var/mob/M = i
+ to_chat(M, "
Detailed Information
")
+ to_chat(M, {"[num_som] SOM alive.
+[num_tgmc] Marine\s alive."})
+
+ message_admins("Bioscan - Marines: [num_tgmc] active TGMC personnel[tgmc_location ? " .Location:[tgmc_location]":""]")
+ message_admins("Bioscan - SOM: [num_som] active SOM personnel[som_location ? " .Location:[som_location]":""]")
+
+#undef BIOSCAN_DELTA
+
+///Allows all the dead to respawn together
+/datum/game_mode/combat_patrol/proc/respawn_wave()
+ var/datum/game_mode/combat_patrol/D = SSticker.mode
+ D.wave_timer = addtimer(CALLBACK(D, TYPE_PROC_REF(/datum/game_mode/combat_patrol, respawn_wave)), wave_timer_length, TIMER_STOPPABLE)
+
+ for(var/i in GLOB.observer_list)
+ var/mob/dead/observer/M = i
+ GLOB.key_to_time_of_role_death[M.key] -= respawn_time
+ M.playsound_local(M, 'sound/ambience/votestart.ogg', 75, 1)
+ M.play_screen_text("RESPAWN WAVE AVAILABLE " + "YOU CAN NOW RESPAWN.", /atom/movable/screen/text/screen_text/command_order)
+ to_chat(M, " [span_attack("Reinforcements are gathering to join the fight, you can now respawn to join a fresh patrol!")] ")
+
+///checks how many marines and SOM are still alive
+/datum/game_mode/combat_patrol/proc/count_humans(list/z_levels = SSmapping.levels_by_trait(ZTRAIT_GROUND), count_flags)
+ var/list/som_alive = list()
+ var/list/som_dead = list()
+ var/list/tgmc_alive = list()
+ var/list/tgmc_dead = list()
+
+ for(var/z in z_levels)
+ //counts the live marines and SOM
+ for(var/i in GLOB.humans_by_zlevel["[z]"])
+ var/mob/living/carbon/human/H = i
+ if(!istype(H))
+ continue
+ if(count_flags & COUNT_IGNORE_HUMAN_SSD && !H.client)
+ continue
+ if(H.faction == FACTION_SOM)
+ som_alive += H
+ else if(H.faction == FACTION_TERRAGOV)
+ tgmc_alive += H
+ //counts the dead marines and SOM
+ for(var/i in GLOB.dead_human_list)
+ var/mob/living/carbon/human/H = i
+ if(!istype(H))
+ continue
+ if(H.faction == FACTION_SOM)
+ som_dead += H
+ else if(H.faction == FACTION_TERRAGOV)
+ tgmc_dead += H
+
+ return list(som_alive, tgmc_alive, som_dead, tgmc_dead)
+
//End game checks
-/datum/game_mode/hvh/combat_patrol/check_finished()
+/datum/game_mode/combat_patrol/check_finished()
if(round_finished)
return TRUE
@@ -113,35 +277,48 @@
round_finished = MODE_COMBAT_PATROL_DRAW
return TRUE
-/datum/game_mode/hvh/combat_patrol/declare_completion()
+
+/datum/game_mode/combat_patrol/declare_completion()
. = ..()
to_chat(world, span_round_header("|[round_finished]|"))
log_game("[round_finished]\nGame mode: [name]\nRound time: [duration2text()]\nEnd round player population: [length(GLOB.clients)]\nTotal TGMC spawned: [GLOB.round_statistics.total_humans_created[FACTION_TERRAGOV]]\nTotal SOM spawned: [GLOB.round_statistics.total_humans_created[FACTION_SOM]]")
to_chat(world, span_round_body("Thus ends the story of the brave men and women of both the TGMC and SOM, and their struggle on [SSmapping.configs[GROUND_MAP].map_name]."))
-///round timer
-/datum/game_mode/hvh/combat_patrol/proc/set_game_timer()
- if(!iscombatpatrolgamemode(SSticker.mode))
- return
- var/datum/game_mode/hvh/combat_patrol/D = SSticker.mode
-
- if(D.game_timer)
- return
- D.game_timer = addtimer(CALLBACK(D, TYPE_PROC_REF(/datum/game_mode/hvh/combat_patrol, set_game_end)), max_game_time, TIMER_STOPPABLE)
+/datum/game_mode/combat_patrol/announce_round_stats()
+ //sets up some stats which are added if applicable
+ var/tgmc_survival_stat
+ var/som_survival_stat
+ var/tgmc_accuracy_stat
+ var/som_accuracy_stat
-///Triggers the game to end
-/datum/game_mode/hvh/combat_patrol/proc/set_game_end()
- max_time_reached = TRUE
+ if(GLOB.round_statistics.total_human_deaths[FACTION_TERRAGOV])
+ if(GLOB.round_statistics.total_human_revives[FACTION_TERRAGOV])
+ tgmc_survival_stat = "[GLOB.round_statistics.total_human_revives[FACTION_TERRAGOV]] were revived, for a [(GLOB.round_statistics.total_human_revives[FACTION_TERRAGOV] / max(GLOB.round_statistics.total_human_deaths[FACTION_TERRAGOV], 1)) * 100]% revival rate and a [((GLOB.round_statistics.total_humans_created[FACTION_TERRAGOV] + GLOB.round_statistics.total_human_revives[FACTION_TERRAGOV] - GLOB.round_statistics.total_human_deaths[FACTION_TERRAGOV]) / GLOB.round_statistics.total_humans_created[FACTION_TERRAGOV]) * 100]% survival rate."
+ else
+ tgmc_survival_stat = "None were revived, for a [((GLOB.round_statistics.total_humans_created[FACTION_TERRAGOV] - GLOB.round_statistics.total_human_deaths[FACTION_TERRAGOV]) / GLOB.round_statistics.total_humans_created[FACTION_TERRAGOV]) * 100]% survival rate."
+ if(GLOB.round_statistics.total_human_deaths[FACTION_SOM])
+ if(GLOB.round_statistics.total_human_revives[FACTION_SOM])
+ som_survival_stat = "[GLOB.round_statistics.total_human_revives[FACTION_SOM]] were revived, for a [(GLOB.round_statistics.total_human_revives[FACTION_SOM] / max(GLOB.round_statistics.total_human_deaths[FACTION_SOM], 1)) * 100]% revival rate and a [((GLOB.round_statistics.total_humans_created[FACTION_SOM] + GLOB.round_statistics.total_human_revives[FACTION_SOM] - GLOB.round_statistics.total_human_deaths[FACTION_SOM]) / GLOB.round_statistics.total_humans_created[FACTION_SOM]) * 100]% survival rate."
+ else
+ som_survival_stat = "None were revived, for a [((GLOB.round_statistics.total_humans_created[FACTION_SOM] - GLOB.round_statistics.total_human_deaths[FACTION_SOM]) / GLOB.round_statistics.total_humans_created[FACTION_SOM]) * 100]% survival rate."
+ if(GLOB.round_statistics.total_projectile_hits[FACTION_SOM] && GLOB.round_statistics.total_projectiles_fired[FACTION_TERRAGOV])
+ tgmc_accuracy_stat = ", for an accuracy of [(GLOB.round_statistics.total_projectile_hits[FACTION_SOM] / GLOB.round_statistics.total_projectiles_fired[FACTION_TERRAGOV]) * 100]%!."
+ if(GLOB.round_statistics.total_projectile_hits[FACTION_TERRAGOV] && GLOB.round_statistics.total_projectiles_fired[FACTION_SOM])
+ som_accuracy_stat = ", for an accuracy of [(GLOB.round_statistics.total_projectile_hits[FACTION_TERRAGOV] / GLOB.round_statistics.total_projectiles_fired[FACTION_SOM]) * 100]%!."
-///Allows all the dead to respawn together
-/datum/game_mode/hvh/combat_patrol/proc/respawn_wave()
- var/datum/game_mode/hvh/combat_patrol/D = SSticker.mode
- D.wave_timer = addtimer(CALLBACK(D, TYPE_PROC_REF(/datum/game_mode/hvh/combat_patrol, respawn_wave)), wave_timer_length, TIMER_STOPPABLE)
+ var/list/dat = list({"[span_round_body("The end of round statistics are:")]
+ [GLOB.round_statistics.total_humans_created[FACTION_TERRAGOV]] TGMC personel deployed for the patrol, and [GLOB.round_statistics.total_human_deaths[FACTION_TERRAGOV] ? GLOB.round_statistics.total_human_deaths[FACTION_TERRAGOV] : "no"] TGMC personel were killed. [tgmc_survival_stat ? tgmc_survival_stat : ""]
+ [GLOB.round_statistics.total_humans_created[FACTION_SOM]] SOM personel deployed for the patrol, and [GLOB.round_statistics.total_human_deaths[FACTION_SOM] ? GLOB.round_statistics.total_human_deaths[FACTION_SOM] : "no"] SOM personel were killed. [som_survival_stat ? som_survival_stat : ""]
+ The TGMC fired [GLOB.round_statistics.total_projectiles_fired[FACTION_TERRAGOV] ? GLOB.round_statistics.total_projectiles_fired[FACTION_TERRAGOV] : "no"] projectiles. [GLOB.round_statistics.total_projectile_hits[FACTION_SOM] ? GLOB.round_statistics.total_projectile_hits[FACTION_SOM] : "No"] projectiles managed to hit members of the SOM[tgmc_accuracy_stat ? tgmc_accuracy_stat : "."]
+ The SOM fired [GLOB.round_statistics.total_projectiles_fired[FACTION_SOM] ? GLOB.round_statistics.total_projectiles_fired[FACTION_SOM] : "no"] projectiles. [GLOB.round_statistics.total_projectile_hits[FACTION_TERRAGOV] ? GLOB.round_statistics.total_projectile_hits[FACTION_TERRAGOV] : "No"] projectiles managed to hit members of the TGMC[som_accuracy_stat ? som_accuracy_stat : "."]
+ "})
+ if(GLOB.round_statistics.grenades_thrown)
+ dat += "[GLOB.round_statistics.grenades_thrown] grenades were detonated."
+ else
+ dat += "No grenades exploded."
- for(var/i in GLOB.observer_list)
- var/mob/dead/observer/M = i
- GLOB.key_to_time_of_role_death[M.key] -= respawn_time
- M.playsound_local(M, 'sound/ambience/votestart.ogg', 75, 1)
- M.play_screen_text("RESPAWN WAVE AVAILABLE " + "YOU CAN NOW RESPAWN.", /atom/movable/screen/text/screen_text/command_order)
- to_chat(M, " [span_attack("Reinforcements are gathering to join the fight, you can now respawn to join a fresh patrol!")] ")
+ var/output = jointext(dat, " ")
+ for(var/mob/player in GLOB.player_list)
+ if(player?.client?.prefs?.toggles_chat & CHAT_STATISTICS)
+ to_chat(player, output)
diff --git a/code/datums/gamemodes/hvh.dm b/code/datums/gamemodes/hvh.dm
deleted file mode 100644
index 761e6b9b8471c..0000000000000
--- a/code/datums/gamemodes/hvh.dm
+++ /dev/null
@@ -1,182 +0,0 @@
-//The base setup for HvH gamemodes, not for actual use
-/datum/game_mode/hvh
- name = "HvH base mode"
- flags_round_type = MODE_LATE_OPENING_SHUTTER_TIMER|MODE_TWO_HUMAN_FACTIONS|MODE_HUMAN_ONLY|MODE_TWO_HUMAN_FACTIONS
- shutters_drop_time = 3 MINUTES
- flags_xeno_abilities = ABILITY_CRASH
- factions = list(FACTION_TERRAGOV, FACTION_SOM)
- valid_job_types = list(
- /datum/job/terragov/squad/engineer = 4,
- /datum/job/terragov/squad/corpsman = 8,
- /datum/job/terragov/squad/smartgunner = 4,
- /datum/job/terragov/squad/leader = 4,
- /datum/job/terragov/squad/standard = -1,
- /datum/job/som/squad/leader = 4,
- /datum/job/som/squad/veteran = 2,
- /datum/job/som/squad/engineer = 4,
- /datum/job/som/squad/medic = 8,
- /datum/job/som/squad/standard = -1,
- )
- job_points_needed_by_job_type = list(
- /datum/job/som/squad/veteran = 5, //Every 5 non vets join, a new vet slot opens
- )
- /// Time between two bioscan
- var/bioscan_interval = 3 MINUTES
-
-/datum/game_mode/hvh/post_setup()
- . = ..()
- for(var/z_num in SSmapping.areas_in_z)
- set_z_lighting(z_num)
-
-/datum/game_mode/hvh/scale_roles()
- . = ..()
- if(!.)
- return
- var/datum/job/scaled_job = SSjob.GetJobType(/datum/job/som/squad/veteran)
- scaled_job.job_points_needed = 5 //Every 5 non vets join, a new vet slot opens
-
-//sets TGMC and SOM squads
-/datum/game_mode/hvh/set_valid_squads()
- SSjob.active_squads[FACTION_TERRAGOV] = list()
- SSjob.active_squads[FACTION_SOM] = list()
- for(var/key in SSjob.squads)
- var/datum/squad/squad = SSjob.squads[key]
- if(squad.faction == FACTION_TERRAGOV || squad.faction == FACTION_SOM) //We only want Marine and SOM squads, future proofs if more faction squads are added
- SSjob.active_squads[squad.faction] += squad
- return TRUE
-
-/datum/game_mode/hvh/get_joinable_factions(should_look_balance)
- if(should_look_balance)
- if(length(GLOB.alive_human_list_faction[FACTION_TERRAGOV]) > length(GLOB.alive_human_list_faction[FACTION_SOM]) * MAX_UNBALANCED_RATIO_TWO_HUMAN_FACTIONS)
- return list(FACTION_SOM)
- if(length(GLOB.alive_human_list_faction[FACTION_SOM]) > length(GLOB.alive_human_list_faction[FACTION_TERRAGOV]) * MAX_UNBALANCED_RATIO_TWO_HUMAN_FACTIONS)
- return list(FACTION_TERRAGOV)
- return list(FACTION_TERRAGOV, FACTION_SOM)
-
-/datum/game_mode/hvh/announce_round_stats()
- //sets up some stats which are added if applicable
- var/tgmc_survival_stat
- var/som_survival_stat
- var/tgmc_accuracy_stat
- var/som_accuracy_stat
-
- if(GLOB.round_statistics.total_human_deaths[FACTION_TERRAGOV])
- if(GLOB.round_statistics.total_human_revives[FACTION_TERRAGOV])
- tgmc_survival_stat = "[GLOB.round_statistics.total_human_revives[FACTION_TERRAGOV]] were revived, for a [(GLOB.round_statistics.total_human_revives[FACTION_TERRAGOV] / max(GLOB.round_statistics.total_human_deaths[FACTION_TERRAGOV], 1)) * 100]% revival rate and a [((GLOB.round_statistics.total_humans_created[FACTION_TERRAGOV] + GLOB.round_statistics.total_human_revives[FACTION_TERRAGOV] - GLOB.round_statistics.total_human_deaths[FACTION_TERRAGOV]) / GLOB.round_statistics.total_humans_created[FACTION_TERRAGOV]) * 100]% survival rate."
- else
- tgmc_survival_stat = "None were revived, for a [((GLOB.round_statistics.total_humans_created[FACTION_TERRAGOV] - GLOB.round_statistics.total_human_deaths[FACTION_TERRAGOV]) / GLOB.round_statistics.total_humans_created[FACTION_TERRAGOV]) * 100]% survival rate."
- if(GLOB.round_statistics.total_human_deaths[FACTION_SOM])
- if(GLOB.round_statistics.total_human_revives[FACTION_SOM])
- som_survival_stat = "[GLOB.round_statistics.total_human_revives[FACTION_SOM]] were revived, for a [(GLOB.round_statistics.total_human_revives[FACTION_SOM] / max(GLOB.round_statistics.total_human_deaths[FACTION_SOM], 1)) * 100]% revival rate and a [((GLOB.round_statistics.total_humans_created[FACTION_SOM] + GLOB.round_statistics.total_human_revives[FACTION_SOM] - GLOB.round_statistics.total_human_deaths[FACTION_SOM]) / GLOB.round_statistics.total_humans_created[FACTION_SOM]) * 100]% survival rate."
- else
- som_survival_stat = "None were revived, for a [((GLOB.round_statistics.total_humans_created[FACTION_SOM] - GLOB.round_statistics.total_human_deaths[FACTION_SOM]) / GLOB.round_statistics.total_humans_created[FACTION_SOM]) * 100]% survival rate."
- if(GLOB.round_statistics.total_projectile_hits[FACTION_SOM] && GLOB.round_statistics.total_projectiles_fired[FACTION_TERRAGOV])
- tgmc_accuracy_stat = ", for an accuracy of [(GLOB.round_statistics.total_projectile_hits[FACTION_SOM] / GLOB.round_statistics.total_projectiles_fired[FACTION_TERRAGOV]) * 100]%!."
- if(GLOB.round_statistics.total_projectile_hits[FACTION_TERRAGOV] && GLOB.round_statistics.total_projectiles_fired[FACTION_SOM])
- som_accuracy_stat = ", for an accuracy of [(GLOB.round_statistics.total_projectile_hits[FACTION_TERRAGOV] / GLOB.round_statistics.total_projectiles_fired[FACTION_SOM]) * 100]%!."
-
- var/list/dat = list({"[span_round_body("The end of round statistics are:")]
- [GLOB.round_statistics.total_humans_created[FACTION_TERRAGOV]] TGMC personel deployed for the patrol, and [GLOB.round_statistics.total_human_deaths[FACTION_TERRAGOV] ? GLOB.round_statistics.total_human_deaths[FACTION_TERRAGOV] : "no"] TGMC personel were killed. [tgmc_survival_stat ? tgmc_survival_stat : ""]
- [GLOB.round_statistics.total_humans_created[FACTION_SOM]] SOM personel deployed for the patrol, and [GLOB.round_statistics.total_human_deaths[FACTION_SOM] ? GLOB.round_statistics.total_human_deaths[FACTION_SOM] : "no"] SOM personel were killed. [som_survival_stat ? som_survival_stat : ""]
- The TGMC fired [GLOB.round_statistics.total_projectiles_fired[FACTION_TERRAGOV] ? GLOB.round_statistics.total_projectiles_fired[FACTION_TERRAGOV] : "no"] projectiles. [GLOB.round_statistics.total_projectile_hits[FACTION_SOM] ? GLOB.round_statistics.total_projectile_hits[FACTION_SOM] : "No"] projectiles managed to hit members of the SOM[tgmc_accuracy_stat ? tgmc_accuracy_stat : "."]
- The SOM fired [GLOB.round_statistics.total_projectiles_fired[FACTION_SOM] ? GLOB.round_statistics.total_projectiles_fired[FACTION_SOM] : "no"] projectiles. [GLOB.round_statistics.total_projectile_hits[FACTION_TERRAGOV] ? GLOB.round_statistics.total_projectile_hits[FACTION_TERRAGOV] : "No"] projectiles managed to hit members of the TGMC[som_accuracy_stat ? som_accuracy_stat : "."]
- "})
- if(GLOB.round_statistics.grenades_thrown)
- dat += "[GLOB.round_statistics.grenades_thrown] grenades were detonated."
- else
- dat += "No grenades exploded."
-
- var/output = jointext(dat, " ")
- for(var/mob/player in GLOB.player_list)
- if(player?.client?.prefs?.toggles_chat & CHAT_STATISTICS)
- to_chat(player, output)
-
-///plays the intro sequence if any
-/datum/game_mode/hvh/proc/intro_sequence()
- return
-
-///checks how many marines and SOM are still alive
-/datum/game_mode/hvh/proc/count_humans(list/z_levels = SSmapping.levels_by_trait(ZTRAIT_GROUND), count_flags) //todo: either make this not ground exclusive, or make new Z's not away levels
- var/list/som_alive = list()
- var/list/som_dead = list()
- var/list/tgmc_alive = list()
- var/list/tgmc_dead = list()
-
- for(var/z in z_levels)
- //counts the live marines and SOM
- for(var/i in GLOB.humans_by_zlevel["[z]"])
- var/mob/living/carbon/human/H = i
- if(!istype(H))
- continue
- if(count_flags & COUNT_IGNORE_HUMAN_SSD && !H.client)
- continue
- if(H.faction == FACTION_SOM)
- som_alive += H
- else if(H.faction == FACTION_TERRAGOV)
- tgmc_alive += H
- //counts the dead marines and SOM
- for(var/i in GLOB.dead_human_list)
- var/mob/living/carbon/human/H = i
- if(!istype(H))
- continue
- if(H.faction == FACTION_SOM)
- som_dead += H
- else if(H.faction == FACTION_TERRAGOV)
- tgmc_dead += H
-
- return list(som_alive, tgmc_alive, som_dead, tgmc_dead)
-
-// make sure you don't turn 0 into a false positive
-#define BIOSCAN_DELTA(count, delta) count ? max(0, count + rand(-delta, delta)) : 0
-
-///Annonce to everyone the number of SOM and marines on ship and ground
-/datum/game_mode/hvh/proc/announce_bioscans_marine_som(show_locations = TRUE, delta = 2, announce_marines = TRUE, announce_som = TRUE)
- TIMER_COOLDOWN_START(src, COOLDOWN_BIOSCAN, bioscan_interval)
- //pulls the number of marines and SOM
- var/list/player_list = count_humans(count_flags = COUNT_IGNORE_ALIVE_SSD)
- var/list/som_list = player_list[1]
- var/list/tgmc_list = player_list[2]
- var/num_som = length(player_list[1])
- var/num_tgmc = length(player_list[2])
- var/tgmc_location
- var/som_location
-
- if(num_som)
- som_location = get_area(pick(player_list[1]))
- if(num_tgmc)
- tgmc_location = get_area(pick(player_list[2]))
-
- //Adjust the randomness there so everyone gets the same thing
- var/num_tgmc_delta = BIOSCAN_DELTA(num_tgmc, delta)
- var/num_som_delta = BIOSCAN_DELTA(num_som, delta)
-
- //announcement for SOM
- var/som_scan_name = "Long Range Tactical Bioscan Status"
- var/som_scan_input = {"Bioscan complete.
-
-Sensors indicate [num_tgmc_delta || "no"] unknown lifeform signature[num_tgmc_delta > 1 ? "s":""] present in the area of operations[tgmc_location ? ", including one at: [tgmc_location]":""]"}
-
- if(announce_som)
- priority_announce(som_scan_input, som_scan_name, sound = 'sound/AI/bioscan.ogg', receivers = (som_list + GLOB.observer_list))
-
- //announcement for TGMC
- var/marine_scan_name = "Long Range Tactical Bioscan Status"
- var/marine_scan_input = {"Bioscan complete.
-
-Sensors indicate [num_som_delta || "no"] unknown lifeform signature[num_som_delta > 1 ? "s":""] present in the area of operations[som_location ? ", including one at: [som_location]":""]"}
-
- if(announce_marines)
- priority_announce(marine_scan_input, marine_scan_name, sound = 'sound/AI/bioscan.ogg', receivers = (tgmc_list + GLOB.observer_list))
-
- log_game("Bioscan. [num_tgmc] active TGMC personnel[tgmc_location ? " Location: [tgmc_location]":""] and [num_som] active SOM personnel[som_location ? " Location: [som_location]":""]")
-
- for(var/i in GLOB.observer_list)
- var/mob/M = i
- to_chat(M, "
Detailed Information
")
- to_chat(M, {"[num_som] SOM alive.
-[num_tgmc] Marine\s alive."})
-
- message_admins("Bioscan - Marines: [num_tgmc] active TGMC personnel[tgmc_location ? " .Location:[tgmc_location]":""]")
- message_admins("Bioscan - SOM: [num_som] active SOM personnel[som_location ? " .Location:[som_location]":""]")
-
-#undef BIOSCAN_DELTA
diff --git a/code/datums/gamemodes/sensor_capture.dm b/code/datums/gamemodes/sensor_capture.dm
index d0ea1ff7afb46..0ac234883bce4 100644
--- a/code/datums/gamemodes/sensor_capture.dm
+++ b/code/datums/gamemodes/sensor_capture.dm
@@ -1,6 +1,6 @@
#define SENSORS_NEEDED 5
-/datum/game_mode/hvh/combat_patrol/sensor_capture
+/datum/game_mode/combat_patrol/sensor_capture
name = "Sensor Capture"
config_tag = "Sensor Capture"
wave_timer_length = 2 MINUTES
@@ -11,22 +11,22 @@
var/sensors_activated = 0
blacklist_ground_maps = list(MAP_WHISKEY_OUTPOST, MAP_OSCAR_OUTPOST)
-/datum/game_mode/hvh/combat_patrol/sensor_capture/post_setup()
+/datum/game_mode/combat_patrol/sensor_capture/post_setup()
. = ..()
for(var/turf/T AS in GLOB.sensor_towers)
new /obj/structure/sensor_tower(T)
-/datum/game_mode/hvh/combat_patrol/sensor_capture/announce()
+/datum/game_mode/combat_patrol/sensor_capture/announce()
to_chat(world, "The current game mode is - Sensor Capture!")
to_chat(world, "The SOM have launched an invasion to this sector. TerraGov and SOM forces fight over the sensor towers around the sector.")
-/datum/game_mode/hvh/combat_patrol/sensor_capture/game_end_countdown()
+/datum/game_mode/combat_patrol/sensor_capture/game_end_countdown()
if(game_timer == SENSOR_CAP_TIMER_PAUSED)
return "Timer paused, tower activation in progress"
return ..()
//End game checks
-/datum/game_mode/hvh/combat_patrol/sensor_capture/check_finished()
+/datum/game_mode/combat_patrol/sensor_capture/check_finished()
if(round_finished)
return TRUE
@@ -40,6 +40,6 @@
round_finished = MODE_COMBAT_PATROL_MARINE_MAJOR
return TRUE
-/datum/game_mode/hvh/combat_patrol/sensor_capture/get_status_tab_items(datum/dcs, mob/source, list/items)
+/datum/game_mode/combat_patrol/sensor_capture/get_status_tab_items(datum/dcs, mob/source, list/items)
. = ..()
items += "Activated Sensor Towers: [sensors_activated]"
diff --git a/code/datums/jobs/job/job.dm b/code/datums/jobs/job/job.dm
index c57e637ffe9bb..923c6b72cc5cc 100644
--- a/code/datums/jobs/job/job.dm
+++ b/code/datums/jobs/job/job.dm
@@ -29,18 +29,12 @@ GLOBAL_PROTECT(exp_specialmap)
var/department_head = list()
var/faction = FACTION_NEUTRAL
- ///The total number of positions for this job
+
var/total_positions = 0
- ///How many positions of this job currently occupied
var/current_positions = 0
- ///How many positions can be dynamically assigned
- var/max_positions = INFINITY
- ///Points assigned dynamically to open new positions
- var/job_points = 0
- ///How many points needed to open up a new slot
+ var/max_positions = INFINITY //How many positions can be dynamically assigned.
+ var/job_points = 0 //Points assigned dynamically to open new positions.
var/job_points_needed = INFINITY
- ///how many job slots, if any this takes up per job
- var/job_cost = 1
var/supervisors = ""
var/selection_color = "#ffffff"
@@ -288,7 +282,6 @@ GLOBAL_PROTECT(exp_specialmap)
job.announce(src)
GLOB.round_statistics.total_humans_created[faction]++
SSblackbox.record_feedback("tally", "round_statistics", 1, "total_humans_created[faction]")
- SEND_GLOBAL_SIGNAL(COMSIG_LIVING_JOB_SET, src)
/mob/living/carbon/human/apply_assigned_role_to_spawn(datum/job/assigned_role, client/player, datum/squad/assigned_squad, admin_action = FALSE)
. = ..()
diff --git a/code/datums/jobs/job/shipside.dm b/code/datums/jobs/job/shipside.dm
index 0b543c0360165..2ce9cda7c6d24 100644
--- a/code/datums/jobs/job/shipside.dm
+++ b/code/datums/jobs/job/shipside.dm
@@ -140,7 +140,6 @@ Make the TGMC proud!"})
. = ..()
if(!ishuman(new_mob))
return
- SSdirection.set_leader(TRACKING_ID_MARINE_COMMANDER, new_mob)
var/mob/living/carbon/human/new_human = new_mob
var/playtime_mins = user?.client?.get_exp(title)
if(!playtime_mins || playtime_mins < 1 )
@@ -152,6 +151,7 @@ Make the TGMC proud!"})
new_human.wear_id.paygrade = "MO4"
if(7501 to INFINITY) // 125 hrs
new_human.wear_id.paygrade = "MO5"
+ SSdirection.set_leader(TRACKING_ID_MARINE_COMMANDER, new_mob)
/datum/outfit/job/command/fieldcommander
diff --git a/code/datums/jobs/job/sons_of_mars_shipside.dm b/code/datums/jobs/job/sons_of_mars_shipside.dm
deleted file mode 100644
index d3da506c5179a..0000000000000
--- a/code/datums/jobs/job/sons_of_mars_shipside.dm
+++ /dev/null
@@ -1,791 +0,0 @@
-//officer roles
-/datum/job/som/command
- job_category = JOB_CAT_COMMAND
- selection_color = "#ddddff"
- supervisors = "the acting captain"
- exp_type_department = EXP_TYPE_COMMAND
- jobworth = list(
- /datum/job/xenomorph = LARVA_POINTS_REGULAR,
- /datum/job/som/squad/veteran = VETERAN_POINTS_REGULAR,
- )
-
-//General
-/datum/job/som/command/general
- title = SOM_GENERAL
- req_admin_notify = TRUE
- paygrade = "SOM_O7"
- comm_title = "GEN"
- supervisors = "SOM high command"
- selection_color = "#ccccff"
- total_positions = 1
- skills_type = /datum/skills/captain
- minimal_access = ALL_MARINE_ACCESS
- display_order = JOB_DISPLAY_ORDER_CAPTAIN
- outfit = /datum/outfit/job/som/command/general
- exp_requirements = XP_REQ_EXPERT
- exp_type = EXP_TYPE_REGULAR_ALL
- 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
- html_description = {"
- Difficulty: Hard
- You answer to SOM High Command
- Unlock Requirement: Starting Role
- Gamemode Availability: Campaign
- Duty: Lead the SOM forces and complete your mission. Support the marines and communicate with your command staff, execute orders.
- "}
- minimap_icon = "captain" //placeholder
-
-/datum/job/som/command/general/radio_help_message(mob/M)
- . = ..()
- to_chat(M, {"As the captain of the [SSmapping.configs[SHIP_MAP].map_name] you are held by higher standard and are expected to act competently.
-While you may support Nanotrasen, you report to the SOM High Command, not the corporate office.
-Your primary task is the safety of the ship and her crew, and ensuring the survival and success of the marines.
-Your first order of business should be briefing the marines on the mission they are about to undertake.
-You should not be voluntarily leaving your vessel under any circumstances. A captain goes down with their ship.
-If you require any help, use mentorhelp to ask mentors about what you're supposed to do.
-Godspeed, captain! And remember, you are not above the law."})
-
-
-/datum/outfit/job/som/command/general
- name = SOM_GENERAL
- jobtype = /datum/job/som/command/general
-
- id = /obj/item/card/id/gold
- belt = /obj/item/storage/holster/belt/pistol/smart_pistol/full
- ears = /obj/item/radio/headset/mainship/som
- 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
-
-/datum/job/som/command/general/after_spawn(mob/living/new_mob, mob/user, latejoin)
- . = ..()
- if(!ishuman(new_mob))
- return
- var/mob/living/carbon/human/new_human = new_mob
- var/playtime_mins = user?.client?.get_exp(title)
- if(!playtime_mins || playtime_mins < 1 )
- return
- switch(playtime_mins)
- if(0 to 1500) // starting
- new_human.wear_id.paygrade = "SOM_O7"
- if(1501 to 6000) // 25 hrs
- new_human.wear_id.paygrade = "SOM_G1"
- if(6001 to 18000) // 100 hrs
- new_human.wear_id.paygrade = "SOM_G2"
- if(18001 to 30000) // 300 hrs
- new_human.wear_id.paygrade = "SOM_G3"
- if(30001 to INFINITY) // 500 hrs
- new_human.wear_id.paygrade = "SOM_G4"
-
-//Field Commander
-/datum/job/som/command/fieldcommander
- title = SOM_FIELD_COMMANDER
- req_admin_notify = TRUE
- paygrade = "SOM_O3"
- comm_title = "FCDR"
- total_positions = 1
- skills_type = /datum/skills/fo
- display_order = JOB_DISPLAY_ORDER_EXECUTIVE_OFFICER
- outfit = /datum/outfit/job/som/command/fieldcommander
- exp_requirements = XP_REQ_EXPERIENCED
- exp_type = EXP_TYPE_REGULAR_ALL
- 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
- html_description = {"
- Difficulty:Very Hard
- You answer to the commanding officer
- Unlock Requirement: Starting Role
- Gamemode Availability: Campaign
- Duty: Lead your platoon on the field. Take advantage of the military staff and assets you will need for the mission, keep good relations between command and the marines. Assist your commander if available.
- "}
- minimap_icon = "som_fieldcommander"
-
-/datum/job/som/command/fieldcommander/radio_help_message(mob/M)
- . = ..()
- to_chat(M, {"You are charged with overseeing the operation on the ground, and are the highest-ranked deployed marine.
-Your duties are to ensure marines hold when ordered, and push when they are cowering behind barricades.
-Do not ask your men to do anything you would not do side by side with them.
-Make the SOM proud!"}) //update
-
-/datum/job/som/command/fieldcommander/after_spawn(mob/living/carbon/new_mob, mob/user, latejoin = FALSE)
- . = ..()
- if(!ishuman(new_mob))
- return
- SSdirection.set_leader(TRACKING_ID_SOM_COMMANDER, new_mob)
- var/mob/living/carbon/human/new_human = new_mob
- var/playtime_mins = user?.client?.get_exp(title)
- if(!playtime_mins || playtime_mins < 1 )
- return
- switch(playtime_mins)
- if(0 to 1500) // starting
- new_human.wear_id.paygrade = "SOM_O3"
- if(1501 to 6000) // 25 hrs
- new_human.wear_id.paygrade = "SOM_O4"
- if(6001 to 18000) // 100 hrs
- new_human.wear_id.paygrade = "SOM_O5"
- if(18001 to 30000) // 300 hrs
- new_human.wear_id.paygrade = "SOM_O6"
- if(30001 to INFINITY) // 500 hrs
- new_human.wear_id.paygrade = "SOM_O7"
-
-//update
-/datum/outfit/job/som/command/fieldcommander
- name = SOM_FIELD_COMMANDER
- jobtype = /datum/job/som/command/fieldcommander
-
- id = /obj/item/card/id/dogtag/fc
- belt = /obj/item/storage/holster/belt/pistol/m4a3/som/fancy/fieldcommander
- ears = /obj/item/radio/headset/mainship/som
- w_uniform = /obj/item/clothing/under/som/leader/webbing //replace when new sprite available
- wear_suit = /obj/item/clothing/suit/modular/som/heavy/leader/officer
- shoes = /obj/item/clothing/shoes/marine/som/knife
- gloves = /obj/item/clothing/gloves/marine/som/veteran
- mask = /obj/item/clothing/mask/gas
- head = /obj/item/clothing/head/modular/som/leader/officer
- glasses = /obj/item/clothing/glasses/hud/health
- r_store = /obj/item/storage/pouch/firstaid/som/combat_patrol_leader
- l_store = /obj/item/storage/pouch/grenade/som/combat_patrol
- suit_store = /obj/item/weapon/twohanded/fireaxe/som
- back = /obj/item/storage/backpack/satchel/som
-
-/datum/outfit/job/som/command/fieldcommander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/russian_red, SLOT_IN_HEAD)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/combat_advanced, SLOT_IN_HEAD)
-
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/gauze, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/stack/medical/heal_pack/ointment, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/isotonic, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/quickclot, SLOT_IN_SUIT)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/autoinjector/dylovene, SLOT_IN_SUIT)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta(H), SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som/ap, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/som/ap, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/dragonbreath, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/cluster, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/micro_grenade/smoke_burst, SLOT_IN_BACKPACK)
-
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
-
-//Staff Officer
-/datum/job/som/command/staffofficer
- title = SOM_STAFF_OFFICER
- paygrade = "SOM_W5"
- comm_title = "SO"
- total_positions = 4
- access = list(ACCESS_MARINE_BRIDGE, ACCESS_MARINE_BRIG, ACCESS_MARINE_CARGO, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_LOGISTICS, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO, ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DELTA)
- minimal_access = ALL_MARINE_ACCESS
- skills_type = /datum/skills/so
- display_order = JOB_DISPLAY_ORDER_STAFF_OFFICER
- outfit = /datum/outfit/job/command/staffofficer
- exp_requirements = XP_REQ_INTERMEDIATE
- exp_type = EXP_TYPE_REGULAR_ALL
- 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
- html_description = {"
- Difficulty: Medium
- You answer to the Captain
- Unlock Requirement: Starting Role
- Gamemode Availability: Campaign
- Duty: Take charge of one of the four squads, be their eyes and ears providing intel and additional shipside support via Orbital Bombardments.
- "}
-
- minimap_icon = "staffofficer"
-
-/datum/job/som/command/staffofficer/radio_help_message(mob/M)
- . = ..()
- to_chat(M, {"Your job is to monitor the marines, man the CIC, and listen to your superior officers.
-You are in charge of logistics and the overwatch system. You are also in line to take command after the captain."})
-
-/datum/job/som/command/staffofficer/after_spawn(mob/living/carbon/new_mob, mob/user, latejoin = FALSE)
- . = ..()
- if(!ishuman(new_mob))
- return
- var/mob/living/carbon/human/new_human = new_mob
- var/playtime_mins = user?.client?.get_exp(title)
- if(!playtime_mins || playtime_mins < 1 )
- return
- switch(playtime_mins)
- if(0 to 1500) // starting
- new_human.wear_id.paygrade = "SOM_W5"
- if(1501 to 6000) // 25 hrs
- new_human.wear_id.paygrade = "SOM_O1"
- if(6001 to 18000) // 100 hrs
- new_human.wear_id.paygrade = "SOM_O2"
- if(18001 to 30000) // 300 hrs
- new_human.wear_id.paygrade = "SOM_O3"
- if(30001 to INFINITY) // 500 hrs
- new_human.wear_id.paygrade = "SOM_O4"
-
-/datum/outfit/job/command/staffofficer
- name = SOM_STAFF_OFFICER
- jobtype = /datum/job/som/command/staffofficer
-
- 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
-
-//Pilot Officer
-/datum/job/som/command/pilot
- title = SOM_PILOT_OFFICER
- paygrade = "SOM_W2"
- comm_title = "PO"
- total_positions = 2
- access = list(ACCESS_MARINE_BRIDGE, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_PILOT)
- minimal_access = list(ACCESS_MARINE_BRIDGE, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_PILOT, ACCESS_MARINE_LOGISTICS, ACCESS_MARINE_CARGO, ACCESS_MARINE_RO, ACCESS_MARINE_MEDBAY)
- skills_type = /datum/skills/pilot
- display_order = JOB_DISPLAY_ORDER_PILOT_OFFICER
- outfit = /datum/outfit/job/command/pilot
- 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
- html_description = {"
- Difficulty: Medium
- You answer to the acting Command Staff
- Unlock Requirement: Starting Role
- Gamemode Availability: Campaign
- Duty: Choose between the Condor, a modular attack aircraft that provides close air support with a variety of weapons ranging from the inbuilt gatling to wing mounted rockets; or the Tadpole, a versatile dropship capable of fulfilling roles ranging from ambulance to mobile bunker.
- "}
- minimap_icon = "pilot"
-
-/datum/job/som/command/pilot/after_spawn(mob/living/carbon/new_mob, mob/user, latejoin = FALSE)
- . = ..()
- if(!ishuman(new_mob))
- return
- var/mob/living/carbon/human/new_human = new_mob
- var/playtime_mins = user?.client?.get_exp(title)
- if(!playtime_mins || playtime_mins < 1 )
- return
- switch(playtime_mins)
- if(0 to 1500) // starting
- new_human.wear_id.paygrade = "SOM_W2"
- if(1501 to 6000) // 25 hrs
- new_human.wear_id.paygrade = "SOM_W3"
- if(6001 to 18000) // 100 hrs
- new_human.wear_id.paygrade = "SOM_W4"
- if(18001 to 30000) // 300 hrs
- new_human.wear_id.paygrade = "SOM_W5"
- if(30001 to INFINITY) // 500 hrs
- new_human.wear_id.paygrade = "SOM_W6"
-
-/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.
-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 = SOM_PILOT_OFFICER
- jobtype = /datum/job/som/command/pilot
-
- id = /obj/item/card/id/silver
- belt = /obj/item/storage/holster/belt/pistol/m4a3/vp70
- ears = /obj/item/radio/headset/mainship/mcom
- w_uniform = /obj/item/clothing/under/marine/officer/pilot
- wear_suit = /obj/item/clothing/suit/modular/xenonauten/pilot
- shoes = /obj/item/clothing/shoes/marine/full
- gloves = /obj/item/clothing/gloves/insulated
- glasses = /obj/item/clothing/glasses/sunglasses/aviator
- head = /obj/item/clothing/head/helmet/marine/pilot
- r_store = /obj/item/storage/pouch/general/large
- l_store = /obj/item/hud_tablet/pilot
-
-//Mech pilot
-/datum/job/som/command/mech_pilot
- title = SOM_MECH_PILOT
- req_admin_notify = TRUE
- paygrade = "SOM_W1"
- comm_title = "MCH"
- total_positions = 0
- skills_type = /datum/skills/mech_pilot
- access = list(ACCESS_MARINE_WO, ACCESS_MARINE_PREP, ACCESS_MARINE_MECH, ACCESS_CIVILIAN_PUBLIC)
- 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
- 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
- html_description = {"
- Difficulty:Very Hard
- You answer to the acting Command Staff
- Unlock Requirement: Starting Role
- Gamemode Availability: Campaign
- Duty: Act as the spearhead of the operation
- "}
- minimap_icon = "mech_pilot"
-
-/datum/job/som/command/mech_pilot/radio_help_message(mob/M)
- . = ..()
- to_chat(M, {"\nYou are the operator of a very expensive and valuable Mech, and are trained and expected to use it in the field of combat.
-You can serve your Division in a variety of roles, so choose carefully."})
-
-/datum/job/som/command/mech_pilot/after_spawn(mob/living/carbon/new_mob, mob/user, latejoin = FALSE)
- . = ..()
- if(!ishuman(new_mob))
- return
- var/mob/living/carbon/human/new_human = new_mob
- var/playtime_mins = user?.client?.get_exp(title)
- if(!playtime_mins || playtime_mins < 1 )
- return
- switch(playtime_mins)
- if(0 to 1500) // starting
- new_human.wear_id.paygrade = "SOM_W1"
- if(1501 to 6000) // 25 hrs
- new_human.wear_id.paygrade = "SOM_W2"
- if(6001 to 18000) // 100 hrs
- new_human.wear_id.paygrade = "SOM_W3"
- if(18001 to 30000) // 300 hrs
- new_human.wear_id.paygrade = "SOM_W4"
- if(30001 to INFINITY) // 500 hrs
- new_human.wear_id.paygrade = "SOM_W5"
-
-/datum/outfit/job/command/mech_pilot
- name = SOM_MECH_PILOT
- jobtype = /datum/job/som/command/mech_pilot
-
- id = /obj/item/card/id/dogtag
- belt = /obj/item/storage/belt/utility/full
- glasses = /obj/item/clothing/glasses/welding
- ears = /obj/item/radio/headset/mainship/mcom
- w_uniform = /obj/item/clothing/under/marine/officer/mech
- wear_suit = /obj/item/clothing/suit/storage/marine/mech_pilot
- head = /obj/item/clothing/head/helmet/marine/mech_pilot
- shoes = /obj/item/clothing/shoes/marine/full
- gloves = /obj/item/clothing/gloves/marine
-
-/datum/job/som/engineering
- job_category = JOB_CAT_ENGINEERING
- selection_color = "#fff5cc"
- supervisors = "the acting captain"
- exp_type_department = EXP_TYPE_ENGINEERING
-
-
-//Chief Ship Engineer
-/datum/job/som/engineering/chief
- title = SOM_CHIEF_ENGINEER
- paygrade = "SOM_W2"
- comm_title = "CE"
- selection_color = "#ffeeaa"
- total_positions = 1
- access = list(ACCESS_MARINE_CE, ACCESS_MARINE_ENGINEERING, ACCESS_MARINE_BRIDGE, ACCESS_CIVILIAN_ENGINEERING, ACCESS_MARINE_CARGO, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_PREP)
- minimal_access = list(ACCESS_MARINE_CE, ACCESS_MARINE_ENGINEERING, ACCESS_MARINE_BRIDGE, ACCESS_CIVILIAN_ENGINEERING, ACCESS_MARINE_CARGO, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_LOGISTICS, ACCESS_MARINE_PREP, ACCESS_MARINE_RO, ACCESS_MARINE_MEDBAY)
- 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
- 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
- html_description = {"
- Difficulty: Hard
- You answer to the acting Command Staff
- Unlock Requirement: Starting Role
- Gamemode Availability: Campaign
- Duty: Supervise the engineers and technicians on duty. Overview the ship’s engine. Teach what’s right and what’s wrong about engineering, cut corners and find places in any FOB that can easily be destroyed.
- "}
- minimap_icon = "cse"
-
-/datum/job/som/engineering/chief/after_spawn(mob/living/carbon/new_mob, mob/user, latejoin = FALSE)
- . = ..()
- if(!ishuman(new_mob))
- return
- var/mob/living/carbon/human/new_human = new_mob
- var/playtime_mins = user?.client?.get_exp(title)
- if(!playtime_mins || playtime_mins < 1 )
- return
- switch(playtime_mins)
- if(0 to 1500) // starting
- new_human.wear_id.paygrade = "SOM_W2"
- if(1501 to 6000) // 25 hrs
- new_human.wear_id.paygrade = "SOM_W3"
- if(6001 to 18000) // 100 hrs
- new_human.wear_id.paygrade = "SOM_W4"
- if(18001 to 30000) // 300 hrs
- new_human.wear_id.paygrade = "SOM_W5"
- if(30001 to INFINITY) // 500 hrs
- new_human.wear_id.paygrade = "SOM_W6"
-
-/datum/job/som/engineering/chief/radio_help_message(mob/M)
- . = ..()
- to_chat(M, {"Your job is to maintain the ship's engine and keep everything running.
-If you have no idea how to set up the engine, or it's your first time, mentorhelp so that a mentor can assist you.
-You are also next in the chain of command, should the bridge crew fall in the line of duty."})
-
-
-/datum/outfit/job/engineering/chief
- name = SOM_CHIEF_ENGINEER
- jobtype = /datum/job/som/engineering/chief
-
- id = /obj/item/card/id/silver
- belt = /obj/item/storage/belt/utility/full
- ears = /obj/item/radio/headset/mainship/mcom
- w_uniform = /obj/item/clothing/under/marine/officer/ce
- wear_suit = /obj/item/clothing/suit/storage/marine/officer/req
- shoes = /obj/item/clothing/shoes/marine/full
- glasses = /obj/item/clothing/glasses/welding/superior
- gloves = /obj/item/clothing/gloves/insulated
- head = /obj/item/clothing/head/beret/marine/techofficer
- r_store = /obj/item/storage/pouch/construction
- back = /obj/item/storage/backpack/marine/engineerpack
-
-/datum/outfit/job/engineering/chief/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/large_stack, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/stack/sandbags/large_stack, SLOT_IN_R_POUCH)
- H.equip_to_slot_or_del(new /obj/item/stack/barbed_wire/full, SLOT_IN_R_POUCH)
-
-//Ship Engineer
-/datum/job/som/engineering/tech
- title = SOM_TECH
- comm_title = "TECH"
- paygrade = "SOM_E2"
- total_positions = 5
- supervisors = "the chief station engineer and the requisitions officer"
- access = list(ACCESS_MARINE_ENGINEERING, ACCESS_MARINE_PREP, ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CARGO, ACCESS_CIVILIAN_ENGINEERING)
- minimal_access = list(ACCESS_MARINE_ENGINEERING, ACCESS_MARINE_PREP, ACCESS_MARINE_MEDBAY, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_CARGO, ACCESS_CIVILIAN_ENGINEERING)
- skills_type = /datum/skills/st
- display_order = JOB_DISPLAY_ORDER_SHIP_TECH
- outfit = /datum/outfit/job/engineering/tech
- 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
- html_description = {"
- Difficulty: Medium
- You answer to the Chief Ship Engineer
- Unlock Requirement: Starting Role
- Gamemode Availability: Campaign
- Duty: Maintain the ship, be in charge of the engines. Be the secondary engineer to a forward operating base, prepare the shipside defenses if needed. Help the Pilot Officer in preparing the dropship.
- "}
- minimap_icon = "st"
-
-/datum/job/som/engineering/tech/after_spawn(mob/living/carbon/new_mob, mob/user, latejoin = FALSE)
- . = ..()
- if(!ishuman(new_mob))
- return
- var/mob/living/carbon/human/new_human = new_mob
- var/playtime_mins = user?.client?.get_exp(title)
- if(!playtime_mins || playtime_mins < 1 )
- return
- switch(playtime_mins)
- if(0 to 1500) // starting
- new_human.wear_id.paygrade = "SOM_E2"
- if(1501 to 6000) // 25 hrs
- new_human.wear_id.paygrade = "SOM_E3"
- if(6001 to 18000) // 100 hrs
- new_human.wear_id.paygrade = "SOM_E4"
- if(18001 to 30000) // 300 hrs
- new_human.wear_id.paygrade = "SOM_E5"
- if(30001 to INFINITY) // 500 hrs
- new_human.wear_id.paygrade = "SOM_S1"
-
-/datum/job/som/engineering/tech/radio_help_message(mob/M)
- . = ..()
- to_chat(M, {"Your job is to make sure the base is operational, you should firstly focus on manning the
-requisitions line and later on to be ready to send supplies for marines who are groundside."})
-
-
-/datum/outfit/job/engineering/tech
- name = SOM_TECH
- jobtype = /datum/job/som/engineering/tech
-
- id = /obj/item/card/id/silver
- belt = /obj/item/storage/belt/utility/full
- ears = /obj/item/radio/headset/mainship/st
- w_uniform = /obj/item/clothing/under/marine/officer/engi
- wear_suit = /obj/item/clothing/suit/storage/marine/ship_tech
- shoes = /obj/item/clothing/shoes/marine/full
- gloves = /obj/item/clothing/gloves/insulated
- glasses = /obj/item/clothing/glasses/welding/flipped
- head = /obj/item/clothing/head/tgmccap/req
- r_store = /obj/item/storage/pouch/general/medium
- back = /obj/item/storage/backpack/marine/engineerpack
-
-/datum/job/som/requisitions
- job_category = JOB_CAT_REQUISITIONS
- selection_color = "#BAAFD9"
- supervisors = "the acting commander"
- exp_type_department = EXP_TYPE_REQUISITIONS
-
-
-//Requisitions Officer
-/datum/job/som/requisitions/officer
- title = SOM_REQUISITIONS_OFFICER
- req_admin_notify = TRUE
- paygrade = "SOM_W1"
- comm_title = "RO"
- selection_color = "#9990B2"
- total_positions = 1
- access = list(ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_CARGO, ACCESS_MARINE_RO, ACCESS_MARINE_BRIDGE, ACCESS_MARINE_PREP, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO, ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DELTA)
- minimal_access = list(ACCESS_MARINE_CARGO, ACCESS_MARINE_RO, ACCESS_MARINE_BRIDGE, ACCESS_MARINE_PREP, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO, ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DELTA, ACCESS_MARINE_MEDBAY, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_LOGISTICS)
- 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
- 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
- html_description = {"
- Difficulty: Medium
- You answer to the acting Command Staff
- Unlock Requirement: Starting Role
- Gamemode Availability: Campaign
- Supply the SOM with deluxe equipment to ensure success.
- "}
- minimap_icon = "requisition"
-
-/datum/job/som/requisitions/officer/after_spawn(mob/living/carbon/new_mob, mob/user, latejoin = FALSE)
- . = ..()
- if(!ishuman(new_mob))
- return
- var/mob/living/carbon/human/new_human = new_mob
- var/playtime_mins = user?.client?.get_exp(title)
- if(!playtime_mins || playtime_mins < 1 )
- return
- switch(playtime_mins)
- if(0 to 1500) // starting
- new_human.wear_id.paygrade = "SOM_W1"
- if(1501 to 6000) // 25 hrs
- new_human.wear_id.paygrade = "SOM_W2"
- if(6001 to 18000) // 100 hrs
- new_human.wear_id.paygrade = "SOM_W3"
- if(18001 to 30000) // 300 hrs
- new_human.wear_id.paygrade = "SOM_W4"
- if(30001 to INFINITY) // 500 hrs
- new_human.wear_id.paygrade = "SOM_W5"
-
-/datum/job/som/requisitions/officer/radio_help_message(mob/M)
- . = ..()
- to_chat(M, {"Your job is to dispense supplies to the SOM.
-While you may request paperwork for supplies, do not go out of your way to screw with marines, unless you want to get deposed.
-A happy base is a well-functioning base."})
-
-
-/datum/outfit/job/requisitions/officer
- name = SOM_REQUISITIONS_OFFICER
- jobtype = /datum/job/som/requisitions/officer
-
- id = /obj/item/card/id/silver
- belt = /obj/item/storage/holster/belt/m44/full
- ears = /obj/item/radio/headset/mainship/mcom
- w_uniform = /obj/item/clothing/under/marine/officer/ro_suit
- wear_suit = /obj/item/clothing/suit/storage/marine/officer/req
- suit_store = /obj/item/weapon/gun/energy/taser
- shoes = /obj/item/clothing/shoes/marine/full
- gloves = /obj/item/clothing/gloves/insulated
- head = /obj/item/clothing/head/tgmccap/req
- r_store = /obj/item/storage/pouch/general/large
-
-/datum/job/som/medical
- job_category = JOB_CAT_MEDICAL
- selection_color = "#BBFFBB"
- exp_type_department = EXP_TYPE_MEDICAL
-
-
-/datum/job/som/medical/professor
- title = SOM_CHIEF_MEDICAL_OFFICER
- req_admin_notify = TRUE
- comm_title = "CMO"
- paygrade = "CHO"
- total_positions = 1
- supervisors = "the acting commander"
- selection_color = "#99FF99"
- access = list(ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_CMO, ACCESS_MARINE_MEDBAY, ACCESS_MARINE_RESEARCH, ACCESS_MARINE_BRIDGE, ACCESS_MARINE_CHEMISTRY)
- minimal_access = list(ACCESS_MARINE_CMO, ACCESS_MARINE_MEDBAY, ACCESS_MARINE_RESEARCH, ACCESS_MARINE_BRIDGE, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_CARGO, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_LOGISTICS)
- skills_type = /datum/skills/cmo
- display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER
- outfit = /datum/outfit/job/medical/professor
- exp_requirements = XP_REQ_EXPERIENCED
- exp_type = EXP_TYPE_REGULAR_ALL
- 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
- html_description = {"
- Difficulty: Hard
- You answer to the acting Command Staff
- Unlock Requirement: Starting Role
- Gamemode Availability: Campaign
- Duty: Communicate and lead your fellow medical staff (if available), supervise the medical department. Coordinate and teach fellow medical staff and corpsmen what they’re doing for treating an injury. Be the sole doctor in the Canterbury.
- "}
- minimap_icon = "chief_medical"
-
-/datum/job/som/medical/professor/radio_help_message(mob/M)
- . = ..()
- to_chat(M, {"You are the chief medical officer stationed behind the frontlines and supervisor to the medical department.
-You have final authority over the medical department, medications, and treatments.
-Make sure that the doctors and nurses are doing their jobs and keeping the SOM healthy and strong."})
-
-/datum/job/som/medical/professor/after_spawn(mob/living/carbon/new_mob, mob/user, latejoin = FALSE)
- . = ..()
- if(!ishuman(new_mob))
- return
- var/mob/living/carbon/human/new_human = new_mob
- var/playtime_mins = user?.client?.get_exp(title)
- if(!playtime_mins || playtime_mins < 1 )
- return
- switch(playtime_mins)
- if(0 to 3000) // starting
- new_human.wear_id.paygrade = "CHO"
- if(3001 to INFINITY) // 50 hrs
- new_human.wear_id.paygrade = "CMO"
-
-/datum/outfit/job/medical/professor
- name = SOM_CHIEF_MEDICAL_OFFICER
- jobtype = /datum/job/som/medical/professor
-
- id = /obj/item/card/id
- belt = /obj/item/storage/belt/rig/medical
- ears = /obj/item/radio/headset/mainship/mcom
- w_uniform = /obj/item/clothing/under/rank/medical/blue
- wear_suit = /obj/item/clothing/suit/storage/labcoat/cmo
- shoes = /obj/item/clothing/shoes/white
- gloves = /obj/item/clothing/gloves/latex
- glasses = /obj/item/clothing/glasses/hud/health
- mask = /obj/item/clothing/mask/surgical
- head = /obj/item/clothing/head/cmo
- r_store = /obj/item/storage/pouch/medkit/medic
- l_store = /obj/item/storage/pouch/surgery
-
-/datum/outfit/job/medical/professor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/tweezers, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/glass/bottle/lemoline/doctor, SLOT_IN_BACKPACK)
-
-//Medical Officer
-/datum/job/som/medical/medicalofficer
- title = SOM_MEDICAL_DOCTOR
- comm_title = "MD"
- paygrade = "RES"
- total_positions = 6
- supervisors = "the chief medical officer"
- access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CHEMISTRY)
- minimal_access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_CARGO, ACCESS_MARINE_DROPSHIP)
- skills_type = /datum/skills/doctor
- display_order = JOB_DISPLAY_ORDER_DOCTOR
- outfit = /datum/outfit/job/medical/medicalofficer
- 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
- html_description = {"
- Difficulty: Medium
- You answer to the Chief Medical Officer
- Unlock Requirement: Starting Role
- Gamemode Availability: Campaign
- Duty: Tend severely wounded patients to your aid in the form of surgery, repair broken bones and damaged organs, fix internal bleeding and prevent the birth of a xenomorph larva. Develop superior healing medicines.
- "}
- minimap_icon = "medical"
-
-/datum/job/som/medical/medicalofficer/after_spawn(mob/living/carbon/new_mob, mob/user, latejoin = FALSE)
- . = ..()
- if(!ishuman(new_mob))
- return
- var/mob/living/carbon/human/new_human = new_mob
- var/playtime_mins = user?.client?.get_exp(title)
- if(!playtime_mins || playtime_mins < 1 )
- return
- switch(playtime_mins)
- if(0 to 3000) // starting
- new_human.wear_id.paygrade = "RES"
- if(3001 to INFINITY) // 50 hrs
- new_human.wear_id.paygrade = "MD"
-
-/datum/job/som/medical/medicalofficer/radio_help_message(mob/M)
- . = ..()
- to_chat(M, {"You are a SOM medical doctor stationed behind the frontlines.
-You are tasked with keeping the SOM healthy and strong, usually in the form of surgery.
-You are also an expert when it comes to medication and treatment. If you do not know what you are doing, mentorhelp so a mentor can assist you."})
-
-
-/datum/outfit/job/medical/medicalofficer
- name = SOM_MEDICAL_DOCTOR
- jobtype = /datum/job/som/medical/medicalofficer
-
- id = /obj/item/card/id
- belt = /obj/item/storage/belt/rig/medical
- ears = /obj/item/radio/headset/mainship/doc
- w_uniform = /obj/item/clothing/under/rank/medical/purple
- wear_suit = /obj/item/clothing/suit/storage/labcoat
- shoes = /obj/item/clothing/shoes/white
- gloves = /obj/item/clothing/gloves/latex
- glasses = /obj/item/clothing/glasses/hud/health
- mask = /obj/item/clothing/mask/surgical
- head = /obj/item/clothing/head/surgery/purple
-
-/datum/outfit/job/medical/medicalofficer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/tweezers, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/glass/bottle/lemoline/doctor, SLOT_IN_BACKPACK)
-
-
-/datum/job/som/civilian
- job_category = JOB_CAT_CIVILIAN
- selection_color = "#ffeedd"
-
-/datum/job/som/civilian/chef
- title = SOM_CHEF
- comm_title = "CHEF"
- paygrade = "SOM_E1"
- total_positions = 2
- supervisors = "the acting commander"
- display_order = JOB_DISPLAY_ORDER_DOCTOR
- outfit = /datum/outfit/job/civilian/chef
- 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
- html_description = {"
- Difficulty: Medium
- You answer to the acting SOM commander
- Unlock Requirement: Starting Role
- Gamemode Availability: Campaign
- Duty: Keep the SOM well fed and happy. Fight for your team if things get desperate.
- "}
- minimap_icon = "medical"
-
-/datum/job/som/civilian/chef/after_spawn(mob/living/carbon/new_mob, mob/user, latejoin = FALSE)
- . = ..()
- if(!ishuman(new_mob))
- return
- var/mob/living/carbon/human/new_human = new_mob
- var/playtime_mins = user?.client?.get_exp(title)
- if(!playtime_mins || playtime_mins < 1 )
- return
- switch(playtime_mins)
- if(0 to 3000) // starting
- new_human.wear_id.paygrade = "SOM_E1"
- if(3001 to INFINITY) // 50 hrs
- new_human.wear_id.paygrade = "SOM_E2"
-
-/datum/job/som/civilian/chef/radio_help_message(mob/M)
- . = ..()
- to_chat(M, {"You are a chef stationed behind the frontlines.
-You are tasked with keeping the SOM well fed and happy, usually in the form of delicious food.
-You are also an expert when it comes to botany and hydroponics. If you do not know what you are doing, mentorhelp so a mentor can assist you."})
-
-
-/datum/outfit/job/civilian/chef
- name = SOM_CHEF
- jobtype = /datum/job/som/civilian/chef
-
- id = /obj/item/card/id
- belt = /obj/item/storage/belt/rig/medical
- ears = /obj/item/radio/headset/mainship/doc
- w_uniform = /obj/item/clothing/under/rank/medical/purple
- wear_suit = /obj/item/clothing/suit/storage/labcoat
- shoes = /obj/item/clothing/shoes/white
- gloves = /obj/item/clothing/gloves/latex
- glasses = /obj/item/clothing/glasses/hud/health
- mask = /obj/item/clothing/mask/surgical
- head = /obj/item/clothing/head/surgery/purple
-
-/datum/outfit/job/civilian/chef/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- . = ..()
- H.equip_to_slot_or_del(new /obj/item/tweezers, SLOT_IN_BACKPACK)
- H.equip_to_slot_or_del(new /obj/item/reagent_containers/glass/bottle/lemoline/doctor, SLOT_IN_BACKPACK)
diff --git a/code/datums/jobs/job/sonsofmars.dm b/code/datums/jobs/job/sonsofmars.dm
index 0c42d4e267ac1..874184873c5a0 100644
--- a/code/datums/jobs/job/sonsofmars.dm
+++ b/code/datums/jobs/job/sonsofmars.dm
@@ -21,7 +21,7 @@
/datum/job/som/squad/radio_help_message(mob/M)
. = ..()
- if(istype(SSticker.mode, /datum/game_mode/hvh/combat_patrol))
+ if(istype(SSticker.mode, /datum/game_mode/combat_patrol))
if(issensorcapturegamemode(SSticker.mode))
to_chat(M, span_highdanger("Your platoon has orders to defend sensor towers in the AO and prevent them from reactivation by TerraGov forces until heavy reeinforcement arrives. High Command considers the successful prevention of the reactivation of the sensor towers a major victory"))
else
diff --git a/code/datums/jobs/job/terragov.dm b/code/datums/jobs/job/terragov.dm
index 57b1e7326d4cd..947afe41ae540 100644
--- a/code/datums/jobs/job/terragov.dm
+++ b/code/datums/jobs/job/terragov.dm
@@ -3,7 +3,7 @@
/datum/job/terragov/radio_help_message(mob/M)
. = ..()
- if(istype(SSticker.mode, /datum/game_mode/hvh/combat_patrol))
+ if(istype(SSticker.mode, /datum/game_mode/combat_patrol))
if(issensorcapturegamemode(SSticker.mode))
to_chat(M, span_highdanger("Your platoon has orders to attack sensor towers in the AO and reactivate them in order to alert other TerraGov forces in the sector about the invasion. High Command considers the successful reactivation of the sensor towers a major victory"))
else
diff --git a/code/datums/jobs/squads.dm b/code/datums/jobs/squads.dm
index ccf9f304d3d14..c6696c9446133 100644
--- a/code/datums/jobs/squads.dm
+++ b/code/datums/jobs/squads.dm
@@ -10,9 +10,7 @@
SQUAD_ENGINEER = 0,
SQUAD_CORPSMAN = 0,
SQUAD_SMARTGUNNER = 0,
- SQUAD_LEADER = 0,
- SQUAD_ROBOT = 0, //for campaign
- )
+ SQUAD_LEADER = 0)
var/max_positions = list(
SQUAD_MARINE = -1,
SQUAD_LEADER = 1)
@@ -179,7 +177,7 @@
if((ismarineleaderjob(new_squaddie.job) || issommarineleaderjob(new_squaddie.job)) && !squad_leader)
squad_leader = new_squaddie
SSdirection.set_leader(tracking_id, new_squaddie)
- SSdirection.start_tracking(faction == FACTION_SOM ? TRACKING_ID_SOM_COMMANDER : TRACKING_ID_MARINE_COMMANDER, new_squaddie)
+ SSdirection.start_tracking(TRACKING_ID_MARINE_COMMANDER, new_squaddie)
var/obj/item/radio/headset/mainship/headset = new_squaddie.wear_ear
if(give_radio && !istype(headset))
@@ -269,7 +267,6 @@
SSdirection.clear_leader(tracking_id)
SSdirection.stop_tracking(TRACKING_ID_MARINE_COMMANDER, squad_leader)
- SSdirection.stop_tracking(TRACKING_ID_SOM_COMMANDER, squad_leader)
//Handle aSL skill level and radio
if(!ismarineleaderjob(squad_leader.job) && !issommarineleaderjob(squad_leader.job))
@@ -300,7 +297,7 @@
squad_leader = H
SSdirection.set_leader(tracking_id, H)
- SSdirection.start_tracking(faction == FACTION_SOM ? TRACKING_ID_SOM_COMMANDER : TRACKING_ID_MARINE_COMMANDER, H)
+ SSdirection.start_tracking(TRACKING_ID_MARINE_COMMANDER, H)
//Handle aSL skill level and radio
if(!ismarineleaderjob(squad_leader.job) && !issommarineleaderjob(squad_leader.job))
diff --git a/code/datums/quick_load_outfits.dm b/code/datums/quick_load_outfits.dm
index 8522d481c1245..b9cd36db31969 100644
--- a/code/datums/quick_load_outfits.dm
+++ b/code/datums/quick_load_outfits.dm
@@ -939,7 +939,7 @@
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/tactical/range, SLOT_IN_ACCESSORY)
/datum/outfit/quick/tgmc/leader/standard_carbine
name = "AR-18 Patrol Leader"
@@ -967,7 +967,7 @@
H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/tactical/range, SLOT_IN_ACCESSORY)
/datum/outfit/quick/tgmc/leader/combat_rifle
name = "AR-11 Patrol Leader"
@@ -995,7 +995,7 @@
H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/tactical/range, SLOT_IN_ACCESSORY)
/datum/outfit/quick/tgmc/leader/standard_battlerifle
name = "BR-64 Patrol Leader"
@@ -1022,7 +1022,7 @@
H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/sticky, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/tactical/range, SLOT_IN_ACCESSORY)
/datum/outfit/quick/tgmc/leader/auto_shotgun
name = "SH-15 Patrol Leader"
@@ -1050,7 +1050,7 @@
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/m15, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb/cloak, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/tactical/range, SLOT_IN_ACCESSORY)
/datum/outfit/quick/tgmc/leader/standard_laserrifle
name = "Laser Rifle Patrol Leader"
@@ -1078,7 +1078,7 @@
H.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank/mini, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/tactical/range, SLOT_IN_ACCESSORY)
/datum/outfit/quick/tgmc/leader/oicw
name = "AR-55 Patrol Leader"
@@ -1103,7 +1103,7 @@
H.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/vp70, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/storage/box/MRE, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/plastique, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/tactical/range, SLOT_IN_ACCESSORY)
//// SOM loadouts ////
@@ -2112,7 +2112,7 @@
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/cell/lasgun/volkite/small, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/tactical/range, SLOT_IN_ACCESSORY)
/datum/outfit/quick/som/squad_leader/standard_smg
name = "V-21 Squad Leader"
@@ -2136,7 +2136,7 @@
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/tactical/range, SLOT_IN_ACCESSORY)
/datum/outfit/quick/som/squad_leader/charger
name = "Charger Squad Leader"
@@ -2156,7 +2156,7 @@
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/tactical/range, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
@@ -2178,7 +2178,7 @@
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/tactical/range, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang/stun, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/storage/box/MRE/som, SLOT_IN_ACCESSORY)
@@ -2203,4 +2203,4 @@
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
H.equip_to_slot_or_del(new /obj/item/explosive/grenade/som, SLOT_IN_ACCESSORY)
- H.equip_to_slot_or_del(new /obj/item/binoculars/fire_support/campaign/som, SLOT_IN_ACCESSORY)
+ H.equip_to_slot_or_del(new /obj/item/binoculars/tactical/range, SLOT_IN_ACCESSORY)
diff --git a/code/datums/weather/weather_types/acid_rain.dm b/code/datums/weather/weather_types/acid_rain.dm
index 49b038bfcc60e..23491858f2f85 100644
--- a/code/datums/weather/weather_types/acid_rain.dm
+++ b/code/datums/weather/weather_types/acid_rain.dm
@@ -58,7 +58,6 @@
L.fire_stacks = max(-20, L.fire_stacks - 1)
/datum/weather/acid_rain/harmless
- target_trait = ZTRAIT_RAIN
telegraph_message = span_boldannounce("Thunder rumbles far above. You hear droplets drumming against the canopy.")
telegraph_overlay = "rain_med"
diff --git a/code/game/area/campaign_maps/jungle_outpost.dm b/code/game/area/campaign_maps/jungle_outpost.dm
deleted file mode 100644
index f70ef395e3e12..0000000000000
--- a/code/game/area/campaign_maps/jungle_outpost.dm
+++ /dev/null
@@ -1,187 +0,0 @@
-//Jungle outpost areas
-/area/campaign/jungle_outpost
- icon_state = "lv-626"
-
-/area/campaign/jungle_outpost/ground
- name = "Ground"
- icon_state = "green"
- always_unpowered = TRUE
- ambience = list('sound/ambience/jungle_amb1.ogg')
-
-//Jungle
-/area/campaign/jungle_outpost/ground/jungle
- name = "Central Jungle"
- icon_state = "central"
- minimap_color = MINIMAP_AREA_JUNGLE
-
-/area/campaign/jungle_outpost/ground/jungle/south_west
- name = "Southwestern Jungle"
- icon_state = "southwest"
-
-/area/campaign/jungle_outpost/ground/jungle/south_east
- name = "Southeastern Jungle"
- icon_state = "southeast"
-
-/area/campaign/jungle_outpost/ground/jungle/north_west
- name = "Northwestern Jungle"
- icon_state = "northwest"
-
-/area/campaign/jungle_outpost/ground/jungle/north_east
- name = "Northeastern Jungle"
- icon_state = "northeast"
-
-/area/campaign/jungle_outpost/ground/jungle/west
- name = "Western Jungle"
- icon_state = "west"
-
-/area/campaign/jungle_outpost/ground/jungle/south
- name = "Southern Jungle"
- icon_state = "south"
-
-/area/campaign/jungle_outpost/ground/jungle/east
- name = "Eastern Jungle"
- icon_state = "east"
-
-/area/campaign/jungle_outpost/ground/jungle/north
- name = "Northern Jungle"
- icon_state = "north"
-
-//river
-/area/campaign/jungle_outpost/ground/river
- name = "\improper Southern River"
- icon_state = "blueold"
-
-/area/campaign/jungle_outpost/ground/river/north
- name = "\improper Northern River"
-
-/area/campaign/jungle_outpost/ground/river/west
- name = "\improper Western River"
-
-/area/campaign/jungle_outpost/ground/river/east
- name = "\improper Eastern River"
-
-/area/campaign/jungle_outpost/ground/river/lake
- name = "\improper Southern Lake"
-
-//outpost
-/area/campaign/jungle_outpost/outpost
- name = "\improper Outpost"
- icon_state = "green"
- ceiling = CEILING_METAL
- outside = FALSE
- minimap_color = MINIMAP_AREA_COLONY
-
-/area/campaign/jungle_outpost/outpost/medbay
- name = "\improper Medbay"
- icon_state = "medbay"
- minimap_color = MINIMAP_AREA_MEDBAY
-
-/area/campaign/jungle_outpost/outpost/medbay/lobby
- name = "\improper Medbay Lobby"
- icon_state = "medbay2"
-
-/area/campaign/jungle_outpost/outpost/medbay/chemistry
- name = "\improper Chemistry"
- icon_state = "chem"
-
-/area/campaign/jungle_outpost/outpost/security
- name = "\improper Security Station"
- icon_state = "security"
- minimap_color = MINIMAP_AREA_SEC
-
-/area/campaign/jungle_outpost/outpost/security/vault
- name = "\improper Vault"
- icon_state = "security"
-
-/area/campaign/jungle_outpost/outpost/command
- name = "\improper Operations"
- icon_state = "bridge"
- minimap_color = MINIMAP_AREA_COMMAND
-
-/area/campaign/jungle_outpost/outpost/command/captain
- name = "\improper Executive Office"
- icon_state = "captain"
-
-/area/campaign/jungle_outpost/outpost/engineering
- name = "\improper Engineering"
- icon_state = "engine_smes"
- minimap_color = MINIMAP_AREA_ENGI
-
-/area/campaign/jungle_outpost/outpost/living
- name = "\improper Living Quarters"
- icon_state = "Sleep"
- minimap_color = MINIMAP_AREA_LIVING
-
-/area/campaign/jungle_outpost/outpost/living/bathroom
- name = "\improper Bathrooms"
- icon_state = "restrooms"
-
-/area/campaign/jungle_outpost/outpost/living/canteen
- name = "\improper Canteen"
- icon_state = "cafeteria"
-
-/area/campaign/jungle_outpost/outpost/living/kitchen
- name = "\improper Kitchen"
- icon_state = "kitchen"
-
-/area/campaign/jungle_outpost/outpost/living/hydro
- name = "\improper Hydroponics Dome"
- icon_state = "hydro"
-
-/area/campaign/jungle_outpost/outpost/req
- name = "\improper Cargo Bay"
- icon_state = "quart"
- minimap_color = MINIMAP_AREA_REQ
-
-/area/campaign/jungle_outpost/outpost/req/qm
- name = "\improper Quartermaster's Office"
- icon_state = "quartoffice"
-
-/area/campaign/jungle_outpost/outpost/req/depot
- name = "\improper Cargo Depot"
- icon_state = "quartstorage"
-
-/area/campaign/jungle_outpost/outpost/req/containers
- name = "\improper Container storage"
- icon_state = "container_yard"
- outside = TRUE
- ceiling = CEILING_NONE
- always_unpowered = TRUE
-
-/area/campaign/jungle_outpost/outpost/science
- name = "\improper Research Lab"
- icon_state = "toxlab"
- minimap_color = MINIMAP_AREA_RESEARCH
-
-/area/campaign/jungle_outpost/outpost/science/south
- name = "\improper Southern Research Lab"
- icon_state = "toxlab"
-
-/area/campaign/jungle_outpost/outpost/science/office
- name = "\improper Science Director's office"
- icon_state = "toxlab"
-
-/area/campaign/jungle_outpost/outpost/landing
- name = "\improper Landing pad"
- icon_state = "landing_pad_ext"
- minimap_color = MINIMAP_AREA_LZ
- outside = TRUE
- ceiling = CEILING_NONE
- always_unpowered = TRUE
-
-/area/campaign/jungle_outpost/outpost/landing/storage
- name = "\improper Landing pad storage"
- icon_state = "landing_pad"
-
-/area/campaign/jungle_outpost/outpost/outer/southwest
- name = "\improper Southwestern dome"
- icon_state = "green"
-
-/area/campaign/jungle_outpost/outpost/outer/west
- name = "\improper Western dome"
- icon_state = "green"
-
-/area/campaign/jungle_outpost/outpost/outer/hermit
- name = "\improper Hermit's home"
- icon_state = "green"
- always_unpowered = TRUE
diff --git a/code/game/area/mainship.dm b/code/game/area/mainship.dm
index 5c9cc6b3af9cb..4bb13efc63f6b 100755
--- a/code/game/area/mainship.dm
+++ b/code/game/area/mainship.dm
@@ -479,49 +479,9 @@
icon_state = "req"
requires_power = FALSE
-/area/mainship/patrol_base/hanger
- name = "TGMC Hanger"
- icon_state = "hangar"
- minimap_color = MINIMAP_AREA_LZ
-
-/area/mainship/patrol_base/command
- name = "TGMC Bridge"
- icon_state = "bridge"
- minimap_color = MINIMAP_AREA_COMMAND
-
-/area/mainship/patrol_base/prep
- name = "TGMC Preparations"
- icon_state = "mainship"
- minimap_color = MINIMAP_AREA_PREP
-
-/area/mainship/patrol_base/barracks
- name = "TGMC Barracks"
- icon_state = "cryo"
- minimap_color = MINIMAP_AREA_LIVING
-
/area/mainship/patrol_base/som
name = "SOM Combat Patrol Base"
-/area/mainship/patrol_base/som/hanger
- name = "SOM Main Hanger"
- icon_state = "hangar"
- minimap_color = MINIMAP_AREA_LZ
-
-/area/mainship/patrol_base/som/command
- name = "SOM Command"
- icon_state = "bridge"
- minimap_color = MINIMAP_AREA_COMMAND
-
-/area/mainship/patrol_base/som/prep
- name = "SOM Preparations"
- icon_state = "mainship"
- minimap_color = MINIMAP_AREA_PREP
-
-/area/mainship/patrol_base/som/barracks
- name = "SOM Barracks"
- icon_state = "cryo"
- minimap_color = MINIMAP_AREA_LIVING
-
/area/mainship/patrol_base/telecomms
name = "Telecommunications"
icon_state = "tcomms"
diff --git a/code/game/objects/effects/decals/turfdecals/environmental.dm b/code/game/objects/effects/decals/turfdecals/environmental.dm
index 1edc04bd59ef6..e25745b368265 100755
--- a/code/game/objects/effects/decals/turfdecals/environmental.dm
+++ b/code/game/objects/effects/decals/turfdecals/environmental.dm
@@ -11,23 +11,6 @@
/obj/effect/turf_decal/grassdecal/center
icon_state = "grassdecal_center"
-/obj/effect/turf_decal/grassdecal/autosmooth
- mouse_opacity = MOUSE_OPACITY_ICON
- icon = 'icons/obj/flora/smooth/grass_decal.dmi'
- icon_state = "jungle-border-icon"
- base_icon_state = "jungle-border"
- smoothing_flags = SMOOTH_BITMASK
- smoothing_groups = list(SMOOTH_GROUP_JUNGLE_FLOOR)
- canSmoothWith = list(
- SMOOTH_GROUP_JUNGLE_FLOOR,
- SMOOTH_GROUP_ASTEROID_WARNING,
- SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS,
- SMOOTH_GROUP_MINERAL_STRUCTURES,
- SMOOTH_GROUP_WINDOW_FULLTILE,
- SMOOTH_GROUP_FLORA,
- SMOOTH_GROUP_WINDOW_FRAME,
- )
-
/obj/effect/turf_decal/lvsanddecal
icon = 'icons/turf/ground_map.dmi'
icon_state = "lvsanddecal_edge"
diff --git a/code/game/objects/effects/landmarks/gamemode/campaign_reward_spawns.dm b/code/game/objects/effects/landmarks/gamemode/campaign_reward_spawns.dm
deleted file mode 100644
index 2f22ac4f02c77..0000000000000
--- a/code/game/objects/effects/landmarks/gamemode/campaign_reward_spawns.dm
+++ /dev/null
@@ -1,22 +0,0 @@
-//When various rewards are spawned, they are sent to an available spawn location
-/obj/effect/landmark/reward_spawn_location
- name = "TGMC Reward spawn location"
- desc = "THIS SHOULDN'T BE VISIBLE"
- icon = 'icons/obj/structures/campaign_structures.dmi'
- icon_state = "tgmc_reward_spawn"
- ///Faction associated with this location
- var/faction = FACTION_TERRAGOV
-
-/obj/effect/landmark/reward_spawn_location/Initialize(mapload)
- . = ..()
- LAZYADDASSOC(GLOB.campaign_reward_spawners, faction, src)
- icon_state = null
-
-/obj/effect/landmark/reward_spawn_location/Destroy()
- LAZYREMOVEASSOC(GLOB.campaign_reward_spawners, faction, src)
- return ..()
-
-/obj/effect/landmark/reward_spawn_location/som
- name = "SOM Reward spawn location"
- icon_state = "som_reward_spawn"
- faction = FACTION_SOM
diff --git a/code/game/objects/effects/landmarks/marine_spawns.dm b/code/game/objects/effects/landmarks/marine_spawns.dm
index 9c7ca88eba8a9..2962702d074d0 100644
--- a/code/game/objects/effects/landmarks/marine_spawns.dm
+++ b/code/game/objects/effects/landmarks/marine_spawns.dm
@@ -120,11 +120,3 @@
/obj/effect/landmark/start/job/som/squadleader
icon_state = "SL"
job = /datum/job/som/squad/leader
-
-/obj/effect/landmark/start/job/som/fieldcommander
- icon_state = "SL" //placeholder
- job = /datum/job/som/command/fieldcommander
-
-/obj/effect/landmark/start/job/som/general
- icon_state = "SL" //placeholder
- job = /datum/job/som/command/general
diff --git a/code/game/objects/effects/landmarks/mob_spawner.dm b/code/game/objects/effects/landmarks/mob_spawner.dm
deleted file mode 100644
index ec4d413aa4607..0000000000000
--- a/code/game/objects/effects/landmarks/mob_spawner.dm
+++ /dev/null
@@ -1,27 +0,0 @@
-//One off mob spawners
-/obj/effect/landmark/mob_spawner
- name = "MOB SPAWNER"
- ///The type of mob to spawn
- var/mob/living/mob_spawn
- ///Spawn probability
- var/spawn_prob = 100
-
-/obj/effect/landmark/mob_spawner/Initialize(mapload)
- . = ..()
- if(prob(spawn_prob))
- new mob_spawn(loc)
- qdel(src)
-
-/obj/effect/landmark/mob_spawner/monkey
- name = "monkey spawner"
- icon = 'icons/mob/human_races/r_monkey.dmi'
- icon_state = "monke"
- mob_spawn = /mob/living/carbon/human/species/monkey
- spawn_prob = 50
-
-/obj/effect/landmark/mob_spawner/farwa
- name = "farwa spawner"
- icon = 'icons/mob/human_races/r_farwa.dmi'
- icon_state = "monke"
- mob_spawn = /mob/living/carbon/human/species/monkey/farwa
- spawn_prob = 50
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index c33bb8e7c6002..ad6dad7a941e8 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -269,20 +269,6 @@ GLOBAL_LIST_EMPTY(blood_particles)
animate(src, time=duration, transform=matrix().Scale(0.1,0.1))
set_light(2, 2, LIGHT_COLOR_DARK_BLUE)
-/obj/effect/temp_visual/teleporter_array
- icon = 'icons/effects/light_overlays/light_320.dmi'
- icon_state = "light"
- plane = GRAVITY_PULSE_PLANE
- duration = 15
-
-/obj/effect/temp_visual/teleporter_array/Initialize(mapload)
- . = ..()
- var/image/I = image(icon, src, icon_state, 10, pixel_x = -144, pixel_y = -144)
- overlays += I //we use an overlay so the icon and light source are both in the correct location
- icon_state = null
- animate(src, time=duration, transform=matrix().Scale(0.1,0.1))
- set_light(9, 9, LIGHT_COLOR_DARK_BLUE)
-
/obj/effect/temp_visual/shockwave
icon = 'icons/effects/light_overlays/shockwave.dmi'
icon_state = "shockwave"
diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm
index b0b1eb4b0cd99..09df8cc846cb0 100644
--- a/code/game/objects/effects/temporary_visuals/temporary_visual.dm
+++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm
@@ -111,21 +111,3 @@ GLOBAL_DATUM_INIT(flare_particles, /particles/flare_smoke, new)
loc.visible_message(span_warning("You see a tiny flash, and then a blindingly bright light from a flare as it lights off in the sky!"))
playsound(loc, 'sound/weapons/guns/fire/flare.ogg', 50, 1, 4)
animate(src, time = duration, pixel_y = 0)
-
-/obj/effect/temp_visual/dropship_flyby
- icon = 'icons/Marine/dropship_prop.dmi'
- icon_state = "fighter_shadow"
- layer = FLY_LAYER
- resistance_flags = RESIST_ALL
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- duration = 3 SECONDS
- pixel_x = -48
- pixel_y = -120
- pixel_z = -480
-
-/obj/effect/temp_visual/dropship_flyby/Initialize()
- . = ..()
- animate(src, pixel_z = 960, time = 3 SECONDS)
-
-/obj/effect/temp_visual/dropship_flyby/som
- icon_state = "harbinger_shadow"
diff --git a/code/game/objects/items/binoculars.dm b/code/game/objects/items/binoculars.dm
index b684ac75cb19e..17791521a48fa 100755
--- a/code/game/objects/items/binoculars.dm
+++ b/code/game/objects/items/binoculars.dm
@@ -3,10 +3,7 @@
name = "binoculars"
desc = "A pair of binoculars."
icon_state = "binoculars"
- item_icons = list(
- slot_l_hand_str = 'icons/mob/inhands/equipment/binoculars_left.dmi',
- slot_r_hand_str = 'icons/mob/inhands/equipment/binoculars_right.dmi',
- )
+
flags_atom = CONDUCT
force = 5
w_class = WEIGHT_CLASS_SMALL
@@ -31,7 +28,6 @@
/obj/item/binoculars/tactical
name = "tactical binoculars"
desc = "A pair of binoculars, with a laser targeting function. Unique action to toggle mode. Alt+Click to change selected linked artillery. Ctrl+Click when using to target something. Shift+Click to get coordinates. Ctrl+Shift+Click to fire OB when lasing in OB mode"
- icon_state = "range_finders"
var/laser_cooldown = 0
var/cooldown_duration = 200 //20 seconds
var/obj/effect/overlay/temp/laser_target/laser
@@ -143,7 +139,7 @@
. = ..()
if(!length(linked_mortars))
return
- if(length(linked_mortars) == 1)
+ if(length(linked_mortars) == 1)
to_chat(user, span_notice("There is only one linked piece, you can't switch to another."))
selected_mortar += 1
check_mortar_index()
diff --git a/code/game/objects/items/explosives/grenades/grenade.dm b/code/game/objects/items/explosives/grenades/grenade.dm
index de95fabaf0cad..8b6adabe84b39 100644
--- a/code/game/objects/items/explosives/grenades/grenade.dm
+++ b/code/game/objects/items/explosives/grenades/grenade.dm
@@ -144,3 +144,14 @@
strength = victim.modify_by_armor(strength, BIO, 25)
victim.apply_radiation(strength, sound_level)
qdel(src)
+
+///Applies the actual effects of the rad grenade
+/obj/item/explosive/grenade/rad/proc/irradiate(mob/living/victim, strength)
+ var/effective_strength = max(victim.modify_by_armor(strength, BIO), strength * 0.25)
+ victim.adjustCloneLoss(effective_strength)
+ victim.adjustStaminaLoss(effective_strength * 7)
+ victim.adjust_stagger(effective_strength SECONDS * 0.5)
+ victim.add_slowdown(effective_strength * 0.5)
+ victim.blur_eyes(effective_strength) //adds a visual indicator that you've just been irradiated
+ victim.adjust_radiation(effective_strength * 20) //Radiation status effect, duration is in deciseconds
+ balloon_alert(victim, "weakened by radiation")
diff --git a/code/game/objects/items/firesupport_binoculars.dm b/code/game/objects/items/firesupport_binoculars.dm
deleted file mode 100644
index 276919c4bbed2..0000000000000
--- a/code/game/objects/items/firesupport_binoculars.dm
+++ /dev/null
@@ -1,208 +0,0 @@
-/obj/item/binoculars/fire_support
- name = "tactical binoculars"
- desc = "A pair of binoculars, used to mark targets for airstrikes and cruise missiles. Unique action to toggle mode. Ctrl+Click when using to target something."
- icon_state = "range_finders"
- w_class = WEIGHT_CLASS_SMALL
- ///Faction locks this item if specified
- var/faction = null
- ///lase effect
- var/obj/effect/overlay/temp/laser_target/laser
- var/target_acquisition_delay = 5 SECONDS
- ///Last stored turf targetted by rangefinders
- var/turf/targetturf
- ///Current mode for support request
- var/datum/fire_support/mode = null
- ///firemodes available for these binos
- var/list/datum/fire_support/mode_list = list(
- FIRESUPPORT_TYPE_GUN_UNLIMITED,
- FIRESUPPORT_TYPE_ROCKETS_UNLIMITED,
- FIRESUPPORT_TYPE_CRUISE_MISSILE_UNLIMITED,
- )
-
-/obj/item/binoculars/fire_support/Initialize()
- . = ..()
- update_icon()
- for(var/fire_support_type in mode_list)
- mode_list[fire_support_type] = GLOB.fire_support_types[fire_support_type]
-
-/obj/item/binoculars/fire_support/unique_action(mob/user)
- . = ..()
- select_radial(user)
- return TRUE
-
-/obj/item/binoculars/fire_support/examine(mob/user)
- . = ..()
- . += span_notice("They are currently set to [mode.name] targeting mode.")
-
-/obj/item/binoculars/fire_support/Destroy()
- if(laser)
- QDEL_NULL(laser)
- mode = null
- mode_list = null
- targetturf = null
- return ..()
-
-
-/obj/item/binoculars/fire_support/InterceptClickOn(mob/user, params, atom/object)
- var/list/pa = params2list(params)
- if(!pa.Find("ctrl") && pa.Find("shift"))
- acquire_coordinates(object, user)
- return TRUE
-
- if(pa.Find("ctrl") && !pa.Find("shift"))
- acquire_target(object, user)
- return TRUE
-
- return FALSE
-
-/obj/item/binoculars/fire_support/onzoom(mob/living/user)
- . = ..()
- user.reset_perspective(src)
- user.update_sight()
- user.client.click_intercept = src
-
-/obj/item/binoculars/fire_support/onunzoom(mob/living/user)
- . = ..()
-
- QDEL_NULL(laser)
-
- if(!user?.client)
- return
-
- user.client.click_intercept = null
- user.reset_perspective(user)
- user.update_sight()
-
-
-/obj/item/binoculars/fire_support/update_remote_sight(mob/living/user)
- user.see_in_dark = 32 // Should include the offset from zoom and client viewport
- user.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
- user.sync_lighting_plane_alpha()
- return TRUE
-
-/obj/item/binoculars/fire_support/update_overlays()
- . = ..()
- if(mode)
- . += "binoculars_range"
- else
- . += "binoculars_laser"
-
-///Selects a firemode
-/obj/item/binoculars/fire_support/proc/select_radial(mob/user)
- if(user.get_active_held_item() != src)
- return
- if(!can_interact(user))
- return TRUE
-
- var/list/radial_options = list()
- for(var/fire_support_type in mode_list)
- if(!mode_list[fire_support_type].uses || !(mode_list[fire_support_type].fire_support_flags & FIRESUPPORT_AVAILABLE))
- continue
- radial_options[mode_list[fire_support_type].name] = image(icon = 'icons/mob/radial.dmi', icon_state = mode_list[fire_support_type].icon_state)
-
- var/mode_selected = show_radial_menu(user, src, radial_options, null, 48, null, TRUE, TRUE)
- for(var/option in mode_list)
- if(mode_list[option].name != mode_selected)
- continue
- mode = mode_list[option]
- user.balloon_alert(user, "[mode_selected] mode")
- update_icon()
-
-///lases a target and calls fire support on it
-/obj/item/binoculars/fire_support/proc/acquire_target(atom/A, mob/living/carbon/human/user)
- set waitfor = 0
- if(is_mainship_level(user.z))
- user.balloon_alert(user, "Can't use here")
- return
- if(faction && user.faction != faction)
- balloon_alert_to_viewers("Security locks engaged")
- return
- if(laser)
- to_chat(user, span_warning("You're already targeting something."))
- return
- if(!mode)
- balloon_alert_to_viewers("Select a mode!")
- return
- if(!(mode.fire_support_flags & FIRESUPPORT_AVAILABLE))
- balloon_alert_to_viewers("[mode.name] unavailable")
- return
- if(!mode.uses)
- balloon_alert_to_viewers("[mode.name] expended")
- return
- if(mode.cooldown_timer)
- balloon_alert_to_viewers("On cooldown")
- return
-
- var/turf/TU = get_turf(A)
- var/distance = get_dist(TU, get_turf(user))
- var/zoom_screen_size = zoom_tile_offset + zoom_viewsize + 1
- if(TU.z != user.z || distance == -1 || (distance > zoom_screen_size))
- to_chat(user, span_warning("You can't focus properly through \the [src] while looking through something else."))
- return
-
- if(!user.mind)
- return
-
- var/area/targ_area = get_area(A)
- if(isspacearea(targ_area))
- to_chat(user, span_warning("Cannot fire into space."))
- return
- if(targ_area.ceiling >= CEILING_UNDERGROUND)
- to_chat(user, span_warning("DEPTH WARNING: Target too deep for ordnance."))
- return
- if(user.do_actions)
- return
- playsound(src, 'sound/effects/nightvision.ogg', 35)
- to_chat(user, span_notice("INITIATING LASER TARGETING. Stand still."))
- var/obj/effect/overlay/temp/laser_target/cas/CS = new (TU)
- laser = CS
- if(!do_after(user, target_acquisition_delay, TRUE, user, BUSY_ICON_HOSTILE))
- return
- if(!mode)
- balloon_alert_to_viewers("Select a mode!")
- return
- if(!(mode.fire_support_flags & FIRESUPPORT_AVAILABLE))
- balloon_alert_to_viewers("[mode.name] unavailable")
- return
- if(!mode.uses)
- balloon_alert_to_viewers("[mode.name] expended")
- return
- if(mode.cooldown_timer)
- balloon_alert_to_viewers("On cooldown")
- return
-
- playsound(src, 'sound/effects/binoctarget.ogg', 35)
- QDEL_NULL(laser)
- mode.initiate_fire_support(TU, user)
-
-///Acquires coords of a target turf
-/obj/item/binoculars/fire_support/proc/acquire_coordinates(atom/A, mob/living/carbon/human/user)
- var/turf/TU = get_turf(A)
- targetturf = TU
- to_chat(user, span_notice("COORDINATES: LONGITUDE [targetturf.x]. LATITUDE [targetturf.y]."))
- playsound(src, 'sound/effects/binoctarget.ogg', 35)
-
-
-/obj/item/binoculars/fire_support/campaign
- faction = FACTION_TERRAGOV
- mode_list = list(
- FIRESUPPORT_TYPE_GUN,
- FIRESUPPORT_TYPE_ROCKETS,
- FIRESUPPORT_TYPE_CRUISE_MISSILE,
- FIRESUPPORT_TYPE_HE_MORTAR,
- FIRESUPPORT_TYPE_INCENDIARY_MORTAR,
- FIRESUPPORT_TYPE_SMOKE_MORTAR,
- FIRESUPPORT_TYPE_ACID_SMOKE_MORTAR,
- )
-
-/obj/item/binoculars/fire_support/campaign/som
- faction = FACTION_SOM
- mode_list = list(
- FIRESUPPORT_TYPE_VOLKITE,
- FIRESUPPORT_TYPE_INCEND_ROCKETS,
- FIRESUPPORT_TYPE_RAD_MISSILE,
- FIRESUPPORT_TYPE_HE_MORTAR_SOM,
- FIRESUPPORT_TYPE_INCENDIARY_MORTAR_SOM,
- FIRESUPPORT_TYPE_SMOKE_MORTAR_SOM,
- FIRESUPPORT_TYPE_SATRAPINE_SMOKE_MORTAR,
- )
diff --git a/code/game/objects/items/radio/headset.dm b/code/game/objects/items/radio/headset.dm
index 9fb62d7f817d9..0f6b4fa6b853e 100644
--- a/code/game/objects/items/radio/headset.dm
+++ b/code/game/objects/items/radio/headset.dm
@@ -173,10 +173,11 @@ GLOBAL_LIST_INIT(channel_tokens, list(
/obj/item/radio/headset/mainship/Initialize(mapload)
. = ..()
- if(faction == FACTION_SOM)
- camera = new /obj/machinery/camera/headset/som(src)
- else
- camera = new /obj/machinery/camera/headset(src)
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/item/radio/headset/mainship/LateInitialize()
+ . = ..()
+ camera = new /obj/machinery/camera/headset(src)
/obj/item/radio/headset/mainship/equipped(mob/living/carbon/human/user, slot)
if(slot == SLOT_EARS)
@@ -303,7 +304,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
wearer.hud_used.SL_locator.alpha = 128
if(wearer.assigned_squad.squad_leader == wearer)
SSdirection.set_leader(wearer.assigned_squad.tracking_id, wearer)
- SSdirection.start_tracking(faction == FACTION_SOM ? TRACKING_ID_SOM_COMMANDER : TRACKING_ID_MARINE_COMMANDER, wearer)
+ SSdirection.start_tracking(TRACKING_ID_MARINE_COMMANDER, wearer)
else
SSdirection.start_tracking(wearer.assigned_squad.tracking_id, wearer)
@@ -321,7 +322,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
if(wearer.assigned_squad.squad_leader == wearer)
SSdirection.clear_leader(wearer.assigned_squad.tracking_id)
- SSdirection.stop_tracking(faction == FACTION_SOM ? TRACKING_ID_SOM_COMMANDER : TRACKING_ID_MARINE_COMMANDER, wearer)
+ SSdirection.stop_tracking(TRACKING_ID_MARINE_COMMANDER, wearer)
else
SSdirection.stop_tracking(wearer.assigned_squad.tracking_id, wearer)
diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm
index ce027ab374ed3..8fda1e0d59d3c 100644
--- a/code/game/objects/items/storage/holsters.dm
+++ b/code/game/objects/items/storage/holsters.dm
@@ -644,17 +644,6 @@
desc = "A quality pistol belt of a style typically seen worn by SOM officers. It looks old, but well looked after."
icon_state = "som_belt_pistol_fancy"
-/obj/item/storage/holster/belt/pistol/m4a3/som/fancy/fieldcommander/Initialize(mapload)
- . = ..()
- var/obj/item/weapon/gun/new_gun = new /obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta/custom(src)
- new /obj/item/cell/lasgun/volkite/small(src)
- new /obj/item/cell/lasgun/volkite/small(src)
- new /obj/item/cell/lasgun/volkite/small(src)
- new /obj/item/cell/lasgun/volkite/small(src)
- new /obj/item/cell/lasgun/volkite/small(src)
- new /obj/item/cell/lasgun/volkite/small(src)
- INVOKE_ASYNC(src, PROC_REF(handle_item_insertion), new_gun)
-
/obj/item/storage/holster/belt/pistol/stand
name = "\improper M276 pattern M4A3 holster rig"
desc = "The M276 is the standard load-bearing equipment of the TGMC. It consists of a modular belt with various clips. This version has a holster assembly that allows one to carry the M4A3 comfortably secure. It also contains side pouches that can store 9mm or .45 magazines."
diff --git a/code/game/objects/machinery/camera/camera.dm b/code/game/objects/machinery/camera/camera.dm
index d1a45c29f527a..dac909103bdf7 100644
--- a/code/game/objects/machinery/camera/camera.dm
+++ b/code/game/objects/machinery/camera/camera.dm
@@ -317,9 +317,6 @@
name = "military-grade camera"
network = list("marinemainship")
-/obj/machinery/camera/autoname/mainship/somship
- network = list("sommainship")
-
//cameras installed inside the dropships, accessible via both cockpit monitor and ship camera computers
/obj/machinery/camera/autoname/mainship/dropship_one
network = list("marinemainship", "dropship1")
@@ -333,8 +330,6 @@
network = list("marine")
resistance_flags = RESIST_ALL //If the containing headset is not destroyed, neither should this be.
-/obj/machinery/camera/headset/som
- network = list("som")
//used by the laser camera dropship equipment
/obj/machinery/camera/laser_cam
diff --git a/code/game/objects/machinery/cic_maptable.dm b/code/game/objects/machinery/cic_maptable.dm
index aa0c65cb7d6b3..7a0a631ca4c47 100644
--- a/code/game/objects/machinery/cic_maptable.dm
+++ b/code/game/objects/machinery/cic_maptable.dm
@@ -14,10 +14,6 @@
///minimap obj ref that we will display to users
var/atom/movable/screen/minimap/map
-/obj/machinery/cic_maptable/Initialize(mapload)
- . = ..()
- RegisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_MISSION_LOADED, PROC_REF(change_targeted_z))
-
/obj/machinery/cic_maptable/Destroy()
map = null
return ..()
@@ -45,13 +41,6 @@
UnregisterSignal(source, COMSIG_MOVABLE_MOVED)
source.unset_interaction()
-///Updates the z-level this maptable views
-/obj/machinery/cic_maptable/proc/change_targeted_z(datum/source, new_z)
- SIGNAL_HANDLER
- if(!isnum(new_z))
- return
- targetted_zlevel = new_z
-
/obj/machinery/cic_maptable/on_unset_interaction(mob/user)
. = ..()
user.client.screen -= map
@@ -64,9 +53,6 @@
/obj/machinery/cic_maptable/som_maptable
allowed_flags = MINIMAP_FLAG_MARINE_SOM
-/obj/machinery/cic_maptable/no_flags
- allowed_flags = NONE
-
/obj/machinery/cic_maptable_big
name = "map table"
desc = "A table that displays a map of the current target location that also allows drawing onto it"
@@ -91,8 +77,8 @@
/atom/movable/screen/minimap_tool/label,
/atom/movable/screen/minimap_tool/clear,
)
- /// the Zlevel that this table views
- var/targetted_zlevel = 2
+ /// the Zlevel that this tablet will be allowed to edit
+ var/editing_z = 2
/// The minimap flag we will be allowing to edit
var/minimap_flag = MINIMAP_FLAG_MARINE
///minimap obj ref that we will display to users
@@ -100,15 +86,13 @@
/obj/machinery/cic_maptable_big/Initialize(mapload)
. = ..()
- RegisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_MISSION_LOADED, PROC_REF(change_targeted_z))
var/static/list/connections = list(
COMSIG_OBJ_TRY_ALLOW_THROUGH = PROC_REF(can_climb_over),
)
AddElement(/datum/element/connect_loc, connections)
-
var/list/atom/movable/screen/actions = list()
for(var/path in drawing_tools)
- actions += new path(null, targetted_zlevel, minimap_flag)
+ actions += new path(null, editing_z, minimap_flag)
drawing_tools = actions
/obj/machinery/cic_maptable_big/Destroy()
@@ -132,7 +116,7 @@
to_chat(user, span_boldwarning("You have been banned from a command role. You may not use [src] until the ban has been lifted."))
return
if(!map)
- map = SSminimaps.fetch_minimap_object(targetted_zlevel, minimap_flag)
+ map = SSminimaps.fetch_minimap_object(editing_z, minimap_flag)
user.client.screen += map
user.client.screen += drawing_tools
@@ -144,18 +128,3 @@
user.client.mouse_pointer_icon = null
for(var/atom/movable/screen/minimap_tool/tool AS in drawing_tools)
tool.UnregisterSignal(user, list(COMSIG_MOB_MOUSEDOWN, COMSIG_MOB_MOUSEUP))
-
-///Updates the z-level this maptable views
-/obj/machinery/cic_maptable_big/proc/change_targeted_z(datum/source, new_z)
- SIGNAL_HANDLER
- if(!isnum(new_z))
- return
- targetted_zlevel = new_z
- map = null
-
- for(var/atom/movable/screen/minimap_tool/tool AS in drawing_tools)
- tool.zlevel = new_z
- tool.set_zlevel(new_z, tool.minimap_flag)
-
-/obj/machinery/cic_maptable_big/som
- minimap_flag = MINIMAP_FLAG_MARINE_SOM
diff --git a/code/game/objects/machinery/computer/camera_console.dm b/code/game/objects/machinery/computer/camera_console.dm
index f52a42a21c887..9b6798fd376d6 100644
--- a/code/game/objects/machinery/computer/camera_console.dm
+++ b/code/game/objects/machinery/computer/camera_console.dm
@@ -221,11 +221,6 @@
/obj/machinery/computer/security/marine_network
network = list("marine")
-/obj/machinery/computer/security/som_mainship
- network = list("sommainship")
-
-/obj/machinery/computer/security/som_network
- network = list("som")
/obj/machinery/computer/security/dropship
name = "abstract dropship camera computer"
diff --git a/code/game/objects/machinery/doors/door.dm b/code/game/objects/machinery/doors/door.dm
index bd76a3b972de1..01eea13bf8a7d 100755
--- a/code/game/objects/machinery/doors/door.dm
+++ b/code/game/objects/machinery/doors/door.dm
@@ -208,7 +208,6 @@
addtimer(CALLBACK(src, PROC_REF(autoclose)), normalspeed ? 150 + openspeed : 5)
/obj/machinery/door/proc/close()
- SIGNAL_HANDLER_DOES_SLEEP
if(density)
return TRUE
if(operating)
diff --git a/code/game/objects/machinery/doors/poddoor.dm b/code/game/objects/machinery/doors/poddoor.dm
index e030e15155bf1..6185b747950d1 100755
--- a/code/game/objects/machinery/doors/poddoor.dm
+++ b/code/game/objects/machinery/doors/poddoor.dm
@@ -119,13 +119,6 @@
opacity = FALSE
id = "pirate_cargo"
-/obj/machinery/door/poddoor/two_tile_hor/teleporter
- name = "teleporter chamber blast door"
- icon_state = "pdoor0"
- density = FALSE
- opacity = FALSE
- id = "tele_array"
-
/obj/machinery/door/poddoor/two_tile_hor/secure
icon = 'icons/obj/doors/1x2blast_hor.dmi'
openspeed = 17
@@ -285,28 +278,3 @@
/obj/machinery/door/poddoor/timed_late/containment/landing_zone/lz2
id = "landing_zone_2"
smoothing_groups = null
-
-///Faction signals for campaign mode doors
-GLOBAL_LIST_INIT(faction_to_campaign_door_signal, list(
- FACTION_TERRAGOV = COMSIG_GLOB_OPEN_CAMPAIGN_SHUTTERS_TGMC,
- FACTION_SOM = COMSIG_GLOB_OPEN_CAMPAIGN_SHUTTERS_SOM,
-))
-
-/obj/machinery/door/poddoor/campaign
- name = "secure blast door"
- desc = "Safety shutters designed to withstand any punishment. You're not forcing your way past this."
- icon = 'icons/obj/doors/mainship/blastdoors_shutters.dmi'
- use_power = FALSE
- resistance_flags = DROPSHIP_IMMUNE|RESIST_ALL
- open_layer = UNDER_TURF_LAYER
- closed_layer = ABOVE_WINDOW_LAYER
- ///Faction associated with the door, for signal purposes
- var/faction = FACTION_TERRAGOV
-
-/obj/machinery/door/poddoor/campaign/Initialize(mapload)
- RegisterSignal(SSdcs, GLOB.faction_to_campaign_door_signal[faction], PROC_REF(open))
- RegisterSignal(SSdcs, COMSIG_GLOB_CLOSE_CAMPAIGN_SHUTTERS, TYPE_PROC_REF(/obj/machinery/door, close))
- return ..()
-
-/obj/machinery/door/poddoor/campaign/som
- faction = FACTION_SOM
diff --git a/code/game/objects/machinery/overwatch.dm b/code/game/objects/machinery/overwatch.dm
index c8b6942f86ca5..281a3f8b094e6 100755
--- a/code/game/objects/machinery/overwatch.dm
+++ b/code/game/objects/machinery/overwatch.dm
@@ -159,28 +159,6 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
desc = "Big Brother Requisition demands to see money flowing into the void that is greed."
circuit = /obj/item/circuitboard/computer/supplyoverwatch
-/obj/machinery/computer/camera_advanced/overwatch/som
- faction = FACTION_SOM
- networks = list("som")
- req_access = list(ACCESS_MARINE_BRIDGE)
-
-/obj/machinery/computer/camera_advanced/overwatch/som/main
- icon_state = "overwatch_main"
- name = "main Overwatch Console"
- desc = "State of the art machinery for general overwatch purposes."
-
-/obj/machinery/computer/camera_advanced/overwatch/som/zulu
- name = "\improper Zulu Overwatch Console"
-
-/obj/machinery/computer/camera_advanced/overwatch/som/yankee
- name = "\improper Yankee Overwatch Console"
-
-/obj/machinery/computer/camera_advanced/overwatch/som/xray
- name = "\improper X-ray Overwatch Console"
-
-/obj/machinery/computer/camera_advanced/overwatch/som/whiskey
- name = "\improper Whiskey Overwatch Console"
-
/obj/machinery/computer/camera_advanced/overwatch/CreateEye()
. = ..()
eyeobj.visible_icon = TRUE
@@ -317,18 +295,6 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
if("monitordelta_squad")
state = OW_MONITOR
current_squad = get_squad_by_id(DELTA_SQUAD)
- if("monitorzulu_squad")
- state = OW_MONITOR
- current_squad = get_squad_by_id(ZULU_SQUAD)
- if("monitoryankee_squad")
- state = OW_MONITOR
- current_squad = get_squad_by_id(YANKEE_SQUAD)
- if("monitorxray_squad")
- state = OW_MONITOR
- current_squad = get_squad_by_id(XRAY_SQUAD)
- if("monitorwhiskey_squad")
- state = OW_MONITOR
- current_squad = get_squad_by_id(WHISKEY_SQUAD)
if("change_operator")
if(operator != usr)
if(current_squad)
@@ -695,7 +661,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
to_chat(source, span_boldnotice("[target.real_name] is the new Squad Leader of squad '[target_squad]'! Logging to enlistment file."))
visible_message(span_boldnotice("[target.real_name] is the new Squad Leader of squad '[target_squad]'! Logging to enlistment file."))
- to_chat(target, "[icon2html(src, target)] \[Overwatch\]: You've been promoted to \'[(ismarineleaderjob(target.job) || issommarineleaderjob(target.job)) ? "SQUAD LEADER" : "ACTING SQUAD LEADER"]\' for [target_squad.name]. Your headset has access to the command channel (:v).")
+ to_chat(target, "[icon2html(src, target)] \[Overwatch\]: You've been promoted to \'[ismarineleaderjob(target.job) ? "SQUAD LEADER" : "ACTING SQUAD LEADER"]\' for [target_squad.name]. Your headset has access to the command channel (:v).")
to_chat(source, "[icon2html(src, source)] [target.real_name] is [target_squad]'s new leader!")
target_squad.promote_leader(target)
@@ -747,7 +713,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
if(!new_squad)
return
- if((ismarineleaderjob(transfer_marine.job) || issommarineleaderjob(transfer_marine.job)) && new_squad.current_positions[transfer_marine.job.type] >= SQUAD_MAX_POSITIONS(transfer_marine.job.total_positions))
+ if(ismarineleaderjob(transfer_marine.job) && new_squad.current_positions[/datum/job/terragov/squad/leader] >= SQUAD_MAX_POSITIONS(transfer_marine.job.total_positions))
to_chat(source, "[icon2html(src, source)] [span_warning("Transfer aborted. [new_squad] can't have another [transfer_marine.job.title].")]")
return
@@ -834,7 +800,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
attempt_spotlight(source, turf_target, params)
if(MESSAGE_NEAR)
var/input = tgui_input_text(source, "Please write a message to announce to all marines nearby:", "CIC Proximity Message")
- for(var/mob/living/carbon/human/target in GLOB.alive_human_list_faction[faction])
+ for(var/mob/living/carbon/human/target in GLOB.alive_human_list_faction[FACTION_TERRAGOV])
if(!target)
return
if(get_dist(target, turf_target) > WORLD_VIEW_NUM*2)
@@ -1127,7 +1093,7 @@ GLOBAL_LIST_EMPTY(active_cas_targets)
if(current_squad.squad_leader)
if(H == current_squad.squad_leader)
dist = "N/A"
- if(!ismarineleaderjob(H.job) && !issommarineleaderjob(H.job))
+ if(!ismarineleaderjob(H.job))
act_sl = " (acting SL)"
else if(M_turf && SL_z && M_turf.z == SL_z)
dist = "[get_dist(H, current_squad.squad_leader)] ([dir2text_short(get_dir(current_squad.squad_leader, H))])"
diff --git a/code/game/objects/structures/campaign_structure.dm b/code/game/objects/structures/campaign_structure.dm
deleted file mode 100644
index 7e4c90d58c608..0000000000000
--- a/code/game/objects/structures/campaign_structure.dm
+++ /dev/null
@@ -1,225 +0,0 @@
-//effects are placed on maps but only generate objectives for applicable missions, so maps can be valid for multiple missions if desired.
-/obj/effect/landmark/campaign_objective
- name = "GENERIC CAMPAIGN STRUCTURE"
- desc = "THIS SHOULDN'T BE VISIBLE"
- icon = 'icons/obj/structures/campaign_structures.dmi'
- ///Missions that trigger this landmark to spawn an objective
- var/list/mission_types
- ///Objective spawned by this landmark
- var/obj/structure/campaign_objective/objective_type
-
-/obj/effect/landmark/campaign_objective/Initialize(mapload)
- . = ..()
- var/datum/game_mode/hvh/campaign/mode = SSticker.mode
- if(!istype(mode))
- return
- var/datum/campaign_mission/current_mission = mode.current_mission
- if(current_mission.type in mission_types)
- new objective_type(loc)
- qdel(src)
-
-
-/obj/structure/campaign_objective
- name = "GENERIC CAMPAIGN STRUCTURE"
- desc = "THIS SHOULDN'T BE VISIBLE"
- density = TRUE
- anchored = TRUE
- allow_pass_flags = PASSABLE
- destroy_sound = 'sound/effects/meteorimpact.ogg'
-
- icon = 'icons/obj/structures/campaign_structures.dmi'
-
-/obj/structure/campaign_objective/Initialize(mapload)
- . = ..()
- GLOB.campaign_objectives += src
- SSminimaps.add_marker(src, MINIMAP_FLAG_ALL, image('icons/UI_icons/map_blips.dmi', null, "campaign_objective"))
-
-/obj/structure/campaign_objective/Destroy()
- disable()
- return ..()
-
-///Handles the objective being destroyed, disabled or otherwise completed
-/obj/structure/campaign_objective/proc/disable()
- SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CAMPAIGN_OBJECTIVE_DESTROYED, src)
- GLOB.campaign_objectives -= src
-
-/obj/structure/campaign_objective/destruction_objective
- name = "GENERIC CAMPAIGN DESTRUCTION OBJECTIVE"
- soft_armor = list(MELEE = 200, BULLET = 200, LASER = 200, ENERGY = 200, BOMB = 200, BIO = 200, FIRE = 200, ACID = 200) //require c4 normally
-
-/obj/effect/landmark/campaign_objective/howitzer_objective
- name = "howitzer objective"
- icon = 'icons/Marine/howitzer.dmi'
- icon_state = "howitzer_deployed"
- mission_types = list(/datum/campaign_mission/destroy_mission/fire_support_raid)
- objective_type = /obj/structure/campaign_objective/destruction_objective/howitzer
-
-/obj/structure/campaign_objective/destruction_objective/howitzer
- name = "\improper TA-100Y howitzer"
- desc = "A manual, crew-operated and towable howitzer, will rain down 150mm laserguided and accurate shells on any of your foes."
- icon = 'icons/Marine/howitzer.dmi'
- icon_state = "howitzer_deployed"
- pixel_x = -16
-
-/obj/effect/landmark/campaign_objective/bluespace_core
- name = "Bluespace Core objective"
- icon = 'icons/obj/machines/bluespacedrive.dmi'
- icon_state = "bsd_core"
- pixel_y = -18
- pixel_x = -16
- mission_types = list(/datum/campaign_mission/destroy_mission/teleporter_raid)
- objective_type = /obj/structure/campaign_objective/destruction_objective/bluespace_core
-
-#define BLUESPACE_CORE_OK "bluespace_core_ok"
-#define BLUESPACE_CORE_UNSTABLE "bluespace_core_unstable"
-#define BLUESPACE_CORE_BROKEN "bluespace_core_broken"
-
-/obj/structure/campaign_objective/destruction_objective/bluespace_core
- name = "\improper Bluespace Teleportation Displacement Core"
- desc = "An incredibly sophisticated piece of bluespace technology that is the engine behind any number of quantum entangled bluespace teleporter devices in the system."
- icon = 'icons/obj/machines/bluespacedrive.dmi'
- icon_state = "bsd_core"
- bound_height = 64
- bound_width = 64
- pixel_y = -18
- pixel_x = -16
- var/status = BLUESPACE_CORE_OK
-
-/obj/structure/campaign_objective/destruction_objective/bluespace_core/Initialize(mapload)
- . = ..()
- update_icon()
-
-/obj/structure/campaign_objective/destruction_objective/bluespace_core/update_icon_state()
- . = ..()
- if(status == BLUESPACE_CORE_BROKEN)
- icon_state = "bsd_core_broken"
- else
- icon_state = "bsd_core"
-
-/obj/structure/campaign_objective/destruction_objective/bluespace_core/update_overlays()
- . = ..()
- switch(status)
- if(BLUESPACE_CORE_OK)
- . += image(icon, icon_state = "top_overlay", layer = ABOVE_MOB_LAYER)
- . += image(icon, icon_state = "bsd_c_s", layer = TANK_BARREL_LAYER)
- if(BLUESPACE_CORE_UNSTABLE)
- . += image(icon, icon_state = "top_overlay", layer = ABOVE_MOB_LAYER)
- . += image(icon, icon_state = "bsd_c_u", layer = TANK_BARREL_LAYER)
- if(BLUESPACE_CORE_BROKEN)
- . += image(icon, icon_state = "top_overlay_broken", layer = ABOVE_MOB_LAYER)
-
-///Changes the status of the object
-/obj/structure/campaign_objective/destruction_objective/bluespace_core/proc/change_status(new_status)
- if(status == new_status)
- return
- status = new_status
- update_icon()
- if(status == BLUESPACE_CORE_BROKEN)
- disable()
-
-#define CAPTURE_OBJECTIVE_RECAPTURABLE "capture_objective_recapturable"
-
-//capturable objectives
-/obj/structure/campaign_objective/capture_objective
- name = "GENERIC CAPTURABLE OBJECTIVE"
- resistance_flags = RESIST_ALL
- ///Channel time to capture or activate this objective
- var/capture_time = 10 SECONDS
- ///Special capture behavior flags for this objectives
- var/capture_flags = NONE
- ///Who controls this objective. Mainly used for objectives that can be recaptured
- var/owning_faction
-
-/obj/structure/campaign_objective/capture_objective/attack_hand(mob/living/user)
- if(!ishuman(user))
- return
- if(user.stat)
- return
- if(!capture_check(user))
- return
- if(user.do_actions)
- user.balloon_alert(user, "You are already doing something!")
- return
- begin_capture(user)
-
-///Starts the capture process
-/obj/structure/campaign_objective/capture_objective/proc/begin_capture(mob/living/user)
- user.balloon_alert_to_viewers("Activating!")
- if(!do_after(user, capture_time, TRUE, src))
- return
- if(!capture_check(user))
- return
- do_capture(user)
-
-///Checks if this objective can be captured
-/obj/structure/campaign_objective/capture_objective/proc/capture_check(mob/living/user)
- if(owning_faction)
- if(owning_faction == user.faction)
- user.balloon_alert(user, "Already yours!")
- return FALSE
- if(!(capture_flags & CAPTURE_OBJECTIVE_RECAPTURABLE))
- user.balloon_alert(user, "Cannot recaptured!")
- return FALSE
- return TRUE
-
-///Captures or activates the objective
-/obj/structure/campaign_objective/capture_objective/proc/do_capture(mob/living/user)
- SHOULD_CALL_PARENT(TRUE)
- owning_faction = user.faction
- SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CAMPAIGN_CAPTURE_OBJECTIVE_CAPTURED, src, user)
-
-/obj/effect/landmark/campaign_objective/phoron_crate
- name = "phoron crate objective"
- icon = 'icons/obj/structures/campaign_structures.dmi'
- icon_state = "orebox_phoron"
- mission_types = list(/datum/campaign_mission/capture_mission)
- objective_type = /obj/structure/campaign_objective/capture_objective/fultonable
-
-/obj/structure/campaign_objective/capture_objective/fultonable
- name = "phoron crate"
- desc = "A crate packed full of valuable phoron, ready to claim."
- icon_state = "orebox_phoron"
-
-/obj/structure/campaign_objective/capture_objective/fultonable/do_capture(mob/living/user)
- . = ..()
- var/obj/effect/fulton_extraction_holder/holder_obj = new(loc)
- var/atom/movable/vis_obj/fulton_balloon/balloon = new()
- holder_obj.appearance = appearance
- if(anchored)
- anchored = FALSE
- holder_obj.vis_contents += balloon
-
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), get_turf(holder_obj), 'sound/items/fultext_deploy.ogg', 50, TRUE), 0.4 SECONDS)
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), get_turf(holder_obj), 'sound/items/fultext_launch.ogg', 50, TRUE), 7.4 SECONDS)
- QDEL_IN(holder_obj, 8 SECONDS)
- QDEL_IN(balloon, 8 SECONDS)
-
- flick("fulton_expand", balloon)
- balloon.icon_state = "fulton_balloon"
- animate(holder_obj, pixel_z = 0, time = 0.4 SECONDS)
- animate(pixel_z = 10, time = 2 SECONDS)
- animate(pixel_z = 15, time = 1 SECONDS)
- animate(pixel_z = 10, time = 1 SECONDS)
- animate(pixel_z = 15, time = 1 SECONDS)
- animate(pixel_z = 10, time = 1 SECONDS)
- animate(pixel_z = SCREEN_PIXEL_SIZE, time = 1 SECONDS)
-
- user.visible_message(span_notice("[user] finishes attaching the fulton to [src] and activates it."),\
- span_notice("You attach a fulton to [src] and activate it."), null, 5)
- qdel(src)
-
-/obj/effect/landmark/campaign_objective/asat_system
- name = "ASAT system"
- icon = 'icons/obj/structures/campaign_structures.dmi'
- icon_state = "asat"
- mission_types = list(/datum/campaign_mission/capture_mission/asat)
- objective_type = /obj/structure/campaign_objective/capture_objective/fultonable/asat_system
-
-/obj/structure/campaign_objective/capture_objective/fultonable/asat_system
- name = "\improper T-4000 ASAT system"
- icon = 'icons/obj/structures/campaign_structures.dmi'
- icon_state = "asat"
- desc = "A sophisticated surface to space missile system designed for attacking orbiting satellites or spacecraft."
- capture_time = 12 SECONDS
- capture_flags = CAPTURE_OBJECTIVE_RECAPTURABLE
- owning_faction = FACTION_TERRAGOV //this could have a coded solution, but the mission is tgmc specific
diff --git a/code/game/objects/structures/droppod.dm b/code/game/objects/structures/droppod.dm
index 863eb62aa9d20..172009474b4aa 100644
--- a/code/game/objects/structures/droppod.dm
+++ b/code/game/objects/structures/droppod.dm
@@ -29,8 +29,6 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
var/target_x = 1
///Y target coordinate
var/target_y = 1
- ///The Z-level that the pod launches to
- var/target_z = 2
///Current drop pod status: shipside = ready, active = mid-drop, landed = planetside
var/drop_state = DROPPOD_READY
///Whether launch is allowed. for things like disabling during hijack phase
@@ -49,9 +47,8 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
interaction_actions = list()
interaction_actions += new /datum/action/innate/set_drop_target(src)
interaction_actions += new /datum/action/innate/launch_droppod(src)
- RegisterSignals(SSdcs, list(COMSIG_GLOB_DROPSHIP_HIJACKED, COMSIG_GLOB_CAMPAIGN_MISSION_ENDED, COMSIG_GLOB_CAMPAIGN_DISABLE_DROPPODS), PROC_REF(disable_launching))
- RegisterSignals(SSdcs, list(COMSIG_GLOB_OPEN_TIMED_SHUTTERS_LATE, COMSIG_GLOB_OPEN_TIMED_SHUTTERS_XENO_HIVEMIND, COMSIG_GLOB_OPEN_SHUTTERS_EARLY, COMSIG_GLOB_TADPOLE_LAUNCHED, COMSIG_GLOB_CAMPAIGN_ENABLE_DROPPODS), PROC_REF(allow_drop))
- RegisterSignal(SSdcs, COMSIG_GLOB_CAMPAIGN_MISSION_LOADED, PROC_REF(change_targeted_z))
+ RegisterSignal(SSdcs, COMSIG_GLOB_DROPSHIP_HIJACKED, PROC_REF(disable_launching))
+ RegisterSignals(SSdcs, list(COMSIG_GLOB_OPEN_TIMED_SHUTTERS_LATE, COMSIG_GLOB_OPEN_TIMED_SHUTTERS_XENO_HIVEMIND, COMSIG_GLOB_OPEN_SHUTTERS_EARLY, COMSIG_GLOB_TADPOLE_LAUNCHED), PROC_REF(allow_drop))
GLOB.droppod_list += src
update_icon()
if((!locate(/obj/structure/drop_pod_launcher) in get_turf(src)) && mapload)
@@ -75,20 +72,20 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
ejectee.forceMove(loc)
return ..()
-///Disables launching
+///Disables launching upon dropship hijack
/obj/structure/droppod/proc/disable_launching()
SIGNAL_HANDLER
launch_allowed = FALSE
UnregisterSignal(SSdcs, COMSIG_GLOB_DROPSHIP_HIJACKED)
-///Allow this droppod to ignore dropdelay or otherwise reenable its use
+///Allow this droppod to ignore dropdelay
/obj/structure/droppod/proc/allow_drop()
SIGNAL_HANDLER
operation_started = TRUE
- launch_allowed = TRUE
UnregisterSignal(SSdcs, list(COMSIG_GLOB_OPEN_TIMED_SHUTTERS_LATE, COMSIG_GLOB_OPEN_TIMED_SHUTTERS_XENO_HIVEMIND, COMSIG_GLOB_OPEN_SHUTTERS_EARLY, COMSIG_GLOB_TADPOLE_LAUNCHED))
/obj/structure/droppod/update_icon_state()
+ . = ..()
if(drop_state == DROPPOD_ACTIVE)
icon_state = initial(icon_state)
return
@@ -130,18 +127,9 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
if(.)
balloon_alert(notified_user, "Coordinates updated")
-///Updates the z-level this pod drops to
-/obj/structure/droppod/proc/change_targeted_z(datum/source, new_z)
- SIGNAL_HANDLER
- for(var/mob/dropper AS in buckled_mobs)
- unbuckle_mob(dropper)
- target_z = new_z
- target_x = 1
- target_y = 1
-
///returns boolean if the currently set target/optionally passed turf are valid to drop to
/obj/structure/droppod/proc/checklanding(mob/user, optional_turf)
- var/turf/target = optional_turf ? optional_turf : locate(target_x, target_y, target_z)
+ var/turf/target = optional_turf ? optional_turf : locate(target_x, target_y, 2)
if(target.density)
if(user)
balloon_alert(user, "Dense area")
@@ -172,23 +160,20 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
///attempts to launch the drop pod at it's currently set coordinates. commanded_drop is TRUE when the drop is being requested by a command drop pod
/obj/structure/droppod/proc/launchpod(mob/user, commanded_drop = FALSE)
- if(!(LAZYLEN(buckled_mobs) || LAZYLEN(contents)))
+ if(!LAZYLEN(buckled_mobs))
return
#ifndef TESTING
if(!operation_started && world.time < SSticker.round_start_time + SSticker.mode.deploy_time_lock + DROPPOD_DEPLOY_DELAY)
- if(user)
- to_chat(user, span_notice("Unable to launch, the ship has not yet reached the combat area."))
+ to_chat(user, span_notice("Unable to launch, the ship has not yet reached the combat area."))
return
#endif
if(!locate(/obj/structure/drop_pod_launcher) in get_turf(src))
- if(user)
- to_chat(user, span_notice("Error. Cannot launch [name] without a droppod launcher."))
+ to_chat(user, span_notice("Error. Cannot launch [name] without a droppod launcher."))
return
if(!launch_allowed)
- if(user)
- to_chat(user, span_notice("Error. Ship calibration unavailable. Please %#&ç:*"))
+ to_chat(user, span_notice("Error. Ship calibration unavailable. Please %#&ç:*"))
return
if(drop_state != DROPPOD_READY)
@@ -200,12 +185,11 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
for(var/mob/podder AS in buckled_mobs)
podder.forceMove(src)
- var/turf/target = locate(target_x, target_y, target_z)
- if(user)
- log_game("[key_name(user)] launched pod [src] at [AREACOORD(target)]")
- deadchat_broadcast("has been launched", src, turf_target = target)
+ var/turf/target = locate(target_x, target_y, 2)
+ log_game("[key_name(user)] launched pod [src] at [AREACOORD(target)]")
+ deadchat_broadcast(" has been launched", src, turf_target = target)
for(var/mob/living/silicon/ai/AI AS in GLOB.ai_list)
- to_chat(AI, span_notice("[user ? user : "unknown"] has launched [src] towards [target.loc] at X:[target_x] Y:[target_y]"))
+ to_chat(AI, span_notice("[user] has launched [src] towards [target.loc] at X:[target_x] Y:[target_y]"))
reserved_area = SSmapping.RequestBlockReservation(3,3)
drop_state = DROPPOD_ACTIVE
@@ -218,15 +202,14 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
/// Moves the droppod into its target turf, which it updates if needed
/obj/structure/droppod/proc/finish_drop(mob/user)
- var/turf/targetturf = locate(target_x, target_y, target_z)
+ var/turf/targetturf = locate(target_x, target_y, 2)
for(var/a in targetturf.contents)
var/atom/target = a
if(target.density) //if theres something dense in the turf try to recalculate a new turf
- if(user)
- to_chat(user, span_warning("[icon2html(src, user)] WARNING! TARGET ZONE OCCUPIED! EVADING!"))
- balloon_alert(user, "EVADING")
- var/turf/T0 = locate(target_x + 2,target_y + 2, target_z)
- var/turf/T1 = locate(target_x - 2,target_y - 2, target_z)
+ to_chat(user, span_warning("[icon2html(src, user)] WARNING! TARGET ZONE OCCUPIED! EVADING!"))
+ balloon_alert(user, "EVADING")
+ var/turf/T0 = locate(target_x + 2,target_y + 2,2)
+ var/turf/T1 = locate(target_x - 2,target_y - 2,2)
var/list/block = block(T0,T1) - targetturf
for(var/t in block)//Randomly selects a free turf in a 5x5 block around the target
var/turf/attemptdrop = t
@@ -234,9 +217,8 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
targetturf = attemptdrop
break
if(targetturf.density)//We tried and failed, revert to the old one, which has a new dense obj but is at least not dense
- if(user)
- to_chat(user, span_warning("[icon2html(src, user)] RECALCULATION FAILED!"))
- targetturf = locate(target_x, target_y, target_z)
+ to_chat(user, span_warning("[icon2html(src, user)] RECALCULATION FAILED!"))
+ targetturf = locate(target_x, target_y,2)
break
forceMove(targetturf)
@@ -247,8 +229,8 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
///Do the stuff when it "hits the ground"
/obj/structure/droppod/proc/dodrop(turf/targetturf, mob/user)
- deadchat_broadcast(" has landed at [get_area(targetturf)]!", src, user ? user : null, targetturf)
- explosion(targetturf, light_impact_range = 2)
+ deadchat_broadcast(" has landed at [get_area(targetturf)]!", src, user)
+ explosion(targetturf,-1,-1,2,-1,-1)
playsound(targetturf, 'sound/effects/droppod_impact.ogg', 100)
QDEL_NULL(reserved_area)
addtimer(CALLBACK(src, PROC_REF(completedrop), user), 7) //dramatic effect
@@ -256,9 +238,9 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
///completes landing a little delayed for a dramatic effect
/obj/structure/droppod/proc/completedrop(mob/user)
drop_state = DROPPOD_LANDED
+ update_icon()
for(var/atom/movable/deployed AS in contents)
deployed.forceMove(loc)
- update_icon()
/obj/structure/droppod/leader
@@ -282,10 +264,10 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
// this isnt the cheapest thing in the world so lets not let players spam it
TIMER_COOLDOWN_START(src, COOLDOWN_DROPPOD_TARGETTING, 10 SECONDS)
- var/turf/target = locate(new_x, new_y, target_z)
+ var/turf/target = locate(new_x, new_y, 2)
var/occupied_pods
for(var/obj/structure/droppod/pod AS in GLOB.droppod_list)
- if(LAZYLEN(pod.buckled_mobs) || LAZYLEN(pod.contents))
+ if(LAZYLEN(pod.buckled_mobs))
occupied_pods++
var/dispersion = max(LEADER_POD_DISPERSION, LEADER_POD_DISPERSION + ((occupied_pods - 10) / 5))
var/turf/topright = locate(new_x + dispersion, new_y + dispersion,2)
@@ -323,121 +305,13 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
return ..()
//todo find an alarm sound and play it here for audio confirmation?
for(var/obj/structure/droppod/pod in GLOB.droppod_list)
- if(!(LAZYLEN(pod.buckled_mobs) || LAZYLEN(pod.contents)))
+ if(!LAZYLEN(pod.buckled_mobs))
continue
for(var/mob/dropper AS in pod.buckled_mobs)
dropper.play_screen_text("DROP UPDATED: COMMENCING MASS DEPLOYMENT", /atom/movable/screen/text/screen_text/command_order)
var/predroptime = rand(4 SECONDS, 5 SECONDS) //Randomize it a bit so its staggered
- addtimer(CALLBACK(pod, TYPE_PROC_REF(/obj/structure/droppod, launchpod), LAZYLEN(pod.buckled_mobs) ? pod.buckled_mobs[1] : null, TRUE), predroptime)
-
-//parent for pods designed to carry something other than a mob
-/obj/structure/droppod/nonmob
- buckle_flags = null
- ///The currently stored object
- var/obj/stored_object
-
-/obj/structure/droppod/nonmob/Destroy()
- stored_object = null
- return ..()
-
-/obj/structure/droppod/nonmob/update_icon_state()
- if((drop_state == DROPPOD_ACTIVE) || stored_object)
- icon_state = initial(icon_state)
- return
- icon_state = initial(icon_state) + "_open"
-
-/obj/structure/droppod/nonmob/completedrop(mob/user)
- stored_object = null
- return ..()
-
-/obj/structure/droppod/nonmob/supply_pod
- name = "\improper TGMC Zeus supply drop pod"
- desc = "A menacing metal hunk of steel that is used by the TGMC for quick tactical redeployment. This one is designed to carry supplies."
- buckle_flags = null
- icon_state = "supplypod"
-
-/obj/structure/droppod/nonmob/supply_pod/attack_powerloader(mob/living/user, obj/item/powerloader_clamp/attached_clamp)
- if(attached_clamp.loaded)
- var/obj/structure/closet/clamped_closet = attached_clamp.loaded
- playsound(src, 'sound/machines/hydraulics_1.ogg', 40, 1)
- if(!do_after(user, 30, FALSE, src, BUSY_ICON_BUILD))
- return
- if(length(contents) || attached_clamp.loaded != clamped_closet || !LAZYLEN(attached_clamp.linked_powerloader?.buckled_mobs) || attached_clamp.linked_powerloader.buckled_mobs[1] != user)
- return
- clamped_closet.forceMove(src)
- stored_object = clamped_closet
- attached_clamp.loaded = null
- playsound(src, 'sound/machines/hydraulics_2.ogg', 40, 1)
- attached_clamp.update_icon()
- to_chat(user, span_notice("You load [clamped_closet] into [src]."))
- else if(stored_object)
- playsound(src, 'sound/machines/hydraulics_2.ogg', 40, 1)
- if(!do_after(user, 30, FALSE, src, BUSY_ICON_BUILD))
- return
- if(!stored_object || !LAZYLEN(attached_clamp.linked_powerloader?.buckled_mobs) || attached_clamp.linked_powerloader.buckled_mobs[1] != user)
- return
- playsound(src, 'sound/machines/hydraulics_1.ogg', 40, 1)
-
- stored_object.forceMove(attached_clamp.linked_powerloader)
- attached_clamp.loaded = stored_object
- attached_clamp.update_icon()
- to_chat(user, span_notice("You've removed [stored_object] from [src] and loaded it into [attached_clamp]."))
- stored_object = null
- update_icon()
- else
- return ..()
-
-/obj/structure/droppod/nonmob/turret_pod
- name = "\improper TGMC Zeus sentry drop pod"
- desc = "A menacing metal hunk of steel that is used by the TGMC for quick tactical redeployment. This one carries a self deploying sentry system."
- icon_state = "supplypod"
-
-/obj/structure/droppod/nonmob/turret_pod/Initialize(mapload)
- . = ..()
- new /obj/item/weapon/gun/sentry/pod_sentry(src)
- if(LAZYLEN(contents))
- stored_object = contents[1]
- update_icon()
-
-/obj/structure/droppod/nonmob/mech_pod
- name = "\improper TGMC Zeus mech drop pod"
- desc = "A menacing metal hunk of steel that is used by the TGMC for quick tactical redeployment. This is a larger model designed specifically to carry mechs."
- icon = 'icons/obj/structures/big_droppod.dmi'
- icon_state = "mechpod"
- pixel_x = -9
-
-/obj/structure/droppod/nonmob/mech_pod/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user)
- SHOULD_CALL_PARENT(FALSE)
- if(mecha_attacker.loc == src)
- mecha_attacker.forceMove(loc)
- return
- if(!Adjacent(user))
- return
- mecha_attacker.forceMove(src)
- stored_object = mecha_attacker
- for(var/datum/action/innate/action AS in interaction_actions)
- action.give_action(user)
- update_icon()
-
-/obj/structure/droppod/nonmob/mech_pod/change_targeted_z(datum/source, new_z)
- . = ..()
- for(var/atom/movable/ejectee AS in contents)
- ejectee.forceMove(loc)
-
-/obj/structure/droppod/nonmob/mech_pod/dodrop(turf/targetturf, mob/user)
- deadchat_broadcast(" has landed at [get_area(targetturf)]!", src, stored_object)
- explosion(targetturf, 1, 2) //A mech just dropped onto your head from orbit
- playsound(targetturf, 'sound/effects/droppod_impact.ogg', 100)
- QDEL_NULL(reserved_area)
- addtimer(CALLBACK(src, PROC_REF(completedrop), user), 7) //dramatic effect
+ addtimer(CALLBACK(pod, TYPE_PROC_REF(/obj/structure/droppod, launchpod), pod.buckled_mobs[1], TRUE), predroptime)
-/obj/structure/droppod/nonmob/mech_pod/completedrop(mob/user)
- if(stored_object)
- var/obj/vehicle/sealed/mecha/stored_mech = stored_object
- for(var/mob/occupant AS in stored_mech.occupants)
- for(var/datum/action/innate/action AS in interaction_actions)
- action.remove_action(occupant)
- return ..()
/datum/action/innate/launch_droppod
name = "Begin Launch"
@@ -463,11 +337,8 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
/datum/action/innate/set_drop_target/Activate()
. = ..()
- var/obj/structure/droppod/pod = target
- if(!pod.target_z)
- to_chat(owner, span_danger("No active combat zone detected."))
- return
- var/atom/movable/screen/minimap/map = SSminimaps.fetch_minimap_object(pod.target_z, MINIMAP_FLAG_MARINE)
+ //yes this is hardcoded bite me
+ var/atom/movable/screen/minimap/map = SSminimaps.fetch_minimap_object(2, MINIMAP_FLAG_MARINE)
owner.client.screen += map
choosing = TRUE
var/list/polled_coords = map.get_coords_from_click(owner)
@@ -477,12 +348,12 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
return
owner.client?.screen -= map
choosing = FALSE
+ var/obj/structure/droppod/pod = target
pod.set_target(polled_coords[1], polled_coords[2])
/datum/action/innate/set_drop_target/remove_action(mob/M)
if(choosing)
- var/obj/structure/droppod/pod = target
- var/atom/movable/screen/minimap/map = SSminimaps.fetch_minimap_object(pod.target_z, MINIMAP_FLAG_MARINE)
+ var/atom/movable/screen/minimap/map = SSminimaps.fetch_minimap_object(2, MINIMAP_FLAG_MARINE)
owner.client?.screen -= map
map.UnregisterSignal(owner, COMSIG_MOB_CLICKON)
choosing = FALSE
@@ -495,16 +366,6 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
icon_state = "launch_bay"
density = FALSE
resistance_flags = INDESTRUCTIBLE
- ///The type of pod this bay takes by default. Used for automated reloading
- var/pod_type = /obj/structure/droppod
-
-/obj/structure/drop_pod_launcher/Initialize(mapload)
- . = ..()
- GLOB.droppod_bays += src
-
-/obj/structure/drop_pod_launcher/Destroy()
- GLOB.droppod_bays -= src
- return ..()
/obj/structure/drop_pod_launcher/attack_powerloader(mob/living/user, obj/item/powerloader_clamp/attached_clamp)
if(!istype(attached_clamp.loaded, /obj/structure/droppod))
@@ -516,15 +377,6 @@ GLOBAL_LIST_INIT(blocked_droppod_tiles, typecacheof(list(/turf/open/space/transi
playsound(src, 'sound/machines/hydraulics_1.ogg', 40, 1)
attached_clamp.update_icon()
-///Loads a new pod onto the bay if one is not already there
-/obj/structure/drop_pod_launcher/proc/refresh_pod()
- if(locate(/obj/structure/droppod) in get_turf(src))
- return
- new pod_type(get_turf(src))
-
-/obj/structure/drop_pod_launcher/leader
- pod_type = /obj/structure/droppod/leader
-
#undef DROPPOD_READY
#undef DROPPOD_ACTIVE
#undef DROPPOD_LANDED
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index aff9314b03199..b0f187b130df6 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -220,7 +220,6 @@
icon_state = "tallgrass"
layer = TALL_GRASS_LAYER
opacity = TRUE
- color = "#7a8c54"
/obj/structure/flora/grass/tallgrass/tallgrasscorner
name = "tall grass"
@@ -232,23 +231,6 @@
/obj/structure/flora/grass/tallgrass/hideable/tallgrasscorner
icon_state = "tallgrass_corner"
-/obj/structure/flora/grass/tallgrass/autosmooth
- name = "tall grass"
- icon = 'icons/obj/flora/smooth/tall_grass.dmi'
- icon_state = "tallgrass-icon"
- base_icon_state = "tallgrass"
- smoothing_flags = SMOOTH_BITMASK
- smoothing_groups = list(SMOOTH_GROUP_TALL_GRASS)
- canSmoothWith = list(
- SMOOTH_GROUP_TALL_GRASS,
- SMOOTH_GROUP_ASTEROID_WARNING,
- SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS,
- SMOOTH_GROUP_MINERAL_STRUCTURES,
- SMOOTH_GROUP_WINDOW_FULLTILE,
- SMOOTH_GROUP_FLORA,
- SMOOTH_GROUP_WINDOW_FRAME,
- )
-
//bushes
/obj/structure/flora/bush
name = "bush"
@@ -498,7 +480,7 @@
pixel_y = -8
icon_variants = 3
-/obj/structure/flora/jungle/large_bush/Initialize(mapload)
+/obj/structure/flora/jungle/variable/large_bush/Initialize(mapload)
. = ..()
AddComponent(/datum/component/largetransparency, 0, 0, 0, 1)
@@ -533,6 +515,12 @@
. = ..()
icon_state = pick("Hvy1","Hvy2","Hvy3","Med1","Med2","Med3")
+/obj/structure/flora/jungle/tree/grasscarpet
+ name = "thick grass"
+ desc = "A thick mat of dense grass."
+ icon_state = "grasscarpet"
+ layer = BELOW_MOB_LAYER
+
//drought map flora
/obj/structure/flora/drought
diff --git a/code/game/objects/structures/patrol_points.dm b/code/game/objects/structures/patrol_points.dm
index 89d4fcde48b84..c566e48e4cdb7 100644
--- a/code/game/objects/structures/patrol_points.dm
+++ b/code/game/objects/structures/patrol_points.dm
@@ -39,39 +39,17 @@
return
if(user.incapacitated() || !Adjacent(user) || user.lying_angle || user.buckled || user.anchored)
return
-
- activate_point(user)
-
-/obj/structure/patrol_point/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user)
- SHOULD_CALL_PARENT(FALSE)
- if(!Adjacent(user))
- return
- activate_point(user, mecha_attacker)
-
-///Handles sending someone and/or something through the patrol_point
-/obj/structure/patrol_point/proc/activate_point(mob/living/user, obj/obj_mover)
- if(!user && !obj_mover)
- return
if(!linked_point)
create_link()
if(!linked_point)
//Link your stuff bro. There may be a better way to do this, but the way modular map insert works, linking does not properly happen during initialisation
- if(user)
- to_chat(user, span_warning("This doesn't seem to go anywhere."))
+ to_chat(user, span_warning("This doesn't seem to go anywhere."))
return
-
- if(obj_mover)
- obj_mover.forceMove(linked_point.loc)
- else if(user) //this is mainly configured under the assumption that we only have both an obj and a user if its a manned mech going through
- user.visible_message(span_notice("[user] goes through the [src]."),
- span_notice("You walk through the [src]."))
- user.trainteleport(linked_point.loc)
- add_spawn_protection(user)
-
+ user.visible_message(span_notice("[user] goes through the [src]."),
+ span_notice("You walk through the [src]."))
+ user.trainteleport(linked_point.loc)
+ add_spawn_protection(user)
new /atom/movable/effect/rappel_rope(linked_point.loc)
-
- if(!user)
- return
user.playsound_local(user, "sound/effects/CIC_order.ogg", 10, 1)
var/message
if(issensorcapturegamemode(SSticker.mode))
@@ -88,13 +66,14 @@
user.play_screen_text("OVERWATCH " + message, /atom/movable/screen/text/screen_text/picture/potrait)
else
user.play_screen_text("OVERWATCH " + message, /atom/movable/screen/text/screen_text/picture/potrait/som_over)
+ update_icon()
/obj/structure/patrol_point/attack_ghost(mob/dead/observer/user)
. = ..()
if(. || !linked_point)
return
- user.forceMove(linked_point.loc)
+ user.forceMove(get_turf(linked_point))
///Temporarily applies godmode to prevent spawn camping
/obj/structure/patrol_point/proc/add_spawn_protection(mob/user)
diff --git a/code/game/objects/structures/prop.dm b/code/game/objects/structures/prop.dm
index adc6a051c6072..825a56e6001ec 100755
--- a/code/game/objects/structures/prop.dm
+++ b/code/game/objects/structures/prop.dm
@@ -646,15 +646,6 @@
resistance_flags = RESIST_ALL
density = TRUE
-/obj/structure/prop/mainship/prop_tech/som
- name = "SOM technician"
- desc = "A hard working SOM technician maintaining the vehicles of the base, as well as the base itself. They seem to be very busy investigating something right now."
- icon = 'icons/Marine/mainship_props.dmi'
- icon_state = "SOM_technician"
-
-/obj/structure/prop/mainship/prop_tech/som/alt
- icon_state = "SOM_technician_2"
-
/obj/structure/prop/mainship/prop_sominf
name = "SOM Infantry"
desc = "Standard Sons of Mars infantry with a V-31 assault rifle on hand. While their face is obscured by the visor, it feels like you should keep going instead of loitering around."
@@ -663,36 +654,6 @@
resistance_flags = RESIST_ALL
density = TRUE
-/obj/structure/prop/mainship/prop_sominf/heavy
- name = "SOM heavy infantry"
- desc = "Heavy Sons of Mars infantry with a VX-32 charger on hand. While their face is obscured by the visor, it feels like you should keep going instead of loitering around."
- icon_state = "SOM_heavy_armed"
-
-/obj/structure/prop/mainship/prop_sominf/heavy/unarmed
- name = "SOM heavy infantry"
- desc = "Heavy Sons of Mars infantry. Better leave them to whatever it is they're doing"
- icon_state = "SOM_heavy"
-
-/obj/structure/prop/mainship/prop_sominf/lorica
- name = "SOM heavy infantry"
- desc = "Sons of Mars infantry in heavy duty Lorica armor, with a VX-32 charger on hand. They don't look like they're messing around."
- icon_state = "lorica_armed"
-
-/obj/structure/prop/mainship/prop_sominf/lorica/unarmed
- name = "SOM heavy infantry"
- desc = "Sons of Mars infantry in heavy duty Lorica armor. They look pretty tough."
- icon_state = "lorica"
-
-/obj/structure/prop/mainship/som_scientist
- name = "SOM scientist"
- desc = "A hard working SOM scientist type. They look like they're doing something important."
- icon = 'icons/Marine/mainship_props.dmi'
- icon_state = "SOM_scientist"
- resistance_flags = RESIST_ALL
- density = TRUE
-
-/obj/structure/prop/mainship/som_scientist/alt
- icon_state = "SOM_scientist_2"
/obj/structure/prop/templedoor
name = "Strange Temple"
@@ -1981,15 +1942,6 @@
. = ..()
icon_state = "camera1"
-/obj/structure/prop/computer
- icon = 'icons/obj/machines/computer.dmi'
-
-/obj/structure/prop/computer/tadpole
- name = "Tadpole navigation computer"
- desc = "Used to designate a precise transit location for the Tadpole."
- icon_state = "shuttlecomputer"
- resistance_flags = RESIST_ALL
-
/obj/structure/prop/computer/broken
name = "broken computer"
desc = "A busted PC, the internals look fried, there's no fixing this one."
@@ -2064,17 +2016,5 @@
icon = 'icons/Marine/mainship_props.dmi'
icon_state = "error"
-/obj/structure/prop/som_fighter
- name = "\improper Harbinger"
- desc = "A state of the art Harbinger class fighter. The premier fighter for SOM forces in space and atmosphere, bristling with high tech systems and weapons."
- icon = 'icons/Marine/mainship_props96.dmi'
- icon_state = "SOM_fighter"
- pixel_x = -33
- pixel_y = -10
-
-/obj/structure/prop/som_fighter/empty
- icon_state = "SOM_fighter_empty"
- desc = "A state of the art Harbinger class fighter. The premier fighter for SOM forces in space and atmosphere, this one seems to be unarmed currently."
-
#undef VENDOR_BROKEN
#undef VENDOR_BLANK
diff --git a/code/game/objects/structures/rocks.dm b/code/game/objects/structures/rocks.dm
index dcc2f60234a74..93f82374b267b 100644
--- a/code/game/objects/structures/rocks.dm
+++ b/code/game/objects/structures/rocks.dm
@@ -26,19 +26,19 @@
name = "volcanic rock"
desc = "A volcanic rock. Pioneers used to ride these babies for miles."
icon = 'icons/obj/flora/rocks2.dmi'
- icon_state = "basalt_1"
+ icon_state = "basalt"
/obj/structure/rock/basalt/alt
name = "volcanic rock"
- icon_state = "basalt_2"
+ icon_state = "basalt1"
/obj/structure/rock/basalt/alt2
name = "volcanic rock"
- icon_state = "basalt_3"
+ icon_state = "basalt2"
/obj/structure/rock/basalt/alt3
name = "volcanic rock"
- icon_state = "basalt_4"
+ icon_state = "basalt3"
/obj/structure/rock/basalt/pile
name = "rock pile"
@@ -68,12 +68,6 @@
. = ..()
icon_state = "[initial(icon_state)]_[rand(1, icon_variants)]"
-/obj/structure/rock/variable/basalt
- name = "rock"
- desc = "A large imposing rock."
- icon_state = "basalt"
- icon_variants = 4
-
/obj/structure/rock/variable/stalagmite
name = "stalagmite"
desc = "An ancient mound of mineral deposits, typically found in caves."
@@ -89,12 +83,6 @@
density = FALSE
icon_variants = 5
-/obj/structure/rock/variable/jungle/big
- desc = "A large imposing rock."
- icon_state = "big_rock"
- density = TRUE
- icon_variants = 4
-
/obj/structure/rock/variable/jungle_large
name = "rocks"
desc = "A large bunch of slippery looking rocks."
diff --git a/code/game/objects/structures/sensor_tower.dm b/code/game/objects/structures/sensor_tower.dm
index 9d0bf5ad0c5fe..7d8c9a9a0fa86 100644
--- a/code/game/objects/structures/sensor_tower.dm
+++ b/code/game/objects/structures/sensor_tower.dm
@@ -124,7 +124,7 @@
toggle_game_timer(SENSOR_CAP_ADDITION_TIME_BONUS)
update_icon()
- var/datum/game_mode/hvh/combat_patrol/sensor_capture/mode = SSticker.mode
+ var/datum/game_mode/combat_patrol/sensor_capture/mode = SSticker.mode
mode.sensors_activated += 1
playsound(src, 'sound/machines/ping.ogg', 25, 1)
@@ -154,10 +154,10 @@
///Pauses or restarts the gamemode timer
/obj/structure/sensor_tower/proc/toggle_game_timer(addition_time)
- var/datum/game_mode/hvh/combat_patrol/sensor_capture/mode = SSticker.mode
+ var/datum/game_mode/combat_patrol/sensor_capture/mode = SSticker.mode
if(mode.game_timer == SENSOR_CAP_TIMER_PAUSED)
- mode.game_timer = addtimer(CALLBACK(mode, TYPE_PROC_REF(/datum/game_mode/hvh/combat_patrol, set_game_end)), remaining_game_time + addition_time, TIMER_STOPPABLE)
+ mode.game_timer = addtimer(CALLBACK(mode, TYPE_PROC_REF(/datum/game_mode/combat_patrol, set_game_end)), remaining_game_time + addition_time, TIMER_STOPPABLE)
return
remaining_game_time = timeleft(mode.game_timer)
diff --git a/code/game/objects/structures/som_cas_parts.dm b/code/game/objects/structures/som_cas_parts.dm
index b808f8f666d9e..76e2ee473f6fb 100644
--- a/code/game/objects/structures/som_cas_parts.dm
+++ b/code/game/objects/structures/som_cas_parts.dm
@@ -38,30 +38,3 @@
/obj/structure/somcas/eight
icon_state = "somcas_misc_six"
-
-/obj/structure/somcas/left
- icon_state = "somcas_cockpit_horizontal"
-
-/obj/structure/somcas/one/left
- icon_state = "somcas_end_horizontal"
-
-/obj/structure/somcas/two/left
- icon_state = "somcas_wings_horizontal"
-
-/obj/structure/somcas/three/left
- icon_state = "somcas_misc_one_horizontal"
-
-/obj/structure/somcas/four/left
- icon_state = "somcas_misc_two_horizontal"
-
-/obj/structure/somcas/five/left
- icon_state = "somcas_misc_three_horizontal"
-
-/obj/structure/somcas/six/left
- icon_state = "somcas_misc_four_horizontal"
-
-/obj/structure/somcas/seven/left
- icon_state = "somcas_misc_five_horizontal"
-
-/obj/structure/somcas/eight/left
- icon_state = "somcas_misc_six_horizontal"
diff --git a/code/game/objects/structures/teleporter_array.dm b/code/game/objects/structures/teleporter_array.dm
deleted file mode 100644
index 22906361b9cb0..0000000000000
--- a/code/game/objects/structures/teleporter_array.dm
+++ /dev/null
@@ -1,199 +0,0 @@
-/obj/structure/teleporter_array
- name = "TELEPORTER"
- desc = "PLACEHOLDER."
- icon = 'icons/Marine/teleporter.dmi'
- icon_state = "teleporter"
- obj_flags = NONE
- density = FALSE
- layer = BELOW_OBJ_LAYER
- resistance_flags = RESIST_ALL
-
- var/teleporter_status = TELEPORTER_ARRAY_READY
- ///The faction this belongs to
- var/faction = FACTION_SOM
- ///How many times this can be used
- var/charges = 1
- ///The target turf for teleportation
- var/turf/target_turf
- ///The Z-level that the teleporter can teleport to
- var/targetted_zlevel = 2
- ///The radius of the teleport
- var/range = 2
- ///teleport windup
- var/windup = 10 SECONDS
- ///Actions to set a target for, and activate the teleporter
- var/list/datum/action/innate/interaction_actions
- ///The mob currently controlling the teleporter
- var/mob/controller
-
-/obj/structure/teleporter_array/Initialize(mapload)
- . = ..()
- interaction_actions = list()
- interaction_actions += new /datum/action/innate/set_teleport_target(src)
- interaction_actions += new /datum/action/innate/activate_teleporter(src)
- RegisterSignals(SSdcs, list(COMSIG_GLOB_CAMPAIGN_MISSION_LOADED, COMSIG_GLOB_CAMPAIGN_MISSION_ENDED), PROC_REF(change_targeted_z))
- GLOB.teleporter_arrays += src
-
-/obj/structure/teleporter_array/Destroy()
- target_turf = null
- controller = null
- QDEL_LIST(interaction_actions)
- GLOB.teleporter_arrays -= src
- return ..()
-
-//user stuff is probably placeholder for now
-/obj/structure/teleporter_array/attack_hand(mob/living/user)
- . = ..()
- if(.)
- return
- if(controller)
- return
- controller = user
- RegisterSignal(controller, COMSIG_MOVABLE_MOVED,PROC_REF(remove_user))
- for(var/datum/action/innate/action AS in interaction_actions)
- action.give_action(controller)
-
-///Removes the current controlling mob
-/obj/structure/teleporter_array/proc/remove_user()
- if(!controller)
- return
- for(var/datum/action/innate/action AS in interaction_actions)
- action.remove_action(controller)
- UnregisterSignal(controller, COMSIG_MOVABLE_MOVED)
- controller = null
-
-///Updates the z-level this teleporter teleports to
-/obj/structure/teleporter_array/proc/change_targeted_z(datum/source, new_z)
- SIGNAL_HANDLER
- remove_user()
- targetted_zlevel = new_z
- target_turf = null
- teleporter_status = TELEPORTER_ARRAY_INACTIVE
-
-//starts the teleportation process
-/obj/structure/teleporter_array/proc/activate()
- if(teleporter_status == TELEPORTER_ARRAY_INOPERABLE)
- to_chat(controller, span_warning("The Bluespace drive that powers the Teleporter Array has been destroyed! The Array is no longer functional."))
- return
- if(teleporter_status == TELEPORTER_ARRAY_IN_USE)
- to_chat(controller, span_warning("The Teleporter Array is already running!"))
- return
- if(!charges || teleporter_status == TELEPORTER_ARRAY_INACTIVE)
- to_chat(controller, span_warning("The Teleporter Array is not currently available for our use."))
- return
- if(!target_turf)
- to_chat(controller, span_warning("The Teleporter Array Has no destination set."))
- return
-
- visible_message(span_danger("Teleporter Array activated. Destination: [target_turf.loc]."))
- var/list/turf/turfs_affected = list()
- var/turf/central_turf = get_turf(src)
- for(var/turf/affected_turf in RANGE_TURFS(range, central_turf))
- turfs_affected += affected_turf
- affected_turf.add_filter("wraith_magic", 2, drop_shadow_filter(color = "#031025aa", size = -10))
-
- teleporter_status = TELEPORTER_ARRAY_IN_USE
- addtimer(CALLBACK(src, PROC_REF(do_startup)), windup - 1.5 SECONDS)
- addtimer(CALLBACK(src, PROC_REF(do_teleport), turfs_affected), windup)
- playsound(src, 'sound/magic/lightning_chargeup.ogg', 75) //tele charge sound
- charges --
-
-///Visual indicators for the teleporter about to fire
-/obj/structure/teleporter_array/proc/do_startup()
- new /obj/effect/temp_visual/teleporter_array(get_turf(src))
- visible_message(span_danger("You feel a vibration build in the air as the teleporter array comes to life."))
-
-///does the actual teleport
-/obj/structure/teleporter_array/proc/do_teleport(list/turfs_affected)
- if(teleporter_status == TELEPORTER_ARRAY_INOPERABLE || teleporter_status == TELEPORTER_ARRAY_INACTIVE)
- return cleanup(turfs_affected)
-
- teleporter_status = TELEPORTER_ARRAY_READY
- cleanup(turfs_affected)
- if(!target_turf)
- return
-
- var/list/destination_mobs = cheap_get_living_near(target_turf, 9)
- for(var/mob/living/victim AS in destination_mobs)
- victim.adjust_stagger(3 SECONDS)
- victim.add_slowdown(3)
- to_chat(victim, span_warning("You feel nauseous as reality warps around you!"))
-
- playsound(target_turf, 'sound/magic/lightningbolt.ogg', 75, 0)
- playsound(src, 'sound/magic/lightningbolt.ogg', 75, 0)
- new /obj/effect/temp_visual/teleporter_array(target_turf)
-
- var/list/exit_turfs = RANGE_TURFS(range, target_turf)
- for(var/turf/affected_turf AS in turfs_affected)
- for(var/atom/movable/AM AS in affected_turf)
- if(AM.anchored)
- continue
- AM.forceMove(exit_turfs[1])
- new /obj/effect/temp_visual/blink_drive(AM.loc)
- if(!ismob(AM))
- continue
- to_chat(AM, span_warning("You feel reality warp around you as the teleporter array activates!"))
- if(AM.loc.density)
- var/mob/victim = AM
- victim.emote("gored")
- victim.gib()
- exit_turfs -= exit_turfs[1]
-
-///cleans up teleport effects
-/obj/structure/teleporter_array/proc/cleanup(list/turfs_affected)
- for(var/turf/affected_turf AS in turfs_affected)
- affected_turf.remove_filter("wraith_magic")
-
-/datum/action/innate/activate_teleporter
- name = "Activate teleporter array"
- action_icon = 'icons/mecha/actions_mecha.dmi'
- action_icon_state = "land"
-
-/datum/action/innate/activate_teleporter/Activate()
- . = ..()
- var/obj/structure/teleporter_array/teleporter = target
- teleporter.activate()
-
-/datum/action/innate/set_teleport_target
- name = "Set teleportation target"
- action_icon = 'icons/mecha/actions_mecha.dmi'
- action_icon_state = "mech_zoom_on"
- ///Locks activating this action again while choosing to prevent signal shenanigan runtimes.
- var/choosing = FALSE
-
-/datum/action/innate/set_teleport_target/can_use_action()
- if(choosing)
- return FALSE
- return ..()
-
-/datum/action/innate/set_teleport_target/Activate()
- . = ..()
- var/obj/structure/teleporter_array/teleporter = target
- if(!teleporter.targetted_zlevel)
- to_chat(owner, span_danger("No active combat zone detected."))
- return
- var/atom/movable/screen/minimap/map = SSminimaps.fetch_minimap_object(teleporter.targetted_zlevel, GLOB.faction_to_minimap_flag[owner.faction])
- owner.client.screen += map
- choosing = TRUE
- var/list/polled_coords = map.get_coords_from_click(owner)
- if(!polled_coords)
- owner.client?.screen -= map
- choosing = FALSE
- return
- var/turf/chosen_turf = locate(polled_coords[1], polled_coords[2], teleporter.targetted_zlevel)
- if(chosen_turf.density || isspaceturf(chosen_turf))
- to_chat(owner, "Invalid location selected")
- else
- teleporter.target_turf = chosen_turf
- to_chat(owner, span_danger("Target location locked in at: [chosen_turf.loc]"))
- owner.client?.screen -= map
- choosing = FALSE
-
-/datum/action/innate/set_teleport_target/remove_action(mob/M)
- if(choosing)
- var/obj/structure/teleporter_array/teleporter = target
- var/atom/movable/screen/minimap/map = SSminimaps.fetch_minimap_object(teleporter.targetted_zlevel, GLOB.faction_to_minimap_flag[owner.faction])
- owner.client?.screen -= map
- map.UnregisterSignal(owner, COMSIG_MOB_CLICKON)
- choosing = FALSE
- return ..()
diff --git a/code/game/turfs/floor_ground.dm b/code/game/turfs/floor_ground.dm
index fb7dac4bbd42f..cd776c08cca43 100755
--- a/code/game/turfs/floor_ground.dm
+++ b/code/game/turfs/floor_ground.dm
@@ -73,10 +73,6 @@
/turf/open/floor/plating/ground/dirt2
name = "dirt"
icon_state = "dirt"
- shoefootstep = FOOTSTEP_SAND
- barefootstep = FOOTSTEP_SAND
- mediumxenofootstep = FOOTSTEP_SAND
- minimap_color = MINIMAP_DIRT
/turf/open/floor/plating/ground/dirtgrassborder2
name = "grass"
@@ -85,7 +81,6 @@
barefootstep = FOOTSTEP_SAND
mediumxenofootstep = FOOTSTEP_SAND
smoothing_groups = list(SMOOTH_GROUP_JUNGLE_FLOOR)
- minimap_color = MINIMAP_DIRT
/turf/open/floor/plating/ground/dirtgrassborder2/corner
icon_state = "grassdirt2_corner"
@@ -93,22 +88,6 @@
/turf/open/floor/plating/ground/dirtgrassborder2/corner2
icon_state = "grassdirt2_corner2"
-/turf/open/floor/plating/ground/dirtgrassborder2/autosmooth //jungle to dirt
- icon = 'icons/turf/floors/jungle-dirt-border.dmi'
- icon_state = "jungle-border-icon"
- base_icon_state = "jungle-border"
- smoothing_flags = SMOOTH_BITMASK
- smoothing_groups = list(SMOOTH_GROUP_JUNGLE_FLOOR)
- canSmoothWith = list(
- SMOOTH_GROUP_JUNGLE_FLOOR,
- SMOOTH_GROUP_ASTEROID_WARNING,
- SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS,
- SMOOTH_GROUP_MINERAL_STRUCTURES,
- SMOOTH_GROUP_WINDOW_FULLTILE,
- SMOOTH_GROUP_FLORA,
- SMOOTH_GROUP_WINDOW_FRAME,
- )
-
/turf/open/floor/plating/ground/dirtgrassborder/autosmooth
icon = 'icons/turf/floors/jungle-border.dmi'
icon_state = "jungle-border-icon"
diff --git a/code/game/turfs/open_ground.dm b/code/game/turfs/open_ground.dm
index 679b0c6bf99d6..fc28f7d8bfec6 100755
--- a/code/game/turfs/open_ground.dm
+++ b/code/game/turfs/open_ground.dm
@@ -23,13 +23,10 @@
return
/turf/open/ground/grass/beach
- icon_state = "grassbeach_edge"
+ icon_state = "grassbeach"
/turf/open/ground/grass/beach/corner
- icon_state = "grassbeach_corner"
-
-/turf/open/ground/grass/beach/corner2
- icon_state = "grassbeach_corner2"
+ icon_state = "gbcorner"
/turf/open/ground/coast
name = "coastline"
@@ -37,7 +34,6 @@
shoefootstep = FOOTSTEP_SAND
barefootstep = FOOTSTEP_SAND
mediumxenofootstep = FOOTSTEP_SAND
- minimap_color = MINIMAP_WATER
smoothing_groups = list(
SMOOTH_GROUP_RIVER,
)
diff --git a/code/game/visual_objects.dm b/code/game/visual_objects.dm
index 85472be5a91fa..83bbd938367b7 100644
--- a/code/game/visual_objects.dm
+++ b/code/game/visual_objects.dm
@@ -21,7 +21,7 @@
if(new_icon_state)
icon_state = new_icon_state
-/atom/movable/vis_obj/fulton_balloon
+/atom/movable/vis_obj/fulton_baloon
appearance_flags = RESET_COLOR|RESET_ALPHA|RESET_TRANSFORM
icon = 'icons/obj/items/fulton_balloon.dmi'
icon_state = "fulton_noballoon"
diff --git a/code/game/world.dm b/code/game/world.dm
index 1e0c86f29d24e..7931b9bacef22 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -147,7 +147,7 @@ GLOBAL_VAR(restart_counter)
Master.sleep_offline_after_initializations = FALSE
SSticker.start_immediately = TRUE
SSticker.bypass_checks = TRUE
- CONFIG_SET(number/mission_end_countdown, 0)
+ CONFIG_SET(number/round_end_countdown, 0)
var/datum/callback/cb
#ifdef UNIT_TESTS
cb = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(RunUnitTests))
diff --git a/code/modules/clothing/modular_armor/combat_robot.dm b/code/modules/clothing/modular_armor/combat_robot.dm
index 5b3d6f874b426..32d231c40b59f 100644
--- a/code/modules/clothing/modular_armor/combat_robot.dm
+++ b/code/modules/clothing/modular_armor/combat_robot.dm
@@ -61,18 +61,6 @@
slowdown = SLOWDOWN_ARMOR_HEAVY
greyscale_config = /datum/greyscale_config/robot/heavy
-/obj/item/clothing/suit/modular/robot/heavy/tyr
- starting_attachments = list(
- /obj/item/armor_module/module/tyr_extra_armor,
- /obj/item/armor_module/storage/engineering,
- )
-
-/obj/item/clothing/suit/modular/robot/heavy/shield
- starting_attachments = list(
- /obj/item/armor_module/module/eshield,
- /obj/item/armor_module/storage/engineering,
- )
-
//robot hats
/obj/item/clothing/head/modular/robot
name = "XN-1 upper armor plating"
@@ -127,6 +115,3 @@
desc = "Heavy armor plating designed for self mounting on the upper half of TerraGov combat robotics. It has self-sealing bolts for mounting on robotic owners inside."
starting_attachments = list(/obj/item/armor_module/storage/helmet, /obj/item/armor_module/armor/visor/marine/robot/heavy)
greyscale_config = /datum/greyscale_config/robot/heavy
-
-/obj/item/clothing/head/modular/robot/heavy/tyr
- starting_attachments = list(/obj/item/armor_module/storage/helmet, /obj/item/armor_module/armor/visor/marine/robot/heavy, /obj/item/armor_module/module/tyr_head)
diff --git a/code/modules/clothing/modular_armor/som.dm b/code/modules/clothing/modular_armor/som.dm
index 180ef33deb370..014a5bf607583 100644
--- a/code/modules/clothing/modular_armor/som.dm
+++ b/code/modules/clothing/modular_armor/som.dm
@@ -143,15 +143,6 @@
/obj/item/armor_module/storage/medical/som,
)
-/obj/item/clothing/suit/modular/som/heavy/leader/officer
- desc = "A bulky suit of heavy combat armor, the M-35 'Gorgon' armor provides the user with superior protection without severely impacting mobility. The gold markings on this one signify it is worn by a high ranking field officer. You'll need serious firepower to punch through this. Alt-Click to remove attached items. Use it to toggle the built-in flashlight."
- icon_state = "som_officer"
- item_state = "som_officer"
- starting_attachments = list(
- /obj/item/armor_module/module/valkyrie_autodoc/som,
- /obj/item/armor_module/storage/medical/som,
- )
-
//helmet
/obj/item/clothing/head/modular/som
@@ -251,8 +242,3 @@
/obj/item/armor_module/storage/helmet,
/obj/item/armor_module/armor/badge,
)
-
-/obj/item/clothing/head/modular/som/leader/officer
- desc = "Made for use with Gorgon pattern assault armor, providing superior protection. This one has gold markings indicating it belongs to a high ranking field officer."
- icon_state = "som_helmet_officer"
- item_state = "som_helmet_officer"
diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm
index c3b427f93abae..9e4eb0f06f719 100644
--- a/code/modules/clothing/under/marine_uniform.dm
+++ b/code/modules/clothing/under/marine_uniform.dm
@@ -509,6 +509,3 @@
if(!isrobot(user))
to_chat(user, span_warning("You can't equip this as it requires mounting screws on your body!"))
return FALSE
-
-/obj/item/clothing/under/marine/robotic/webbing
- starting_attachments = list(/obj/item/armor_module/storage/uniform/black_vest)
diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm
index 8514306a02409..392e5b316c029 100644
--- a/code/modules/mapping/map_template.dm
+++ b/code/modules/mapping/map_template.dm
@@ -49,11 +49,11 @@
SSatoms.InitializeAtoms(atoms)
SSmachines.setup_template_powernets(cables)
-/datum/map_template/proc/load_new_z(minimap = TRUE, list/traits = list(ZTRAIT_AWAY = TRUE))
+/datum/map_template/proc/load_new_z()
var/x = round((world.maxx - width)/2)
var/y = round((world.maxy - height)/2)
- var/datum/space_level/level = SSmapping.add_new_zlevel(name, traits)
+ var/datum/space_level/level = SSmapping.add_new_zlevel(name, list(ZTRAIT_AWAY = TRUE))
var/datum/parsed_map/parsed = load_map(file(mappath), x, y, level.z_value, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=TRUE)
var/list/bounds = parsed.bounds
if(!bounds)
@@ -63,14 +63,6 @@
//initialize things that are normally initialized after map load
parsed.initTemplateBounds()
- SSmodularmapping.load_modular_maps() //must be run after initTemplateBounds so markers have an actual loc
- SSweather.load_late_z(level.z_value)
- SSair.setup_atmos_machinery()
- SSair.setup_pipenets()
- SSlighting.create_lighting_objects_for_z(level.z_value)
- smooth_zlevel(level.z_value)
- if(minimap)
- SSminimaps.load_new_z(null, level)
log_game("Z-level [name] loaded at at [x],[y],[world.maxz]")
return level
@@ -112,6 +104,6 @@
//for your ever biggening badminnery kevinz000
//❤ - Cyberboss
-/proc/load_new_z_level(file, name, minimap = TRUE, list/traits = list())
+/proc/load_new_z_level(file, name)
var/datum/map_template/template = new(file, name)
- return template.load_new_z(minimap, traits)
+ template.load_new_z()
diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm
index 9bed483f42cc5..ef7b27b5a9b7d 100644
--- a/code/modules/mapping/space_management/zlevel_manager.dm
+++ b/code/modules/mapping/space_management/zlevel_manager.dm
@@ -24,7 +24,6 @@
// TODO: sleep here if the Z level needs to be cleared
var/datum/space_level/S = new z_type(new_z, name, traits)
z_list += S
- calculate_z_level_gravity(new_z)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_Z, S)
return S
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index a0157e011a899..c4eb84be6eacb 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -57,7 +57,7 @@
qdel(parasite)
DISABLE_BITFIELD(status_flags, XENO_HOST)
- if((SSticker.mode?.flags_round_type & MODE_TWO_HUMAN_FACTIONS) && job?.job_cost)
+ if(SSticker.mode?.flags_round_type & MODE_TWO_HUMAN_FACTIONS)
job.add_job_positions(1)
if(hud_list)
med_hud_set_status()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 4214c6694312e..6928ee3223755 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -571,8 +571,25 @@
if(istype(B) && B.buckled_bodybag)
conga_line += B.buckled_bodybag
end_of_conga = TRUE //Only mobs can continue the cycle.
+ var/area/new_area = get_area(destination)
for(var/atom/movable/AM in conga_line)
- AM.forceMove(destination)
+ var/move_dir = get_dir(AM, destination)
+ var/oldLoc
+ if(AM.loc)
+ oldLoc = AM.loc
+ AM.loc.Exited(AM, move_dir)
+ AM.loc = destination
+ AM.loc.Entered(AM, oldLoc)
+ var/area/old_area
+ if(oldLoc)
+ old_area = get_area(oldLoc)
+ if(new_area && old_area != new_area)
+ new_area.Entered(AM, oldLoc)
+ if(oldLoc)
+ AM.Moved(oldLoc, move_dir)
+ var/mob/M = AM
+ if(istype(M))
+ M.reset_perspective(destination)
return TRUE
diff --git a/code/modules/projectiles/ammo_datums.dm b/code/modules/projectiles/ammo_datums.dm
index 2255197926806..636f043f3a269 100644
--- a/code/modules/projectiles/ammo_datums.dm
+++ b/code/modules/projectiles/ammo_datums.dm
@@ -3366,9 +3366,6 @@ GLOBAL_LIST_INIT(no_sticky_resin, typecacheof(list(/obj/item/clothing/mask/faceh
accuracy_var_high = 3
fire_burst_damage = 20
-/datum/ammo/energy/volkite/medium/custom
- deflagrate_multiplier = 2
-
/datum/ammo/energy/volkite/heavy
max_range = 35
accurate_range = 12
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 2b384e55336f2..bec6ba83eaf29 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -663,23 +663,7 @@
)
/obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine/scout
- starting_attachment_types = list(
- /obj/item/attachable/reddot,
- /obj/item/weapon/gun/grenade_launcher/underslung,
- )
-
-/obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine/mag_harness
- starting_attachment_types = list(
- /obj/item/attachable/magnetic_harness,
- /obj/item/weapon/gun/grenade_launcher/underslung,
- /obj/item/attachable/bayonet,
- )
-
-/obj/item/weapon/gun/energy/lasgun/lasrifle/standard_marine_carbine/gyro
- starting_attachment_types = list(
- /obj/item/attachable/reddot,
- /obj/item/attachable/gyro,
- )
+ starting_attachment_types = list(/obj/item/attachable/reddot, /obj/item/weapon/gun/grenade_launcher/underslung,)
/datum/lasrifle/energy_carbine_mode/auto_burst
rounds_per_shot = 12
@@ -1070,19 +1054,6 @@
aim_slowdown = 0.1
wield_delay = 0.2 SECONDS
-/obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/serpenta/custom
- name = "\improper VX-12c Serpenta"
- desc = "The 'serpenta' is pistol typically seen in the hands of SOM officers and some NCOs, and is quite dangerous for it's size. This particular weapon appears to be a custom model with improved performance."
- icon_state = "vx12c"
- item_state = "vx12"
- ammo_datum_type = /datum/ammo/energy/volkite/medium/custom
- max_shots = 27
- rounds_per_shot = 20
- scatter = -2
- scatter_unwielded = 4
- accuracy_mult = 1.25
- accuracy_mult_unwielded = 0.95
-
/obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/charger
name = "\improper VX-32 Charger"
desc = "Volkite weapons are the pride of Martian weapons manufacturing, their construction being a tightly guarded secret. Infamous for its ability to deflagrate organic targets with its tremendous thermal energy, explosively burning flesh in a fiery blast that can be deadly to anyone unfortunate enough to be nearby. The charger is a light weight weapon with a high rate of fire, designed for high mobility and easy handling. Ineffective at longer ranges."
diff --git a/code/modules/projectiles/guns/sentries.dm b/code/modules/projectiles/guns/sentries.dm
index 67eb363dd18e9..ef8eb52bb881b 100644
--- a/code/modules/projectiles/guns/sentries.dm
+++ b/code/modules/projectiles/guns/sentries.dm
@@ -76,24 +76,7 @@
/obj/item/attachable/scope/unremovable/tl102,
)
-/obj/item/weapon/gun/sentry/pod_sentry
- name = "\improper ST-583 sentry gun"
- desc = "A fully automatic turret with AI targeting capabilities, designed specifically for deploying inside a paired drop pod shell. Armed with a M30 autocannon and a 500-round drum magazine. Designed to sweeping a landing area to support orbital assaults."
- icon_state = "podsentry"
- turret_flags = TURRET_HAS_CAMERA|TURRET_ALERTS|TURRET_RADIAL
- flags_item = IS_DEPLOYABLE|DEPLOY_ON_INITIALIZE|DEPLOYED_NO_PICKUP
- sentry_iff_signal = TGMC_LOYALIST_IFF
- turret_range = 10
- knockdown_threshold = 500
- max_shells = 500
- fire_delay = 0.15 SECONDS
- burst_amount = 1
- scatter = 12
- ammo_datum_type = /datum/ammo/bullet/turret
- default_ammo_type = /obj/item/ammo_magazine/sentry
- allowed_ammo_types = list(/obj/item/ammo_magazine/sentry)
- gun_firemode_list = list(GUN_FIREMODE_AUTOMATIC)
//thrown SOM sentry
/obj/item/weapon/gun/energy/lasgun/lasrifle/volkite/cope
diff --git a/code/modules/requisitions/fulton.dm b/code/modules/requisitions/fulton.dm
index 6e369c707d3f2..4cd0ec470e2ba 100644
--- a/code/modules/requisitions/fulton.dm
+++ b/code/modules/requisitions/fulton.dm
@@ -12,7 +12,7 @@
tool_behaviour = TOOL_FULTON
resistance_flags = RESIST_ALL
///Reference to the balloon vis obj effect
- var/atom/movable/vis_obj/fulton_balloon/baloon
+ var/atom/movable/vis_obj/fulton_baloon/baloon
var/obj/effect/fulton_extraction_holder/holder_obj
/// How many times you can use the fulton before it goes poof
var/uses = 3
diff --git a/code/modules/screen_alert/misc_alert.dm b/code/modules/screen_alert/misc_alert.dm
index 4a655ee0699fb..ba66adac4f49f 100644
--- a/code/modules/screen_alert/misc_alert.dm
+++ b/code/modules/screen_alert/misc_alert.dm
@@ -39,9 +39,3 @@
/atom/movable/screen/text/screen_text/picture/potrait/som_over
image_to_play = "overwatch_som"
-
-/atom/movable/screen/text/screen_text/picture/potrait/unknown
- image_to_play = "overwatch_unknown"
-
-/atom/movable/screen/text/screen_text/picture/potrait/pilot
- image_to_play = "po"
diff --git a/code/modules/vehicles/mecha/combat/greyscale/greyscale.dm b/code/modules/vehicles/mecha/combat/greyscale/greyscale.dm
index e31203777d164..d97e05776f612 100644
--- a/code/modules/vehicles/mecha/combat/greyscale/greyscale.dm
+++ b/code/modules/vehicles/mecha/combat/greyscale/greyscale.dm
@@ -27,7 +27,6 @@
internal_damage_threshold = 15
internal_damage_probability = 5
possible_int_damage = MECHA_INT_FIRE|MECHA_INT_SHORT_CIRCUIT
- mecha_flags = ADDING_ACCESS_POSSIBLE | CANSTRAFE | IS_ENCLOSED | HAS_HEADLIGHTS | MECHA_SKILL_LOCKED
/// keyed list. values are types at init, otherwise instances of mecha limbs, order is layer order as well
var/list/datum/mech_limb/limbs = list(
MECH_GREY_TORSO = null,
@@ -64,7 +63,7 @@
/obj/vehicle/sealed/mecha/combat/greyscale/mob_try_enter(mob/M)
- if((mecha_flags & MECHA_SKILL_LOCKED) && M.skills.getRating(SKILL_LARGE_VEHICLE) < SKILL_LARGE_VEHICLE_TRAINED)
+ if(M.skills.getRating(SKILL_LARGE_VEHICLE) < SKILL_LARGE_VEHICLE_TRAINED)
balloon_alert(M, "You don't know how to pilot this")
return FALSE
return ..()
@@ -163,6 +162,3 @@
MECH_GREY_R_ARM = /datum/mech_limb/arm/vanguard,
MECH_GREY_L_ARM = /datum/mech_limb/arm/vanguard,
)
-
-/obj/vehicle/sealed/mecha/combat/greyscale/vanguard/noskill
- mecha_flags = ADDING_ACCESS_POSSIBLE|CANSTRAFE|IS_ENCLOSED|HAS_HEADLIGHTS
diff --git a/config/maps.txt b/config/maps.txt
index 25410b37e7134..25602c4a56377 100644
--- a/config/maps.txt
+++ b/config/maps.txt
@@ -63,9 +63,6 @@ map deltastation
minplayers 60
endmap
-map fort_phobos
-endmap
-
map desparity
maxplayers 30
endmap
diff --git a/config/modes.txt b/config/modes.txt
index b63ea0c69b6d5..92f292769d492 100644
--- a/config/modes.txt
+++ b/config/modes.txt
@@ -23,7 +23,3 @@ endmode
mode Sensor Capture
requiredplayers 2
endmode
-
-mode Campaign
- requiredplayers 2
-endmode
diff --git a/config/shipmaps.txt b/config/shipmaps.txt
index 42c684d641bf3..0f48ea071d35f 100644
--- a/config/shipmaps.txt
+++ b/config/shipmaps.txt
@@ -31,6 +31,3 @@ endmap
map combat_patrol_base
endmap
-
-map iteron
-endmap
diff --git a/icons/Marine/dropship_prop.dmi b/icons/Marine/dropship_prop.dmi
deleted file mode 100644
index 5d3a93ac0433a..0000000000000
Binary files a/icons/Marine/dropship_prop.dmi and /dev/null differ
diff --git a/icons/Marine/gun64.dmi b/icons/Marine/gun64.dmi
index 56b7871ca8a26..84ba1699b2b86 100644
Binary files a/icons/Marine/gun64.dmi and b/icons/Marine/gun64.dmi differ
diff --git a/icons/Marine/mainship_props.dmi b/icons/Marine/mainship_props.dmi
index 9e91a22f01bed..2dca37bc6618c 100644
Binary files a/icons/Marine/mainship_props.dmi and b/icons/Marine/mainship_props.dmi differ
diff --git a/icons/Marine/mainship_props96.dmi b/icons/Marine/mainship_props96.dmi
index 9e11d42e2adde..5700431459f76 100644
Binary files a/icons/Marine/mainship_props96.dmi and b/icons/Marine/mainship_props96.dmi differ
diff --git a/icons/Marine/sentry.dmi b/icons/Marine/sentry.dmi
index 3d7eb7cf0935b..02be67b3dd91a 100644
Binary files a/icons/Marine/sentry.dmi and b/icons/Marine/sentry.dmi differ
diff --git a/icons/Marine/somshipprop.dmi b/icons/Marine/somshipprop.dmi
index e330fb8245e78..7e48c24fd9bff 100644
Binary files a/icons/Marine/somshipprop.dmi and b/icons/Marine/somshipprop.dmi differ
diff --git a/icons/UI_Icons/campaign_icons.dmi b/icons/UI_Icons/campaign_icons.dmi
deleted file mode 100644
index e4c1cec43ce7c..0000000000000
Binary files a/icons/UI_Icons/campaign_icons.dmi and /dev/null differ
diff --git a/icons/UI_Icons/map_blips.dmi b/icons/UI_Icons/map_blips.dmi
index 0ee3cedd39a21..cd4eb6c5ddb71 100644
Binary files a/icons/UI_Icons/map_blips.dmi and b/icons/UI_Icons/map_blips.dmi differ
diff --git a/icons/UI_Icons/screen_alert_images.dmi b/icons/UI_Icons/screen_alert_images.dmi
index 12ad063ea794d..e5a78ea259c31 100644
Binary files a/icons/UI_Icons/screen_alert_images.dmi and b/icons/UI_Icons/screen_alert_images.dmi differ
diff --git a/icons/effects/landmarks_static.dmi b/icons/effects/landmarks_static.dmi
index 4f876001d8c2b..5b13f66ad9353 100644
Binary files a/icons/effects/landmarks_static.dmi and b/icons/effects/landmarks_static.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 84c7bc6f0e6f8..5b9e93821a4ba 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/inhands/equipment/binoculars_left.dmi b/icons/mob/inhands/equipment/binoculars_left.dmi
deleted file mode 100644
index 05497ea550747..0000000000000
Binary files a/icons/mob/inhands/equipment/binoculars_left.dmi and /dev/null differ
diff --git a/icons/mob/inhands/equipment/binoculars_right.dmi b/icons/mob/inhands/equipment/binoculars_right.dmi
deleted file mode 100644
index 964463c05d621..0000000000000
Binary files a/icons/mob/inhands/equipment/binoculars_right.dmi and /dev/null differ
diff --git a/icons/mob/items_lefthand_1.dmi b/icons/mob/items_lefthand_1.dmi
index 261db86028c7a..510dbf15592cb 100644
Binary files a/icons/mob/items_lefthand_1.dmi and b/icons/mob/items_lefthand_1.dmi differ
diff --git a/icons/mob/items_righthand_1.dmi b/icons/mob/items_righthand_1.dmi
index 7c72f9cae64a2..f23722097002c 100644
Binary files a/icons/mob/items_righthand_1.dmi and b/icons/mob/items_righthand_1.dmi differ
diff --git a/icons/mob/modular/som_armor.dmi b/icons/mob/modular/som_armor.dmi
index d21051be3d1cf..9e4e55afebdb1 100644
Binary files a/icons/mob/modular/som_armor.dmi and b/icons/mob/modular/som_armor.dmi differ
diff --git a/icons/mob/modular/som_helmets.dmi b/icons/mob/modular/som_helmets.dmi
index ddf500e118512..682a68f5f9abc 100644
Binary files a/icons/mob/modular/som_helmets.dmi and b/icons/mob/modular/som_helmets.dmi differ
diff --git a/icons/mob/radial.dmi b/icons/mob/radial.dmi
index 8e2ec58865662..2b09990160ed0 100644
Binary files a/icons/mob/radial.dmi and b/icons/mob/radial.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 7f080f840223e..d925f5eb9ff22 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/flora/jungleflora.dmi b/icons/obj/flora/jungleflora.dmi
index 0626bcfca2671..86fc963aecafb 100644
Binary files a/icons/obj/flora/jungleflora.dmi and b/icons/obj/flora/jungleflora.dmi differ
diff --git a/icons/obj/flora/rocks2.dmi b/icons/obj/flora/rocks2.dmi
index f3c9da2ef9189..0d49dfcccfce3 100644
Binary files a/icons/obj/flora/rocks2.dmi and b/icons/obj/flora/rocks2.dmi differ
diff --git a/icons/obj/flora/smooth/grass_decal.dmi b/icons/obj/flora/smooth/grass_decal.dmi
deleted file mode 100644
index 9c5c0ccbdba05..0000000000000
Binary files a/icons/obj/flora/smooth/grass_decal.dmi and /dev/null differ
diff --git a/icons/obj/flora/smooth/tall_grass.dmi b/icons/obj/flora/smooth/tall_grass.dmi
deleted file mode 100644
index c76ca294890c6..0000000000000
Binary files a/icons/obj/flora/smooth/tall_grass.dmi and /dev/null differ
diff --git a/icons/obj/items/items.dmi b/icons/obj/items/items.dmi
index 70859e094e087..8ab51aeed1a99 100644
Binary files a/icons/obj/items/items.dmi and b/icons/obj/items/items.dmi differ
diff --git a/icons/obj/machines/bluespacedrive.dmi b/icons/obj/machines/bluespacedrive.dmi
deleted file mode 100644
index fa5431bc18407..0000000000000
Binary files a/icons/obj/machines/bluespacedrive.dmi and /dev/null differ
diff --git a/icons/obj/structures/big_droppod.dmi b/icons/obj/structures/big_droppod.dmi
deleted file mode 100644
index 4bb46355589c2..0000000000000
Binary files a/icons/obj/structures/big_droppod.dmi and /dev/null differ
diff --git a/icons/obj/structures/campaign_structures.dmi b/icons/obj/structures/campaign_structures.dmi
deleted file mode 100644
index 56080d34d592d..0000000000000
Binary files a/icons/obj/structures/campaign_structures.dmi and /dev/null differ
diff --git a/icons/obj/structures/droppod.dmi b/icons/obj/structures/droppod.dmi
index 25122abf424c2..a34abb027e2aa 100644
Binary files a/icons/obj/structures/droppod.dmi and b/icons/obj/structures/droppod.dmi differ
diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi
index 17e5f89fae261..b30dcf83b1389 100644
Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ
diff --git a/icons/turf/floors/jungle-border.dmi b/icons/turf/floors/jungle-border.dmi
index 860a09d9c3b91..6250319cf9b5d 100755
Binary files a/icons/turf/floors/jungle-border.dmi and b/icons/turf/floors/jungle-border.dmi differ
diff --git a/icons/turf/floors/jungle-dirt-border.dmi b/icons/turf/floors/jungle-dirt-border.dmi
deleted file mode 100644
index 4589eefec1700..0000000000000
Binary files a/icons/turf/floors/jungle-dirt-border.dmi and /dev/null differ
diff --git a/icons/turf/ground_map.dmi b/icons/turf/ground_map.dmi
index a2774b782ebe3..d05b87ac7b236 100644
Binary files a/icons/turf/ground_map.dmi and b/icons/turf/ground_map.dmi differ
diff --git a/sound/effects/dropship_sonic_boom.ogg b/sound/effects/dropship_sonic_boom.ogg
deleted file mode 100644
index 22aac07051afd..0000000000000
Binary files a/sound/effects/dropship_sonic_boom.ogg and /dev/null differ
diff --git a/sound/magic/castsummon.ogg b/sound/magic/castsummon.ogg
deleted file mode 100644
index e88bb073b3523..0000000000000
Binary files a/sound/magic/castsummon.ogg and /dev/null differ
diff --git a/sound/magic/lightning_chargeup.ogg b/sound/magic/lightning_chargeup.ogg
deleted file mode 100644
index 4889b6132481d..0000000000000
Binary files a/sound/magic/lightning_chargeup.ogg and /dev/null differ
diff --git a/sound/magic/lightningbolt.ogg b/sound/magic/lightningbolt.ogg
deleted file mode 100644
index df3145a08aec7..0000000000000
Binary files a/sound/magic/lightningbolt.ogg and /dev/null differ
diff --git a/sound/weapons/gauimpact.ogg b/sound/weapons/gauimpact.ogg
deleted file mode 100644
index 5b81de5d7481a..0000000000000
Binary files a/sound/weapons/gauimpact.ogg and /dev/null differ
diff --git a/sound/weapons/rocket_incoming.ogg b/sound/weapons/rocket_incoming.ogg
deleted file mode 100644
index a667da1f4b514..0000000000000
Binary files a/sound/weapons/rocket_incoming.ogg and /dev/null differ
diff --git a/tgmc.dme b/tgmc.dme
index 3c91dee52229d..4c9fdc2ccfa84 100755
--- a/tgmc.dme
+++ b/tgmc.dme
@@ -37,7 +37,6 @@
#include "code\__DEFINES\buckling.dm"
#include "code\__DEFINES\calibers.dm"
#include "code\__DEFINES\callbacks.dm"
-#include "code\__DEFINES\campaign.dm"
#include "code\__DEFINES\cas.dm"
#include "code\__DEFINES\chat.dm"
#include "code\__DEFINES\chat_filter.dm"
@@ -55,7 +54,6 @@
#include "code\__DEFINES\events.dm"
#include "code\__DEFINES\factions.dm"
#include "code\__DEFINES\factory.dm"
-#include "code\__DEFINES\fire_support.dm"
#include "code\__DEFINES\flags.dm"
#include "code\__DEFINES\foam.dm"
#include "code\__DEFINES\footsteps.dm"
@@ -194,7 +192,6 @@
#include "code\_globalvars\lists\admin.dm"
#include "code\_globalvars\lists\client.dm"
#include "code\_globalvars\lists\flavor_misc.dm"
-#include "code\_globalvars\lists\game_modes.dm"
#include "code\_globalvars\lists\hud.dm"
#include "code\_globalvars\lists\keybinding.dm"
#include "code\_globalvars\lists\mapping.dm"
@@ -332,7 +329,6 @@
#include "code\datums\datum.dm"
#include "code\datums\embedding_behavior.dm"
#include "code\datums\emotes.dm"
-#include "code\datums\fire_support.dm"
#include "code\datums\fluff_emails.dm"
#include "code\datums\holocall.dm"
#include "code\datums\http.dm"
@@ -451,33 +447,14 @@
#include "code\datums\emergency_calls\xenocorrupted.dm"
#include "code\datums\emergency_calls\xenozeta.dm"
#include "code\datums\gamemodes\_game_mode.dm"
-#include "code\datums\gamemodes\campaign.dm"
#include "code\datums\gamemodes\combat_patrol.dm"
#include "code\datums\gamemodes\crash.dm"
#include "code\datums\gamemodes\extended.dm"
-#include "code\datums\gamemodes\hvh.dm"
#include "code\datums\gamemodes\infestation.dm"
#include "code\datums\gamemodes\nuclear_war.dm"
#include "code\datums\gamemodes\objective.dm"
#include "code\datums\gamemodes\objective_items.dm"
#include "code\datums\gamemodes\sensor_capture.dm"
-#include "code\datums\gamemodes\campaign\campaign_mission.dm"
-#include "code\datums\gamemodes\campaign\campaign_reward_jobs.dm"
-#include "code\datums\gamemodes\campaign\campaign_rewards.dm"
-#include "code\datums\gamemodes\campaign\faction_stats.dm"
-#include "code\datums\gamemodes\campaign\missions\asat_capture.dm"
-#include "code\datums\gamemodes\campaign\missions\base_rescue.dm"
-#include "code\datums\gamemodes\campaign\missions\comm_uplink.dm"
-#include "code\datums\gamemodes\campaign\missions\destroy_mission.dm"
-#include "code\datums\gamemodes\campaign\missions\final_mission.dm"
-#include "code\datums\gamemodes\campaign\missions\fire_support_raid.dm"
-#include "code\datums\gamemodes\campaign\missions\loot_capture.dm"
-#include "code\datums\gamemodes\campaign\missions\mech_wars.dm"
-#include "code\datums\gamemodes\campaign\missions\patrol_mission.dm"
-#include "code\datums\gamemodes\campaign\missions\raiding_base.dm"
-#include "code\datums\gamemodes\campaign\missions\spearhead_assault.dm"
-#include "code\datums\gamemodes\campaign\missions\supply_raid.dm"
-#include "code\datums\gamemodes\campaign\missions\teleporter_raid.dm"
#include "code\datums\greyscale\_greyscale_config.dm"
#include "code\datums\greyscale\greyscale_configs.dm"
#include "code\datums\greyscale\layer.dm"
@@ -501,7 +478,6 @@
#include "code\datums\jobs\job\shipside.dm"
#include "code\datums\jobs\job\skeleton.dm"
#include "code\datums\jobs\job\sons_of_mars_ert.dm"
-#include "code\datums\jobs\job\sons_of_mars_shipside.dm"
#include "code\datums\jobs\job\sonsofmars.dm"
#include "code\datums\jobs\job\special_forces.dm"
#include "code\datums\jobs\job\survivor.dm"
@@ -589,7 +565,6 @@
#include "code\game\area\vaporprocessing.dm"
#include "code\game\area\whiskeyoutpost.dm"
#include "code\game\area\areas\shuttles.dm"
-#include "code\game\area\campaign_maps\jungle_outpost.dm"
#include "code\game\mecha\mech_bay.dm"
#include "code\game\mecha\mecha_parts.dm"
#include "code\game\mecha\mecha_wreckage.dm"
@@ -646,9 +621,7 @@
#include "code\game\objects\effects\landmarks\itemspawner.dm"
#include "code\game\objects\effects\landmarks\landmarks.dm"
#include "code\game\objects\effects\landmarks\marine_spawns.dm"
-#include "code\game\objects\effects\landmarks\mob_spawner.dm"
#include "code\game\objects\effects\landmarks\mode.dm"
-#include "code\game\objects\effects\landmarks\gamemode\campaign_reward_spawns.dm"
#include "code\game\objects\effects\landmarks\gamemode\crash_spawns.dm"
#include "code\game\objects\effects\spawners\bombspawner.dm"
#include "code\game\objects\effects\spawners\gibspawner.dm"
@@ -683,7 +656,6 @@
#include "code\game\objects\items\defibrillator.dm"
#include "code\game\objects\items\disks.dm"
#include "code\game\objects\items\embedding.dm"
-#include "code\game\objects\items\firesupport_binoculars.dm"
#include "code\game\objects\items\flash.dm"
#include "code\game\objects\items\flashlight.dm"
#include "code\game\objects\items\floor_painter.dm"
@@ -991,7 +963,6 @@
#include "code\game\objects\structures\bedsheet_bin.dm"
#include "code\game\objects\structures\benchpress.dm"
#include "code\game\objects\structures\bookcase.dm"
-#include "code\game\objects\structures\campaign_structure.dm"
#include "code\game\objects\structures\cargo_container.dm"
#include "code\game\objects\structures\cas_plane_parts.dm"
#include "code\game\objects\structures\coathanger.dm"
@@ -1040,7 +1011,6 @@
#include "code\game\objects\structures\tables_racks.dm"
#include "code\game\objects\structures\tank_dispenser.dm"
#include "code\game\objects\structures\teleporter.dm"
-#include "code\game\objects\structures\teleporter_array.dm"
#include "code\game\objects\structures\toolboxtrophy.dm"
#include "code\game\objects\structures\watercloset.dm"
#include "code\game\objects\structures\windoor_assembly.dm"
diff --git a/tgui/packages/tgui/interfaces/CampaignMenu/CampaignAssets.tsx b/tgui/packages/tgui/interfaces/CampaignMenu/CampaignAssets.tsx
deleted file mode 100644
index 18f81c6f20c85..0000000000000
--- a/tgui/packages/tgui/interfaces/CampaignMenu/CampaignAssets.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-import { CampaignData, FactionReward, AssetIcon } from './index';
-import { useBackend, useLocalState } from '../../backend';
-import { LabeledList, Button, Stack, Section } from '../../components';
-
-export const CampaignAssets = (props, context) => {
- const { act, data } = useBackend(context);
- const { faction_rewards_data } = data;
- const [selectedAsset, setSelectedAsset] = useLocalState(
- context,
- 'selectedAsset',
- null
- );
- const [selectedReward, setSelectedReward] = useLocalState(
- context,
- 'selectedReward',
- faction_rewards_data[0]
- );
- faction_rewards_data.sort((a, b) => {
- const used_asset_a = a.uses_remaining;
- const used_asset_b = b.uses_remaining;
- if (used_asset_a && used_asset_b) return 0;
- if (used_asset_a && !used_asset_b) return -1;
- if (!used_asset_a && used_asset_b) return 1;
- return 0;
- });
-
- return (
-
-
-
- {faction_rewards_data.map((reward) => (
-
-
-
- ))}
-
-
-
- setSelectedAsset(selectedReward)}
- icon={'check'}>
- Activate
-
- }>
-
-
- {selectedReward?.name}
-
-
- {selectedReward?.desc}
-
-
- {selectedReward?.uses_remaining} / {selectedReward?.uses_original}
-
-
- {selectedReward?.detailed_desc}
-
-
-
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/CampaignMenu/CampaignMissions.tsx b/tgui/packages/tgui/interfaces/CampaignMenu/CampaignMissions.tsx
deleted file mode 100644
index fe7efea37bf68..0000000000000
--- a/tgui/packages/tgui/interfaces/CampaignMenu/CampaignMissions.tsx
+++ /dev/null
@@ -1,58 +0,0 @@
-import { CampaignData, MissionData } from './index';
-import { useBackend, useLocalState } from '../../backend';
-import { LabeledList, Button, Stack, Section } from '../../components';
-
-export const CampaignMissions = (props, context) => {
- const { act, data } = useBackend(context);
- const { available_missions } = data;
- const [selectedNewMission, setSelectedNewMission] =
- useLocalState(context, 'selectedNewMission', null);
- const [selectedMission, setSelectedMission] = useLocalState(
- context,
- 'selectedMission',
- available_missions[0]
- );
-
- return (
-
-
-
- {available_missions.map((mission) => (
-
-
-
- ))}
-
-
-
- setSelectedNewMission(selectedMission)}
- icon={'check'}>
- Select
-
- }>
-
-
- {selectedMission?.map_name}
-
-
- {selectedMission?.objective_description}
-
-
- {selectedMission.mission_brief}
-
-
-
- {selectedMission.mission_rewards}
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/CampaignMenu/CampaignOverview.tsx b/tgui/packages/tgui/interfaces/CampaignMenu/CampaignOverview.tsx
deleted file mode 100644
index 3cf9a915a02f0..0000000000000
--- a/tgui/packages/tgui/interfaces/CampaignMenu/CampaignOverview.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import { CampaignData } from './index';
-import { useBackend } from '../../backend';
-import { LabeledList, Button, Section } from '../../components';
-
-export const CampaignOverview = (props, context) => {
- const { act, data } = useBackend(context);
- const {
- current_mission,
- active_attrition_points,
- total_attrition_points,
- faction_leader,
- victory_points,
- faction,
- } = data;
- const { map_name, objective_description, mission_brief } = current_mission;
- return (
- <>
-
-
- {map_name}
-
- {objective_description}
-
-
- {mission_brief}
-
-
- {active_attrition_points}
-
-
-
-
-
-
-
-
-
- {faction_leader}
-
-
- {victory_points}
-
-
- {total_attrition_points}
-
-
-
- >
- );
-};
diff --git a/tgui/packages/tgui/interfaces/CampaignMenu/CampaignPurchase.tsx b/tgui/packages/tgui/interfaces/CampaignMenu/CampaignPurchase.tsx
deleted file mode 100644
index d39f69b834e84..0000000000000
--- a/tgui/packages/tgui/interfaces/CampaignMenu/CampaignPurchase.tsx
+++ /dev/null
@@ -1,88 +0,0 @@
-import { CampaignData, FactionReward, AssetIcon } from './index';
-import { useBackend, useLocalState } from '../../backend';
-import { LabeledList, Button, Stack, Section } from '../../components';
-
-export const CampaignPurchase = (props, context) => {
- const { act, data } = useBackend(context);
- const { purchasable_rewards_data } = data;
- const [purchasedAsset, setPurchasedAsset] =
- useLocalState(context, 'purchasedAsset', null);
- const [selectedReward, setSelectedReward] = useLocalState(
- context,
- 'selectedReward',
- purchasable_rewards_data[0]
- );
- purchasable_rewards_data.sort((a, b) => {
- const used_asset_a = a.uses_remaining;
- const used_asset_b = b.uses_remaining;
- if (used_asset_a && used_asset_b) return 0;
- if (used_asset_a && !used_asset_b) return -1;
- if (!used_asset_a && used_asset_b) return 1;
- return 0;
- });
-
- return (
-
-
-
- {purchasable_rewards_data.map((reward) => (
-
-
-
- ))}
-
-
-
- setPurchasedAsset(selectedReward)}
- icon={'check'}>
- Purchase
-
- }>
-
-
- {selectedReward?.name}
-
-
- {selectedReward?.desc}
-
-
- {selectedReward?.cost}
-
-
- {selectedReward?.uses_original}
-
-
- {selectedReward?.detailed_desc}
-
-
-
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/CampaignMenu/index.tsx b/tgui/packages/tgui/interfaces/CampaignMenu/index.tsx
deleted file mode 100644
index 1b647ffb813b1..0000000000000
--- a/tgui/packages/tgui/interfaces/CampaignMenu/index.tsx
+++ /dev/null
@@ -1,243 +0,0 @@
-import { useBackend, useLocalState } from '../../backend';
-import { Window } from '../../layouts';
-import { Box, Modal, Tabs, Button, Stack, Section } from '../../components';
-import { CampaignOverview } from './CampaignOverview';
-import { CampaignMissions } from './CampaignMissions';
-import { CampaignAssets } from './CampaignAssets';
-import { CampaignPurchase } from './CampaignPurchase';
-
-const TAB_OVERVIEW = 'Overview';
-const TAB_MISSIONS = 'Missions';
-const TAB_ASSETS = 'Assets';
-const TAB_PURCHASABLE_ASSETS = 'Purchase Assets';
-
-const CampaignTabs = [
- TAB_OVERVIEW,
- TAB_MISSIONS,
- TAB_ASSETS,
- TAB_PURCHASABLE_ASSETS,
-];
-
-export type MissionData = {
- faction_rewards_data;
- typepath?: string;
- name: string;
-
- map_name: string;
- starting_faction?: string;
- hostile_faction?: string;
- winning_faction?: string;
- outcome?: string;
-
- objective_description: string;
- mission_brief: string;
- mission_rewards: string;
-};
-
-export type FactionReward = {
- name: string;
- type: string;
- desc: string;
- detailed_desc: string;
- uses_remaining: number;
- uses_original: number;
- cost: number;
- icon?: string;
- currently_active?: number;
- is_debuff?: number;
-};
-
-export type CampaignData = {
- ui_theme: string;
-
- current_mission: MissionData;
- available_missions: MissionData[];
- finished_missions: MissionData[];
-
- faction_rewards_data: FactionReward[];
- purchasable_rewards_data: FactionReward[];
- active_attrition_points: number;
- total_attrition_points: number;
- faction_leader?: string;
- victory_points: number;
- faction: string;
- icons?: string[];
-};
-
-export const CampaignMenu = (props, context) => {
- const { act, data } = useBackend(context);
- const [selectedTab, setSelectedTab] = useLocalState(
- context,
- 'selectedTab',
- TAB_OVERVIEW
- );
-
- const [selectedAsset, setSelectedAsset] = useLocalState(
- context,
- 'selectedAsset',
- null
- );
- const [purchasedAsset, setPurchasedAsset] =
- useLocalState(context, 'purchasedAsset', null);
- const [selectedNewMission, setSelectedNewMission] =
- useLocalState(context, 'selectedNewMission', null);
-
- return (
-
-
- {selectedAsset ? (
-
-
-
-
-
-
-
-
-
-
-
-
- ) : null}
- {purchasedAsset ? (
-
-
-
-
-
-
-
-
-
-
-
-
- ) : null}
- {selectedNewMission ? (
-
-
-
-
-
-
-
-
-
-
-
-
- ) : null}
-
- {CampaignTabs.map((tabname) => {
- return (
- setSelectedTab(tabname)}>
- {tabname}
-
- );
- })}
-
-
-
-
- );
-};
-
-const CampaignContent = (props, context) => {
- const [selectedTab, setSelectedTab] = useLocalState(
- context,
- 'selectedTab',
- TAB_OVERVIEW
- );
- switch (selectedTab) {
- case TAB_OVERVIEW:
- return ;
- case TAB_MISSIONS:
- return ;
- case TAB_ASSETS:
- return ;
- case TAB_PURCHASABLE_ASSETS:
- return ;
- default:
- return null;
- }
-};
-
-/** Generates a small icon for buttons based on ICONMAP */
-export const AssetIcon = (props: { icon: FactionReward['icon'] }, context) => {
- const { data } = useBackend(context);
- const { icons = [] } = data;
- const { icon } = props;
- if (!icon || !icons[icon]) {
- return null;
- }
-
- return (
-
- );
-};