diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm index 865308664975..66095c4f4d45 100644 --- a/code/__DEFINES/__game.dm +++ b/code/__DEFINES/__game.dm @@ -35,6 +35,7 @@ #define MAP_LV759_HYBRISA_PROSPERA "LV-759 Hybrisa Prospera" // Highpop Only #define MAP_NEW_VARADERO "New Varadero"//ice colony underground but as its own map #define MAP_CHINOOK "Chinook 91 GSO" //admin level +#define MAP_ROSTOCK "SSV Rostock" //UPP Warship #define GAMEMODE_WHISKEY_OUTPOST "Whiskey Outpost" #define GAMEMODE_HIVE_WARS "Hive Wars" @@ -391,6 +392,8 @@ #define WALL_DEVWALL_R "devwall_r" #define WALL_HUNTERSHIP "metal"//DMI specific name #define WALL_AICORE "aiwall" +#define WALL_UPP_SHIP "uppwall_interior" +#define WALL_UPP_BASE "uppwall" //Defines for dropship weapon gimbals #define GIMBAL_LEFT -1 diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm index 04d64f3572e6..20e12ccbe6f0 100644 --- a/code/__DEFINES/gamemode.dm +++ b/code/__DEFINES/gamemode.dm @@ -15,4 +15,7 @@ #define MODE_BATTLEFIELD_DRAW_STALEMATE "DRAW: Stalemate" #define MODE_BATTLEFIELD_DRAW_DEATH "DRAW: My Friends Are Dead" +#define MODE_FACTION_CLASH_UPP_MAJOR "UPP Major Victory" +#define MODE_FACTION_CLASH_UPP_MINOR "UPP Minor Victory" + #define MODE_GENERIC_DRAW_NUKE "DRAW: Nuclear Explosion" diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index ab9d0f1bffde..5feba90d3a18 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -109,6 +109,7 @@ #define MOBILE_SHUTTLE_LIFEBOAT_PORT "lifeboat-port" #define MOBILE_SHUTTLE_LIFEBOAT_STARBOARD "lifeboat-starboard" +#define MOBILE_SHUTTLE_LIFEBOAT_ROSTOCK "lifeboat-rostock" #define MOBILE_SHUTTLE_VEHICLE_ELEVATOR "vehicle_elevator" #define DROPSHIP_ALAMO "dropship_alamo" @@ -120,7 +121,8 @@ #define ALMAYER_DROPSHIP_LZ1 "almayer-hangar-lz1" #define ALMAYER_DROPSHIP_LZ2 "almayer-hangar-lz2" -#define UPP_DROPSHIP_LZ2 "upp-hangar-lz1" +#define UPP_DROPSHIP_LZ1 "upp-hangar-lz1" +#define UPP_DROPSHIP_LZ2 "upp-hangar-lz2" #define DROPSHIP_FLYBY_ID "special_flight" #define DROPSHIP_LZ1 "dropship-lz1" diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 2968b110aaf5..e2f305598bba 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -234,6 +234,7 @@ SUBSYSTEM_DEF(mapping) INIT_ANNOUNCE("Loading [ship_map.map_name]...") Loadship(FailedZs, ship_map.map_name, ship_map.map_path, ship_map.map_file, ship_map.traits, ZTRAITS_MAIN_SHIP, override_map_path = ship_base_path) + Loadship(FailedZs, "ssv_rostock", "templates/", list("ssv_rostock.dmm") , list(),ZTRAITS_MAIN_SHIP , override_map_path = "maps/") if(LAZYLEN(FailedZs)) //but seriously, unless the server's filesystem is messed up this will never happen var/msg = "RED ALERT! The following map files failed to load: [FailedZs[1]]" if(length(FailedZs) > 1) diff --git a/code/datums/emergency_calls/ert_stations.dm b/code/datums/emergency_calls/ert_stations.dm index 947007d25d70..31ccc0486685 100644 --- a/code/datums/emergency_calls/ert_stations.dm +++ b/code/datums/emergency_calls/ert_stations.dm @@ -21,3 +21,6 @@ /datum/lazy_template/fax_response_base map_name = "fax_responder_base" + +/datum/lazy_template/ssv_rostock + map_name = "ssv_rostock" diff --git a/code/game/area/rostock.dm b/code/game/area/rostock.dm new file mode 100644 index 000000000000..d75347ac545a --- /dev/null +++ b/code/game/area/rostock.dm @@ -0,0 +1,415 @@ +//ROSTOCK AREAS (Different to Almayer)--------------------------------------// +// Fore = East | Aft = West // +// Port = North | Starboard = South // +// Bow = Eastern |Stern = Western //(those are the front and back small sections) +// Naming convention is to start by port or starboard then put eitheir (bow,fore,midship,aft,stern) + +/area/rostock + name = "SSV Rostock" + icon = 'icons/turf/area_almayer.dmi' + // ambience = list('sound/ambience/shipambience.ogg') + icon_state = "almayer" + flags_area = AREA_NOTUNNEL +// requires_power = TRUE +// unlimited_power = TRUE + ceiling = CEILING_METAL + powernet_name = "rostock" + sound_environment = SOUND_ENVIRONMENT_ROOM + soundscape_interval = 30 + // soundscape_playlist = list('sound/effects/xylophone1.ogg', 'sound/effects/xylophone2.ogg', 'sound/effects/xylophone3.ogg') + ambience_exterior = AMBIENCE_ALMAYER + ceiling_muffle = FALSE + +// Upper Deck Misc +/area/rostock/upper_deck + fake_zlevel = 1 // upperdeck + +/area/rostock/upper_deck/hallway + name = "SSV Rostock - Upper Deck Midship Hallway" + icon_state = "stern" + +// Hanger Deck + +/area/rostock/hangar + fake_zlevel = 1 // upperdeck + +/area/rostock/hangar/hangarbay + name = "SSV Rostock - Hangar" + icon_state = "hangar" + soundscape_playlist = SCAPE_PL_HANGAR + soundscape_interval = 50 + +/area/rostock/hangar/pilotbunk + name = "SSV Rostock - Pilot Cryogenics" + icon_state = "livingspace" + +/area/rostock/hangar/repairbay + name = "SSV Rostock - Dropship Repair Bay" + icon_state = "dropshiprepair" + +// Medical Deck (Upper/Lower) + +/area/rostock/medical + +/area/rostock/medical/lobby + name = "SSV Rostock - Medbay Lobby" + icon_state = "medical" + fake_zlevel = 1 // upperdeck + soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC + soundscape_interval = 120 + +/area/rostock/medical/storage + name = "SSV Rostock - Deployment Storage" + icon_state = "medical" + fake_zlevel = 1 // upperdeck + soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC + soundscape_interval = 120 + +/area/rostock/medical/surgery + name = "SSV Rostock - Operating Theatre" + icon_state = "operating" + fake_zlevel = 1 // upperdeck + soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC + soundscape_interval = 120 + +/area/rostock/medical/chemistry + name = "SSV Rostock - Chemical Laboratory" + icon_state = "chemistry" + fake_zlevel = 1 // upperdeck + soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC + soundscape_interval = 120 + +/area/rostock/medical/accessway + name = "SSV Rostock - Rear Corridor" + icon_state = "medical" + fake_zlevel = 1 // upperdeck + soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC + soundscape_interval = 120 + +/area/rostock/medical/prep + name = "SSV Rostock - Medical Preperation Room" + icon_state = "medical" + fake_zlevel = 2 // lowerdeck + soundscape_playlist = SCAPE_PL_ELEVATOR_MUSIC + soundscape_interval = 120 + +/area/rostock/medical/morgue + name = "SSV Rostock - Morgue" + icon_state = "medical" + fake_zlevel = 2 // lowerdeck + +// Military Police Deck (Upper/Lower) + +/area/rostock/security + +/area/rostock/security/brig_accessway + name = "SSV Rostock - Brig Accessway" + icon_state = "brig" + fake_zlevel = 1 //upperdeck + +/area/rostock/security/brig_entryway + name = "SSV Rostock - Brig Observation Area" + icon_state = "brig" + fake_zlevel = 1 //upperdeck + +/area/rostock/security/brig_holding_area + name = "SSV Rostock - Prisoner Holding Area" + icon_state = "brigcells" + fake_zlevel = 1 //upperdeck + +/area/rostock/security/brig_office + name = "SSV Rostock - Brig Office" + icon_state = "brig" + fake_zlevel = 1 //upperdeck + +/area/rostock/security/headquarters_lobby + name = "SSV Rostock - Politsiya HQ Lobby" + icon_state = "brig" + fake_zlevel = 2 //upperdeck + +/area/rostock/security/headquarters_interrogation + name = "SSV Rostock - Interrogation Room" + icon_state = "brig" + fake_zlevel = 2 //upperdeck + +/area/rostock/security/headquarters_bunk + name = "SSV Rostock - Politsiya Bunks" + icon_state = "brig" + fake_zlevel = 2 //upperdeck + +/area/rostock/security/headquarters_storage + name = "SSV Rostock - Politsiya Equipment Storage" + icon_state = "brig" + fake_zlevel = 2 //upperdeck + +/area/rostock/security/headquarters_armory + name = "SSV Rostock - Politsiya Armory" + icon_state = "brig" + fake_zlevel = 2 //upperdeck + +// Vehicle Storage + +/area/rostock/vehiclehangar + name = "SSV Rostock - Vehicle Hangar" + icon_state = "exoarmor" + fake_zlevel = 2 //upperdeck + +// Engineering Deck + +/area/rostock/engineering + +/area/rostock/engineering/main_area + name = "SSV Rostock - Engineering" + icon_state = "upperengineering" + fake_zlevel = 1 //upperdeck + +/area/rostock/engineering/reactor + name = "SSV Rostock - Reactor Core" + icon_state = "upperengineering" + fake_zlevel = 1 //upperdeck + +/area/rostock/engineering/lower_aft_corridor + name = "SSV Rostock - Upper Aft Entrance Corridor" + icon_state = "upperengineering" + fake_zlevel = 1 //upperdeck + +/area/rostock/engineering/port_aft_accessway + name = "SSV Rostock - Port Aft Accessway" + icon_state = "upperengineering" + fake_zlevel = 1 //upperdeck + +/area/rostock/engineering/starboard_aft_accessway + name = "SSV Rostock - Starboard Aft Accessway" + icon_state = "upperengineering" + fake_zlevel = 1 //upperdeck + +// Upperdeck Maintenance + +/area/rostock/upperdeck_maint + fake_zlevel = 1 //upperdeck + +/area/rostock/upperdeck_maint/p_a + name = "SSV Rostock - Upper Port-Aft Maintenance" + icon_state = "upperhull" + +/area/rostock/upperdeck_maint/p_m + name = "SSV Rostock - Upper Port-Midship Maintenance" + icon_state = "upperhull" + +/area/rostock/upperdeck_maint/p_f + name = "SSV Rostock - Upper Port-Fore Maintenance" + icon_state = "upperhull" + +/area/rostock/upperdeck_maint/s_a + name = "SSV Rostock - Upper Starboard-Aft Maintenance" + icon_state = "upperhull" + +/area/rostock/upperdeck_maint/s_m + name = "SSV Rostock - Upper Starboard-Midship Maintenance" + icon_state = "upperhull" + +/area/rostock/upperdeck_maint/s_f + name = "SSV Rostock - Upper Starboard-Fore Maintenance" + icon_state = "upperhull" + +// ERT Docking Ports + +/area/rostock/ert_dock + +/area/rostock/ert_dock/port + name = "SSV Rostock - Port Emergency Docking" + icon_state = "starboardpd" + fake_zlevel = 1 // upperdeck + +/area/rostock/ert_dock/starboard + name = "SSV Rostock - Starboard Emergency Docking" + icon_state = "starboardpd" + fake_zlevel = 1 // upperdeck + +// Stairs +/area/rostock/stair_clone + name = "SSV Rostock - Lower Deck Stairs" + icon_state = "stairs_lowerdeck" + fake_zlevel = 2 // lowerdeck + resin_construction_allowed = FALSE + +/area/rostock/stair_clone/upper + name = "SSV Rostock - Upper Deck Stairs" + icon_state = "stairs_upperdeck" + fake_zlevel = 1 // upperdeck + +// Command + +/area/rostock/command + +/area/rostock/command/astronavigation + name = "SSV Rostock - Astronavigational Deck" + icon_state = "astronavigation" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/cic + name = "SSV Rostock - Combat Information Centre" + icon_state = "cic" + fake_zlevel = 2 // lowerdeck + soundscape_playlist = SCAPE_PL_CIC + soundscape_interval = 50 + flags_area = AREA_NOTUNNEL + +/area/rostock/command/armory + name = "SSV Rostock - Command Armory" + icon_state = "cic" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/hallway + name = "SSV Rostock - Command Hallway" + icon_state = "cic" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/dining + name = "SSV Rostock - Command Dining Hall" + icon_state = "cic" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/co + name = "SSV Rostock - Commanding Officer's Quarters" + icon_state = "officerrnr" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/xo + name = "SSV Rostock - Kapitan's Quarter's" + icon_state = "officerrnr" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/polcom + name = "SSV Rostock - Political Officer's Quarters" + icon_state = "officerrnr" + fake_zlevel = 2 // lowerdeck + +/area/rostock/command/so + name = "SSV Rostock - Staff Officer's Bunks" + icon_state = "officerrnr" + fake_zlevel = 2 // lowerdeck + +// Lower Deck Misc + +/area/rostock/lower_deck + fake_zlevel = 2 // lowerdeck + +/area/rostock/lower_deck/m_hallway + name = "SSV Rostock - Lower Deck Midship Hallway" + icon_state = "stern" + +/area/rostock/lower_deck/p_hallway + name = "SSV Rostock - Lower Deck Port Hallway" + icon_state = "port" + +/area/rostock/lower_deck/s_a_hallway + name = "SSV Rostock - Lower Deck Starboard-Aft Hallway" + icon_state = "starboard" + +/area/rostock/lower_deck/p_a_hallway + name = "SSV Rostock - Lower Deck Port-Aft Hallway" + icon_state = "port" + +/area/rostock/lower_deck/engineering_lower_access + name = "SSV Rostock - Lower Deck Engineering Starboard Aft Accessway" + icon_state = "port" + +/area/rostock/lower_deck/cryogenics + name = "SSV Rostock - Cryogenic Cells" + icon_state = "cryo" + +/area/rostock/lower_deck/prep + name = "SSV Rostock - Troop Preperation" + icon_state = "gruntrnr" + +/area/rostock/lower_deck/bunk + name = "SSV Rostock - Extended Mission Bunks" + icon_state = "gruntrnr" + +/area/rostock/lower_deck/kitchen + name = "SSV Rostock - Meal Hall" + icon_state = "gruntrnr" + +/area/rostock/lower_deck/bathroom + name = "SSV Rostock - Unisex Bathroom" + icon_state = "missionplanner" + +/area/rostock/lower_deck/ammunition_storage + name = "SSV Rostock - Heavy Ordinance Storage" + icon_state = "missionplanner" + +/area/rostock/lower_deck/briefing + name = "SSV Rostock - Briefing Hall" + icon_state = "briefing" + +/area/rostock/lower_deck/starboard_umbilical + name = "\improper Lower Deck Starboard Umbilical Hallway" + icon_state = "portumbilical" + +// Lower Deck Maintenance + +/area/rostock/lowerdeck_maint + fake_zlevel = 2 //lowerdeck + +/area/rostock/lowerdeck_maint/p_a + name = "SSV Rostock - Lower Port-Aft Maintenance" + icon_state = "lowerhull" + +/area/rostock/lowerdeck_maint/p_m + name = "SSV Rostock - Lower Port-Midship Maintenance" + icon_state = "lowerhull" + +/area/rostock/lowerdeck_maint/p_f + name = "SSV Rostock - Lower Port-Fore Maintenance" + icon_state = "lowerhull" + +/area/rostock/lowerdeck_maint/s_a + name = "SSV Rostock - Lower Starboard-Aft Maintenance" + icon_state = "lowerhull" + +/area/rostock/lowerdeck_maint/s_m + name = "SSV Rostock - Lower Starboard-Midship Maintenance" + icon_state = "lowerhull" + +/area/rostock/lowerdeck_maint/s_f + name = "SSV Rostock - Lower Starboard-Fore Maintenance" + icon_state = "lowerhull" + +// Railguns + +/area/rostock/railgun + name = "SSV Rostock - Port Railgun Control Room" + icon_state = "weaponroom" + +/area/rostock/railgun/starboard + name = "SSV Rostock - Starboard Railgun Control Room" + icon_state = "weaponroom" + +// AI Core - 1VAN/3 + +/area/rostock/airoom + name = "SSV Rostock - AI Core" + icon_state = "airoom" + fake_zlevel = 2 // lowerdeck + soundscape_playlist = SCAPE_PL_ARES + soundscape_interval = 120 + flags_area = AREA_NOTUNNEL|AREA_UNWEEDABLE + can_build_special = FALSE + is_resin_allowed = FALSE + resin_construction_allowed = FALSE + +// Requisitions Bay + +/area/rostock/req + name = "SSV Rostock - Requisitions" + icon_state = "req" + fake_zlevel = 2 // lowerdeck + +// Lifeboat + +/area/rostock/lifeboat + name = "SSV Rostock - Lifeboat Docking Port" + icon_state = "selfdestruct" + fake_zlevel = 2 // lowerdeck + diff --git a/code/game/gamemodes/cm_process.dm b/code/game/gamemodes/cm_process.dm index 1056e866744f..99a378e4de4b 100644 --- a/code/game/gamemodes/cm_process.dm +++ b/code/game/gamemodes/cm_process.dm @@ -1,5 +1,3 @@ - - /* Like with cm_initialize.dm, these procs exist to quickly populate classic CM game modes. Specifically for processing, announcing completion, and so on. Simply plug in these procs diff --git a/code/game/gamemodes/colonialmarines/colonialmarines.dm b/code/game/gamemodes/colonialmarines/colonialmarines.dm index e6fad5daedd1..43a69355c71e 100644 --- a/code/game/gamemodes/colonialmarines/colonialmarines.dm +++ b/code/game/gamemodes/colonialmarines/colonialmarines.dm @@ -594,26 +594,29 @@ GLOB.round_statistics.current_map.total_marine_majors++ if(MODE_INFESTATION_X_MINOR) var/list/living_player_list = count_humans_and_xenos(get_affected_zlevels()) + end_icon = "xeno_minor" if(living_player_list[1] && !living_player_list[2]) // If Xeno Minor but Xenos are dead and Humans are alive, see which faction is the last standing var/headcount = count_per_faction() var/living = headcount["total_headcount"] if ((headcount["WY_headcount"] / living) > MAJORITY) musical_track = pick('sound/theme/lastmanstanding_wy.ogg') + end_icon = "wy_major" log_game("3rd party victory: Weyland-Yutani") message_admins("3rd party victory: Weyland-Yutani") else if ((headcount["UPP_headcount"] / living) > MAJORITY) musical_track = pick('sound/theme/lastmanstanding_upp.ogg') + end_icon = "upp_major" log_game("3rd party victory: Union of Progressive Peoples") message_admins("3rd party victory: Union of Progressive Peoples") else if ((headcount["CLF_headcount"] / living) > MAJORITY) musical_track = pick('sound/theme/lastmanstanding_clf.ogg') + end_icon = "upp_major" log_game("3rd party victory: Colonial Liberation Front") message_admins("3rd party victory: Colonial Liberation Front") else if ((headcount["marine_headcount"] / living) > MAJORITY) musical_track = pick('sound/theme/neutral_melancholy2.ogg') //This is the theme song for Colonial Marines the game, fitting else musical_track = pick('sound/theme/neutral_melancholy1.ogg') - end_icon = "xeno_minor" if(GLOB.round_statistics && GLOB.round_statistics.current_map) GLOB.round_statistics.current_map.total_xeno_victories++ if(MODE_INFESTATION_M_MINOR) @@ -626,9 +629,12 @@ musical_track = 'sound/theme/neutral_hopeful2.ogg' if(GLOB.round_statistics && GLOB.round_statistics.current_map) GLOB.round_statistics.current_map.total_draws++ - var/sound/S = sound(musical_track, channel = SOUND_CHANNEL_LOBBY) - S.status = SOUND_STREAM - sound_to(world, S) + else + end_icon = "draw" + musical_track = 'sound/theme/neutral_hopeful2.ogg' + var/sound/theme = sound(musical_track, channel = SOUND_CHANNEL_LOBBY) + theme.status = SOUND_STREAM + sound_to(world, theme) if(GLOB.round_statistics) GLOB.round_statistics.game_mode = name GLOB.round_statistics.round_length = world.time diff --git a/code/game/gamemodes/extended/cm_vs_upp.dm b/code/game/gamemodes/extended/cm_vs_upp.dm index f6d22eea0a49..5e890010eef0 100644 --- a/code/game/gamemodes/extended/cm_vs_upp.dm +++ b/code/game/gamemodes/extended/cm_vs_upp.dm @@ -1,3 +1,6 @@ +/// How long to delay the round completion (command is immediately notified) +#define ROUND_END_DELAY (2 MINUTES) + /datum/game_mode/extended/faction_clash/cm_vs_upp name = "Faction Clash UPP CM" config_tag = "Faction Clash UPP CM" @@ -18,6 +21,12 @@ ) taskbar_icon = 'icons/taskbar/gml_hvh.png' + var/upp_ship = "ssv_rostock.dmm" + +/datum/game_mode/extended/faction_clash/cm_vs_upp/pre_setup() + . = ..() + GLOB.round_should_check_for_win = FALSE + /datum/game_mode/extended/faction_clash/cm_vs_upp/get_roles_list() return GLOB.ROLES_CM_VS_UPP @@ -26,10 +35,150 @@ . = ..() SSweather.force_weather_holder(/datum/weather_ss_map_holder/faction_clash) for(var/area/area in GLOB.all_areas) + if(is_mainship_level(area.z)) + continue area.base_lighting_alpha = 150 area.update_base_lighting() +/datum/game_mode/extended/faction_clash/cm_vs_upp/process() + if(--round_started > 0) + return FALSE //Initial countdown, just to be safe, so that everyone has a chance to spawn before we check anything. + . = ..() + if(!round_finished) + if(++round_checkwin >= 5) //Only check win conditions every 5 ticks. + if(GLOB.round_should_check_for_win) + check_win() + round_checkwin = 0 + + +/datum/game_mode/extended/faction_clash/cm_vs_upp/check_win() + if(SSticker.current_state != GAME_STATE_PLAYING) + return + + var/upp_left = 0 + var/uscm_left = 0 + var/loss_threshold = 5 + var/list/z_levels = SSmapping.levels_by_any_trait(list(ZTRAIT_GROUND)) + for(var/mob/mob in GLOB.player_list) + if(mob.z && (mob.z in z_levels) && mob.stat != DEAD && !istype(mob.loc, /turf/open/space)) + if(ishuman(mob) && !isyautja(mob) && !(mob.status_flags & XENO_HOST) && !iszombie(mob)) + var/mob/living/carbon/human/human = mob + if(!human.handcuffed && !human.resting) + if(human.faction == FACTION_UPP) + upp_left ++ + if(human.faction == FACTION_MARINE) + uscm_left ++ + if(upp_left >= loss_threshold && uscm_left >= loss_threshold) + return + + if(upp_left < loss_threshold || uscm_left < loss_threshold) + if(upp_left < loss_threshold) + round_finished = MODE_INFESTATION_M_MAJOR + else + round_finished = MODE_FACTION_CLASH_UPP_MAJOR + roundend_ceasefire() + + SSticker.roundend_check_paused = TRUE + addtimer(VARSET_CALLBACK(SSticker, roundend_check_paused, FALSE), ROUND_END_DELAY) + + +/datum/game_mode/extended/faction_clash/cm_vs_upp/check_finished() + if(round_finished) + return TRUE + +/datum/game_mode/extended/faction_clash/cm_vs_upp/proc/roundend_ceasefire() + set_gamemode_modifier(/datum/gamemode_modifier/ceasefire, enabled = TRUE) + switch(round_finished) + if(MODE_FACTION_CLASH_UPP_MAJOR) + marine_announcement("ALERT: USCM ground force overrun scenario in progress. Automated command directive issued, all USCM personnel are ordered to evacuate combat zone.\n\nOpposing Force have issued a ceasefire, risk of capture of USCM personnel by opposing force is high, avoid contact and evade capture.\n\nFinal report being prepared in two minutes.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Enemy force are combat inoperative, enemy force are conducting an evacuation of the operations zone.\n\nA ceasefire is in effect. Union forces are directed to attempt to capture fleeing enemy force personnel.\n\nFinal report being prepared in two minutes.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + if(MODE_FACTION_CLASH_UPP_MINOR) + marine_announcement("ALERT: USCM ground force overrun scenario in progress. Automated command directive issued, all USCM personnel are ordered to evacuate combat zone.\n\nOpposing Force have issued a ceasefire, risk of capture of USCM personnel by opposing force is high, avoid contact and evade capture.\n\nFinal report being prepared in two minutes.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Enemy force are combat inoperative, enemy force are conducting an evacuation of the operations zone.\n\nA ceasefire is in effect. Union forces are directed to attempt to capture fleeing enemy force personnel.\n\nFinal report being prepared in two minutes.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + if(MODE_INFESTATION_M_MAJOR) + marine_announcement("ALERT: Opposing force are conducting emergency evacuation of the operations zone. Confidence is high that opposing forces are retreating from the planet.\n\nCeasefire is in effect to minimise non-combatant casualties, ground forces are directed to intercept and detain retreating opposing forces\n\nFinal report being prepared in two minutes.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Unsustainable combat losses noted. Automated strategic reposition order is now in effect. All Union combat personnel are to return to dropships and re-deploy to the SSV Rostock.\n\nEnemy force have instituted a ceasefire, exploit this to assist in evading capture.\n\nFinal report being prepared in two minutes.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + if(MODE_INFESTATION_M_MINOR) + marine_announcement("ALERT: Opposing force are conducting emergency evacuation of the operations zone. Confidence is high that opposing forces are retreating from the planet.\n\nCeasefire is in effect to minimise non-combatant casualties, ground forces are directed to intercept and detain retreating opposing forces.\n\nFinal report being prepared in two minutes.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Unsustainable combat losses noted. Automated strategic reposition order is now in effect. All Union combat personnel are to return to dropships and re-deploy to the SSV Rostock.\n\nEnemy force have instituted a ceasefire, exploit this to assist in evading capture.\n\nFinal report being prepared in two minutes.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + if(MODE_BATTLEFIELD_DRAW_STALEMATE) + marine_announcement("ALERT: A ceasefire is now in effect. Further details pending. All combat operations are to cease. Further information pending in two minutes.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: A ceasefire is now in effect. Further details pending. All combat operations are to cease. Additional facts pending in two minutes.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + + +/datum/game_mode/extended/faction_clash/cm_vs_upp/declare_completion() + announce_ending() + var/musical_track + var/end_icon = "draw" + switch(round_finished) + if(MODE_FACTION_CLASH_UPP_MAJOR) + marine_announcement("ALERT: All ground forces killed in action or non-responsive. Landing zone overrun. Impossible to sustain combat operations.\n\nMission Abort Authorized! Commencing automatic vessel deorbit procedure from operations zone.\n\nSaving operational report to archive, commencing final systems scan.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Enemy landing zone status. Under Union Military Control. Enemy ground forces. Deceased and/or in Union Military custody.\n\nMission Accomplished! Dispatching subspace signal to Sector Command.\n\nConcluding operational report for dispatch, commencing final data entry and systems scan.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + musical_track = pick('sound/theme/lastmanstanding_upp.ogg') + end_icon = "upp_major" + if(MODE_FACTION_CLASH_UPP_MINOR) + marine_announcement("ALERT: All ground forces killed in action or non-responsive. Landing zone overrun. Impossible to sustain combat operations.\n\nMission Abort Authorized! Commencing automatic vessel deorbit procedure from operations zone.\n\nSaving operational report to archive, commencing final systems scan.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Enemy landing zone status. Under Union Military Control. Enemy ground forces. Deceased and/or in Union Military custody.\n\nMission Accomplished! Dispatching subspace signal to Sector Command.\n\nConcluding operational report for dispatch, commencing final data entry and systems scan.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + musical_track = pick('sound/theme/lastmanstanding_upp.ogg') + end_icon = "upp_minor" + if(MODE_INFESTATION_M_MAJOR) + marine_announcement("ALERT: Opposing Force landing zone under USCM force control. Orbital scans concludes all opposing force combat personnel are combat inoperative.\n\nMission Accomplished!\n\nSaving operational report to archive, commencing final systems.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Union landing zone compromised. Union ground forces are non-responsive. Further combat operations impossible.\n\nMission Abort Authorized\n\nConcluding operational report for dispatch, commencing final data entry and systems scan.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + musical_track = pick('sound/theme/winning_triumph1.ogg','sound/theme/winning_triumph2.ogg') + end_icon = "marine_major" + if(MODE_INFESTATION_M_MINOR) + marine_announcement("ALERT: Opposing Force landing zone under USCM force control. Orbital scans concludes all opposing force combat personnel are combat inoperative.\n\nMission Accomplished!\n\nSaving operational report to archive, commencing final systems scan.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Union landing zone compromised. Union ground forces are non-responsive. Further combat operations impossible.\n\nMission Abort Authorized\n\nConcluding operational report for dispatch, commencing final data entry and systems scan.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + musical_track = pick('sound/theme/neutral_hopeful1.ogg','sound/theme/neutral_hopeful2.ogg') + end_icon = "marine_minor" + if(MODE_BATTLEFIELD_DRAW_STALEMATE) + marine_announcement("ALERT: Inconclusive combat outcome. Unable to assess tactical or strategic situation.\n\nDispatching automated request to High Command for further directives.\n\nSaving operational report to archive, commencing final systems scan.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("ALERT: Battle situation has developed not necessarily to the Unions advantage\n\nDispatching request for new directives to Sector Command.\n\nConcluding operational report for dispatch, commencing final data entry and systems scan.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + end_icon = "draw" + musical_track = 'sound/theme/neutral_hopeful2.ogg' + else + end_icon = "draw" + musical_track = 'sound/theme/neutral_hopeful2.ogg' + var/sound/theme = sound(musical_track, channel = SOUND_CHANNEL_LOBBY) + theme.status = SOUND_STREAM + sound_to(world, theme) + + calculate_end_statistics() + show_end_statistics(end_icon) + + declare_completion_announce_fallen_soldiers() + declare_completion_announce_predators() + declare_completion_announce_medal_awards() + declare_fun_facts() + + return TRUE + +/datum/game_mode/extended/faction_clash/cm_vs_upp/ds_first_landed(obj/docking_port/stationary/marine_dropship) + if(round_started > 0) //we enter here on shipspawn but do not want this + return + .=..() + marine_announcement("First troops have landed on the colony! Five minute long ceasefire is in effect to allow evacuation of civilians.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("First troops have landed on the colony! Five minute long ceasefire is in effect to allow evacuation of civilians.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + set_gamemode_modifier(/datum/gamemode_modifier/ceasefire, enabled = TRUE) + addtimer(CALLBACK(src,PROC_REF(ceasefire_warning)), 4 MINUTES) + addtimer(CALLBACK(src,PROC_REF(ceasefire_end)), 5 MINUTES) + addtimer(VARSET_CALLBACK(GLOB, round_should_check_for_win, TRUE), 15 MINUTES) + +/datum/game_mode/extended/faction_clash/cm_vs_upp/proc/ceasefire_warning() + marine_announcement("Ceasefire ends in one minute.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("Ceasefire ends in one minute.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + +/datum/game_mode/extended/faction_clash/cm_vs_upp/proc/ceasefire_end() + marine_announcement("Ceasefire is over. Combat operations may commence.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) + marine_announcement("Ceasefire is over. Combat operations may commence.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + set_gamemode_modifier(/datum/gamemode_modifier/ceasefire, enabled = FALSE) + GLOB.round_should_check_for_win = TRUE + + + /datum/game_mode/extended/faction_clash/cm_vs_upp/announce() . = ..() marine_announcement("An automated distress call has been received from the local colony.\n\nAlert! Sensors have detected a Union of Progressive People's warship in orbit of colony. Enemy Vessel has refused automated hails and is entering lower-planetary orbit. High likelihood enemy vessel is preparing to deploy dropships to local colony. Authorization to interdict and repel hostile force from allied territory has been granted. Automated thawing of cryostasis marine reserves in progress.", "ARES 3.2", 'sound/AI/commandreport.ogg', FACTION_MARINE) marine_announcement("Alert! Sensors have detected encroaching USCM vessel on an intercept course with local colony.\n\nIntelligence suggests this is the [MAIN_SHIP_NAME]. Confidence is high that USCM force is acting counter to Union interests in this area. Authorization to deploy ground forces to disrupt foreign power attempt to encroach on Union interests has been granted. Emergency awakening of cryostasis troop reserves in progress.", "1VAN/3", 'sound/AI/commandreport.ogg', FACTION_UPP) + +#undef ROUND_END_DELAY diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 35ea20cb497e..191dd42f06a1 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -140,7 +140,7 @@ GLOBAL_VAR_INIT(cas_tracking_id_increment, 0) //this var used to assign unique t if(GLOB.round_statistics) GLOB.round_statistics.track_round_end() log_game("Round end result: [round_finished]") - to_chat_spaced(world, margin_top = 2, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDHEADER("|Round Complete|")) + to_chat_spaced(world, margin_top = 2, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDHEADER("|Round Complete:[round_finished]|")) to_chat_spaced(world, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDBODY("Thus ends the story of the brave men and women of the [MAIN_SHIP_NAME] and their struggle on [SSmapping.configs[GROUND_MAP].map_name].\nThe game-mode was: [GLOB.master_mode]!\n[CONFIG_GET(string/endofroundblurb)]")) /datum/game_mode/proc/declare_completion() diff --git a/code/game/gamemodes/round_modifiers.dm b/code/game/gamemodes/round_modifiers.dm index 86577142a211..683ca2bd008d 100644 --- a/code/game/gamemodes/round_modifiers.dm +++ b/code/game/gamemodes/round_modifiers.dm @@ -139,3 +139,7 @@ /datum/gamemode_modifier/no_body_c4 modifier_name = "No body c4" modifier_desc = "Prevents c4 explosives from being planted on dead body." + +/datum/gamemode_modifier/ceasefire + modifier_name = "Ceasefire" + modifier_desc = "Prevents firing guns and throwing granades." diff --git a/code/game/machinery/computer/dropship_weapons.dm b/code/game/machinery/computer/dropship_weapons.dm index 3aa6fff72b9a..2a7e60ba6a20 100644 --- a/code/game/machinery/computer/dropship_weapons.dm +++ b/code/game/machinery/computer/dropship_weapons.dm @@ -666,6 +666,9 @@ if(!human_operator.allow_gun_usage) to_chat(human_operator, SPAN_WARNING("Your programming prevents you from operating dropship weaponry!")) return FALSE + if(MODE_HAS_MODIFIER(/datum/gamemode_modifier/ceasefire)) + to_chat(human_operator, SPAN_WARNING("You will not break the ceasefire by doing that!")) + return FALSE var/obj/structure/dropship_equipment/weapon/DEW = selected_equipment if(!selected_equipment || !selected_equipment.is_weapon) to_chat(weapon_operator, SPAN_WARNING("No weapon selected.")) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index c3879e707cef..eecf2ddb53ba 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -1080,3 +1080,133 @@ glass = FALSE req_access = null req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + +// ------ UPP Ship Doors ------ // +// --- UPP Generic Door --- // + +/obj/structure/machinery/door/airlock/upp + openspeed = 4 + +/obj/structure/machinery/door/airlock/upp/generic + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_greendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_access = list(ACCESS_UPP_GENERAL) + +/obj/structure/machinery/door/airlock/upp/generic/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/upp/generic/solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_greendoor.dmi' + opacity = TRUE + glass = FALSE + +/obj/structure/machinery/door/airlock/upp/generic/solid/autoname + autoname = TRUE + +// --- UPP Medical Door --- // + +/obj/structure/machinery/door/airlock/upp/medical + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_medigreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_MEDICAL, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/upp/medical/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/upp/medical/solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_medigreendoor.dmi' + opacity = TRUE + glass = FALSE + +/obj/structure/machinery/door/airlock/upp/medical/solid/autoname + autoname = TRUE + +// --- UPP Requisitions Door --- // + +/obj/structure/machinery/door/airlock/upp/req + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_reqgreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_ENGINEERING, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/upp/req/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/upp/req/solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_reqgreendoor.dmi' + opacity = TRUE + glass = FALSE + +/obj/structure/machinery/door/airlock/upp/req/solid/autoname + autoname = TRUE + +// --- UPP Security Door --- // + +/obj/structure/machinery/door/airlock/upp/sec + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_secgreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_SECURITY, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/upp/sec/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/upp/sec/solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_secgreendoor.dmi' + opacity = TRUE + glass = FALSE + +/obj/structure/machinery/door/airlock/upp/sec/solid/autoname + autoname = TRUE + +// --- UPP Engineering Door --- // + +/obj/structure/machinery/door/airlock/upp/engi + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_engigreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_ENGINEERING, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/upp/engi/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/upp/engi/solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_engigreendoor.dmi' + opacity = TRUE + glass = FALSE + +/obj/structure/machinery/door/airlock/upp/engi/solid/autoname + autoname = TRUE + +// --- UPP Command Door --- // + +/obj/structure/machinery/door/airlock/upp/cic + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_commandgreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_access = list(ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/upp/cic/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/upp/cic/solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_commandgreendoor.dmi' + opacity = TRUE + glass = FALSE + +/obj/structure/machinery/door/airlock/upp/cic/solid/autoname + autoname = TRUE diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index f4c32a83566a..19335938fadf 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -785,3 +785,142 @@ autoname = TRUE opacity = TRUE glass = FALSE + +// ------ UPP Multi Ship Doors ------ // +// --- UPP Generic Door --- // + +/obj/structure/machinery/door/airlock/multi_tile/upp + openspeed = 4 + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1greendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_access = list(ACCESS_UPP_GENERAL) + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1greendoor.dmi' + opacity = TRUE + glass = FALSE + req_access = list(ACCESS_UPP_GENERAL) + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic_solid/autoname + autoname = TRUE + +// --- UPP Generic Door --- // + +/obj/structure/machinery/door/airlock/multi_tile/upp + openspeed = 4 + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1greendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_access = list(ACCESS_UPP_GENERAL) + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1greendoor.dmi' + opacity = TRUE + glass = FALSE + req_access = list(ACCESS_UPP_GENERAL) + +/obj/structure/machinery/door/airlock/multi_tile/upp/generic_solid/autoname + autoname = TRUE + +// --- UPP Medical Door --- // + +/obj/structure/machinery/door/airlock/multi_tile/upp/medical + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1medigreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_MEDICAL, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/medical/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/multi_tile/upp/medical_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1medigreendoor.dmi' + opacity = TRUE + glass = FALSE + req_one_access = list(ACCESS_UPP_MEDICAL, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/medical_solid/autoname + autoname = TRUE + +// --- UPP Requisition Door --- // + +/obj/structure/machinery/door/airlock/multi_tile/upp/req + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1reqgreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_ENGINEERING, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/req/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/multi_tile/upp/req_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1reqgreendoor.dmi' + opacity = TRUE + glass = FALSE + req_one_access = list(ACCESS_UPP_ENGINEERING, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/req_solid/autoname + autoname = TRUE + +// --- UPP Security Door --- // + +/obj/structure/machinery/door/airlock/multi_tile/upp/sec + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1secgreendoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_SECURITY, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/sec/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/multi_tile/upp/sec_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1secgreendoor.dmi' + opacity = TRUE + glass = FALSE + req_one_access = list(ACCESS_UPP_SECURITY, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/sec_solid/autoname + autoname = TRUE + +// --- UPP Engineering Door --- // + +/obj/structure/machinery/door/airlock/multi_tile/upp/eng + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1engdoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_UPP_ENGINEERING, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/eng/autoname + autoname = TRUE + +/obj/structure/machinery/door/airlock/multi_tile/upp/eng_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/upp/upp_2x1enggreendoor.dmi' + opacity = TRUE + glass = FALSE + req_one_access = list(ACCESS_UPP_ENGINEERING, ACCESS_UPP_LEADERSHIP) + +/obj/structure/machinery/door/airlock/multi_tile/upp/eng_solid/autoname + autoname = TRUE diff --git a/code/game/machinery/doors/railing.dm b/code/game/machinery/doors/railing.dm index 899d7e0646c5..5e34ae6997ef 100644 --- a/code/game/machinery/doors/railing.dm +++ b/code/game/machinery/doors/railing.dm @@ -77,3 +77,6 @@ /obj/structure/machinery/door/poddoor/railing/open density = FALSE + +/obj/structure/machinery/door/poddoor/railing/upp + id = "supply_elevator_railing_upp" diff --git a/code/game/machinery/fusion_engine.dm b/code/game/machinery/fusion_engine.dm index 9398d33914a5..5e9680a4c930 100644 --- a/code/game/machinery/fusion_engine.dm +++ b/code/game/machinery/fusion_engine.dm @@ -22,6 +22,8 @@ ///Whether the reactor is on the ship var/is_ship_reactor = FALSE + ///Whether the reactor is guaranteed to be fully repaired + var/is_reserved_level = FALSE ///If the generator is overloaded var/overloaded = FALSE //Only possible during hijack once fuel is at 100% @@ -63,6 +65,9 @@ if(6) //16% buildstate = BUILDSTATE_DAMAGE_WRENCH + if(!buildstate && is_reserved_level(z)) + buildstate = BUILDSTATE_FUNCTIONAL + if(require_fusion_cell) //Set up fuel cell if needed fusion_cell = new /obj/item/fuel_cell/used(src) fusion_cell.fuel_amount = fusion_cell.max_fuel_amount @@ -472,6 +477,11 @@ power_generation_max = 100000 //100,000W at full capacity original_fail_rate = 10 +/obj/structure/machinery/power/reactor/rostock + name = "\improper RDS-168 fusion reactor" + desc = "A RDS-168 Fusion Reactor." + + #undef BUILDSTATE_FUNCTIONAL #undef BUILDSTATE_DAMAGE_WELD #undef BUILDSTATE_DAMAGE_WIRE diff --git a/code/game/machinery/gear.dm b/code/game/machinery/gear.dm index c7b06bd21c6f..4d7a6b4cb7fa 100644 --- a/code/game/machinery/gear.dm +++ b/code/game/machinery/gear.dm @@ -15,6 +15,9 @@ /obj/structure/machinery/gear/proc/stop_moving() icon_state = "gear" +/obj/structure/machinery/gear/upp + id = "supply_elevator_railing_upp" + /obj/structure/machinery/elevator_strut name = "\improper strut" icon = 'icons/turf/elevator_strut.dmi' @@ -33,3 +36,4 @@ /obj/structure/machinery/elevator_strut/bottom icon_state = "strut_bottom" + diff --git a/code/game/machinery/vending/vendor_types/antag/antag_clothing.dm b/code/game/machinery/vending/vendor_types/antag/antag_clothing.dm index e847245fae45..135354d247b6 100644 --- a/code/game/machinery/vending/vendor_types/antag/antag_clothing.dm +++ b/code/game/machinery/vending/vendor_types/antag/antag_clothing.dm @@ -40,6 +40,11 @@ products_sets = listed_products[/datum/equipment_preset/clf] return products_sets +/obj/structure/machinery/cm_vending/clothing/antag/upp + name = "\improper Automated Equipment Rack" + icon_state = "upp_clothing" + req_access = list(ACCESS_UPP_GENERAL) + //--------------RANDOM EQUIPMENT AND GEAR------------------------ /obj/effect/essentials_set/random/clf_shoes diff --git a/code/game/machinery/vending/vendor_types/medical.dm b/code/game/machinery/vending/vendor_types/medical.dm index c052d8b0d8f0..11267e047c52 100644 --- a/code/game/machinery/vending/vendor_types/medical.dm +++ b/code/game/machinery/vending/vendor_types/medical.dm @@ -678,6 +678,13 @@ vendor_theme = VENDOR_THEME_CLF allow_supply_link_restock = FALSE +/obj/structure/machinery/cm_vending/sorted/medical/upp + name = "\improper Medical Equipment Vendor" + desc = "A vending machine dispensing various pieces of medical equipment." + req_one_access = list(ACCESS_UPP_GENERAL) + req_access = null + vendor_theme = VENDOR_THEME_UPP + /obj/structure/machinery/cm_vending/sorted/medical/marinemed name = "\improper ColMarTech MarineMed" desc = "Medical pharmaceutical dispenser with basic medical supplies for marines." @@ -715,6 +722,13 @@ vendor_theme = VENDOR_THEME_CLF allow_supply_link_restock = FALSE +/obj/structure/machinery/cm_vending/sorted/medical/marinemed/upp + name = "\improper Basic Medical Supplies Vendor" + desc = "A vending machine dispensing basic medical supplies." + req_one_access = list(ACCESS_UPP_GENERAL) + req_access = null + vendor_theme = VENDOR_THEME_UPP + /obj/structure/machinery/cm_vending/sorted/medical/blood name = "\improper MM Blood Dispenser" desc = "The MarineMed brand blood dispensary is the premier, top-of-the-line blood dispenser of 2105! Get yours today!" //Don't update this year, the joke is it's old. @@ -748,6 +762,11 @@ vendor_theme = VENDOR_THEME_CLF allow_supply_link_restock = FALSE +/obj/structure/machinery/cm_vending/sorted/medical/blood/upp + req_one_access = list(ACCESS_UPP_GENERAL) + req_access = null + vendor_theme = VENDOR_THEME_UPP + //------------WALL MED VENDORS------------ diff --git a/code/game/objects/effects/decals/heavy_cable_decal.dm b/code/game/objects/effects/decals/heavy_cable_decal.dm new file mode 100644 index 000000000000..d803d749431f --- /dev/null +++ b/code/game/objects/effects/decals/heavy_cable_decal.dm @@ -0,0 +1,39 @@ +/// Hybrisa Decals + +/obj/effect/decal/heavy_cable + name = "large power cable" + desc = "This cable is tough. It cannot be cut with simple hand tools." + icon = 'icons/obj/pipes/power_cond_heavy.dmi' + icon_state = "node" + layer = BELOW_ATMOS_PIPE_LAYER +// plane = FLOOR_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/effect/decal/heavy_cable/node_north + icon_state = "0-1" +/obj/effect/decal/heavy_cable/node_south + icon_state = "0-2" +/obj/effect/decal/heavy_cable/node_east + icon_state = "0-4" +/obj/effect/decal/heavy_cable/node_west + icon_state = "0-8" +/obj/effect/decal/heavy_cable/cable_horizontal + icon_state = "1-2" +/obj/effect/decal/heavy_cable/cable_vertical + icon_state = "4-8" +/obj/effect/decal/heavy_cable/node_n_e + icon_state = "1-4" +/obj/effect/decal/heavy_cable/node_n_w + icon_state = "1-8" +/obj/effect/decal/heavy_cable/node_s_e + icon_state = "2-4" +/obj/effect/decal/heavy_cable/node_s_w + icon_state = "2-8" +/obj/effect/decal/heavy_cable/node_n_e_s + icon_state = "1-2-4" +/obj/effect/decal/heavy_cable/node_n_w_e + icon_state = "1-4-8" +/obj/effect/decal/heavy_cable/node_s_w_e + icon_state = "1-2-8" +/obj/effect/decal/heavy_cable/node_n_s_e_w + icon_state = "1-2-4-8" diff --git a/code/game/objects/items/explosives/grenades/grenade.dm b/code/game/objects/items/explosives/grenades/grenade.dm index f157d7f8d931..19e7b9803a0e 100644 --- a/code/game/objects/items/explosives/grenades/grenade.dm +++ b/code/game/objects/items/explosives/grenades/grenade.dm @@ -43,6 +43,9 @@ if(harmful && ishuman(user) && !user.allow_gun_usage) to_chat(user, SPAN_WARNING("Your programming prevents you from using this!")) return FALSE + if(harmful && ishuman(user) && MODE_HAS_MODIFIER(/datum/gamemode_modifier/ceasefire)) + to_chat(user, SPAN_WARNING("You will not break the ceasefire by doing that!")) + return FALSE return TRUE diff --git a/code/game/objects/items/explosives/grenades/marines.dm b/code/game/objects/items/explosives/grenades/marines.dm index d5c3f2b6a4e1..c4af1f166bdc 100644 --- a/code/game/objects/items/explosives/grenades/marines.dm +++ b/code/game/objects/items/explosives/grenades/marines.dm @@ -521,6 +521,9 @@ if(!human.allow_gun_usage) to_chat(user, SPAN_WARNING("Your programming prevents you from using this!")) return + if(MODE_HAS_MODIFIER(/datum/gamemode_modifier/ceasefire)) + to_chat(user, SPAN_WARNING("You will not break the ceasefire by doing that!")) + return if(user_turf && (user_turf.density || locate(/obj/structure/fence) in user_turf)) to_chat(user, SPAN_WARNING("You can't plant a mine here.")) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index b1645fbc83d3..9755732284b9 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -1052,6 +1052,52 @@ basestate = "paddedsec_rwindow" window_frame = /obj/structure/window_frame/corsat/security +//UPP windows + +/obj/structure/window/framed/upp_ship + name = "window" + icon = 'icons/turf/walls/upp_windows.dmi' + icon_state = "uppwall_window0" + basestate = "uppwall_window" + desc = "A glass window inside a wall frame." + health = 40 + window_frame = /obj/structure/window_frame/upp_ship + +/obj/structure/window/framed/upp_ship/reinforced + name = "reinforced window" + desc = "A glass window. Light refracts incorrectly when looking through. It looks rather strong. Might take a few good hits to shatter it." + health = 100 + reinf = 1 + window_frame = /obj/structure/window_frame/upp_ship/reinforced + +/obj/structure/window/framed/upp_ship/hull + desc = "A glass window. Something tells you this one is somehow indestructible." +// icon_state = "upp_rwindow0" + +//UPP almayer retexture windows + +/obj/structure/window/framed/upp + name = "window" + icon = 'icons/turf/walls/upp_almayer_windows.dmi' + icon_state = "upp_window0" + basestate = "upp_window" + desc = "A glass window inside a wall frame." + health = 40 + window_frame = /obj/structure/window_frame/upp + +/obj/structure/window/framed/upp/reinforced + name = "reinforced window" + icon_state = "upp_rwindow0" + basestate = "upp_rwindow" + desc = "A glass window. Light refracts incorrectly when looking through. It looks rather strong. Might take a few good hits to shatter it." + health = 100 + reinf = 1 + window_frame = /obj/structure/window_frame/upp/reinforced + +/obj/structure/window/framed/upp/hull + desc = "A glass window. Something tells you this one is somehow indestructible." +// icon_state = "upp_rwindow0" + // Hybrisa Windows diff --git a/code/game/objects/structures/window_frame.dm b/code/game/objects/structures/window_frame.dm index 42570941dc82..c9be6a2bba9b 100644 --- a/code/game/objects/structures/window_frame.dm +++ b/code/game/objects/structures/window_frame.dm @@ -316,6 +316,37 @@ /obj/structure/window_frame/corsat/security window_type = /obj/structure/window/framed/corsat/security +//upp frames + +/obj/structure/window_frame/upp_ship + icon = 'icons/turf/walls/upp_windows.dmi' + icon_state = "uppwall_window0_frame" + basestate = "uppwall_window" + +/obj/structure/window_frame/upp_ship/reinforced + reinforced = TRUE + +/obj/structure/window_frame/upp_ship/hull + unslashable = TRUE + unacidable = TRUE + +//upp almayer retexture frames + +/obj/structure/window_frame/upp + icon = 'icons/turf/walls/upp_almayer_windows.dmi' + icon_state = "upp_window0_frame" + basestate = "upp_window0" + +/obj/structure/window_frame/upp/reinforced + icon_state = "upp_window0_frame" + basestate = "upp_rwindow0" + reinforced = TRUE + +/obj/structure/window_frame/upp/hull + icon_state = "upp_window0_frame" + basestate = "upp_rwindow0" + unslashable = TRUE + unacidable = TRUE // Hybrisa Window Frames diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 789bbd12d56c..96377dd28319 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -28,6 +28,8 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) /area/supply/station/upp name = "Supply Shuttle UPP" + + /area/supply/dock name = "Supply Shuttle" icon_state = "shuttle3" diff --git a/code/game/supplyshuttle_upp.dm b/code/game/supplyshuttle_upp.dm index 863473ed4d69..bfee10975100 100644 --- a/code/game/supplyshuttle_upp.dm +++ b/code/game/supplyshuttle_upp.dm @@ -21,6 +21,16 @@ GLOBAL_DATUM_INIT(supply_controller_upp, /datum/controller/supply/upp, new()) /obj/item/paper/manifest/upp name = "UPP Supply Manifest" +/obj/structure/machinery/computer/supply/asrs/upp/attack_hand(mob/user as mob) //does not return when on non alamyer z level + if(!allowed(user)) + to_chat(user, SPAN_DANGER("Access Denied.")) + return + + if(..()) + return + + tgui_interact(user) + /obj/item/paper/manifest/upp/generate_contents() info = " \