diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml index 48967b95f0aa3..bf11bf4ea04d0 100644 --- a/.github/workflows/cancel.yml +++ b/.github/workflows/cancel.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 3 steps: - - uses: styfle/cancel-workflow-action@01ce38bf961b4e243a6342cbade0dbc8ba3f0432 + - uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa with: workflow_id: 3545321 access_token: ${{ github.token }} diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml index dfa4a1dabba38..8cf42cbcc00f4 100644 --- a/.github/workflows/generate_documentation.yml +++ b/.github/workflows/generate_documentation.yml @@ -19,7 +19,7 @@ jobs: - name: checkout uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - name: paths-filter - uses: dorny/paths-filter@4512585405083f25c027a35db413c2b3b9006d50 + uses: dorny/paths-filter@0bc4621a3135347011ad047f9ecf449bf72ce2bd id: filter with: filters: .github/workflow-config/preflight-filters.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 481b5cbb5b742..c7a9ca371377b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,7 +21,7 @@ jobs: - name: checkout uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - name: paths-filter - uses: dorny/paths-filter@4512585405083f25c027a35db413c2b3b9006d50 + uses: dorny/paths-filter@0bc4621a3135347011ad047f9ecf449bf72ce2bd id: filter with: filters: .github/workflow-config/preflight-filters.yml diff --git a/baystation12.dme b/baystation12.dme index c068cf0adfcc9..1b19e22923c96 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -88,8 +88,8 @@ #include "code\__defines\xenoarcheaology.dm" #include "code\__defines\ZAS.dm" #include "code\__defines\zmimic.dm" -#include "code\__defines\~mods\rust_g.dm" #include "code\__defines\~mods\expanded_culture_descriptor.dm" +#include "code\__defines\~mods\rust_g.dm" #include "code\__defines\~mods\~master_defines.dm" #include "code\_global_vars\edible.dm" #include "code\_global_vars\logging.dm" @@ -3366,6 +3366,7 @@ #include "mods\_master_files\code\modules\events\gravity.dm" #include "mods\_master_files\code\modules\mob\new_player\new_player.dm" #include "mods\_master_files\code\modules\power\gravitygenerator.dm" +#include "mods\_master_files\code\modules\projectiles\projectile\bullets.dm" #include "mods\_master_files\maps\mapsystem\maps.dm" #include "mods\_master_files\maps\sierra\sierra_ranks.dm" #include "mods\_master_files\maps\sierra\items\rigs.dm" diff --git a/code/__defines/~mods/~master_defines.dm b/code/__defines/~mods/~master_defines.dm index 7d788238af008..8b77841503b83 100644 --- a/code/__defines/~mods/~master_defines.dm +++ b/code/__defines/~mods/~master_defines.dm @@ -23,6 +23,8 @@ // UTF8 - End // DON_LOADOUT - Start +// Не открывать до Рождества +/* #define DONATION_TIER_NONE null #define DONATION_TIER_ONE "Tier 1" #define DONATION_TIER_TWO "Tier 2" @@ -41,6 +43,7 @@ DONATION_TIER_NONE, DONATION_TIER_ONE, \ DONATION_TIER_TWO, DONATION_TIER_THREE, \ DONATION_TIER_FOUR, DONATION_TIER_ADMIN) +*/ // DON_LOADOUT - End // GLIDING - Start diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 90213e96bde3b..450a0130e7709 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -307,6 +307,8 @@ var/global/list/radial_menus = list() /proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE, no_repeat_close = FALSE, list/check_locs, use_labels = FALSE) if(!user || !anchor || !length(choices)) return + if (istype(user.loc, /mob/living/exosuit)) + anchor = user.loc if(!uniqueid) uniqueid = "defmenu_[any2ref(user)]_[any2ref(anchor)]" diff --git a/code/controllers/subsystems/initialization/robots.dm b/code/controllers/subsystems/initialization/robots.dm index ca1eb2913fc42..e3af38b0344a3 100644 --- a/code/controllers/subsystems/initialization/robots.dm +++ b/code/controllers/subsystems/initialization/robots.dm @@ -15,6 +15,9 @@ SUBSYSTEM_DEF(robots) ) var/list/mmi_types_by_title = list( + // [SIERRA-ADD] - Allow to join as cyborg, + "cyborg" = /obj/item/device/mmi, + // [/SIERRA-ADD] , "robot" = /obj/item/organ/internal/posibrain, "drone" = /obj/item/device/mmi/digital/robot, "robot, flying" = /obj/item/organ/internal/posibrain, diff --git a/code/controllers/subsystems/jobs.dm b/code/controllers/subsystems/jobs.dm index 7ab726d00b79a..233a82a703a4c 100644 --- a/code/controllers/subsystems/jobs.dm +++ b/code/controllers/subsystems/jobs.dm @@ -397,7 +397,7 @@ SUBSYSTEM_DEF(jobs) for(var/required in G.allowed_skills) if(!H.skill_check(required,G.allowed_skills[required])) permitted = 0 - + // [SIERRA-ADD] - LOADOUT_ITEMS - Поддержка фракционных предметов в лодауте if(permitted && G.allowed_factions) var/singleton/cultural_info/faction = H.get_cultural_value(TAG_FACTION) diff --git a/code/datums/communication/ooc.dm b/code/datums/communication/ooc.dm index 1d112c3d886cb..9d51816fc2f51 100644 --- a/code/datums/communication/ooc.dm +++ b/code/datums/communication/ooc.dm @@ -35,14 +35,16 @@ var/ooc_color = C.prefs.ooccolor // [SIERRA-ADD] - DON_LOADOUT - var/ckey_prefix = C.donator_info.get_decorated_message(C, "[C.key]:") + // Не открывать до Рождества + // var/ckey_prefix = C.donator_info.get_decorated_message(C, "[C.key]:") // [/SIERRA-ADD] for(var/client/target in GLOB.clients) if(target.is_key_ignored(C.key)) // If we're ignored by this person, then do nothing. continue // [SIERRA-EDIT] - DON_LOADOUT - // var/sent_message = "[create_text_tag("ooc", "OOC:", target)] [C.key]: [SPAN_CLASS("message linkify", "[message]")]" // SIERRA-EDIT - ORIGINAL - var/sent_message = "[create_text_tag("ooc", "OOC:", target)] [ckey_prefix] [SPAN_CLASS("message linkify", "[message]")]" + // Не открывать до Рождества + var/sent_message = "[create_text_tag("ooc", "OOC:", target)] [C.key]: [SPAN_CLASS("message linkify", "[message]")]" // SIERRA-EDIT - ORIGINAL + // var/sent_message = "[create_text_tag("ooc", "OOC:", target)] [ckey_prefix] [SPAN_CLASS("message linkify", "[message]")]" // [/SIERRA-EDIT] if(can_badmin) receive_communication(C, target, SPAN_COLOR(ooc_color, SPAN_CLASS("ooc", sent_message))) diff --git a/code/datums/vote/transfer.dm b/code/datums/vote/transfer.dm index 7acc75d71a914..79f8041713078 100644 --- a/code/datums/vote/transfer.dm +++ b/code/datums/vote/transfer.dm @@ -1,5 +1,5 @@ -#define CHOICE_TRANSFER "Initiate crew transfer" -#define CHOICE_EXTEND "Extend the round ([config.vote_autotransfer_interval / 600] minutes)" +#define CHOICE_TRANSFER "Initiate bluespace jump" +#define CHOICE_EXTEND "Extend the round ([config.vote_autotransfer_interval] minutes)" #define CHOICE_ADD_ANTAG "Add antagonist" /datum/vote/transfer @@ -17,10 +17,10 @@ return //Mods bypass further checks. var/singleton/security_state/security_state = GET_SINGLETON(GLOB.using_map.security_state) if (!automatic && security_state.current_security_level_is_same_or_higher_than(security_state.high_security_level)) - to_chat(creator, "The current alert status is too high to call for a crew transfer!") + to_chat(creator, "The current alert status is too high to call for a bluespace jump!") return FALSE if(GAME_STATE <= RUNLEVEL_SETUP) - to_chat(creator, "The crew transfer button has been disabled!") + to_chat(creator, "The bluespace jump button has been disabled!") return FALSE /datum/vote/transfer/setup_vote(mob/creator, automatic) @@ -45,7 +45,7 @@ else factor = 1.4 choices[CHOICE_TRANSFER] = round(choices[CHOICE_TRANSFER] * factor) - to_world(SPAN_COLOR("purple", "Crew Transfer Factor: [factor]")) + to_world(SPAN_COLOR("purple", "Bluespace Jump Factor: [factor]")) /datum/vote/transfer/report_result() if(..()) diff --git a/code/game/antagonist/outsider/vox.dm b/code/game/antagonist/outsider/vox.dm index cf9c014f9e1ea..f68a82056f101 100644 --- a/code/game/antagonist/outsider/vox.dm +++ b/code/game/antagonist/outsider/vox.dm @@ -93,7 +93,6 @@ GLOBAL_LIST_EMPTY(vox_artifact_spawners) desc = "A pulsating mass of flesh and steel." icon = 'maps/antag_spawn/vox/vox.dmi' icon_state = "printer" - breakable = FALSE anchored = TRUE density = TRUE var/favors = 0 @@ -269,7 +268,6 @@ GLOBAL_LIST_EMPTY(vox_artifact_spawners) desc = "An old, dusty machine meant to analyze various bluespace anomalies and send research data directly to SCGEC Observatory." icon = 'icons/obj/machines/research/xenoarcheology_scanner.dmi' icon_state = "scanner" - breakable = FALSE anchored = FALSE density = TRUE var/points = 0 diff --git a/code/game/machinery/_machines_base/machinery.dm b/code/game/machinery/_machines_base/machinery.dm index 372bc39ded8af..82845ae4cfc6b 100644 --- a/code/game/machinery/_machines_base/machinery.dm +++ b/code/game/machinery/_machines_base/machinery.dm @@ -236,7 +236,7 @@ // If you don't call parent in this proc, you must make all appropriate checks yourself. // If you do, you must respect the return value. /obj/machinery/attack_hand(mob/user) - if((. = ..())) // Buckling, climbers, punching on harm; unlikely to return true. + if((. = ..())) // Buckling, climbers; unlikely to return true unless on harm intent and damage is dealt. return if(!CanPhysicallyInteract(user)) return FALSE // The interactions below all assume physical access to the machine. If this is not the case, we let the machine take further action. diff --git a/code/game/machinery/bluespace_drive.dm b/code/game/machinery/bluespace_drive.dm index 3a4be5d9f5b10..c65ebbfd420b4 100644 --- a/code/game/machinery/bluespace_drive.dm +++ b/code/game/machinery/bluespace_drive.dm @@ -218,8 +218,15 @@ continue if (GLOB.using_map.use_bluespace_interlude && prob(interlude_teleport_chance)) - addtimer(new Callback(GLOBAL_PROC, /proc/do_unstable_teleport_safe, mob, GetConnectedZlevels(mob.z)), rand(1, 2) MINUTES) - GLOB.using_map.do_interlude_teleport(mob, duration = rand(1, 2.5) MINUTES) + if (istype(mob, /mob/living/simple_animal) && prob(80)) + return + var/turf/T = pick_area_turf_in_connected_z_levels( + list(/proc/is_not_space_area), + list(/proc/not_turf_contains_dense_objects, /proc/IsTurfAtmosSafe), + zlevels[1]) + if (!T) + return + GLOB.using_map.do_interlude_teleport(mob, T, rand(1, 2.5) MINUTES) return if (mob != being) var/source_position = being.loc diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index a0cae74b6899a..2d2b403ef91e6 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -242,6 +242,9 @@ /obj/attack_hand(mob/living/user) + . = ..() + if (.) + return if (Adjacent(user)) add_fingerprint(user) @@ -276,7 +279,6 @@ ) damage_health(damage, attack.get_damage_type(), attack.damage_flags()) return TRUE - ..() /obj/is_fluid_pushable(amt) return ..() && w_class <= round(amt/20) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 4d5dec82835d9..0873dd7182ccb 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -3,7 +3,7 @@ w_class = ITEM_SIZE_NO_CONTAINER layer = STRUCTURE_LAYER - var/breakable + var/fragile var/parts var/list/connections = list("0", "0", "0", "0") var/list/other_connections = list("0", "0", "0", "0") @@ -16,7 +16,7 @@ /obj/structure/damage_health(damage, damage_type, damage_flags, severity, skip_can_damage_check) if (damage && HAS_FLAGS(damage_flags, DAMAGE_FLAG_TURF_BREAKER)) - if (breakable) + if (fragile) return kill_health() damage = max(damage, 10) ..() @@ -117,6 +117,15 @@ return ..() +/obj/structure/proc/dump_contents() + for(var/mob/M in src) + M.dropInto(loc) + if(M.client) + M.client.eye = M.client.mob + M.client.perspective = MOB_PERSPECTIVE + + for(var/atom/movable/AM in src) + AM.dropInto(loc) /obj/structure/proc/can_visually_connect() return anchored diff --git a/code/game/objects/structures/crates_lockers/closets/__closet.dm b/code/game/objects/structures/crates_lockers/closets/__closet.dm index 687bfcbe66340..c89398ebfe9ec 100644 --- a/code/game/objects/structures/crates_lockers/closets/__closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/__closet.dm @@ -6,6 +6,7 @@ density = TRUE w_class = ITEM_SIZE_NO_CONTAINER health_max = 100 + health_min_damage = 3 var/welded = 0 var/large = 1 @@ -71,6 +72,14 @@ else to_chat(user, "It is full.") +/obj/structure/closet/damage_health(damage, damage_type, damage_flags, severity, skip_can_damage_check) + . = ..() + if (!length(contents)) + return + var/content_damage = damage / length(contents) + for (var/atom/victim as anything in contents) + victim.damage_health(content_damage, damage_type, damage_flags, severity, skip_can_damage_check) + /obj/structure/closet/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(air_group || (height==0 || wall_mounted)) return 1 return (!density) @@ -92,16 +101,6 @@ return FALSE return TRUE -/obj/structure/closet/proc/dump_contents() - for(var/mob/M in src) - M.dropInto(loc) - if(M.client) - M.client.eye = M.client.mob - M.client.perspective = MOB_PERSPECTIVE - - for(var/atom/movable/AM in src) - AM.dropInto(loc) - /obj/structure/closet/proc/store_contents() var/stored_units = 0 @@ -402,8 +401,10 @@ to_chat(user, SPAN_NOTICE("It won't budge!")) /obj/structure/closet/attack_hand(mob/user as mob) - src.add_fingerprint(user) - src.toggle(user) + if (user.a_intent == I_HURT) + return ..() + add_fingerprint(user) + toggle(user) /obj/structure/closet/attack_ghost(mob/ghost) if(ghost.client && ghost.client.inquisitive_ghost) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/_secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/_secure_closets.dm index 46660b3f8e5d8..07b4d7993a191 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/_secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/_secure_closets.dm @@ -6,6 +6,7 @@ setup = CLOSET_HAS_LOCK | CLOSET_CAN_BE_WELDED locked = TRUE health_max = 200 + health_min_damage = 5 /obj/structure/closet/secure_closet/slice_into_parts(obj/item/weldingtool/WT, mob/user) to_chat(user, SPAN_NOTICE("\The [src] is too strong to be taken apart.")) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index f0c1f2078a5ba..58d2681264ac7 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -90,6 +90,8 @@ closet_appearance = /singleton/closet_appearance/crate/secure setup = CLOSET_HAS_LOCK locked = TRUE + health_max = 200 + health_min_damage = 5 /obj/structure/closet/crate/secure/Initialize() . = ..() diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 801ffce12f025..b428c5b716720 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -5,6 +5,8 @@ icon_state = "densecrate" density = TRUE atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + health_max = 100 + health_min_damage = 4 /obj/structure/largecrate/Initialize() . = ..() @@ -14,17 +16,16 @@ I.forceMove(src) /obj/structure/largecrate/attack_hand(mob/user as mob) + if (user.a_intent == I_HURT) + return ..() to_chat(user, SPAN_NOTICE("You need a crowbar to pry this open!")) - return - /obj/structure/largecrate/use_tool(obj/item/tool, mob/user, list/click_params) // Crowbar - Open crate if (isCrowbar(tool)) var/obj/item/stack/material/wood/A = new(loc) transfer_fingerprints_to(A) - for (var/atom/movable/item as anything in contents) - item.dropInto(loc) + dump_contents() user.visible_message( SPAN_NOTICE("\The [user] pries \the [src] open with \a [tool]."), SPAN_NOTICE("You pry \the [src] open with \the [tool]."), @@ -35,6 +36,11 @@ return ..() +/obj/structure/largecrate/on_death() + var/obj/item/stack/material/wood/A = new(loc) + transfer_fingerprints_to(A) + dump_contents() + qdel_self() /obj/structure/largecrate/mule name = "MULE crate" diff --git a/code/modules/client/preference_setup/general/05_preview.dm b/code/modules/client/preference_setup/general/05_preview.dm index 7d2a3df38a3e3..28fc46f739b05 100644 --- a/code/modules/client/preference_setup/general/05_preview.dm +++ b/code/modules/client/preference_setup/general/05_preview.dm @@ -17,8 +17,9 @@ /datum/preferences/proc/dress_preview_mob(mob/living/carbon/human/mannequin) // [SIERRA-ADD] - DON_LOADOUT - Mob preview - if(!mannequin) - return + // Не открывать до Рождества + // if(!mannequin) + // return // [/SIERRA-ADD] var/update_icon = FALSE copy_to(mannequin, TRUE) @@ -32,8 +33,9 @@ else return // [SIERRA-ADD] - DON_LOADOUT - Mob preview - if(!previewJob && mannequin.icon) - update_icon = TRUE // So we don't end up stuck with a borg/AI icon after setting their priority to non-high + // Не открывать до Рождества + // if(!previewJob && mannequin.icon) + // update_icon = TRUE // So we don't end up stuck with a borg/AI icon after setting their priority to non-high // [/SIERRA-ADD] if(preview_job && previewJob) mannequin.job = previewJob.title @@ -48,15 +50,15 @@ // Equip custom gear loadout, replacing any job items var/list/loadout_taken_slots = list() // [SIERRA-EDIT] - DON_LOADOUT - Trying gears - // for(var/thing in Gear()) // SIERRA-EDIT - ORIGINAL - var/list/accessories = list() - - var/list/orig_gears = Gear() - var/list/gears = orig_gears.Copy() - if(trying_on_gear) - gears[trying_on_gear] = trying_on_tweaks.Copy() - - for(var/thing in gears) + for(var/thing in Gear()) // SIERRA-EDIT - ORIGINAL + // var/list/accessories = list() + // + // var/list/orig_gears = Gear() + // var/list/gears = orig_gears.Copy() + // if(trying_on_gear) + // gears[trying_on_gear] = trying_on_tweaks.Copy() + // + // for(var/thing in gears) // [/SIERRA-EDIT] var/datum/gear/G = gear_datums[thing] if(G) @@ -73,19 +75,21 @@ if(!permitted) continue // [SIERRA-ADD] - DON_LOADOUT - Accessories preview - if(G.slot == slot_tie) - accessories.Add(G) - continue + // Не открывать до Рождества + // if(G.slot == slot_tie) + // accessories.Add(G) + // continue // [/SIERRA-ADD] if(G.slot && G.slot != slot_tie && !(G.slot in loadout_taken_slots) && G.spawn_on_mob(mannequin, gear_list[gear_slot][G.display_name])) loadout_taken_slots.Add(G.slot) update_icon = TRUE // [SIERRA-ADD] - DON_LOADOUT - Accessories preview // equip accessories after other slots so they don't attach to a suit which will be replaced - for(var/datum/gear/G in accessories) - G.spawn_as_accessory_on_mob(mannequin, gears[G.display_name]) - if(length(accessories)) - update_icon = TRUE + // Не открывать до Рождества + // for(var/datum/gear/G in accessories) + // G.spawn_as_accessory_on_mob(mannequin, gears[G.display_name]) + // if(length(accessories)) + // update_icon = TRUE // [/SIERRA-ADD] if(update_icon) mannequin.update_icons() diff --git a/code/modules/emotes/definitions/_mob.dm b/code/modules/emotes/definitions/_mob.dm index cc05715403de7..dbc141c932cc4 100644 --- a/code/modules/emotes/definitions/_mob.dm +++ b/code/modules/emotes/definitions/_mob.dm @@ -135,6 +135,7 @@ /singleton/emote/visible/shrug, /singleton/emote/visible/smile, /singleton/emote/visible/pale, + /singleton/emote/audible/choke, /singleton/emote/visible/tremble, /singleton/emote/visible/wink, /singleton/emote/visible/hug, diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm index 11f760a59e9c3..b02d00e1bc749 100644 --- a/code/modules/emotes/emote_mob.dm +++ b/code/modules/emotes/emote_mob.dm @@ -44,7 +44,8 @@ var/singleton/emote/use_emote = usable_emotes[act] if(!use_emote) - to_chat(src, SPAN_WARNING("Unknown emote '[act]'. Type say *help for a list of usable emotes.")) + var/emote_prefix = get_prefix_key(/singleton/prefix/custom_emote) + to_chat(src, SPAN_WARNING("Unknown emote '[act]'. Type say [emote_prefix]help for a list of usable emotes.")) return if(m_type != use_emote.message_type && use_emote.conscious && stat != CONSCIOUS) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index f291299a6aafe..32f0ca83683ad 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -5,7 +5,10 @@ var/list/code = list() var/list/lastattempt = list() var/attempts = 10 - var/codelen = 4 + // [SIERRA-EDIT] - UTILITY_ITEMS - Multimeter Avoiding redeclare of var "codelen" + // var/codelen = 4 // SIERRA-EDIT - ORIGINAL + codelen = 4 + // [/SIERRA-EDIT] - UTILITY_ITEMS locked = 1 /obj/structure/closet/crate/secure/loot/New() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 08da1c8cc0116..35463efb1dcf4 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -475,7 +475,7 @@ machine_desc = "This nuclear generator uses a combination of uranium and, strangely, vodka. Rated for 150 kW max safe output." var/coolant_volume = 120 var/coolant_use = 1 - var/coolant_reagent = /datum/reagent/ethanol/vodka + var/datum/reagent/coolant_reagent = /datum/reagent/ethanol/vodka /obj/machinery/power/port_gen/pacman/super/potato/New() create_reagents(coolant_volume) @@ -503,18 +503,28 @@ if(power_output > max_safe_output) icon_state = "potatodanger" -/obj/machinery/power/port_gen/pacman/super/potato/use_tool(obj/item/O, mob/living/user, list/click_params) - if(istype(O, /obj/item/reagent_containers)) - var/obj/item/reagent_containers/R = O - if(R.standard_pour_into(src,user)) - if(reagents.has_reagent("vodka")) - audible_message(SPAN_NOTICE("[src] blips happily")) - playsound(get_turf(src),'sound/machines/synth_yes.ogg', 50, 0) - else - audible_message(SPAN_WARNING("[src] blips in disappointment")) - playsound(get_turf(src), 'sound/machines/synth_no.ogg', 50, 0) - return TRUE - return ..() +/obj/machinery/power/port_gen/pacman/super/potato/use_tool(obj/item/item, mob/living/user, list/click_params) + if (!istype(item, /obj/item/reagent_containers)) + return ..() + var/datum/reagents/item_reagents = item.reagents + if (!HAS_FLAGS(item.atom_flags, ATOM_FLAG_OPEN_CONTAINER)) + to_chat(user, SPAN_WARNING("\The [item] is closed.")) + else if (!item_reagents.has_reagent(coolant_reagent)) + to_chat(user, SPAN_WARNING("\The [src] needs [initial(coolant_reagent.name)] to run.")) + else if (length(item_reagents.reagent_list) > 1) + to_chat(user, SPAN_WARNING("The contents of \the [item] is impure.")) + else + var/obj/item/reagent_containers/container = item + var/transferred = item_reagents.trans_to_holder(reagents, container.amount_per_transfer_from_this) + if (transferred) + user.visible_message( + SPAN_ITALIC("\The [user] pours something from \the [item] into \the [src]."), + SPAN_ITALIC("You pour [transferred]u from \the [item] into \the [src]."), + SPAN_ITALIC("You hear a liquid gurgling.") + ) + else + to_chat(user, SPAN_WARNING("The [src] is full.")) + return TRUE /obj/machinery/power/port_gen/pacman/super/potato/reactor name = "nuclear reactor" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food.dm index 5935eba1bfb7a..38eceee4c4c96 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food.dm @@ -48,10 +48,10 @@ M.add_chemical_effect(CE_BLOODRESTORE, 4 * removed) /datum/reagent/nutriment/proc/adjust_nutrition(mob/living/carbon/M, removed) - var/nut_removed = removed - var/hyd_removed = removed if (HAS_TRAIT(M, /singleton/trait/boon/cast_iron_stomach)) removed *= 0.1 // Unathi get most of their nutrition from meat. + var/nut_removed = removed + var/hyd_removed = removed if(nutriment_factor) M.adjust_nutrition(nutriment_factor * nut_removed) // For hunger and fatness if(hydration_factor) diff --git a/code/modules/species/outsider/vox.dm b/code/modules/species/outsider/vox.dm index 76876f8f56c6b..c459bf92d902f 100644 --- a/code/modules/species/outsider/vox.dm +++ b/code/modules/species/outsider/vox.dm @@ -79,6 +79,7 @@ ) genders = list(NEUTER) + pronouns = list(PRONOUNS_THEY_THEM, PRONOUNS_IT_ITS) descriptors = list( /datum/mob_descriptor/height = -1, /datum/mob_descriptor/build = 1, diff --git a/code/modules/ventcrawl/ventcrawl_atmospherics.dm b/code/modules/ventcrawl/ventcrawl_atmospherics.dm index d356caa32424e..f0a54cbf1497e 100644 --- a/code/modules/ventcrawl/ventcrawl_atmospherics.dm +++ b/code/modules/ventcrawl/ventcrawl_atmospherics.dm @@ -20,6 +20,9 @@ /obj/machinery/atmospherics/relaymove(mob/living/user, direction) if(user.loc != src || !(direction & initialize_directions)) //can't go in a way we aren't connecting to return + // [SIERRA-ADD] - SSINPUT + direction &= ~(direction & ~initialize_directions) + // [SIERRA-ADD] ventcrawl_to(user,findConnecting(direction),direction) /obj/machinery/atmospherics/proc/ventcrawl_to(mob/living/user, obj/machinery/atmospherics/target_move, direction) diff --git a/html/changelog.html b/html/changelog.html index a15b8931ae647..894cc1d34c1af 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -28,6 +28,96 @@

Sierra SS13

-->
+

07.02 - 2024

+

Обновления LordNest:

+
+
Humans can choke (use emote) now properly.
+
+

Обновления Spookerton:

+
+
The potato reactor and reactor reactor correctly accept vodka and coolant as coolants respectively.
+
+

Обновления emmanuelbassil:

+
+
As part of the damage standardization, can now damage closets/crates with melee attacks.
+
Damaging a closet also relays some damage to whatever's inside.
+
Secure closets/crates are tougher than regular closets/crates.
+
+ +

06.02 - 2024

+

Обновления LordNest:

+
+
Увеличил скорость пулям
+
Добавил новый звук
+
Добавил силген. Занерфил его насколько смог.
+
Добавил мультиметр. Занерфил его насколько смог.
+
Добавил новую иконку переноски силгена от которой Вольфора хватил припадок
+
Добавил силген и мультиметр на карту. Удалил окно между РД и СМО опять. Канджи, только попробуй.
+
+ +

03.02 - 2024

+

Обновления Nyvrem:

+
+
Vox have had errant thoughts of excessive identity pruned from their mindscapes. Again.
+
+

Обновления Sbotkin:

+
+
Fleet medical fatigues no longer spawn with an armband.
+
The end-of-round vote now correctly displays extend time.
+
+ +

02.02 - 2024

+

Обновления Mucker:

+
+
Brought back the good skybox.
+
+

Обновления SuhEugene:

+
+
Отключил Onyx лодаут, который возможно и создавал большие лаги сервера.
+
+ +

31.01 - 2024

+

Обновления emmanuelbassil:

+
+
Unathi no longer get as much nutrition from non-meat items
+
+ +

30.01 - 2024

+

Обновления Rockton:

+
+
Adds Komarov overmap placeholder sprites for admin use
+
+

Обновления SuhEugene:

+
+
Fixed white skybox
+
+ +

29.01 - 2024

+

Обновления LordNest:

+
+
Мыши больше не вываливаются из труб
+
Автохисс починил
+
Станбатону иконки синие приделал
+
Удалил дубли причёсок
+
Вернул Рекса
+
+

Обновления emmanuelbassil:

+
+
Radial menus now properly work when inside an exosuit
+
+ +

28.01 - 2024

+

Обновления Sbotkin:

+
+
The "Status of the Fleets" is moved to the Bridge storage.
+
+ +

27.01 - 2024

+

Обновления KandJX:

+
+
Пофиксил венты Гуппа
+
+

26.01 - 2024

Обновления LordNest:

@@ -413,129 +503,6 @@

Обновления Sbotkin:

Cobby's gender has been discovered, it's a boy!
- -

05.12 - 2023

-

Обновления BurpleBineapple:

-
-
Added toggleable NRC notifications for join, leave, and message events.
-
The NRC program is 2GQ and installed on PDAs by default.
-
Held computers can connect to NRC channels properly.
-
-

Обновления Lexanx:

-
-
IPC parts are colorable by using markings.
-
IPCs have some head accessories as hair.
-
IPCs using heads with screens can display text on the screen.
-
-

Обновления Mucker:

-
-
Re-added borg all access.
-
Removed e-guns from traitor borgs.
-
Slightly lowered the regen rate of flamer fuel for traitor borgs.
-
-

Обновления Rockton:

-
-
New placeholder sprite for the SFV Lexington overmap icon
-
-

Обновления Sbotkin:

-
-
The canister storage now can be accessed by scientists via the Petrov's maints.
-
Scientists now have access to Chlorine!
-
-

Обновления gy1ta23:

-
-
Torch pilot helmets are a selection box instead of all pre-spawned.
-
- -

04.12 - 2023

-

Обновления LordNest:

-
-
Исправил отсутствие некоторых вещей в лодауте
-
Голобомбы вернул
-
Исправил ряд мелких ошибок карты
-
- -

03.12 - 2023

-

Обновления LordNest:

-
-
Починил пропадавшие текстуры и невозможность брать протезы таярам
-
Подредачил слегка цифры котам, ничего криминального (возраст)
-
Добавил новые марки протезов для котов
-
Вернул плакаты котиков и честно наворовал протезов
-
- -

02.12 - 2023

-

Обновления UEDHighCommand:

-
-
В лодаут добавлены окрашиваемые плащи и плащи отделов. Плащи крепятся к скафандрам в качестве акксесуара;
-
В лодаут добавлены перекрашиваемые обмотки и сандали для унати.
-
- -

01.12 - 2023

-

Обновления Spookerton:

-
-
Removed the free OFD charges from the mercenary ship.
-
Added the "Structures & Vehicles" uplink category, containing 80tc OFD charges for mercenaries.
-
- -

28.11 - 2023

-

Обновления BurpleBineapple:

-
-
Prosthetic bone repair now checks for Complex Devices instead of Medicine/Anatomy
-
-

Обновления LordNest:

-
-
Теперь ТОКАМАК ГКК не должен переворачиваться в процессе работы
-
Трава теперь красивая, у ГКК починились трубы
-
-

Обновления TheNightingale:

-
-
Certain programs - computer config, email, file browser and download tool - now require less processing power to run, allowing more programs to be run consecutively.
-
Email now requires 1 GB instead of _7_.
-
-

Обновления rootoo807:

-
-
Flowers grown in hydroponics can be made into wearable hair pins by adding a piece of cable.
-
Hairflowers are now color select in loadout.
-
- -

27.11 - 2023

-

Обновления BurpleBineapple:

-
-
EMP damage is now calculated with a 1 to 3 multiplicative modifier with 3 being the pre-change damage.
-
The ion pistol now has half the fire delay it had before to differentiate it from the ion rifle.
-
EMP damage to limbs has been reduced by 50%. Torso damage remains the same.
-
EMP damage to robotic legs and feet no longer immediately weaken the victim.
-
FBPs and IPCs first fall over before being paralyzed when their battery is dead or destroyed.
-
- -

26.11 - 2023

-

Обновления Kam_Survivor:

-
-
Backswept и Ponytail 7 (alt) теперь доступны для выбора
-
-

Обновления SuhEugene:

-
-
Добавил умножение задержки на √2 для диагонального движения. Теперь оно не будет ощущаться быстрым и неправильным.
-
Убрал неплохо жрущий ресурсы сервера цикл. Возможны баги с анимацией движения вынутых из карманов, портфеля и иных мест предметов.
-
Сделал так, чтобы предметы на карго-тележке двигались с той же скоростью, что и тележка. Это та, на которой инженеры водород для раста и мамки возят.
-
Пофиксил сохранение персонажей
-
Теперь (надеюсь) абсолютно все текстовые записи в файл используют RustG
-
Обновил DLL RustG до третьей версии, чтобы не только сервер работал, но и ваша локалка могла запуститься без проблем.
-
- -

25.11 - 2023

-

Обновления KandJX:

-
-
Значительные мапфиксы.
-
ГП имеет полный доступ, кроме АВД, Капитана и Внутренних Дел.
-
Выдан доступ Research всему ЭК.
-
Выдан доступ Research Storage всему отделу РнД. Отвечает за доступы в офис и раздевалку.
-
Выдан доступ EXTERNAL информационному технику
-
Доступ к инженерному коридору убран
-
Доступ к коридору вокруг чекпойна СБ 4ой палубы изменен с ЭКСТЕРНАЛ, на (СБ, МЕД, ИНЖ).
-
Охлаждение СМ теперь будет работать. Однако все равно ждём /turf/space/open от @sprtn
-
Icons by Icons8
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 6830e3e55e9f2..a15094aae2f7e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -23088,3 +23088,87 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY sierra_genchangelog.p - soundadd: "\u041F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043B \u0437\ \u0432\u0443\u043A\u0438 \u041D\u0435\u043B\u043B\u0438 \u0434\u043B\u044F \u044F\ \u0449\u0435\u0440\u043E\u0432" +2024-01-27: + KandJX: + - bugfix: "\u041F\u043E\u0444\u0438\u043A\u0441\u0438\u043B \u0432\u0435\u043D\u0442\ + \u044B \u0413\u0443\u043F\u043F\u0430" +2024-01-28: + Sbotkin: + - maptweak: The "Status of the Fleets" is moved to the Bridge storage. +2024-01-29: + LordNest: + - bugfix: "\u041C\u044B\u0448\u0438 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\ + \ \u0432\u044B\u0432\u0430\u043B\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u0438\ + \u0437 \u0442\u0440\u0443\u0431" + - tweak: "\u0410\u0432\u0442\u043E\u0445\u0438\u0441\u0441 \u043F\u043E\u0447\u0438\ + \u043D\u0438\u043B" + - imageadd: "\u0421\u0442\u0430\u043D\u0431\u0430\u0442\u043E\u043D\u0443 \u0438\ + \u043A\u043E\u043D\u043A\u0438 \u0441\u0438\u043D\u0438\u0435 \u043F\u0440\u0438\ + \u0434\u0435\u043B\u0430\u043B" + - imagedel: "\u0423\u0434\u0430\u043B\u0438\u043B \u0434\u0443\u0431\u043B\u0438\ + \ \u043F\u0440\u0438\u0447\u0451\u0441\u043E\u043A" + - maptweak: "\u0412\u0435\u0440\u043D\u0443\u043B \u0420\u0435\u043A\u0441\u0430" + emmanuelbassil: + - bugfix: Radial menus now properly work when inside an exosuit +2024-01-30: + Rockton: + - rscadd: Adds Komarov overmap placeholder sprites for admin use + SuhEugene: + - bugfix: Fixed white skybox +2024-01-31: + emmanuelbassil: + - bugfix: Unathi no longer get as much nutrition from non-meat items +2024-02-02: + Mucker: + - bugfix: Brought back the good skybox. + SuhEugene: + - rscdel: "\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u043B Onyx \u043B\u043E\u0434\ + \u0430\u0443\u0442, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u043E\u0437\ + \u043C\u043E\u0436\u043D\u043E \u0438 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\ + \u043B \u0431\u043E\u043B\u044C\u0448\u0438\u0435 \u043B\u0430\u0433\u0438 \u0441\ + \u0435\u0440\u0432\u0435\u0440\u0430." +2024-02-03: + Nyvrem: + - tweak: Vox have had errant thoughts of excessive identity pruned from their mindscapes. + Again. + Sbotkin: + - bugfix: Fleet medical fatigues no longer spawn with an armband. + - bugfix: The end-of-round vote now correctly displays extend time. +2024-02-06: + LordNest: + - tweak: "\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u043B \u0441\u043A\u043E\u0440\ + \u043E\u0441\u0442\u044C \u043F\u0443\u043B\u044F\u043C" + - soundadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u043D\u043E\u0432\u044B\ + \u0439 \u0437\u0432\u0443\u043A" + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0441\u0438\u043B\u0433\u0435\ + \u043D. \u0417\u0430\u043D\u0435\u0440\u0444\u0438\u043B \u0435\u0433\u043E\ + \ \u043D\u0430\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u043C\u043E\u0433\ + ." + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u043C\u0443\u043B\u044C\u0442\ + \u0438\u043C\u0435\u0442\u0440. \u0417\u0430\u043D\u0435\u0440\u0444\u0438\u043B\ + \ \u0435\u0433\u043E \u043D\u0430\u0441\u043A\u043E\u043B\u044C\u043A\u043E\ + \ \u0441\u043C\u043E\u0433." + - imageadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u043D\u043E\u0432\u0443\ + \u044E \u0438\u043A\u043E\u043D\u043A\u0443 \u043F\u0435\u0440\u0435\u043D\u043E\ + \u0441\u043A\u0438 \u0441\u0438\u043B\u0433\u0435\u043D\u0430 \u043E\u0442 \u043A\ + \u043E\u0442\u043E\u0440\u043E\u0439 \u0412\u043E\u043B\u044C\u0444\u043E\u0440\ + \u0430 \u0445\u0432\u0430\u0442\u0438\u043B \u043F\u0440\u0438\u043F\u0430\u0434\ + \u043E\u043A" + - maptweak: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u0441\u0438\u043B\u0433\ + \u0435\u043D \u0438 \u043C\u0443\u043B\u044C\u0442\u0438\u043C\u0435\u0442\u0440\ + \ \u043D\u0430 \u043A\u0430\u0440\u0442\u0443. \u0423\u0434\u0430\u043B\u0438\ + \u043B \u043E\u043A\u043D\u043E \u043C\u0435\u0436\u0434\u0443 \u0420\u0414\ + \ \u0438 \u0421\u041C\u041E \u043E\u043F\u044F\u0442\u044C. \u041A\u0430\u043D\ + \u0434\u0436\u0438, \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u043F\u0440\ + \u043E\u0431\u0443\u0439." +2024-02-07: + LordNest: + - bugfix: Humans can choke (use emote) now properly. + Spookerton: + - bugfix: The potato reactor and reactor reactor correctly accept vodka and coolant + as coolants respectively. + emmanuelbassil: + - tweak: As part of the damage standardization, can now damage closets/crates with + melee attacks. + - tweak: Damaging a closet also relays some damage to whatever's inside. + - tweak: Secure closets/crates are tougher than regular closets/crates. diff --git a/maps/event/placeholders/placeholders.dm b/maps/event/placeholders/placeholders.dm index 63ac37942c3f6..09404c6ebe853 100644 --- a/maps/event/placeholders/placeholders.dm +++ b/maps/event/placeholders/placeholders.dm @@ -306,3 +306,11 @@ Middle-Click / Ctrl-Click - Jump a placeholder to a point and deselect it icon = 'gen-32.dmi' icon_state = "sf-mantaray" speed = 0.2 + +/obj/overmap/visitable/placeholder/ec_komarov + name = "SEV Komarov" + desc = "A hulking mass of redundant systems and extensive electromagnetic shielding. The hull is tattered with a myriad of warped and charred paneling, this ship looks like it just tore out from hell itself, most likely because it has. The Transponder reads, 'SEV Komarov, HSC-2-07-X'" + icon = 'scg-64.dmi' + icon_state = "ec-komarov" + pixel_x = -17 + pixel_y = -12 diff --git a/maps/event/placeholders/scg-64.dmi b/maps/event/placeholders/scg-64.dmi index f5d511f3b2d83..d96d2a49788ae 100644 Binary files a/maps/event/placeholders/scg-64.dmi and b/maps/event/placeholders/scg-64.dmi differ diff --git a/maps/sierra/datums/species/species_overrides.dm b/maps/sierra/datums/species/species_overrides.dm index 21846cf9e8ae3..49a2d057030cd 100644 --- a/maps/sierra/datums/species/species_overrides.dm +++ b/maps/sierra/datums/species/species_overrides.dm @@ -7,3 +7,30 @@ Various overrides for standart species, which are too tiny to have their own mod /obj/item/organ/internal/eyes/skrell eye_icon = 'maps/sierra/icons/mob/human_races/species/skrell/eyes.dmi' apply_eye_colour = FALSE + +// Unathi + +/datum/species/unathi + autohiss_basic_map = list( + "s" = list("ss", "sss", "ssss"), + + "с" = list("с", "сс", "ссс") + ) + autohiss_extra_map = list( + "x" = list("ks", "kss", "ksss"), + + "к" = list("х"), + + "г" = list("х"), + + "з" = list("с", "сс", "ссс"), + + "ч" = list("щ", "щщ", "щщщ"), + + "ж" = list("ш", "шш", "шшш") + + ) + autohiss_exempt = list( + LANGUAGE_UNATHI_SINTA, + LANGUAGE_UNATHI_YEOSA + ) diff --git a/maps/sierra/icons/mob/onmob/item/lefthand.dmi b/maps/sierra/icons/mob/onmob/item/lefthand.dmi new file mode 100644 index 0000000000000..0ab48a0cf6f88 Binary files /dev/null and b/maps/sierra/icons/mob/onmob/item/lefthand.dmi differ diff --git a/packs/infinity/icons/mob/onmob/items/lefthand_guns_secure.dmi b/maps/sierra/icons/mob/onmob/item/lefthand_guns_secure.dmi similarity index 100% rename from packs/infinity/icons/mob/onmob/items/lefthand_guns_secure.dmi rename to maps/sierra/icons/mob/onmob/item/lefthand_guns_secure.dmi diff --git a/maps/sierra/icons/mob/onmob/item/righthand.dmi b/maps/sierra/icons/mob/onmob/item/righthand.dmi new file mode 100644 index 0000000000000..69294665fcaa0 Binary files /dev/null and b/maps/sierra/icons/mob/onmob/item/righthand.dmi differ diff --git a/packs/infinity/icons/mob/onmob/items/righthand_guns_secure.dmi b/maps/sierra/icons/mob/onmob/item/righthand_guns_secure.dmi similarity index 100% rename from packs/infinity/icons/mob/onmob/items/righthand_guns_secure.dmi rename to maps/sierra/icons/mob/onmob/item/righthand_guns_secure.dmi diff --git a/packs/infinity/icons/obj/item/weapons.dmi b/maps/sierra/icons/obj/baton.dmi similarity index 100% rename from packs/infinity/icons/obj/item/weapons.dmi rename to maps/sierra/icons/obj/baton.dmi diff --git a/maps/sierra/icons/obj/shielding.dmi b/maps/sierra/icons/obj/shielding.dmi index 825dba510eda7..f2a1ece462d1f 100644 Binary files a/maps/sierra/icons/obj/shielding.dmi and b/maps/sierra/icons/obj/shielding.dmi differ diff --git a/maps/sierra/items/items.dm b/maps/sierra/items/items.dm index 22385dc949995..b14ebac6827c4 100644 --- a/maps/sierra/items/items.dm +++ b/maps/sierra/items/items.dm @@ -2,6 +2,12 @@ sierra specific items *******************/ +/obj/item/toy/sierramodel + name = "table-top NSV Sierra model" + desc = "This is a replica of the NSV Sierra, in 1:250th scale, on a handsome wooden stand. Small lights blink on the hull and at the engine exhaust." + icon = 'icons/obj/toy.dmi' + icon_state = "torch_model_figure" + /obj/item/storage/backpack/explorer name = "explorer backpack" desc = "A rugged backpack." @@ -453,6 +459,34 @@ Passports icon_state = "gangtool-white" region_access = ACCESS_REGION_GENERAL +// Overrides + +/obj/item/melee/baton + icon = 'maps/sierra/icons/obj/baton.dmi' + icon_state = "stunbaton" + item_state = "baton" + item_icons = list( + slot_r_hand_str = 'maps/sierra/icons/mob/onmob/item/righthand.dmi', + slot_l_hand_str = 'maps/sierra/icons/mob/onmob/item/lefthand.dmi', + ) + +/obj/item/melee/baton/on_update_icon() + if(status) + icon_state = "[initial(icon_state)]_active" + item_state = "[initial(item_state)]_active" + else if(!bcell) + icon_state = "[initial(icon_state)]_nocell" + item_state = "[initial(item_state)]" + else + icon_state = "[initial(icon_state)]" + item_state = "[initial(item_state)]" + + if(icon_state == "[initial(item_state)]_active") + set_light(1.5, 2, "#75acff") + else + set_light(0) + loc.update_icon() + #undef REMOTE_OPEN #undef REMOTE_BOLT #undef REMOTE_ELECT diff --git a/maps/sierra/items/pouches.dm b/maps/sierra/items/pouches.dm new file mode 100644 index 0000000000000..54ece2a71b43a --- /dev/null +++ b/maps/sierra/items/pouches.dm @@ -0,0 +1,19 @@ +/obj/item/clothing/accessory/storage/pouches + desc = "A collection of black pouches that can be attached to a plate carrier. Carries up to three items." + slots = 3 STORAGE_SLOTS + + +/obj/item/clothing/accessory/storage/pouches/blue + desc = "A collection of blue pouches that can be attached to a plate carrier. Carries up to three items." + + +/obj/item/clothing/accessory/storage/pouches/navy + desc = "A collection of navy blue pouches that can be attached to a plate carrier. Carries up to three items." + + +/obj/item/clothing/accessory/storage/pouches/green + desc = "A collection of green pouches that can be attached to a plate carrier. Carries up to three items." + + +/obj/item/clothing/accessory/storage/pouches/tan + desc = "A collection of tan pouches that can be attached to a plate carrier. Carries up to three items." diff --git a/maps/sierra/loadout/loadout.dm b/maps/sierra/loadout/loadout.dm index 6359524178af9..7fecbc39ef2ae 100644 --- a/maps/sierra/loadout/loadout.dm +++ b/maps/sierra/loadout/loadout.dm @@ -3,14 +3,14 @@ description = "With additional light armor plate" path = /obj/item/clothing/suit/armor/pcarrier/light cost = 25 - donation_tier = DONATION_TIER_TWO + // donation_tier = DONATION_TIER_TWO // Не открывать до Рождества /datum/gear/pmp_w_tape display_name = "music player" description = "With custom tape" path = /obj/item/music_player cost = 0 - donation_tier = DONATION_TIER_TWO + // donation_tier = DONATION_TIER_TWO // Не открывать до Рождества /datum/gear/pmp_w_tape/New() . = ..() @@ -26,28 +26,28 @@ description = "With custom tape" path = /obj/item/music_player/boombox/custom_tape cost = 0 - donation_tier = DONATION_TIER_FOUR + // donation_tier = DONATION_TIER_FOUR // Не открывать до Рождества /datum/gear/bikehorn display_name = "bike horn" description = "for real aesthetes" path = /obj/item/bikehorn cost = 0 - donation_tier = DONATION_TIER_ONE + // donation_tier = DONATION_TIER_ONE // Не открывать до Рождества /datum/gear/bikehorn/rubberducky display_name = "rubber duck" description = "QUACK" path = /obj/item/bikehorn/rubberducky cost = 0 - donation_tier = DONATION_TIER_ONE + // donation_tier = DONATION_TIER_ONE // Не открывать до Рождества /datum/gear/premium_alcohol display_name = "expensive alcohol" description = "sometimes it turns out that the bar is closed, but you want a drink." path = /obj/item/reagent_containers/food/drinks/bottle cost = 0 - donation_tier = DONATION_TIER_ONE + // donation_tier = DONATION_TIER_ONE // Не открывать до Рождества /datum/gear/premium_alcohol/New() . = ..() @@ -65,7 +65,7 @@ description = "pizza time" path = /obj/item/pizzabox cost = 0 - donation_tier = DONATION_TIER_ONE + // donation_tier = DONATION_TIER_ONE // Не открывать до Рождества /datum/gear/pizzabox/New() . = ..() @@ -82,7 +82,7 @@ description = "let's DOOT" path = /obj/item/device/synthesized_instrument cost = 0 - donation_tier = DONATION_TIER_ONE + // donation_tier = DONATION_TIER_ONE // Не открывать до Рождества /datum/gear/musical_instruments/New() . = ..() @@ -102,7 +102,7 @@ description = "Admit it, you invested so much money just for one clown costume." path = /obj/item/clothing/mask/gas/sexyclown cost = 0 - donation_tier = DONATION_TIER_THREE + // donation_tier = DONATION_TIER_THREE // Не открывать до Рождества /datum/gear/head/kittyears display_name = "kitty ears" @@ -110,13 +110,13 @@ sort_category = "Earwear" allowed_roles = null cost = 0 - donation_tier = DONATION_TIER_TWO + // donation_tier = DONATION_TIER_TWO // Не открывать до Рождества /datum/gear/mre display_name = "MRE" path = /obj/item/storage/mre cost = 0 - donation_tier = DONATION_TIER_ONE + // donation_tier = DONATION_TIER_ONE // Не открывать до Рождества /datum/gear/mre/New() . = ..() @@ -138,4 +138,4 @@ description = "Ah, I see you're a man of culture as well." path = /obj/item/material/sword/katana/replica cost = 0 - donation_tier = DONATION_TIER_TWO + // donation_tier = DONATION_TIER_TWO // Не открывать до Рождества diff --git a/maps/sierra/machinery/vendors.dm b/maps/sierra/machinery/vendors.dm index 6f21b321ffdb8..f6876204e58fc 100644 --- a/maps/sierra/machinery/vendors.dm +++ b/maps/sierra/machinery/vendors.dm @@ -312,7 +312,7 @@ products = list( /obj/item/device/flashlight = 3, /obj/item/device/multitool = 3, - // /obj/item/device/multitool/multimeter = 3, // SIERRA TODO: multimeter, + /obj/item/device/multitool/multimeter = 3, /obj/item/device/geiger = 3, /obj/item/device/scanner/gas = 3, /obj/item/device/t_scanner = 3, @@ -320,14 +320,15 @@ /obj/item/clamp = 4, /obj/item/tape_roll = 6, /obj/item/device/paint_sprayer = 2, - /obj/item/grenade/chem_grenade/metalfoam = 5 + /obj/item/grenade/chem_grenade/metalfoam = 5, + /obj/item/sealgen_case = 2 ) contraband = list( /obj/item/cell/potato = 5 ) premium = list( - /obj/item/wrench/power = 1, - /obj/item/wirecutters/power = 1 + /obj/item/swapper/power_drill = 1, + /obj/item/swapper/jaws_of_life = 1 ) /obj/machinery/vending/wallbartender diff --git a/maps/sierra/sierra.dm b/maps/sierra/sierra.dm index de73b541825dd..d504588a22c88 100644 --- a/maps/sierra/sierra.dm +++ b/maps/sierra/sierra.dm @@ -66,6 +66,7 @@ #include "items/papers.dm" #include "items/rigs.dm" #include "items/stamps.dm" + #include "items/pouches.dm" #include "items/clothing/clothing.dm" #include "items/clothing/exploration.dm" @@ -182,7 +183,7 @@ #include "../../mods/fancy_sofas/_fancy_sofas.dme" #include "../../mods/jukebox_tapes/_jukebox_tapes.dme" #include "../../mods/legalese_language/_legalese.dme" - #include "../../mods/leroy_beasts/_leroy_beasts.dme" + #include "../../mods/petting_zoo/_petting_zoo.dme" #include "../../mods/screentips/_screentips.dme" #include "../../mods/tajara/_tajara.dme" diff --git a/maps/sierra/z1-z5_sierra.dmm b/maps/sierra/z1-z5_sierra.dmm index f79e56f0b9d1d..8365b10a82493 100644 --- a/maps/sierra/z1-z5_sierra.dmm +++ b/maps/sierra/z1-z5_sierra.dmm @@ -5120,12 +5120,7 @@ /turf/simulated/floor/tiled/steel_grid, /area/shuttle/escape_pod/escape_pod1/station) "aLc" = ( -/obj/structure/bed/chair/office/comfy/purple{ - dir = 1 - }, -/obj/structure/curtain/open/bed{ - pixel_y = 32 - }, +/obj/structure/bed/chair/office/comfy/purple, /obj/landmark/start{ name = "Research Director" }, @@ -8850,7 +8845,7 @@ "bqo" = ( /obj/floor_decal/industrial/hatch/yellow, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass/engineering{ +/obj/machinery/door/airlock/glass/civilian{ name = "Central Stairwell" }, /turf/simulated/floor/tiled/monotile, @@ -15860,7 +15855,8 @@ /area/medical/staging) "ctF" = ( /obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ - dir = 1 + dir = 1; + id_tag = "guppy_shuttle_pump_out_internal" }, /obj/floor_decal/techfloor/orange{ dir = 8 @@ -29817,7 +29813,7 @@ "eqV" = ( /obj/floor_decal/corner/red/mono, /obj/structure/closet/secure_closet{ - name = "Security Equipment Locker"; + name = "Checkpoint Locker"; req_access = list("ACCESS_SECURITY") }, /obj/floor_decal/industrial/outline/yellow, @@ -44394,6 +44390,9 @@ /obj/floor_decal/borderfloor, /obj/floor_decal/corner/yellow/border, /obj/floor_decal/industrial/outline/yellow, +/obj/item/storage/briefcase/inflatable, +/obj/item/storage/briefcase/inflatable, +/obj/item/inflatable_dispenser, /turf/simulated/floor/tiled/steel_grid, /area/engineering/engine_eva) "gDD" = ( @@ -49817,7 +49816,9 @@ /obj/floor_decal/techfloor/orange{ dir = 8 }, -/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + id_tag = "guppy_shuttle_pump_out_external" + }, /turf/simulated/floor/tiled/techfloor/grid, /area/guppy_hangar/start) "htx" = ( @@ -56443,7 +56444,9 @@ /obj/floor_decal/techfloor/orange{ dir = 4 }, -/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + id_tag = "guppy_shuttle_pump_out_external" + }, /obj/machinery/airlock_sensor/airlock_exterior{ frequency = 1331; id_tag = "guppy_shuttle_exterior_sensor"; @@ -59552,17 +59555,12 @@ /area/shield/thirddeck) "iRR" = ( /obj/structure/table/woodentable/walnut, -/obj/item/reagent_containers/food/drinks/glass2/shot, -/obj/item/reagent_containers/food/drinks/bottle/premiumvodka, /obj/floor_decal/borderfloorblack{ dir = 8 }, /obj/floor_decal/corner/purple/border{ dir = 8 }, -/obj/structure/curtain/open/bed{ - pixel_y = 32 - }, /turf/simulated/floor/wood/mahogany, /area/crew_quarters/heads/office/rd/cobed) "iSd" = ( @@ -62683,7 +62681,9 @@ /turf/simulated/floor/plating, /area/maintenance/firstdeck/centralstarboard) "jrK" = ( -/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + id_tag = "guppy_shuttle_pump" + }, /obj/floor_decal/techfloor/orange{ dir = 8 }, @@ -63359,8 +63359,7 @@ /turf/simulated/floor/reinforced, /area/exploration_shuttle/airlock) "jxH" = ( -/obj/wallframe_spawn/reinforced, -/turf/simulated/floor/plating, +/turf/simulated/wall/prepainted, /area/crew_quarters/heads/office/rd/cobed) "jxI" = ( /obj/structure/cable/green{ @@ -70399,6 +70398,9 @@ }, /obj/floor_decal/industrial/outline/yellow, /obj/structure/closet/secure_closet/engineering_electrical, +/obj/item/device/multitool/multimeter, +/obj/item/device/multitool/multimeter, +/obj/item/device/multitool/multimeter, /turf/simulated/floor/tiled/steel_grid, /area/engineering/locker_room) "kyI" = ( @@ -92666,6 +92668,7 @@ d2 = 4; icon_state = "0-4" }, +/mob/living/simple_animal/hostile/commanded/rex, /turf/simulated/floor/wood/mahogany, /area/crew_quarters/heads/office/hos/cobed) "nSz" = ( @@ -105882,17 +105885,12 @@ /area/hallway/primary/thirddeck/fore) "pQa" = ( /obj/structure/table/woodentable/walnut, -/obj/item/reagent_containers/food/drinks/glass2/shot, -/obj/item/reagent_containers/food/drinks/bottle/vodka, /obj/floor_decal/borderfloorblack{ dir = 8 }, /obj/floor_decal/corner/paleblue/border{ dir = 8 }, -/obj/structure/curtain/open/bed{ - pixel_y = -32 - }, /turf/simulated/floor/wood/maple, /area/crew_quarters/heads/office/cmo/cobed) "pQe" = ( @@ -109294,9 +109292,8 @@ /turf/simulated/floor/tiled, /area/exploration_shuttle/cargo_r) "qrt" = ( -/obj/structure/bed/chair/office/comfy/teal, -/obj/structure/curtain/open/bed{ - pixel_y = -32 +/obj/structure/bed/chair/office/comfy/teal{ + dir = 1 }, /obj/landmark/start{ name = "Chief Medical Officer" @@ -111305,7 +111302,9 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/maintenance/fourthdeck/port) "qIK" = ( -/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle, +/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ + id_tag = "guppy_shuttle_pump" + }, /obj/floor_decal/techfloor/orange{ dir = 4 }, @@ -111535,9 +111534,6 @@ /obj/floor_decal/carpet/purple{ dir = 9 }, -/obj/structure/curtain/open/bed{ - pixel_y = 32 - }, /turf/simulated/floor/carpet/purple, /area/crew_quarters/heads/office/rd/cobed) "qKw" = ( @@ -131257,9 +131253,6 @@ /obj/floor_decal/carpet/blue2{ dir = 10 }, -/obj/structure/curtain/open/bed{ - pixel_y = -32 - }, /turf/simulated/floor/carpet/blue3, /area/crew_quarters/heads/office/cmo/cobed) "tDf" = ( @@ -143038,7 +143031,8 @@ /area/security/sierra/hallway/aft) "vrg" = ( /obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ - dir = 1 + dir = 1; + id_tag = "guppy_shuttle_pump_out_internal" }, /obj/floor_decal/techfloor/orange{ dir = 4 @@ -340913,7 +340907,7 @@ lsb aXe nyP sqb -hdc +jxH rdn lnL gYL @@ -341721,7 +341715,7 @@ lsb wfo tsm kqt -hdc +jxH iqj ojM xbm diff --git a/maps/torch/items/clothing/solgov-under.dm b/maps/torch/items/clothing/solgov-under.dm index 63fe70c46c870..c90c759d8b051 100644 --- a/maps/torch/items/clothing/solgov-under.dm +++ b/maps/torch/items/clothing/solgov-under.dm @@ -205,7 +205,7 @@ item_flags = ITEM_FLAG_WASHER_ALLOWED | ITEM_FLAG_INVALID_FOR_CHAMELEON /obj/item/clothing/under/solgov/utility/fleet/combat/medical - accessories = list(/obj/item/clothing/accessory/solgov/department/medical/fleet, /obj/item/clothing/accessory/armband/medblue) + accessories = list(/obj/item/clothing/accessory/solgov/department/medical/fleet) item_flags = ITEM_FLAG_WASHER_ALLOWED | ITEM_FLAG_INVALID_FOR_CHAMELEON /obj/item/clothing/under/solgov/utility/fleet/combat/command diff --git a/maps/torch/torch6_bridge.dmm b/maps/torch/torch6_bridge.dmm index a437f81063621..e4e462a423447 100644 --- a/maps/torch/torch6_bridge.dmm +++ b/maps/torch/torch6_bridge.dmm @@ -2201,7 +2201,6 @@ /obj/floor_decal/corner/blue{ dir = 10 }, -/obj/item/folder/envelope/declassified1, /obj/machinery/camera/network/bridge{ c_tag = "Bridge"; dir = 1 @@ -11492,6 +11491,7 @@ /obj/item/folder/yellow, /obj/item/folder/white, /obj/floor_decal/industrial/outline/yellow, +/obj/item/paper/dclassreport1, /turf/simulated/floor/tiled/dark/monotile, /area/bridge/storage) "Hg" = ( diff --git a/maps/torch/torch_procs.dm b/maps/torch/torch_procs.dm index 352fa294a1e5f..55e58b6ef01b6 100644 --- a/maps/torch/torch_procs.dm +++ b/maps/torch/torch_procs.dm @@ -86,11 +86,12 @@ /datum/map/torch/do_interlude_teleport(atom/movable/target, atom/destination, duration = 30 SECONDS, precision, type) var/turf/T = pick_area_turf(/area/bluespace_interlude/platform, list(/proc/not_turf_contains_dense_objects, /proc/IsTurfAtmosSafe)) - if (!T) + if (!T && destination) do_teleport(target, destination) return if (isliving(target)) to_chat(target, FONT_LARGE(SPAN_WARNING("Your vision goes blurry and nausea strikes your stomach. Where are you...?"))) do_teleport(target, T, precision, type) - addtimer(new Callback(GLOBAL_PROC, /proc/do_teleport, target, destination), duration) + if (destination) + addtimer(new Callback(GLOBAL_PROC, /proc/do_teleport, target, destination), duration) diff --git a/mods/_maps/liberia/maps/liberia.dmm b/mods/_maps/liberia/maps/liberia.dmm index 82da08c12440e..e719bc06eaeac 100644 --- a/mods/_maps/liberia/maps/liberia.dmm +++ b/mods/_maps/liberia/maps/liberia.dmm @@ -2538,8 +2538,8 @@ /area/liberia/mule) "eg" = ( /obj/structure/table/mag, -/obj/item/wirecutters/power, -/obj/item/wrench/power, +/obj/item/swapper/jaws_of_life, +/obj/item/swapper/power_drill, /obj/item/device/flashlight/upgraded, /obj/item/marshalling_wand, /obj/floor_decal/corner/brown{ diff --git a/mods/_master_files/code/modules/projectiles/projectile/bullets.dm b/mods/_master_files/code/modules/projectiles/projectile/bullets.dm new file mode 100644 index 0000000000000..e9a7676fbe891 --- /dev/null +++ b/mods/_master_files/code/modules/projectiles/projectile/bullets.dm @@ -0,0 +1,3 @@ +/obj/item/projectile/bullet + sharp = TRUE + step_delay = 0.4 diff --git a/mods/antagonists/_antagonists.dme b/mods/antagonists/_antagonists.dme index f571dcf97e1e1..911fe25f76179 100644 --- a/mods/antagonists/_antagonists.dme +++ b/mods/antagonists/_antagonists.dme @@ -3,11 +3,13 @@ #include "_antagonists.dm" +#include "code/blackout.dm" #include "code/ert.dm" #include "code/mercenary.dm" #include "code/revolutionary.dm" #include "code/operative.dm" #include "code/traitor.dm" #include "code/teleportation.dm" +#include "code/uplink.dm" #endif diff --git a/mods/antagonists/code/blackout.dm b/mods/antagonists/code/blackout.dm new file mode 100644 index 0000000000000..8d298493a3667 --- /dev/null +++ b/mods/antagonists/code/blackout.dm @@ -0,0 +1,80 @@ +// Too complex, so different file for it +// Blackout tool, used to trigger massive electricity outttage on ship or station, including connected levels. +// It may have additional shots to use, but currently balanced to one shot. + +/datum/uplink_item/item/tools/blackout + name = "High Pulse Electricity Outage Tool" + item_cost = 36 + path = /obj/item/device/blackout + desc = "A device which can create power surge in terminal, spread it in power network and temporally creating blackout." + +/obj/item/device/blackout + name = "Energy network scanner" + desc = "A device with several metal antennas. It looks like a scanner or multimeter, but this one is completely black." + icon = 'mods/antagonists/icons/obj/blackout.dmi' + icon_state = "device_blackout-off" + + var/severity = 2 + var/shots = 1 + var/lastUse = 0 + var/cooldown = (20 MINUTES) + +/obj/item/device/blackout/afterattack(obj/target, mob/user, proximity) + if(!proximity) + return + if(!istype(target)) + return + + target.add_fingerprint(user) + + if(istype(target, /obj/machinery/power/terminal)) + var/obj/machinery/power/terminal/terminal = target + + if(!terminal.powernet) + to_chat(user, SPAN_WARNING("This power station isn't connected to power net.")) + return + + if(check_to_use()) + to_chat(user, SPAN_WARNING("Device does not respond. Perhaps you need to try later.")) + return + + if(!shots) + to_chat(user, SPAN_WARNING("Device does not respond.")) + return + + hacktheenergy(terminal, user) + +/obj/item/device/blackout/proc/hacktheenergy(obj/machinery/power/terminal/terminal_in, mob/user) + if(!istype(terminal_in) || !user) return // security + + src.audible_message("Synthesized recording states, \"-- Вас приветствует Ассистент КиДжи. Начало. Производится подключение к терминалу. --\"") + if(!do_after(user, 60, terminal_in)) return + + src.audible_message("Synthesized recording states, \"-- Подключение к терминалу успешно. Начато получение информации о конфигурации электросети... --\"") + if(!do_after(user, 160, terminal_in)) return + + src.audible_message("Synthesized recording states, \"-- Сканирование корабельной электросети успешно. Начинается процедура перегрузки корабельной электросети. Не прерывайте работу терминала. --\"") + icon_state = "device_blackout-on" + playsound(src, 'sound/items/goggles_charge.ogg', 50, 1) + + if(do_after(user, 80, terminal_in)) + src.audible_message("Synthesized recording states, \"-- Перегрузка завершена. Можете отсоединять терминал. \ + Утилизируйте устройство после использования. --\"") + + shots-- + cooldown = world.time + + power_failure() + + log_and_message_admins("[key_name(usr)] used \the [src.name] on \the [admin_jump_link(terminal_in, src)] to shutdown entire ship.") + + icon_state = "device_blackout-off" + +/obj/item/device/blackout/proc/check_to_use() + return lastUse <= (world.time - cooldown) + +/obj/item/device/blackout/examine(mob/user) + . = ..() + if (isobserver(user) || (user.mind && user.mind.special_role != null) || user.skill_check(SKILL_DEVICES, SKILL_EXPERIENCED) || user.skill_check(SKILL_ELECTRICAL, SKILL_EXPERIENCED)) + to_chat(user, "This device appears to be able to send a signal to overload the power grid. ") + return diff --git a/mods/antagonists/code/operative.dm b/mods/antagonists/code/operative.dm index 9b3644ea5150b..a2fe9515d1a12 100644 --- a/mods/antagonists/code/operative.dm +++ b/mods/antagonists/code/operative.dm @@ -59,6 +59,6 @@ /obj/item/clothing/mask/gas/syndicate, /obj/item/storage/backpack/dufflebag/syndie_kit/plastique, /obj/item/storage/box/anti_photons, - /obj/item/device/encryptionkey/syndicate, + /obj/item/device/encryptionkey/syndie_full, /obj/item/card/emag ) diff --git a/mods/antagonists/code/traitor.dm b/mods/antagonists/code/traitor.dm index 15331e19b5362..ad58cade54310 100644 --- a/mods/antagonists/code/traitor.dm +++ b/mods/antagonists/code/traitor.dm @@ -42,16 +42,6 @@ airlock.ex_act(1) qdel(src) -// -// Uplink part -// - -/datum/uplink_item/item/tools/door_charge - name = "Door Charge" - desc = "Special explosive, which can be planted on doors and will explode when somebody will open this door." - item_cost = 14 - path = /obj/item/door_charge - // // BLUESPACE JAUNTER // @@ -107,31 +97,10 @@ to_chat(user, "You can't link [src] to [target]!") update_icon() -// -// Uplink part -// - /obj/item/storage/box/syndie_kit/jaunter startswith = list(/obj/item/device/syndietele, /obj/item/device/syndiejaunter) -/datum/uplink_item/item/tools/jaunter - name = "Bluespace Jaunter" - item_cost = 42 - path = /obj/item/storage/box/syndie_kit/jaunter - desc = "Disposable one way teleportation device. Use with care. Don't forget to link jaunter to the beacon!" - - -// -// Psi Amp - Uplink part (Here because turned off by Bay12) -// - -/datum/uplink_item/item/visible_weapons/psi_amp - name = "Cerebroenergetic Psionic Amplifier" - item_cost = 50 - path = /obj/item/clothing/head/helmet/space/psi_amp/lesser - desc = "A powerful, illegal psi-amp. Boosts latent psi-faculties to extremely high levels." - // // HOLOBOMBS // @@ -215,12 +184,88 @@ startswith = list(/obj/item/device/holobomb = 5, /obj/item/paper/holobomb = 1) // -// Holobombs - Uplink part +// Poison // -/datum/uplink_item/item/tools/holobomb - name = "Box of holobombs" - item_cost = 32 - path =/obj/item/storage/box/syndie_kit/holobombs - desc = "Contains 5 holobomb and instruction. \ - A bomb that changes appearance, and can destroy some hands." +/obj/item/storage/box/syndie_kit/bioterror + startswith = list( + /obj/item/reagent_containers/glass/beaker/vial/random/toxin/bioterror = 7 + ) + +/obj/item/reagent_containers/glass/beaker/vial/random/toxin/bioterror + random_reagent_list = list( + list(/datum/reagent/drugs/mindbreaker = 10, /datum/reagent/drugs/hextro = 20) = 2, + list(/datum/reagent/toxin/carpotoxin = 30) = 2, + list(/datum/reagent/impedrezene = 30) = 2, + list(/datum/reagent/mutagen = 30) = 2, + list(/datum/reagent/toxin/amatoxin = 30) = 2, + list(/datum/reagent/drugs/cryptobiolin = 30) = 2, + list(/datum/reagent/impedrezene = 30) = 2, + list(/datum/reagent/toxin/potassium_chlorophoride = 30) = 2, + list(/datum/reagent/acid/polyacid = 30) = 2, + list(/datum/reagent/radium = 30) = 2, + list(/datum/reagent/toxin/zombiepowder = 30) = 1) + +// Key + +/obj/item/device/encryptionkey/syndie_full + icon_state = "cypherkey" + channels = list("Mercenary" = 1, "Command" = 1, "Security" = 1, "Engineering" = 1, "Exploration" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1) + origin_tech = list(TECH_ESOTERIC = 3) + syndie = 1 + +// Stimm + +/obj/item/reagent_containers/hypospray/autoinjector/stimpack + name = "stimpack" + band_color = COLOR_PINK //inf //was: COLOR_DARK_GRAY + starts_with = list(/datum/reagent/nitritozadole = 5) + +/datum/reagent/nitritozadole + name = "Nitritozadole" + description = "Nitritozadole is a very dangerous mix, which can increase your speed temporarly." + taste_description = "metal" + reagent_state = LIQUID + color = "#ff2681" + metabolism = REM * 0.20 + overdose = REAGENTS_OVERDOSE / 3 + value = 4.5 + +/datum/reagent/nitritozadole/affect_blood(mob/living/carbon/M, alien, removed) + if(alien == SPECIES_DIONA) + return + + if(prob(2)) + to_chat(M, SPAN_DANGER("My heart gonna break out from the chest!")) + M.stun_effect_act(0, 15, BP_CHEST, "heart damage") //a small pain without damage + if(prob(15)) + for(var/obj/item/organ/internal/heart/H in M.internal_organs) + H.damage += 1 + + if(prob(5)) + M.emote(pick("twitch", "blink_r", "shiver")) + M.add_chemical_effect(CE_SPEEDBOOST, 1.5) + M.add_chemical_effect(CE_PULSE, 3) + + +// Radlaser + +/obj/item/device/scanner/health/syndie + name = "health analyzer" + desc = "A hand-held body scanner able to distinguish vital signs of the subject." + item_flags = ITEM_FLAG_NO_BLUDGEON + matter = list(MATERIAL_ALUMINIUM = 200) + origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 2, TECH_ESOTERIC = 2) + +/obj/item/device/scanner/health/syndie/scan(mob/living/carbon/human/A, mob/user) + playsound(src, 'sound/effects/fastbeep.ogg', 20) + if(!istype(A)) + return + + A.apply_damage(30, DAMAGE_RADIATION, damage_flags = DAMAGE_FLAG_DISPERSED) + +/obj/item/device/scanner/health/syndie/examine(mob/user) + . = ..() + if (isobserver(user) || (user.mind && user.mind.special_role != null) || user.skill_check(SKILL_DEVICES, SKILL_MASTER) || user.skill_check(SKILL_MEDICAL, SKILL_MASTER)) + to_chat(user, "The scanner contacts do not look as they should. ") + return diff --git a/mods/antagonists/code/uplink.dm b/mods/antagonists/code/uplink.dm new file mode 100644 index 0000000000000..0d07d687bfd62 --- /dev/null +++ b/mods/antagonists/code/uplink.dm @@ -0,0 +1,93 @@ +// +// DOOR CHARGE Uplink part +// + +/datum/uplink_item/item/tools/door_charge + name = "Door Charge" + desc = "Special explosive, which can be planted on doors and will explode when somebody will open this door." + item_cost = 14 + path = /obj/item/door_charge + +// +// JAINTER Uplink part +// + +/datum/uplink_item/item/tools/jaunter + name = "Bluespace Jaunter" + item_cost = 42 + path = /obj/item/storage/box/syndie_kit/jaunter + desc = "Disposable one way teleportation device. Use with care. Don't forget to link jaunter to the beacon!" + +// +// Psi Amp - Uplink part (Here because turned off by Bay12) +// + +/datum/uplink_item/item/visible_weapons/psi_amp + name = "Cerebroenergetic Psionic Amplifier" + item_cost = 50 + path = /obj/item/clothing/head/helmet/space/psi_amp/lesser + desc = "A powerful, illegal psi-amp. Boosts latent psi-faculties to extremely high levels." + +// +// Holobombs - Uplink part +// + +/datum/uplink_item/item/tools/holobomb + name = "Box of holobombs" + item_cost = 32 + path =/obj/item/storage/box/syndie_kit/holobombs + desc = "Contains 5 holobomb and instruction. \ + A bomb that changes appearance, and can destroy some hands." + +// +// С-4 pack - Uplink part +// + +/datum/uplink_item/item/tools/plastique_bag + name = "Box of holobombs" + item_cost = 48 + path =/obj/item/storage/backpack/dufflebag/syndie_kit/plastique + desc = "Contains 6 C-4 charges at 50% discount." + +// +// Poison - Uplink part +// + +/datum/uplink_item/item/tools/bioterror + name = "Poisons kit" + desc = "A box, containing 7 vials of random and very deadly poisons." + item_cost = 48 + path = /obj/item/storage/box/syndie_kit/bioterror + +// +// Encrypt key - Uplink part +// + +/datum/uplink_item/item/tools/encryptionkey_full + name = "Special Encryption Key" + desc = "This headset encryption key will allow you listen and speak on any channel! Use a screwdriver on your headset to exchange keys." + item_cost = 24 + path = /obj/item/device/encryptionkey/syndie_full + +// Stimpack + +/datum/uplink_item/item/tools/stimpack + name = "Stimpack" + desc = "Autoinjector, containing 5u of experimental stimulants, that will increase your speed temporarly." + item_cost = 18 + antag_costs = list(MODE_MERCENARY = 12) + path = /obj/item/reagent_containers/hypospray/autoinjector/stimpack + +// Radlaser + +/datum/uplink_item/item/tools/radlaser + name = "Radioactive Microlaser" + item_cost = 18 + path = /obj/item/device/scanner/health/syndie + desc = "A tiny microlaser, hidden in health analyzer, that can irradiate your targets." + +/datum/uplink_item/item/tools/blackout + name = "High Pulse Electricity Outage Tool" + item_cost = 24 + path = /obj/item/device/blackout + desc = "A device which can create power surge in terminal, spread it in power network and temporally creating blackout." diff --git a/mods/antagonists/icons/obj/blackout.dmi b/mods/antagonists/icons/obj/blackout.dmi new file mode 100644 index 0000000000000..a0d4df3eeef5c Binary files /dev/null and b/mods/antagonists/icons/obj/blackout.dmi differ diff --git a/mods/global_modpacks.dm b/mods/global_modpacks.dm index 7ef38996b18a9..227eca056369d 100644 --- a/mods/global_modpacks.dm +++ b/mods/global_modpacks.dm @@ -2,13 +2,13 @@ #include "ai/_ai.dme" #include "body_markings/_body_markings.dme" #include "client_verbs/_client_verbs.dme" -#include "don_loadout/_don_loadout.dme" +// #include "don_loadout/_don_loadout.dme" // Не открывать до Рождества #include "eris_announcer/_eris_announcer.dme" #include "emote_panel/_emote_panel.dme" #include "ex666_ecosystem/_ex666_ecosystem.dme" #include "expanded_culture_descriptor/_expanded_culture_descriptor.dme" #include "gliding/_gliding.dme" -#include "gravity_generator/_gravity_generator.dme" +#include "machinery/_machinery.dme" #include "hairs_ports/_hairs_ports.dme" #include "hardsuits/_hardsuits.dme" #include "sprite_accessories/_sprite_accessories.dme" @@ -21,5 +21,6 @@ #include "ssinput/_ssinput.dme" #include "statusbar/_statusbar.dme" #include "utf8/_utf8.dme" +#include "utility_items/_utility_items.dme" #include "../packs/sierra-tweaks/_pack.dm" diff --git a/mods/gravity_generator/_gravity_generator.dm b/mods/gravity_generator/_gravity_generator.dm deleted file mode 100644 index 047faf5554987..0000000000000 --- a/mods/gravity_generator/_gravity_generator.dm +++ /dev/null @@ -1,5 +0,0 @@ - -/singleton/modpack/leroy_beasts - name = "Генератор гравитации" - desc = "Машина, что генерирует гравитацию на главном корабле карты. Добавляет ему провода и более знакомое игрокам Infinity Sierra поведение." - author = "Сумасандаран Самалан Бабан" diff --git a/mods/gravity_generator/_gravity_generator.dme b/mods/gravity_generator/_gravity_generator.dme deleted file mode 100644 index 31f732737f870..0000000000000 --- a/mods/gravity_generator/_gravity_generator.dme +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef MODPACK_GRAVITY_GENERATOR -#define MODPACK_GRAVITY_GENERATOR - -#include "_gravity_generator.dm" - -#include "code/base.dm" -#include "code/main.dm" -#include "code/wires.dm" - -#endif diff --git a/mods/hairs_ports/code/_accessory_hair.dm b/mods/hairs_ports/code/_accessory_hair.dm index 0e0bbeab39175..3dfd957cd056c 100644 --- a/mods/hairs_ports/code/_accessory_hair.dm +++ b/mods/hairs_ports/code/_accessory_hair.dm @@ -41,9 +41,6 @@ /datum/sprite_accessory/hair/modpack_hairs_port/aurora_belenko name = "Belenko" icon_state = "hair_belenko" -/datum/sprite_accessory/hair/modpack_hairs_port/aurora_braid_grande - name = "Braid Grande" - icon_state = "hair_braid_grande" /datum/sprite_accessory/hair/modpack_hairs_port/aurora_afrobig name = "Afro Big" icon_state = "hair_afrobig" @@ -51,9 +48,6 @@ /datum/sprite_accessory/hair/modpack_hairs_port/aurora_bangshort name = "Bang Short" icon_state = "hair_bangshort" -/datum/sprite_accessory/hair/modpack_hairs_port/aurora_braid_medium - name = "Braid Medium" - icon_state = "hair_braid_medium" /datum/sprite_accessory/hair/modpack_hairs_port/aurora_bun_casual name = "Bun Casual" icon_state = "hair_bun_casual" @@ -116,9 +110,6 @@ /datum/sprite_accessory/hair/modpack_hairs_port/inf_pigtails_kagami name = "Pigtails Kagami" icon_state = "hair_pigtails_kagami" -/datum/sprite_accessory/hair/modpack_hairs_port/inf_ponytail_hayasaka - name = "Ponytail Hayasaka" - icon_state = "hair_ponytail_hayasaka" /datum/sprite_accessory/hair/modpack_hairs_port/inf_roxy name = "Roxy" icon_state = "hair_roxy" @@ -167,9 +158,6 @@ /datum/sprite_accessory/hair/modpack_hairs_port/inf_pigtails_low name = "Pigtail Slow" icon_state = "hair_pigtails_low" -/datum/sprite_accessory/hair/modpack_hairs_port/inf_ponytailpiky - name = "Ponytail Spiky" - icon_state = "hair_ponytailpiky" /datum/sprite_accessory/hair/modpack_hairs_port/inf_toph name = "Toph" icon_state = "hair_toph" diff --git a/mods/leroy_beasts/_leroy_beasts.dm b/mods/leroy_beasts/_leroy_beasts.dm deleted file mode 100644 index 1b4c5dfaa6da6..0000000000000 --- a/mods/leroy_beasts/_leroy_beasts.dm +++ /dev/null @@ -1,5 +0,0 @@ - -/singleton/modpack/leroy_beasts - name = "Leroy's Beasts" - desc = "Набор различных зверей от Лероя: мейн-кун, каракал, несколько пород собак, горилла, лягушка, кролик и много других." - author = "Papa Leroy#5647" diff --git a/mods/leroy_beasts/_leroy_beasts.dme b/mods/leroy_beasts/_leroy_beasts.dme deleted file mode 100644 index 8271737bdb306..0000000000000 --- a/mods/leroy_beasts/_leroy_beasts.dme +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef MODPACK_LEROY_BEASTS -#define MODPACK_LEROY_BEASTS - -#include "_leroy_beasts.dm" -#include "code/beasts.dm" - -#endif diff --git a/mods/gravity_generator/README.md b/mods/machinery/README.md similarity index 97% rename from mods/gravity_generator/README.md rename to mods/machinery/README.md index 9a99b563d2be3..1f135bf042564 100644 --- a/mods/gravity_generator/README.md +++ b/mods/machinery/README.md @@ -2,6 +2,7 @@ #### Список PRов: - https://github.com/SierraBay/SierraBay12/pull/797 +- https://github.com/SierraBay/SierraBay12/pull/1847 -## Генератор гравитации +## Машинерия -ID мода: GRAVITY_GENERATOR +ID мода: MACHINERY + + +## Мод-пример + +ID мода: PETTING_ZOO + + +### Описание мода + +Различное зверьё + + +### Изменения *кор кода* + +- `Отсутствуют` + + +### Оверрайды + +- `Отсутствуют` + + + +### Дефайны + +- `Отсутствуют` + + +### Используемые файлы, не содержащиеся в модпаке + +- `Отсутствуют` + + +### Авторы: + +LordNest (Code) +PapaLeroy (Sprites) +Zhuzhila (AI) + diff --git a/mods/petting_zoo/_petting_zoo.dm b/mods/petting_zoo/_petting_zoo.dm new file mode 100644 index 0000000000000..d22c828906b69 --- /dev/null +++ b/mods/petting_zoo/_petting_zoo.dm @@ -0,0 +1,5 @@ + +/singleton/modpack/petting_zoo + name = "Petting Zoo" + desc = "Контактный зоопарк имени Папы Лероя. Добавляет различных животных в билд." + author = "Papa Leroy#5647, LordNest" diff --git a/mods/petting_zoo/_petting_zoo.dme b/mods/petting_zoo/_petting_zoo.dme new file mode 100644 index 0000000000000..e0ea31aeeca28 --- /dev/null +++ b/mods/petting_zoo/_petting_zoo.dme @@ -0,0 +1,12 @@ +#ifndef MODPACK_PETTING_ZOO +#define MODPACK_PETTING_ZOO + +#include "_petting_zoo.dm" +#include "code/beasts.dm" +#include "code/commanded.dm" +#include "code/datums.dm" +#include "code/fox.dm" +#include "code/koala.dm" +#include "code/rabbit.dm" + +#endif diff --git a/mods/leroy_beasts/code/beasts.dm b/mods/petting_zoo/code/beasts.dm similarity index 88% rename from mods/leroy_beasts/code/beasts.dm rename to mods/petting_zoo/code/beasts.dm index a7ce2a9d5cbcf..30cc0963daceb 100644 --- a/mods/leroy_beasts/code/beasts.dm +++ b/mods/petting_zoo/code/beasts.dm @@ -1,7 +1,7 @@ /mob/living/simple_animal/butterfly name = "butterfly" desc = "A colorful butterfly, how'd it get up here?" - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x32.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x32.dmi' icon_state = "butterfly" icon_living = "butterfly" icon_dead = "butterfly_dead" @@ -31,7 +31,7 @@ /mob/living/simple_animal/friendly/cat/maine_coon name = "maine coon" desc = "What a hell of a cat!" - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x32.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x32.dmi' icon_state = "maine_coon" item_state = "maine_coon" icon_living = "maine_coon" @@ -42,7 +42,7 @@ /mob/living/simple_animal/friendly/cat/floppa name = "caracal" desc = "Well-known for distinctive tassels on its ears and a strong urge for dumplings." - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x64.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x64.dmi' icon_state = "caracal" item_state = "caracal" icon_living = "caracal" @@ -61,7 +61,7 @@ // Dogs. Some kind of happinies is measured out in miles. What makes you think you're something special when you smile? /mob/living/simple_animal/friendly/dogs - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x32.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x32.dmi' speak_emote = list("barks", "woofs") turns_per_move = 10 response_help = "pets" @@ -88,19 +88,6 @@ emote_hear = list("woofs", "barks") speak = list("Bark!", "Woof!") -/mob/living/simple_animal/friendly/dogs/german - name = "german shepherd" - real_name = "german shepherd" - desc = "That very type of a dog that appears in everybody's mind in the first place." - icon_state = "german_shepherd" - icon_living = "german_shepherd" - icon_dead = "german_shepherd_dead" - -/mob/living/simple_animal/friendly/dogs/german/black - icon_state = "german_shepherd_black" - icon_living = "german_shepherd_black" - icon_dead = "german_shepherd_black_dead" - /mob/living/simple_animal/friendly/dogs/pug // Some kind of solitude is measured out in you name = "pug" real_name = "pug" @@ -115,14 +102,6 @@ ai_holder = /datum/ai_holder/simple_animal/passive/corgi say_list_type = /datum/say_list/corgi //we don't need repeat main say list here, aren't we? -/mob/living/simple_animal/friendly/dogs/golden_retriever - name = "golden retriever" - real_name = "golden retriever" - desc = "Your perfect companion." - icon_state = "golden_retriever" - icon_living = "golden_retriever" - icon_dead = "golden_retriever_dead" - /mob/living/simple_animal/friendly/dogs/shiba_inu name = "shiba inu" real_name = "shiba inu" @@ -131,20 +110,12 @@ icon_living = "shiba_inu" icon_dead = "shiba_inu_dead" -/mob/living/simple_animal/friendly/dogs/bullterrier - name = "bullterrier" - real_name = "bullterrier" - desc = "Don't tempt this perky guy." - icon_state = "bullterrier" - icon_living = "bullterrier" - icon_dead = "bullterrier_dead" - // Big Mon'keigh, ahem, just a normal gorilla /mob/living/simple_animal/hostile/gorilla name = "gorilla" desc = "A ground-dwelling, predominantly herbivorous ape that inhabits the tropic forests." - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x32.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x32.dmi' icon_state = "gorilla" icon_living = "gorilla" icon_dead = "gorilla_dead" @@ -180,7 +151,7 @@ /mob/living/simple_animal/friendly/frog name = "frog" desc = "They seem a little sad." - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x32.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x32.dmi' icon_state = "frog" icon_living = "frog" icon_dead = "frog_dead" @@ -218,7 +189,7 @@ gender = PLURAL health = 15 maxHealth = 15 - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x32.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x32.dmi' icon_state = "rabbit" icon_living = "rabbit" icon_dead = "rabbit_dead" @@ -253,7 +224,7 @@ name = "kangaroo" real_name = "kangaroo" desc = "A large marsupial herbivore. It has powerful hind legs, with nails that resemble long claws." - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x64.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x64.dmi' icon_state = "kangaroo" // Credit: FoS icon_living = "kangaroo" icon_dead = "kangaroo_dead" @@ -277,7 +248,7 @@ /mob/living/simple_animal/friendly/lizard/axolotl name = "axolotl" desc = "A cute tiny axolotl. And it's just like you - has no brain as well!" - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x32.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x32.dmi' icon_state = "axolotl" icon_living = "axolotl" icon_dead = "axolotl_dead" @@ -286,7 +257,7 @@ /mob/living/simple_animal/friendly/megamoth name = "big moff" desc = "Keep it away from fire." - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x32.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x32.dmi' icon_state = "megamoth" icon_living = "megamoth" icon_dead = "megamoth_dead" @@ -314,7 +285,7 @@ /mob/living/simple_animal/hostile/panther name = "panther" desc = "A long sleek, black cat with sharp teeth and claws." - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x64.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x64.dmi' icon_state = "panther" icon_living = "panther" icon_dead = "panther_dead" @@ -373,7 +344,7 @@ /mob/living/simple_animal/hostile/panther/lion name = "lion" desc = "The proud bearer of his majestic mane." - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x64.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x64.dmi' icon_state = "lion" icon_living = "lion" icon_dead = "lion_dead" @@ -393,7 +364,7 @@ see_in_dark = 5 turns_per_move = 10 density = FALSE - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x32.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x32.dmi' ai_holder = /datum/ai_holder/simple_animal/passive /mob/living/simple_animal/penguin/emperor @@ -444,7 +415,7 @@ /mob/living/simple_animal/hostile/retaliate/reindeer name = "reindeer" desc = "The king of tundra, extremely endurant beast." - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x64.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x64.dmi' icon_state = "reindeer" icon_living = "reindeer" icon_dead = "reindeer_dead" @@ -490,7 +461,7 @@ /mob/living/simple_animal/pet/sloth name = "sloth" desc = "An adorable, sleepy creature. Still twice more productive than most of the crewmembers." - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x32.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x32.dmi' icon_state = "sloth" icon_living = "sloth" icon_dead = "sloth_dead" @@ -516,7 +487,7 @@ // Override of legacy space bear /mob/living/simple_animal/hostile/bear - icon = 'mods/leroy_beasts/icons/leroy_beasts_32x64.dmi' + icon = 'mods/petting_zoo/icons/leroy_beasts_32x64.dmi' icon_state = "brown_bear" icon_living = "brown_bear" icon_dead = "brown_bear_dead" diff --git a/mods/petting_zoo/code/commanded.dm b/mods/petting_zoo/code/commanded.dm new file mode 100644 index 0000000000000..45bb59fb8d684 --- /dev/null +++ b/mods/petting_zoo/code/commanded.dm @@ -0,0 +1,161 @@ +/mob/living/simple_animal/hostile/commanded/rex + var/list/possible_natural_weapon // Rex can attack with random natural weapon + name = "Rex" + desc = "A large.... dog?" + + icon_state = "lavadog" + icon_living = "lavadog" + icon_dead = "lavadog_dead" + + + health = 45 + maxHealth = 45 + speed = 8 + + density = TRUE + + natural_weapon = /obj/item/natural_weapon/bite + possible_natural_weapon = list(/obj/item/natural_weapon/bite, /obj/item/natural_weapon/claws) + can_escape = TRUE + + max_gas = list(GAS_PHORON = 10, GAS_CO2 = 10) + + response_help = "pets" + response_harm = "bites" + response_disarm = "pushes" + + known_commands = list("stay", "stop", "attack", "follow", "guard", "forget master", "obey", "forget target") + ai_holder = /datum/ai_holder/simple_animal/melee/commanded + +/mob/living/simple_animal/hostile/commanded/rex/get_natural_weapon() + if(natural_weapon) + qdel(natural_weapon) + natural_weapon = pick(possible_natural_weapon) + return ..() + +/mob/living/simple_animal/hostile/commanded/rex/hear_say(message, verb = "says", datum/language/language = null, alt_name = "", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol) + + if(!master && istype(speaker, /mob/living/carbon/human)) + var/mob/living/carbon/human/S = speaker + if ("ACCESS_HEAD_OF_SECURITY" in S.GetAccess()) + master = S + ai_holder.leader = S + friends |= weakref(S) + allowed_targets -= S + S.guards += src + ..() + +/mob/living/simple_animal/hostile/commanded/rex/can_use_item(obj/item/O, mob/user) + if(istype(O, /obj/item/reagent_containers/food/snacks/meat) && stat != DEAD) + if(user != master) + visible_message(SPAN_WARNING("\The [src] started to growl")) + else + visible_message(SPAN_NOTICE("\The [user] start feeding the [src] [O]")) + if(do_after(user, 30, src)) + var/prev_AI_busy = ai_holder.busy + set_AI_busy(FALSE) + heal_overall_damage(10, 10) + qdel(O) + visible_message(SPAN_NOTICE("\The [src] ate [O]")) + set_AI_busy(prev_AI_busy) + + else + ..() + +/mob/living/simple_animal/hostile/commanded/rex/attack_hand(mob/living/carbon/human/target) + if(target.a_intent != I_HELP && retribution) //assume he wants to hurt us. + var/dealt_damage = harm_intent_damage + var/harm_verb = response_harm + if(ishuman(target) && target.species) + var/datum/unarmed_attack/attack = target.get_unarmed_attack(src) + dealt_damage = max(dealt_damage, attack.damage) + harm_verb = pick(attack.attack_verb) + if(attack.sharp || attack.edge) + adjustBleedTicks(dealt_damage) + + adjustBruteLoss(dealt_damage) + target.visible_message(SPAN_WARNING("[target] [harm_verb] \the [src]!")) + target.do_attack_animation(src) + + if((target == master) && prob(80)) + visible_message(SPAN_WARNING("The [src] whines")) + return TRUE + + target_mob = target + allowed_targets |= target + stance = STANCE_ATTACK + friends |= weakref(target) + set_AI_busy(FALSE) + ai_holder.react_to_attack(target) + return TRUE + + + else if(target.a_intent == I_HELP) + if((target == master) || (weakref(target) in friends)) + visible_message("The [src] wags its tail") + if(prob(20)) + say("Wuff!") + return TRUE + + visible_message(SPAN_WARNING("\The [src] started to growl")) + if(prob(10)) + attack_target(target) + + . = ..() + +/mob/living/simple_animal/hostile/commanded/dog + icon = 'mods/petting_zoo/icons/leroy_beasts_32x32.dmi' + speak_emote = list("barks", "woofs") + turns_per_move = 10 + response_help = "pets" + response_disarm = "bops" + response_harm = "kicks" + see_in_dark = 5 + mob_size = 15 + possession_candidate = 1 + pass_flags = PASS_FLAG_TABLE + density = FALSE + + meat_type = /obj/item/reagent_containers/food/snacks/meat/corgi + meat_amount = 5 + skin_material = MATERIAL_SKIN_FUR_ORANGE + + var/obj/item/inventory_head + var/obj/item/inventory_back + + ai_holder = /datum/ai_holder/simple_animal/melee/commanded + say_list_type = /datum/say_list/dog + +/datum/say_list/dog + emote_see = list("wiggles its tail warily", "scratches itself") + emote_hear = list("woofs", "barks") + speak = list("Bark!", "Woof!") + +/mob/living/simple_animal/hostile/commanded/dog/german + name = "german shepherd" + real_name = "german shepherd" + desc = "That very type of a dog that appears in everybody's mind in the first place." + icon_state = "german_shepherd" + icon_living = "german_shepherd" + icon_dead = "german_shepherd_dead" + +/mob/living/simple_animal/hostile/commanded/dog/german/black + icon_state = "german_shepherd_black" + icon_living = "german_shepherd_black" + icon_dead = "german_shepherd_black_dead" + +/mob/living/simple_animal/hostile/commanded/dog/golden_retriever + name = "golden retriever" + real_name = "golden retriever" + desc = "Your perfect companion." + icon_state = "golden_retriever" + icon_living = "golden_retriever" + icon_dead = "golden_retriever_dead" + +/mob/living/simple_animal/hostile/commanded/dog/bullterrier + name = "bullterrier" + real_name = "bullterrier" + desc = "Don't tempt this perky guy." + icon_state = "bullterrier" + icon_living = "bullterrier" + icon_dead = "bullterrier_dead" diff --git a/mods/petting_zoo/code/datums.dm b/mods/petting_zoo/code/datums.dm new file mode 100644 index 0000000000000..139aa6fcc9a3e --- /dev/null +++ b/mods/petting_zoo/code/datums.dm @@ -0,0 +1,319 @@ +#define COMMANDED_STOP 6 //basically 'do nothing' +#define COMMANDED_FOLLOW 7 //follows a target +#define COMMANDED_MISC 8 //catch all state for misc commands that need one. + +/mob/living/carbon + var/list/guards = list() // We need this list here + +/mob/living/simple_animal/hostile/commanded + name = "commanded" + stance = COMMANDED_STOP + natural_weapon = /obj/item/natural_weapon + density = FALSE + var/list/command_buffer = list() + var/list/known_commands = list("stay", "stop", "attack", "follow", "guard", "forget master", "forget target", "obey") + var/mob/master = null //undisputed master. Their commands hold ultimate sway and ultimate power. + var/list/allowed_targets = list() //WHO CAN I KILL D: + var/retribution = 1 //whether or not they will attack us if we attack them like some kinda dick. + var/list/protected_mobs = list() // who under our protection + + ai_holder = /datum/ai_holder/simple_animal/melee/commanded + +/datum/ai_holder/simple_animal/melee/commanded/can_attack(atom/movable/the_target, vision_required) + var/mob/living/simple_animal/hostile/commanded/H = holder + if(!(the_target in H.allowed_targets)) + return FALSE + return ..() + +/datum/ai_holder/simple_animal/melee/commanded/find_target(list/possible_targets, has_targets_list) + ai_log("commanded/find_target() : Entered.", AI_LOG_TRACE) + var/mob/living/simple_animal/hostile/commanded/C = holder + if(!length(C.allowed_targets)) + return null + var/mode = "specific" + if(C.allowed_targets[1] == "everyone") //we have been given the golden gift of murdering everything. Except our master, of course. And our friends. So just mostly everyone. + mode = "everyone" + for(var/atom/A in list_targets()) + var/mob/M = null + if(A == src) + continue + if(isliving(A)) + M = A + if(M && M.stat) + continue + if(mode == "specific") + if(!(A in C.allowed_targets)) + continue + C.stance = STANCE_IDLE + give_target(A) + return A + else + C.allowed_targets += A + if(M == C.master || (weakref(M) in C.friends)) + continue + C.stance = STANCE_IDLE + give_target(M) + return A + return ..() + +/mob/living/simple_animal/hostile/commanded/hear_say(message, verb = "says", datum/language/language = null, alt_name = "", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol) + if(((weakref(speaker) in friends) && !master) || speaker == master) + command_buffer.Add(speaker) + command_buffer.Add(lowertext(html_decode(message))) + return FALSE + +/mob/living/simple_animal/hostile/commanded/hear_radio(message, verb="says", datum/language/language=null, part_a, part_b, part_c, mob/speaker = null, hard_to_hear = 0) + if(((weakref(speaker) in friends) && !master) || speaker == master) + command_buffer.Add(speaker) + command_buffer.Add(lowertext(html_decode(message))) + return FALSE + +/mob/living/simple_animal/hostile/commanded/Life() + . = ..() + if(!.) + return FALSE + while(length(command_buffer) > 0) + var/mob/speaker = command_buffer[1] + var/text = command_buffer[2] + var/filtered_name = lowertext(html_decode(name)) + if(dd_hasprefix(text,filtered_name) || dd_hasprefix(text,"everyone") || dd_hasprefix(text, "everybody")) //in case somebody wants to command 8 bears at once. + var/substring = copytext(text,length(filtered_name)+1) //get rid of the name. + listen(speaker,substring) + command_buffer.Remove(command_buffer[1],command_buffer[2]) + . = ..() + if(.) + switch(stance) + if(COMMANDED_FOLLOW) + follow_target() + if(COMMANDED_STOP) + commanded_stop() + + +//TODO:use AI following behaviour +/mob/living/simple_animal/hostile/commanded/proc/follow_target() + set_AI_busy(TRUE) + if(!target_mob) + return + + if(target_mob in ai_holder.list_targets()) + walk_to(src,target_mob,1,move_speed) + ai_holder.destination = target_mob.loc + else if(ai_holder.destination) + ai_holder.min_distance_to_destination = 0 + ai_holder.walk_to_destination() + step(src, get_dir(src.loc, target_mob.loc), move_speed) + if(get_dist(src,target_mob)<=3) + step(src, get_dir(src.loc, target_mob.loc), move_speed) + ai_holder.min_distance_to_destination = 1 + + +/mob/living/simple_animal/hostile/commanded/proc/commanded_stop() //basically a proc that runs whenever we are asked to stay put. Probably going to remain unused. + return + +/mob/living/simple_animal/hostile/commanded/proc/listen(mob/speaker, text) + for(var/command in known_commands) + if(findtext(text,command)) + switch(command) + if("stay") + if(stay_command(speaker,text)) //find a valid command? Stop. Don't try and find more. + break + if("stop") + if(stop_command(speaker,text)) + break + if("attack") + if(attack_command(speaker,text)) + break + if("follow") + if(follow_command(speaker,text)) + break + if("guard") + if(guard_command(speaker,text)) + break + if("forget master") + if(forget_master_command(speaker,text)) + break + if("forget target") + if(forget_target_command(speaker,text)) + break + if("obey") + if(obey_command(speaker,text)) + break + else + misc_command(speaker,text) //for specific commands + + return TRUE + +//returns a list of everybody we wanna do stuff with. +/mob/living/simple_animal/hostile/commanded/proc/get_targets_by_name(text, filter_friendlies = 0) + var/list/possible_targets = hearers(src,10) + . = list() + for(var/mob/M in possible_targets) + if(filter_friendlies && ((weakref(M) in friends) || M.faction == faction || M == master || M == src)) + continue + var/found = 0 + if(findtext(text, "[M]")) + found = 1 + else + var/list/parsed_name = splittext(replace_characters(lowertext(html_decode("[M]")),list("-"=" ", "."=" ", "," = " ", "'" = " ")), " ") //this big MESS is basically 'turn this into words, no punctuation, lowercase so we can check first name/last name/etc' + for(var/a in parsed_name) + if(a == "the" || length(a) < 2) //get rid of shit words. + continue + if(findtext(text,"[a]")) + found = 1 + break + if(found) + . += M + + +/mob/living/simple_animal/hostile/commanded/proc/clear_protected_mobs() + for(var/mob/living/carbon/guarded in protected_mobs) + guarded.guards -= src + friends -= weakref(guarded) + + protected_mobs = list() + +/mob/living/simple_animal/hostile/commanded/proc/attack_command(mob/speaker, text) + clear_protected_mobs() // I must attack something, don`t guard + target_mob = null //want me to attack something? Well I better forget my old target. + set_AI_busy(FALSE) + walk_to(src,0) + stance = STANCE_ATTACK + if(text == " attack." || findtext(text,"everyone") || findtext(text,"anybody") || findtext(text, "somebody") || findtext(text, "someone")) //if its just 'attack' then just attack anybody, same for if they say 'everyone', somebody, anybody. Assuming non-pickiness. + allowed_targets = list("everyone")//everyone? EVERYONE + return TRUE + + var/list/targets = get_targets_by_name(text) + allowed_targets -= "everyone" + for(var/target in targets) + allowed_targets |= target + + return length(targets) != 0 + +/mob/living/simple_animal/hostile/commanded/proc/stay_command(mob/speaker, text) + target_mob = null + stance = COMMANDED_STOP + set_AI_busy(TRUE) + walk_to(src,0) + return TRUE + +/mob/living/simple_animal/hostile/commanded/proc/stop_command(mob/speaker, text) + clear_protected_mobs() + allowed_targets = list() + walk_to(src,0) + ai_holder.target = null + target_mob = null //gotta stop SOMETHIN + stance = STANCE_IDLE + set_AI_busy(FALSE) + return TRUE + +/mob/living/simple_animal/hostile/commanded/proc/follow_command(mob/speaker, text) + //we can assume 'stop following' is handled by stop_command + clear_protected_mobs() + if(findtext(text,"me")) + stance = COMMANDED_FOLLOW + target_mob = speaker //this wont bite me in the ass later. + friends |= weakref(target_mob) + return TRUE + + var/list/targets = get_targets_by_name(text) + if(length(targets) > 1 || !length(targets)) //CONFUSED. WHO DO I FOLLOW? + return FALSE + + stance = COMMANDED_FOLLOW //GOT SOMEBODY. BETTER FOLLOW EM. + target_mob = targets[1] //YEAH GOOD IDEA + friends |= weakref(target_mob) + + return TRUE + +/mob/living/simple_animal/hostile/commanded/proc/guard_command(mob/living/carbon/speaker, text) + if(findtext(text,"me")) + stance = COMMANDED_FOLLOW + target_mob = speaker + clear_protected_mobs() + speaker.guards |= src + friends |= weakref(target_mob) + return TRUE + + var/list/targets = get_targets_by_name(text) + if(!length(targets)) + return FALSE + + for(var/mob/living/carbon/guarded_mob in targets) // only carbon lives need protection + if(!(src in guarded_mob.guards)) + guarded_mob.guards += src + protected_mobs += guarded_mob + friends |= weakref(guarded_mob) + + stance = COMMANDED_FOLLOW + target_mob = pick(targets) + return TRUE + +/mob/living/simple_animal/hostile/commanded/proc/forget_target_command(mob/speaker, text) + allowed_targets = list() + ai_holder.target = null + target_mob = null //gotta stop SOMETHIN + return TRUE + +/mob/living/simple_animal/hostile/commanded/proc/forget_master_command(mob/speaker, text) + if(speaker != master) + return FALSE + friends -= weakref(master) + + master = null // I`m alone, again, maybe my name is Hachiko? + ai_holder.leader = null + walk_to(src,0) + target_mob = null //gotta stop SOMETHIN + stance = STANCE_IDLE + set_AI_busy(FALSE) + return TRUE + +/mob/living/simple_animal/hostile/commanded/proc/obey_command(mob/speaker, text) + if(speaker != master) + return FALSE + + var/list/targets = list() + for(var/mob/living/carbon/human/H in get_targets_by_name(text)) //I want to obey humans + targets += H + if(length(targets) > 1 || !length(targets)) //CONFUSED. WHO DO I OBEY? + return FALSE + master = targets[1] + friends |= weakref(master) + ai_holder.leader = master + return TRUE + +/mob/living/simple_animal/hostile/commanded/proc/misc_command(mob/speaker, text) + return FALSE + +/mob/living/simple_animal/hostile/commanded/hit_with_weapon(obj/item/O, mob/living/user, effective_force, hit_zone) + //if they attack us, we want to kill them. None of that "you weren't given a command so free kill" bullshit. + . = ..() + if(. && retribution) + target_mob = user + allowed_targets |= target_mob //fuck this guy in particular. + stance = STANCE_ATTACK + friends -= weakref(user) + set_AI_busy(FALSE) + ai_holder.react_to_attack(user) + + +/mob/living/simple_animal/hostile/commanded/attack_hand(mob/living/carbon/human/M as mob) + ..() + if(M.a_intent == I_HURT && retribution) //assume he wants to hurt us. + target_mob = M + allowed_targets |= M //fuck this guy in particular. + stance = STANCE_ATTACK + friends -= weakref(M) + set_AI_busy(FALSE) + ai_holder.react_to_attack(M) + + +/mob/living/simple_animal/hostile/commanded/proc/hunt_on(mob/M) + if(M in ai_holder.list_targets()) + friends -= weakref(M) + set_AI_busy(FALSE) + stance = STANCE_ATTACK + allowed_targets |= M + +#undef COMMANDED_STOP +#undef COMMANDED_FOLLOW +#undef COMMANDED_MISC diff --git a/packs/infinity/mobs/simple/fox.dm b/mods/petting_zoo/code/fox.dm similarity index 66% rename from packs/infinity/mobs/simple/fox.dm rename to mods/petting_zoo/code/fox.dm index f0d86f8622ac7..a47f8d773849c 100644 --- a/packs/infinity/mobs/simple/fox.dm +++ b/mods/petting_zoo/code/fox.dm @@ -1,8 +1,26 @@ +/mob/living/simple_animal/friendly/fox + holder_type = /obj/item/holder/fox + +/obj/item/holder/fox + slot_flags = null + icon = 'mods/petting_zoo/icons/mobs.dmi' + icon_state = "fox" + + item_icons = list( + slot_l_hand_str = 'mods/petting_zoo/icons/onmob/mob_holder.dmi', + slot_r_hand_str = 'mods/petting_zoo/icons/onmob/mob_holder.dmi', + ) + + item_state_slots = list( + slot_l_hand_str = "fox_l", + slot_r_hand_str = "fox_r", + ) + //Foxxy /mob/living/simple_animal/friendly/fox name = "fox" desc = "It's a fox." - icon = 'packs/infinity/icons/mob/mobs.dmi' + icon = 'mods/petting_zoo/icons/mobs.dmi' icon_state = "fox" icon_living = "fox" icon_dead = "fox_dead" @@ -12,6 +30,8 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" + mob_size = MOB_SMALL + density = TRUE ai_holder = /datum/ai_holder/simple_animal/passive/fox say_list_type = /datum/say_list/fox diff --git a/packs/infinity/mobs/simple/koala.dm b/mods/petting_zoo/code/koala.dm similarity index 94% rename from packs/infinity/mobs/simple/koala.dm rename to mods/petting_zoo/code/koala.dm index 7aece381d7304..266cfa67d3904 100644 --- a/packs/infinity/mobs/simple/koala.dm +++ b/mods/petting_zoo/code/koala.dm @@ -1,7 +1,7 @@ /mob/living/simple_animal/friendly/koala name = "space koala" desc = "A little grey bear, now much time he gonna sleep today?" - icon = 'packs/infinity/icons/mob/mobs.dmi' + icon = 'mods/petting_zoo/icons/mobs.dmi' icon_state = "koala" icon_living = "koala" icon_dead = "koala_dead" diff --git a/packs/infinity/mobs/simple/rabbit.dm b/mods/petting_zoo/code/rabbit.dm similarity index 87% rename from packs/infinity/mobs/simple/rabbit.dm rename to mods/petting_zoo/code/rabbit.dm index 8b1884dac7de4..6c4257cb8f132 100644 --- a/packs/infinity/mobs/simple/rabbit.dm +++ b/mods/petting_zoo/code/rabbit.dm @@ -3,12 +3,12 @@ /obj/item/holder/rabbit slot_flags = null - icon = 'packs/infinity/icons/mob/mobs.dmi' + icon = 'mods/petting_zoo/icons/mobs.dmi' icon_state = "rabbit_white" item_icons = list( - slot_l_hand_str = 'packs/infinity/icons/mob/onmob/items/mob_holder.dmi', - slot_r_hand_str = 'packs/infinity/icons/mob/onmob/items/mob_holder.dmi', + slot_l_hand_str = 'mods/petting_zoo/icons/onmob/mob_holder.dmi', + slot_r_hand_str = 'mods/petting_zoo/icons/onmob/mob_holder.dmi', ) item_state_slots = list( @@ -19,7 +19,7 @@ /mob/living/simple_animal/rabbit name = "\improper rabbit" desc = "The hippiest hop around." - icon = 'packs/infinity/icons/mob/mobs.dmi' + icon = 'mods/petting_zoo/icons/mobs.dmi' icon_state = "rabbit_white" icon_living = "rabbit_white" icon_dead = "rabbit_white_dead" diff --git a/mods/leroy_beasts/icons/leroy_beasts_32x32.dmi b/mods/petting_zoo/icons/leroy_beasts_32x32.dmi similarity index 100% rename from mods/leroy_beasts/icons/leroy_beasts_32x32.dmi rename to mods/petting_zoo/icons/leroy_beasts_32x32.dmi diff --git a/mods/leroy_beasts/icons/leroy_beasts_32x64.dmi b/mods/petting_zoo/icons/leroy_beasts_32x64.dmi similarity index 100% rename from mods/leroy_beasts/icons/leroy_beasts_32x64.dmi rename to mods/petting_zoo/icons/leroy_beasts_32x64.dmi diff --git a/packs/infinity/icons/mob/mobs.dmi b/mods/petting_zoo/icons/mobs.dmi similarity index 100% rename from packs/infinity/icons/mob/mobs.dmi rename to mods/petting_zoo/icons/mobs.dmi diff --git a/packs/infinity/icons/mob/onmob/items/mob_holder.dmi b/mods/petting_zoo/icons/onmob/mob_holder.dmi similarity index 100% rename from packs/infinity/icons/mob/onmob/items/mob_holder.dmi rename to mods/petting_zoo/icons/onmob/mob_holder.dmi diff --git a/mods/ssinput/README.md b/mods/ssinput/README.md index 0a92b4955bd23..be410f081c4f1 100644 --- a/mods/ssinput/README.md +++ b/mods/ssinput/README.md @@ -2,6 +2,7 @@ #### Список PRов: - https://github.com/SierraBay/SierraBay12/pull/908 +-https://github.com/SierraBay/SierraBay12/pull/1824 + + +## Предметы-утилиты + +ID мода: UTILITY_ITEMS + + +### Описание мода + +Модпак добавляет различные предметы, которые будут полезны в использовании, но слишком комплексные, чтобы держать их в файлах карты или где-то ещё. + + +### Изменения *кор кода* + +- `code/modules/mining/abandonedcrates.dm` `/obj/structure/closet/crate/secure/loot/var/codelen` + + + +### Оверрайды + +- Отсутствуют + + + +### Дефайны + +- Отсутствуют + + +### Используемые файлы, не содержащиеся в модпаке + +- `mods/ntnet/code/NTNet_code.dm` + + +### Авторы: + +LordNest + diff --git a/mods/utility_items/_utility_items.dm b/mods/utility_items/_utility_items.dm new file mode 100644 index 0000000000000..cf6c4c2aa882e --- /dev/null +++ b/mods/utility_items/_utility_items.dm @@ -0,0 +1,4 @@ +/singleton/modpack/utility + name = "Предметы-утилиты" + desc = "Модпак добавляет различные предметы, которые будут полезны в использовании, но слишком комплексные, чтобы держать их в файлах карты или где-то ещё." + author = "LordNest" diff --git a/mods/utility_items/_utility_items.dme b/mods/utility_items/_utility_items.dme new file mode 100644 index 0000000000000..e9739e678d821 --- /dev/null +++ b/mods/utility_items/_utility_items.dme @@ -0,0 +1,10 @@ +#ifndef MODPACK_UTILITY_ITEMS +#define MODPACK_UTILITY_ITEMS + +#include "_utility_items.dm" + + +#include "code/multimeter.dm" +#include "code/wires.dm" + +#endif diff --git a/mods/utility_items/code/multimeter.dm b/mods/utility_items/code/multimeter.dm new file mode 100644 index 0000000000000..8e7c181ce11fc --- /dev/null +++ b/mods/utility_items/code/multimeter.dm @@ -0,0 +1,231 @@ +#define METER_MESURING "Measuring" +#define METER_CHECKING "Checking" + +#define isMultimeter(A) (A && A.ismultimeter()) + +/obj/item/device/multitool/multimeter + name = "multimeter" + desc = "Используется для измерения потребления электроэнергии оборудования и прозвонки проводов. Рекомендуется докторами." + icon = 'mods/utility_items/icons/multimeter.dmi' + icon_state = "multimeter" + origin_tech = list(TECH_MAGNET = 4, TECH_ENGINEERING = 4) + slot_flags = SLOT_BELT + var/mode = METER_MESURING // Mode + +/obj/item/device/multitool/multimeter/attack_self(mob/user) + switch(mode) + if(METER_MESURING) + mode = METER_CHECKING + if(METER_CHECKING) + mode = METER_MESURING + to_chat(user, "Режим сменён на: [mode].") + +/obj/item/device/multitool/multimeter/ismultimeter() + return TRUE + +/atom/proc/ismultimeter() + return FALSE + +/datum/wires/Topic(href, href_list) + . = ..() + var/list/unsolved_wires = src.wires.Copy() + var/colour_function + var/solved_colour_function + + if(in_range(holder, usr) && isliving(usr)) + + var/mob/living/L = usr + if(CanUse(L) && href_list["action"]) + + var/obj/item/I = L.get_active_hand() + + var/obj/item/offhand_item + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + offhand_item = H.wearing_rig && H.wearing_rig.selected_module + + if(href_list["pulse"]) + var/colour = href_list["pulse"] + if(isMultimeter(I)) + var/obj/item/device/multitool/multimeter/O = L.get_active_hand() + if(O.mode == METER_MESURING) + if (L.skill_check(SKILL_ELECTRICAL, SKILL_TRAINED)) + to_chat(usr, SPAN_NOTICE("Вы подаёте напряжение на провод...")) + if(!do_after(L, 50, holder)) + return + PulseColour(colour) + to_chat(usr,SPAN_NOTICE("Провод пропульсован.")) + else + to_chat(L, SPAN_NOTICE ("Вы не знаете с каким напряжением работает этот провод.")) + else + if (L.skill_check(SKILL_ELECTRICAL, SKILL_TRAINED)) + if(!do_after(L, 10, holder)) + return + if(!IsColourCut(colour)) + colour_function = unsolved_wires[colour] + solved_colour_function = SolveWireFunction(colour_function) + if(solved_colour_function != "") + to_chat(L, "the [colour] wire connected to [solved_colour_function]") + playsound(O.loc, 'mods/utility_items/sounds/mbeep.ogg', 20, 1) + else + to_chat(L, "the [colour] wire not connected") + else + to_chat(L, "the [colour] wire not connected") + else + to_chat(L, SPAN_NOTICE ("Вы не умеете подключать мультиметр.")) + + if(href_list["examine"]) + if(isMultimeter(I) || isMultimeter(offhand_item)) + var/obj/item/device/multitool/multimeter/O = L.get_active_hand() + if (L.skill_check(SKILL_ELECTRICAL, SKILL_TRAINED)) + if(O.mode == METER_CHECKING) + to_chat(L, SPAN_NOTICE ("Перебираем провода...")) + var/name_by_type = name_by_type() + to_chat(L, "[name_by_type] wires:") + for(var/colour in src.wires) + if(unsolved_wires[colour]) + if(!do_after(L, 10, holder)) + return + if(!IsColourCut(colour)) + colour_function = unsolved_wires[colour] + solved_colour_function = SolveWireFunction(colour_function) + if(solved_colour_function != "") + to_chat(L, "the [colour] wire connected to [solved_colour_function]") + playsound(O.loc, 'mods/utility_items/sounds/mbeep.ogg', 20, 1) + else + to_chat(L, "the [colour] wire not connected") + else + to_chat(L, "the [colour] wire not connected") + else + to_chat(L, SPAN_NOTICE ("Переключите мультиметр в режим прозвонки.")) + else + to_chat(L, SPAN_NOTICE ("Вы не знаете как с этим работать.")) + +/datum/design/item/tool/multimeter + name = "multimeter" + desc = "Используется для измерения потребления электроэнергии оборудования и прозвонки проводов. Рекомендуется докторами." + id = "multimeter" + req_tech = list(TECH_MAGNET = 4, TECH_ENGINEERING = 5, TECH_MATERIAL = 6) + materials = list(DEFAULT_WALL_MATERIAL = 1000, MATERIAL_GLASS = 1000, MATERIAL_SILVER = 500) + build_path = /obj/item/device/multitool/multimeter + sort_string = "VAGAM" + +// Closet unlocking + +/obj/structure/closet + + var/code1[8] + var/code2[8] + var/validate = 0 + var/codelen + +/obj/structure/closet/Initialize(mapload, need_fill) + ..() + update_icon() + if((setup & CLOSET_HAS_LOCK)) + verbs += /obj/structure/closet/proc/togglelock_verb + + codelen = rand(7,10) + codelen = length(code1) + codelen = length(code2) + for(var/i=1 to codelen) + code1[i] = rand(0,9) + code2[i] = rand(0,9) + + return mapload ? INITIALIZE_HINT_LATELOAD : INITIALIZE_HINT_NORMAL + +// Overrides this because otherwise this leads us to unit tests failing +/obj/structure/closet/crate/secure/loot + codelen = 4 + +// Proceeding to do stuff + +/obj/structure/closet/use_tool(obj/item/tool, mob/user, list/click_params) + . = ..() + if(setup & CLOSET_HAS_LOCK) + if(isMultimeter(tool)) + var/obj/item/device/multitool/multimeter/O = tool + if(O.mode != METER_CHECKING) + to_chat(user, SPAN_NOTICE ("Переключите мультиметр.")) + else + if (user.skill_check(SKILL_ELECTRICAL, SKILL_TRAINED)) + src.interact(usr) + else + to_chat(user, SPAN_NOTICE ("Вы не умеете работать с этим замком.")) + +/obj/structure/closet/interact(mob/user) + add_fingerprint(user) + + var/dat = "" + for(var/i = 1 to codelen) + dat += "" + for(var/i = 1 to codelen) + dat += "" + for(var/i = 1 to codelen) + dat += "
+" + dat += "
[code2[i]]" + dat += "
-" + dat += "

Сопоставить код" + + user.set_machine(src) + var/datum/browser/popup = new(user, "closet", "[name]", 90 + codelen * 30, 200) + popup.set_content(dat) + popup.open(1) + +/obj/structure/closet/Topic(href, href_list) + if(!ishuman(usr)) + return + + var/mob/living/carbon/human/user = usr + var/obj/item/device/multitool/multimeter/W = user.get_active_hand() + user.set_machine(src) + + if(href_list["check"]) + if(!W.in_use) + W.in_use = TRUE + else + return + + validate = 0 + + if(W.mode != METER_CHECKING) + to_chat(user, SPAN_NOTICE("Мультиметр не реагирует на подключение.")) + return + + to_chat(usr, SPAN_NOTICE ("Вы начинаете проверять замок...")) + for(var/i = 1 to codelen) + if(do_after(user, 10, src)) + if(code2[i] == code1[i]) + validate++ + to_chat(usr, SPAN_NOTICE ("Ключ подходит.")) + playsound(W.loc, 'mods/utility_items/sounds/mbeep.ogg', 30, 1, frequency = rand(50000, 55000)) + else + to_chat(usr, SPAN_NOTICE ("Ключ не подходит.")) + W.in_use = FALSE + + if(validate < codelen) + return + + locked = !locked + update_icon() + visible_message(SPAN_WARNING ("[user] has [locked ? "locked" : "hacked"] [src]!")) + return + + if(href_list["inc"]) + var/inc = text2num(href_list["inc"]) + code2[inc]++ + if(code2[inc] > 9) + code2[inc] = 0 + interact(user) + + if(href_list["dec"]) + var/inc = text2num(href_list["dec"]) + code2[inc]-- + if(code2[inc] < 0) + code2[inc] = 9 + interact(user) + +#undef METER_MESURING +#undef METER_CHECKING + +#undef isMultimeter diff --git a/mods/utility_items/code/wires.dm b/mods/utility_items/code/wires.dm new file mode 100644 index 0000000000000..d89ce6386eee5 --- /dev/null +++ b/mods/utility_items/code/wires.dm @@ -0,0 +1,255 @@ +// Multitool wires solving function - Just too big + +// Wire solve functions + +/datum/wires/proc/name_by_type() + var/name_by_type + if(istype(src, /datum/wires/airlock)) + name_by_type = "Airlock" + if(istype(src, /datum/wires/apc)) + name_by_type = "APC" + if(istype(src, /datum/wires/robot)) + name_by_type = "Cyborg" + if(istype(src, /datum/wires/fabricator)) + name_by_type = "Autolathe" + if(istype(src, /datum/wires/alarm)) + name_by_type = "Air Alarm" + if(istype(src, /datum/wires/camera)) + name_by_type = "Camera" + if(istype(src, /datum/wires/explosive)) + name_by_type = "C4 Bomb" + if(istype(src, /datum/wires/nuclearbomb)) + name_by_type = "Nuclear Bomb" + if(istype(src, /datum/wires/particle_acc)) + name_by_type = "Particle Accelerator" + if(istype(src, /datum/wires/radio)) + name_by_type = "Radio" + if(istype(src, /datum/wires/vending)) + name_by_type = "Vending Machine" + return name_by_type + +/datum/wires/proc/SolveWires() + var/list/unsolved_wires = src.wires.Copy() + var/colour_function + var/solved_colour_function + + var/name_by_type = name_by_type() + + var/solved_txt = "[name_by_type] wires:
" + + for(var/colour in src.wires) + if(unsolved_wires[colour]) //unsolved_wires[red] + colour_function = unsolved_wires[colour] //unsolved_wires[red] = 1 so colour_index = 1 + solved_colour_function = SolveWireFunction(colour_function) //unsolved_wires[red] = 1, 1 = AIRLOCK_WIRE_IDSCAN + solved_txt += "the [colour] wire connected to [solved_colour_function]
" //the red wire is the ID wire + + solved_txt += "
" + + return solved_txt + +/datum/wires/proc/SolveWireFunction(WireFunction) + return WireFunction //Default returns the original number, so it still "works" + +/datum/wires/airlock/SolveWireFunction(function) + var/sf = "" + var/obj/machinery/door/airlock/AIRL = holder + switch(function) + if(AIRLOCK_WIRE_IDSCAN) + sf = "Port A" + if(AIRLOCK_WIRE_MAIN_POWER1) + sf = "Port B" + if(AIRLOCK_WIRE_MAIN_POWER2) + sf = "Port C" + if(AIRLOCK_WIRE_DOOR_BOLTS) + sf = "Port D" + if(AIRLOCK_WIRE_BACKUP_POWER1) + sf = "Port E" + if(AIRLOCK_WIRE_BACKUP_POWER2) + sf = "Port F" + if(AIRLOCK_WIRE_OPEN_DOOR) + sf = "Port G" + if(AIRLOCK_WIRE_AI_CONTROL) + sf = "Port H (NTNet ID = [AIRL.NTNet_id])" + if(AIRLOCK_WIRE_ELECTRIFY) + sf = "Port I" + if(AIRLOCK_WIRE_SAFETY) + sf = "Port J" + if(AIRLOCK_WIRE_SPEED) + sf = "Port K" + if(AIRLOCK_WIRE_LIGHT) + sf = "Port L" + + return sf + +/datum/wires/alarm/SolveWireFunction(function) + var/sf = "" + switch(function) + if(AALARM_WIRE_IDSCAN) + sf = "Port A" + if(AALARM_WIRE_POWER) + sf = "Port B" + if(AALARM_WIRE_SYPHON) + sf = "Port C" + if(AALARM_WIRE_AI_CONTROL) + sf = "Port D" + if(AALARM_WIRE_AALARM) + sf = "Port E" + + return sf + +/datum/wires/apc/SolveWireFunction(function) + var/sf = "" + switch(function) + if(APC_WIRE_IDSCAN) + sf = "Port A" + if(APC_WIRE_MAIN_POWER1) + sf = "Port B" + if(APC_WIRE_MAIN_POWER2) + sf = "Port C" + if(APC_WIRE_AI_CONTROL) + sf = "Port D" + + return sf + +/datum/wires/camera/SolveWireFunction(function) + var/sf = "" + switch(function) + if(CAMERA_WIRE_FOCUS) + sf = "Port A" + if(CAMERA_WIRE_POWER) + sf = "Port B" + if(CAMERA_WIRE_LIGHT) + sf = "Port C" + if(CAMERA_WIRE_ALARM) + sf = "Port D" + if(CAMERA_WIRE_NOTHING1) + sf = "Port E" + if(CAMERA_WIRE_NOTHING2) + sf = "Port F" + + return sf + +/datum/wires/explosive/SolveWireFunction(function) + var/sf = "" + switch(function) + if(WIRE_EXPLODE) + sf = "explosive" + + return sf + +/datum/wires/nuclearbomb/SolveWireFunction(function) + var/sf = "" + switch(function) + if(NUCLEARBOMB_WIRE_LIGHT) + sf = "Port A" + if(NUCLEARBOMB_WIRE_TIMING) + sf = "Port B" + if(NUCLEARBOMB_WIRE_SAFETY) + sf = "Port C" + return sf + +/datum/wires/particle_acc/SolveWireFunction(function) + var/sf = "" + switch(function) + if(PARTICLE_TOGGLE_WIRE) + sf = "Port A" + if(PARTICLE_STRENGTH_WIRE) + sf = "Port B" + if(PARTICLE_INTERFACE_WIRE) + sf = "Port C" + if(PARTICLE_LIMIT_POWER_WIRE) + sf = "Port D" + + return sf + +/datum/wires/radio/SolveWireFunction(function) + var/sf = "" + switch(function) + if(WIRE_SIGNAL) + sf = "Port A" + if(WIRE_RECEIVE) + sf = "Port B" + if(WIRE_TRANSMIT) + sf = "Port C" + + return sf + +/datum/wires/robot/SolveWireFunction(function) + var/sf = "" + switch(function) + if(BORG_WIRE_LAWCHECK) + sf = "Port A" + if(BORG_WIRE_MAIN_POWER) + sf = "Port B" + if(BORG_WIRE_LOCKED_DOWN) + sf = "Port C" + if(BORG_WIRE_AI_CONTROL) + sf = "Port D" + + return sf + +/datum/wires/shield_generator/SolveWireFunction(function) + var/sf = "" + switch(function) + if(SHIELDGEN_WIRE_POWER) + sf = "Port A" + if(SHIELDGEN_WIRE_HACK) + sf = "Port B" + if(SHIELDGEN_WIRE_CONTROL) + sf = "Port C" + if(SHIELDGEN_WIRE_AICONTROL) + sf = "Port D" + if(SHIELDGEN_WIRE_NOTHING) + sf = "Port E" + return sf + +/datum/wires/smartfridge/SolveWireFunction(function) + var/sf = "" + switch(function) + if(SMARTFRIDGE_WIRE_ELECTRIFY) + sf = "Port A" + if(SMARTFRIDGE_WIRE_THROW) + sf = "Port B" + if(SMARTFRIDGE_WIRE_IDSCAN) + sf = "Port C" + return sf + +/datum/wires/smes/SolveWireFunction(function) + var/sf = "" + switch(function) + if(SMES_WIRE_RCON) + sf = "Port A" + if(SMES_WIRE_INPUT) + sf = "Port B" + if(SMES_WIRE_OUTPUT) + sf = "Port C" + if(SMES_WIRE_GROUNDING) + sf = "Port D" + if(SMES_WIRE_FAILSAFES) + sf = "Port E" + return sf + +/datum/wires/suit_storage_unit/SolveWireFunction(function) + var/sf = "" + switch(function) + if(SUIT_STORAGE_WIRE_ELECTRIFY) + sf = "Port A" + if(SUIT_STORAGE_WIRE_SAFETY) + sf = "Port B" + if(SUIT_STORAGE_WIRE_LOCKED) + sf = "Port C" + return sf + +/datum/wires/vending/SolveWireFunction(function) + var/sf = "" + switch(function) + if(WIRE_THROW_PRODUCTS) + sf = "A" + if(WIRE_SHOW_CONTRABAND) + sf = "B" + if(WIRE_SHOCK_USERS) + sf = "C" + if(WIRE_SCAN_ID) + sf = "D" + + return sf diff --git a/mods/utility_items/icons/multimeter.dmi b/mods/utility_items/icons/multimeter.dmi new file mode 100644 index 0000000000000..14079cbd799a1 Binary files /dev/null and b/mods/utility_items/icons/multimeter.dmi differ diff --git a/mods/utility_items/sounds/mbeep.ogg b/mods/utility_items/sounds/mbeep.ogg new file mode 100644 index 0000000000000..54e1571533a5f Binary files /dev/null and b/mods/utility_items/sounds/mbeep.ogg differ diff --git a/packs/event_2022jul30/documents.dm b/packs/event_2022jul30/documents.dm index 81f7c82fc0cba..40f5fe7e93589 100644 --- a/packs/event_2022jul30/documents.dm +++ b/packs/event_2022jul30/documents.dm @@ -1,12 +1,3 @@ -/obj/item/folder/envelope/declassified1 - desc = "A thick envelope. The Sol Fleet crest is stamped in the corner, along with 'PUBLIC RELEASE DOCUMENTATION.'" - - -/obj/item/folder/envelope/declassified1/Initialize() - . = ..() - new /obj/item/paper/dclassreport1 (src) - - /obj/item/paper/dclassreport1 name = "Declassified Report: Status of the Fleets" info = {"\ diff --git a/packs/infinity/_pack.dm b/packs/infinity/_pack.dm index a9cb0d2dc9ec3..db292e4dff234 100644 --- a/packs/infinity/_pack.dm +++ b/packs/infinity/_pack.dm @@ -36,9 +36,6 @@ #include "items\chairs.dm" #include "items\chemistry.dm" #include "items\grown.dm" -#include "items\multimeter.dm" -#include "items\powertools.dm" -#include "items\toys.dm" // Guns #include "items\projectile\ammunition\boxes.dm" @@ -58,11 +55,6 @@ #include "machinery\survival_pod.dm" #include "machinery\scrap_compactor\scrap_compactor.dm" -// Mobs -#include "mobs\simple\fox.dm" -#include "mobs\simple\koala.dm" -#include "mobs\simple\rabbit.dm" - // Structures #include "structures\barrier.dm" #include "structures\chairs.dm" diff --git a/packs/infinity/icons/mob/onmob/items/lefthand.dmi b/packs/infinity/icons/mob/onmob/items/lefthand.dmi deleted file mode 100644 index f609ee977cc5d..0000000000000 Binary files a/packs/infinity/icons/mob/onmob/items/lefthand.dmi and /dev/null differ diff --git a/packs/infinity/icons/mob/onmob/items/righthand.dmi b/packs/infinity/icons/mob/onmob/items/righthand.dmi deleted file mode 100644 index b838707877574..0000000000000 Binary files a/packs/infinity/icons/mob/onmob/items/righthand.dmi and /dev/null differ diff --git a/packs/infinity/icons/obj/items.dmi b/packs/infinity/icons/obj/items.dmi index 64c4dcf6f4a00..81b20a79463a0 100644 Binary files a/packs/infinity/icons/obj/items.dmi and b/packs/infinity/icons/obj/items.dmi differ diff --git a/packs/infinity/icons/obj/machines/shielding.dmi b/packs/infinity/icons/obj/machines/shielding.dmi deleted file mode 100644 index 8a356c529e558..0000000000000 Binary files a/packs/infinity/icons/obj/machines/shielding.dmi and /dev/null differ diff --git a/packs/infinity/items/multimeter.dm b/packs/infinity/items/multimeter.dm deleted file mode 100644 index 5b49a150eb1db..0000000000000 --- a/packs/infinity/items/multimeter.dm +++ /dev/null @@ -1,80 +0,0 @@ -#if FALSE - -// SIERRA TODO: multimeter - -#define METER_MESURING "Measuring" -#define METER_CHECKING "Checking" - -#define isMultimeter(A) (A && A.ismultimeter()) - -/obj/item/device/multitool/multimeter - name = "multimeter" - desc = "Используется для измерения потребления электроэнергии оборудования и прозвонки проводов. Рекомендуется докторами." - icon = 'infinity/icons/obj/items.dmi' - icon_state = "multimeter" - origin_tech = list(TECH_MAGNET = 4, TECH_ENGINEERING = 4) - slot_flags = SLOT_BELT - var/mode = METER_MESURING // Mode - -/obj/item/device/multitool/multimeter/attack_self(mob/user) - switch(mode) - if(METER_MESURING) - mode = METER_CHECKING - if(METER_CHECKING) - mode = METER_MESURING - to_chat(user, "Режим сменён на: [mode].") - -/obj/item/device/multitool/multimeter/ismultimeter() - return TRUE - - - -/datum/wires/Topic(href, href_list) - . = ..() - var/list/unsolved_wires = src.wires.Copy() - var/colour_function - var/solved_colour_function - - if(in_range(holder, usr) && isliving(usr)) - - var/mob/living/L = usr - if(CanUse(L) && href_list["action"]) - - var/obj/item/I = L.get_active_hand() - - var/obj/item/offhand_item - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - offhand_item = H.wearing_rig && H.wearing_rig.selected_module - - if(href_list["check"]) - if(isMultimeter(I) || isMultimeter(offhand_item)) - var/obj/item/device/multitool/multimeter/O = L.get_active_hand() - if (L.skill_check(SKILL_ELECTRICAL, SKILL_BASIC)) - if(O.mode == METER_CHECKING) - to_chat(L, "Перебираем провода...") - var/name_by_type = name_by_type() - to_chat(L, "[name_by_type] wires:") - for(var/colour in src.wires) - if(unsolved_wires[colour]) - if(!do_after(L, 10, holder)) - return - if(!IsColourCut(colour)) - colour_function = unsolved_wires[colour] - solved_colour_function = SolveWireFunction(colour_function) - if(solved_colour_function != "") - to_chat(L, "the [colour] wire connected to [solved_colour_function]") - playsound(O.loc, 'infinity/sound/machines/mbeep.ogg', 20, 1) - else - to_chat(L, "the [colour] wire not connected") - else - to_chat(L, "the [colour] wire not connected") - //to_chat(L, "[all_solved_wires[holder_type]]") - else - to_chat(L, "Переключите мультиметр в режим прозвонки.") - else - to_chat(L, "Вы не знаете как с этим работать.") - else - to_chat(L, "Вам нужен мультиметр.") - -#endif diff --git a/packs/infinity/items/powertools.dm b/packs/infinity/items/powertools.dm deleted file mode 100644 index 2db33515e8bb7..0000000000000 --- a/packs/infinity/items/powertools.dm +++ /dev/null @@ -1,138 +0,0 @@ -// SIERRA TODO: usesound с Paradise (или подобные) - -// -// DRILL -// - -/obj/item/wrench/power - name = "hand drill" - desc = "A simple powered hand drill. It's fitted with a bolt bit." - icon = 'packs/infinity/icons/obj/items.dmi' - icon_state = "drill_bolt" - item_state = "drill" - obj_flags = OBJ_FLAG_CONDUCTIBLE - slot_flags = SLOT_BELT - force = 8.0 - throwforce = 8.0 - throw_speed = 2 - throw_range = 3 - w_class = ITEM_SIZE_NORMAL - origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 3) - matter = list(DEFAULT_WALL_MATERIAL = 5000, "silver" = 2000) - center_of_mass = "x=17;y=16" - attack_verb = list("drilled", "screwed", "jabbed") - -/obj/item/wrench/power/attack_self(mob/user) - playsound(get_turf(user), 'packs/infinity/sound/items/change_drill.ogg', 50, 1) - - var/obj/item/screwdriver/power/s_drill = new /obj/item/screwdriver/power - - to_chat(user, "You attach the screw driver bit to [src].") - qdel(src) - - user.put_in_active_hand(s_drill) - -/obj/item/wrench/power/Initialize() - . = ..() - icon_state = "drill_bolt" - color = "#ffffff" - - -/obj/item/screwdriver/power - name = "hand drill" - desc = "A simple powered hand drill. It's fitted with a screw bit." - icon = 'packs/infinity/icons/obj/items.dmi' - icon_state = "drill_screw" - item_state = "drill" - obj_flags = OBJ_FLAG_CONDUCTIBLE - slot_flags = SLOT_BELT - force = 8 - throwforce = 8 - throw_speed = 2 - throw_range = 3 - w_class = ITEM_SIZE_NORMAL - origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 3) - matter = list(DEFAULT_WALL_MATERIAL = 5000, "silver" = 2000) - center_of_mass = "x=16;y=7" - attack_verb = list("drilled", "screwed", "jabbed","whacked") - hitsound = 'packs/infinity/sound/items/drill_hit.ogg' - -/obj/item/screwdriver/power/attack_self(mob/user) - playsound(get_turf(user), 'packs/infinity/sound/items/change_drill.ogg', 50, 1) - var/obj/item/wrench/power/b_drill = new /obj/item/wrench/power - to_chat(user, "You attach the bolt driver bit to [src].") - qdel(src) - user.put_in_active_hand(b_drill) - -/obj/item/screwdriver/power/Initialize() - . = ..() - icon_state = "drill_screw" - color = "#ffffff" - - -// -// JAWS OF LIFE -// - -/obj/item/wirecutters/power - name = "jaws of life" - desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a cutting head." - icon = 'packs/infinity/icons/obj/items.dmi' - icon_state = "jaws_cutter" - item_state = "jawsoflife" - obj_flags = OBJ_FLAG_CONDUCTIBLE - slot_flags = SLOT_BELT - force = 15.0 - throwforce = 10.0 - throw_speed = 2.0 - throw_range = 2.0 - w_class = ITEM_SIZE_NORMAL - origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 3) - matter = list(DEFAULT_WALL_MATERIAL = 5000, "silver" = 2000) - center_of_mass = "x=18;y=10" - attack_verb = list("pinched", "nipped") - sharp = 1 - edge = 1 - -/obj/item/wirecutters/power/attack_self(mob/user) - playsound(get_turf(user), 'packs/infinity/sound/items/change_jaws.ogg', 50, 1) - var/obj/item/crowbar/power/pryjaws = new /obj/item/crowbar/power - to_chat(user, "You attach the pry jaws to [src].") - qdel(src) - user.put_in_active_hand(pryjaws) - -/obj/item/wirecutters/power/Initialize() - . = ..() - icon_state = "jaws_cutter" - color = "#ffffff" - - -/obj/item/crowbar/power - name = "jaws of life" - desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a prying head." - icon = 'packs/infinity/icons/obj/items.dmi' - icon_state = "jaws_pry" - item_state = "jawsoflife" - obj_flags = OBJ_FLAG_CONDUCTIBLE - slot_flags = SLOT_BELT - force = 15.0 - throwforce = 10.0 - throw_speed = 2.0 - throw_range = 2.0 - w_class = ITEM_SIZE_NORMAL - origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 3) - matter = list(DEFAULT_WALL_MATERIAL = 5000, "silver" = 2000) - center_of_mass = "x=18;y=10" - attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") - -/obj/item/crowbar/power/attack_self(mob/user) - playsound(get_turf(user), 'packs/infinity/sound/items/change_jaws.ogg', 50, 1) - var/obj/item/wirecutters/power/cutjaws = new /obj/item/wirecutters/power - to_chat(user, "You attach the cutting jaws to [src].") - qdel(src) - user.put_in_active_hand(cutjaws) - -/obj/item/crowbar/power/Initialize() - . = ..() - icon_state = "jaws_pry" - color = "#ffffff" diff --git a/packs/infinity/items/toys.dm b/packs/infinity/items/toys.dm deleted file mode 100644 index 1761836d798c6..0000000000000 --- a/packs/infinity/items/toys.dm +++ /dev/null @@ -1,5 +0,0 @@ -/obj/item/toy/sierramodel - name = "table-top NSV Sierra model" - desc = "This is a replica of the NSV Sierra, in 1:250th scale, on a handsome wooden stand. Small lights blink on the hull and at the engine exhaust." - icon = 'packs/infinity/icons/obj/toy.dmi' - icon_state = "sierra_model_figure"