Skip to content

Commit

Permalink
Combined Arms mission (#16126)
Browse files Browse the repository at this point in the history
  • Loading branch information
Lumipharon authored Jul 4, 2024
1 parent 8f06876 commit 8cf8510
Show file tree
Hide file tree
Showing 17 changed files with 1,065 additions and 896 deletions.
1,260 changes: 666 additions & 594 deletions _maps/map_files/Fort_Phobos/Fort_Phobos.dmm

Large diffs are not rendered by default.

307 changes: 130 additions & 177 deletions _maps/map_files/Iteron/Iteron.dmm

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions code/__DEFINES/factions.dm
Original file line number Diff line number Diff line change
Expand Up @@ -122,13 +122,13 @@ GLOBAL_LIST_INIT(faction_to_portrait, list(

GLOBAL_LIST_INIT(faction_to_mech_spawner, list(
FACTION_TERRAGOV = list(
"heavy" = /obj/effect/landmark/campaign/mech_spawner/heavy,
"medium" = /obj/effect/landmark/campaign/mech_spawner,
"light" = /obj/effect/landmark/campaign/mech_spawner/light,
"heavy" = /obj/effect/landmark/campaign/vehicle_spawner/mech/heavy,
"medium" = /obj/effect/landmark/campaign/vehicle_spawner/mech,
"light" = /obj/effect/landmark/campaign/vehicle_spawner/mech/light,
),
FACTION_SOM = list(
"heavy" = /obj/effect/landmark/campaign/mech_spawner/som/heavy,
"medium" = /obj/effect/landmark/campaign/mech_spawner/som,
"light" = /obj/effect/landmark/campaign/mech_spawner/som/light,
"heavy" = /obj/effect/landmark/campaign/vehicle_spawner/mech/som/heavy,
"medium" = /obj/effect/landmark/campaign/vehicle_spawner/mech/som,
"light" = /obj/effect/landmark/campaign/vehicle_spawner/mech/som/light,
),
))
2 changes: 2 additions & 0 deletions code/_globalvars/lists/objects.dm
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ GLOBAL_LIST_EMPTY(campaign_objectives)
GLOBAL_LIST_EMPTY(campaign_structures)
///List of all mech spawners in campaign mode
GLOBAL_LIST_EMPTY(campaign_mech_spawners)
///List of all tank spawners in campaign mode
GLOBAL_LIST_EMPTY(campaign_tank_spawners)
///Locations for rewards to spawn by faction
GLOBAL_LIST_EMPTY(campaign_reward_spawners)
///List of all teleporter arrays
Expand Down
19 changes: 17 additions & 2 deletions code/datums/gamemodes/campaign/campaign_mission.dm
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,7 @@
if(!mech_faction)
return
var/total_count = (heavy_mech + medium_mech + light_mech)
for(var/obj/effect/landmark/campaign/mech_spawner/mech_spawner AS in GLOB.campaign_mech_spawners[mech_faction])
for(var/obj/effect/landmark/campaign/vehicle_spawner/mech/mech_spawner AS in GLOB.campaign_mech_spawners[mech_faction])
if(!heavy_mech && !medium_mech && !light_mech)
break
var/new_mech
Expand All @@ -538,12 +538,27 @@
light_mech --
else
continue
new_mech = mech_spawner.spawn_mech()
new_mech = mech_spawner.spawn_vehicle()
GLOB.campaign_structures += new_mech
RegisterSignal(new_mech, COMSIG_QDELETING, TYPE_PROC_REF(/datum/campaign_mission, remove_mission_object))

map_text_broadcast(mech_faction, override_message ? override_message : "[total_count] mechs have been deployed for this mission.", "Mechs available")

///spawns mechs for a faction
/datum/campaign_mission/proc/spawn_tank(tank_faction, quantity, override_message)
if(!tank_faction)
return
var/remaining_count = quantity
for(var/obj/effect/landmark/campaign/vehicle_spawner/tank/tank_spawner AS in GLOB.campaign_tank_spawners[tank_faction])
if(!remaining_count)
break
remaining_count --
var/new_tank = tank_spawner.spawn_vehicle()
GLOB.campaign_structures += new_tank
RegisterSignal(new_tank, COMSIG_QDELETING, TYPE_PROC_REF(/datum/campaign_mission, remove_mission_object))

map_text_broadcast(tank_faction, override_message ? override_message : "[quantity] mechs have been deployed for this mission.", "Mechs available")

///Returns the current mission, if its the campaign gamemode
/proc/get_current_mission()
if(!iscampaigngamemode(SSticker.mode))
Expand Down
64 changes: 30 additions & 34 deletions code/datums/gamemodes/campaign/missions/mech_wars.dm
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//mech on mech violence
/datum/campaign_mission/tdm/mech_wars
name = "Mech war"
name = "Combined Arms"
mission_icon = "mech_war"
map_name = "Patrick's Rest"
map_file = '_maps/map_files/Campaign maps/patricks_rest/patricks_rest.dmm'
Expand Down Expand Up @@ -63,34 +63,33 @@
return ..()

/datum/campaign_mission/tdm/mech_wars/load_pre_mission_bonuses()
var/mechs_to_spawn = round(length(GLOB.clients) * 0.2) + 1
var/obj/effect/landmark/campaign/mech_spawner/spawner
var/obj/vehicle/sealed/mecha/combat/greyscale/new_mech
var/faction_list = list(starting_faction, hostile_faction)
for(var/faction in faction_list)
for(var/i=1 to mechs_to_spawn)
spawner = pick(GLOB.campaign_mech_spawners[faction])
new_mech = spawner.spawn_mech()
GLOB.campaign_structures += new_mech
RegisterSignal(new_mech, COMSIG_QDELETING, PROC_REF(on_mech_destruction))

//anti mech infantry weapons
if(i % 2)
if(faction == FACTION_SOM)
new /obj/item/storage/holster/backholster/rpg/som/heat(get_turf(pick(GLOB.campaign_reward_spawners[faction])))
else
new /obj/item/storage/holster/backholster/rpg/heam(get_turf(pick(GLOB.campaign_reward_spawners[faction])))
var/tanks_to_spawn = length(GLOB.clients) > 80 ? 3 : length(GLOB.clients) > 50 ? 2 : 1
spawn_tank(starting_faction, tanks_to_spawn)
spawn_tank(hostile_faction, tanks_to_spawn)

var/mechs_to_spawn = floor(length(GLOB.clients) * 0.1) + 1
var/heavy_spawn = floor(mechs_to_spawn / 6)
var/med_spawn = floor(mechs_to_spawn / 4)
var/light_spawn = mechs_to_spawn - heavy_spawn - med_spawn
spawn_mech(starting_faction, heavy_spawn, med_spawn, light_spawn)
spawn_mech(hostile_faction, heavy_spawn, med_spawn, light_spawn)

for(var/faction in list(starting_faction, hostile_faction))
for(var/i=1 to mechs_to_spawn + tanks_to_spawn)
if(faction == FACTION_SOM)
new /obj/item/storage/holster/backholster/rpg/som/heat(get_turf(pick(GLOB.campaign_reward_spawners[faction])))
else
new /obj/item/storage/holster/backholster/rpg/heam(get_turf(pick(GLOB.campaign_reward_spawners[faction])))

/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_asset(/datum/campaign_asset/mech/heavy)
winning_team.add_asset(/datum/campaign_asset/mech/light)
winning_team.add_asset(/datum/campaign_asset/mech)

/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_asset(/datum/campaign_asset/mech)
winning_team.add_asset(/datum/campaign_asset/mech/light)

/datum/campaign_mission/tdm/mech_wars/apply_draw()
Expand All @@ -99,29 +98,28 @@
/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_asset(/datum/campaign_asset/mech/som)
winning_team.add_asset(/datum/campaign_asset/mech/light/som)

/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_asset(/datum/campaign_asset/mech/heavy/som)
winning_team.add_asset(/datum/campaign_asset/mech/light/som)
winning_team.add_asset(/datum/campaign_asset/mech/som)

///Cleans up after a mech is destroyed
/datum/campaign_mission/tdm/mech_wars/proc/on_mech_destruction(obj/vehicle/sealed/mecha/combat/greyscale/dead_mech)
SIGNAL_HANDLER
remove_mission_object(dead_mech)
/datum/campaign_mission/tdm/mech_wars/remove_mission_object(obj/mission_obj)
. = ..()
if(outcome)
return
if(dead_mech.faction == hostile_faction)
if(!ismecha(mission_obj) && !isarmoredvehicle(mission_obj))
return
var/obj/vehicle/sealed/obj_vehicle = mission_obj
if(obj_vehicle.faction == hostile_faction)
start_team_cap_points += 10
else if(dead_mech.faction == starting_faction)
else if(obj_vehicle.faction == starting_faction)
hostile_team_cap_points += 10


/datum/campaign_mission/tdm/mech_wars/som
name = "Mech war"
mission_icon = "mech_war"
map_name = "Big Red"
map_file = '_maps/map_files/BigRed_v2/BigRed_v2.dmm'
map_traits = list(ZTRAIT_AWAY = TRUE, ZTRAIT_SANDSTORM = TRUE)
Expand All @@ -132,23 +130,21 @@
/datum/campaign_mission/tdm/mech_wars/som/apply_major_victory()
winning_faction = starting_faction
var/datum/faction_stats/winning_team = mode.stat_list[starting_faction]
winning_team.add_asset(/datum/campaign_asset/mech/heavy/som)
winning_team.add_asset(/datum/campaign_asset/mech/light/som)
winning_team.add_asset(/datum/campaign_asset/mech/som)

/datum/campaign_mission/tdm/mech_wars/som/apply_minor_victory()
winning_faction = starting_faction
var/datum/faction_stats/winning_team = mode.stat_list[starting_faction]
winning_team.add_asset(/datum/campaign_asset/mech/som)
winning_team.add_asset(/datum/campaign_asset/mech/light/som)

/datum/campaign_mission/tdm/mech_wars/som/apply_minor_loss()
winning_faction = hostile_faction
var/datum/faction_stats/winning_team = mode.stat_list[hostile_faction]
winning_team.add_asset(/datum/campaign_asset/mech)
winning_team.add_asset(/datum/campaign_asset/mech/light)

/datum/campaign_mission/tdm/mech_wars/som/apply_major_loss()
winning_faction = hostile_faction
var/datum/faction_stats/winning_team = mode.stat_list[hostile_faction]
winning_team.add_asset(/datum/campaign_asset/mech/heavy)
winning_team.add_asset(/datum/campaign_asset/mech/light)
winning_team.add_asset(/datum/campaign_asset/mech)
78 changes: 8 additions & 70 deletions code/datums/gamemodes/campaign/rewards/mechs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
detailed_desc = "Your battalion has been assigned a single Assault medium combat mech. The Assault mech features balanced armor and mobility, allowing it to keep up with infantry movements while still offering significant resilience. It is considered the general work horse combat mech."
ui_icon = "medium_mech"
uses = 1
var/obj/effect/landmark/campaign/mech_spawner/spawner_type = /obj/effect/landmark/campaign/mech_spawner
var/obj/effect/landmark/campaign/vehicle_spawner/mech/spawner_type = /obj/effect/landmark/campaign/vehicle_spawner/mech

/datum/campaign_asset/mech/activated_effect()
for(var/obj/effect/landmark/campaign/mech_spawner/faction_spawner AS in GLOB.campaign_mech_spawners[faction.faction])
for(var/obj/effect/landmark/campaign/vehicle_spawner/mech/faction_spawner AS in GLOB.campaign_mech_spawners[faction.faction])
if(faction_spawner.type == spawner_type)
faction_spawner.spawn_mech()
faction_spawner.spawn_vehicle()
playsound(faction_spawner,'sound/effects/phasein.ogg', 80, FALSE)
return

Expand All @@ -18,82 +18,20 @@
desc = "One light combat mech"
detailed_desc = "Your battalion has been assigned a single Recon light combat mech. The Recon mech is lightly armored but very nimble and is still capable of carrying a full suite of weapons. Commonly used for scouting, screening and flanking manoeuvres."
ui_icon = "light_mech"
spawner_type = /obj/effect/landmark/campaign/mech_spawner/light
spawner_type = /obj/effect/landmark/campaign/vehicle_spawner/mech/light

/datum/campaign_asset/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 galaxy's premier frontline combat mech, although its speed and maneuverability are somewhat lackluster."
ui_icon = "heavy_mech"
spawner_type = /obj/effect/landmark/campaign/mech_spawner/heavy
spawner_type = /obj/effect/landmark/campaign/vehicle_spawner/mech/heavy

/datum/campaign_asset/mech/som
spawner_type = /obj/effect/landmark/campaign/mech_spawner/som
spawner_type = /obj/effect/landmark/campaign/vehicle_spawner/mech/som

/datum/campaign_asset/mech/light/som
spawner_type = /obj/effect/landmark/campaign/mech_spawner/som/light
spawner_type = /obj/effect/landmark/campaign/vehicle_spawner/mech/som/light

/datum/campaign_asset/mech/heavy/som
spawner_type = /obj/effect/landmark/campaign/mech_spawner/som/heavy

//mech spawn points
/obj/effect/landmark/campaign/mech_spawner
name = "tgmc med mech spawner"
icon_state = "mech"
///Faction associated with this spawner
var/faction = FACTION_TERRAGOV
///Colours to paint mechs from this spawner
var/list/colors = list(ARMOR_PALETTE_SPACE_CADET, ARMOR_PALETTE_GREYISH_TURQUOISE)
///Colours to paint mech heads from this spawner for better visual clarity
var/list/head_colors = list(ARMOR_PALETTE_STORM, ARMOR_PALETTE_GREYISH_TURQUOISE, VISOR_PALETTE_SYNDIE_GREEN)
///Mech type for this spawner
var/obj/vehicle/sealed/mecha/combat/greyscale/mech_type = /obj/vehicle/sealed/mecha/combat/greyscale/assault/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 ..()

///Creates and sets up the mech
/obj/effect/landmark/campaign/mech_spawner/proc/spawn_mech()
var/obj/vehicle/sealed/mecha/combat/greyscale/new_mech = new mech_type(loc)
for(var/i in new_mech.limbs)
var/datum/mech_limb/limb = new_mech.limbs[i]
limb.update_colors(arglist(istype(limb, /datum/mech_limb/head) ? head_colors : colors))
new_mech.update_icon()
return new_mech

/obj/effect/landmark/campaign/mech_spawner/heavy
name = "tgmc heavy mech spawner"
icon_state = "mech_heavy"
head_colors = list(ARMOR_PALETTE_RED, ARMOR_PALETTE_GREYISH_TURQUOISE, VISOR_PALETTE_SYNDIE_GREEN)
mech_type = /obj/vehicle/sealed/mecha/combat/greyscale/vanguard/noskill

/obj/effect/landmark/campaign/mech_spawner/light
name = "tgmc light mech spawner"
icon_state = "mech_light"
head_colors = list(ARMOR_PALETTE_SPACE_CADET, ARMOR_PALETTE_GREYISH_TURQUOISE, VISOR_PALETTE_SYNDIE_GREEN)
mech_type = /obj/vehicle/sealed/mecha/combat/greyscale/recon/noskill

/obj/effect/landmark/campaign/mech_spawner/som
name = "som med mech spawner"
faction = FACTION_SOM
colors = list(ARMOR_PALETTE_GINGER, ARMOR_PALETTE_ANGELIC)
head_colors = list(ARMOR_PALETTE_ANGELIC, ARMOR_PALETTE_GREY, VISOR_PALETTE_SYNDIE_GREEN)

/obj/effect/landmark/campaign/mech_spawner/som/heavy
name = "som heavy mech spawner"
icon_state = "mech_heavy"
colors = list(ARMOR_PALETTE_GINGER, ARMOR_PALETTE_MAGENTA)
head_colors = list(ARMOR_PALETTE_MAGENTA, ARMOR_PALETTE_GRAPE, VISOR_PALETTE_ELITE_ORANGE)
mech_type = /obj/vehicle/sealed/mecha/combat/greyscale/vanguard/noskill

/obj/effect/landmark/campaign/mech_spawner/som/light
name = "som light mech spawner"
icon_state = "mech_light"
colors = list(ARMOR_PALETTE_GINGER, ARMOR_PALETTE_BLACK)
head_colors = list(ARMOR_PALETTE_GINGER, ARMOR_PALETTE_BLACK, VISOR_PALETTE_SYNDIE_GREEN)
mech_type = /obj/vehicle/sealed/mecha/combat/greyscale/recon/noskill
spawner_type = /obj/effect/landmark/campaign/vehicle_spawner/mech/som/heavy
Loading

0 comments on commit 8cf8510

Please sign in to comment.