diff --git a/.github/wiki/HOW_ADD_STATION.md b/.github/wiki/HOW_ADD_STATION.md index a6405fc35c3a..82f91a33e27a 100644 --- a/.github/wiki/HOW_ADD_STATION.md +++ b/.github/wiki/HOW_ADD_STATION.md @@ -119,6 +119,8 @@ endmap `ZTRAIT_SPACE_RUINS` на этом слое будут генерироваться космические структуры +`ZTRAIT_INDECONSTRUCTABLE_PLATING` на этом слое невозможно будет разобрать пол с помощью рцд и сварки + `ZTRAIT_LINKAGE` определяет как будет происходить переход между слоями при подходе к краю карты, имеется возможных вариантов. * UNAFFECTED / null - перехода нет, вы упрётесь в край карты * SELFLOOPING / "Self" - при подходе к краю карты вы окажитесь на том же слое, но с другой стороны. Слой будет "зацикливаться" diff --git a/code/__DEFINES/gamemodes.dm b/code/__DEFINES/gamemodes.dm index 57717103d4bb..26497f920025 100644 --- a/code/__DEFINES/gamemodes.dm +++ b/code/__DEFINES/gamemodes.dm @@ -23,6 +23,7 @@ #define F_SPIDERCLAN "Spider Clan" #define F_WIZFEDERATION "Wizard Federation" #define F_XENOMORPH_HIVE "Alien Hivemind" +#define F_XENOMORPH "Alien" #define F_ZOMBIES "Zobmies" #define F_REPLICATORS "Replicators" @@ -64,6 +65,7 @@ #define WIZARD "Wizard" #define WIZ_APPRENTICE "Wizard Apprentice" #define XENOMORPH "Xenomorph" +#define LONE_XENOMORPH "Lone Xenomorph" #define REPLICATOR "Replicator" #define PIRATE "Pirate" #define PRISONER "Prisoner" diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index c58bd1878cc8..82bfa379288f 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -38,6 +38,8 @@ #define isxenohunter(A) (istype(A, /mob/living/carbon/xenomorph/humanoid/hunter)) +#define isxenolonehunter(A) (istype(A, /mob/living/carbon/xenomorph/humanoid/hunter/lone)) + #define isxenoadult(A) (istype(A, /mob/living/carbon/xenomorph/humanoid)) #define isxenolarva(A) (istype(A, /mob/living/carbon/xenomorph/larva)) @@ -225,7 +227,7 @@ #define iszombie(H) (H.get_species() in global.all_zombie_species_names) -#define isalien(H) isrole(XENOMORPH, H) +#define isalien(H) (isrole(XENOMORPH, H) || isrole(LONE_XENOMORPH, H)) #define isgangster(H) isrole(GANGSTER, H) diff --git a/code/__DEFINES/map_modules.dm b/code/__DEFINES/map_modules.dm index 8a36b0498c97..e9dc8e043257 100644 --- a/code/__DEFINES/map_modules.dm +++ b/code/__DEFINES/map_modules.dm @@ -14,3 +14,6 @@ #define FORTS_ROLE_COMMANDER "Commander" #define FORTS_ROLES list(FORTS_ROLE_MEMBER, FORTS_ROLE_MEDIC, FORTS_ROLE_ARTILLERYMAN, FORTS_ROLE_ENGINEER, FORTS_ROLE_OFFICER, FORTS_ROLE_COMMANDER) + + +#define MAP_MODULE_ALIEN "Alien" diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index f3e941066d87..dab4ffc458d9 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -12,6 +12,7 @@ #define ZTRAIT_RESERVED "Transit/Reserved" #define ZTRAIT_AWAY "Away Mission" #define ZTRAIT_SPACE_RUINS "Space Ruins" +#define ZTRAIT_INDECONSTRUCTABLE_PLATING "Indeconstructable plating" #define ZTRAIT_LAVA_RUINS "Lava Ruins" #define ZTRAIT_JUNKYARD "Junkyard" #define ZTRAIT_SNOWSTORM "Snowstorm" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 0dfee4494782..bf17ecd96762 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -343,6 +343,7 @@ /turf/simulated/wall/purple, \ /turf/simulated/wall/green, \ /turf/simulated/wall/beige, \ + /turf/simulated/wall/nostromo, \ /turf/simulated/wall/r_wall, \ /turf/simulated/wall/r_wall/yellow, \ /turf/simulated/wall/r_wall/red, \ diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 1fde524345ab..4b3240968257 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -15,6 +15,8 @@ #define STATUS_EFFECT_SWARMS_GIFT /datum/status_effect/swarm_gift +#define STATUS_EFFECT_ALIEN_ADRENALINE /datum/status_effect/alien_adrenaline +#define STATUS_EFFECT_ALIEN_REGENERATION /datum/status_effect/alien_regeneration #define STATUS_EFFECT_ALERTNESS /datum/status_effect/alertness ///////////// @@ -31,12 +33,16 @@ #define STATUS_EFFECT_CLUMSY /datum/status_effect/clumsy +#define STATUS_EFFECT_SLOWDOWN /datum/status_effect/slowdown + ///////////// // NEUTRAL // ///////////// #define STATUS_EFFECT_ARRAY_TURN_BACK /datum/status_effect/array_turn_back +#define STATUS_EFFECT_ALIEN_HUNT /datum/status_effect/alien_hunt + // Stasis helpers #define IS_IN_STASIS(mob) (mob.has_status_effect(STATUS_EFFECT_STASIS_BAG)) diff --git a/code/__DEFINES/xenomorph.dm b/code/__DEFINES/xenomorph.dm index d0bb121baf90..7532ddac48a3 100644 --- a/code/__DEFINES/xenomorph.dm +++ b/code/__DEFINES/xenomorph.dm @@ -11,6 +11,7 @@ #define ALIEN_DRONE "Трутни" #define ALIEN_SENTINEL "Стражи" #define ALIEN_HUNTER "Охотники" +#define ALIEN_LONE_HUNTER "Одинокий охотник" #define ALIEN_LARVA "Грудоломы" #define ALIEN_FACEHUGGER "Лицехваты" #define ALIEN_MAID "Горничные" diff --git a/code/_globalvars/lists/mob.dm b/code/_globalvars/lists/mob.dm index d3a0291dd300..df9087196b70 100644 --- a/code/_globalvars/lists/mob.dm +++ b/code/_globalvars/lists/mob.dm @@ -28,6 +28,7 @@ var/global/list/alien_list = list( ALIEN_DRONE = list(), ALIEN_SENTINEL = list(), ALIEN_HUNTER = list(), + ALIEN_LONE_HUNTER = list(), ALIEN_LARVA = list(), ALIEN_FACEHUGGER = list(), ALIEN_MAID = list() diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index d91db387f411..0d4d858a6718 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -44,20 +44,24 @@ var/global/bridge_secret = null var/fps = 20 var/list/resource_urls = null var/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. - var/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. + var/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. var/list/mode_names = list() var/list/config_name_by_real = list() var/list/probabilities = list() // relative probability of each mode var/humans_need_surnames = 0 var/allow_random_events = 1 // enables random events mid-round when set to 1 - var/alt_lobby_menu = 0 // event lobby + var/disable_station_announce = 0 // disables announcements mentioning the station + var/alt_lobby_menu = 0 // event lobby + var/event_cryopod_latejoin = 0 // event cryopod latejoin spawn + var/allow_loadout = 1 // allow loadout + var/allow_qualities = 1 // allow qualities var/allow_ai = 1 // allow ai job var/hostedby = null var/respawn = 1 var/usewhitelist = 0 var/mods_are_mentors = 0 var/kick_inactive = 0 //force disconnect for inactive players - var/afk_time_bracket = 6000 // 10 minutes + var/afk_time_bracket = 6000 // 10 minutes var/load_jobs_from_txt = 0 var/automute_on = 0 //enables automuting/spam prevention diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index afaaf5e2a345..16d44c13f707 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -511,26 +511,27 @@ SUBSYSTEM_DEF(job) new /obj/item/weapon/storage/fancy/heart_box(BACKP) //Give custom items - give_custom_items(H, job) + if(config.allow_loadout) + give_custom_items(H, job) - //Deferred item spawning. - for(var/thing in spawn_in_storage) - var/datum/gear/G = gear_datums[thing] - var/metadata = H.client.prefs.gear[G.display_name] - var/item = G.spawn_item(null, metadata) + //Deferred item spawning. + for(var/thing in spawn_in_storage) + var/datum/gear/G = gear_datums[thing] + var/metadata = H.client.prefs.gear[G.display_name] + var/item = G.spawn_item(null, metadata) - var/atom/placed_in = H.equip_or_collect(item) - if(placed_in) - to_chat(H, "Placing \the [item] in your [placed_in.name]!") - continue - if(H.equip_to_appropriate_slot(item)) - to_chat(H, "Placing \the [item] in your inventory!") - continue - if(H.put_in_hands(item)) - to_chat(H, "Placing \the [item] in your hands!") - continue - to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug.") - qdel(item) + var/atom/placed_in = H.equip_or_collect(item) + if(placed_in) + to_chat(H, "Placing \the [item] in your [placed_in.name]!") + continue + if(H.equip_to_appropriate_slot(item)) + to_chat(H, "Placing \the [item] in your inventory!") + continue + if(H.put_in_hands(item)) + to_chat(H, "Placing \the [item] in your hands!") + continue + to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug.") + qdel(item) to_chat(H, "You are the [alt_title ? alt_title : rank].") to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.") diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 9ce84eaaf65c..7df5310848f8 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -37,12 +37,12 @@ SUBSYSTEM_DEF(mapping) system_name = config.system_name system_name = config.system_name_ru - if(config.map_module) - load_map_module(config.map_module) - loadWorld() renameAreas() + if(config.map_module) + load_map_module(config.map_module) + process_teleport_locs() //Sets up the wizard teleport locations process_ghost_teleport_locs() //Sets up ghost teleport locations. @@ -65,7 +65,10 @@ SUBSYSTEM_DEF(mapping) if(!loaded_map_module) CRASH("Can't setup global event \"[module_name]\"!") -/datum/controller/subsystem/mapping/proc/get_map_module(module_name) +/datum/controller/subsystem/mapping/proc/get_map_module() + return loaded_map_module + +/datum/controller/subsystem/mapping/proc/get_map_module_by_name(module_name) if(loaded_map_module && loaded_map_module.name == module_name) return loaded_map_module diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index ef634507afb3..df4c60716cde 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -300,8 +300,9 @@ SUBSYSTEM_DEF(ticker) world.log << "Game start took [(world.timeofday - init_start)/10]s" to_chat(world, "Приятной игры!") - for(var/mob/M as anything in player_list) - M.playsound_local(null, 'sound/AI/enjoyyourstay.ogg', VOL_EFFECTS_VOICE_ANNOUNCEMENT, vary = FALSE, frequency = null, ignore_environment = TRUE) + if(!config.disable_station_announce) + for(var/mob/M as anything in player_list) + M.playsound_local(null, 'sound/AI/enjoyyourstay.ogg', VOL_EFFECTS_VOICE_ANNOUNCEMENT, vary = FALSE, frequency = null, ignore_environment = TRUE) if(length(SSholiday.holidays)) to_chat(world, "и...") @@ -374,7 +375,8 @@ SUBSYSTEM_DEF(ticker) if(M.stat != DEAD) //Just you wait for real destruction! var/turf/T = get_turf(M) if(T && is_station_level(T.z)) - M.death(0) //No mercy + if(T.explosive_resistance != INFINITY) + M.death(0) if(1) //nuke was nearby but (mostly) missed if(override == "nuclear emergency") diff --git a/code/datums/announcements/_announcements.dm b/code/datums/announcements/_announcements.dm index a08d7b3a9846..d9b45cc55aaa 100644 --- a/code/datums/announcements/_announcements.dm +++ b/code/datums/announcements/_announcements.dm @@ -18,7 +18,7 @@ var/global/list/announcement_sounds = list( "admin_war_pipisky" = 'sound/AI/_admin_war_pipisky.ogg', "admin_war_pizdec" = 'sound/AI/_admin_war_pizdec.ogg', "admin_war_tishina" = 'sound/AI/_admin_war_tishina.ogg', - + "commandreport" = 'sound/AI/commandreport.ogg', "announce" = 'sound/AI/announce.ogg', "aiannounce" = 'sound/AI/aiannounce.ogg', @@ -158,6 +158,8 @@ var/global/list/announcement_sounds = list( return /datum/announcement/proc/play() + if(config.disable_station_announce) + return var/announce_text var/announce_sound diff --git a/code/datums/emotes/generic/audible.dm b/code/datums/emotes/generic/audible.dm index 91c850009012..d8a5a0105981 100644 --- a/code/datums/emotes/generic/audible.dm +++ b/code/datums/emotes/generic/audible.dm @@ -122,3 +122,35 @@ /datum/emote/cough/get_impaired_msg(mob/user) return "moves [P_THEIR(user)] face forward as [P_THEY(user)] open and close [P_THEIR(user)] mouth!" + +/datum/emote/cat/hiss + key = "hiss" + + message_1p = "You hiss." + message_3p = "hiss." + + message_muzzled = "shakes violently and makes a loud noise." + + message_type = SHOWMSG_AUDIO + + sound = 'sound/voice/mob/cat_hiss.ogg' + + state_checks = list( + EMOTE_STATE(is_stat, CONSCIOUS), + ) + +/datum/emote/cat/growl + key = "growl" + + message_1p = "You growl." + message_3p = "growls." + + message_muzzled = "shakes violently and makes a loud noise." + + message_type = SHOWMSG_AUDIO + + sound = 'sound/voice/mob/cat_growl.ogg' + + state_checks = list( + EMOTE_STATE(is_stat, CONSCIOUS), + ) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 03999ec2d629..f1c02b6687b4 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -793,7 +793,7 @@ ..() mind.assigned_role = "Alien" - if(!isalien(src)) + if(!isalien(src) && !(src in alien_list[ALIEN_LONE_HUNTER])) var/datum/faction/infestation/I = create_uniq_faction(/datum/faction/infestation) add_faction_member(I, src, TRUE) @@ -822,6 +822,13 @@ ..() mind.special_role = "Drone" + //LONE XENO +/mob/living/carbon/xenomorph/humanoid/hunter/lone/mind_initialize() + ..() + mind.special_role = "Lone Hunter" + var/datum/faction/alien/A = create_uniq_faction(/datum/faction/alien, post_setup = FALSE) + add_faction_member(A, src, TRUE) + //AI /mob/living/silicon/ai/mind_initialize() ..() diff --git a/code/datums/outfits/misc/nostromo_crew.dm b/code/datums/outfits/misc/nostromo_crew.dm new file mode 100644 index 000000000000..77cd85d518c3 --- /dev/null +++ b/code/datums/outfits/misc/nostromo_crew.dm @@ -0,0 +1,42 @@ +/datum/outfit/nostromo + name = "Nostromo Outfit" + uniform = /obj/item/clothing/under/nostromo/white + shoes = /obj/item/clothing/shoes/white + +/datum/outfit/nostromo/Arthur_Dallas + name = "Nostromo Arthur Dallas" + uniform = /obj/item/clothing/under/nostromo/white + shoes = /obj/item/clothing/shoes/white + suit = /obj/item/clothing/suit/nostromo/leathjacket + +/datum/outfit/nostromo/Thomas_Kane + name = "Nostromo Thomas Kane" + uniform = /obj/item/clothing/under/nostromo/white + shoes = /obj/item/clothing/shoes/laceup + +/datum/outfit/nostromo/Ellen_Ripley + name = "Nostromo Ellen Ripley" + uniform = /obj/item/clothing/under/nostromo/green + shoes = /obj/item/clothing/shoes/white + +/datum/outfit/nostromo/Ash + name = "Nostromo Ash" + uniform = /obj/item/clothing/under/nostromo/blue + shoes = /obj/item/clothing/shoes/white + +/datum/outfit/nostromo/Joan_Lambert + name = "Nostromo Joan Lambert" + uniform = /obj/item/clothing/under/nostromo/white + shoes = /obj/item/clothing/shoes/boots/work + suit = /obj/item/clothing/suit/nostromo/jack + +/datum/outfit/nostromo/Dennis_Parker + name = "Nostromo Dennis Parker" + uniform = /obj/item/clothing/under/nostromo/black + shoes = /obj/item/clothing/shoes/white + +/datum/outfit/nostromo/Samuel_Brett + name = "Nostromo Samuel Brett" + uniform = /obj/item/clothing/under/nostromo/tropicspess + shoes = /obj/item/clothing/shoes/white + suit = /obj/item/clothing/suit/nostromo/hipjack diff --git a/code/datums/spawners_menu/spawners_living.dm b/code/datums/spawners_menu/spawners_living.dm index 1da8e39f4164..536be201db99 100644 --- a/code/datums/spawners_menu/spawners_living.dm +++ b/code/datums/spawners_menu/spawners_living.dm @@ -206,3 +206,13 @@ wiki_ref = "Abductor" time_for_registration = null register_only = FALSE + +/datum/spawner/living/jonesy + name = "Котик Джонси" + desc = "Очень чувствительный рыжий котик Джонси. Постарайтесь выжить." + time_for_registration = null + register_only = FALSE + +/datum/spawner/living/jonesy/spawn_body(mob/dead/spectator) + UnregisterSignal(mob, list(COMSIG_PARENT_QDELETING, COMSIG_LOGIN, COMSIG_MOB_DIED)) + mob.transfer_personality(spectator.client) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 461670fccd8c..544ef603c49d 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -269,6 +269,26 @@ desc = "Вы чувствуете головокружение." icon_state = "woozy" +/datum/status_effect/slowdown + id = "slowdown" + alert_type = /atom/movable/screen/alert/status_effect/slowdown + status_type = STATUS_EFFECT_REFRESH + duration = 3 SECOND + +/datum/status_effect/slowdown/on_apply() + . = ..() + if(!ishuman(owner)) + owner.speed += 0.5 + +/datum/status_effect/slowdown/on_remove() + if(ishuman(owner)) + owner.speed -= 0.5 + +/atom/movable/screen/alert/status_effect/slowdown + name = "Замедление" + desc = "Ноги становятся ватными." + icon_state = "woozy" + /// Hallucination status effect. How most hallucinations end up happening. /datum/status_effect/hallucination id = "hallucination" diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm index 0ca30a391ec5..2dfa1cd9eaf6 100644 --- a/code/defines/obj/hydro.dm +++ b/code/defines/obj/hydro.dm @@ -1459,6 +1459,28 @@ new /obj/effect/spacevine_controller(user.loc) qdel(src) +/obj/item/seeds/kudzuseed/alien + name = "pack of alien weed seeds" + desc = "These seeds grow into a alien weed that grows incredibly fast." + icon_state = "seed-alien-weed" + species = "alien-weed" + plantname = "Alien weed" + product_type = /obj/effect/spacevine_controller/alien + growthstages = 3 + yield = 1 + +/obj/item/seeds/kudzuseed/alien/attack_self(mob/user) + return + +/obj/item/seeds/kudzuseed/alien/ripen() + var/obj/machinery/hydroponics/pod = loc + if(!istype(pod)) + return + + new /obj/effect/spacevine_controller/alien(pod.loc) + pod.myseed = null + qdel(src) + /obj/item/seeds/durathread name = "pack of durathread seeds" desc = "A pack of seeds that'll grow into an extremely durable thread that could easily rival plasteel if woven properly." diff --git a/code/game/area/shuttle_areas.dm b/code/game/area/shuttle_areas.dm index dcfb49b93184..a3074387e9a8 100644 --- a/code/game/area/shuttle_areas.dm +++ b/code/game/area/shuttle_areas.dm @@ -381,6 +381,20 @@ icon_state = "shuttle" parallax_movedir = NORTH +/area/shuttle/nostromo_narcissus + name = "Nostromo Shuttle Narcissus" + icon_state = "shuttle" + looped_ambience = 'sound/ambience/loop_space.ogg' + parallax_movedir = WEST + +/area/shuttle/nostromo_narcissus/ship + name = "Narcissus Nostromo" + +/area/shuttle/nostromo_narcissus/transit + name = "Narcissus Space" + icon_state = "shuttle2" + parallax_movedir = FALSE + //Shuttle lists, group by areas // CENTCOM var/global/list/centcom_shuttle_areas = list ( diff --git a/code/game/area/station_areas.dm b/code/game/area/station_areas.dm index fd6b2be93a4c..db7914096ed4 100644 --- a/code/game/area/station_areas.dm +++ b/code/game/area/station_areas.dm @@ -980,3 +980,10 @@ ADD_TO_GLOBAL_LIST(/area/station, the_station_areas) icon_state = "tcomsatcham" ambience = 'sound/ambience/cyborgstation.ogg' sound_environment = SOUND_AREA_SMALL_METALLIC + +/area/station/nostromo + name = "Towed Spaceship" + cases = list("космический буксировщик", "космического буксировщика", "космическому буксировщику", "космический буксировщик", "космическим буксировщиком", "космическом буксировщике") + icon_state = "bluenew" + parallax_movedir = WEST + ambience = "" diff --git a/code/game/gamemodes/factions.dm b/code/game/gamemodes/factions.dm index d06f70d75fb3..aca282885d0a 100644 --- a/code/game/gamemodes/factions.dm +++ b/code/game/gamemodes/factions.dm @@ -12,6 +12,7 @@ var/min_roles = 1 // Whether or not this faction accepts newspawn latejoiners var/accept_latejoiners = FALSE + var/latejoiners_postsetup = FALSE // Accepts roundstart populating. Set FALSE to make faction members list empty var/rounstart_populate = TRUE diff --git a/code/game/gamemodes/factions/alien.dm b/code/game/gamemodes/factions/alien.dm new file mode 100644 index 000000000000..b5e0bf451e9a --- /dev/null +++ b/code/game/gamemodes/factions/alien.dm @@ -0,0 +1,135 @@ +/datum/faction/alien + name = F_XENOMORPH + ID = F_XENOMORPH + logo_state = "alien-logo" + required_pref = ROLE_ALIEN + + initroletype = /datum/role/alien + + min_roles = 0 + max_roles = 1 + +/datum/faction/alien/can_setup(num_players) + if(!..()) + return FALSE + if(xeno_spawn.len >= 1) + return TRUE + return FALSE + +/datum/faction/alien/OnPostSetup() + var/datum/role/role = pick(members) + var/start_point = pick(xeno_spawn) + + if(start_point && role) + if(SSmapping.get_map_module_by_name(MAP_MODULE_ALIEN)) + var/mob/living/carbon/human/H = new (get_turf(start_point)) + H.equip_to_slot_or_del(new /obj/item/clothing/under/nostromo/white, SLOT_W_UNIFORM) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white, SLOT_SHOES) + H.name = "Gilbert Kane" + H.real_name = "Gilbert Kane" + H.voice_name = "Gilbert Kane" + + var/mob/living/carbon/xenomorph/larva/lone/new_xeno = new(H) + role.antag.transfer_to(new_xeno) + QDEL_NULL(role.antag.original) + var/obj/item/weapon/larva_bite/auto/G = new(new_xeno, H) + new_xeno.put_in_active_hand(G) + G.last_bite = world.time - 20 + G.synch() + else + var/mob/living/carbon/xenomorph/humanoid/hunter/lone/new_xeno = new(get_turf(start_point)) + role.antag.transfer_to(new_xeno) + QDEL_NULL(role.antag.original) + return ..() + +#define F_NOSTROMO_CREW "Nostromo Crew" +#define NOSTROMO_CREWMATE "Nostromo Crewmate" + +/datum/faction/nostromo_crew + name = F_NOSTROMO_CREW + ID = F_NOSTROMO_CREW + logo_state = "nostromo-logo" + + accept_latejoiners = TRUE + latejoiners_postsetup = TRUE + initroletype = /datum/role/nostromo_crewmate + min_roles = 0 + max_roles = 7 + + var/dead_crew = 0 + var/list/crew = list() + var/alltime_crew = 0 + var/datum/map_module/alien/MM + var/round_end = FALSE + +/datum/faction/nostromo_crew/New() + ..() + MM = SSmapping.get_map_module_by_name(MAP_MODULE_ALIEN) + MM.crew_faction = src + +/datum/faction/nostromo_crew/forgeObjectives() + if(!..()) + return FALSE + AppendObjective(/datum/objective/nostromo/kill_alien) + return TRUE + +/datum/faction/nostromo_crew/check_win() + return round_end + +/datum/faction/nostromo_crew/proc/new_crewmate(mob/living/carbon/human/crewmate) + RegisterSignal(crewmate, list(COMSIG_MOB_DIED, COMSIG_PARENT_QDELETING), PROC_REF(crewmate_died)) + crew += crewmate + alltime_crew++ + MM.equip(crewmate) + +/datum/faction/nostromo_crew/proc/equip(mob/crewmate) + +/datum/faction/nostromo_crew/proc/crewmate_died(mob/crewmate) + UnregisterSignal(crewmate, list(COMSIG_MOB_DIED, COMSIG_PARENT_QDELETING)) + dead_crew++ + MM.deadcrew_ratio = dead_crew / alltime_crew * 100 + if(MM.deadcrew_ratio == 20) + MM.open_cargo() + if(MM.deadcrew_ratio == 50) + MM.open_evac() + if(dead_crew == alltime_crew) + round_end = TRUE + +#define NOSTROMO_ANDROID "Nostromo Android" + +/datum/faction/nostromo_android + name = NOSTROMO_ANDROID + ID = NOSTROMO_ANDROID + logo_state = "nano-logo" + required_pref = ROLE_TRAITOR + + initroletype = /datum/role/nostromo_android + min_roles = 0 + max_roles = 1 + +/datum/faction/nostromo_android/OnPostSetup() + var/datum/role/role = pick(members) + var/mob/living/carbon/human/H = role.antag.current + H.set_species(NOSTROMO_ANDROID) + H.nutrition_icon.update_icon(H) + var/datum/map_module/alien/MM = SSmapping.get_map_module_by_name(MAP_MODULE_ALIEN) + if(MM) + MM.equip(H) + return ..() + +#define NOSTROMO_CAT "Nostromo Cat" + +/datum/faction/nostromo_cat + name = NOSTROMO_CAT + ID = NOSTROMO_CAT + logo_state = "cat-logo" + initroletype = /datum/role/nostromo_cat + min_roles = 0 + var/Jonesy = /mob/living/simple_animal/cat/red/jonesy + +/datum/faction/nostromo_cat/OnPostSetup() + var/datum/map_module/alien/MM = SSmapping.get_map_module_by_name(MAP_MODULE_ALIEN) + if(MM) + var/start_point = pick(landmarks_list["Jonesy"]) + MM.jonesy = new Jonesy(get_turf(start_point)) + return ..() diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 56a0da119334..46968e5d0b2f 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -198,7 +198,7 @@ var/global/list/datum/faction/preinit_factions possible_factions += F if(possible_factions.len) var/datum/faction/F = pick(possible_factions) - add_faction_member(F, mob, TRUE) + add_faction_member(F, mob, TRUE, F.latejoiners_postsetup) /datum/game_mode/proc/PostSetup() addtimer(CALLBACK(src, PROC_REF(display_roundstart_logout_report)), ROUNDSTART_LOGOUT_REPORT_TIME) diff --git a/code/game/gamemodes/modes_declares/alien.dm b/code/game/gamemodes/modes_declares/alien.dm new file mode 100644 index 000000000000..49d34fc5d833 --- /dev/null +++ b/code/game/gamemodes/modes_declares/alien.dm @@ -0,0 +1,15 @@ +/datum/game_mode/alien + name = "Alien" + config_name = "alien" + + factions_allowed = list( + /datum/faction/alien, + /datum/faction/nostromo_crew, + /datum/faction/nostromo_cat) + + minimum_player_count = 1 + minimum_players_bundles = 8 + +/datum/game_mode/alien/announce() + to_chat(world, "Текущий режим игры - Чужой!") + to_chat(world, "Ксеноморф на корабле! Экипаж, убейте эту тварь как можно скорее!") diff --git a/code/game/gamemodes/modes_gameplays/nuclear/nuclearbomb.dm b/code/game/gamemodes/modes_gameplays/nuclear/nuclearbomb.dm index 664b93448826..b6a2150d37cc 100644 --- a/code/game/gamemodes/modes_gameplays/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/modes_gameplays/nuclear/nuclearbomb.dm @@ -510,3 +510,69 @@ var/global/bomb_set false_activation = TRUE update_icon() return + + +/obj/machinery/nuclearbomb/nostromo + anchored = TRUE + safety = FALSE + authorized = TRUE + var/datum/map_module/alien/MM = null + var/undock_try = FALSE + +/obj/machinery/nuclearbomb/nostromo/atom_init() + . = ..() + MM = SSmapping.get_map_module_by_name(MAP_MODULE_ALIEN) + if(MM) + MM.nukebomb = src + else + return INITIALIZE_HINT_QDEL + +/obj/machinery/nuclearbomb/nostromo/process() + . = ..() + if(!undock_try && timeleft < 300) // AUTO EVAC AFTER 5 MINUTE + MM.undock_shuttle() + undock_try = TRUE + +/obj/machinery/nuclearbomb/nostromo/ui_interact(mob/user) + return + +/obj/machinery/nuclearbomb/nostromo/attackby(obj/item/weapon/O, mob/user) + return + +/obj/machinery/nostromo/nuclear_starter + name = "self-destruct mechanism" + desc = "Self-destruct mechanism switch." + icon = 'icons/obj/recycling.dmi' + icon_state = "switch-off" + use_power = NO_POWER_USE + anchored = TRUE + resistance_flags = FULL_INDESTRUCTIBLE + unacidable = TRUE + var/locked = TRUE + var/datum/map_module/alien/MM = null + var/on = FALSE + +/obj/machinery/nostromo/nuclear_starter/atom_init() + . = ..() + MM = SSmapping.get_map_module_by_name(MAP_MODULE_ALIEN) + if(MM) + MM.nuke_starter = src + else + return INITIALIZE_HINT_QDEL + +/obj/machinery/nostromo/nuclear_starter/proc/unlock() + locked = FALSE + +/obj/machinery/nostromo/nuclear_starter/attack_hand(mob/user) + . = ..() + user.SetNextMove(CLICK_CD_INTERACT) + if(locked) + to_chat(user, "Механизм самоуничтожения заблокирован.") + return + if(on) + to_chat(user, "Механизм самоуничтожения запущен, он не может быть отменён!") + return + + icon_state = "switch-fwd" + on = TRUE + MM.nuke_set() diff --git a/code/game/gamemodes/modes_gameplays/nuclear/pinpointer.dm b/code/game/gamemodes/modes_gameplays/nuclear/pinpointer.dm index 22458c1a8a09..8b0242b17623 100644 --- a/code/game/gamemodes/modes_gameplays/nuclear/pinpointer.dm +++ b/code/game/gamemodes/modes_gameplays/nuclear/pinpointer.dm @@ -313,5 +313,57 @@ if(201 to INFINITY) icon_state = "pinonfar" + +/obj/item/weapon/pinpointer/nostromo + icon_state = "n_pinoff" + mode = SEARCH_FOR_OBJECT + var/datum/map_module/alien/MM = null + +/obj/item/weapon/pinpointer/nostromo/atom_init() + . = ..() + MM = SSmapping.get_map_module_by_name(MAP_MODULE_ALIEN) + if(!MM) + return INITIALIZE_HINT_QDEL + +/obj/item/weapon/pinpointer/nostromo/attack_self(mob/user) + var/mob/living/simple_animal/cat/red/jonesy/jonesy = MM.jonesy + var/mob/living/carbon/xenomorph/humanoid/hunter/lone/alien = MM.alien + + if(alien && jonesy) + if(prob(75)) + target = jonesy + else + target = alien + else if(jonesy) + target = jonesy + else if(alien) + target = alien + else + to_chat(user, "The target is missing") + return + ..() + if(!active) + icon_state = "n_pinoff" + +/obj/item/weapon/pinpointer/nostromo/process() + if(!active) + STOP_PROCESSING(SSobj, src) + return + if(isxenolonehunter(target)) + var/mob/living/carbon/xenomorph/humanoid/hunter/H = target + if(H.invisible) + icon_state = "n_pinonnull" + return + set_dir(get_dir(src, target)) + var/turf/self_turf = get_turf(src) + var/turf/target_turf = get_turf(target) + switch(get_dist(target_turf, self_turf)) + if(1 to 6) + icon_state = "n_pinonalert" + if(7 to 20) + icon_state = "n_pinon" + if(21 to INFINITY) + icon_state = "n_pinonnull" + #undef SEARCH_FOR_DISK #undef SEARCH_FOR_OBJECT diff --git a/code/game/gamemodes/objectives/bloodbath.dm b/code/game/gamemodes/objectives/bloodbath.dm new file mode 100644 index 000000000000..25b4730be07d --- /dev/null +++ b/code/game/gamemodes/objectives/bloodbath.dm @@ -0,0 +1,61 @@ +/datum/objective/evolution + explanation_text = "Достигните шестого этапа эволюции." + +/datum/objective/evolution/check_completion() + var/mob/living/carbon/xenomorph/humanoid/hunter/lone/alien = owner + if(alien && istype(alien)) + if(alien.estage >= 6) + return OBJECTIVE_WIN + return OBJECTIVE_LOSS + +// NOSTROMO MAP MODULE OBJECTIVES +/datum/objective/nostromo + var/datum/map_module/alien/MM = null + +/datum/objective/nostromo/New() + MM = SSmapping.get_map_module_by_name(MAP_MODULE_ALIEN) + +// KILL CREW FOR AIEN +/datum/objective/nostromo/bloodbath + explanation_text = "Убейте всех людей на корабле." + +/datum/objective/nostromo/bloodbath/check_completion() + if(MM && MM.deadcrew_ratio >= 90) // 90% OF THE CREW IS DEAD + return OBJECTIVE_WIN + return OBJECTIVE_LOSS + +// KILL ALIEN FOR CREW +/datum/objective/nostromo/kill_alien + explanation_text = "Ксеноморф на корабле! Убейте эту тварь как можно скорее!" + +/datum/objective/nostromo/kill_alien/check_completion() + if(MM && !MM.alien_alive) + return OBJECTIVE_WIN + return OBJECTIVE_LOSS + +// DEFEND ALIEN FOR ANDROID +/datum/objective/nostromo/defend_alien + explanation_text = "Ксеноморф должен выжить." + +/datum/objective/nostromo/defend_alien/check_completion() + if(MM && MM.alien_alive) + return OBJECTIVE_WIN + return OBJECTIVE_LOSS + +// DEFEND CREW FOR CAPTAIN +/datum/objective/nostromo/defend_crew + explanation_text = "Сведите потери среди экипажа к минимуму." + +/datum/objective/nostromo/defend_crew/check_completion() + if(MM && MM.deadcrew_ratio < 30) // 70% OF THE CREW IS ALIVE + return OBJECTIVE_WIN + return OBJECTIVE_LOSS + +// DEFEND SHIP FOR ANDROID +/datum/objective/nostromo/defend_ship + explanation_text = "Корабль должен остаться в рабочем состоянии." + +/datum/objective/nostromo/defend_ship/check_completion() + if(MM && !MM.breakdown) + return OBJECTIVE_WIN + return OBJECTIVE_LOSS diff --git a/code/game/gamemodes/objectives/survive.dm b/code/game/gamemodes/objectives/survive.dm index 28eba348ba7d..68349dc9644f 100644 --- a/code/game/gamemodes/objectives/survive.dm +++ b/code/game/gamemodes/objectives/survive.dm @@ -8,3 +8,6 @@ if(issilicon(owner.current) && owner.current != owner.original) return OBJECTIVE_LOSS return OBJECTIVE_WIN + +/datum/objective/survive/ru + explanation_text = "Останьтесь в живых." diff --git a/code/game/gamemodes/roles/alien.dm b/code/game/gamemodes/roles/alien.dm index 1f2d0ae59261..dbe5b30bd4d1 100644 --- a/code/game/gamemodes/roles/alien.dm +++ b/code/game/gamemodes/roles/alien.dm @@ -1,23 +1,246 @@ /datum/role/alien - name = XENOMORPH - id = XENOMORPH + name = LONE_XENOMORPH + id = LONE_XENOMORPH required_pref = ROLE_ALIEN disallow_job = TRUE antag_hud_type = ANTAG_HUD_ALIEN antag_hud_name = "hudalien" + logo_state = "alien-logo" - logo_state = "xeno-logo" +/datum/role/alien/forgeObjectives() + if(!..()) + return FALSE + if(SSmapping.get_map_module_by_name(MAP_MODULE_ALIEN)) + AppendObjective(/datum/objective/nostromo/bloodbath) + AppendObjective(/datum/objective/evolution) + AppendObjective(/datum/objective/survive/ru) + return TRUE -/datum/role/alien/Greet(greeting, custom) + +/datum/role/nostromo_crewmate + name = NOSTROMO_CREWMATE + id = NOSTROMO_CREWMATE + logo_state = "nostromo-logo" + change_to_maximum_skills = FALSE + +/datum/role/nostromo_crewmate/forgeObjectives() + if(!..()) + return FALSE + if(antag.current.job == "Captain") + AppendObjective(/datum/objective/nostromo/defend_crew) + return TRUE + +/datum/role/nostromo_crewmate/OnPostSetup() + . = ..() + var/mob/living/L = antag.current + var/datum/action/A = new /datum/action/nostromo_guide(L) + A.Grant(L) + var/turf/current_turf = get_turf(L) + var/obj/structure/stool/bed/chair/metal/chair = locate() in current_turf.contents + if(chair) + chair.buckle_mob(L) + L.Stun(4) + var/datum/faction/nostromo_crew/F = faction + F.new_crewmate(L) + +/datum/role/nostromo_cat + name = NOSTROMO_CAT + id = NOSTROMO_CAT + logo_state = "cat-logo" + disallow_job = TRUE + +/datum/role/nostromo_cat/forgeObjectives() + if(!..()) + return FALSE + AppendObjective(/datum/objective/survive/ru) + return TRUE + +/datum/role/nostromo_cat/Greet(greeting, custom) . = ..() - to_chat(antag.current, {"Вы - ксеноморф. Ваша текущая форма - грудолом. -Сейчас вы очень слабы и вас легко убить. -Прячьтесь под предметами и передвигайтесь по вентиляции, что бы сохранить свою жизнь. -Ваша главная задача - вырасти во взрослого ксеноморфа. Прогресс роста указан во вкладке Status. -Когда прогресс роста дойдет до конца, вы сможете эволюционировать в оду из трех взрослых форм. -Договоритесь со своими сестрами, кто и в какую форму будет эволюционировать. -Для общения внутри улья поставьте :ф перед сообщением. -Кто-то обязательно должен стать трутнем, это единственная форма, способная вырасти в королеву. + to_chat(antag.current, {" +Вы - очень чувствительный рыжий котик Джонси. Постарайтесь выжить. ------------------"}) + +/datum/role/nostromo_android + name = NOSTROMO_ANDROID + id = NOSTROMO_ANDROID + logo_state = "nano-logo" + change_to_maximum_skills = FALSE + restricted_jobs = list("Captain") + +/datum/role/nostromo_android/forgeObjectives() + if(!..()) + return FALSE + AppendObjective(/datum/objective/nostromo/defend_alien) + AppendObjective(/datum/objective/nostromo/defend_ship) + AppendObjective(/datum/objective/survive/ru) + return TRUE + +/datum/role/nostromo_android/Greet(greeting, custom) + . = ..() + to_chat(antag.current, {" +Вы - андроид, тайно посланный корпорацией в этот рейс. +На борту корабля находится ксеноморф - идеальная форма жизни. +Ваша задача - доставить его живым на Марс для дальнейшего изучения. +Шансы на выживание экипажа ничтожно малы, поэтому корпорацией принято решение пренебречь их жизнями. +Экипаж не знает что вы не человек, постарайтесь не раскрывать этого. +Ваш корпус крайне хрупок, поэтому вступать в прямую конфронтацию с экипажем не рекомендуется. +Для подзарядки используйте апц в инженерном отсеке. +Поведение особи непредсказуемо, рекомендуется свести возможные контакты к минимуму. +В случае прямого контакта с особью, рекомендуется не подавать признаков жизни. +------------------"}) + +/datum/role/nostromo_android/OnPostSetup() + . = ..() + var/mob/living/L = antag.current + var/datum/action/A = new /datum/action/nostromo_guide(L) + A.Grant(L) + var/turf/current_turf = get_turf(L) + var/obj/structure/stool/bed/chair/metal/chair = locate() in current_turf.contents + if(chair) + chair.buckle_mob(L) + L.Stun(4, TRUE) + + +/datum/action/nostromo_guide + name = "ГИД по ивенту." + check_flags = AB_CHECK_ALIVE + action_type = AB_INNATE + button_icon_state = "holomap" + +/datum/action/nostromo_guide/Activate() + var/text = "" + if(isrolebytype(/datum/role/alien, owner)) + text = get_guide("Alien") + if(isrolebytype(/datum/role/nostromo_crewmate, owner)) + text = get_guide(owner.job) + if(isrolebytype(/datum/role/nostromo_android, owner)) + text = get_guide("Android") + + owner << browse_rsc('nano/images/nanomap_nostromo_1.png', "nanomap.png") + + var/content = "[text]" + + var/datum/browser/popup = new(owner, "window=[name]", "ГИД по ивенту", 1200, 685, ntheme = CSS_THEME_DARK) + popup.set_content(content) + popup.open() + +/datum/action/nostromo_guide/proc/get_guide(code) + var/output_text = "

Добро пожаловать на Ностромо

" + switch(code) + if("Captain") + output_text += {" +Вы - капитан этого судна. Ваша задача - свести потери среди экипажа к минимуму.
+Распределите среди людей обязанности и удостоверьтесь что они их выполняют. +Собирайте людей вместе, следите за тем, чтобы никто и никуда не ходил в одиночку.
+Держите при себе рацию и внимательно следите за сообщениями от бортового ИИ.
+В вашем шкафу есть датчик движения для отслеживания ксеноморфа и энергетический карабин.
+ +Регулярно проверяйте и восстанавливайте курс корабля. +Для восстановления курса корабля проследуйте в кабину пилота на мостике. +Там находятся 2 консоли, каждая из них отвечает за свой угол отклонения от курса. +Осмотрите их и поочерёдно используйте для восстановления курса корабля. +Использование консоли приводит к приближению отклонения на ней к нулю и отдалению от него отклонения второй консоли.
+ +Запустите двигатель и регулярно занимайтесь починкой СМЕСа. +Будьте осторожны при запуске, двигатель излучает радиацию! +Для починки СМЕСа в первую очередь осмотрите его. +В чат будет выведено сообщение о его неисправности, по его содержанию поймите какой инструмент необходим. +Используйте нужные инструменты до полного восстановления СМЕСа. +При низкой стабильности СМЕСа вас может ударить током при попытке починить, используйте изоляцию!
+ +По кораблю в технических помещениях разбросано множество предметов, что могут быть полезны. +Фонари, рации, куски ткани, инструменты.
+ +Ксеноморф уязвим к огню. Используйте коктейли молотова и огнемёт для борьбы с ним. +Чтобы сделать молотов опустошите бутылку и наполните её топливом, затем поместите в горлышко ткань. +Для опустошения бутылки нажмите на неё пкм и в выпадающем списке найдите кнопку для этого. +Чтобы сделать огнемёт используйте прутья на сварке, а затем добавьте к этому воспламенитель и бак с горючим газом. +Также можете сделать болы, но не используйте их слишком часто!
+ +Ксеноморф питается трупами, хоть на корабле и не предусмотрен морг, позаботьтесь о том, чтобы любой труп был спрятан до того, как ксеноморф им полакомится.
+
"} + + if("Crewmate") + output_text += {" +Вы - член экипажа этого судна. Ваша задача - остаться в живых.
+Слушайте что вам говорит капитан! +Не разбегайтесь в самом начале, сначала распределите между собой обязанности!
+ +Держите при себе рацию и внимательно следите за сообщениями от бортового ИИ.
+ +Регулярно проверяйте и восстанавливайте курс корабля. +Для восстановления курса корабля проследуйте в кабину пилота на мостике. +Там находятся 2 консоли, каждая из них отвечает за свой угол отклонения от курса. +Осмотрите их и поочерёдно используйте для восстановления курса корабля. +Использование консоли приводит к приближению отклонения на ней к нулю и отдалению от него отклонения второй консоли.
+ +Запустите двигатель и регулярно занимайтесь починкой СМЕСа. +Будьте осторожны при запуске, двигатель излучает радиацию! +Для починки СМЕСа в первую очередь осмотрите его. +В чат будет выведено сообщение о его неисправности, по его содержанию поймите какой инструмент необходим. +Используйте нужные инструменты до полного восстановления СМЕСа. +При низкой стабильности СМЕСа вас может ударить током при попытке починить, используйте изоляцию!
+ +По кораблю в технических помещениях разбросано множество предметов, что могут быть полезны. +Фонари, рации, куски ткани, инструменты.
+ +Ксеноморф уязвим к огню. Используйте коктейли молотова и огнемёт для борьбы с ним. +Чтобы сделать молотов опустошите бутылку и наполните её топливом, затем поместите в горлышко ткань. +Для опустошения бутылки нажмите на неё пкм и в выпадающем списке найдите кнопку для этого. +Чтобы сделать огнемёт используйте прутья на сварке, а затем добавьте к этому воспламенитель и бак с горючим газом. +Также можете сделать болы, но не используйте их слишком часто!
+ +Ксеноморф питается трупами, хоть на корабле и не предусмотрен морг, позаботьтесь о том, чтобы любой труп был спрятан до того, как ксеноморф им полакомится.
+
"} + + if("Alien") + output_text += {" +Вы - ксеноморф, эмбрионом попавший на это судно. Ваша задача - эволюционировать и убивать. +Будучи грудоломом бегите и прячьтесь. Вы очень шустры, но не можете ползать по вентиляции. +Эволюционируйте во взрослую особь как только сможете. +
+Вашей основной целью является дальнейшая эволюция. Для этого вам нужно питаться телами людей. +Найдите свежее тело (убейте или утащите живьём кого-то из экипажа). +Найдите укромное местечко и покрепче схватите свою жертву. +Приступите к трапезе, использовав способность. +Вы будете кусать каждую часть тела своей жертвы и за каждый укус получать по одному очку эволюции. +Набрав 6 очков вы перейдёте на следующий этап эволюции и получите прибавку к характеристикам. +
+Пока вы находитесь на первом этапе, вы можете получать очки, показываясь разным членам экипажа на глаза. +
+Пока вы находитесь на этапе ниже 5, вам доступна механика адреналина. +Получив много урона вы автоматически выйдите из стана и получите кратковременную прибавку к скорости. +Адреналин может быть активирован каждые 5 минут. Используйте этот эффект, чтобы избежать смерти. +
+Пока вы находитесь на этапе ниже 5, вы будете ограничены механикой охоты. +Охота - эффект, выдаваемый вам при нападении на экипаж. +Первый кого вы атакуете становится целью вашей охоты. +Атаки по цели охоты производятся в 2 раза чаще. +Атаки не по цели охоты производятся в 5 раз реже. +Поэтому перед нападением лучше выберите себе одну конкретную цель, которую будете атаковать. +Не нападайте на экипаж часто, сначала подождите когда эффект охоты спадёт. +
+У вас отключена пассивная регенерация. +Вместо этого вы можете восстанавливать своё здоровье, используя специальную способность или поедая тела. +
+Вы очень уязвимы к огню. Если вас охватило пламя, лучше сбежать и потушиться. +Эффект адреналина также сбрасывает с вас огонь, но он доступен лишь до 5 этапа! +
+Если на корабле произойдёт поломка, вы перейдёте в режим убийцы. +Вам будут выданы 6 этап эволюции и способность крик королевы. Используйте полученные силы для убийства экипажа. +Поломка корабля также означает открытие склада и возможность запуска механизма самоуничтожения. +Скорее всего экипаж захочет эвакуироваться с корабля как только это произойдёт. Вы не можете + +
"} + + if("Android") + output_text += {" +Вы - андроид, тайно засланный корпорацией на это судно. Ваша задача - поддерживать корабль в рабочем состоянии. +Ксеноморф - идеальная форма жизни, он без проблем разделается с экипажем. +Корпорации нужно чтобы вы привезли его на Марс +"} + + return output_text diff --git a/code/game/machinery/computer/fort_console.dm b/code/game/machinery/computer/fort_console.dm index 24e9bbce2ba6..b8ec1018c85d 100644 --- a/code/game/machinery/computer/fort_console.dm +++ b/code/game/machinery/computer/fort_console.dm @@ -24,7 +24,7 @@ . = ..() if(team_id) - var/datum/map_module/forts/MM = SSmapping.get_map_module(MAP_MODULE_FORTS) + var/datum/map_module/forts/MM = SSmapping.get_map_module_by_name(MAP_MODULE_FORTS) MM.consoles[team_id] = src var/turf/step_to = loc @@ -45,7 +45,7 @@ /obj/machinery/computer/fort_console/Destroy() . = ..() - var/datum/map_module/forts/MM = SSmapping.get_map_module(MAP_MODULE_FORTS) + var/datum/map_module/forts/MM = SSmapping.get_map_module_by_name(MAP_MODULE_FORTS) MM.announce("Консоль [team_id] была уничтожена!") QDEL_LIST(shoplist) @@ -130,7 +130,7 @@ order = 1 /datum/fort_console_lot/specialization/purchase(mob/user, obj/machinery/computer/fort_console/command) - var/datum/map_module/forts/MM = SSmapping.get_map_module(MAP_MODULE_FORTS) + var/datum/map_module/forts/MM = SSmapping.get_map_module_by_name(MAP_MODULE_FORTS) var/datum/faction/F = MM.factions[command.team_id] if(!length(F.members)) @@ -165,7 +165,7 @@ /datum/fort_console_lot/team_announce/purchase(mob/user, obj/machinery/computer/fort_console/command) var/message = sanitize(input(user, "Please enter text for your announcement.", "Announce") as text, MAX_MESSAGE_LEN, extra = FALSE) - var/datum/map_module/forts/MM = SSmapping.get_map_module(MAP_MODULE_FORTS) + var/datum/map_module/forts/MM = SSmapping.get_map_module_by_name(MAP_MODULE_FORTS) MM.announce(message, user, from_team = command.team_id, team_only = TRUE) /datum/fort_console_lot/global_announce @@ -177,7 +177,7 @@ /datum/fort_console_lot/global_announce/purchase(mob/user, obj/machinery/computer/fort_console/command) var/message = sanitize(input(user, "Please enter text for your announcement.", "Announce") as text, MAX_MESSAGE_LEN, extra = FALSE) - var/datum/map_module/forts/MM = SSmapping.get_map_module(MAP_MODULE_FORTS) + var/datum/map_module/forts/MM = SSmapping.get_map_module_by_name(MAP_MODULE_FORTS) MM.announce(message, user, from_team = command.team_id) /datum/fort_console_lot/update_map diff --git a/code/game/machinery/computer/nostromo.dm b/code/game/machinery/computer/nostromo.dm new file mode 100644 index 000000000000..fc9340ee4ecb --- /dev/null +++ b/code/game/machinery/computer/nostromo.dm @@ -0,0 +1,134 @@ +/obj/machinery/computer/nostromo + icon_state = "shuttle" + resistance_flags = FULL_INDESTRUCTIBLE + unacidable = TRUE + var/datum/map_module/alien/MM = null + +/obj/machinery/computer/nostromo/atom_init() + . = ..() + MM = SSmapping.get_map_module_by_name(MAP_MODULE_ALIEN) + if(!MM) + return INITIALIZE_HINT_QDEL + else + MM.shuttle_console = src + +/obj/machinery/computer/nostromo/narcissus_shuttle + name = "Narcissus Shuttle Console" + cases = list("консоль шаттла", "консоли шаттла", "консоли шаттла", "консоль шаттла", "консолью шаттла", "консоли шаттла") + var/docked = TRUE + +/obj/machinery/computer/nostromo/narcissus_shuttle/ui_interact(mob/user) + var/dat + if(docked) + dat += "" + dat += "Начать процедуру отстыковки" + else + dat += "