diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 24ae4bc2151dd..6f1cc863673bc 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -144,6 +144,9 @@ var/global/list/admin_verbs_spawn = list( /datum/admins/proc/spawn_atom, // allows us to spawn instances, /datum/admins/proc/spawn_artifact, /client/proc/spawn_chemdisp_cartridge, + // [SIERRA-ADD] - CLIENT_VERBS - , + /client/proc/respawn_as_self, + // [/SIERRA-ADD] - CLIENT_VERBS , /datum/admins/proc/mass_debug_closet_icons ) var/global/list/admin_verbs_server = list( diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 526c8833b14fc..410b45b483090 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -21,6 +21,23 @@ This saves us from having to call add_fingerprint() any time something is put in update_inv_l_hand(0) else update_inv_r_hand(0) + // [SIERRA-ADD] - SSINPUT + // Try put it in their toolbelt + if(istype(src.belt, /obj/item/storage)) + var/obj/item/storage/belt = src.belt + if(belt.can_be_inserted(I, null, 1) && belt.handle_item_insertion(I)) + return + // Try put it in their backpack + if(istype(src.back, /obj/item/storage)) + var/obj/item/storage/backpack = src.back + if(backpack.can_be_inserted(I, null, 1) && backpack.handle_item_insertion(I)) + return + + // Try to place it in any item that can store stuff, on the mob. + for(var/obj/item/storage/S in src.contents) + if(S.can_be_inserted(I, null, 1) && S.handle_item_insertion(I)) + return + // [/SIERRA-ADD] else to_chat(H, SPAN_WARNING("You are unable to equip that.")) diff --git a/packs/infinity/icons/obj/modular_laptop.dmi b/maps/sierra/icons/obj/modular_laptop.dmi similarity index 100% rename from packs/infinity/icons/obj/modular_laptop.dmi rename to maps/sierra/icons/obj/modular_laptop.dmi diff --git a/maps/sierra/icons/obj/target.dmi b/maps/sierra/icons/obj/target.dmi new file mode 100644 index 0000000000000..19248d3a8f7c2 Binary files /dev/null and b/maps/sierra/icons/obj/target.dmi differ diff --git a/maps/sierra/icons/turf/decals.dmi b/maps/sierra/icons/turf/decals.dmi index 2d5f038c84d48..3069f5042c126 100644 Binary files a/maps/sierra/icons/turf/decals.dmi and b/maps/sierra/icons/turf/decals.dmi differ diff --git a/maps/sierra/items/modular_computer.dm b/maps/sierra/items/modular_computer.dm index 7a40af5d3b4c9..6e7cfd033a368 100644 --- a/maps/sierra/items/modular_computer.dm +++ b/maps/sierra/items/modular_computer.dm @@ -174,3 +174,24 @@ /obj/item/modular_computer/pda/wrist/lila/black icon_state = "wrist-lila-black" icon_state_unpowered = "wrist-lila-black" + +// Laptop icon override + +/obj/item/modular_computer/laptop + icon = 'maps/sierra/icons/obj/modular_laptop.dmi' + +/obj/item/modular_computer/laptop/verb/rotatelaptop() + set name = "Rotate laptop" + set category = "Object" + set src in view(1) + + if(usr.stat == DEAD) + if(!round_is_spooky()) + to_chat(src, "The veil is not thin enough for you to do that.") + return + + src.set_dir(turn(src.dir, -90)) + +/obj/item/modular_computer/laptop/update_verbs() + ..() + verbs |= /obj/item/modular_computer/laptop/verb/rotatelaptop diff --git a/maps/sierra/job/jobs_command.dm b/maps/sierra/job/jobs_command.dm index 3d125d0b215aa..245a03857e89d 100644 --- a/maps/sierra/job/jobs_command.dm +++ b/maps/sierra/job/jobs_command.dm @@ -403,7 +403,7 @@ minimum_character_age = list(SPECIES_HUMAN = 30) ideal_character_age = 40 - outfit_type = /singleton/hierarchy/outfit/job/sierra/crew/research/iaa + outfit_type = /singleton/hierarchy/outfit/job/sierra/crew/command/iaa allowed_branches = list( /datum/mil_branch/employee ) diff --git a/maps/sierra/job/outfits.dm b/maps/sierra/job/outfits.dm index f8d0b97fcbddc..8a12ab57991a4 100644 --- a/maps/sierra/job/outfits.dm +++ b/maps/sierra/job/outfits.dm @@ -119,7 +119,7 @@ Keeping them simple for now, just spawning with basic EC uniforms, and pretty mu ..() BACKPACK_OVERRIDE_SECURITY -/singleton/hierarchy/outfit/job/sierra/crew/research/iaa +/singleton/hierarchy/outfit/job/sierra/crew/command/iaa name = OUTFIT_JOB_NAME("Internal Affairs Agent - Sierra") l_ear = /obj/item/device/radio/headset/ia uniform = /obj/item/clothing/under/rank/internalaffairs/plain/nt diff --git a/maps/sierra/structures/closets/_closets_appearances.dm b/maps/sierra/structures/closets/_closets_appearances.dm index aaadef5386e57..b82158661abf9 100644 --- a/maps/sierra/structures/closets/_closets_appearances.dm +++ b/maps/sierra/structures/closets/_closets_appearances.dm @@ -141,6 +141,14 @@ "atmos" = COLOR_COMMAND_BLUE ) +/singleton/closet_appearance/secure_closet/sierra/engineering/infotech + color = COLOR_GUNMETAL + extra_decals = list( + "stripe_vertical_mid_partial" = COLOR_PALE_ORANGE, + "stripe_vertical_right_partial" = COLOR_PALE_ORANGE, + "eng_narrow" = COLOR_PALE_ORANGE + ) + /singleton/closet_appearance/secure_closet/sierra/engineering/ce color = COLOR_OFF_WHITE extra_decals = list( diff --git a/maps/sierra/structures/closets/engineering.dm b/maps/sierra/structures/closets/engineering.dm index 32fc947837579..d2498d3e0dcaf 100644 --- a/maps/sierra/structures/closets/engineering.dm +++ b/maps/sierra/structures/closets/engineering.dm @@ -131,3 +131,24 @@ /obj/item/taperoll/atmos, /obj/item/device/scanner/gas ) + +/obj/structure/closet/secure_closet/infotech_sierra + name = "information technician locker" + req_access = list(access_network_admin) + closet_appearance = /singleton/closet_appearance/secure_closet/sierra/engineering/infotech + +/obj/structure/closet/secure_closet/infotech_sierra/WillContain() + return list( + /obj/item/storage/box/PDAs, + /obj/item/modular_computer/laptop/preset/custom_loadout/standard, + /obj/item/modular_computer/tablet/preset/custom_loadout/standard, + /obj/item/clothing/glasses/hud/it, + /obj/item/device/multitool, + /obj/item/clothing/gloves/insulated, + /obj/item/device/flashlight/upgraded, + /obj/item/storage/belt/utility/full, + /obj/item/clothing/head/beret/engineering, + /obj/item/device/radio/headset/headset_eng, + /obj/item/device/radio/headset/headset_eng/alt, + /obj/item/stack/cable_coil = 2 + ) diff --git a/maps/sierra/structures/other.dm b/maps/sierra/structures/other.dm index 5c7e9c9561bbf..d78c4e9f0f0df 100644 --- a/maps/sierra/structures/other.dm +++ b/maps/sierra/structures/other.dm @@ -10,3 +10,146 @@ new /obj/item/book/manual/nt_tc(src) new /obj/item/book/manual/military_law(src) update_icon() + +// Targets, the things that actually get shot! +/obj/item/target + name = "shooting target" + desc = "A shooting target." + icon = 'maps/sierra/icons/obj/target.dmi' + icon_state = "target_h" + density = FALSE + var/hp = 1800 + var/icon/virtualIcon + var/list/bulletholes = list() + +/obj/item/target/use_tool(obj/item/tool, mob/living/user, list/click_params) + if (isWelder(tool)) + var/obj/item/weldingtool/welder = tool + if (welder.remove_fuel(0, user)) + ClearOverlays() + bulletholes.Cut() + hp = initial(hp) + user.visible_message( + SPAN_NOTICE("[user] slices off uneven chunks of aluminium and scorch marks from [src]."), + SPAN_NOTICE("You slice off uneven chunks of aluminium and scorch marks from [src]."), + SPAN_NOTICE("You hear welding."), + ) + return TRUE + return ..() + +/obj/item/target/syndicate + icon_state = "target_s" + desc = "A shooting target that looks like a hostile agent." + hp = 2600 // i guess syndie targets are sturdier? + +/obj/item/target/alien + icon_state = "target_q" + desc = "A shooting target with a threatening silhouette." + hp = 2350 // alium onest too kinda + +#define PROJECTILE_TYPE_SCORCH 1 +#define PROJECTILE_TYPE_BULLET 2 +#define TARGET_RANDOM_OFFSET pick(0, 0, 0, 0, 0, -1, 1) + +/obj/item/target/bullet_act(obj/item/projectile/projectile) + var/p_x = projectile.p_x + TARGET_RANDOM_OFFSET + var/p_y = projectile.p_y + TARGET_RANDOM_OFFSET + + var/projectile_type = PROJECTILE_TYPE_SCORCH + if (istype(/obj/item/projectile/bullet, projectile)) + projectile_type = PROJECTILE_TYPE_BULLET + + virtualIcon = new(icon, icon_state) + + if (isnull(virtualIcon.GetPixel(p_x, p_y))) + return PROJECTILE_CONTINUE // The projectile goes through the target! + + hp -= projectile.damage + if (hp <= 0) + visible_message(SPAN_WARNING("\The [src] breaks into tiny pieces and collapses!")) + qdel(src) + return FALSE // The projectile stops + + // Create a temporary object to represent the damage + var/obj/bmark = new + bmark.pixel_x = p_x + bmark.pixel_y = p_y + bmark.icon = 'icons/effects/effects.dmi' + bmark.layer = ABOVE_OBJ_LAYER + + // Set bmark icon_state + if (projectile_type == PROJECTILE_TYPE_SCORCH) + // Energy weapons are hot. they scorch! + + // Offset correction + bmark.pixel_x-- + bmark.pixel_y-- + + if (projectile.damage >= 20 || istype(projectile, /obj/item/projectile/beam/practice)) + bmark.icon_state = "scorch" + bmark.set_dir(pick(NORTH, SOUTH, EAST, WEST)) // Random scorch design + else + bmark.icon_state = "light_scorch" + else + // Bullets are hard. They make dents! + bmark.icon_state = "dent" + + // Create bulletholes + if (projectile.damage >= 25) // Seriously, we commonly won't achive more than 35 holes. Because this things are beyond window. + + // Bullets make holes more commonly + if (projectile_type == PROJECTILE_TYPE_BULLET && prob(projectile.damage + 30)) + new/datum/bullethole(src, bmark.pixel_x, bmark.pixel_y) + + // Lasers make holes less commonly + if (projectile_type == PROJECTILE_TYPE_SCORCH && prob(projectile.damage - 10)) + new/datum/bullethole(src, bmark.pixel_x, bmark.pixel_y) + + // Draw bullet holes + for(var/datum/bullethole/bhole in bulletholes) + virtualIcon.DrawBox(null, bhole.b1x1, bhole.b1y, bhole.b1x2, bhole.b1y) // Horizontal line, left to right + virtualIcon.DrawBox(null, bhole.b2x, bhole.b2y1, bhole.b2x, bhole.b2y2) // Vertical line, top to bottom + + AddOverlays(bmark) // Add the decal + icon = virtualIcon // Apply bulletholes over decals + + return FALSE // The projectile stops + +#undef TARGET_RANDOM_OFFSET +#undef PROJECTILE_TYPE_BULLET +#undef PROJECTILE_TYPE_SCORCH + +#define BULLETHOLE_RANDOM_OFFSET pick(1, 1, 1, 1, 2, 2, 3, 3, 4) + +// Small memory holder entity for transparent bullet holes +/datum/bullethole + // First box + var/b1x1 = 0 + var/b1x2 = 0 + var/b1y = 0 + + // Second box + var/b2x = 0 + var/b2y1 = 0 + var/b2y2 = 0 + +/datum/bullethole/New(obj/item/target/owner, pixel_x = 0, pixel_y = 0) + if (!owner) return + + // Randomize the first box + b1x1 = pixel_x - BULLETHOLE_RANDOM_OFFSET + b1x2 = pixel_x + BULLETHOLE_RANDOM_OFFSET + b1y = pixel_y + if (prob(35)) + b1y += rand(-4, 4) + + // Randomize the second box + b2x = pixel_x + if (prob(35)) + b2x += rand(-4, 4) + b2y1 = pixel_y + BULLETHOLE_RANDOM_OFFSET + b2y2 = pixel_y - BULLETHOLE_RANDOM_OFFSET + + owner.bulletholes += src + +#undef BULLETHOLE_RANDOM_OFFSET diff --git a/maps/sierra/z1-z5_sierra.dmm b/maps/sierra/z1-z5_sierra.dmm index a7b7be4437ba1..f79e56f0b9d1d 100644 --- a/maps/sierra/z1-z5_sierra.dmm +++ b/maps/sierra/z1-z5_sierra.dmm @@ -24513,6 +24513,15 @@ }, /turf/simulated/floor/tiled/techfloor/grid, /area/maintenance/fourthdeck/aft) +"dDg" = ( +/obj/floor_decal/industrial/warning{ + dir = 5 + }, +/obj/item/target/alien, +/turf/simulated/floor/reinforced{ + map_airless = 1 + }, +/area/space) "dDh" = ( /turf/simulated/wall/prepainted, /area/vacant/utility) @@ -73498,6 +73507,11 @@ /obj/floor_decal/corner/darkblue/bordercorner2{ dir = 1 }, +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -23; + pixel_y = 5 + }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/office/iaa/high_sec) "kWB" = ( @@ -73537,6 +73551,12 @@ }, /turf/simulated/floor/plating, /area/shield/thirddeck) +"kXa" = ( +/obj/item/target, +/turf/simulated/floor/reinforced{ + map_airless = 1 + }, +/area/space) "kXd" = ( /obj/structure/cable/green{ d1 = 4; @@ -76062,6 +76082,11 @@ /obj/floor_decal/corner/darkblue/border, /obj/floor_decal/borderfloorblack/corner2, /obj/floor_decal/corner/darkblue/bordercorner2, +/obj/machinery/light_switch{ + dir = 1; + pixel_x = -9; + pixel_y = -21 + }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/office/iaa/high_sec) "lrH" = ( @@ -76592,18 +76617,11 @@ /turf/simulated/floor/plating, /area/medical/virology/atmos) "lvu" = ( -/obj/structure/closet/toolcloset, -/obj/item/storage/belt, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/device/multitool, /obj/structure/extinguisher_cabinet{ pixel_x = 24; dir = 8 }, -/obj/item/clothing/glasses/hud/it, +/obj/structure/closet/secure_closet/infotech_sierra, /turf/simulated/floor/tiled/techfloor/grid, /area/tcommsat/computer) "lvv" = ( @@ -79466,6 +79484,11 @@ /obj/floor_decal/corner/darkblue/bordercorner2{ dir = 5 }, +/obj/machinery/light_switch{ + pixel_x = 24; + dir = 8; + pixel_y = -5 + }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/office/iaa/high_sec) "lPF" = ( @@ -123027,6 +123050,12 @@ /obj/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/tiled/techfloor/grid, /area/maintenance/fourthdeck/aft) +"stv" = ( +/obj/item/target/syndicate, +/turf/simulated/floor/reinforced{ + map_airless = 1 + }, +/area/space) "stw" = ( /turf/simulated/wall/r_wall/hull, /area/crew_quarters/garden_room) @@ -290968,7 +290997,7 @@ rtT rtT rtT uYw -uYw +stv qPH rox sqc @@ -291171,7 +291200,7 @@ rpE qMW uYw uYw -uYw +kXa aif aAp rsp @@ -291371,7 +291400,7 @@ aTh tXe tXe vDB -lQM +dDg uYw pJv bYb diff --git a/mods/antagonists/README.md b/mods/antagonists/README.md index ced03cc9ce3a4..59d783639a07c 100644 --- a/mods/antagonists/README.md +++ b/mods/antagonists/README.md @@ -3,6 +3,7 @@ - https://github.com/SierraBay/SierraBay12/pull/1474 - https://github.com/SierraBay/SierraBay12/pull/1683 +- https://github.com/SierraBay/SierraBay12/pull/1798