diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 5906a676591..8bde73c238e 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -52,7 +52,7 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
/////Initial Building/////
//////////////////////////
-/hook/startup/proc/makeDatumRefLists()
+/proc/makeDatumRefLists()
var/list/paths
//Hair - Initialise all /datum/sprite_accessory/hair into an list indexed by hair-style name
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 6f27a86f949..e70875941e6 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -8,6 +8,7 @@
idle_power_usage = 10
active_power_usage = 100
+ var/list/machine_recipes
var/list/stored_material = list("metal" = 0, "glass" = 0)
var/list/storage_capacity = list("metal" = 0, "glass" = 0)
var/show_category = "All"
@@ -43,45 +44,45 @@
dat += "
Printable Designs
"
var/index = 0
- for(var/datum/autolathe/recipe/R in autolathe_recipes)
+ for(var/datum/autolathe/recipe/R in machine_recipes)
index++
if(R.hidden && !hacked || (show_category != "All" && show_category != R.category))
continue
- var/can_make = 1
- var/material_string = ""
- var/multiplier_string = ""
- var/max_sheets
+ var/can_make = 1
+ var/material_string = ""
+ var/multiplier_string = ""
+ var/max_sheets
- var/comma
- if(!R.resources || !R.resources.len)
- material_string = "No resources required."
- else
+ var/comma
+ if(!R.resources || !R.resources.len)
+ material_string = "No resources required."
+ else
- //Make sure it's buildable and list requires resources.
- for(var/material in R.resources)
- var/sheets = round(stored_material[material]/R.resources[material])
- if(isnull(max_sheets) || max_sheets > sheets)
- max_sheets = sheets
+ //Make sure it's buildable and list requires resources.
+ for(var/material in R.resources)
+ var/sheets = round(stored_material[material]/R.resources[material])
+ if(isnull(max_sheets) || max_sheets > sheets)
+ max_sheets = sheets
- if(!isnull(stored_material[material]) && stored_material[material] < R.resources[material])
- can_make = 0
- if(!comma)
- comma = 1
- else
- material_string += ", "
- material_string += "[R.resources[material]] [material]"
- material_string += ".
"
+ if(!isnull(stored_material[material]) && stored_material[material] < R.resources[material])
+ can_make = 0
+ if(!comma)
+ comma = 1
+ else
+ material_string += ", "
+ material_string += "[R.resources[material]] [material]"
+ material_string += ".
"
- //Build list of multipliers for sheets.
- if(R.is_stack)
- if(max_sheets && max_sheets > 0)
- multiplier_string += "
"
- for(var/i = 5;i\[x[i]\]"
- multiplier_string += "\[x[max_sheets]\]"
+ //Build list of multipliers for sheets.
+ if(R.is_stack)
+ if(max_sheets && max_sheets > 0)
+ multiplier_string += "
"
+ for(var/i = 5;i\[x[i]\]"
+ multiplier_string += "\[x[max_sheets]\]"
- dat += "| [R.hidden ? "*" : ""][can_make ? "" : ""][R.name][can_make ? "" : ""][R.hidden ? "*" : ""][multiplier_string] | [material_string] |
"
+ dat += "| [R.hidden ? "*" : ""][can_make ? "" : ""][R.name][can_make ? "" : ""][R.hidden ? "*" : ""][multiplier_string] | [material_string] |
"
dat += "
"
//Hacking.
@@ -198,14 +199,14 @@
if(!choice) return
show_category = choice
- if(href_list["make"] && autolathe_recipes)
+ if(href_list["make"] && machine_recipes)
var/index = text2num(href_list["make"])
var/multiplier = text2num(href_list["multiplier"])
var/datum/autolathe/recipe/making
- if(index > 0 && index <= autolathe_recipes.len)
- making = autolathe_recipes[index]
+ if(index > 0 && index <= machine_recipes.len)
+ making = machine_recipes[index]
//Exploit detection, not sure if necessary after rewrite.
if(!making || multiplier < 0 || multiplier > 100)
@@ -252,23 +253,6 @@
..()
wires = new(src)
- //Create global autolathe recipe list if it hasn't been made already.
- if(isnull(autolathe_recipes))
- autolathe_recipes = list()
- autolathe_categories = list()
- for(var/R in typesof(/datum/autolathe/recipe)-/datum/autolathe/recipe)
- var/datum/autolathe/recipe/recipe = new R
- autolathe_recipes += recipe
- autolathe_categories |= recipe.category
-
- var/obj/item/I = new recipe.path
- if(I.matter && !recipe.resources) //This can be overidden in the datums.
- recipe.resources = list()
- for(var/material in I.matter)
- if(!isnull(storage_capacity[material]))
- recipe.resources[material] = round(I.matter[material]*1.25) // More expensive to produce than they are to recycle.
- del(I)
-
//Create parts for lathe.
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/autolathe(src)
@@ -280,6 +264,10 @@
RefreshParts()
+/obj/machinery/autolathe/initialize()
+ ..()
+ machine_recipes = autolathe_recipes
+
//Updates overall lathe storage size.
/obj/machinery/autolathe/RefreshParts()
..()
diff --git a/code/game/machinery/autolathe_datums.dm b/code/game/machinery/autolathe_datums.dm
index b94f42d0c6f..996daa2d10b 100644
--- a/code/game/machinery/autolathe_datums.dm
+++ b/code/game/machinery/autolathe_datums.dm
@@ -1,6 +1,23 @@
/var/global/list/autolathe_recipes
/var/global/list/autolathe_categories
+/proc/populate_lathe_recipes()
+
+ //Create global autolathe recipe list if it hasn't been made already.
+ autolathe_recipes = list()
+ autolathe_categories = list()
+ for(var/R in typesof(/datum/autolathe/recipe)-/datum/autolathe/recipe)
+ var/datum/autolathe/recipe/recipe = new R
+ autolathe_recipes += recipe
+ autolathe_categories |= recipe.category
+
+ var/obj/item/I = new recipe.path
+ if(I.matter && !recipe.resources) //This can be overidden in the datums.
+ recipe.resources = list()
+ for(var/material in I.matter)
+ recipe.resources[material] = round(I.matter[material]*1.25) // More expensive to produce than they are to recycle.
+ del(I)
+
/datum/autolathe/recipe
var/name = "object"
var/path
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 6825c07df3c..945390332fa 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -122,7 +122,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if(!(R_ADMIN & X.holder.rights))
if(X.is_afk())
admin_number_afk++
- if(R_ADMIN & X.holder.rights) // just admins here please
+ if(R_ADMIN | R_MOD & X.holder.rights) // just admins here please
adminholders += X
if(X.is_afk())
admin_number_afk++
@@ -148,7 +148,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if("Bug report")
if(debugholders.len)
for(var/client/X in debugholders)
- if(R_ADMIN & X.holder.rights) // Admins get every button & special highlights in theirs
+ if(R_ADMIN | R_MOD & X.holder.rights) // Admins get every button & special highlights in theirs
if(X.prefs.toggles & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
X << msg
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index b9fcefbddec..2e627330a06 100755
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -8,6 +8,7 @@
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.
@@ -97,9 +98,11 @@
name = "Galactic Common"
desc = "The common galactic tongue."
speech_verb = "says"
+ whisper_verb = "whispers"
key = "0"
flags = RESTRICTED
+//TODO flag certain languages to use the mob-type specific say_quote and then get rid of these.
/datum/language/common/get_spoken_verb(var/msg_end)
switch(msg_end)
if("!")
@@ -111,10 +114,20 @@
/datum/language/human
name = "Sol Common"
desc = "A bastardized hybrid of informal English and elements of Mandarin Chinese; the common language of the Sol system."
+ speech_verb = "says"
+ whisper_verb = "whispers"
colour = "rough"
key = "1"
flags = RESTRICTED
+/datum/language/human/get_spoken_verb(var/msg_end)
+ switch(msg_end)
+ if("!")
+ return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs.
+ if("?")
+ return ask_verb
+ return speech_verb
+
// Galactic common languages (systemwide accepted standards).
/datum/language/trader
name = "Tradeband"
diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm
index 58a8bb66d5e..dc81d3d1b5b 100644
--- a/code/modules/mob/living/carbon/human/whisper.dm
+++ b/code/modules/mob/living/carbon/human/whisper.dm
@@ -41,8 +41,17 @@
var/watching_range = 5
var/italics = 1
+ var/not_heard //the message displayed to people who could not hear the whispering
if (speaking)
- verb = speaking.speech_verb + pick(" quietly", " softly")
+ if (speaking.whisper_verb)
+ verb = speaking.whisper_verb
+ not_heard = "[verb] something"
+ else
+ var/adverb = pick("quietly", "softly")
+ verb = "[speaking.speech_verb] [adverb]"
+ not_heard = "[verb] something [adverb]"
+ else
+ not_heard = "[verb] something" //TODO get rid of the null language and just prevent speech if language is null
message = capitalize(trim(message))
@@ -144,6 +153,6 @@
M.hear_say(new_message, verb, speaking, alt_name, italics, src)
if (watching.len)
- var/rendered = "[src.name] whispers something."
+ var/rendered = "[src.name] [not_heard]."
for (var/mob/M in watching)
M.show_message(rendered, 2)
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 8f2360fe136..fba2447b40a 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -39,21 +39,13 @@
greaterform = "Unathi"
uni_append = list(0x044,0xC5D) // 044C5D
-/mob/living/carbon/monkey/initialize()
- if (!species)
- species = all_species[greaterform]
- add_language(species.language)
-
/mob/living/carbon/monkey/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
- //Ensure that the all_species list has been initialized.
- //If not then this must be round-start and initialize() will
- //be called directly by the master controller, later.
- if (ticker && ticker.current_state >= GAME_STATE_SETTING_UP)
- initialize()
+ species = all_species[greaterform]
+ add_language(species.language)
if(name == initial(name)) //To stop Pun-Pun becoming generic.
name = "[name] ([rand(1, 1000)])"
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 20724db1e0b..98285e04e01 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -1531,12 +1531,11 @@
if (istype(M, /mob/living/carbon/human))
//Do not try to understand.
var/obj/item/weapon/surprise = new/obj/item/weapon(M)
- var/mob/living/carbon/monkey/ook = new monkey_type(null) //no other way to get access to the vars, alas
- surprise.icon = ook.icon
- surprise.icon_state = ook.icon_state
- surprise.name = "malformed [ook.name]"
- surprise.desc = "Looks like \a very deformed [ook.name], a little small for its kind. It shows no signs of life."
- del(ook) //rip nullspace monkey
+ var/mob/ook = monkey_type
+ surprise.icon = initial(ook.icon)
+ surprise.icon_state = initial(ook.icon_state)
+ surprise.name = "malformed [initial(ook.name)]"
+ surprise.desc = "Looks like \a very deformed [initial(ook.name)], a little small for its kind. It shows no signs of life."
surprise.transform *= 0.6
surprise.add_blood(M)
var/mob/living/carbon/human/H = M
@@ -1597,7 +1596,7 @@
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/neaeracube
name = "neaera cube"
- monkey_type ="skrell"
+ monkey_type = /mob/living/carbon/monkey/skrell
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube
name = "neaera cube"
monkey_type =/mob/living/carbon/monkey/skrell
diff --git a/code/world.dm b/code/world.dm
index 6cf0bb4f18f..e8cfc45ba9f 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -1,3 +1,15 @@
+var/global/datum/global_init/init = new ()
+
+/*
+ Pre-map initialization stuff should go here.
+*/
+/datum/global_init/New()
+
+ makeDatumRefLists()
+
+ del(src)
+
+
/world
mob = /mob/new_player
turf = /turf/space
@@ -46,6 +58,9 @@
// due to this list not being instantiated.
populate_seed_list()
+ // Create autolathe recipes, as above.
+ populate_lathe_recipes()
+
master_controller = new /datum/controller/game_controller()
spawn(1)
master_controller.setup()
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 88e08960fe3..7d8485e6ec7 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -1424,7 +1424,7 @@ window "outputwindow"
visited-color = #ff00ff
style = ".system {color:#ff0000;}"
enable-http-images = false
- max-lines = 1000
+ max-lines = 0
image = ""
window "rpane"