diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index aa3e1741b52..8c7acf05a2b 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -125,6 +125,8 @@ #define FLASH_PROTECTION_NONE 0 #define FLASH_PROTECTION_MODERATE 1 #define FLASH_PROTECTION_MAJOR 2 +#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6) +#define DRONE_SPAWN_DELAY round(config.respawn_delay / 3) #define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6) #define DRONE_SPAWN_DELAY round(config.respawn_delay / 3) @@ -145,6 +147,7 @@ #define O_BRAIN "brain" #define O_LIVER "liver" #define O_KIDNEYS "kidneys" +#define O_APPENDIX "appendix" #define O_PLASMA "plasma vessel" #define O_HIVE "hive node" #define O_NUTRIENT "nutrient vessel" @@ -171,4 +174,9 @@ #define BP_ALL list(BP_GROIN, BP_TORSO, BP_HEAD, BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG) #define SYNTH_BLOOD_COLOUR "#030303" -#define SYNTH_FLESH_COLOUR "#575757" \ No newline at end of file +#define SYNTH_FLESH_COLOUR "#575757" + +#define MOB_PULL_NONE 0 +#define MOB_PULL_SMALLER 1 +#define MOB_PULL_SAME 2 +#define MOB_PULL_LARGER 3 \ No newline at end of file diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 9aa16f91b5a..79b3aa65407 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -175,10 +175,12 @@ L |= I else if(istype(I,/obj/)) - if(!sight_check || isInSight(I, O)) - L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects) - if(include_objects) - L |= I + var/obj/check_obj = I + if(check_obj.show_messages) + if(!sight_check || isInSight(I, O)) + L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects) + if(include_objects) + L |= I return L @@ -203,7 +205,8 @@ hear += M else if(istype(I,/obj/)) hear |= recursive_content_check(I, hear, 3, 1, 0, include_mobs, include_objects) - if(include_objects) + var/obj/O = I + if(O.show_messages && include_objects) hear += I return hear diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index d2cd41a9409..4b4b129278e 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -57,7 +57,7 @@ var/global/list/undershirt_t = list( "White tank top" = "u1", "Black tank top" = "u2", "Black shirt" = "u3", "White shirt" = "u4", "White shirt 2" = "shirt_white_s", "White tank top 2" = "tank_white_s", "Black shirt 2" = "shirt_black_s", "Grey shirt" = "shirt_grey_s", "Heart shirt" = "lover_s", - "I love NT shirt" = "ilovent_s", "White shortsleeve shirt" = "whiteshortsleeve_s", "Purple shirtsleeve shirt" = "purpleshortsleeve_s", + "I love NT shirt" = "ilovent_s", "White shortsleeve shirt" = "whiteshortsleeve_s", "Purple shortsleeve shirt" = "purpleshortsleeve_s", "Blue shortsleeve shirt" = "blueshortsleeve_s", "Green shortsleeve shirt" = "greenshortsleeve_s", "Black shortsleeve shirt" = "blackshortsleeve_s", "Blue shirt" = "blueshirt_s", "Red shirt" = "redshirt_s", "Yellow shirt" = "yellowshirt_s", "Green shirt" = "greenshirt_s", "Blue polo shirt" = "bluepolo_s", "Red polo shirt" = "redpolo_s", "White polo shirt" = "whitepolo_s", @@ -76,6 +76,7 @@ var/global/list/socks_t = list( //Backpacks var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt") +var/global/list/pdachoicelist = list("Default", "Slim", "Old") var/global/list/exclude_jobs = list(/datum/job/ai,/datum/job/cyborg) // Visual nets diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 5d9a3648712..c058e2ff5d0 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -61,6 +61,9 @@ //put this here for easier tracking ingame var/datum/money_account/initial_account + + //used for antag tcrystal trading, more info in code\game\objects\items\telecrystals.dm + var/accept_tcrystals = 0 /datum/mind/New(var/key) src.key = key diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm index faf7526a9cb..6d3e7d0b287 100644 --- a/code/game/antagonist/antagonist.dm +++ b/code/game/antagonist/antagonist.dm @@ -120,10 +120,10 @@ if(players && players.len) player = pick(players) if(!istype(player)) - message_admins("AUTO[uppertext(ticker.mode.name)]: Failed to find a candidate for [role_text].") + message_admins("[uppertext(ticker.mode.name)]: Failed to find a candidate for [role_text].") return 0 player.current << "You have been selected this round as an antagonist!" - message_admins("AUTO[uppertext(ticker.mode.name)]: Selected [player] as a [role_text].") + message_admins("[uppertext(ticker.mode.name)]: Selected [player] as a [role_text].") if(istype(player.current, /mob/dead)) create_default(player.current) else diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index 55d865b9fa4..4c071130ad4 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -44,9 +44,10 @@ var/datum/antagonist/mercenary/mercs player.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(player.back), slot_in_backpack) player.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(player), slot_in_backpack) player.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT + player.mind.accept_tcrystals = 1 if (player.mind == leader) - var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, 40) + var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, DEFAULT_TELECRYSTAL_AMOUNT) player.put_in_hands(U) player.update_icons() diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm index 1eb372d118a..dcc7fa9df95 100644 --- a/code/game/antagonist/station/traitor.dm +++ b/code/game/antagonist/station/traitor.dm @@ -82,6 +82,7 @@ var/datum/antagonist/traitor/traitors spawn_uplink(traitor_mob) traitor_mob.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT + traitor_mob.mind.accept_tcrystals = 1 // Tell them about people they might want to contact. var/mob/living/carbon/human/M = get_nt_opposed() if(M && M != traitor_mob) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 9f8fe69202b..109eeaf501a 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -437,7 +437,7 @@ its easier to just keep the beam vertical. return 0 /atom/proc/checkpass(passflag) - return pass_flags&passflag + return (pass_flags&passflag) /atom/proc/isinspace() if(istype(get_turf(src), /turf/space)) @@ -455,10 +455,10 @@ its easier to just keep the beam vertical. for(var/I in see) if(isobj(I)) - spawn(0) - if(I) //It's possible that it could be deleted in the meantime. - var/obj/O = I - O.show_message( message, 1, blind_message, 2) + //spawn(0) + //if(I) //It's possible that it could be deleted in the meantime. + var/obj/O = I + O.show_message( message, 1, blind_message, 2) else if(ismob(I)) var/mob/M = I if(M.see_invisible >= invisibility) // Cannot view the invisible diff --git a/code/game/gamemodes/game_mode_latespawn.dm b/code/game/gamemodes/game_mode_latespawn.dm index 038cf351ab8..4fc1bc6f77f 100644 --- a/code/game/gamemodes/game_mode_latespawn.dm +++ b/code/game/gamemodes/game_mode_latespawn.dm @@ -7,7 +7,7 @@ var/list/usable_templates = list() for(var/datum/antagonist/A in supplied_templates) if(A.can_late_spawn()) - message_admins("AUTO[uppertext(name)]: [A.id] selected for spawn attempt.") + message_admins("[uppertext(name)]: [A.id] selected for spawn attempt.") usable_templates |= A return usable_templates @@ -34,7 +34,7 @@ if(world.time < next_spawn) return - message_admins("AUTO[uppertext(name)]: Attempting spawn.") + message_admins("[uppertext(name)]: Attempting spawn.") var/list/usable_templates if(latejoin_only && latejoin_templates.len) @@ -42,7 +42,7 @@ else if (antag_templates && antag_templates.len) usable_templates = get_usable_templates(antag_templates) else - message_admins("AUTO[uppertext(name)]: Failed to find configured mode spawn templates, please disable auto-antagonists until one is added.") + message_admins("[uppertext(name)]: Failed to find configured mode spawn templates, please disable auto-antagonists until one is added.") round_autoantag = 0 return @@ -50,8 +50,8 @@ var/datum/antagonist/spawn_antag = pick(usable_templates) usable_templates -= spawn_antag if(spawn_antag.attempt_late_spawn(player)) - message_admins("AUTO[uppertext(name)]: Attempting to latespawn [spawn_antag.id]. ([spawn_antag.get_antag_count()]/[spawn_antag.cur_max])") + message_admins("[uppertext(name)]: Attempting to latespawn [spawn_antag.id]. ([spawn_antag.get_antag_count()]/[spawn_antag.cur_max])") next_spawn = world.time + rand(min_autotraitor_delay, max_autotraitor_delay) return - message_admins("AUTO[uppertext(name)]: Failed to proc a viable spawn template.") + message_admins("[uppertext(name)]: Failed to proc a viable spawn template.") next_spawn = world.time + rand(min_autotraitor_delay, max_autotraitor_delay) diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index ab60dc6b6e6..39b73a8dac0 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -11,6 +11,10 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' required_players_secret = 15 required_enemies = 4 round_description = "An unidentified bluespace signature is approaching the station!" + extended_round_description = "The Company's majority control of phoron in Vir has marked the \ + station to be a highly valuable target for many competing organizations and individuals. Being a \ + colony of sizable population and considerable wealth causes it to often be the target of various \ + attempts of robbery, fraud and other malicious actions." end_on_antag_death = 0 antag_tags = list(MODE_RAIDER) diff --git a/code/game/gamemodes/mixed/bughunt.dm b/code/game/gamemodes/mixed/bughunt.dm index cfdb25c9a5b..2accc6a9660 100644 --- a/code/game/gamemodes/mixed/bughunt.dm +++ b/code/game/gamemodes/mixed/bughunt.dm @@ -1,6 +1,7 @@ /datum/game_mode/bughunt name = "Bughunt" round_description = "A mercenary strike force is approaching the station to eradicate a xenomorph infestation!" + extended_round_description = "Mercenaries and xenomorphs spawn in this game mode." config_tag = "bughunt" required_players = 15 required_players_secret = 25 diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 6dacf789090..fb2979e4277 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -7,6 +7,10 @@ var/list/nuke_disks = list() /datum/game_mode/nuclear name = "Mercenary" round_description = "A mercenary strike force is approaching the station!" + extended_round_description = "The Company's majority control of phoron in Vir has marked the \ + station to be a highly valuable target for many competing organizations and individuals. Being a \ + colony of sizable population and considerable wealth causes it to often be the target of various \ + attempts of robbery, fraud and other malicious actions." config_tag = "mercenary" required_players = 15 required_players_secret = 20 // 20 players - 5 players to be the nuke ops = 15 players remaining diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index eea5534751d..2603d0f2146 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -5,12 +5,13 @@ department = "Civilian" department_flag = CIVILIAN faction = "Station" - total_positions = 1 - spawn_positions = 1 + total_positions = 2 + spawn_positions = 2 supervisors = "the head of personnel" selection_color = "#dddddd" access = list(access_hydroponics, access_bar, access_kitchen) minimal_access = list(access_bar) + alt_titles = list("Barista") equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 35c2b4aa07a..cced0b79b36 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -207,7 +207,7 @@ selection_color = "#ffeef0" economic_modifier = 4 access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist) - minimal_access = list(access_medical, access_medical_equip, access_eva, access_maint_tunnels, access_external_airlocks) + minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks) alt_titles = list("Emergency Medical Technician") equip(var/mob/living/carbon/human/H) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 73da615720f..3b33e40a9e4 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -5,6 +5,7 @@ density = 1 var/health = 100.0 flags = CONDUCT + w_class = 5 var/valve_open = 0 var/release_pressure = ONE_ATMOSPHERE diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index ad664049fc0..a5bdac74218 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/atmos.dmi' icon_state = "psiphon:0" density = 1 + w_class = 3 var/on = 0 var/direction_out = 0 //0 = siphoning, 1 = releasing diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 457792c9e23..87997d32c8e 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/atmos.dmi' icon_state = "pscrubber:0" density = 1 + w_class = 3 var/on = 0 var/volume_rate = 800 diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 501ec06629c..d34acd5d2d4 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -35,6 +35,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED name = "\improper AI holopad" desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely." icon_state = "holopad0" + show_messages = 1 layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them. diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 455c6256a4f..6798f2b7368 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -96,6 +96,8 @@ Class Procs: /obj/machinery name = "machinery" icon = 'icons/obj/stationobjs.dmi' + w_class = 10 + var/stat = 0 var/emagged = 0 var/use_power = 1 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 240aa6783e3..055176246c1 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1,6 +1,8 @@ /obj/item name = "item" icon = 'icons/obj/items.dmi' + w_class = 3.0 + var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/abstract = 0 var/r_speed = 1.0 @@ -8,7 +10,6 @@ var/burn_point = null var/burning = null var/hitsound = null - var/w_class = 3.0 var/slot_flags = 0 //This is used to determine on which slots an item can fit. var/no_attack_log = 0 //If it's an item we don't want to log attack_logs with, set this to 1 pass_flags = PASSTABLE @@ -206,7 +207,7 @@ else if(success) user << "You put some things in [S]." else - user << "You fail to pick anything up with [S]." + user << "You fail to pick anything up with \the [S]." else if(S.can_be_inserted(src)) S.handle_item_insertion(src) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 1935455f940..bf5df08d34c 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -13,6 +13,7 @@ var/global/list/obj/item/device/pda/PDAs = list() slot_flags = SLOT_ID | SLOT_BELT //Main variables + var/pdachoice = 1 var/owner = null var/default_cartridge = 0 // Access level defined by cartridge var/obj/item/weapon/cartridge/cartridge = null //current cartridge @@ -309,13 +310,22 @@ var/global/list/obj/item/device/pda/PDAs = list() * The Actual PDA */ -/obj/item/device/pda/New() +/obj/item/device/pda/New(var/mob/living/carbon/human/H) ..() PDAs += src PDAs = sortAtom(PDAs) if(default_cartridge) cartridge = new default_cartridge(src) new /obj/item/weapon/pen(src) + pdachoice = isnull(H) ? 1 : (ishuman(H) ? H.pdachoice : 1) + switch(pdachoice) + if(1) icon = 'icons/obj/pda.dmi' + if(2) icon = 'icons/obj/pda_slim.dmi' + if(3) icon = 'icons/obj/pda_old.dmi' + else + icon = 'icons/obj/pda_old.dmi' + log_debug("Invalid switch for PDA, defaulting to old PDA icons. [pdachoice] chosen.") + /obj/item/device/pda/proc/can_use() @@ -869,7 +879,7 @@ var/global/list/obj/item/device/pda/PDAs = list() overlays.Cut() if(new_message || new_news) - overlays += image('icons/obj/pda.dmi', "pda-r") + overlays += image(icon, "pda-r") /obj/item/device/pda/proc/detonate_act(var/obj/item/device/pda/P) //TODO: sometimes these attacks show up on the message server diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 356ee87f609..29c8377d430 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -5,6 +5,8 @@ item_state = "electronic" w_class = 2.0 slot_flags = SLOT_BELT + show_messages = 1 + var/flush = null origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 58457d55bd6..11cc3a58a8f 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -12,6 +12,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() icon_state = "communicator" w_class = 2.0 slot_flags = SLOT_ID | SLOT_BELT + show_messages = 1 origin_tech = list(TECH_ENGINEERING = 2, TECH_MAGNET = 2, TECH_BLUESPACE = 2, TECH_DATA = 2) matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10) diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index 1b087f17913..92515407d0b 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -6,7 +6,7 @@ var/decal = "remove all decals" var/paint_dir = "precise" - var/paint_colour = "white" + var/paint_colour = "#FFFFFF" var/list/decals = list( "quarter-turf" = list("path" = /obj/effect/floor_decal/corner, "precise" = 1, "coloured" = 1), @@ -39,37 +39,6 @@ "northeast" = NORTHEAST, "precise" = 0 ) - var/list/paint_colours = list( - "white" = COLOR_WHITE, - "light gray" = COLOR_SILVER, - "dark gray" = COLOR_GRAY, - "blue-gray" = COLOR_BLUE_GRAY, - "pale blue-gray" = COLOR_PALE_BLUE_GRAY, - "green-gray" = COLOR_GREEN_GRAY, - "pale green-gray" = COLOR_PALE_GREEN_GRAY, - "red-gray" = COLOR_RED_GRAY, - "pale red-gray" = COLOR_PALE_RED_GRAY, - "purple-gray" = COLOR_PURPLE_GRAY, - "pale purple-gray" = COLOR_PALE_PURPLE_GRAY, - "black" = COLOR_BLACK, - "red" = COLOR_RED, - "dark red" = COLOR_MAROON, - "yellow" = COLOR_YELLOW, - "dark yellow" = COLOR_OLIVE, - "green" = COLOR_LIME, - "dark green" = COLOR_GREEN, - "cyan" = COLOR_CYAN, - "teal" = COLOR_TEAL, - "blue" = COLOR_BLUE, - "dark blue" = COLOR_NAVY, - "magenta" = COLOR_PINK, - "purple" = COLOR_PURPLE, - "orange" = COLOR_ORANGE, - "dark orange" = COLOR_DARK_ORANGE, - "dark brown" = COLOR_DARK_BROWN, - "brown" = COLOR_BROWN, - "pale brown" = COLOR_BEIGE - ) /obj/item/device/floor_painter/afterattack(var/atom/A, var/mob/user, proximity, params) if(!proximity) @@ -127,36 +96,25 @@ painting_dir = paint_dirs[paint_dir] var/painting_colour - if(paint_colour && !isnull(paint_colours[paint_colour]) && decal_data["coloured"]) - painting_colour = paint_colours[paint_colour] + if(decal_data["coloured"] && paint_colour) + painting_colour = paint_colour new painting_decal(F, painting_dir, painting_colour) -/obj/item/device/floor_painter/attack_self(mob/user as mob) - +/obj/item/device/floor_painter/attack_self(var/mob/user) var/choice = input("Do you wish to change the decal type, paint direction, or paint colour?") as null|anything in list("Decal","Direction", "Colour") - if(choice == "Decal") - var/new_decal = input("Select a decal.") as null|anything in decals - if(new_decal && !isnull(decals[new_decal])) - decal = new_decal - user << "You set \the [src] decal to '[decal]'." + choose_decal() else if(choice == "Direction") - var/new_dir = input("Select a direction.") as null|anything in paint_dirs - if(new_dir && !isnull(paint_dirs[new_dir])) - paint_dir = new_dir - user << "You set \the [src] direction to '[paint_dir]'." + choose_direction() else if(choice == "Colour") - var/new_colour = input("Select a colour.") as null|anything in paint_colours - if(new_colour && !isnull(paint_colours[new_colour])) - paint_colour = new_colour - user << "You set \the [src] colour to '[paint_colour]'." + choose_colour() /obj/item/device/floor_painter/examine(mob/user) ..(user) user << "It is configured to produce the '[decal]' decal with a direction of '[paint_dir]' using [paint_colour] paint." -/obj/item/device/floor_painter/verb/choose_colour(new_colour in paint_colours) +/obj/item/device/floor_painter/verb/choose_colour() set name = "Choose Colour" set desc = "Choose a floor painter colour." set category = "Object" @@ -164,12 +122,12 @@ if(usr.incapacitated()) return - - if(new_colour && !isnull(paint_colours[new_colour])) + var/new_colour = input(usr, "Choose a colour.", "Floor painter", paint_colour) as color|null + if(new_colour && new_colour != paint_colour) paint_colour = new_colour - usr << "You set \the [src] colour to '[paint_colour]'." + usr << "You set \the [src] to paint with a new colour." -/obj/item/device/floor_painter/verb/choose_decal(new_decal in decals) +/obj/item/device/floor_painter/verb/choose_decal() set name = "Choose Decal" set desc = "Choose a floor painter decal." set category = "Object" @@ -178,11 +136,12 @@ if(usr.incapacitated()) return + var/new_decal = input("Select a decal.") as null|anything in decals if(new_decal && !isnull(decals[new_decal])) decal = new_decal usr << "You set \the [src] decal to '[decal]'." -/obj/item/device/floor_painter/verb/choose_direction(new_dir in paint_dirs) +/obj/item/device/floor_painter/verb/choose_direction() set name = "Choose Direction" set desc = "Choose a floor painter direction." set category = "Object" @@ -191,6 +150,7 @@ if(usr.incapacitated()) return + var/new_dir = input("Select a direction.") as null|anything in paint_dirs if(new_dir && !isnull(paint_dirs[new_dir])) paint_dir = new_dir usr << "You set \the [src] direction to '[paint_dir]'." diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 67516404fd7..fa2a8d4864e 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -6,6 +6,8 @@ w_class = 2.0 slot_flags = SLOT_BELT origin_tech = list(TECH_DATA = 2) + show_messages = 1 + var/obj/item/device/radio/radio var/looking_for_personality = 0 var/mob/living/silicon/pai/pai diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 16c810a8a0c..da191370438 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -44,6 +44,7 @@ var/global/list/default_medbay_channels = list( throw_speed = 2 throw_range = 9 w_class = 2 + show_messages = 1 matter = list("glass" = 25,DEFAULT_WALL_MATERIAL = 75) var/const/FREQ_LISTENING = 1 diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 25276b3c879..a4644e274f8 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -133,7 +133,7 @@ REAGENT SCANNER else if (M.getBrainLoss() >= 100 || !M.has_brain()) user.show_message("Subject is brain dead.") else if (M.getBrainLoss() >= 60) - user.show_message("Severe brain damage detected. Subject likely to have mental retardation.") + user.show_message("Severe brain damage detected. Subject likely to have a traumatic brain injury!.") else if (M.getBrainLoss() >= 10) user.show_message("Significant brain damage detected. Subject may have had a concussion.") if(ishuman(M)) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index e59d3e993b5..2740831046b 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -15,10 +15,12 @@ var/list/storedinfo = new/list() var/list/timestamp = new/list() var/canprint = 1 + flags = CONDUCT throwforce = 2 throw_speed = 4 throw_range = 20 + show_messages = 1 /obj/item/device/taperecorder/hear_talk(mob/living/M as mob, msg, var/verb="says", datum/language/speaking=null) if(recording) diff --git a/code/game/objects/items/devices/telecrystal.dm b/code/game/objects/items/devices/telecrystal.dm new file mode 100644 index 00000000000..aa7b6335903 --- /dev/null +++ b/code/game/objects/items/devices/telecrystal.dm @@ -0,0 +1,21 @@ +/* +Telecrystal item +Does nothing if not suitable antag type, checks for accept_tcrystals = 1 in a mob's mind. +For new antags, make sure to add "player.mind.accept_tcrystals = 1" if you want tradable tcrystals. +*/ +/obj/item/device/telecrystal + name = "red crystal" + desc = "A strange, red, glowing crystal." + icon = 'icons/obj/stock_parts.dmi' + icon_state = "telecrystal" + item_state = "telecrystal" + force = 5 + origin_tech = list(TECH_MATERIAL = 2, TECH_BLUESPACE = 1, TECH_ILLEGAL = 1) + +/obj/item/device/telecrystal/attack_self(mob/user as mob) + if(user.mind.accept_tcrystals) //Checks to see if antag type allows for tcrystals + user.mind.tcrystals += 1 + user.drop_from_inventory(src) + qdel(src) + return + \ No newline at end of file diff --git a/code/game/objects/items/devices/uplink_items.dm b/code/game/objects/items/devices/uplink_items.dm index 377dad5f17f..38811833cde 100644 --- a/code/game/objects/items/devices/uplink_items.dm +++ b/code/game/objects/items/devices/uplink_items.dm @@ -385,6 +385,12 @@ datum/uplink_item/dd_SortValue() item_cost = 3 path = /obj/item/weapon/storage/secure/briefcase/money desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities." + +/datum/uplink_item/item/tools/crystal + name = "Tradable Crystal" + item_cost = 1 + path = /obj/item/device/telecrystal + desc = "A telecrystal that can be transferred from one user to another. Be sure not to give it to just anyone." /*********** * Implants * diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index 1e8518d5fe6..4c26a482a16 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -5,6 +5,7 @@ item_state = "flashbang" //looks exactly like a flash (and nothing like a flashbang) w_class = 1.0 flags = CONDUCT + slot_flags = SLOT_EARS var/use_message = "Halt! Security!" var/spamcheck = 0 diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm index d9bd30e7887..c17d8ba6505 100644 --- a/code/game/objects/items/weapons/autopsy.dm +++ b/code/game/objects/items/weapons/autopsy.dm @@ -3,7 +3,7 @@ //please preference put stuff where it's easy to find - C /obj/item/weapon/autopsy_scanner - name = "autopsy scanner" + name = "biopsy scanner" desc = "Extracts information on wounds." icon = 'icons/obj/autopsy_scanner.dmi' icon_state = "" diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 22d12f9fd8a..e2ec23be7c3 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -14,9 +14,9 @@ matter = list(DEFAULT_WALL_MATERIAL = 90) attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") - var/spray_particles = 6 - var/spray_amount = 2 //units of liquid per particle - var/max_water = 240 + var/spray_particles = 3 + var/spray_amount = 10 //units of liquid per particle + var/max_water = 300 var/last_use = 1.0 var/safety = 1 var/sprite_name = "fire_extinguisher" @@ -30,8 +30,8 @@ throwforce = 2 w_class = 2.0 force = 3.0 - max_water = 120 - spray_particles = 5 + max_water = 150 + spray_particles = 3 sprite_name = "miniFE" /obj/item/weapon/extinguisher/New() diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 78665633cfd..3cb92b0a3c9 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -9,6 +9,8 @@ name = "storage" icon = 'icons/obj/storage.dmi' w_class = 3 + show_messages = 1 + var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else) var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set) var/list/is_seeing = new/list() //List of mobs which are currently seeing the contents of this item's storage @@ -225,7 +227,7 @@ /obj/item/weapon/storage/proc/can_be_inserted(obj/item/W as obj, stop_messages = 0) if(!istype(W)) return //Not an item - if(!usr.canUnEquip(W)) + if(usr.isEquipped(W) && !usr.canUnEquip(W)) return 0 if(src.loc == W) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 8b4e93ec4d4..b8bd8d95e1a 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -1,7 +1,7 @@ /obj //Used to store information about the contents of the object. var/list/matter - + var/w_class // Size of the object. var/list/origin_tech = null //Used by R&D to determine what research bonuses it grants. var/unacidable = 0 //universal "unacidabliness" var, here so you can use it in any obj. animate_movement = 2 @@ -10,10 +10,10 @@ var/sharp = 0 // whether this object cuts var/edge = 0 // whether this object is more likely to dismember var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! - var/damtype = "brute" var/force = 0 var/armor_penetration = 0 + var/show_messages /obj/Destroy() processing_objects -= src diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 886ccc2caea..5dea37ef51c 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -1,5 +1,6 @@ /obj/structure icon = 'icons/obj/structures.dmi' + w_class = 10 var/climbable var/breakable diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 105f2987df3..d7d4c1f36cf 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/closet.dmi' icon_state = "closed" density = 1 + w_class = 5 var/icon_closed = "closed" var/icon_opened = "open" var/opened = 0 diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index a363ea66068..57ae59fe9ff 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -108,8 +108,40 @@ new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src) return +/obj/structure/closet/secure_closet/paramedic + name = "paramedic locker" + desc = "Supplies for a first responder." + icon_state = "medical1" + icon_closed = "medical" + icon_locked = "medical1" + icon_opened = "medicalopen" + icon_broken = "medicalbroken" + icon_off = "medicaloff" + req_access = list(access_medical_equip) + New() + ..() + new /obj/item/weapon/storage/box/autoinjectors(src) + new /obj/item/weapon/storage/box/syringes(src) + new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src) + new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src) + new /obj/item/weapon/storage/belt/medical/emt(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/suit/storage/toggle/fr_jacket(src) + new /obj/item/clothing/suit/storage/toggle/labcoat/emt(src) + new /obj/item/device/radio/headset/headset_med/alt(src) + new /obj/item/weapon/cartridge/medical(src) + new /obj/item/device/flashlight(src) + new /obj/item/weapon/tank/emergency_oxygen/engi(src) + new /obj/item/clothing/glasses/hud/health(src) + new /obj/item/device/healthanalyzer(src) + new /obj/item/device/radio/off(src) + new /obj/random/medical(src) + new /obj/item/weapon/crowbar(src) + new /obj/item/weapon/extinguisher/mini(src) + return + /obj/structure/closet/secure_closet/CMO name = "chief medical officer's locker" req_access = list(access_cmo) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index a385e315005..d4f16f72e4c 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -295,6 +295,9 @@ new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/shoes/white(src) + new /obj/item/clothing/head/soft/mime(src) + new /obj/item/clothing/head/soft/mime(src) + new /obj/item/clothing/head/soft/mime(src) return @@ -447,6 +450,11 @@ new /obj/item/clothing/under/rank/medical/blue(src) new /obj/item/clothing/under/rank/medical/green(src) new /obj/item/clothing/under/rank/medical/purple(src) + new /obj/item/clothing/under/rank/medical/black(src) + new /obj/item/clothing/head/surgery/purple(src) + new /obj/item/clothing/head/surgery/blue(src) + new /obj/item/clothing/head/surgery/green(src) + new /obj/item/clothing/head/surgery/black(src) new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/suit/storage/toggle/labcoat(src) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 4ca726af221..cd859b1489d 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -4,6 +4,7 @@ icon_state = "door_as_0" anchored = 0 density = 1 + w_class = 5 var/state = 0 var/base_icon_state = "" var/base_name = "Airlock" diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 0e2efb1c9ec..867dada6d91 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -3,6 +3,7 @@ anchored = 1 density = 1 layer = 2 + w_class = 5 var/state = 0 var/health = 200 var/cover = 50 //how much cover the girder provides against projectiles. diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index b8048a93c0b..2b8396c5549 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -5,6 +5,7 @@ icon_state = "latticefull" density = 0 anchored = 1.0 + w_class = 3 layer = 2.3 //under pipes // flags = CONDUCT diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 2fb8566dc9f..1624a4bbde7 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/janitor.dmi' icon_state = "mopbucket" density = 1 + w_class = 3 pressure_resistance = 5 flags = OPENCONTAINER var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 6fdf367d5dc..5d5fc2d943e 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -4,6 +4,7 @@ opacity = 0 density = 0 layer = 3.5 + w_class = 3 /obj/structure/sign/ex_act(severity) switch(severity) @@ -138,7 +139,7 @@ /obj/structure/sign/kiddieplaque name = "\improper AI developers plaque" - desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child appears to be retarded. Beneath the image, someone has scratched the word \"PACKETS\"" + desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child appears to be developmentally disabled. Beneath the image, someone has scratched the word \"PACKETS\"" icon_state = "kiddieplaque" /obj/structure/sign/atmosplaque diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index ffa143a9f5c..2bcbf8aa878 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -15,7 +15,7 @@ /obj/structure/bed/chair/wheelchair/set_dir() ..() overlays = null - var/image/O = image(icon = 'icons/obj/objects.dmi', icon_state = "w_overlay", layer = FLY_LAYER, dir = src.dir) + var/image/O = image(icon = 'icons/obj/furniture.dmi', icon_state = "w_overlay", layer = FLY_LAYER, dir = src.dir) overlays += O if(buckled_mob) buckled_mob.set_dir(dir) @@ -116,26 +116,21 @@ user_unbuckle_mob(user) return -/obj/structure/bed/chair/wheelchair/MouseDrop(over_object, src_location, over_location) - ..() - if(over_object == usr && in_range(src, usr)) - if(!ishuman(usr)) return - if(usr == buckled_mob) - usr << "You realize you are unable to push the wheelchair you sit in." +/obj/structure/bed/chair/wheelchair/CtrlClick(var/mob/user) + if(in_range(src, user)) + if(!ishuman(user)) return + if(user == buckled_mob) + user << "You realize you are unable to push the wheelchair you sit in." return if(!pulling) - pulling = usr - usr.pulledby = src - if(usr.pulling) - usr.stop_pulling() - usr.set_dir(get_dir(usr, src)) - usr << "You grip \the [name]'s handles." + pulling = user + user.pulledby = src + if(user.pulling) + user.stop_pulling() + user.set_dir(get_dir(user, src)) + user << "You grip \the [name]'s handles." else - if(usr != pulling) - for(var/mob/O in viewers(pulling, null)) - O.show_message("[usr] breaks [pulling]'s grip on the wheelchair.", 1) - else - usr << "You let go of \the [name]'s handles." + usr << "You let go of \the [name]'s handles." pulling.pulledby = null pulling = null return diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 4cea8bffc1d..0e7546f271d 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -5,6 +5,7 @@ icon_state = "dispenser" density = 1 anchored = 1.0 + w_class = 5 var/oxygentanks = 10 var/phorontanks = 10 var/list/oxytanks = list() //sorry for the similar var names diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index fa45f657369..68b10ccf7a4 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "target_stake" density = 1 + w_class = 5 flags = CONDUCT var/obj/item/target/pinned_target // the current pinned target diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 81b094cac46..fb48f6249dd 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -16,6 +16,7 @@ obj/structure/windoor_assembly anchored = 0 density = 0 dir = NORTH + w_class = 3 var/obj/item/weapon/airlock_electronics/electronics = null diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index c2d6c57617d..1d8686a6780 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -3,6 +3,8 @@ desc = "A window." icon = 'icons/obj/structures.dmi' density = 1 + w_class = 3 + layer = 3.2//Just above doors pressure_resistance = 4*ONE_ATMOSPHERE anchored = 1.0 diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 47e9e30951f..62b8f3699d1 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -14,6 +14,25 @@ var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to var/dirt = 0 +// This is not great. +/turf/simulated/proc/wet_floor(var/wet_val = 1) + spawn(0) + if(wet_val <= wet) + return + wet = wet_val + if(wet_overlay) + overlays -= wet_overlay + wet_overlay = null + wet_overlay = image('icons/effects/water.dmi',src,"wet_floor") + overlays += wet_overlay + sleep(800) + if(wet >= 2) + return + wet = 0 + if(wet_overlay) + overlays -= wet_overlay + wet_overlay = null + /turf/simulated/clean_blood() for(var/obj/effect/decal/cleanable/blood/B in contents) B.clean_blood() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 19302f8d30c..0fd47cde30a 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -195,7 +195,8 @@ var/list/admin_verbs_debug = list( /client/proc/Jump, /client/proc/jumptomob, /client/proc/jumptocoord, - /client/proc/dsay + /client/proc/dsay, + /client/proc/admin_ghost /*allows us to ghost/reenter body at will*/ ) var/list/admin_verbs_paranoid_debug = list( @@ -303,9 +304,12 @@ var/list/admin_verbs_mod = list( /datum/admins/proc/show_skills, /datum/admins/proc/show_player_panel, /client/proc/check_antagonists, + /client/proc/aooc, /client/proc/jobbans, /client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/ - /datum/admins/proc/paralyze_mob + /datum/admins/proc/paralyze_mob, + /client/proc/cmd_admin_direct_narrate, + /client/proc/allow_character_respawn /* Allows a ghost to respawn */ ) var/list/admin_verbs_mentor = list( diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 9d9919e4ed5..83a2f3b370a 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -290,7 +290,7 @@ - [M_name] - [M_rname] - [M_key] ([M_job]) + [M_name] - [M_rname] - [M_key] ([M_job])
diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm index 9260baf3dd7..8c73591197d 100644 --- a/code/modules/admin/verbs/antag-ooc.dm +++ b/code/modules/admin/verbs/antag-ooc.dm @@ -3,7 +3,7 @@ set name = "AOOC" set desc = "Antagonist OOC" - if(!check_rights(R_ADMIN)) return + if(!check_rights(R_ADMIN|R_MOD)) return msg = sanitize(msg) if(!msg) return @@ -13,7 +13,7 @@ display_name = holder.fakekey for(var/mob/M in mob_list) - if((M.mind && M.mind.special_role && M.client) || check_rights(R_ADMIN, 0, M)) + if((M.mind && M.mind.special_role && M.client) || check_rights((R_ADMIN|R_MOD), 0, M)) M << "" + create_text_tag("aooc", "Antag-OOC:", M.client) + " [display_name]: [msg]" log_ooc("(ANTAG) [key] : [msg]") \ No newline at end of file diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index e9772fe907c..014cd8988fe 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -123,7 +123,7 @@ set name = "Direct Narrate" if(!holder) - src << "Only administrators may use this command." + src << "Only administrators and moderators may use this command." return if(!M) @@ -256,9 +256,9 @@ Ccomp's first proc. /client/proc/allow_character_respawn() set category = "Special Verbs" set name = "Allow player to respawn" - set desc = "Let's the player bypass the 30 minute wait to respawn or allow them to re-enter their corpse." + set desc = "Let's the player bypass the 15 minute wait to respawn or allow them to re-enter their corpse." if(!holder) - src << "Only administrators may use this command." + src << "Only administrators and moderators may use this command." var/list/ghosts= get_ghosts(1,1) var/target = input("Please, select a ghost!", "COME BACK TO LIFE!", null, null) as null|anything in ghosts diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 61525cbb515..3df5086cf03 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -358,6 +358,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/datum/species/current_species = all_species[pref.species] if(!current_species.has_organ["brain"]) limb_selection_list -= "Full Body" + else if(pref.organ_data[BP_TORSO] == "cyborg") + limb_selection_list |= "Head" var/organ_tag = input(user, "Which limb do you want to change?") as null|anything in limb_selection_list @@ -394,6 +396,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if("Right Hand") limb = BP_R_HAND third_limb = BP_R_ARM + if("Head") + limb = BP_HEAD + choice_options = list("Prothesis") if("Full Body") limb = BP_TORSO third_limb = BP_GROIN diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm index 6139f30a1b3..e4a0eba8e12 100644 --- a/code/modules/client/preference_setup/general/04_equipment.dm +++ b/code/modules/client/preference_setup/general/04_equipment.dm @@ -7,6 +7,7 @@ S["undershirt"] >> pref.undershirt S["socks"] >> pref.socks S["backbag"] >> pref.backbag + S["pdachoice"] >> pref.pdachoice S["gear"] >> pref.gear /datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S) @@ -14,10 +15,12 @@ S["undershirt"] << pref.undershirt S["socks"] << pref.socks S["backbag"] << pref.backbag + S["pdachoice"] << pref.pdachoice S["gear"] << pref.gear /datum/category_item/player_setup_item/general/equipment/sanitize_character() pref.backbag = sanitize_integer(pref.backbag, 1, backbaglist.len, initial(pref.backbag)) + pref.pdachoice = sanitize_integer(pref.pdachoice, 1, pdachoicelist.len, initial(pref.pdachoice)) if(!islist(pref.gear)) pref.gear = list() @@ -48,6 +51,7 @@ . += "Undershirt: [get_key_by_value(undershirt_t,pref.undershirt)]
" . += "Socks: [get_key_by_value(socks_t,pref.socks)]
" . += "Backpack Type: [backbaglist[pref.backbag]]
" + . += "PDA Type: [pdachoicelist[pref.pdachoice]]
" . += "
Custom Loadout:
" var/total_cost = 0 @@ -109,6 +113,12 @@ pref.backbag = backbaglist.Find(new_backbag) return TOPIC_REFRESH + else if(href_list["change_pda"]) + var/new_pdachoice = input(user, "Choose your character's style of PDA:", "Character Preference", pdachoicelist[pref.pdachoice]) as null|anything in pdachoicelist + if(!isnull(new_pdachoice) && CanUseTopic(user)) + pref.pdachoice = pdachoicelist.Find(new_pdachoice) + return TOPIC_REFRESH + else if(href_list["add_loadout"]) var/total_cost = 0 for(var/gear_name in pref.gear) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ab3778b8286..11d21f6fe02 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -34,6 +34,7 @@ datum/preferences var/undershirt //undershirt type var/socks //socks type var/backbag = 2 //backpack type + var/pdachoice = 1 //PDA type var/h_style = "Bald" //Hair type var/r_hair = 0 //Hair color var/g_hair = 0 //Hair color @@ -309,7 +310,7 @@ datum/preferences character.used_skillpoints = used_skillpoints // Destroy/cyborgize organs and limbs. - for(var/name in BP_ALL) + for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO)) var/status = organ_data[name] var/obj/item/organ/external/O = character.organs_by_name[name] if(O) @@ -340,6 +341,10 @@ datum/preferences backbag = 1 //Same as above character.backbag = backbag + if(pdachoice > 3 || pdachoice < 1) + pdachoice = 1 + character.pdachoice = pdachoice + character.update_body() /datum/preferences/proc/open_load_dialog(mob/user) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index fb85dbb55a6..394d12ee312 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -234,13 +234,13 @@ var/global/list/gear_datums = list() slot = slot_head /datum/gear/santahat - display_name = "santa hat, red" + display_name = "santa hat, red (holiday)" path = /obj/item/clothing/head/santa - cost = 1 + cost = 11 slot = slot_head /datum/gear/santahat/green - display_name = "santa hat, green" + display_name = "santa hat, green (holiday)" path = /obj/item/clothing/head/santa/green // This was sprited and coded specifically for Zhan-Khazan characters. Before you @@ -345,6 +345,10 @@ var/global/list/gear_datums = list() display_name = "bandana, red" path = /obj/item/clothing/mask/bandana/red +/datum/gear/bandanamask/ipc_monitor + display_name = "display monitor (prosthetic head only)" + path = /obj/item/clothing/mask/monitor + /datum/gear/sterilemask display_name = "sterile mask" path = /obj/item/clothing/mask/surgical @@ -502,7 +506,7 @@ var/global/list/gear_datums = list() /datum/gear/skirt/med display_name = "skirt, medical" path = /obj/item/clothing/under/rank/medical/skirt - allowed_roles = list("Chief Medical Officer","Medical Doctor","Paramedic") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic") /datum/gear/skirt/sci display_name = "skirt, scientist" @@ -1205,14 +1209,14 @@ var/global/list/gear_datums = list() whitelisted = "Tajara" // You do have a monopoly on a fur suit tho /datum/gear/forensics/red - display_name = "forensics, red" + display_name = "forensics long, red" path = /obj/item/clothing/suit/storage/forensics/red/long cost = 2 slot = slot_wear_suit allowed_roles = list("Detective") /datum/gear/forensics/blue - display_name = "forensics, blue" + display_name = "forensics long, blue" path = /obj/item/clothing/suit/storage/forensics/blue/long cost = 2 slot = slot_wear_suit diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index feb9ee8d017..d2f11e27a85 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -516,6 +516,8 @@ BLIND // can't see anything slot_flags = SLOT_ICLOTHING armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) w_class = 3 + show_messages = 1 + var/has_sensor = 1 //For the crew computer 2 = unable to change mode var/sensor_mode = 0 /* diff --git a/code/modules/clothing/masks/monitor.dm b/code/modules/clothing/masks/monitor.dm new file mode 100644 index 00000000000..b2bfc138763 --- /dev/null +++ b/code/modules/clothing/masks/monitor.dm @@ -0,0 +1,82 @@ +//IPC-face object for FPB. +/obj/item/clothing/mask/monitor + + name = "display monitor" + desc = "A rather clunky old CRT-style display screen, fit for mounting on an optical output." + flags_inv = HIDEFACE|HIDEEYES + body_parts_covered = FACE + dir = SOUTH + + icon = 'icons/mob/monitor_icons.dmi' + icon_override = 'icons/mob/monitor_icons.dmi' + icon_state = "ipc_blank" + item_state = null + + var/monitor_state_index = "blank" + var/global/list/monitor_states = list( + "blank" = "ipc_blank", + "pink" = "ipc_pink", + "red" = "ipc_red", + "green" = "ipc_green", + "blue" = "ipc_blue", + "breakout" = "ipc_breakout", + "eight" = "ipc_eight", + "goggles" = "ipc_goggles", + "heart" = "ipc_heart", + "monoeye" = "ipc_monoeye", + "nature" = "ipc_nature", + "orange" = "ipc_orange", + "purple" = "ipc_purple", + "shower" = "ipc_shower", + "static" = "ipc_static", + "yellow" = "ipc_yellow" + ) + +/obj/item/clothing/mask/monitor/set_dir() + dir = SOUTH + return + +/obj/item/clothing/mask/monitor/equipped() + ..() + var/mob/living/carbon/human/H = loc + if(istype(H) && H.wear_mask == src) + canremove = 0 + H << "\The [src] connects to your display output." + +/obj/item/clothing/mask/monitor/dropped() + canremove = 1 + return ..() + +/obj/item/clothing/mask/monitor/mob_can_equip(var/mob/living/carbon/human/user, var/slot) + if (!..()) + return 0 + if(istype(user)) + var/obj/item/organ/external/E = user.organs_by_name[BP_HEAD] + if(istype(E) && (E.status & ORGAN_ROBOT)) + return 1 + user << "You must have a robotic head to install this upgrade." + return 0 + +/obj/item/clothing/mask/monitor/verb/set_monitor_state() + set name = "Set Monitor State" + set desc = "Choose an icon for your monitor." + set category = "IC" + + set src in usr + var/mob/living/carbon/human/H = loc + if(!istype(H) || H != usr) + return + if(H.wear_mask != src) + usr << "You have not installed \the [src] yet." + return + var/choice = input("Select a screen icon.") as null|anything in monitor_states + if(choice) + monitor_state_index = choice + update_icon() + +/obj/item/clothing/mask/monitor/update_icon() + if(!(monitor_state_index in monitor_states)) + monitor_state_index = initial(monitor_state_index) + icon_state = monitor_states[monitor_state_index] + var/mob/living/carbon/human/H = loc + if(istype(H)) H.update_inv_wear_mask() \ No newline at end of file diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 88112918a3f..8b2e1fb4776 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -59,7 +59,7 @@ //Chef /obj/item/clothing/suit/chef/classic - name = "A classic chef's apron." + name = "classic chef's apron" desc = "A basic, dull, white chef's apron." icon_state = "apronchef" item_state = "apronchef" diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index a4877bb65d7..2342010ce6a 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -3,6 +3,8 @@ desc = "Used to hold things when you don't have enough hands." icon_state = "webbing" slot = "utility" + show_messages = 1 + var/slots = 3 var/obj/item/weapon/storage/internal/hold w_class = 3.0 diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index b870b49d598..4ad336aa264 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -68,8 +68,8 @@ /obj/item/clothing/under/shorts/jeans/black name = "black jeans shorts" - icon_state = "black_shorts" - worn_state = "black_shorts" + icon_state = "blackpants_shorts" + worn_state = "blackpants_shorts" /obj/item/clothing/under/shorts/jeans/black/female icon_state = "black_shorts_f" @@ -78,9 +78,9 @@ /obj/item/clothing/under/shorts/khaki name = "khaki shorts" desc = "For that island getaway. It's five o'clock somewhere, right?" - icon_state = "khaki_shorts" - worn_state = "khaki_shorts" + icon_state = "tanpants_shorts" + worn_state = "tanpants_shorts" /obj/item/clothing/under/shorts/khaki/female icon_state = "khaki_shorts_f" - worn_state = "khaki_shorts_f" \ No newline at end of file + worn_state = "khaki_shorts_f" diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index bd06a63cc91..f925c32b790 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -59,7 +59,7 @@ if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src)) message = "[message]" - if(sdisabilities & DEAF || ear_deaf) + if((sdisabilities & DEAF) || ear_deaf) if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set if(speaker == src) src << "You cannot hear yourself speak!" @@ -187,7 +187,7 @@ formatted = language.format_message_radio(message, verb) else formatted = "[verb], \"[message]\"" - if(sdisabilities & DEAF || ear_deaf) + if((sdisabilities & DEAF) || ear_deaf) if(prob(20)) src << "You feel your headset vibrate but can hear nothing from it!" else diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 3e8592e9d0c..15931f44d38 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -6,6 +6,7 @@ var/list/holder_mob_icon_cache = list() desc = "You shouldn't ever see this." icon = 'icons/obj/objects.dmi' slot_flags = SLOT_HEAD | SLOT_HOLSTER + show_messages = 1 sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi' @@ -27,18 +28,33 @@ var/list/holder_mob_icon_cache = list() ..() /obj/item/weapon/holder/process() + update_state() +/obj/item/weapon/holder/dropped() + ..() + spawn(1) + update_state() + +/obj/item/weapon/proc/update_state() if(istype(loc,/turf) || !(contents.len)) - for(var/mob/M in contents) - var/atom/movable/mob_container mob_container = M mob_container.forceMove(get_turf(src)) M.reset_view() - qdel(src) +/obj/item/weapon/holder/GetID() + for(var/mob/M in contents) + var/obj/item/I = M.GetIdCard() + if(I) + return I + return null + +/obj/item/weapon/holder/GetAccess() + var/obj/item/I = GetID() + return I ? I.GetAccess() : ..() + /obj/item/weapon/holder/proc/sync(var/mob/living/M) dir = 2 overlays.Cut() @@ -79,17 +95,30 @@ var/list/holder_mob_icon_cache = list() //Mob procs and vars for scooping up /mob/living/var/holder_type -/mob/living/proc/get_scooped(var/mob/living/carbon/grabber) +/mob/living/MouseDrop(var/atom/over_object) + var/mob/living/carbon/human/H = over_object + if(holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H)) + get_scooped(H, (usr == src)) + return + return ..() + +/mob/living/proc/get_scooped(var/mob/living/carbon/grabber, var/self_grab) + if(!holder_type || buckled || pinned.len) return - var/obj/item/weapon/holder/H = new holder_type(loc) - src.loc = H - H.name = loc.name - H.attack_hand(grabber) + var/obj/item/weapon/holder/H = new holder_type(get_turf(src)) + src.forceMove(H) + grabber.put_in_hands(H) + + if(self_grab) + grabber << "\The [src] clambers onto you!" + src << "You climb up onto \the [grabber]!" + grabber.equip_to_slot_if_possible(H, slot_back, 0, 1) + else + grabber << "You scoop up \the [src]!" + src << "\The [grabber] scoops you up!" - grabber << "You scoop up [src]." - src << "[grabber] scoops you up." grabber.status_flags |= PASSEMOTES H.sync(src) return H diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index b2e8c3ca0e0..c998ad1bd07 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -216,19 +216,20 @@ var/list/slot_equipment_priority = list( \ wear_mask = null update_inv_wear_mask(0) return + +/mob/proc/isEquipped(obj/item/I) + if(!I) + return 0 + return get_inventory_slot(I) != 0 /mob/proc/canUnEquip(obj/item/I) if(!I) //If there's nothing to drop, the drop is automatically successful. return 1 var/slot = get_inventory_slot(I) - if(slot && !I.mob_can_unequip(src, slot)) - return 0 - - drop_from_inventory(I) - return 1 + return slot && I.mob_can_unequip(src, slot) /mob/proc/get_inventory_slot(obj/item/I) - var/slot + var/slot = 0 for(var/s in slot_back to slot_tie) //kind of worries me if(get_equipped_item(s) == I) slot = s diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index eeb4fb5e0dc..5d3f7e487ca 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -53,19 +53,7 @@ if(screwloose && prob(5)) // Make a mess if(istype(loc, /turf/simulated)) var/turf/simulated/T = loc - if(T.wet < 1) - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi', T, "wet_floor") - T.overlays += T.wet_overlay - spawn(800) - if(istype(T) && T.wet < 2) - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null + T.wet_floor() if(oddbutton && prob(5)) // Make a big mess visible_message("Something flies out of [src]. He seems to be acting oddly.") diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm index 498f78c94ec..8a487d57b35 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona.dm @@ -9,6 +9,10 @@ death_msg = "expires with a pitiful chirrup..." universal_understand = 1 universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea. + + can_pull_size = 2 + can_pull_mobs = MOB_PULL_SMALLER + holder_type = /obj/item/weapon/holder/diona var/obj/item/hat @@ -18,19 +22,6 @@ species = all_species["Diona"] verbs += /mob/living/carbon/alien/diona/proc/merge -/mob/living/carbon/alien/diona/start_pulling(var/atom/movable/AM) - //TODO: Collapse these checks into one proc (see pai and drone) - if(istype(AM,/obj/item)) - var/obj/item/O = AM - if(O.w_class > 2) - src << "You are too small to pull that." - return - else - ..() - else - src << "You are too small to pull that." - return - /mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands. W.loc = get_turf(src) return 1 diff --git a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm index 45d1f6fe469..b9338f361ff 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm @@ -1,17 +1,13 @@ -/mob/living/carbon/alien/diona/MouseDrop(atom/over_object) - var/mob/living/carbon/H = over_object - if(!istype(H) || !Adjacent(H)) return ..() - if(H.a_intent == "help") - if(H.species && H.species.name == "Diona" && do_merge(H)) - return - get_scooped(H) - return - else if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand)) +/mob/living/carbon/alien/diona/MouseDrop(var/atom/over_object) + var/mob/living/carbon/human/H = over_object + if(!istype(H) || !Adjacent(H)) + return ..() + if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand)) hat.loc = get_turf(src) H.put_in_hands(hat) H.visible_message("\The [H] removes \the [src]'s [hat].") hat = null - update_icons() + updateicon() else return ..() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a45f378ab46..50e04187662 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -235,8 +235,8 @@ M.visible_message("[M] tries to pat out [src]'s flames!", "You try to pat out [src]'s flames! Hot!") if(do_mob(M, src, 15)) + src.fire_stacks -= 0.5 if (prob(10) && (M.fire_stacks <= 0)) - src.fire_stacks -= 0.5 M.fire_stacks += 1 M.IgniteMob() if (M.on_fire) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 4495ed41756..f77be45d561 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1370,13 +1370,6 @@ return 1 return 0 -/mob/living/carbon/human/MouseDrop(var/atom/over_object) - var/mob/living/carbon/human/H = over_object - if(holder_type && a_intent == "help" && istype(H) && H.a_intent == "help" && !issmall(H) && Adjacent(H)) - get_scooped(H) - return - return ..() - /mob/living/carbon/human/verb/pull_punches() set name = "Pull Punches" set desc = "Try not to hurt them." diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 2feecc18846..53d62dbea0e 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -5,6 +5,7 @@ health = maxHealth stat = CONSCIOUS return + var/total_burn = 0 var/total_brute = 0 for(var/obj/item/organ/external/O in organs) //hardcoded to streamline things a bit @@ -13,11 +14,7 @@ total_brute += O.brute_dam total_burn += O.burn_dam - var/oxy_l = getOxyLoss() - var/tox_l = ((species.flags & NO_POISON) ? 0 : getToxLoss()) - var/clone_l = getCloneLoss() - - health = maxHealth - oxy_l - tox_l - clone_l - total_burn - total_brute + health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute //TODO: fix husking if( ((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD) @@ -70,7 +67,7 @@ /mob/living/carbon/human/getBruteLoss() var/amount = 0 for(var/obj/item/organ/external/O in organs) - if(O.status & ORGAN_ROBOT) + if((O.status & ORGAN_ROBOT) && !O.vital) continue //robot limbs don't count towards shock and crit amount += O.brute_dam return amount @@ -78,7 +75,7 @@ /mob/living/carbon/human/getFireLoss() var/amount = 0 for(var/obj/item/organ/external/O in organs) - if(O.status & ORGAN_ROBOT) + if((O.status & ORGAN_ROBOT) && !O.vital) continue //robot limbs don't count towards shock and crit amount += O.burn_dam return amount diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 78dbee05521..22acad9445d 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -36,6 +36,7 @@ var/undershirt = 0 //Which undershirt the player wants. var/socks = 0 //Which socks the player wants. var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack. + var/pdachoice = 1 //Which PDA type the player has chosen. Default, Slim, or Old. // General information var/home_system = "" diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 45a0a50364e..b3c8660a27f 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -43,7 +43,7 @@ E.process() number_wounds += E.number_wounds - if (!lying && world.time - l_move_time < 15) + if (!lying && !buckled && world.time - l_move_time < 15) //Moving around with fractured ribs won't do you any good if (E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15)) var/obj/item/organ/I = pick(E.internal_organs) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 971e8c4a6fa..085e070f0a1 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -45,7 +45,7 @@ //blinded get reset each cycle and then get activated later in the //code. Very ugly. I dont care. Moving this stuff here so its easy //to find it. - blinded = null + blinded = 0 fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it. //TODO: seperate this out diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index e19795b6413..a7af36340c4 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -94,7 +94,7 @@ ) var/list/cold_discomfort_strings = list( "You feel chilly.", - "You shiver suddely.", + "You shiver suddenly.", "Your chilly flesh stands out in goosebumps." ) @@ -274,9 +274,6 @@ O.owner = H /datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target) - if (target.holder_type && target.a_intent == "help" && H.a_intent == "help") - target.get_scooped(H) - return var/t_him = "them" switch(target.gender) diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm index 8b33f7a5865..8bd8822132f 100644 --- a/code/modules/mob/living/carbon/resist.dm +++ b/code/modules/mob/living/carbon/resist.dm @@ -31,7 +31,7 @@ //This line represent a significant buff to grabs... // We don't have to check the click cooldown because /mob/living/verb/resist() has done it for us, we can simply set the delay - setClickCooldown(100) + setClickCooldown(100) if(can_break_cuffs()) //Don't want to do a lot of logic gating here. break_handcuffs() @@ -58,7 +58,7 @@ ) if(do_after(src, breakouttime)) - if(!handcuffed || buckled) + if(!handcuffed) return visible_message( "\The [src] manages to remove \the [handcuffed]!", @@ -66,11 +66,11 @@ ) drop_from_inventory(handcuffed) -/mob/living/carbon/proc/escape_legcuffs() +/mob/living/carbon/proc/escape_legcuffs() if(!canClick()) return - setClickCooldown(100) + setClickCooldown(100) if(can_break_cuffs()) //Don't want to do a lot of logic gating here. break_legcuffs() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b6cf19b8496..ba0953a5255 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -85,7 +85,7 @@ default behaviour is: now_pushing = 0 return - if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && tmob.canmove && canmove && !dense && can_move_mob(tmob, 1, 0)) // mutual brohugs all around! + if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && tmob.canmove && canmove && !tmob.buckled && !buckled && !dense && can_move_mob(tmob, 1, 0)) // mutual brohugs all around! var/turf/oldloc = loc forceMove(tmob.loc) tmob.forceMove(oldloc) @@ -123,22 +123,26 @@ default behaviour is: now_pushing = 0 spawn(0) ..() - if (!istype(AM, /atom/movable)) + if (!istype(AM, /atom/movable) || AM.anchored) + if(confused && prob(50) && m_intent=="run") + Paralyse(1) + playsound(loc, "punch", 25, 1, -1) + visible_message("[src] [pick("ran", "slammed")] into \the [AM]!") + src.take_organ_damage(5) return if (!now_pushing) now_pushing = 1 - if (!AM.anchored) - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window)) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - if(ishuman(AM) && AM:grabbed_by) - for(var/obj/item/weapon/grab/G in AM:grabbed_by) - step(G:assailant, get_dir(G:assailant, AM)) - G.adjust_position() + var/t = get_dir(src, AM) + if (istype(AM, /obj/structure/window)) + for(var/obj/structure/window/win in get_step(AM,t)) + now_pushing = 0 + return + step(AM, t) + if(ishuman(AM) && AM:grabbed_by) + for(var/obj/item/weapon/grab/G in AM:grabbed_by) + step(G:assailant, get_dir(G:assailant, AM)) + G.adjust_position() now_pushing = 0 return return diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 579ec2e6d61..d049e12d757 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -127,9 +127,6 @@ return 0 ..() -/mob/living/silicon/pai/MouseDrop(atom/over_object) - return - /mob/living/silicon/pai/emp_act(severity) // Silence for 2 minutes // 20% chance to kill @@ -396,37 +393,16 @@ resting = 0 icon_state = "[chassis]" -/mob/living/silicon/pai/start_pulling(var/atom/movable/AM) - - if(istype(AM,/obj/item)) - var/obj/item/O = AM - if(O.w_class == 1) - ..() - else - src << "You are too small to pull that." - else - src << "You are too small to pull that." - return - // No binary for pAIs. /mob/living/silicon/pai/binarycheck() return 0 // Handle being picked up. -/mob/living/silicon/pai/get_scooped(var/mob/living/carbon/grabber) - var/obj/item/weapon/holder/H = ..() +/mob/living/silicon/pai/get_scooped(var/mob/living/carbon/grabber, var/self_drop) + var/obj/item/weapon/holder/H = ..(grabber, self_drop) if(!istype(H)) return H.icon_state = "pai-[icon_state]" grabber.update_inv_l_hand() grabber.update_inv_r_hand() return H - -/mob/living/silicon/pai/MouseDrop(atom/over_object) - var/mob/living/carbon/H = over_object - if(!istype(H) || !Adjacent(H)) return ..() - if(H.a_intent == "help") - get_scooped(H) - return - else - return ..() diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 14434bfe6e9..5356ca9b21b 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -37,6 +37,9 @@ var/list/mob_hat_cache = list() integrated_light_power = 3 local_transmit = 1 + can_pull_size = 3 + can_pull_mobs = MOB_PULL_SMALLER + mob_bump_flag = SIMPLE_ANIMAL mob_swap_flags = SIMPLE_ANIMAL mob_push_flags = SIMPLE_ANIMAL @@ -49,8 +52,6 @@ var/list/mob_hat_cache = list() var/obj/machinery/drone_fabricator/master_fabricator var/law_type = /datum/ai_laws/drone var/module_type = /obj/item/weapon/robot_module/drone - var/can_pull_size = 2 - var/can_pull_mobs var/obj/item/hat var/hat_x_offset = 0 var/hat_y_offset = -13 @@ -66,10 +67,10 @@ var/list/mob_hat_cache = list() icon_state = "constructiondrone" law_type = /datum/ai_laws/construction_drone module_type = /obj/item/weapon/robot_module/drone/construction - can_pull_size = 5 - can_pull_mobs = 1 hat_x_offset = 1 hat_y_offset = -12 + can_pull_size = 5 + can_pull_mobs = MOB_PULL_SAME /mob/living/silicon/robot/drone/New() @@ -315,20 +316,6 @@ var/list/mob_hat_cache = list() src << "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI." src << "Use say ;Hello to talk to other drones and say Hello to speak silently to your nearby fellows." -/mob/living/silicon/robot/drone/start_pulling(var/atom/movable/AM) - - if(!(istype(AM,/obj/item/pipe) || istype(AM,/obj/structure/disposalconstruct))) - if(istype(AM,/obj/item)) - var/obj/item/O = AM - if(O.w_class > can_pull_size) - src << "You are too small to pull that." - return - else - if(!can_pull_mobs) - src << "You are too small to pull that." - return - ..() - /mob/living/silicon/robot/drone/add_robot_verbs() src.verbs |= silicon_subsystems diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm index e5aa936a086..2f688a90080 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm @@ -21,13 +21,11 @@ return -/mob/living/silicon/robot/drone/MouseDrop(atom/over_object) - var/mob/living/carbon/H = over_object - if(!istype(H) || !Adjacent(H)) return ..() - if(H.a_intent == "help") - get_scooped(H) - return - else if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand)) +/mob/living/silicon/robot/drone/MouseDrop(var/atom/over_object) + var/mob/living/carbon/human/H = over_object + if(!istype(H) || !Adjacent(H)) + return ..() + if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand)) hat.loc = get_turf(src) H.put_in_hands(hat) H.visible_message("\The [H] removes \the [src]'s [hat].") diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 2008edec863..f28c464cea1 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -114,9 +114,9 @@ src.density = !( src.lying ) - if ((src.sdisabilities & BLIND)) + if (src.sdisabilities & BLIND) src.blinded = 1 - if ((src.sdisabilities & DEAF)) + if (src.sdisabilities & DEAF) src.ear_deaf = 1 if (src.eye_blurry > 0) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 302b8eb1013..a23d328bd33 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -313,6 +313,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/crowbar(src) src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) src.modules += new /obj/item/device/pipe_painter(src) + src.modules += new /obj/item/device/floor_painter(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal() var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel() @@ -353,6 +354,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/analyzer(src) src.modules += new /obj/item/taperoll/engineering(src) src.modules += new /obj/item/weapon/gripper(src) + src.modules += new /obj/item/device/lightreplacer(src) src.modules += new /obj/item/device/pipe_painter(src) src.emag = new /obj/item/borg/stun(src) @@ -676,6 +678,8 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/gripper(src) src.modules += new /obj/item/weapon/soap(src) src.modules += new /obj/item/weapon/extinguisher(src) + src.modules += new /obj/item/device/pipe_painter(src) + src.modules += new /obj/item/device/floor_painter(src) robot.internals = new/obj/item/weapon/tank/jetpack/carbondioxide(src) src.modules += robot.internals diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 7c25296a5ef..c4a238f8709 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -124,22 +124,6 @@ . = ..() set_flee_target(AM.thrower? AM.thrower : src.loc) -/mob/living/simple_animal/cat/MouseDrop(atom/over_object) - - var/mob/living/carbon/H = over_object - if(!istype(H) || !Adjacent(H)) return ..() - - if(H.a_intent == "help") - get_scooped(H) - return - else - return ..() - -/mob/living/simple_animal/cat/get_scooped(var/mob/living/carbon/grabber) - if (stat >= DEAD) - return //since the holder icon looks like a living cat - ..() - //Basic friend AI /mob/living/simple_animal/cat/fluff var/mob/living/carbon/human/friend diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 0ea2a05dd42..2b776671fed 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -31,6 +31,9 @@ holder_type = /obj/item/weapon/holder/mouse mob_size = MOB_MINISCULE + can_pull_size = 1 + can_pull_mobs = MOB_PULL_NONE + /mob/living/simple_animal/mouse/Life() ..() if(!stat && prob(speak_chance)) @@ -78,25 +81,6 @@ if(client) client.time_died_as_mouse = world.time -/mob/living/simple_animal/mouse/MouseDrop(atom/over_object) - - var/mob/living/carbon/H = over_object - if(!istype(H) || !Adjacent(H)) return ..() - - if(H.a_intent == "help") - get_scooped(H) - return - else - return ..() - -/mob/living/simple_animal/mouse/get_scooped(var/mob/living/carbon/grabber) - if (stat >= DEAD) - return - ..() - -/mob/living/simple_animal/mouse/start_pulling(var/atom/movable/AM)//Prevents mouse from pulling things - src << "You are too small to pull anything." - return /mob/living/simple_animal/mouse/Crossed(AM as mob|obj) if( ishuman(AM) ) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e6a0b277f6a..7a66deb3c41 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -56,19 +56,19 @@ if(!client) return if (type) - if(type & 1 && (sdisabilities & BLIND || blinded || paralysis) )//Vision related + if((type & 1) && ((sdisabilities & BLIND) || blinded || paralysis) )//Vision related if (!( alt )) return else msg = alt type = alt_type - if (type & 2 && (sdisabilities & DEAF || ear_deaf))//Hearing related + if ((type & 2) && ((sdisabilities & DEAF) || ear_deaf))//Hearing related if (!( alt )) return else msg = alt type = alt_type - if ((type & 1 && sdisabilities & BLIND)) + if ((type & 1) && (sdisabilities & BLIND)) return // Added voice muffling for Issue 41. if(stat == UNCONSCIOUS || sleeping > 0) @@ -88,10 +88,10 @@ for(var/I in see) if(isobj(I)) - spawn(0) - if(I) //It's possible that it could be deleted in the meantime. - var/obj/O = I - O.show_message( message, 1, blind_message, 2) + //spawn(0) + //if(I) //It's possible that it could be deleted in the meantime. + var/obj/O = I + O.show_message( message, 1, blind_message, 2) else if(ismob(I)) var/mob/M = I if(self_message && M==src) @@ -603,20 +603,44 @@ pullin.icon_state = "pull0" /mob/proc/start_pulling(var/atom/movable/AM) + if ( !AM || !usr || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort! return if (AM.anchored) - usr << "It won't budge!" + src << "It won't budge!" return var/mob/M = AM if(ismob(AM)) + + if(!can_pull_mobs || !can_pull_size) + src << "It won't budge!" + return + + if((mob_size < M.mob_size) && (can_pull_mobs != MOB_PULL_LARGER)) + src << "It won't budge!" + return + + if((mob_size == M.mob_size) && (can_pull_mobs == MOB_PULL_SMALLER)) + src << "It won't budge!" + return + + // If your size is larger than theirs and you have some + // kind of mob pull value AT ALL, you will be able to pull + // them, so don't bother checking that explicitly. + if(!iscarbon(src)) M.LAssailant = null else M.LAssailant = usr + else if(isobj(AM)) + var/obj/I = AM + if(!can_pull_size || can_pull_size < I.w_class) + src << "It won't budge!" + return + if(pulling) var/pulling_old = pulling stop_pulling() @@ -989,6 +1013,12 @@ mob/proc/yank_out_object() var/mob/living/carbon/human/human_user = U human_user.bloody_hands(H) + else if(issilicon(src)) + var/mob/living/silicon/robot/R = src + R.embedded -= selection + R.adjustBruteLoss(5) + R.adjustFireLoss(10) + selection.forceMove(get_turf(src)) if(!(U.l_hand && U.r_hand)) U.put_in_hands(selection) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 9503800189c..dfbde26b65f 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -149,6 +149,8 @@ var/const/deafness = 2//Carbon var/const/muteness = 4//Carbon + var/can_pull_size = 10 // Maximum w_class the mob can pull. + var/can_pull_mobs = MOB_PULL_LARGER // Whether or not the mob can pull other mobs. var/datum/dna/dna = null//Carbon var/radiation = 0.0//Carbon diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index e946a9df41d..477bb62e9aa 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -11,7 +11,7 @@ return /mob/proc/setMoveCooldown(var/timeout) - if(client) + if(client) client.move_delay = max(world.time + timeout, client.move_delay) /client/North() @@ -286,7 +286,7 @@ //specific vehicle move delays are set in code\modules\vehicles\vehicle.dm move_delay = world.time + tickcomp //drunk driving - if(mob.confused) + if(mob.confused && prob(75)) direct = pick(cardinal) return mob.buckled.relaymove(mob,direct) @@ -300,15 +300,19 @@ if(istype(mob.pulledby, /obj/structure/bed/chair/wheelchair)) return mob.pulledby.relaymove(mob, direct) else if(istype(mob.buckled, /obj/structure/bed/chair/wheelchair)) - if(ishuman(mob.buckled)) - var/mob/living/carbon/human/driver = mob.buckled + if(ishuman(mob)) + var/mob/living/carbon/human/driver = mob var/obj/item/organ/external/l_hand = driver.get_organ("l_hand") var/obj/item/organ/external/r_hand = driver.get_organ("r_hand") if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED))) return // No hands to drive your chair? Tough luck! //drunk wheelchair driving - if(mob.confused) - direct = pick(cardinal) + else if(mob.confused) + switch(mob.m_intent) + if("run") + if(prob(75)) direct = pick(cardinal) + if("walk") + if(prob(25)) direct = pick(cardinal) move_delay += 2 return mob.buckled.relaymove(mob,direct) @@ -348,7 +352,11 @@ return else if(mob.confused) - step(mob, pick(cardinal)) + switch(mob.m_intent) + if("run") + if(prob(75)) step(mob, pick(cardinal)) + if("walk") + if(prob(25)) step(mob, pick(cardinal)) else . = mob.SelfMove(n, direct) @@ -450,8 +458,8 @@ if(!Check_Dense_Object()) //Nothing to push off of so end here update_floating(0) return 0 - - update_floating(1) + + update_floating(1) if(restrained()) //Check to see if we can do things return 0 @@ -477,10 +485,10 @@ if(istype(turf,/turf/simulated/floor)) // Floors don't count if they don't have gravity var/area/A = turf.loc - if(istype(A) && A.has_gravity == 0) + if(istype(A) && A.has_gravity == 0) if(shoegrip == null) shoegrip = Check_Shoegrip() //Shoegrip is only ever checked when a zero-gravity floor is encountered to reduce load - if(!shoegrip) + if(!shoegrip) continue dense_object++ diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index ec6a38de928..d8b9fbd7cfd 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -435,81 +435,6 @@ name = "Bald" icon_state = "bald" - icp_screen_pink - name = "pink IPC screen" - icon_state = "ipc_pink" - species_allowed = list("Machine") - - icp_screen_red - name = "red IPC screen" - icon_state = "ipc_red" - species_allowed = list("Machine") - - icp_screen_green - name = "green IPC screen" - icon_state = "ipc_green" - species_allowed = list("Machine") - - icp_screen_blue - name = "blue IPC screen" - icon_state = "ipc_blue" - species_allowed = list("Machine") - - icp_screen_breakout - name = "breakout IPC screen" - icon_state = "ipc_breakout" - species_allowed = list("Machine") - - icp_screen_eight - name = "eight IPC screen" - icon_state = "ipc_eight" - species_allowed = list("Machine") - - icp_screen_goggles - name = "goggles IPC screen" - icon_state = "ipc_goggles" - species_allowed = list("Machine") - - icp_screen_heart - name = "heart IPC screen" - icon_state = "ipc_heart" - species_allowed = list("Machine") - - icp_screen_monoeye - name = "monoeye IPC screen" - icon_state = "ipc_monoeye" - species_allowed = list("Machine") - - icp_screen_nature - name = "nature IPC screen" - icon_state = "ipc_nature" - species_allowed = list("Machine") - - icp_screen_orange - name = "orange IPC screen" - icon_state = "ipc_orange" - species_allowed = list("Machine") - - icp_screen_purple - name = "purple IPC screen" - icon_state = "ipc_purple" - species_allowed = list("Machine") - - icp_screen_shower - name = "shower IPC screen" - icon_state = "ipc_shower" - species_allowed = list("Machine") - - icp_screen_static - name = "static IPC screen" - icon_state = "ipc_static" - species_allowed = list("Machine") - - icp_screen_yellow - name = "yellow IPC screen" - icon_state = "ipc_yellow" - species_allowed = list("Machine") - /* /////////////////////////////////// / =---------------------------= / diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 6621e0f102b..575ded61383 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -216,7 +216,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 //Transfers blood from reagents to vessel, respecting blood types compatability. /mob/living/carbon/human/inject_blood(var/datum/reagent/blood/injected, var/amount) - if(should_have_organ(O_HEART)) + if(!should_have_organ(O_HEART)) reagents.add_reagent("blood", amount, injected.data) reagents.update_total() return diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 3c717847ccd..ad68815f377 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -41,3 +41,8 @@ var/datum/robolimb/basic_robolimb company = "Morpheus" desc = "This limb is simple and functional; no effort has been made to make it look human." icon = 'icons/mob/human_races/cyberlimbs/ipc.dmi' + +/datum/robolimb/wardtakahashi + company = "Ward-Takahashi" + desc = "This limb features sleek black and white polymers." + icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi.dmi' \ No newline at end of file diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 154c1215269..0272bc1fdf7 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -344,68 +344,51 @@ obj/structure/cable/proc/cableColor(var/colorC) . = list() // this will be a list of all connected power objects var/turf/T - // Handle z-level connections. - if(d1 == 11 || d1 == 12) - // Connections below. - if(d1 == 11) - var/turf/turf = GetBelow(src) - if(turf) - . += power_list(turf, src, 12, 1) - - // Connections above. - if(d1 == 12) - var/turf/turf = GetAbove(src) - if(turf) - . += power_list(turf, src, 11, 1) - - //get matching cables from the first direction - else if(d1) //if not a node cable - T = get_step(src, d1) + // Handle up/down cables + if(d1 == 11 || d2 == 11) + T = GetBelow(src) if(T) - . += power_list(T, src, turn(d1, 180), powernetless_only) //get adjacents matching cables - - if(d1&(d1-1)) //diagonal direction, must check the 4 possibles adjacents tiles - T = get_step(src,d1&3) // go north/south + . += power_list(T, src, 12, 1) + if(d1 == 12 || d1 == 12) + T = GetAbove(src) if(T) - . += power_list(T, src, d1 ^ 3, powernetless_only) //get diagonally matching cables - T = get_step(src,d1&12) // go east/west + . += power_list(T, src, 11, 1) + + // Handle standard cables in adjacent turfs + for(var/cable_dir in list(d1, d2)) + if(cable_dir == 11 || cable_dir == 12 || cable_dir == 0) + continue + var/reverse = reverse_dir[cable_dir] + T = get_step(src, cable_dir) if(T) - . += power_list(T, src, d1 ^ 12, powernetless_only) //get diagonally matching cables + for(var/obj/structure/cable/C in T) + if((C.d1 && C.d1 == reverse) || (C.d2 && C.d2 == reverse)) + . += C + if(cable_dir & (cable_dir - 1)) // Diagonal, check for /\/\/\ style cables along cardinal directions + for(var/pair in list(NORTH|SOUTH, EAST|WEST)) + T = get_step(src, cable_dir & pair) + if(T) + var/req_dir = cable_dir ^ pair + for(var/obj/structure/cable/C in T) + if((C.d1 && C.d1 == req_dir) || (C.d2 && C.d2 == req_dir)) + . += C - . += power_list(loc, src, d1, powernetless_only) //get on turf matching cables + // Handle cables on the same turf as us + for(var/obj/structure/cable/C in loc) + if(C.d1 == d1 || C.d2 == d1 || C.d1 == d2 || C.d2 == d2) // if either of C's d1 and d2 match either of ours + . += C + if(d1 == 0) + for(var/obj/machinery/power/P in loc) + if(P.powernet == 0) continue // exclude APCs with powernet=0 + if(!powernetless_only || !P.powernet) + . += P - // Second direction. - // Handle z-level connections. - if(d2 == 11 || d2 == 12) - // Connections below. - if(d2 == 11) - var/turf/turf = GetBelow(src) - if(turf) - . += power_list(turf, src, 12, 1) - - // Connections above. - if(d2 == 12) - var/turf/turf = GetAbove(src) - if(turf) - . += power_list(turf, src, 11, 1) - - else - //do the same on the second direction (which can't be 0) - T = get_step(src, d2) - if(T) - . += power_list(T, src, turn(d2, 180), powernetless_only) //get adjacents matching cables - - if(d2&(d2-1)) //diagonal direction, must check the 4 possibles adjacents tiles - T = get_step(src,d2&3) // go north/south - if(T) - . += power_list(T, src, d2 ^ 3, powernetless_only) //get diagonally matching cables - T = get_step(src,d2&12) // go east/west - if(T) - . += power_list(T, src, d2 ^ 12, powernetless_only) //get diagonally matching cables - . += power_list(loc, src, d2, powernetless_only) //get on turf matching cables - - return . + // if the caller asked for powernetless cables only, dump the ones with powernets + if(powernetless_only) + for(var/obj/structure/cable/C in .) + if(C.powernet) + . -= C //should be called after placing a cable which extends another cable, creating a "smooth" cable that no longer terminates in the centre of a turf. //needed as this can, unlike other placements, disconnect cables diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm index 3209560007c..05c5da1e94a 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm @@ -162,24 +162,7 @@ T.visible_message("The water sizzles as it lands on \the [T]!") else if(volume >= 10) - if(T.wet >= 1) - return - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - - spawn(800) // This is terrible and needs to be changed when possible. - if(!T || !istype(T)) - return - if(T.wet >= 2) - return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null + T.wet_floor(1) /datum/reagent/water/touch_obj(var/obj/O) if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube)) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 80dc08fa785..4b5580fed5c 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -123,24 +123,7 @@ qdel(hotspot) if(volume >= 3) - if(T.wet >= 1) - return - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - - spawn(800) // This is terrible and needs to be changed when possible. - if(!T || !istype(T)) - return - if(T.wet >= 2) - return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null + T.wet_floor() /datum/reagent/nutriment/virus_food name = "Virus Food" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index e947e9ea154..08ec5df6c53 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -256,9 +256,13 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES] - if(E && istype(E)) + if(istype(E)) + if(E.status & ORGAN_ROBOT) + return if(E.damage > 0) E.damage = max(E.damage - 5 * removed, 0) + if(E.damage <= 5 && E.organ_tag == O_EYES) + H.sdisabilities &= ~BLIND /datum/reagent/peridaxon name = "Peridaxon" @@ -272,10 +276,13 @@ /datum/reagent/peridaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(ishuman(M)) var/mob/living/carbon/human/H = M - for(var/obj/item/organ/I in H.internal_organs) - if((I.damage > 0) && !(I.status & ORGAN_ROBOT)) //Peridaxon heals only non-robotic organs + if(I.status & ORGAN_ROBOT) + continue + if(I.damage > 0) //Peridaxon heals only non-robotic organs I.damage = max(I.damage - removed, 0) + if(I.damage <= 5 && I.organ_tag == O_EYES) + H.sdisabilities &= ~BLIND /datum/reagent/ryetalyn name = "Ryetalyn" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index aecbf766b9b..af30173680b 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -328,16 +328,7 @@ if(!istype(T)) return if(volume >= 1) - if(T.wet >= 2) - return - T.wet = 2 - spawn(800) - if(!T || !istype(T)) - return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null + T.wet_floor(2) /datum/reagent/silicate name = "Silicate" diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 41b6ad8cd41..48bb8742907 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -87,6 +87,7 @@ if (!hasorgans(target)) return + var/obj/item/organ/external/affected = target.get_organ(target_zone) for(var/obj/item/organ/I in affected.internal_organs) @@ -109,12 +110,14 @@ return var/obj/item/organ/external/affected = target.get_organ(target_zone) - for(var/obj/item/organ/I in affected.internal_organs) + for(var/obj/item/organ/internal/I in affected.internal_organs) if(I && I.damage > 0) if(!(I.status & ORGAN_ROBOT)) user.visible_message("[user] treats damage to [target]'s [I.name] with [tool_name].", \ "You treat damage to [target]'s [I.name] with [tool_name]." ) I.damage = 0 + if(I.organ_tag == O_EYES) + target.sdisabilities &= ~BLIND fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 7ef998f3f3a..107f3a29772 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -246,6 +246,8 @@ user.visible_message("[user] repairs [target]'s [I.name] with [tool].", \ "You repair [target]'s [I.name] with [tool]." ) I.damage = 0 + if(I.organ_tag == O_EYES) + target.sdisabilities &= ~BLIND fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/world.dm b/code/world.dm index a046f2e0599..3fcdf2eb420 100644 --- a/code/world.dm +++ b/code/world.dm @@ -216,6 +216,12 @@ var/world_topic_spam_protect_time = world.timeofday return list2params(positions) + else if(T == "revision") + if(revdata.revision) + return list2params(list(branch = revdata.branch, date = revdata.date, revision = revdata.revision)) + else + return "unknown" + else if(copytext(T,1,5) == "info") var/input[] = params2list(T) if(input["key"] != config.comms_password) @@ -230,18 +236,32 @@ var/world_topic_spam_protect_time = world.timeofday return "Bad Key" - var/search = input["info"] - var/ckey = ckey(search) + var/list/search = params2list(input["info"]) + var/list/ckeysearch = list() + for(var/text in search) + ckeysearch += ckey(text) var/list/match = list() for(var/mob/M in mob_list) - if(findtext(M.name, search)) - match += M - else if(M.ckey == ckey) - match += M - else if(M.mind && findtext(M.mind.assigned_role, search)) - match += M + var/strings = list(M.name, M.ckey) + if(M.mind) + strings += M.mind.assigned_role + strings += M.mind.special_role + for(var/text in strings) + if(ckey(text) in ckeysearch) + match[M] += 10 // an exact match is far better than a partial one + else + for(var/searchstr in search) + if(findtext(text, searchstr)) + match[M] += 1 + + var/maxstrength = 0 + for(var/mob/M in match) + maxstrength = max(match[M], maxstrength) + for(var/mob/M in match) + if(match[M] < maxstrength) + match -= M if(!match.len) return "No matches" diff --git a/config/admin_ranks.txt b/config/admin_ranks.txt deleted file mode 100644 index 24ccd10bf07..00000000000 --- a/config/admin_ranks.txt +++ /dev/null @@ -1,43 +0,0 @@ -######################################################################################## -# ADMIN RANK DEFINES # -# The format of this is very simple. Rank name goes first. # -# Rank is CASE-SENSITIVE, all punctuation will be stripped so spaces don't matter. # -# Each rank is then followed by keywords with the prefix "+". # -# These keywords represent groups of verbs and abilities which are given to that rank. # -# +@ (or +prev) is a special shorthand which adds all the rights of the rank above it. # -# Ranks with no keywords will just be given the most basic verbs and abilities ~Carn # -######################################################################################## -# PLEASE NOTE: depending on config options, some abilities will be unavailable regardless if you have permission to use them! -# ALSO NOTE: this is a WorkInProgress at the moment. Most of this is just arbitrarily thrown in whatever group because LoadsaWork2Do+LittleTime. -# I'll be doing more moving around as feedback comes in. So be sure to check the notes after updates. - -# KEYWORDS: -# +ADMIN = general admin tools, verbs etc -# +FUN = events, other event-orientated actions. Access to the fun secrets in the secrets panel. -# +BAN = the ability to ban, jobban and fullban -# +STEALTH = the ability to stealthmin (make yourself appear with a fake name to everyone but other admins -# +POSSESS = the ability to possess objects -# +REJUV (or +REJUVINATE) = the ability to heal, respawn, modify damage and use godmode -# +BUILD (or +BUILDMODE) = the ability to use buildmode -# +SERVER = higher-risk admin verbs and abilities, such as those which affect the server configuration. -# +DEBUG = debug tools used for diagnosing and fixing problems. It's useful to give this to coders so they can investigate problems on a live server. -# +VAREDIT = everyone may view viewvars/debugvars/whatever you call it. This keyword allows you to actually EDIT those variables. -# +RIGHTS (or +PERMISSIONS) = allows you to promote and/or demote people. -# +SOUND (or +SOUNDS) = allows you to upload and play sounds -# +SPAWN (or +CREATE) = mob transformations, spawning of most atoms including mobs (high-risk atoms, e.g. blackholes, will require the +FUN flag too) -# +EVERYTHING (or +HOST or +ALL) = Simply gives you everything without having to type every flag - -Moderator +MOD -Admin Candidate +ADMIN -Trial Admin +@ +SPAWN +REJUV +VAREDIT +BAN #left for readability -Badmin +@ +POSSESS +BUILDMODE +SERVER +FUN #left for readability -Game Admin +@ +STEALTH +SOUNDS +DEBUG -Retired Admin +ADMIN +STEALTH - -Host +EVERYTHING -Head Admin +EVERYTHING -Head Developer +EVERYTHING - -Developer +DEBUG +VAREDIT +SERVER +SPAWN +REJUV +POSSESS +BUILDMODE -Dev Mod +@ +MOD - diff --git a/html/changelog.html b/html/changelog.html index 38baf19051d..ee8d18875d9 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1,7 +1,7 @@ - Baystation 12 Changelog + Polaris Changelog