diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index aa3e1741b5..8c7acf05a2 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 9aa16f91b5..79b3aa6540 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 d2cd41a940..4b4b129278 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/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index 33a0ee88e0..38bfc027bd 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -48,7 +48,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle if (evac) emergency_shuttle_docked.Announce("The Emergency Shuttle has docked with the station at docks one and two. You have approximately [round(estimate_launch_time()/60,1)] minutes to board the Emergency Shuttle.") else - priority_announcement.Announce("The scheduled shuttle to the Vir Interstellar Spaceport has docked with the station at docks one and two. It will depart in approximately [round(emergency_shuttle.estimate_launch_time()/60,1)] minutes.") + priority_announcement.Announce("The scheduled shuttle to the [dock_name] has docked with the station at docks one and two. It will depart in approximately [round(emergency_shuttle.estimate_launch_time()/60,1)] minutes.") //arm the escape pods if (evac) @@ -94,7 +94,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle //reset the shuttle transit time if we need to shuttle.move_time = SHUTTLE_TRANSIT_DURATION - priority_announcement.Announce("The regularly scheduled shuttle to the Vir Interstellar Spaceport will arrive in in approximately [round(estimate_arrival_time()/60)] minutes. Those leaving should proceed to docks one and two.") + priority_announcement.Announce("The regularly scheduled shuttle to the [dock_name] will arrive in in approximately [round(estimate_arrival_time()/60)] minutes. Those leaving should proceed to docks one and two.") //recalls the shuttle /datum/emergency_shuttle_controller/proc/recall() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 5d9a364871..c058e2ff5d 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 faf7526a9c..6d3e7d0b28 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 55d865b9fa..4c071130ad 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 1eb372d118..dcc7fa9df9 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 9f8fe69202..109eeaf501 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 038cf351ab..4fc1bc6f77 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 ab60dc6b6e..39b73a8dac 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 cfdb25c9a5..2accc6a966 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 6dacf78909..fb2979e427 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 eea5534751..2603d0f214 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 35c2b4aa07..cced0b79b3 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 73da615720..3b33e40a9e 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 ad664049fc..a5bdac7421 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 457792c9e2..87997d32c8 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/cryopod.dm b/code/game/machinery/cryopod.dm index 9eeec021bf..4d0b021275 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -143,7 +143,7 @@ visible_message("The console beeps happily as it disgorges \the [I].", 3) - I.loc = get_turf(src) + I.forceMove(get_turf(src)) frozen_items -= I else if(href_list["allitems"]) @@ -156,7 +156,7 @@ visible_message("The console beeps happily as it disgorges the desired objects.", 3) for(var/obj/item/I in frozen_items) - I.loc = get_turf(src) + I.forceMove(get_turf(src)) frozen_items -= I src.updateUsrDialog() @@ -309,7 +309,7 @@ /obj/machinery/cryopod/Destroy() if(occupant) - occupant.loc = loc + occupant.forceMove(loc) occupant.resting = 1 ..() @@ -319,13 +319,13 @@ find_control_computer() /obj/machinery/cryopod/proc/find_control_computer(urgent=0) - //control_computer = locate(/obj/machinery/computer/cryopod) in src.loc + //control_computer = locate(/obj/machinery/computer/cryopod) in src.loc.loc // Broken due to http://www.byond.com/forum/?post=2007448 control_computer = locate(/obj/machinery/computer/cryopod) in range(6,src) // Don't send messages unless we *need* the computer, and less than five minutes have passed since last time we messaged if(!control_computer && urgent && last_no_computer_message + 5*60*10 < world.time) - log_admin("Cryopod in [src.loc] could not find control computer!") - message_admins("Cryopod in [src.loc] could not find control computer!") + log_admin("Cryopod in [src.loc.loc] could not find control computer!") + message_admins("Cryopod in [src.loc.loc] could not find control computer!") last_no_computer_message = world.time return control_computer != null @@ -368,7 +368,7 @@ qdel(R.mmi) for(var/obj/item/I in R.module) // the tools the borg has; metal, glass, guns etc for(var/obj/item/O in I) // the things inside the tools, if anything; mainly for janiborg trash bags - O.loc = R + O.forceMove(R) qdel(I) qdel(R.module) @@ -385,13 +385,13 @@ //Drop all items into the pod. for(var/obj/item/W in occupant) occupant.drop_from_inventory(W) - W.loc = src + W.forceMove(src) if(W.contents.len) //Make sure we catch anything not handled by qdel() on the items. for(var/obj/item/O in W.contents) if(istype(O,/obj/item/weapon/storage/internal)) //Stop eating pockets, you fuck! continue - O.loc = src + O.forceMove(src) //Delete all items not on the preservation list. var/list/items = src.contents.Copy() @@ -401,10 +401,18 @@ for(var/obj/item/W in items) var/preserve = null - for(var/T in preserve_items) - if(istype(W,T)) + // Snowflaaaake. + if(istype(W, /obj/item/device/mmi)) + var/obj/item/device/mmi/brain = W + if(brain.brainmob && brain.brainmob.client && brain.brainmob.key) preserve = 1 - break + else + continue + else + for(var/T in preserve_items) + if(istype(W,T)) + preserve = 1 + break if(!preserve) qdel(W) @@ -413,7 +421,7 @@ control_computer.frozen_items += W W.loc = null else - W.loc = src.loc + W.forceMove(src.loc) //Update any existing objectives involving this mob. for(var/datum/objective/O in all_objectives) @@ -504,7 +512,7 @@ if(do_after(user, 20)) if(!M || !G || !G:affecting) return - M.loc = src + M.forceMove(src) if(M.client) M.client.perspective = EYE_PERSPECTIVE @@ -540,7 +548,7 @@ if(announce) items -= announce for(var/obj/item/W in items) - W.loc = get_turf(src) + W.forceMove(get_turf(src)) src.go_out() add_fingerprint(usr) @@ -579,7 +587,7 @@ usr.stop_pulling() usr.client.perspective = EYE_PERSPECTIVE usr.client.eye = src - usr.loc = src + usr.forceMove(src) set_occupant(usr) icon_state = occupied_icon_state @@ -613,7 +621,7 @@ occupant.client.eye = src.occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE - occupant.loc = get_turf(src) + occupant.forceMove(get_turf(src)) set_occupant(null) icon_state = base_icon_state diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 501ec06629..d34acd5d2d 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 455c6256a4..6798f2b736 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/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index df85773fb2..cd3618c936 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -33,7 +33,7 @@ if (!iswall(W) || !isturf(user.loc)) user << "You can't place this here!" return - + var/placement_dir = get_dir(user, W) if (!(placement_dir in cardinal)) user << "You must stand directly in front of the wall you wish to place that on." @@ -43,7 +43,7 @@ var/stuff_on_wall = 0 if (locate(/obj/structure/sign/poster) in W) stuff_on_wall = 1 - + //crude, but will cover most cases. We could do stuff like check pixel_x/y but it's not really worth it. for (var/dir in cardinal) var/turf/T = get_step(W, dir) @@ -61,7 +61,7 @@ flick("poster_being_set", P) //playsound(W, 'sound/items/poster_being_created.ogg', 100, 1) //why the hell does placing a poster make printer sounds? - + var/oldsrc = src //get a reference to src so we can delete it after detaching ourselves src = null spawn(17) @@ -71,7 +71,7 @@ user << "You place the poster!" else P.roll_and_drop(P.loc) - + qdel(oldsrc) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway //############################## THE ACTUAL DECALS ########################### @@ -90,11 +90,11 @@ if(!serial) serial = rand(1, poster_designs.len) //use a random serial if none is given - + serial_number = serial var/datum/poster/design = poster_designs[serial_number] set_poster(design) - + switch (placement_dir) if (NORTH) pixel_x = 0 @@ -133,23 +133,23 @@ /obj/structure/sign/poster/attack_hand(mob/user as mob) + if(ruined) return - var/temp_loc = user.loc - switch(alert("Do I want to rip the poster from the wall?","You think...","Yes","No")) - if("Yes") - if(user.loc != temp_loc) - return - visible_message("[user] rips [src] in a single, decisive motion!" ) - playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, 1) - ruined = 1 - icon_state = "poster_ripped" - name = "ripped poster" - desc = "You can't make out anything from the poster's original print. It's ruined." - add_fingerprint(user) - if("No") + + if(alert("Do I want to rip the poster from the wall?","You think...","Yes","No") == "Yes") + + if(ruined || !user.Adjacent(src)) return + visible_message("[user] rips [src] in a single, decisive motion!" ) + playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, 1) + ruined = 1 + icon_state = "poster_ripped" + name = "ripped poster" + desc = "You can't make out anything from the poster's original print. It's ruined." + add_fingerprint(user) + /obj/structure/sign/poster/proc/roll_and_drop(turf/newloc) var/obj/item/weapon/contraband/poster/P = new(src, serial_number) P.loc = newloc diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 240aa6783e..055176246c 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 1935455f94..bf5df08d34 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 356ee87f60..29c8377d43 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 58457d55bd..11cc3a58a8 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 1b087f1791..92515407d0 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 67516404fd..fa2a8d4864 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 16c810a8a0..da19137043 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 25276b3c87..a4644e274f 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 e59d3e993b..2740831046 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 0000000000..aa7b633590 --- /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 377dad5f17..38811833cd 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 1e8518d5fe..4c26a482a1 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 d9bd30e788..c17d8ba650 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 22d12f9fd8..e2ec23be7c 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/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 1136ea148d..0b5ed55d62 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -12,6 +12,7 @@ var/implant_color = "b" var/allow_reagents = 0 var/malfunction = 0 + show_messages = 1 proc/trigger(emote, source as mob) return diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index f256e38223..0034ddb60b 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -14,6 +14,7 @@ force_divisor = 0.1 // 6 when wielded with hardness 60 (steel) thrown_force_divisor = 0.25 // 5 when thrown with weight 20 (steel) var/loaded //Descriptive string for currently loaded food object. + var/scoop_food = 1 /obj/item/weapon/material/kitchen/utensil/New() ..() @@ -74,6 +75,7 @@ desc = "A knife for eating with. Can cut through any food." icon_state = "knife" force_divisor = 0.1 // 6 when wielded with hardness 60 (steel) + scoop_food = 0 // Identical to the tactical knife but nowhere near as stabby. // Kind of like the toy esword compared to the real thing. diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 78665633cf..3cb92b0a3c 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/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 2788905eeb..0ec2e09497 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -424,29 +424,24 @@ /obj/item/weapon/weldingtool/attack(var/atom/A, var/mob/living/user, var/def_zone) if(ishuman(A) && user.a_intent == I_HELP) - return - return ..() - -/obj/item/weapon/weldingtool/afterattack(var/mob/M, var/mob/user) - - if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/carbon/human/H = A var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting] - if(!S || !(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP) + if(!S || !(S.status & ORGAN_ROBOT)) return ..() if(S.brute_dam) if(S.brute_dam < ROBOLIMB_SELF_REPAIR_CAP) S.heal_damage(15,0,0,1) - user.visible_message("\The [user] patches some dents on \the [M]'s [S.name] with \the [src].") - else if(S.open != 2) + user.visible_message("\The [user] patches some dents on \the [H]'s [S.name] with \the [src].") + else if(S.open < 3) user << "The damage is far too severe to patch over externally." - else if(S.open != 2) + else + return ..() + else user << "Nothing to fix!" return - else - return ..() + return ..() /*/obj/item/weapon/combitool name = "combi-tool" diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 8b4e93ec4d..b8bd8d95e1 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 886ccc2cae..5dea37ef51 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 105f2987df..d7d4c1f36c 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 a363ea6606..23e9eaa98d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -106,10 +106,46 @@ new /obj/item/device/radio/headset/headset_med(src) new /obj/item/device/radio/headset/headset_med/alt(src) new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src) + new /obj/item/weapon/storage/box/freezer(src) + new /obj/item/weapon/storage/box/freezer(src) + new /obj/item/weapon/storage/box/freezer(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) + new /obj/item/weapon/storage/box/freezer(src) + return + /obj/structure/closet/secure_closet/CMO name = "chief medical officer's locker" req_access = list(access_cmo) @@ -156,6 +192,7 @@ new /obj/item/device/flash(src) new /obj/item/weapon/reagent_containers/hypospray(src) new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src) + new /obj/item/weapon/storage/box/freezer(src) return diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index a385e31500..d4f16f72e4 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 4ca726af22..cd859b1489 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 0e2efb1c9e..867dada6d9 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 b8048a93c0..2b8396c554 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 2fb8566dc9..1624a4bbde 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 6fdf367d5d..5d5fc2d943 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 ffa143a9f5..2bcbf8aa87 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 4cea8bffc1..0e7546f271 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 fa45f65736..68b10ccf7a 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 81b094cac4..fb48f6249d 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 c2d6c57617..1d8686a678 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 47e9e30951..62b8f3699d 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/global.dm b/code/global.dm index daa26e30de..7a9366c3b3 100644 --- a/code/global.dm +++ b/code/global.dm @@ -27,6 +27,7 @@ var/diary = null var/href_logfile = null var/station_name = "Northern Star" var/station_short = "Northern Star" +var/const/dock_name = "Vir Interstellar Spaceport" var/const/boss_name = "Central Command" var/const/boss_short = "Centcomm" var/const/company_name = "NanoTrasen" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 19302f8d30..0fd47cde30 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 9d9919e4ed..83a2f3b370 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 9260baf3dd..8c73591197 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 e9772fe907..014cd8988f 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 71b607be18..3df5086cf0 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -313,7 +313,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O else if(href_list["skin_tone"]) if(!has_flag(mob_species, HAS_SKIN_TONE)) return TOPIC_NOACTION - var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference", pref.s_tone) as num|null + var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference", (-pref.s_tone) + 35) as num|null if(new_s_tone && has_flag(mob_species, HAS_SKIN_TONE) && CanUseTopic(user)) pref.s_tone = 35 - max(min( round(new_s_tone), 220),1) return TOPIC_REFRESH @@ -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 6139f30a1b..e4a0eba8e1 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 971d73ed6d..11d21f6fe0 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 @@ -189,9 +190,9 @@ datum/preferences if(path) dat += "Slot - " - dat += "Load slot - " - dat += "Save slot - " - dat += "Reload slot" + dat += "Load slot - " + dat += "Save slot - " + dat += "Reload slot" else dat += "Please create an account to save your preferences." @@ -215,26 +216,30 @@ datum/preferences else user << "The forum URL is not set in the server configuration." return + ShowChoices(usr) + return 1 + +/datum/preferences/Topic(href, list/href_list) + if(..()) + return 1 + + if(href_list["save"]) + save_preferences() + save_character() + else if(href_list["reload"]) + load_preferences() + load_character() + else if(href_list["load"]) + if(!IsGuestKey(usr.key)) + open_load_dialog(usr) + return 1 + else if(href_list["changeslot"]) + load_character(text2num(href_list["changeslot"])) + close_load_dialog(usr) else - switch(href_list["preference"]) - if("save") - save_preferences() - save_character() + return 0 - if("reload") - load_preferences() - load_character() - - if("open_load_dialog") - if(!IsGuestKey(user.key)) - open_load_dialog(user) - return 1 - - if("changeslot") - load_character(text2num(href_list["num"])) - close_load_dialog(user) - - ShowChoices(user) + ShowChoices(usr) return 1 /datum/preferences/proc/copy_to(mob/living/carbon/human/character, safety = 0) @@ -305,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) @@ -336,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) @@ -352,10 +361,9 @@ datum/preferences if(!name) name = "Character[i]" if(i==default_slot) name = "[name]" - dat += "[name]
" + dat += "[name]
" dat += "
" - dat += "Close
" dat += "" user << browse(dat, "window=saves;size=300x390") diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 70f94236a9..909d93985a 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -178,6 +178,14 @@ var/global/list/gear_datums = list() display_name = "hair flower pin, blue" path = /obj/item/clothing/head/hairflower/blue +/datum/gear/hairflower/violet + display_name = "hair flower pin, violet" + path = /obj/item/clothing/head/hairflower/violet + +/datum/gear/hairflower/orange + display_name = "hair flower pin, orange" + path = /obj/item/clothing/head/hairflower/orange + /datum/gear/hardhat display_name = "hardhat, yellow" path = /obj/item/clothing/head/hardhat @@ -234,13 +242,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 +353,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 @@ -391,6 +403,12 @@ var/global/list/gear_datums = list() slot = slot_w_uniform cost = 1 +/datum/gear/harness + display_name = "gear harness" + path = /obj/item/clothing/under/harness + slot = slot_w_uniform + cost = 1 + /datum/gear/cuttop/red display_name = "cut top, red" path = /obj/item/clothing/under/cuttop/red @@ -496,7 +514,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" @@ -1199,14 +1217,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 feb9ee8d01..d2f11e27a8 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/head/misc.dm b/code/modules/clothing/head/misc.dm index a044f0bd19..fa4446d97c 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -27,6 +27,12 @@ /obj/item/clothing/head/hairflower/yellow icon_state = "hairflower_yellow" +/obj/item/clothing/head/hairflower/violet + icon_state = "hairflower_violet" + +/obj/item/clothing/head/hairflower/orange + icon_state = "hairflower_orange" + /obj/item/clothing/head/powdered_wig name = "powdered wig" desc = "A powdered wig." diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index f966b37f29..38e86e5dc9 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -12,20 +12,18 @@ /obj/item/clothing/mask/breath/proc/adjust_mask(mob/user) if(user.canmove && !user.stat) - if(!src.hanging) - src.hanging = !src.hanging - gas_transfer_coefficient = 1 //gas is now escaping to the turf and vice versa - item_flags &= ~(AIRTIGHT) - body_parts_covered = ~(FACE) + src.hanging = !src.hanging + if (src.hanging) + gas_transfer_coefficient = 1 + body_parts_covered = body_parts_covered & ~FACE + item_flags = item_flags & ~AIRTIGHT icon_state = "breathdown" user << "Your mask is now hanging on your neck." - else - src.hanging = !src.hanging gas_transfer_coefficient = initial(gas_transfer_coefficient) - item_flags |= AIRTIGHT - body_parts_covered |= FACE - icon_state = "breath" + body_parts_covered = initial(body_parts_covered) + item_flags = initial(item_flags) + icon_state = initial(icon_state) user << "You pull the mask up to cover your face." update_clothing_icon() diff --git a/code/modules/clothing/masks/monitor.dm b/code/modules/clothing/masks/monitor.dm new file mode 100644 index 0000000000..b2bfc13876 --- /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 88112918a3..8b2e1fb477 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 a4877bb65d..2342010ce6 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 b870b49d59..4ad336aa26 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 bd06a63cc9..f925c32b79 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 3e8592e9d0..15931f44d3 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 b2e8c3ca0e..c998ad1bd0 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/language/language.dm b/code/modules/mob/language/language.dm index f496c82e67..c8474871a7 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -5,19 +5,19 @@ */ /datum/language - var/name = "an unknown language" // Fluff name of language if any. - var/desc = "A language." // Short description for 'Check Languages'. - var/speech_verb = "says" // 'says', 'hisses', 'farts'. - var/ask_verb = "asks" // Used when sentence ends in a ? - var/exclaim_verb = "exclaims" // Used when sentence ends in a ! - var/whisper_verb // Optional. When not specified speech_verb + quietly/softly is used instead. - var/signlang_verb = list() // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags - var/colour = "body" // CSS style to use for strings in this language. - var/key = "x" // Character used to speak in language eg. :o for Unathi. - var/flags = 0 // Various language flags. - var/native // If set, non-native speakers will have trouble speaking. - var/list/syllables // Used when scrambling text for a non-speaker. - var/list/space_chance = 55 // Likelihood of getting a space in the random scramble string + var/name = "an unknown language" // Fluff name of language if any. + var/desc = "A language." // Short description for 'Check Languages'. + var/speech_verb = "says" // 'says', 'hisses', 'farts'. + var/ask_verb = "asks" // Used when sentence ends in a ? + var/exclaim_verb = "exclaims" // Used when sentence ends in a ! + var/whisper_verb = "whispers" // Optional. When not specified speech_verb + quietly/softly is used instead. + var/signlang_verb = list("signs") // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags + var/colour = "body" // CSS style to use for strings in this language. + var/key = "x" // Character used to speak in language eg. :o for Unathi. + var/flags = 0 // Various language flags. + var/native // If set, non-native speakers will have trouble speaking. + var/list/syllables // Used when scrambling text for a non-speaker. + var/list/space_chance = 55 // Likelihood of getting a space in the random scramble string /datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4, syllable_divisor=2) if(!syllables || !syllables.len) diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index eeb4fb5e0d..5d3f7e487c 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 498f78c94e..8a487d57b3 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 45d1f6fe46..b9338f361f 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 a45f378ab4..50e0418766 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 4495ed4175..f77be45d56 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 1c3f070b96..53d62dbea0 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -5,19 +5,16 @@ 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 - if(O.status & ORGAN_ROBOT) - continue //robot limbs don't count towards shock and crit + if((O.status & ORGAN_ROBOT) && !O.vital) + continue // Non-vital robot limbs don't count towards shock and crit 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 78dbee0552..22acad9445 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 45a0a50364..b3c8660a27 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 971e8c4a6f..085e070f0a 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 e19795b641..a7af36340c 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 8b33f7a586..8bd8822132 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 b6cf19b849..ba0953a525 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/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 64d5c12048..18cdeded52 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -149,6 +149,7 @@ var/list/ai_verbs_default = list( add_language("Skrellian", 0) add_language("Tradeband", 1) add_language("Gutter", 0) + add_language("Encoded Audio Language", 1) if(!safety)//Only used by AIize() to successfully spawn an AI. if (!B)//If there is no player/brain inside. diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 7c588d0f78..d049e12d75 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -86,6 +86,7 @@ add_language("Sol Common", 1) add_language("Tradeband", 1) add_language("Gutter", 1) + add_language("Encoded Audio Language", 1) verbs += /mob/living/silicon/pai/proc/choose_chassis verbs += /mob/living/silicon/pai/proc/choose_verbs @@ -126,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 @@ -395,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 14434bfe6e..5356ca9b21 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 e5aa936a08..2f688a9008 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 2008edec86..f28c464cea 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.dm b/code/modules/mob/living/silicon/robot/robot.dm index 293a55b222..4260f1d365 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -98,6 +98,7 @@ spark_system.attach(src) add_language("Robot Talk", 1) + add_language("Encoded Audio Language", 1) wires = new(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 302b8eb101..a23d328bd3 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 7c25296a5e..c4a238f870 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 0ea2a05dd4..2b776671fe 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 e6a0b277f6..7a66deb3c4 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 9503800189..dfbde26b65 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 e946a9df41..477bb62e9a 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 ec6a38de92..d8b9fbd7cf 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 6621e0f102..575ded6138 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/organ_icon.dm b/code/modules/organs/organ_icon.dm index 3b55dc1dda..ffcb3f32e1 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -89,15 +89,20 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/proc/get_icon(var/skeletal) - var/gender + var/gender = "f" + if(owner && owner.gender == MALE) + gender = "m" + if(force_icon) - mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_f" : ""]") + mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]") else if(!dna) - mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_f" : ""]") + mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]") else - if(gendered_icon) + if(!gendered_icon) + gender = null + else if(dna.GetUIState(DNA_UI_GENDER)) gender = "f" else diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 3c717847cc..ad68815f37 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 12c48a7826..0272bc1fdf 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 @@ -515,29 +498,24 @@ obj/structure/cable/proc/cableColor(var/colorC) //you can use wires to heal robotics /obj/item/stack/cable_coil/attack(var/atom/A, var/mob/living/user, var/def_zone) if(ishuman(A) && user.a_intent == I_HELP) - return - return ..() - -/obj/item/stack/cable_coil/afterattack(var/mob/M, var/mob/user) - - if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/carbon/human/H = A var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting] - if(!S || !(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP) + if(!S || !(S.status & ORGAN_ROBOT)) return ..() if(S.burn_dam) if(S.burn_dam < ROBOLIMB_SELF_REPAIR_CAP) S.heal_damage(0,15,0,1) - user.visible_message("\The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].") - else if(S.open != 2) + user.visible_message("\The [user] repairs some burn damage on \the [H]'s [S.name] with \the [src].") + else if(S.open < 3) user << "The damage is far too severe to patch over externally." - else if(S.open != 2) + else + return ..() + else user << "Nothing to fix!" return - else - return ..() + return ..() /obj/item/stack/cable_coil/update_icon() diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 140c296ae0..3636c3acfa 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -30,7 +30,7 @@ invisibility = i ? 101 : 0 icon_state = i ? "term-f" : "term" -/obj/structure/power/terminal/hides_under_flooring() +/obj/machinery/power/terminal/hides_under_flooring() return 1 // Needed so terminals are not removed from machines list. diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 7ed01b02fe..168698385b 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -187,8 +187,7 @@ target = targloc pointblank = 0 -// admin_attack_log(usr, attacker_message="Fired [src]", admin_message="fired a gun ([src]) (MODE: [src.mode_name]) [reflex ? "by reflex" : "manually"].") - //Commented out due to potential lag issues, possibly with excess I/O + admin_attack_log(usr, attacker_message="Fired [src]", admin_message="fired a gun ([src]) (MODE: [src.mode_name]) [reflex ? "by reflex" : "manually"].") update_held_icon() diff --git a/code/modules/projectiles/targeting/targeting_mob.dm b/code/modules/projectiles/targeting/targeting_mob.dm index a89bbc2c9a..765b59b478 100644 --- a/code/modules/projectiles/targeting/targeting_mob.dm +++ b/code/modules/projectiles/targeting/targeting_mob.dm @@ -1,6 +1,20 @@ /mob/living/var/obj/aiming_overlay/aiming /mob/living/var/list/aimed = list() +/mob/verb/toggle_gun_mode() + set name = "Toggle Gun Mode" + set desc = "Begin or stop aiming." + set category = "IC" + + if(isliving(src)) + var/mob/living/M = src + if(!M.aiming) + M.aiming = new(src) + M.aiming.toggle_active() + else + src << "This verb may only be used by living mobs, sorry." + return + /mob/living/proc/stop_aiming(var/obj/item/thing, var/no_message = 0) if(!aiming) aiming = new(src) diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm index 8029b1c459..48eebf083a 100644 --- a/code/modules/projectiles/targeting/targeting_overlay.dm +++ b/code/modules/projectiles/targeting/targeting_overlay.dm @@ -112,7 +112,8 @@ obj/aiming_overlay/proc/update_aiming_deferred() update_icon() var/cancel_aim = 1 - if(!(aiming_with in owner) || (owner.l_hand != aiming_with && owner.r_hand != aiming_with)) + + if(!(aiming_with in owner) || (istype(owner, /mob/living/carbon/human) && (owner.l_hand != aiming_with && owner.r_hand != aiming_with))) owner << "You must keep hold of your weapon!" else if(!aiming_at || !istype(aiming_at.loc, /turf)) owner << "You have lost sight of your target!" diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 9330c8cdf5..574e1131aa 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -30,6 +30,10 @@ var/glass_name = null var/glass_desc = null var/glass_center_of_mass = null + var/cup_icon_state = null + var/cup_name = null + var/cup_desc = null + var/cup_center_of_mass = null var/color = "#000000" var/color_weight = 1 diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm index 3209560007..05c5da1e94 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 6c899d831a..4b5580fed5 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" @@ -503,6 +486,10 @@ glass_name = "glass of milk" glass_desc = "White and nutritious goodness!" + cup_icon_state = "cup_cream" + cup_name = "cup of milk" + cup_desc = "White and nutritious goodness!" + /datum/reagent/drink/milk/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() if(alien == IS_DIONA) @@ -520,6 +507,10 @@ glass_name = "glass of cream" glass_desc = "Ewwww..." + cup_icon_state = "cup_cream" + cup_name = "cup of cream" + cup_desc = "Ewwww..." + /datum/reagent/drink/milk/soymilk name = "Soy Milk" id = "soymilk" @@ -530,6 +521,10 @@ glass_name = "glass of soy milk" glass_desc = "White and nutritious soy goodness!" + cup_icon_state = "cup_cream" + cup_name = "cup of milk" + cup_desc = "White and nutritious goodness!" + /datum/reagent/drink/tea name = "Tea" id = "tea" @@ -574,8 +569,12 @@ overdose = 45 glass_icon_state = "hot_coffee" - glass_name = "cup of coffee" - glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." + glass_name = "mug of coffee" + glass_desc = "Don't drop it, or you'll send scalding liquid and porcelain shards everywhere." + + cup_icon_state = "cup_coffee" + cup_name = "cup of coffee" + cup_desc = "Don't drop it, or you'll send scalding liquid and porcelain shards everywhere." /datum/reagent/drink/coffee/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -622,9 +621,13 @@ glass_icon_state = "soy_latte" glass_name = "glass of soy latte" - glass_desc = "A nice and refrshing beverage while you are reading." + glass_desc = "A nice and refreshing beverage while you are reading." glass_center_of_mass = list("x"=15, "y"=9) + cup_icon_state = "cup_latte" + cup_name = "cup of soy latte" + cup_desc = "A nice and refreshing beverage while you are reading." + /datum/reagent/drink/coffee/soy_latte/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() M.heal_organ_damage(0.5 * removed, 0) @@ -641,6 +644,10 @@ glass_desc = "A nice, strong and refreshing beverage while you are reading." glass_center_of_mass = list("x"=15, "y"=9) + cup_icon_state = "cup_latte" + cup_name = "cup of cafe latte" + cup_desc = "A nice and refreshing beverage while you are reading." + /datum/reagent/drink/coffee/cafe_latte/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() M.heal_organ_damage(0.5 * removed, 0) @@ -658,6 +665,10 @@ glass_name = "glass of hot chocolate" glass_desc = "Made with love! And cocoa beans." + cup_icon_state = "cup_coco" + cup_name = "cup of hot chocolate" + cup_desc = "Made with love! And cocoa beans." + /datum/reagent/drink/sodawater name = "Soda Water" id = "sodawater" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index e947e9ea15..08ec5df6c5 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 aecbf766b9..af30173680 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/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index 007660c1e9..0aecdc7600 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -47,8 +47,6 @@ // Bar, soft ice spawn_reagent = "ice" - coffee spawn_reagent = "coffee" - cream spawn_reagent = "cream" tea spawn_reagent = "tea" icetea spawn_reagent = "icetea" cola spawn_reagent = "cola" @@ -62,6 +60,14 @@ lime spawn_reagent = "limejuice" watermelon spawn_reagent = "watermelonjuice" + // Bar, coffee + coffee spawn_reagent = "coffee" + cafe_latte spawn_reagent = "cafe_latte" + soy_latte spawn_reagent = "soy_latte" + hot_coco spawn_reagent = "hot_coco" + milk spawn_reagent = "milk" + cream spawn_reagent = "cream" + // ERT inaprov spawn_reagent = "inaprovaline" ryetalyn spawn_reagent = "ryetalyn" diff --git a/code/modules/reagents/dispenser/dispenser2.dm b/code/modules/reagents/dispenser/dispenser2.dm index 4677214ac8..06c6bbb8eb 100644 --- a/code/modules/reagents/dispenser/dispenser2.dm +++ b/code/modules/reagents/dispenser/dispenser2.dm @@ -1,4 +1,4 @@ -/obj/machinery/chemical_dispenser/cartridge +/obj/machinery/chemical_dispenser name = "chemical dispenser" icon = 'icons/obj/chemical.dmi' icon_state = "dispenser" @@ -15,21 +15,20 @@ use_power = 1 idle_power_usage = 100 - density = 1 anchored = 1 -/obj/machinery/chemical_dispenser/cartridge/New() +/obj/machinery/chemical_dispenser/New() ..() if(spawn_cartridges) for(var/type in spawn_cartridges) add_cartridge(new type(src)) -/obj/machinery/chemical_dispenser/cartridge/examine(mob/user) +/obj/machinery/chemical_dispenser/examine(mob/user) ..() user << "It has [cartridges.len] cartridges installed, and has space for [DISPENSER_MAX_CARTRIDGES - cartridges.len] more." -/obj/machinery/chemical_dispenser/cartridge/proc/add_cartridge(obj/item/weapon/reagent_containers/chem_disp_cartridge/C, mob/user) +/obj/machinery/chemical_dispenser/proc/add_cartridge(obj/item/weapon/reagent_containers/chem_disp_cartridge/C, mob/user) if(!istype(C)) if(user) user << "\The [C] will not fit in \the [src]!" @@ -59,12 +58,12 @@ cartridges = sortAssoc(cartridges) nanomanager.update_uis(src) -/obj/machinery/chemical_dispenser/cartridge/proc/remove_cartridge(label) +/obj/machinery/chemical_dispenser/proc/remove_cartridge(label) . = cartridges[label] cartridges -= label nanomanager.update_uis(src) -/obj/machinery/chemical_dispenser/cartridge/attackby(obj/item/weapon/W, mob/user) +/obj/machinery/chemical_dispenser/attackby(obj/item/weapon/W, mob/user) if(istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to [anchored ? "un" : ""]fasten \the [src]." @@ -112,7 +111,7 @@ else return ..() -/obj/machinery/chemical_dispenser/cartridge/ui_interact(mob/user, ui_key = "main",var/datum/nanoui/ui = null, var/force_open = 1) +/obj/machinery/chemical_dispenser/ui_interact(mob/user, ui_key = "main",var/datum/nanoui/ui = null, var/force_open = 1) if(stat & (BROKEN|NOPOWER)) return if(user.stat || user.restrained()) return @@ -147,7 +146,7 @@ ui.set_initial_data(data) ui.open() -/obj/machinery/chemical_dispenser/cartridge/Topic(href, href_list) +/obj/machinery/chemical_dispenser/Topic(href, href_list) if(stat & (NOPOWER|BROKEN)) return 0 // don't update UIs attached to this object @@ -170,10 +169,10 @@ add_fingerprint(usr) return 1 // update UIs attached to this object -/obj/machinery/chemical_dispenser/cartridge/attack_ai(mob/user as mob) +/obj/machinery/chemical_dispenser/attack_ai(mob/user as mob) src.attack_hand(user) -/obj/machinery/chemical_dispenser/cartridge/attack_hand(mob/user as mob) +/obj/machinery/chemical_dispenser/attack_hand(mob/user as mob) if(stat & BROKEN) return ui_interact(user) diff --git a/code/modules/reagents/dispenser/dispenser2_energy.dm b/code/modules/reagents/dispenser/dispenser2_energy.dm new file mode 100644 index 0000000000..2ab4c5641d --- /dev/null +++ b/code/modules/reagents/dispenser/dispenser2_energy.dm @@ -0,0 +1,61 @@ + +/obj/machinery/chemical_dispenser + var/_recharge_reagents = 1 + var/list/dispense_reagents = list() + var/process_tick = 0 + +/obj/machinery/chemical_dispenser/process() + if(!_recharge_reagents) + return + if(stat & (BROKEN|NOPOWER)) + return + if(--process_tick <= 0) + process_tick = 15 + . = 0 + for(var/id in dispense_reagents) + var/datum/reagent/R = chemical_reagents_list[id] + if(!R) + crash_with("[src] at [x],[y],[z] failed to find reagent '[id]'!") + dispense_reagents -= id + continue + var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = cartridges[R.name] + if(C && C.reagents.total_volume < C.reagents.maximum_volume) + var/to_restore = min(C.reagents.maximum_volume - C.reagents.total_volume, 5) + use_power(to_restore * 500) + C.reagents.add_reagent(id, to_restore) + . = 1 + if(.) + nanomanager.update_uis(src) + +/obj/machinery/chemical_dispenser + dispense_reagents = list( + "hydrogen", "lithium", "carbon", "nitrogen", "oxygen", "fluorine", "sodium", + "aluminum", "silicon", "phosphorus", "sulfur", "chlorine", "potassium", "iron", + "copper", "mercury", "radium", "water", "ethanol", "sugar", "sacid", "tungsten" + ) + +/obj/machinery/chemical_dispenser/ert + dispense_reagents = list( + "inaprovaline", "ryetalyn", "paracetamol", "tramadol", "oxycodone", "sterilizine", "leporazine", + "kelotane", "dermaline", "dexalin", "dexalinp", "tricordrazine", "anti_toxin", "synaptizine", + "hyronalin", "arithrazine", "alkysine", "imidazoline", "peridaxon", "bicaridine", "hyperzine", + "rezadone", "spaceacillin", "ethylredoxrazine", "stoxin", "chloralhydrate", "cryoxadone", + "clonexadone" + ) + +/obj/machinery/chemical_dispenser/bar_soft + dispense_reagents = list( + "water", "ice", "coffee", "cream", "tea", "icetea", "cola", "spacemountainwind", "dr_gibb", "space_up", "tonic", + "sodawater", "lemon_lime", "sugar", "orangejuice", "limejuice", "watermelonjuice", "thirteenloko", "grapesoda" + ) + +/obj/machinery/chemical_dispenser/bar_alc + dispense_reagents = list( + "lemon_lime", "sugar", "orangejuice", "limejuice", "sodawater", "tonic", "beer", "kahlua", + "whiskey", "wine", "vodka", "gin", "rum", "tequilla", "vermouth", "cognac", "ale", "mead" + ) + +/obj/machinery/chemical_dispenser/bar_coffee + dispense_reagents = list( + "coffee", "cafe_latte", "soy_latte", "hot_coco", "milk", "cream", "tea", "ice" + ) \ No newline at end of file diff --git a/code/modules/reagents/dispenser/dispenser_old.dm b/code/modules/reagents/dispenser/dispenser_old.dm deleted file mode 100644 index e23350b77e..0000000000 --- a/code/modules/reagents/dispenser/dispenser_old.dm +++ /dev/null @@ -1,241 +0,0 @@ -//This has the 'old' chem dispenser. The new one is in dispenser2.dm - -#define CHEM_DISPENSER_ENERGY_COST 0.1 //How many energy points do we use per unit of chemical? -#define BOTTLE_SPRITES list("bottle-1", "bottle-2", "bottle-3", "bottle-4") //list of available bottle sprites - -/obj/machinery/chemical_dispenser/energy - name = "chemical dispenser" - density = 1 - anchored = 1 - icon = 'icons/obj/chemical.dmi' - icon_state = "dispenser" - use_power = 0 - idle_power_usage = 40 - var/ui_title = "Chem Dispenser 5000" - var/energy = 100 - var/max_energy = 100 - var/amount = 30 - var/accept_glass = 0 //At 0 ONLY accepts glass containers. Kinda misleading varname. - var/atom/beaker = null - var/recharged = 0 - var/hackedcheck = 0 - var/list/dispensable_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine","sodium","aluminum","silicon","phosphorus","sulfur","chlorine","potassium","iron","copper","mercury","radium","water","ethanol","sugar","sacid","tungsten") - -/obj/machinery/chemical_dispenser/energy/proc/recharge() - if(stat & (BROKEN|NOPOWER)) - return - var/addenergy = 1 - var/oldenergy = energy - energy = min(energy + addenergy, max_energy) - if(energy != oldenergy) - use_power(CHEM_SYNTH_ENERGY / CHEM_DISPENSER_ENERGY_COST) // This thing uses up "alot" of power (this is still low as shit for creating reagents from thin air) - nanomanager.update_uis(src) // update all UIs attached to src - -/obj/machinery/chemical_dispenser/energy/power_change() - ..() - nanomanager.update_uis(src) // update all UIs attached to src - -/obj/machinery/chemical_dispenser/energy/process() - if(recharged <= 0) - recharge() - recharged = 15 - else - recharged -= 1 - -/obj/machinery/chemical_dispenser/energy/New() - ..() - recharge() - dispensable_reagents = sortList(dispensable_reagents) - - -/obj/machinery/chemical_dispenser/energy/ex_act(severity) - switch(severity) - if(1.0) - qdel(src) - return - if(2.0) - if (prob(50)) - qdel(src) - return - - /** - * The ui_interact proc is used to open and update Nano UIs - * If ui_interact is not used then the UI will not update correctly - * ui_interact is currently defined for /atom/movable - * - * @param user /mob The mob who is interacting with this ui - * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main") - * - * @return nothing - */ -/obj/machinery/chemical_dispenser/energy/ui_interact(mob/user, ui_key = "main",var/datum/nanoui/ui = null, var/force_open = 1) - if(stat & (BROKEN|NOPOWER)) return - if(user.stat || user.restrained()) return - - // this is the data which will be sent to the ui - var/data[0] - data["amount"] = amount - data["energy"] = round(energy) - data["maxEnergy"] = round(max_energy) - data["isBeakerLoaded"] = beaker ? 1 : 0 - data["glass"] = accept_glass - var beakerContents[0] - var beakerCurrentVolume = 0 - if(beaker && beaker:reagents && beaker:reagents.reagent_list.len) - for(var/datum/reagent/R in beaker:reagents.reagent_list) - beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list... - beakerCurrentVolume += R.volume - data["beakerContents"] = beakerContents - - if (beaker) - data["beakerCurrentVolume"] = beakerCurrentVolume - data["beakerMaxVolume"] = beaker:volume - else - data["beakerCurrentVolume"] = null - data["beakerMaxVolume"] = null - - var chemicals[0] - for (var/re in dispensable_reagents) - var/datum/reagent/temp = chemical_reagents_list[re] - if(temp) - chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("dispense" = temp.id)))) // list in a list because Byond merges the first list... - data["chemicals"] = chemicals - - // update the ui if it exists, returns null if no ui is passed/found - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - // the ui does not exist, so we'll create a new() one - // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm - ui = new(user, src, ui_key, "chem_dispenser_energy.tmpl", ui_title, 390, 655) - // when the ui is first opened this is the data it will use - ui.set_initial_data(data) - // open the new ui window - ui.open() - -/obj/machinery/chemical_dispenser/energy/Topic(href, href_list) - if(stat & (NOPOWER|BROKEN)) - return 0 // don't update UIs attached to this object - - if(href_list["amount"]) - amount = round(text2num(href_list["amount"]), 5) // round to nearest 5 - if (amount < 0) // Since the user can actually type the commands himself, some sanity checking - amount = 0 - if (amount > 120) - amount = 120 - - if(href_list["dispense"]) - if (dispensable_reagents.Find(href_list["dispense"]) && beaker != null && beaker.is_open_container()) - var/obj/item/weapon/reagent_containers/B = src.beaker - var/datum/reagents/R = B.reagents - var/space = R.maximum_volume - R.total_volume - - //uses 1 energy per 10 units. - var/added_amount = min(amount, energy / CHEM_DISPENSER_ENERGY_COST, space) - R.add_reagent(href_list["dispense"], added_amount) - energy = max(energy - added_amount * CHEM_DISPENSER_ENERGY_COST, 0) - - if(href_list["ejectBeaker"]) - if(beaker) - var/obj/item/weapon/reagent_containers/B = beaker - B.loc = loc - beaker = null - - add_fingerprint(usr) - return 1 // update UIs attached to this object - -/obj/machinery/chemical_dispenser/energy/attackby(var/obj/item/weapon/reagent_containers/B as obj, var/mob/user as mob) - if(isrobot(user)) - return - if(src.beaker) - user << "Something is already loaded into the machine." - return - if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food)) - if(!accept_glass && istype(B,/obj/item/weapon/reagent_containers/food)) - user << "This machine only accepts beakers" - src.beaker = B - user.drop_item() - B.loc = src - user << "You set [B] on the machine." - nanomanager.update_uis(src) // update all UIs attached to src - return - -/obj/machinery/chemical_dispenser/energy/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/chemical_dispenser/energy/attack_hand(mob/user as mob) - if(stat & BROKEN) - return - ui_interact(user) - -/obj/machinery/chemical_dispenser/energy/soda - icon_state = "soda_dispenser" - name = "soda fountain" - desc = "A drink fabricating machine, capable of producing many sugary drinks with just one touch." - ui_title = "Soda Dispens-o-matic" - energy = 100 - accept_glass = 1 - max_energy = 100 - dispensable_reagents = list("water","ice","coffee","cream","tea","icetea","cola","spacemountainwind","dr_gibb","space_up","tonic","sodawater","lemon_lime","sugar","orangejuice","limejuice","watermelonjuice") - -/obj/machinery/chemical_dispenser/energy/soda/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob) - ..() - if(istype(B, /obj/item/device/multitool)) - if(hackedcheck == 0) - user << "You change the mode from 'McNano' to 'Pizza King'." - dispensable_reagents += list("thirteenloko","grapesoda") - hackedcheck = 1 - return - - else - user << "You change the mode from 'Pizza King' to 'McNano'." - dispensable_reagents -= list("thirteenloko","grapesoda") - hackedcheck = 0 - return - -/obj/machinery/chemical_dispenser/energy/beer - icon_state = "booze_dispenser" - name = "booze dispenser" - ui_title = "Booze Portal 9001" - energy = 100 - accept_glass = 1 - max_energy = 100 - desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one." - dispensable_reagents = list("lemon_lime","sugar","orangejuice","limejuice","sodawater","tonic","beer","kahlua", - "whiskey","wine","vodka","gin","rum","tequilla","vermouth","cognac","ale","mead") - -/obj/machinery/chemical_dispenser/energy/beer/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob) - ..() - - if(istype(B, /obj/item/device/multitool)) - if(hackedcheck == 0) - user << "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes." - dispensable_reagents += list("goldschlager","patron","watermelonjuice","berryjuice") - hackedcheck = 1 - return - - else - user << "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes." - dispensable_reagents -= list("goldschlager","patron","watermelonjuice","berryjuice") - hackedcheck = 0 - return - -/obj/machinery/chemical_dispenser/energy/meds - name = "ultra chem dispenser" - density = 1 - anchored = 1 - icon = 'icons/obj/chemical.dmi' - icon_state = "dispenser" - use_power = 0 - idle_power_usage = 40 - ui_title = "Chem Dispenser 9000" - energy = 100 - max_energy = 100 - amount = 30 - accept_glass = 0 //At 0 ONLY accepts glass containers. Kinda misleading varname. - beaker = null - recharged = 0 - hackedcheck = 0 - dispensable_reagents = list("inaprovaline","ryetalyn","paracetamol","tramadol","oxycodone","sterilizine","leporazine","kelotane", - "dermaline","dexalin","dexalinp","tricordrazine","anti_toxin","synaptizine","hyronalin","arithrazine", - "alkysine","imidazoline","peridaxon","bicaridine","hyperzine","rezadone","spaceacillin","ethylredoxrazine", - "stoxin","chloralhydrate","cryoxadone","clonexadone") \ No newline at end of file diff --git a/code/modules/reagents/dispenser/dispenser_presets.dm b/code/modules/reagents/dispenser/dispenser_presets.dm index 3604354f75..f23885795c 100644 --- a/code/modules/reagents/dispenser/dispenser_presets.dm +++ b/code/modules/reagents/dispenser/dispenser_presets.dm @@ -1,4 +1,4 @@ -/obj/machinery/chemical_dispenser/cartridge/full +/obj/machinery/chemical_dispenser/full spawn_cartridges = list( /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrogen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/lithium, @@ -24,7 +24,7 @@ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tungsten ) -/obj/machinery/chemical_dispenser/cartridge/ert +/obj/machinery/chemical_dispenser/ert name = "medicine dispenser" spawn_cartridges = list( /obj/item/weapon/reagent_containers/chem_disp_cartridge/inaprov, @@ -57,14 +57,14 @@ /obj/item/weapon/reagent_containers/chem_disp_cartridge/clonexadone ) -/obj/machinery/chemical_dispenser/cartridge/bar_soft +/obj/machinery/chemical_dispenser/bar_soft name = "soft drink dispenser" desc = "A soda machine." icon_state = "soda_dispenser" ui_title = "Soda Dispenser" accept_drinking = 1 -/obj/machinery/chemical_dispenser/cartridge/bar_soft/full +/obj/machinery/chemical_dispenser/bar_soft/full spawn_cartridges = list( /obj/item/weapon/reagent_containers/chem_disp_cartridge/water, /obj/item/weapon/reagent_containers/chem_disp_cartridge/ice, @@ -85,14 +85,14 @@ /obj/item/weapon/reagent_containers/chem_disp_cartridge/watermelon ) -/obj/machinery/chemical_dispenser/cartridge/bar_alc +/obj/machinery/chemical_dispenser/bar_alc name = "booze dispenser" desc = "A beer machine. Like a soda machine, but more fun!" icon_state = "booze_dispenser" ui_title = "Booze Dispenser" accept_drinking = 1 -/obj/machinery/chemical_dispenser/cartridge/bar_alc/full +/obj/machinery/chemical_dispenser/bar_alc/full spawn_cartridges = list( /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon_lime, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar, @@ -113,3 +113,22 @@ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ale, /obj/item/weapon/reagent_containers/chem_disp_cartridge/mead ) + +/obj/machinery/chemical_dispenser/bar_coffee + name = "coffee dispenser" + desc = "Driving crack dealers out of employment since 2280." + icon_state = "coffee_dispenser" + ui_title = "Coffee Dispenser" + accept_drinking = 1 + +/obj/machinery/chemical_dispenser/bar_coffee/full + spawn_cartridges = list( + /obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/cafe_latte, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/soy_latte, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/hot_coco, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/milk, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/cream, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/tea, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/ice + ) \ No newline at end of file diff --git a/code/modules/reagents/dispenser/supply.dm b/code/modules/reagents/dispenser/supply.dm index bbb4c5683d..f4a12d45d3 100644 --- a/code/modules/reagents/dispenser/supply.dm +++ b/code/modules/reagents/dispenser/supply.dm @@ -11,7 +11,7 @@ /datum/supply_packs/beer_dispenser name = "Booze dispenser" contains = list( - /obj/machinery/chemical_dispenser/cartridge/bar_alc{anchored = 0} + /obj/machinery/chemical_dispenser/bar_alc{anchored = 0} ) cost = 25 containertype = /obj/structure/largecrate @@ -21,7 +21,7 @@ /datum/supply_packs/soda_dispenser name = "Soda dispenser" contains = list( - /obj/machinery/chemical_dispenser/cartridge/bar_soft{anchored = 0} + /obj/machinery/chemical_dispenser/bar_soft{anchored = 0} ) cost = 25 containertype = /obj/structure/largecrate @@ -108,6 +108,23 @@ containername = "soft drinks crate" group = "Reagents" +/datum/supply_packs/coffee_reagents + name = "Coffee machine dispenser refill" + contains = list( + /obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/cafe_latte, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/soy_latte, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/hot_coco, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/milk, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/cream, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/tea, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/ice + ) + cost = 50 + containertype = /obj/structure/closet/crate + containername = "coffee drinks crate" + group = "Reagents" + /datum/supply_packs/dispenser_cartridges name = "Empty dispenser cartridges" contains = list( @@ -206,6 +223,12 @@ PACK(lemon_lime, /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon_l PACK(orange, /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange, "Reagent refill - Orange Juice", "orange juice reagent cartridge crate", 15) PACK(lime, /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime, "Reagent refill - Lime Juice", "lime juice reagent cartridge crate", 15) PACK(watermelon, /obj/item/weapon/reagent_containers/chem_disp_cartridge/watermelon, "Reagent refill - Watermelon Juice", "watermelon juice reagent cartridge crate", 15) +PACK(coffee, /obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee, "Reagent refill - Coffee", "coffee reagent cartridge crate", 15) +PACK(cafe_latte, /obj/item/weapon/reagent_containers/chem_disp_cartridge/cafe_latte, "Reagent refill - Cafe Latte", "cafe latte reagent cartridge crate", 15) +PACK(soy_latte, /obj/item/weapon/reagent_containers/chem_disp_cartridge/soy_latte, "Reagent refill - Soy Latte", "soy latte reagent cartridge crate", 15) +PACK(hot_coco, /obj/item/weapon/reagent_containers/chem_disp_cartridge/hot_coco, "Reagent refill - Hot Coco", "hot coco reagent cartridge crate", 15) +PACK(milk, /obj/item/weapon/reagent_containers/chem_disp_cartridge/milk, "Reagent refill - Milk", "milk reagent cartridge crate", 15) +PACK(cream, /obj/item/weapon/reagent_containers/chem_disp_cartridge/cream, "Reagent refill - Cream", "cream reagent cartridge crate", 15) #undef SEC_PACK #undef PACK diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index a8184ac815..ca9d7ca95d 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -50,8 +50,6 @@ user << "You swallow some of contents of \the [src]." on_reagent_change() - if(icon_state == "saltshakersmall" || icon_state == "peppermillsmall" || icon_state == "flour") - return if(reagents.reagent_list.len > 0) switch(reagents.get_master_reagent_id()) if("ketchup") @@ -126,36 +124,46 @@ ..() reagents.add_reagent("sugar", 50) -/obj/item/weapon/reagent_containers/food/condiment/saltshaker //Seperate from above since it's a small shaker rather then - name = "Salt Shaker" // a large one. - desc = "Salt. From space oceans, presumably." - icon_state = "saltshakersmall" - possible_transfer_amounts = list(1,20) //for clown turning the lid off +/obj/item/weapon/reagent_containers/food/condiment/small + possible_transfer_amounts = list(1,20) amount_per_transfer_from_this = 1 volume = 20 + center_of_mass = null + on_reagent_change() return + +/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker //Seperate from above since it's a small shaker rather then + name = "salt shaker" // a large one. + desc = "Salt. From space oceans, presumably." + icon_state = "saltshakersmall" New() ..() reagents.add_reagent("sodiumchloride", 20) -/obj/item/weapon/reagent_containers/food/condiment/peppermill - name = "Pepper Mill" +/obj/item/weapon/reagent_containers/food/condiment/small/peppermill + name = "pepper mill" desc = "Often used to flavor food or make people sneeze." icon_state = "peppermillsmall" - possible_transfer_amounts = list(1,20) //for clown turning the lid off - amount_per_transfer_from_this = 1 - volume = 20 New() ..() reagents.add_reagent("blackpepper", 20) +/obj/item/weapon/reagent_containers/food/condiment/small/sugar + name = "sugar" + desc = "Sweetness in a bottle" + icon_state = "sugarsmall" + New() + ..() + reagents.add_reagent("sugar", 20) + /obj/item/weapon/reagent_containers/food/condiment/flour name = "flour sack" desc = "A big bag of flour. Good for baking!" icon = 'icons/obj/food.dmi' icon_state = "flour" item_state = "flour" + on_reagent_change() return New() ..() reagents.add_reagent("flour", 30) src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) + src.pixel_y = rand(-10.0, 10) diff --git a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm index c7f0f0a9fe..072a21f777 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm @@ -46,6 +46,45 @@ center_of_mass = list("x"=16, "y"=10) return +/obj/item/weapon/reagent_containers/food/drinks/cup + name = "coffee cup" + desc = "The container of oriental luxuries." + icon_state = "cup_empty" + amount_per_transfer_from_this = 5 + volume = 30 + center_of_mass = list("x"=16, "y"=16) + + on_reagent_change() + if (reagents.reagent_list.len > 0) + var/datum/reagent/R = reagents.get_master_reagent() + + if(R.cup_icon_state) + icon_state = R.cup_icon_state + else + icon_state = "cup_brown" + + if(R.cup_name) + name = R.cup_name + else + name = "Cup of.. what?" + + if(R.cup_desc) + desc = R.cup_desc + else + desc = "You can't really tell what this is." + + if(R.cup_center_of_mass) + center_of_mass = R.cup_center_of_mass + else + center_of_mass = list("x"=16, "y"=16) + + else + icon_state = "cup_empty" + name = "coffee cup" + desc = "The container of oriental luxuries." + center_of_mass = list("x"=16, "y"=16) + return + // for /obj/machinery/vending/sovietsoda /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda New() diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 48a0b9eb7c..a5c820d96b 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -128,32 +128,32 @@ // Eating with forks if(istype(W,/obj/item/weapon/material/kitchen/utensil)) var/obj/item/weapon/material/kitchen/utensil/U = W + if(U.scoop_food) + if(!U.reagents) + U.create_reagents(5) - if(!U.reagents) - U.create_reagents(5) + if (U.reagents.total_volume > 0) + user << "\red You already have something on your [U]." + return - if (U.reagents.total_volume > 0) - user << "\red You already have something on your [U]." + user.visible_message( \ + "[user] scoops up some [src] with \the [U]!", \ + "\blue You scoop up some [src] with \the [U]!" \ + ) + + src.bitecount++ + U.overlays.Cut() + U.loaded = "[src]" + var/image/I = new(U.icon, "loadedfood") + I.color = src.filling_color + U.overlays += I + + reagents.trans_to_obj(U, min(reagents.total_volume,5)) + + if (reagents.total_volume <= 0) + qdel(src) return - user.visible_message( \ - "[user] scoops up some [src] with \the [U]!", \ - "\blue You scoop up some [src] with \the [U]!" \ - ) - - src.bitecount++ - U.overlays.Cut() - U.loaded = "[src]" - var/image/I = new(U.icon, "loadedfood") - I.color = src.filling_color - U.overlays += I - - reagents.trans_to_obj(U, min(reagents.total_volume,5)) - - if (reagents.total_volume <= 0) - qdel(src) - return - if (is_sliceable()) //these are used to allow hiding edge items in food that is not on a table/tray var/can_slice_here = isturf(src.loc) && ((locate(/obj/structure/table) in src.loc) || (locate(/obj/machinery/optable) in src.loc) || (locate(/obj/item/weapon/tray) in src.loc)) diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index c6d7996fc9..c468bbb017 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -28,9 +28,9 @@ emergency_shuttle.departed = 1 if (emergency_shuttle.evac) - priority_announcement.Announce("The Emergency Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at [boss_name].") + priority_announcement.Announce("The Emergency Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at [dock_name].") else - priority_announcement.Announce("The Scheduled Transfer Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at [boss_name].") + priority_announcement.Announce("The Scheduled Transfer Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at [dock_name].") /datum/shuttle/ferry/emergency/can_launch(var/user) if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) @@ -185,7 +185,7 @@ else if (!shuttle.location) shuttle_status = "Standing-by at [station_name]." else - shuttle_status = "Standing-by at [boss_name]." + shuttle_status = "Standing-by at [dock_name]." if(WAIT_LAUNCH, FORCE_LAUNCH) shuttle_status = "Shuttle has recieved command and will depart shortly." if(WAIT_ARRIVE) diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index 6f619e1cce..16cc137654 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -64,9 +64,6 @@ Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of spells.
It is recommended that only experienced wizards attempt to wield such artefacts.

- Staff of Change
- An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself.
-
Mental Focus
An artefact that channels the will of the user into destructive bolts of force.

@@ -209,11 +206,6 @@ feedback_add_details("wizard_spell_learned","HH") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.add_spell(new/spell/targeted/equip_item/horsemask) temp = "You have learned curse of the horseman." - if("staffchange") - feedback_add_details("wizard_spell_learned","ST") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - new /obj/item/weapon/gun/energy/staff(get_turf(H)) - temp = "You have purchased a staff of change." - max_uses-- if("mentalfocus") feedback_add_details("wizard_spell_learned","MF") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells new /obj/item/weapon/gun/energy/staff/focus(get_turf(H)) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 41b6ad8cd4..48bb874290 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 bc971478c1..107f3a2977 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -166,15 +166,15 @@ if(..()) var/obj/item/stack/cable_coil/C = tool var/obj/item/organ/external/affected = target.get_organ(target_zone) - var/limb_can_operate = (affected && affected.open == 2 && (affected.disfigured || affected.burn_dam > 0) && target_zone != O_MOUTH) + var/limb_can_operate = ((affected && affected.open >= 3) && (affected.disfigured || affected.burn_dam > 0) && target_zone != O_MOUTH) if(limb_can_operate) if(istype(C)) if(!C.get_amount() >= 3) user << "You need three or more cable pieces to repair this damage." return SURGERY_FAILURE C.use(3) - return 1 - return 0 + return 1 + return SURGERY_FAILURE begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -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 a046f2e059..3fcdf2eb42 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 24ccd10bf0..0000000000 --- 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 38baf19051..ee8d18875d 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1,7 +1,7 @@ - Baystation 12 Changelog + Polaris Changelog