diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index ed740f85d16..ecbac32ed1c 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -17,6 +17,10 @@ var/global/list/landmarks_list = list() //list of all landmarks created var/global/list/surgery_steps = list() //list of all surgery steps |BS12 var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking. +//Languages/species +var/global/list/all_species[0] +var/global/list/all_languages[0] + //Preferences stuff //Hairstyles var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name @@ -69,6 +73,18 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al var/datum/surgery_step/S = new T surgery_steps += S sort_surgeries() + + //Languages and species. + paths = typesof(/datum/language)-/datum/language + for(var/T in paths) + var/datum/language/L = new T + all_languages[L.name] = L + + paths = typesof(/datum/species)-/datum/species + for(var/T in paths) + var/datum/species/S = new T + all_species[S.name] = S + /* // Uncomment to debug chemical reaction list. /client/verb/debug_chemical_list() diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index d0a60a08162..a22c9eec5f1 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -118,7 +118,10 @@ var/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour. var/ghost_interaction = 0 + var/comms_password = "" + var/use_irc_bot = 0 + var/irc_bot_host = "" var/main_irc = "" var/admin_irc = "" var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix @@ -407,6 +410,12 @@ if("ghost_interaction") config.ghost_interaction = 1 + if("comms_password") + config.comms_password = value + + if("irc_bot_host") + config.irc_bot_host = value + if("main_irc") config.main_irc = value diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index cafc1c58cd3..517c6d0931e 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -754,13 +754,13 @@ client usr << "This can only be done to instances of type /mob/living/carbon/human" return - var/datum/species/new_species = input("Please choose a new species.","Species",null) as null|anything in (typesof(/datum/species)-/datum/species) + var/new_species = input("Please choose a new species.","Species",null) as null|anything in all_species if(!H) usr << "Mob doesn't exist anymore" return - if(H.set_species(new new_species)) + if(H.set_species(new_species)) usr << "Set species of [H] to [H.species]." else usr << "Failed! Something went wrong." @@ -773,13 +773,13 @@ client usr << "This can only be done to instances of type /mob" return - var/datum/language/new_language = input("Please choose a language to add.","Language",null) as null|anything in (typesof(/datum/language)-/datum/language) + var/new_language = input("Please choose a language to add.","Language",null) as null|anything in all_languages if(!H) usr << "Mob doesn't exist anymore" return - if(H.add_language(new new_language)) + if(H.add_language(new_language)) usr << "Added [new_language] to [H]." else usr << "Mob already knows that language." @@ -792,13 +792,17 @@ client usr << "This can only be done to instances of type /mob" return + if(!H.languages.len) + usr << "This mob knows no languages." + return + var/datum/language/rem_language = input("Please choose a language to remove.","Language",null) as null|anything in H.languages if(!H) usr << "Mob doesn't exist anymore" return - if(H.remove_language(rem_language)) + if(H.remove_language(rem_language.name)) usr << "Removed [rem_language] from [H]." else usr << "Mob doesn't know that language." diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index fa4299c3c1b..935e0974c75 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -95,12 +95,12 @@ var/global/vox_kills = 0 //Used to check the Inviolate. var/mob/living/carbon/human/vox = raider.current - vox.languages += new /datum/language/vox vox.real_name = capitalize(newname) vox.name = vox.real_name vox.age = rand(12,20) - vox.set_species(new /datum/species/vox) vox.dna.mutantrace = "vox" + vox.set_species("Vox") + vox.add_language("Vox-pidgin") vox.h_style = "Short Vox Quills" vox.equip_vox_raider() vox.regenerate_icons() diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm index 5078dd379a5..2fe409dcfb5 100644 --- a/code/game/machinery/podmen.dm +++ b/code/game/machinery/podmen.dm @@ -117,7 +117,7 @@ Growing it to term with nothing injected will grab a ghost from the observers. * podman.gender = NEUTER podman.dna = new /datum/dna() podman.dna.real_name = podman.real_name - podman.set_species(new /datum/species/diona) + podman.set_species("Diona") podman.dna.mutantrace = "plant" podman.update_mutantrace() diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 5e33df7f56f..9439757282a 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -312,17 +312,7 @@ if(usr.stat || usr.restrained()) return - if(istype(usr,/mob/living/silicon)) - if(istype(usr,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = usr - if(!(R.module && istype(R.module,/obj/item/weapon/robot_module/butler) )) - usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!" - return - else - usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!" - return - - if(href_list["remove_coin"]) + if(href_list["remove_coin"] && !istype(usr,/mob/living/silicon)) if(!coin) usr << "There is no coin in this machine." return @@ -338,6 +328,16 @@ usr.set_machine(src) if ((href_list["vend"]) && (src.vend_ready) && (!currently_vending)) + if(istype(usr,/mob/living/silicon)) + if(istype(usr,/mob/living/silicon/robot)) + var/mob/living/silicon/robot/R = usr + if(!(R.module && istype(R.module,/obj/item/weapon/robot_module/butler) )) + usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!" + return + else + usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!" + return + if ((!src.allowed(usr)) && (!src.emagged) && (src.wires & WIRE_SCANID)) //For SECURE VENDING MACHINES YEAH usr << "\red Access denied." //Unless emagged of course flick(src.icon_deny,src) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index c5b20ecb924..e4850b4ceb3 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -507,13 +507,14 @@ client/proc/one_click_antag() i++ newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah")) - new_vox.languages += new /datum/language/vox new_vox.real_name = capitalize(newname) new_vox.name = new_vox.real_name new_vox.age = rand(12,20) new_vox.dna.ready_dna(new_vox) // Creates DNA. - new_vox.set_species(new /datum/species/vox) // Actually makes the vox! How about that. + new_vox.dna.mutantrace = "vox" + new_vox.set_species("Vox") // Actually makes the vox! How about that. + new_vox.add_language("Vox-pidgin") new_vox.mind_initialize() new_vox.mind.assigned_role = "MODE" new_vox.mind.special_role = "Vox Raider" diff --git a/code/modules/ext_scripts/irc.dm b/code/modules/ext_scripts/irc.dm index bc4774af115..f4e94f3ffc4 100644 --- a/code/modules/ext_scripts/irc.dm +++ b/code/modules/ext_scripts/irc.dm @@ -1,14 +1,14 @@ /proc/send2irc(var/channel, var/msg) - if(config.use_irc_bot) - ext_python("ircbot_message.py", "[channel] [msg]") + if(config.use_irc_bot && config.irc_bot_host) + ext_python("ircbot_message.py", "[config.comms_password] [config.irc_bot_host] [channel] [msg]") return /proc/send2mainirc(var/msg) - if(config.use_irc_bot && config.main_irc) - ext_python("ircbot_message.py", "[config.main_irc] [msg]") + if(config.use_irc_bot && config.main_irc && config.irc_bot_host) + ext_python("ircbot_message.py", "[config.comms_password] [config.irc_bot_host] [config.main_irc] [msg]") return /proc/send2adminirc(var/msg) - if(config.use_irc_bot && config.admin_irc) - ext_python("ircbot_message.py", "[config.admin_irc] [msg]") - return \ No newline at end of file + if(config.use_irc_bot && config.admin_irc && config.irc_bot_host) + ext_python("ircbot_message.py", "[config.comms_password] [config.irc_bot_host] [config.admin_irc] [msg]") + return diff --git a/code/modules/ext_scripts/python.dm b/code/modules/ext_scripts/python.dm index a6e578635d3..9b798d80cae 100644 --- a/code/modules/ext_scripts/python.dm +++ b/code/modules/ext_scripts/python.dm @@ -6,4 +6,4 @@ var/command = config.python_path + " " + script + " " + args - return shell(command) \ No newline at end of file + return shell(command) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 727437a19f2..7db84dbbf0b 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -30,4 +30,29 @@ name = "Vox-pidgin" speech_verb = "shrieks" colour = "vox" - key = "v" \ No newline at end of file + key = "v" + + +// Language handling. +/mob/proc/add_language(var/language) + + for(var/datum/language/L in languages) + if(L && L.name == language) + return 0 + + var/datum/language/new_language = all_languages[language] + + if(!istype(new_language,/datum/language)) + return 0 + + languages += new_language + return 1 + +/mob/proc/remove_language(var/rem_language) + + for(var/datum/language/L in languages) + if(L && L.name == rem_language) + languages -= L + return 1 + + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6b98ec7c1dc..48583833096 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -13,22 +13,22 @@ /mob/living/carbon/human/skrell/New() h_style = "Skrell Male Tentacles" - set_species(new /datum/species/skrell(src)) + set_species("Skrell") ..() /mob/living/carbon/human/tajaran/New() h_style = "Tajaran Ears" - set_species(new /datum/species/tajaran(src)) + set_species("Tajara") ..() /mob/living/carbon/human/unathi/New() h_style = "Unathi Horns" - set_species(new /datum/species/unathi(src)) + set_species("Unathi") ..() /mob/living/carbon/human/vox/New() h_style = "Short Vox Quills" - species = new /datum/species/vox(src) + set_species("Vox") ..() /mob/living/carbon/human/diona/New() @@ -41,7 +41,9 @@ set_species() if(species.language) - languages += species.language + var/datum/language/L = all_languages[species.language] + if(L) + languages += L var/datum/reagents/R = new/datum/reagents(1000) reagents = R @@ -1260,21 +1262,15 @@ mob/living/carbon/human/yank_out_object() else usr << "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]." -/mob/living/carbon/human/proc/set_species(var/datum/species/new_species) +/mob/living/carbon/human/proc/set_species(var/new_species) if(!new_species) - new_species = new /datum/species/human + new_species = "Human" - if(species) + if(species && (species.name && species.name == new_species)) + return - if(species.name == new_species.name) - return - - var/temp = species - species = new_species - del(temp) - else - species = new_species + species = all_species[new_species] spawn(0) update_icons() diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 62c8a6273b6..6d5ec719c10 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -25,7 +25,7 @@ var/tail // Name of tail image in species effects icon file. var/primitive // Lesser form, if any (ie. monkey for humans) - var/datum/language/language // Default racial language, if any. + var/language // Default racial language, if any. var/attack_verb = "punch" // Empty hand hurt intent verb. var/breath_type // Non-oxygen gas breathed, if any. @@ -56,7 +56,7 @@ name = "Unathi" icobase = 'icons/mob/human_races/r_lizard.dmi' deform = 'icons/mob/human_races/r_def_lizard.dmi' - language = new /datum/language/unathi + language = "Sinta'unathi" tail = "sogtail" attack_verb = "scratch" @@ -66,7 +66,7 @@ name = "Tajara" icobase = 'icons/mob/human_races/r_tajaran.dmi' deform = 'icons/mob/human_races/r_def_tajaran.dmi' - language = new /datum/language/tajaran + language = "Siik'mas" tail = "tajtail" attack_verb = "scratch" @@ -76,7 +76,7 @@ name = "Skrell" icobase = 'icons/mob/human_races/r_skrell.dmi' deform = 'icons/mob/human_races/r_def_skrell.dmi' - language = new /datum/language/skrell + language = "Skrellian" flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR @@ -84,7 +84,7 @@ name = "Vox" icobase = 'icons/mob/human_races/r_vox.dmi' deform = 'icons/mob/human_races/r_def_vox.dmi' - language = new /datum/language/vox + language = "Vox-pidgin" eyes = "vox_eyes_s" breath_type = "nitrogen" diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 0bd78027093..ded645a11ef 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -955,23 +955,4 @@ mob/verb/yank_out_object() pinned -= O if(!pinned.len) anchored = 0 - return 1 - -// Language handling. -/mob/proc/add_language(var/datum/language/new_language) - - for(var/datum/language/L in languages) - if(L && L.name == new_language.name) - return 0 - - languages += new_language - return 1 - -/mob/proc/remove_language(var/datum/language/rem_language) - - for(var/datum/language/L in languages) - if(L && L.name == rem_language.name) - languages -= L - return 1 - - return 0 \ No newline at end of file + return 1 \ No newline at end of file diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 06575f9fa79..3c77f36965e 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -349,26 +349,26 @@ if(client.prefs.species == "Tajaran") //This is like the worst, but it works, so meh. - Erthilo if(is_alien_whitelisted(src, "Tajaran") || !config.usealienwhitelist) - new_character.set_species(new /datum/species/tajaran) - new_character.languages += new /datum/language/tajaran + new_character.set_species("Tajara") + new_character.add_language("Siik'mas") if(client.prefs.species == "Unathi") if(is_alien_whitelisted(src, "Soghun") || !config.usealienwhitelist) - new_character.set_species(new /datum/species/unathi) - new_character.languages += new /datum/language/unathi + new_character.set_species("Unathi") + new_character.add_language("Sinta'unathi") if(client.prefs.species == "Skrell") if(is_alien_whitelisted(src, "Skrell") || !config.usealienwhitelist) - new_character.set_species(new /datum/species/skrell) - new_character.languages += new /datum/language/skrell + new_character.set_species("Skrell") + new_character.add_language("Skrellian") if(client.prefs.language == "Tajaran") if(is_alien_whitelisted(src, "Language_Tajaran") || !config.usealienwhitelist) - new_character.languages += new /datum/language/tajaran + new_character.add_language("Siik'mas") if(client.prefs.language == "Unathi") if(is_alien_whitelisted(src, "Language_Soghun") || !config.usealienwhitelist) - new_character.languages += new /datum/language/unathi + new_character.add_language("Sinta'unathi") if(client.prefs.language == "Skrell") if(is_alien_whitelisted(src, "Language_Skrell") || !config.usealienwhitelist) - new_character.languages += new /datum/language/skrell + new_character.add_language("Skrellian") if(ticker.random_players) new_character.gender = pick(MALE, FEMALE) diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 78ccd65c287..dd31d28ac76 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -189,18 +189,11 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 . = ..() vessel.remove_reagent("blood",amount) // Removes blood if human -//Transfers blood from container ot vessels, respecting blood types compatability. -/mob/living/carbon/human/proc/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) - var/datum/reagent/blood/our = get_blood(vessel) +//Transfers blood from container ot vessels +/mob/living/carbon/proc/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) var/datum/reagent/blood/injected = get_blood(container.reagents) if (!injected) return - if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"]) ) - reagents.add_reagent("toxin",amount * 0.5) - reagents.update_total() - else - vessel.add_reagent("blood", amount, injected.data) - vessel.update_total() src.virus2 |= virus_copylist(injected.data["virus2"]) if (injected.data["antibodies"] && prob(5)) antibodies |= injected.data["antibodies"] @@ -208,11 +201,24 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 chems = params2list(injected.data["trace_chem"]) for(var/C in chems) src.reagents.add_reagent(C, (text2num(chems[C]) / 560) * amount)//adds trace chemicals to owner's blood - //world << "added [(text2num(chems[C])/560) * amount] = [text2num(chems[C])]/560*[amount] units of [C] to [src]" //DEBUG reagents.update_total() container.reagents.remove_reagent("blood", amount) +//Transfers blood from container ot vessels, respecting blood types compatability. +/mob/living/carbon/human/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) + var/datum/reagent/blood/our = get_blood(vessel) + var/datum/reagent/blood/injected = get_blood(container.reagents) + if (!injected || !our) + return + if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"]) ) + reagents.add_reagent("toxin",amount * 0.5) + reagents.update_total() + else + vessel.add_reagent("blood", amount, injected.data) + vessel.update_total() + ..() + //Gets human's own blood. /mob/living/carbon/proc/get_blood(datum/reagents/container) var/datum/reagent/blood/res = locate() in container.reagent_list //Grab some blood diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 699e1f76ad1..31c7389fefd 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -73,8 +73,8 @@ A.randomize_appearance_for(new_mob) var/mob/living/carbon/human/H = new_mob - var/newspecies = pick(typesof(/datum/species)-/datum/species) - H.set_species(new newspecies) + var/newspecies = pick(all_species) + H.set_species(newspecies) else return diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index d93ce042295..38e9c6f6882 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -154,9 +154,9 @@ B = d break var/trans - if(B && ishuman(target)) - var/mob/living/carbon/human/H = target - H.inject_blood(src,5) + if(B && istype(target,/mob/living/carbon)) + var/mob/living/carbon/C = target + C.inject_blood(src,5) else trans = src.reagents.trans_to(target, amount_per_transfer_from_this) user << "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units." diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm index 75a33ef5c86..25674ea2b6e 100644 --- a/code/modules/virus2/items_devices.dm +++ b/code/modules/virus2/items_devices.dm @@ -13,7 +13,7 @@ flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY -/obj/item/device/antibody_scanner/attack(mob/living/carbon/human/M as mob, mob/user as mob) +/obj/item/device/antibody_scanner/attack(mob/living/carbon/M as mob, mob/user as mob) if(!istype(M)) user << "Incompatible object, scan aborted." return diff --git a/code/world.dm b/code/world.dm index 502d25d1905..8d811e8ea46 100644 --- a/code/world.dm +++ b/code/world.dm @@ -82,6 +82,8 @@ sleep_offline = 1 + send2mainirc("Server starting up on [config.server? "byond://[config.server]" : "byond://[world.address]:[world.port]"]") + master_controller = new /datum/controller/game_controller() spawn(1) master_controller.setup() diff --git a/config/config.txt b/config/config.txt index 65ea61919e4..6538a9edbfb 100644 --- a/config/config.txt +++ b/config/config.txt @@ -211,15 +211,21 @@ USEALIENWHITELIST ##Remove the # to let ghosts spin chairs #GHOST_INTERACTION +## Password used for authorizing ircbot and other external tools. +#COMMS_PASSWORD + ## Uncomment to enable sending data to the IRC bot. #USE_IRC_BOT +## Host where the IRC bot is hosted. Port 45678 needs to be open. +#IRC_BOT_HOST localhost + ## IRC channel to send information to. Leave blank to disable. #MAIN_IRC #main ## IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc. #ADMIN_IRC #admin -## Path to the python executable on the system. Leave blank for default. +## Path to the python2 executable on the system. Leave blank for default. ## Default is "python" on Windows, "/usr/bin/env python2" on UNIX. -PYTHON_PATH +#PYTHON_PATH diff --git a/icons/mob/monkey.dmi b/icons/mob/monkey.dmi index 30a7bdb3c57..82262675d4b 100644 Binary files a/icons/mob/monkey.dmi and b/icons/mob/monkey.dmi differ diff --git a/scripts/ircbot_message.py b/scripts/ircbot_message.py index b2b8a02f1ba..95673c62f44 100644 --- a/scripts/ircbot_message.py +++ b/scripts/ircbot_message.py @@ -6,18 +6,18 @@ import sys,cPickle,socket def pack(): - ip = sys.argv[1] + passwd = sys.argv[1] + ip = sys.argv[3] try: - data = sys.argv[2:] #The rest of the arguments is data + data = sys.argv[4:] #The rest of the arguments is data except: data = "NO DATA SPECIFIED" - dictionary = {"ip":ip,"data":["PASSWORD"] + data} + dictionary = {"ip":ip,"data":[passwd] + data} pickled = cPickle.dumps(dictionary) nudge(pickled) def nudge(data): - HOST = "IRCBOT IP" + HOST = sys.argv[2] PORT = 45678 - size = 1024 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST,PORT)) s.send(data)