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