diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index b0d1a1e15f..e56aa9b588 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -5625,7 +5625,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/brig) @@ -17830,7 +17829,7 @@ /turf/open/floor/wood, /area/service/bar) "aRx" = ( -/obj/machinery/computer/arcade/minesweeper, +/obj/machinery/computer/arcade/orion_trail, /turf/open/floor/wood, /area/service/bar) "aRy" = ( @@ -60122,7 +60121,7 @@ /turf/open/floor/plasteel, /area/commons/dorms) "nZL" = ( -/obj/machinery/computer/arcade/minesweeper, +/obj/machinery/computer/arcade/orion_trail, /turf/open/floor/wood, /area/command/heads_quarters/captain) "oax" = ( @@ -61634,7 +61633,6 @@ /area/security/prison/upper) "qtw" = ( /obj/machinery/door/airlock/external{ - dir = 2; name = "Port Docking Bay 4" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -64938,7 +64936,7 @@ /turf/open/floor/plasteel, /area/security/prison/upper) "vim" = ( -/obj/machinery/computer/arcade/minesweeper, +/obj/machinery/computer/arcade/battle, /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ icon_state = "1-2" diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm index 74debaa989..c5e8df8ed2 100644 --- a/_maps/map_files/CogStation/CogStation.dmm +++ b/_maps/map_files/CogStation/CogStation.dmm @@ -858,7 +858,7 @@ /turf/open/floor/plating/airless, /area/router/aux) "acf" = ( -/obj/machinery/computer/arcade/minesweeper, +/obj/machinery/computer/arcade/battle, /turf/open/floor/carpet/arcade, /area/commons/arcade) "acg" = ( @@ -4505,7 +4505,7 @@ /area/maintenance/solars/starboard/fore) "alg" = ( /obj/structure/frame/machine, -/obj/item/circuitboard/computer/arcade/minesweeper, +/obj/item/circuitboard/computer/arcade/orion_trail, /turf/open/floor/plating, /area/construction/secondary) "alh" = ( diff --git a/_maps/map_files/LambdaStation/dorms.dmm b/_maps/map_files/LambdaStation/dorms.dmm index afe85da6cc..e1133584b8 100644 --- a/_maps/map_files/LambdaStation/dorms.dmm +++ b/_maps/map_files/LambdaStation/dorms.dmm @@ -9501,7 +9501,7 @@ /obj/machinery/camera/autoname{ dir = 4 }, -/obj/machinery/computer/arcade/minesweeper{ +/obj/machinery/computer/arcade/orion_trail{ dir = 4 }, /turf/open/floor/plasteel, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 5b5885aca6..cc78b62bdc 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -70208,7 +70208,7 @@ }, /area/command/gateway) "pCQ" = ( -/obj/machinery/computer/arcade/minesweeper{ +/obj/machinery/computer/arcade/battle{ dir = 4 }, /turf/open/floor/plasteel, diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 17f21e98f5..06cc049e19 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -9274,11 +9274,15 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "axI" = ( -/obj/machinery/airalarm{ - pixel_y = 22 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /obj/effect/turf_decal/tile/red{ - dir = 4 + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 }, /turf/open/floor/plasteel, /area/hallway/primary/fore) @@ -85595,7 +85599,7 @@ avv xgz gZF ayL -pFy +axI aBd aCi aDo @@ -86364,7 +86368,7 @@ ajM quY uFZ nDM -axI +axL axG aAh aBf diff --git a/_maps/map_files/Snaxi/Snaxi.dmm b/_maps/map_files/Snaxi/Snaxi.dmm index d9cf6c7948..1db8a64a97 100644 --- a/_maps/map_files/Snaxi/Snaxi.dmm +++ b/_maps/map_files/Snaxi/Snaxi.dmm @@ -870,7 +870,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/machinery/computer/arcade/minesweeper{ +/obj/machinery/computer/arcade/orion_trail{ dir = 8 }, /obj/structure/sign/poster/official/nanomichi_ad{ @@ -5842,7 +5842,7 @@ /turf/open/floor/plating, /area/maintenance/aft/secondary) "akQ" = ( -/obj/machinery/computer/arcade/minesweeper, +/obj/machinery/computer/arcade/battle, /turf/open/floor/plasteel/dark, /area/security/prison) "akR" = ( @@ -34938,7 +34938,7 @@ dir = 1; pixel_y = -24 }, -/obj/machinery/computer/arcade/minesweeper{ +/obj/machinery/computer/arcade/orion_trail{ dir = 4 }, /turf/open/floor/plasteel/dark, diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index b34e68e9ae..669bf6326b 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -119,6 +119,8 @@ #define STATUS_EFFECT_CLOUDSTRUCK /datum/status_effect/cloudstruck //blinds and applies an overlay. +#define STATUS_EFFECT_GAUNTLET_CONC /datum/status_effect/cgau_conc // it's a slowdown that really should only be applying to large simplemobs + /// shoves inflict this to indicate the next shove while this is in effect should disarm guns #define STATUS_EFFECT_OFF_BALANCE /datum/status_effect/off_balance diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 7b4a06c74d..868351a833 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -326,7 +326,7 @@ SUBSYSTEM_DEF(vote) return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.") GLOB.master_mode = "dynamic" if(. == "extended") - GLOB.dynamic_forced_extended = TRUE + GLOB.dynamic_extended = TRUE message_admins("The gamemode has been voted for, and has been changed to: [GLOB.master_mode]") log_admin("Gamemode has been voted for and switched to: [GLOB.master_mode].") if("restart") diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index b75676dbd2..2e0df8917d 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -1132,3 +1132,16 @@ else if(fake_msg) to_chat(owner, fake_msg) msg_stage++ + +/datum/status_effect/cgau_conc + id = "cgau_conc" + examine_text = "SUBJECTPRONOUN rocks from side to side, confused." + duration = 5 SECONDS + +/datum/status_effect/cgau_conc/on_creation(mob/living/new_owner, ...) + . = ..() + new_owner.add_movespeed_modifier(/datum/movespeed_modifier/gauntlet_concussion) + +/datum/status_effect/cgau_conc/on_remove() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/gauntlet_concussion) + . = ..() diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index be07a5c3b9..68a103af63 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -1,13 +1,16 @@ #define RULESET_STOP_PROCESSING 1 -#define FAKE_REPORT_CHANCE 8 +#define FAKE_REPORT_CHANCE 20 #define REPORT_NEG_DIVERGENCE -15 #define REPORT_POS_DIVERGENCE 15 +#define EXTENDED_CURVE_CENTER -7 // Are HIGH_IMPACT_RULESETs allowed to stack? GLOBAL_VAR_INIT(dynamic_no_stacking, TRUE) // If enabled does not accept or execute any rulesets. GLOBAL_VAR_INIT(dynamic_forced_extended, FALSE) +// Antags still allowed, but no roundstart antags + midrounds are low impact +GLOBAL_VAR_INIT(dynamic_extended, FALSE) // How high threat is required for HIGH_IMPACT_RULESETs stacking. // This is independent of dynamic_no_stacking. GLOBAL_VAR_INIT(dynamic_stacking_limit, 90) @@ -163,6 +166,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) dat += "Split parameters: centre = [roundstart_split_curve_centre] ; width = [roundstart_split_curve_width].
" dat += "On average, [peaceful_percentage]% of the rounds are more peaceful.
" dat += "Forced extended: [GLOB.dynamic_forced_extended ? "On" : "Off"]
" + dat += "Dynamic extended: [GLOB.dynamic_extended ? "On" : "Off"]
" dat += "No stacking (only one round-ender): [GLOB.dynamic_no_stacking ? "On" : "Off"]
" dat += "Stacking limit: [GLOB.dynamic_stacking_limit] \[Adjust\]" dat += "
" @@ -192,6 +196,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return if (href_list["forced_extended"]) GLOB.dynamic_forced_extended = !GLOB.dynamic_forced_extended + else if (href_list["extended"]) + GLOB.dynamic_extended = !GLOB.dynamic_extended else if (href_list["no_stacking"]) GLOB.dynamic_no_stacking = !GLOB.dynamic_no_stacking else if (href_list["adjustthreat"]) @@ -309,9 +315,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /// Generates the threat level using lorentz distribution and assigns peaceful_percentage. /datum/game_mode/dynamic/proc/generate_threat() + if(GLOB.dynamic_extended) + threat_curve_centre = EXTENDED_CURVE_CENTER var/relative_threat = LORENTZ_DISTRIBUTION(threat_curve_centre, threat_curve_width) threat_level = round(lorentz_to_amount(relative_threat), 0.1) - peaceful_percentage = round(LORENTZ_CUMULATIVE_DISTRIBUTION(relative_threat, threat_curve_centre, threat_curve_width), 0.01)*100 SSblackbox.record_feedback("tally","dynamic_threat",threat_level,"Initial threat level") @@ -321,14 +328,18 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /// Generates the midround and roundstart budgets /datum/game_mode/dynamic/proc/generate_budgets() - var/relative_round_start_budget_scale = LORENTZ_DISTRIBUTION(roundstart_split_curve_centre, roundstart_split_curve_width) - round_start_budget = round((lorentz_to_amount(relative_round_start_budget_scale) / 100) * threat_level, 0.1) - initial_round_start_budget = round_start_budget - mid_round_budget = threat_level - round_start_budget + if(GLOB.dynamic_extended) + mid_round_budget = threat_level + round_start_budget = 0 + else + var/relative_round_start_budget_scale = LORENTZ_DISTRIBUTION(roundstart_split_curve_centre, roundstart_split_curve_width) + round_start_budget = round((lorentz_to_amount(relative_round_start_budget_scale) / 100) * threat_level, 0.1) + initial_round_start_budget = round_start_budget + mid_round_budget = threat_level - round_start_budget /datum/game_mode/dynamic/proc/setup_parameters() log_game("DYNAMIC: Dynamic mode parameters for the round:") - log_game("DYNAMIC: Centre is [threat_curve_centre], Width is [threat_curve_width], Forced extended is [GLOB.dynamic_forced_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].") + log_game("DYNAMIC: Centre is [threat_curve_centre], Width is [threat_curve_width], Extended is [GLOB.dynamic_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].") log_game("DYNAMIC: Stacking limit is [GLOB.dynamic_stacking_limit].") if(GLOB.dynamic_forced_threat_level >= 0) threat_level = round(GLOB.dynamic_forced_threat_level, 0.1) @@ -346,9 +357,15 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) shown_threat = clamp(threat_level + rand(REPORT_NEG_DIVERGENCE, REPORT_POS_DIVERGENCE), 0, 100) /datum/game_mode/dynamic/proc/set_cooldowns() + var/coeff = GLOB.dynamic_extended ? 2 : 1 + latejoin_delay_min *= coeff + latejoin_delay_max *= coeff var/latejoin_injection_cooldown_middle = 0.5*(latejoin_delay_max + latejoin_delay_min) latejoin_injection_cooldown = round(clamp(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), latejoin_delay_min, latejoin_delay_max)) + world.time + midround_delay_min *= coeff + midround_delay_max *= coeff + var/midround_injection_cooldown_middle = 0.5*(midround_delay_max + midround_delay_min) midround_injection_cooldown = round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), midround_delay_min, midround_delay_max)) + world.time @@ -456,6 +473,9 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if (GLOB.dynamic_forced_extended) log_game("DYNAMIC: Starting a round of forced extended.") return TRUE + if (GLOB.dynamic_extended) + log_game("DYNAMIC: Starting a round of dynamic extended.") + return TRUE var/list/drafted_rules = list() for (var/datum/dynamic_ruleset/roundstart/rule in roundstart_rules) if (!rule.weight) @@ -563,9 +583,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return FALSE // Check if the ruleset is high impact and if a high impact ruleset has been executed else if(new_rule.flags & HIGH_IMPACT_RULESET) - if(threat_level < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) - if(high_impact_ruleset_executed) - return FALSE + if(GLOB.dynamic_extended) + return FALSE + if(high_impact_ruleset_executed && threat_level < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) + return FALSE var/population = current_players[CURRENT_LIVING_PLAYERS].len if((new_rule.acceptable(population, threat_level) && new_rule.cost <= mid_round_budget) || forced) @@ -598,8 +619,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /datum/game_mode/dynamic/proc/midround_rule_draft() set waitfor = FALSE if (midround_injection_cooldown < world.time) - /*if (GLOB.dynamic_forced_extended) - return*/ + if (GLOB.dynamic_forced_extended) + return // Somehow it managed to trigger midround multiple times so this was moved here. // There is no way this should be able to trigger an injection twice now. @@ -620,6 +641,11 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) for (var/datum/dynamic_ruleset/midround/rule in midround_rules) if (!rule.weight) continue + if(rule.flags & HIGH_IMPACT_RULESET) + if (high_impact_ruleset_executed && threat_level < GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) + continue + if(GLOB.dynamic_extended) + continue if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && mid_round_budget >= rule.cost) rule.trim_candidates() if (rule.ready()) @@ -642,11 +668,17 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) forced_injection = dry_run return 100 var/chance = 0 - var/max_pop_per_antag = max(5,15 - round(threat_level/10) - round(current_players[CURRENT_LIVING_PLAYERS].len/5)) + var/effective_living_players = current_players[CURRENT_LIVING_PLAYERS].len + if(GLOB.dynamic_extended) + effective_living_players = min(effective_living_players, length(SSjob.get_living_sec())*2 + length(SSjob.get_living_heads())) + var/max_pop_per_antag = max(5,15 - round(threat_level/10) - round(effective_living_players/5)) if (!current_players[CURRENT_LIVING_ANTAGS].len) - chance += 50 // No antags at all? let's boost those odds! + if(GLOB.dynamic_extended) + chance += min(50,effective_living_players*5) + else + chance += 50 // No antags at all? let's boost those odds! else - var/current_pop_per_antag = current_players[CURRENT_LIVING_PLAYERS].len / current_players[CURRENT_LIVING_ANTAGS].len + var/current_pop_per_antag = effective_living_players / current_players[CURRENT_LIVING_ANTAGS].len if (current_pop_per_antag > max_pop_per_antag) chance += min(50, 25+10*(current_pop_per_antag-max_pop_per_antag)) else diff --git a/code/game/machinery/autoloom.dm b/code/game/machinery/autoloom.dm new file mode 100644 index 0000000000..f290ac1a96 --- /dev/null +++ b/code/game/machinery/autoloom.dm @@ -0,0 +1,102 @@ +// like a recycler, but for plants only ig +/obj/machinery/autoloom + name = "autoloom" + desc = "A large processing machine used to process raw biological matter, like cotton or logs. It also looks like a recycler. There's a display on the side." + icon = 'icons/obj/recycling.dmi' + icon_state = "grinder-o0" + layer = ABOVE_ALL_MOB_LAYER // Overhead + density = TRUE + circuit = /obj/item/circuitboard/machine/autoloom + var/icon_name = "grinder-o" + var/eat_dir = WEST + var/process_efficiency = 0 + var/static/list/can_process = typecacheof(list( + /obj/item/stack/sheet/cotton, + /obj/item/grown/log, + /obj/item/grown/cotton + )) + +/obj/machinery/autoloom/RefreshParts() + for(var/obj/item/stock_parts/manipulator/M in component_parts) + process_efficiency = M.rating + +/obj/machinery/recycler/examine(mob/user) + . = ..() + . += "Biomatter processing efficiency at [amount_produced*100]%." + +/obj/machinery/autoloom/power_change() + ..() + update_icon() + +/obj/machinery/autoloom/attackby(obj/item/I, mob/user, params) + if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I)) + return + + if(default_pry_open(I)) + return + + if(default_unfasten_wrench(user, I)) + return + + if(default_deconstruction_crowbar(I)) + return + return ..() + +/obj/machinery/autoloom/update_icon_state() + var/is_powered = !(stat & (BROKEN|NOPOWER)) + icon_state = icon_name + "[is_powered]" // add the blood tag at the end + +/obj/machinery/autoloom/CanPass(atom/movable/AM) + . = ..() + if(!anchored) + return + + var/move_dir = get_dir(loc, AM.loc) + if(move_dir == eat_dir) + return TRUE + +/obj/machinery/autoloom/Crossed(atom/movable/AM) + eat(AM) + . = ..() + +/obj/machinery/autoloom/proc/eat(atom/movable/AM0, sound=TRUE) + if(stat & (BROKEN|NOPOWER)) + return + if(!isturf(AM0.loc)) + return //I don't know how you called Crossed() but stop it. + + if(is_type_in_list(AM0, can_process)) + process_item(AM0) + +/obj/machinery/autoloom/proc/process_item(obj/item/I) + . = list() + for(var/A in I) + var/atom/movable/AM = A + AM.forceMove(loc) + if(AM.loc == loc) + . += AM + + I.forceMove(loc) + if(istype(I, /obj/item/grown/log)) + var/obj/item/grown/log/L = I + var/seed_modifier = 0 + if(L.seed) + seed_modifier = round(L.seed.potency / 25) + new L.plank_type(src.loc, process_efficiency + seed_modifier) + qdel(L) + return + + if(istype(I, /obj/item/stack/sheet/cotton)) + var/obj/item/stack/sheet/cotton/RS = I + var/tomake = round((RS.amount / 4) * process_efficiency) + new RS.loom_result(src.loc, tomake) + qdel(RS) + return + + if(istype(I, /obj/item/grown/cotton)) + var/obj/item/grown/cotton/RC = I + var/cottonAmt = 1 + round(RC.seed.potency / 25) + var/newRaw = new RC.cotton_type(src.loc, cottonAmt) + qdel(RC) + process_item(newRaw) + return diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index dd2ebf287f..e430ac469f 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -82,9 +82,8 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( // If it's a generic arcade machine, pick a random arcade // circuit board for it and make the new machine if(!circuit) - var/list/gameodds = list(/obj/item/circuitboard/computer/arcade/battle = 33, - /obj/item/circuitboard/computer/arcade/orion_trail = 33, - /obj/item/circuitboard/computer/arcade/minesweeper = 33, + var/list/gameodds = list(/obj/item/circuitboard/computer/arcade/battle = 50, + /obj/item/circuitboard/computer/arcade/orion_trail = 50, /obj/item/circuitboard/computer/arcade/amputation = 2) var/thegame = pickweight(gameodds) var/obj/item/circuitboard/CB = new thegame() diff --git a/code/game/machinery/computer/arcade/minesweeper.dm b/code/game/machinery/computer/arcade/minesweeper.dm deleted file mode 100644 index 1027ab1815..0000000000 --- a/code/game/machinery/computer/arcade/minesweeper.dm +++ /dev/null @@ -1,413 +0,0 @@ -#define MINESWEEPER_GAME_MAIN_MENU 0 -#define MINESWEEPER_GAME_PLAYING 1 -#define MINESWEEPER_GAME_LOST 2 -#define MINESWEEPER_GAME_WON 3 -#define MINESWEEPERIMG(what) {""} //Basically bypassing asset.icon_tag() - -/obj/machinery/computer/arcade/minesweeper - name = "Minesweeper" - desc = "An arcade machine that generates grids. It seems that the machine sparks and screeches when a grid is generated, as if it cannot cope with the intensity of generating the grid." - icon_state = "arcade" - circuit = /obj/item/circuitboard/computer/arcade/minesweeper - var/area - var/difficulty = "" //To show what difficulty you are playing - var/flag_text = "" - var/flagging = FALSE - var/game_status = MINESWEEPER_GAME_MAIN_MENU - var/mine_limit = 0 - var/mine_placed = 0 - var/mine_sound = TRUE //So it doesn't get repeated when multiple mines are exposed - var/randomcolour = 1 - var/randomnumber = 1 //Random emagged game iteration number to be displayed, put here so it is persistent across one individual arcade machine - var/safe_squares_revealed - var/saved_web = "" //To display the web if you click on the arcade - var/win_condition - var/rows = 1 - var/columns = 1 - var/table[31][51] //Make the board boys, 30x50 board - var/spark_spam = FALSE - -/obj/machinery/computer/arcade/minesweeper/interact(mob/user) - var/emagged = CHECK_BITFIELD(obj_flags, EMAGGED) - var/dat - if(game_status == MINESWEEPER_GAME_MAIN_MENU) - dat += "Minesweeper
Minesweeper[emagged ? " EXTREME EDITION: Iteration #[randomnumber]" : ""]
" //Different colour mix for every random number made - dat += " [emagged ? "Explode in the game, explode in real life" : "Reveal all the squares without hitting a mine"]!
What difficulty do you want to play?



Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom" - else - dat = saved_web - user = usr - - var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/simple/minesweeper) - assets.send(user) - - user << browse(dat,"window=minesweeper,size=400x500") - add_fingerprint(user) - - . = ..() - -/obj/machinery/computer/arcade/minesweeper/proc/reset_spark_spam() - spark_spam = FALSE - -/obj/machinery/computer/arcade/minesweeper/Topic(href, href_list) - . = ..() - if(.) - return - - var/exploding_hell = FALSE //For emagged failures - var/reset_board = FALSE - var/mob/living/user = usr //To identify who the hell is using this window, this should also make things like aliens and monkeys able to use the machine!! - var/web_difficulty_menu = " Reveal all the squares without hitting a mine!
What difficulty do you want to play?



Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom" - var/web = "Minesweeper
Minesweeper
" - var/static_web = "Minesweeper
Minesweeper
" //When we need to revert to the main menu we set web as this - web = static_web - - if(CHECK_BITFIELD(obj_flags, EMAGGED)) - web = "Minesweeper
Minesweeper EXTREME EDITION: Iteration #[randomnumber]
" //Different colour mix for every random number made - if(!spark_spam) - do_sparks(5, 1, src) - spark_spam = TRUE - addtimer(CALLBACK(src, .proc/reset_spark_spam), 30) - - - var/startup_sound = CHECK_BITFIELD(obj_flags, EMAGGED) ? 'sound/arcade/minesweeper_emag2.ogg' : 'sound/arcade/minesweeper_startup.ogg' - - if(href_list["Main_Menu"]) - game_status = MINESWEEPER_GAME_MAIN_MENU - mine_limit = 0 - rows = 0 - columns = 0 - mine_placed = 0 - if(href_list["Easy"]) - playsound(loc, startup_sound, 50, FALSE, extrarange = -3) - flag_text = "OFF" - game_status = MINESWEEPER_GAME_PLAYING - reset_board = TRUE - difficulty = "Easy" - rows = 10 //9x9 board - columns = 10 - mine_limit = 10 - if(href_list["Intermediate"]) - playsound(loc, startup_sound, 50, FALSE, extrarange = -3) - flag_text = "OFF" - game_status = MINESWEEPER_GAME_PLAYING - reset_board = TRUE - difficulty = "Intermediate" - rows = 17 //16x16 board - columns = 17 - mine_limit = 40 - if(href_list["Hard"]) - playsound(loc, startup_sound, 50, FALSE, extrarange = -3) - flag_text = "OFF" - game_status = MINESWEEPER_GAME_PLAYING - reset_board = TRUE - difficulty = "Hard" - rows = 17 //16x30 board - columns = 31 - mine_limit = 99 - if(href_list["Custom"]) - if(custom_generation(usr)) - flag_text = "OFF" - game_status = MINESWEEPER_GAME_PLAYING - reset_board = TRUE - difficulty = "Custom" - playsound(loc, startup_sound, 50, FALSE, extrarange = -3) - if(href_list["Flag"]) - playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3) - if(!flagging) - flagging = TRUE - flag_text = "ON" - else - flagging = FALSE - flag_text = "OFF" - - if(game_status == MINESWEEPER_GAME_MAIN_MENU) - if(CHECK_BITFIELD(obj_flags, EMAGGED)) - playsound(loc, 'sound/arcade/minesweeper_emag2.ogg', 50, FALSE, extrarange = -3) - web += "Explode in the game, explode in real life!
What difficulty do you want to play?



Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom" - else - playsound(loc, 'sound/arcade/minesweeper_startup.ogg', 50, FALSE, extrarange = -3) - web += web_difficulty_menu - - if(game_status == MINESWEEPER_GAME_PLAYING) - mine_sound = TRUE - - area = (rows-1)*(columns-1) - - if(reset_board) - mine_placed = 0 - var/reset_everything = TRUE - make_mines(reset_everything) - - safe_squares_revealed = 0 - win_condition = area-mine_placed - - if(game_status != MINESWEEPER_GAME_MAIN_MENU) - for(var/y1=1;y1= 0) //Check that it's not already revealed, and stop flag removal if we're out of flag mode - table[y1][x1] += 10 - if(table[y1][x1] != 10) - playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3) - else - if(game_status != MINESWEEPER_GAME_LOST && game_status != MINESWEEPER_GAME_WON) - game_status = MINESWEEPER_GAME_LOST - if(CHECK_BITFIELD(obj_flags, EMAGGED) && !exploding_hell) - exploding_hell = TRUE - explode_EVERYTHING() - if(QDELETED(src)) - return - if(mine_sound) - switch(rand(1,3)) //Play every time a mine is hit - if(1) - playsound(loc, 'sound/arcade/minesweeper_explosion1.ogg', 50, FALSE, extrarange = -3) - if(2) - playsound(loc, 'sound/arcade/minesweeper_explosion2.ogg', 50, FALSE, extrarange = -3) - if(3) - playsound(loc, 'sound/arcade/minesweeper_explosion3.ogg', 50, FALSE, extrarange = -3) - mine_sound = FALSE - else - playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3) - if(table[y1][x1] >= 0) //Check that it's not already flagged - table[y1][x1] -= 10 - else if(table[y1][x1] < 0) //If flagged, remove the flag - table[y1][x1] += 10 - if(table[y1][x1] > 10 && !reset_board) - safe_squares_revealed += 1 - var/y2 = y1 - var/x2 = x1 - work_squares(y2, x2) //Work squares while in this loop so there's less load - reset_board = FALSE - CHECK_TICK - - web += "" //Start setting up the html table - web += "" - for(var/y1=1;y1= win_condition && game_status == MINESWEEPER_GAME_PLAYING) - game_status = MINESWEEPER_GAME_WON - if(rows < 10 || columns < 10) //If less than easy difficulty - playsound(loc, 'sound/arcade/minesweeper_winfail.ogg', 50, FALSE, extrarange = -3) - say("You cleared the board of all mines, but you picked too small of a board! Try again with at least a 9x9 board!") - else - playsound(loc, 'sound/arcade/minesweeper_win.ogg', 50, FALSE, extrarange = -3) - say("You cleared the board of all mines! Congratulations!") - if(CHECK_BITFIELD(obj_flags, EMAGGED)) - var/itemname - switch(rand(1,3)) - if(1) - itemname = "a syndicate bomb beacon" - new /obj/item/sbeacondrop/bomb(loc) - if(2) - itemname = "a rocket launcher" - new /obj/item/gun/ballistic/rocketlauncher/unrestricted(loc) - new /obj/item/ammo_casing/caseless/rocket(loc) - new /obj/item/ammo_casing/caseless/rocket(loc) - new /obj/item/ammo_casing/caseless/rocket(loc) - if(3) - itemname = "two bags of c4" - new /obj/item/storage/backpack/duffelbag/syndie/c4(loc) - new /obj/item/storage/backpack/duffelbag/syndie/x4(loc) - message_admins("[key_name_admin(user)] won emagged Minesweeper and got [itemname]!") - visible_message("[src] dispenses [itemname]!", "You hear a chime and a clunk.") - DISABLE_BITFIELD(obj_flags, EMAGGED) - else - var/dope_prizes = (area >= 480) ? 6 : (area >= 256) ? 4 : 2 - prizevend(user, dope_prizes) - - if(game_status == MINESWEEPER_GAME_WON) - web += "[(rows < 10 || columns < 10) ? "You won, but your board was too small! Pick a bigger board next time!" : "Congratulations, you have won!"]
Want to play again?
Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom

Return to Main Menu
" - - if(game_status == MINESWEEPER_GAME_LOST) - web += "You have lost!
Try again?
Easy (9x9 board, 10 mines)
Intermediate (16x16 board, 40 mines)
Hard (16x30 board, 99 mines)
Custom

Return to Main Menu
" - - if(game_status == MINESWEEPER_GAME_PLAYING) - web += "Return to Main Menu
" - web += "
Difficulty: [difficulty]
Mines: [mine_placed]
Rows: [rows-1]
Columns: [columns-1]
Flagging mode: [flag_text]
" - - web += "" - var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/simple/minesweeper) - saved_web = sheet.css_tag() - saved_web += web - updateDialog() - return - -/obj/machinery/computer/arcade/minesweeper/emag_act(mob/user) - . = ..() - if(CHECK_BITFIELD(obj_flags, EMAGGED)) - return - desc = "An arcade machine that generates grids. It's clunking and sparking everywhere, almost as if threatening to explode at any moment!" - do_sparks(5, 1, src) - randomnumber = rand(1,255) - randomcolour = rgb(randomnumber,randomnumber/2,randomnumber/3) - ENABLE_BITFIELD(obj_flags, EMAGGED) - if(game_status == MINESWEEPER_GAME_MAIN_MENU) - to_chat(user, "An ominous tune plays from the arcade's speakers!") - playsound(user, 'sound/arcade/minesweeper_emag1.ogg', 100, FALSE, extrarange = 3) - else //Can't let you do that, star fox! - to_chat(user, "The machine buzzes and sparks... the game has been reset!") - playsound(user, 'sound/machines/buzz-sigh.ogg', 100, FALSE, extrarange = 3) //Loud buzz - game_status = MINESWEEPER_GAME_MAIN_MENU - return TRUE - -/obj/machinery/computer/arcade/minesweeper/proc/custom_generation(mob/user) - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3) //Entered into the menu so ping sound - var/new_rows = input(user, "How many rows do you want? (Minimum: 4, Maximum: 30)", "Minesweeper Rows") as null|num - if(!new_rows || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) - return FALSE - new_rows = clamp(new_rows + 1, 4, 20) - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3) - var/new_columns = input(user, "How many columns do you want? (Minimum: 4, Maximum: 50)", "Minesweeper Squares") as null|num - if(!new_columns || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) - return FALSE - new_columns = clamp(new_columns + 1, 4, 30) - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3) - var/grid_area = (new_rows - 1) * (new_columns - 1) - var/lower_limit = round(grid_area*0.156) - var/upper_limit = round(grid_area*0.85) - var/new_mine_limit = input(user, "How many mines do you want? (Minimum: [lower_limit], Maximum: [upper_limit])", "Minesweeper Mines") as null|num - if(!new_mine_limit || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) - return FALSE - playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3) - rows = new_rows - columns = new_columns - mine_limit = clamp(new_mine_limit, lower_limit, upper_limit) - return TRUE - -/obj/machinery/computer/arcade/minesweeper/proc/make_mines(var/reset_everything) - if(mine_placed < mine_limit) - for(var/y1=1;y1 0 && x3 > 0) - y2 = y3 - x2 = x3 - if(table[y2][x2] == 1) - for(y3=y2-1;y3= rows || y3 < 1) - continue - for(x3=x2-1;x3= columns || x3 < 1) - continue - if(table[y3][x3] == 0) - table[y2][x2] += 1 - if(table[y2][x2] == 11) - for(y3=y2-1;y3= rows || y3 < 1) - continue - for(x3=x2-1;x3= columns || x3 < 1) - continue - if(table[y3][x3] > 0 && table[y3][x3] < 10) - table[y3][x3] += 10 - work_squares(y3, x3) //Refresh so we check everything we might be missing - -/obj/machinery/computer/arcade/minesweeper/proc/explode_EVERYTHING() - var/mob/living/user = usr - to_chat(user, "You feel a great sense of dread wash over you, as if you just unleashed armageddon upon yourself!") - var/row_limit = rows-1 - var/column_limit = columns-1 - var/mine_limit_v2 = mine_limit - if(rows > 21) - row_limit = 20 - if(columns > 21) - column_limit = 20 - if(mine_limit > (rows*columns) * 0.25) - mine_limit_v2 = 24 - message_admins("[key_name_admin(user)] failed an emagged Minesweeper arcade and has unleashed an explosion armageddon of size [row_limit],[column_limit] around [ADMIN_LOOKUPFLW(user.loc)]!") - if(mine_limit_v2 < 10) - explosion(loc, 2, 5, 10, 15) //Thought you could survive by putting as few mines as possible, huh?? - else - explosion(loc, 1, 3, rand(1,5), rand(1,10)) - var/list/targets = list() - var/cur_y = y - round(row_limit * 0.5, 1) - var/starting_row = 1 - if(cur_y < 1) - starting_row -= cur_y - 1 - cur_y = 1 - var/start_x = x - round(column_limit * 0.5, 1) - var/starting_column = 1 - if(start_x < 1) - starting_column -= start_x - 1 - start_x = 1 - for(var/row in starting_row to length(table)) //translate the mines locations into actual turf coordinates. - if(!locate(cur_y, start_x, z)) - break - var/cur_x = start_x - for(var/column in starting_column to length(table[row])) - var/coord_value = table[row][column] - if(coord_value == 10 || coord_value == 0) //there is a mine in here. - var/turf/T = locate(cur_y, cur_x, z) - if(!T) - break - targets += T - cur_x++ - cur_y++ - var/num_explosions = 0 - for(var/T in shuffle(targets)) //Create a shitton of explosions in irl turfs if we lose, it will probably kill us - addtimer(CALLBACK(GLOBAL_PROC, /proc/explosion, T, 0, rand(1,2),rand(1,5),rand(3,10), FALSE), 15 * ++num_explosions) - if(num_explosions == mine_limit_v2) - return - -#undef MINESWEEPERIMG -#undef MINESWEEPER_GAME_MAIN_MENU -#undef MINESWEEPER_GAME_PLAYING -#undef MINESWEEPER_GAME_LOST -#undef MINESWEEPER_GAME_WON diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index afab49ac76..742a1fe3b0 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -259,11 +259,6 @@ build_path = /obj/machinery/computer/arcade/orion_trail -/obj/item/circuitboard/computer/arcade/minesweeper - name = "Minesweeper (Computer Board)" - icon_state = "generic" - build_path = /obj/machinery/computer/arcade/minesweeper - /obj/item/circuitboard/computer/holodeck// Not going to let people get this, but it's just here for future name = "Holodeck Control (Computer Board)" icon_state = "generic" diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 6bf6e7d312..cb1d4aae88 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -1295,6 +1295,15 @@ /obj/item/stock_parts/manipulator = 1) needs_anchored = FALSE +/obj/item/circuitboard/machine/autoloom + name = "Autoloom (Machine Board)" + icon_state = "service" + build_path = /obj/machinery/autoloom + req_components = list( + /obj/item/stock_parts/matter_bin = 1, + /obj/item/stock_parts/manipulator = 1) + needs_anchored = FALSE + /obj/item/circuitboard/machine/seed_extractor name = "Seed Extractor (Machine Board)" icon_state = "service" diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index eea189c3be..9a6a87bb51 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -23,7 +23,7 @@ max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) resistance_flags = FIRE_PROOF - wound_bonus = -110 + wound_bonus = -40 bare_wound_bonus = 20 block_parry_data = /datum/block_parry_data/dual_esword block_chance = 60 @@ -133,7 +133,7 @@ total_mass = initial(total_mass) wielded = FALSE hitsound = "swing_hit" - slowdown_wielded -= slowdown_wielded + slowdown -= slowdown_wielded STOP_PROCESSING(SSobj, src) set_light(0) RemoveElement(/datum/element/sword_point) @@ -278,6 +278,7 @@ desc = "A supermassive weapon envisioned to cleave the very fabric of space and time itself in twain, the hypereutactic blade dynamically flash-forges a hypereutactic crystaline nanostructure capable of passing through most known forms of matter like a hot knife through butter." force = 7 hitsound_on = 'sound/weapons/nebhit.ogg' + wound_bonus = -20 armour_penetration = 60 light_color = "#37FFF7" rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00") diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index b587e57c3a..356ccffef3 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -58,6 +58,7 @@ desc = "A wondrous decorated Christmas tree." icon_state = "pine_c" icon_states = null + resistance_flags = INDESTRUCTIBLE //Sorry grinch, not this time /obj/structure/flora/tree/pine/xmas/presents icon_state = "pinepresents" diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 40af75002f..be92782c74 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -800,6 +800,13 @@ /datum/outfit/ghostcafe/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() + if (isplasmaman(H)) + head = /obj/item/clothing/head/helmet/space/plasmaman + uniform = /obj/item/clothing/under/plasmaman + l_hand= /obj/item/tank/internals/plasmaman/belt/full + mask = /obj/item/clothing/mask/breath + return + var/suited = !preference_source || preference_source.prefs.jumpsuit_style == PREF_SUIT if (CONFIG_GET(flag/grey_assistants)) uniform = suited ? /obj/item/clothing/under/color/grey : /obj/item/clothing/under/color/jumpskirt/grey @@ -809,6 +816,10 @@ else uniform = suited ? /obj/item/clothing/under/color/random : /obj/item/clothing/under/color/jumpskirt/random +/datum/outfit/ghostcafe/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) + H.internal = H.get_item_for_held_index(1) + H.update_internals_hud_icon(1) + /obj/item/storage/box/syndie_kit/chameleon/ghostcafe name = "ghost cafe costuming kit" desc = "Look just the way you did in life - or better!" diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 4980981574..6a588a61cd 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -247,7 +247,13 @@ GLOBAL_LIST_EMPTY(crematoriums) locked = TRUE update_icon() - + for(var/mob/living/simple_animal/jacq/J in conts) + visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") + playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 0.25) + J.poof() + locked = FALSE + update_icon() + return for(var/mob/living/M in conts) if (M.stat != DEAD) M.emote("scream") diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 0af024985e..2d680fe212 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -273,24 +273,6 @@ "frenching" = 'icons/UI_Icons/Achievements/Misc/frenchingthebubble.png' ) -/datum/asset/spritesheet/simple/minesweeper - name = "minesweeper" - assets = list( - "1" = 'icons/UI_Icons/minesweeper_tiles/one.png', - "2" = 'icons/UI_Icons/minesweeper_tiles/two.png', - "3" = 'icons/UI_Icons/minesweeper_tiles/three.png', - "4" = 'icons/UI_Icons/minesweeper_tiles/four.png', - "5" = 'icons/UI_Icons/minesweeper_tiles/five.png', - "6" = 'icons/UI_Icons/minesweeper_tiles/six.png', - "7" = 'icons/UI_Icons/minesweeper_tiles/seven.png', - "8" = 'icons/UI_Icons/minesweeper_tiles/eight.png', - "empty" = 'icons/UI_Icons/minesweeper_tiles/empty.png', - "flag" = 'icons/UI_Icons/minesweeper_tiles/flag.png', - "hidden" = 'icons/UI_Icons/minesweeper_tiles/hidden.png', - "mine" = 'icons/UI_Icons/minesweeper_tiles/mine.png', - "minehit" = 'icons/UI_Icons/minesweeper_tiles/minehit.png' - ) - /datum/asset/spritesheet/simple/pills name = "pills" assets = list( diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm index 91663dbe0f..990e32df67 100644 --- a/code/modules/cargo/packs/misc.dm +++ b/code/modules/cargo/packs/misc.dm @@ -171,11 +171,11 @@ desc = "Start up your own grand casino with this crate filled with slot machine and arcade boards!" cost = 3000 contains = list(/obj/item/circuitboard/computer/arcade/battle, + /obj/item/circuitboard/computer/arcade/battle, /obj/item/circuitboard/computer/arcade/battle, /obj/item/circuitboard/computer/arcade/orion_trail, /obj/item/circuitboard/computer/arcade/orion_trail, - /obj/item/circuitboard/computer/arcade/minesweeper, - /obj/item/circuitboard/computer/arcade/minesweeper, + /obj/item/circuitboard/computer/arcade/orion_trail, /obj/item/circuitboard/computer/slot_machine, /obj/item/circuitboard/computer/slot_machine, /obj/item/circuitboard/computer/slot_machine, diff --git a/code/modules/holiday/halloween/bartholomew.dm b/code/modules/holiday/halloween/bartholomew.dm index 31cfb1f26a..12a0858b8d 100644 --- a/code/modules/holiday/halloween/bartholomew.dm +++ b/code/modules/holiday/halloween/bartholomew.dm @@ -8,14 +8,9 @@ anchored = TRUE var/items_list = list() speech_span = "spooky" + resistance_flags = INDESTRUCTIBLE var/active = TRUE -/obj/item/barthpot/Destroy() - var/obj/item/barthpot/n = new src(loc) - n.items_list = items_list - ..() - - /obj/item/barthpot/attackby(obj/item/I, mob/user, params) if(!active) say("Meow!") diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm index ed7453ad3e..f76255d9e8 100644 --- a/code/modules/holiday/halloween/jacqueen.dm +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -65,6 +65,10 @@ cached_z = z poof() +/mob/living/simple_animal/jacq/ComponentInitialize() //she just wants to bring halloween to the station + . = ..() + AddComponent(/datum/component/stationloving) + /mob/living/simple_animal/jacq/BiologicalLife(seconds, times_fired) if(!(. = ..())) return diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 2149967049..91078bb135 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -184,6 +184,7 @@ icon_state = "crusher-glaive" item_state = "crusher0-glaive" block_parry_data = /datum/block_parry_data/crusherglaive + obj_flags = UNIQUE_RENAME //ideas: altclick that lets you pummel people with the handguard/handle? //parrying functionality? @@ -238,6 +239,36 @@ /obj/item/kinetic_crusher/glaive/bone/update_icon_state() item_state = "crusher[wielded]-bone" +/obj/item/kinetic_crusher/glaive/gauntlets + name = "proto-kinetic gauntlets" + desc = "A pair of scaled-down proto-kinetic crusher destabilizer modules shoved into gauntlets and greaves, often used by \ + those who wish to spit in the eyes of God. Sacrifices outright damage for \ + a reliance on backstabs and the ability to give fauna concussions on a parry." + attack_verb = list("pummeled", "punched", "jabbed", "hammer-fisted", "uppercut", "slammed") + icon_state = "crusher-hands" + item_state = "crusher0-fist" + unique_reskin = list("Gauntlets" = "crusher-hands", + "Fingerless" = "crusher-hands-bare") + detonation_damage = 45 // 60 on wield, compared to normal crusher's 70 + backstab_bonus = 70 // 130 on backstab though + +/obj/item/kinetic_crusher/glaive/gauntlets/ComponentInitialize() + . = ..() + AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=15) + +/obj/item/kinetic_crusher/glaive/gauntlets/active_parry_reflex_counter(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list, parry_efficiency, list/effect_text) + . = ..() + if(isliving(attacker)) + var/mob/living/liv_atk = attacker + if(liv_atk.mob_size >= MOB_SIZE_LARGE && !ismegafauna(liv_atk)) + liv_atk.apply_status_effect(STATUS_EFFECT_GAUNTLET_CONC) + +/obj/item/kinetic_crusher/glaive/gauntlets/update_icon_state() + if(current_skin == "Fingerless") + item_state = "crusher[wielded]-fistbare" + else + item_state = "crusher[wielded]-fist" + //destablizing force /obj/item/projectile/destabilizer name = "destabilizing force" diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 7a3cd9140b..b1bde7d454 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -74,7 +74,7 @@ new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining/cloned, 3000), new /datum/data/mining_equipment("Premium Accelerator", /obj/item/gun/energy/kinetic_accelerator/premiumka, 8000), - new /datum/data/mining_equipment("Kinetic Glaive Kit", /obj/item/storage/backpack/duffelbag/mining/glaivekit, 2250), + new /datum/data/mining_equipment("Premium Kinetic Melee Kit", /obj/item/storage/backpack/duffelbag/mining/glaivekit, 2250), new /datum/data/mining_equipment("Survival Dagger", /obj/item/kitchen/knife/combat/survival/knuckledagger, 550), ) @@ -166,6 +166,7 @@ return I.mining_points -= prize.cost to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") + playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) new prize.equipment_path(loc) SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]")) . = TRUE @@ -187,6 +188,9 @@ if(istype(I, /obj/item/suit_voucher)) RedeemSVoucher(I, user) return + if(istype(I, /obj/item/premium_crusher_voucher)) + RedeemPCVoucher(I, user) + return if(default_deconstruction_screwdriver(user, "mining-open", "mining", I)) updateUsrDialog() return @@ -226,10 +230,46 @@ new /obj/item/kinetic_crusher(drop_location) if("Mining Conscription Kit") new /obj/item/storage/backpack/duffelbag/mining/conscript(drop_location) - + playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) SSblackbox.record_feedback("tally", "mining_voucher_redeemed", 1, selection) qdel(voucher) +/obj/machinery/mineral/equipment_vendor/proc/RedeemSVoucher(obj/item/suit_voucher/voucher, mob/redeemer) + var/items = list( "Exo-suit" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "exo"), + "SEVA suit" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "seva")) + + var/selection = show_radial_menu(redeemer, src, items, require_near = TRUE, tooltips = TRUE) + if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer) + return + var/drop_location = drop_location() + switch(selection) + if("Exo-suit") + new /obj/item/clothing/suit/hooded/explorer/exo(drop_location) + new /obj/item/clothing/mask/gas/exo(drop_location) + if("SEVA suit") + new /obj/item/clothing/suit/hooded/explorer/seva(drop_location) + new /obj/item/clothing/mask/gas/seva(drop_location) + playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) + SSblackbox.record_feedback("tally", "suit_voucher_redeemed", 1, selection) + qdel(voucher) + +/obj/machinery/mineral/equipment_vendor/proc/RedeemPCVoucher(obj/item/premium_crusher_voucher/voucher, mob/redeemer) // someone should REALLY just refactor this + var/items = list("Kinetic Glaive" = image(icon = 'icons/obj/mining.dmi', icon_state = "crusher-glaive"), + "Kinetic Gauntlets" = image(icon = 'icons/obj/mining.dmi', icon_state = "crusher-hands")) + + var/selection = show_radial_menu(redeemer, src, items, require_near = TRUE, tooltips = TRUE) + if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer) + return + var/drop_location = drop_location() + switch(selection) + if("Kinetic Glaive") + new /obj/item/kinetic_crusher/glaive(drop_location) + if("Kinetic Gauntlets") + new /obj/item/kinetic_crusher/glaive/gauntlets(drop_location) + playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) + SSblackbox.record_feedback("tally", "crusher_voucher_redeemed", 1, selection) + qdel(voucher) + /obj/machinery/mineral/equipment_vendor/ex_act(severity, target) do_sparks(5, TRUE, src) if(prob(50 / severity) && severity < 3) @@ -245,7 +285,7 @@ . = ..() desc += "\nIt seems a few selections have been added." prize_list += list( - new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/mining, 250), + new /datum/data/mining_equipment("Extra ID", /obj/item/card/id/mining, 250), new /datum/data/mining_equipment("Science Goggles", /obj/item/clothing/glasses/science, 250), new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/cube/monkey, 300), new /datum/data/mining_equipment("Toolbelt", /obj/item/storage/belt/utility, 350), @@ -273,6 +313,13 @@ icon_state = "mining_voucher" w_class = WEIGHT_CLASS_TINY +/obj/item/premium_crusher_voucher + name = "premium crusher voucher" + desc = "A token to redeem for a premium proto-kinetic melee weapon. Use it on a mining equipment vendor." + icon = 'icons/obj/mining.dmi' + icon_state = "mining_voucher" + w_class = WEIGHT_CLASS_TINY + /**********************Mining Point Card**********************/ //mp = Miner Pointers //c = Cash @@ -375,24 +422,5 @@ /obj/item/storage/backpack/duffelbag/mining/glaivekit /obj/item/storage/backpack/duffelbag/mining/glaivekit/PopulateContents() - new /obj/item/kinetic_crusher/glaive(src) new /obj/item/kitchen/knife/combat/survival/knuckledagger(src) - -/obj/machinery/mineral/equipment_vendor/proc/RedeemSVoucher(obj/item/suit_voucher/voucher, mob/redeemer) - var/items = list( "Exo-suit" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "exo"), - "SEVA suit" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "seva")) - - var/selection = show_radial_menu(redeemer, src, items, require_near = TRUE, tooltips = TRUE) - if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer) - return - var/drop_location = drop_location() - switch(selection) - if("Exo-suit") - new /obj/item/clothing/suit/hooded/explorer/exo(drop_location) - new /obj/item/clothing/mask/gas/exo(drop_location) - if("SEVA suit") - new /obj/item/clothing/suit/hooded/explorer/seva(drop_location) - new /obj/item/clothing/mask/gas/seva(drop_location) - - SSblackbox.record_feedback("tally", "suit_voucher_redeemed", 1, selection) - qdel(voucher) + new /obj/item/premium_crusher_voucher(src) diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index e98ddf5954..66db6d635f 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -29,7 +29,7 @@ var/loss = HUNGER_FACTOR/10 if(m_intent == MOVE_INTENT_RUN) loss *= 2 - adjust_nutrition(loss) + adjust_nutrition(-loss) /mob/living/carbon/can_move_under_living(mob/living/other) . = ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index be8241c063..c05215bc6f 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -116,19 +116,19 @@ to_chat(src, "[L] is restraining [P], you cannot push past.") return 1 - //CIT CHANGES START HERE - makes it so resting stops you from moving through standing folks without a short delay - if(!CHECK_MOBILITY(src, MOBILITY_STAND) && CHECK_MOBILITY(L, MOBILITY_STAND)) + //CIT CHANGES START HERE - makes it so resting stops you from moving through standing folks or over prone bodies without a short delay + if(!CHECK_MOBILITY(src, MOBILITY_STAND)) var/origtargetloc = L.loc if(!pulledby) if(combat_flags & COMBAT_FLAG_ATTEMPTING_CRAWL) return TRUE if(IS_STAMCRIT(src)) - to_chat(src, "You're too exhausted to crawl under [L].") + to_chat(src, "You're too exhausted to crawl [(CHECK_MOBILITY(L, MOBILITY_STAND)) ? "under": "over"] [L].") return TRUE ENABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL) - visible_message("[src] is attempting to crawl under [L].", - "You are now attempting to crawl under [L].", - target = L, target_message = "[src] is attempting to crawl under you.") + visible_message("[src] is attempting to crawl [(CHECK_MOBILITY(L, MOBILITY_STAND)) ? "under" : "over"] [L].", + "You are now attempting to crawl [(CHECK_MOBILITY(L, MOBILITY_STAND)) ? "under": "over"] [L].", + target = L, target_message = "[src] is attempting to crawl [(CHECK_MOBILITY(L, MOBILITY_STAND)) ? "under" : "over"] you.") if(!do_after(src, CRAWLUNDER_DELAY, target = src) || CHECK_MOBILITY(src, MOBILITY_STAND)) DISABLE_BITFIELD(combat_flags, COMBAT_FLAG_ATTEMPTING_CRAWL) return TRUE diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 07b40b3ab1..ca7960ff69 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -37,6 +37,8 @@ if(mover in buckled_mobs) return TRUE var/mob/living/L = mover //typecast first, check isliving and only check this if living using short circuit + if(isliving(L) && lying && L.lying) //if we're both lying down and aren't already being thrown/shipped around, don't pass + return FALSE return (!density || (isliving(mover)? L.can_move_under_living(src) : !mover.density)) /mob/living/toggle_move_intent() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 08ed786252..4e7d493c3b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -59,6 +59,7 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize() . = ..() + internal = new/obj/item/gps/internal/miner(src) miner_saw = new(src) /datum/action/innate/megafauna_attack/dash diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index 153d7dd973..ddeef393ac 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -167,3 +167,6 @@ /datum/movespeed_modifier/dragon_depression multiplicative_slowdown = 5 + +/datum/movespeed_modifier/gauntlet_concussion + multiplicative_slowdown = 5 diff --git a/code/modules/research/designs/comp_board_designs/comp_board_designs_all_misc.dm b/code/modules/research/designs/comp_board_designs/comp_board_designs_all_misc.dm index 99caa5b480..8ea883edf1 100644 --- a/code/modules/research/designs/comp_board_designs/comp_board_designs_all_misc.dm +++ b/code/modules/research/designs/comp_board_designs/comp_board_designs_all_misc.dm @@ -21,14 +21,6 @@ category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_ALL -/datum/design/board/minesweeper - name = "Computer Design (Minesweeper Arcade Machine)" - desc = "Allows for the construction of circuit boards used to build a new Minesweeper machine." - id = "arcade_minesweeper" - build_path = /obj/item/circuitboard/computer/arcade/minesweeper - category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_ALL - /datum/design/board/slot_machine name = "Computer Design (Slot Machine)" desc = "Allows for the construction of circuit boards used to build a new slot machine." diff --git a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm index 81b16d1118..570c99e6ae 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm @@ -10,6 +10,14 @@ category = list ("Misc. Machinery") departmental_flags = DEPARTMENTAL_FLAG_ALL +/datum/design/board/autoloom + name = "Machine Design (Autoloom Board)" + desc = "The circuit board for an autoloom." + id = "autoloom" + build_path = /obj/item/circuitboard/machine/autoloom + category = list ("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + /datum/design/board/holopad name = "Machine Design (AI Holopad Board)" desc = "The circuit board for a holopad." diff --git a/code/modules/research/techweb/nodes/computer_hud_nodes.dm b/code/modules/research/techweb/nodes/computer_hud_nodes.dm index 2db03861e9..0f2cf2e4bd 100644 --- a/code/modules/research/techweb/nodes/computer_hud_nodes.dm +++ b/code/modules/research/techweb/nodes/computer_hud_nodes.dm @@ -56,5 +56,5 @@ display_name = "Games and Toys" description = "For the slackers on the station." prereq_ids = list("comptech") - design_ids = list("arcade_battle", "arcade_orion", "arcade_minesweeper", "slotmachine", "autoylathe") + design_ids = list("arcade_battle", "arcade_orion", "slotmachine", "autoylathe") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) diff --git a/code/modules/research/techweb/nodes/tools_nodes.dm b/code/modules/research/techweb/nodes/tools_nodes.dm index 180cdb5778..86a48ab8de 100644 --- a/code/modules/research/techweb/nodes/tools_nodes.dm +++ b/code/modules/research/techweb/nodes/tools_nodes.dm @@ -37,7 +37,7 @@ display_name = "Botanical Engineering" description = "Botanical tools." prereq_ids = list("adv_engi", "biotech") - design_ids = list("diskplantgene", "portaseeder", "plantgenes", "flora_gun", "hydro_tray", "biogenerator", "seed_extractor") + design_ids = list("diskplantgene", "portaseeder", "plantgenes", "flora_gun", "hydro_tray", "biogenerator", "seed_extractor", "autoloom") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) /datum/techweb_node/exp_tools diff --git a/html/changelog.html b/html/changelog.html index 2b6407735e..1721c5344e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,49 @@ -->
+

31 October 2021

+

DeltaFire15 updated:

+
    +
  • You can now drag things over prone people again.
  • +
+

DrPainis updated:

+
    +
  • Walking no longer makes you fat.
  • +
+

keronshb updated:

+
    +
  • Christmas trees are now indestructible
  • +
+ +

30 October 2021

+

keronshb updated:

+
    +
  • Jacq can't burn in the cremator anymore
  • +
  • Jacq also can't be cheesed off station
  • +
  • Barth also cannot be destroyed
  • +
+ +

28 October 2021

+

Hatterhat updated:

+
    +
  • Proto-kinetic gauntlets! Less straight damage, extra damage on backstabs, slows Lavaland fauna on counterhit. tweak: The glaive kit has been renamed to the premium kinetic melee kit, and now has a voucher for either a glaive or gauntlets.
  • +
  • NanoTrasen is rolling out a prototype Autoloom, hidden behind Botanical Engineering. It only processes cotton and logs. Despite its visual similarity to the recycler, it is entirely tamperproof.
  • +
+

Linzolle updated:

+
    +
  • plasmamen now spawn in their proper outfit in the ghostcafe
  • +
+

Putnam3145 updated:

+
    +
  • Removed minesweeper
  • +
+

keronshb updated:

+
    +
  • -40 wound bonus for DSword
  • +
  • -20 Wound bonus for Hyper Eu
  • +
  • Fixes hyper eu's slowdown when it's not wielded
  • +
+

26 October 2021

WanderingFox95 updated:

    @@ -445,57 +488,6 @@
    • fixes losing your additional language upon changing species
    - -

    01 September 2021

    -

    BlueWildrose updated:

    -
      -
    • The waddle component now takes size into account when running rotating animations, thus not reverting character sizes to default size.
    • -
    -

    ma44 updated:

    -
      -
    • Weapon rechargers now have their recharger indicators again.
    • -
    • Energy guns now update when switching modes again.
    • -
    • Stabilized yellow slime extracts will now update cells and guns it recharges.
    • -
    • Weapon rechargers will now be more noticeable when it has finished recharging something.
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • the fucking chainsaw sprite
    • -
    - -

    28 August 2021

    -

    DeltaFire15 updated:

    -
      -
    • Demons now drop bodies on their own tile instead of scattering them across the station. tweak: Space dragon content ejection is now slightly safer.
    • -
    • Space dragons no longer delete their contents if they die due to timeout, ejecting them instead.
    • -
    • Carp rifts created by space dragons now have their armor work correctly.
    • -
    -

    Putnam3145 updated:

    -
      -
    • Planetary monstermos can now be disabled with varedit
    • -
    • Lavaland/ice planet atmos is no longer a preset gas mixture and varies per round
    • -
    -

    keronshb updated:

    -
      -
    • Ports Inventory Outlines
    • -
    • Re-adds the old glue sprite
    • -
    • Adds Plague Rats
    • -
    • Gives Plague Rat spawn conditions for regular mice
    • -
    • Plague Rat sprite
    • -
    • Gremlin
    • -
    • Gremlin sprites
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • grilles as maintenance loot
    • -
    • sevensune tail from hyperstation
    • -
    - -

    26 August 2021

    -

    keronshb updated:

    -
      -
    • Adds catwalk floors
    • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d4cc657b3d..36e3b4b00f 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -30167,3 +30167,32 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. WanderingFox95: - rscadd: bone anvils and bone ingots - imageadd: bone anvil sprites +2021-10-28: + Hatterhat: + - rscadd: 'Proto-kinetic gauntlets! Less straight damage, extra damage on backstabs, + slows Lavaland fauna on counterhit. tweak: The glaive kit has been renamed to + the premium kinetic melee kit, and now has a voucher for either a glaive or + gauntlets.' + - rscadd: NanoTrasen is rolling out a prototype Autoloom, hidden behind Botanical + Engineering. It only processes cotton and logs. Despite its visual similarity + to the recycler, it is entirely tamperproof. + Linzolle: + - bugfix: plasmamen now spawn in their proper outfit in the ghostcafe + Putnam3145: + - rscdel: Removed minesweeper + keronshb: + - balance: -40 wound bonus for DSword + - balance: -20 Wound bonus for Hyper Eu + - bugfix: Fixes hyper eu's slowdown when it's not wielded +2021-10-30: + keronshb: + - balance: Jacq can't burn in the cremator anymore + - balance: Jacq also can't be cheesed off station + - balance: Barth also cannot be destroyed +2021-10-31: + DeltaFire15: + - bugfix: You can now drag things over prone people again. + DrPainis: + - bugfix: Walking no longer makes you fat. + keronshb: + - balance: Christmas trees are now indestructible diff --git a/icons/mob/inhands/weapons/hammers_lefthand.dmi b/icons/mob/inhands/weapons/hammers_lefthand.dmi index 988d64fde3..cb3ecd4e99 100644 Binary files a/icons/mob/inhands/weapons/hammers_lefthand.dmi and b/icons/mob/inhands/weapons/hammers_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/hammers_righthand.dmi b/icons/mob/inhands/weapons/hammers_righthand.dmi index 1e0e7c91bf..f3d9ca52b7 100644 Binary files a/icons/mob/inhands/weapons/hammers_righthand.dmi and b/icons/mob/inhands/weapons/hammers_righthand.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index f70f110078..e03f6e9b97 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index 3136cf34b2..026612b144 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 30c413815b..dd51cfced1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -854,6 +854,7 @@ #include "code\game\machinery\announcement_system.dm" #include "code\game\machinery\aug_manipulator.dm" #include "code\game\machinery\autolathe.dm" +#include "code\game\machinery\autoloom.dm" #include "code\game\machinery\bank_machine.dm" #include "code\game\machinery\Beacon.dm" #include "code\game\machinery\bloodbankgen.dm" @@ -936,7 +937,6 @@ #include "code\game\machinery\computer\telecrystalconsoles.dm" #include "code\game\machinery\computer\teleporter.dm" #include "code\game\machinery\computer\arcade\battle.dm" -#include "code\game\machinery\computer\arcade\minesweeper.dm" #include "code\game\machinery\computer\arcade\misc_arcade.dm" #include "code\game\machinery\computer\arcade\orion_trail.dm" #include "code\game\machinery\computer\prisoner\_prisoner.dm"