diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index 3bd9fdae2b..51035c5d76 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -204,7 +204,7 @@
/obj/machinery/atmospherics/binary/passive_gate/Topic(href,href_list)
- if(..()) return
+ if(..()) return 1
if(href_list["toggle_valve"])
unlocked = !unlocked
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index 53a66d70a6..87eaf9250d 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -190,7 +190,7 @@ Thus, the two variables affect pump operation are set in New():
return
/obj/machinery/atmospherics/binary/pump/Topic(href,href_list)
- if(..()) return
+ if(..()) return 1
if(href_list["power"])
use_power = !use_power
diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm
index af9586037f..3478f0f142 100644
--- a/code/ATMOSPHERICS/components/omni_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm
@@ -155,7 +155,7 @@
return null
/obj/machinery/atmospherics/omni/filter/Topic(href, href_list)
- if(..()) return
+ if(..()) return 1
switch(href_list["command"])
if("power")
if(!configuring)
diff --git a/code/ATMOSPHERICS/components/omni_devices/mixer.dm b/code/ATMOSPHERICS/components/omni_devices/mixer.dm
index bb3376fab4..970a33feee 100644
--- a/code/ATMOSPHERICS/components/omni_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/mixer.dm
@@ -172,7 +172,7 @@
return data
/obj/machinery/atmospherics/omni/mixer/Topic(href, href_list)
- if(..()) return
+ if(..()) return 1
switch(href_list["command"])
if("power")
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index d582eddd36..7a5fca0fa7 100755
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -199,7 +199,7 @@
/obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) // -- TLE
if(..())
- return
+ return 1
usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["filterset"])
diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
index bc5b49157f..c6f5b17613 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -156,7 +156,7 @@
return
/obj/machinery/atmospherics/trinary/mixer/Topic(href,href_list)
- if(..()) return
+ if(..()) return 1
if(href_list["power"])
use_power = !use_power
if(href_list["set_press"])
diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm
index 82d7d41b7b..e5305876ed 100644
--- a/code/ATMOSPHERICS/components/unary/cold_sink.dm
+++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm
@@ -93,6 +93,8 @@
ui.set_auto_update(1)
/obj/machinery/atmospherics/unary/freezer/Topic(href, href_list)
+ if(..())
+ return 1
if(href_list["toggleStatus"])
use_power = !use_power
update_icon()
@@ -107,7 +109,6 @@
set_power_level(new_setting)
add_fingerprint(usr)
- return 1
/obj/machinery/atmospherics/unary/freezer/process()
..()
diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm
index 829f06f420..db046e7974 100644
--- a/code/ATMOSPHERICS/components/unary/heat_source.dm
+++ b/code/ATMOSPHERICS/components/unary/heat_source.dm
@@ -113,6 +113,8 @@
ui.set_auto_update(1)
/obj/machinery/atmospherics/unary/heater/Topic(href, href_list)
+ if(..())
+ return 1
if(href_list["toggleStatus"])
use_power = !use_power
update_icon()
@@ -127,7 +129,6 @@
set_power_level(new_setting)
add_fingerprint(usr)
- return 1
//upgrading parts
/obj/machinery/atmospherics/unary/heater/RefreshParts()
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 104fbf1cdb..09911abf2c 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -49,9 +49,12 @@ rcd light flash thingy on matter drain
set category = "Malfunction"
set name = "Upgrade Turrets"
usr.verbs -= /client/proc/upgrade_turrets
- for(var/obj/machinery/turret/turret in player_list)
- turret.health += 30
- turret.shot_delay = 20
+ for(var/obj/machinery/porta_turret/turret in machines)
+ var/turf/T = get_turf(turret)
+ if(T.z in config.station_levels)
+ // Increase health by 37.5% of original max, decrease delays between shots to 66%
+ turret.health += initial(turret.health) * 3 / 8
+ turret.shot_delay = initial(turret.shot_delay) * 2 / 3
/datum/AI_Module/large/disable_rcd
module_name = "RCD disable"
diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm
index 949e6bfc77..9dc8623822 100644
--- a/code/game/gamemodes/newobjective.dm
+++ b/code/game/gamemodes/newobjective.dm
@@ -563,7 +563,7 @@ datum
captainslaser
- steal_target = /obj/item/weapon/gun/energy/laser/captain
+ steal_target = /obj/item/weapon/gun/energy/captain
explanation_text = "Steal the captain's antique laser gun."
weight = 20
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 534383867e..83fc1a9a85 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -480,7 +480,7 @@ datum/objective/steal
var/target_name
var/global/possible_items[] = list(
- "the captain's antique laser gun" = /obj/item/weapon/gun/energy/laser/captain,
+ "the captain's antique laser gun" = /obj/item/weapon/gun/energy/captain,
"a hand teleporter" = /obj/item/weapon/hand_tele,
"an RCD" = /obj/item/weapon/rcd,
"a jetpack" = /obj/item/weapon/tank/jetpack,
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 12ad5d1c3b..6026166b6b 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -302,6 +302,7 @@ update_flag
/obj/machinery/portable_atmospherics/canister/Topic(href, href_list)
//Do not use "if(..()) return" here, canisters will stop working in unpowered areas like space or on the derelict. // yeah but without SOME sort of Topic check any dick can mess with them via exploits as he pleases -walter0o
+ //First comment might be outdated.
if (!istype(src.loc, /turf))
return 0
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 77f41cb2eb..1a20fd29ef 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -31,13 +31,13 @@
var/alarm_on = 0
var/busy = 0
+ var/on_open_network = 0
+
/obj/machinery/camera/New()
wires = new(src)
assembly = new(src)
assembly.state = 4
- invalidateCameraCache()
-
/* // Use this to look for cameras that have the same c_tag.
for(var/obj/machinery/camera/C in cameranet.cameras)
var/list/tempnetwork = C.network&src.network
@@ -56,18 +56,18 @@
/obj/machinery/camera/emp_act(severity)
if(!isEmpProof())
if(prob(100/severity))
- invalidateCameraCache()
stat |= EMPED
SetLuminosity(0)
kick_viewers()
- triggerCameraAlarm(10 * severity)
+ triggerCameraAlarm(30 / severity)
update_icon()
+ update_coverage()
spawn(900)
stat &= ~EMPED
cancelCameraAlarm()
update_icon()
- invalidateCameraCache()
+ update_coverage()
..()
/obj/machinery/camera/bullet_act(var/obj/item/projectile/P)
@@ -114,7 +114,7 @@
destroy()
/obj/machinery/camera/attackby(obj/W as obj, mob/living/user as mob)
- invalidateCameraCache()
+ update_coverage()
// DECONSTRUCTION
if(isscrewdriver(W))
//user << "You start to [panel_open ? "close" : "open"] the camera's panel."
@@ -195,7 +195,7 @@
//legacy support, if choice is != 1 then just kick viewers without changing status
kick_viewers()
else
- invalidateCameraCache()
+ update_coverage()
set_status( !src.status )
if (!(src.status))
visible_message("\red [user] has deactivated [src]!")
@@ -215,11 +215,11 @@
//Used when someone breaks a camera
/obj/machinery/camera/proc/destroy()
- invalidateCameraCache()
stat |= BROKEN
kick_viewers()
triggerCameraAlarm()
update_icon()
+ update_coverage()
//sparks
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
@@ -349,6 +349,51 @@
user.set_machine(src)
wires.Interact(user)
+/obj/machinery/camera/proc/add_network(var/network_name)
+ add_networks(list(network_name))
+
+/obj/machinery/camera/proc/remove_network(var/network_name)
+ remove_networks(list(network_name))
+
+/obj/machinery/camera/proc/add_networks(var/list/networks)
+ var/network_added
+ network_added = 0
+ for(var/network_name in networks)
+ if(!(network_name in src.network))
+ network += network_name
+ network_added = 1
+
+ if(network_added)
+ update_coverage(1)
+
+/obj/machinery/camera/proc/remove_networks(var/list/networks)
+ var/network_removed
+ network_removed = 0
+ for(var/network_name in networks)
+ if(network_name in src.network)
+ network -= network_name
+ network_removed = 1
+
+ if(network_removed)
+ update_coverage(1)
+
+/obj/machinery/camera/proc/replace_networks(var/list/networks)
+ if(networks.len != network.len)
+ network = networks
+ update_coverage(1)
+ return
+
+ for(var/new_network in networks)
+ if(!(new_network in network))
+ network = networks
+ update_coverage(1)
+ return
+
+/obj/machinery/camera/proc/clear_all_networks()
+ if(network.len)
+ network.Cut()
+ update_coverage(1)
+
/obj/machinery/camera/proc/nano_structure()
var/cam[0]
cam["name"] = sanitize(c_tag)
@@ -358,3 +403,17 @@
cam["y"] = y
cam["z"] = z
return cam
+
+/obj/machinery/camera/proc/update_coverage(var/network_change = 0)
+ if(network_change)
+ var/list/open_networks = difflist(network, restricted_camera_networks)
+ // Add or remove camera from the camera net as necessary
+ if(on_open_network && !open_networks.len)
+ cameranet.removeCamera(src)
+ else if(!on_open_network && open_networks.len)
+ on_open_network = 1
+ cameranet.addCamera(src)
+ else
+ cameranet.updateVisibility(src, 0)
+
+ invalidateCameraCache()
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index 19f2216272..4ece6594f0 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -78,7 +78,7 @@
if(isscrewdriver(W))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13"))
+ var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13"))
if(!input)
usr << "No input found please hang up and try your call again."
return
@@ -99,10 +99,7 @@
C.auto_turn()
- C.network = uniquelist(tempnetwork)
- tempnetwork = difflist(C.network,restricted_camera_networks)
- if(!tempnetwork.len)//Camera isn't on any open network - remove its chunk from AI visibility.
- cameranet.removeCamera(C)
+ C.replace_networks(uniquelist(tempnetwork))
C.c_tag = input
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index db7b44f7ad..d8d2a3bb0e 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -33,7 +33,7 @@
/obj/item/toy/prize/odysseus = 1,
/obj/item/toy/prize/phazon = 1,
/obj/item/toy/waterflower = 1,
- /obj/item/toy/figure = 1,
+ /obj/random/action_figure = 1,
/obj/random/plushie = 1,
/obj/item/toy/cultsword = 1
)
diff --git a/code/game/machinery/computer/lockdown.dm b/code/game/machinery/computer/lockdown.dm
index bb1fff338d..c1eb5d8e06 100644
--- a/code/game/machinery/computer/lockdown.dm
+++ b/code/game/machinery/computer/lockdown.dm
@@ -110,7 +110,7 @@
onclose(user, "lockdown")
Topic(href, href_list)
- ..()
+ if(..()) return 1
if( href_list["close"] )
usr << browse(null, "window=lockdown")
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index b67834eb60..562b92a2df 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -148,7 +148,7 @@
/obj/machinery/computer/med_data/Topic(href, href_list)
if(..())
- return
+ return 1
if (!( data_core.general.Find(src.active1) ))
src.active1 = null
diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm
index bdac56c85d..0c7830a78a 100644
--- a/code/game/machinery/computer/pod.dm
+++ b/code/game/machinery/computer/pod.dm
@@ -158,7 +158,7 @@
/obj/machinery/computer/pod/Topic(href, href_list)
if(..())
- return
+ return 1
if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
if(href_list["power"])
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 60447703f5..8c04da619b 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -94,13 +94,13 @@
// iconholder = 1
// eprojectile = /obj/item/projectile/beam
- if(/obj/item/weapon/gun/energy/laser/retro)
+ if(/obj/item/weapon/gun/energy/retro)
iconholder = 1
-// if(/obj/item/weapon/gun/energy/laser/retro/sc_retro)
+// if(/obj/item/weapon/gun/energy/retro/sc_retro)
// iconholder = 1
- if(/obj/item/weapon/gun/energy/laser/captain)
+ if(/obj/item/weapon/gun/energy/captain)
iconholder = 1
if(/obj/item/weapon/gun/energy/lasercannon)
diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm
index 70e3628f67..2ad3df7ae5 100644
--- a/code/game/objects/items/devices/spy_bug.dm
+++ b/code/game/objects/items/devices/spy_bug.dm
@@ -140,7 +140,6 @@
..()
name = "DV-136ZB #[rand(1000,9999)]"
c_tag = name
- cameranet.removeCamera(src) // Sorry, no AI spying.
/obj/machinery/camera/spy/check_eye(var/mob/user as mob)
return 1
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index dc74f0272c..1e9405cbeb 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -20,26 +20,14 @@
throw_speed = 4
throw_range = 20
-/obj/item/device/taperecorder/hear_talk(mob/living/M as mob, msg, var/verb="says")
+/obj/item/device/taperecorder/hear_talk(mob/living/M as mob, msg, var/verb="says", datum/language/speaking=null)
if(recording)
- //var/ending = copytext(msg, length(msg))
- timestamp+= timerecorded
- /*
- if(M.stuttering)
- storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] stammers, \"[msg]\""
- return
- if(M.getBrainLoss() >= 60)
- storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] gibbers, \"[msg]\""
- return
- if(ending == "?")
- storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] asks, \"[msg]\""
- return
- else if(ending == "!")
- storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] exclaims, \"[msg]\""
- return
- */
- storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] [verb], \"[msg]\""
- return
+ timestamp += timerecorded
+
+ if(speaking)
+ storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] [speaking.format_message_plain(msg, verb)]"
+ else
+ storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] [verb], \"[msg]\""
/obj/item/device/taperecorder/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 9bc40c779d..a9b040f647 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -37,7 +37,7 @@
R.icon_state = "[R.ckey]-Standard"
del(R.module)
R.module = null
- R.camera.network.Remove(list("Engineering","Medical","MINE"))
+ R.camera.remove_networks(list("Engineering","Medical","MINE"))
R.updatename("Default")
R.status_flags |= CANPUSH
R.updateicon()
diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm
index 773881ab58..c4d0c75313 100644
--- a/code/game/objects/random/random.dm
+++ b/code/game/objects/random/random.dm
@@ -210,6 +210,50 @@
prob(3);/obj/item/ammo_magazine/mc9mmt/rubber)
+/obj/random/action_figure
+ name = "random action figure"
+ desc = "This is a random action figure."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "assistant"
+ item_to_spawn()
+ return pick(/obj/item/toy/figure/cmo,\
+ /obj/item/toy/figure/assistant,\
+ /obj/item/toy/figure/atmos,\
+ /obj/item/toy/figure/bartender,\
+ /obj/item/toy/figure/borg,\
+ /obj/item/toy/figure/gardener,\
+ /obj/item/toy/figure/captain,\
+ /obj/item/toy/figure/cargotech,\
+ /obj/item/toy/figure/ce,\
+ /obj/item/toy/figure/chaplain,\
+ /obj/item/toy/figure/chef,\
+ /obj/item/toy/figure/chemist,\
+ /obj/item/toy/figure/clown,\
+ /obj/item/toy/figure/corgi,\
+ /obj/item/toy/figure/detective,\
+ /obj/item/toy/figure/dsquad,\
+ /obj/item/toy/figure/engineer,\
+ /obj/item/toy/figure/geneticist,\
+ /obj/item/toy/figure/hop,\
+ /obj/item/toy/figure/hos,\
+ /obj/item/toy/figure/qm,\
+ /obj/item/toy/figure/janitor,\
+ /obj/item/toy/figure/agent,\
+ /obj/item/toy/figure/librarian,\
+ /obj/item/toy/figure/md,\
+ /obj/item/toy/figure/mime,\
+ /obj/item/toy/figure/miner,\
+ /obj/item/toy/figure/ninja,\
+ /obj/item/toy/figure/wizard,\
+ /obj/item/toy/figure/rd,\
+ /obj/item/toy/figure/roboticist,\
+ /obj/item/toy/figure/scientist,\
+ /obj/item/toy/figure/syndie,\
+ /obj/item/toy/figure/secofficer,\
+ /obj/item/toy/figure/warden,\
+ /obj/item/toy/figure/psychologist,\
+ /obj/item/toy/figure/paramedic,\
+ /obj/item/toy/figure/ert)
/obj/random/plushie
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 0ab10debe9..4eb2236ec0 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -15,7 +15,7 @@
if (1)
new /obj/item/weapon/shard( src.loc )
if (occupied)
- new /obj/item/weapon/gun/energy/laser/captain( src.loc )
+ new /obj/item/weapon/gun/energy/captain( src.loc )
occupied = 0
del(src)
if (2)
@@ -39,14 +39,14 @@
if (prob(75))
new /obj/item/weapon/shard( src.loc )
if (occupied)
- new /obj/item/weapon/gun/energy/laser/captain( src.loc )
+ new /obj/item/weapon/gun/energy/captain( src.loc )
occupied = 0
del(src)
/obj/structure/displaycase/meteorhit(obj/O as obj)
new /obj/item/weapon/shard( src.loc )
- new /obj/item/weapon/gun/energy/laser/captain( src.loc )
+ new /obj/item/weapon/gun/energy/captain( src.loc )
del(src)
@@ -78,7 +78,7 @@
/obj/structure/displaycase/attack_hand(mob/user as mob)
if (src.destroyed && src.occupied)
- new /obj/item/weapon/gun/energy/laser/captain( src.loc )
+ new /obj/item/weapon/gun/energy/captain( src.loc )
user << "\b You deactivate the hover field built into the case."
src.occupied = 0
src.add_fingerprint(user)
diff --git a/code/global.dm b/code/global.dm
index 13a62b38ce..7bb7da4531 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -10,7 +10,7 @@ var/global/list/med_hud_users = list() // List of all entities using
var/global/list/sec_hud_users = list() // List of all entities using a security HUD.
// Those networks can only be accessed by pre-existing terminals. AIs and new terminals can't use them.
-var/list/restricted_camera_networks = list("thunder","ERT","NUKE")
+var/list/restricted_camera_networks = list("thunder","ERT","NUKE","Secret")
var/global/list/global_mutations = list() // List of hidden mutation things.
var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called manually after an event.
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 51a2306082..c51ffbff82 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -186,12 +186,13 @@ var/global/floorIsLava = 0
var/f = 1
for(var/k in all_languages)
var/datum/language/L = all_languages[k]
- if(!f) body += " | "
- else f = 0
- if(L in M.languages)
- body += "[k]"
- else
- body += "[k]"
+ if(!(L.flags & INNATE))
+ if(!f) body += " | "
+ else f = 0
+ if(L in M.languages)
+ body += "[k]"
+ else
+ body += "[k]"
body += {"