diff --git a/code/LINDA/LINDA_system.dm b/code/LINDA/LINDA_system.dm index 613bc45f3a7..32e6e6a4f56 100644 --- a/code/LINDA/LINDA_system.dm +++ b/code/LINDA/LINDA_system.dm @@ -199,11 +199,11 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0) /atom/movable/proc/air_update_turf(var/command = 0) if(istype(loc,/turf)) - var/turf/T = loc - if(command) - T.CalculateAdjacentTurfs() - if(air_master) - air_master.add_to_active(T,command) + for(var/turf/T in locs) // used by double wide doors and other nonexistant multitile structures + if(command) + T.CalculateAdjacentTurfs() + if(air_master) + air_master.add_to_active(T,command) diff --git a/code/__DEFINES.dm b/code/__DEFINES.dm index fee3b7b951c..30b1390e423 100644 --- a/code/__DEFINES.dm +++ b/code/__DEFINES.dm @@ -388,11 +388,6 @@ var/list/TAGGERLOCATIONS = list("Disposals", #define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated. - -//IMPORTANT! The permissions system supports flags up to 2^30 (possibly 2^31), HOWEVER, once the flag 65536 -//starts being used, an edit to rights2text(rights, seperator="") needs to happen! The edit is prepared -//and commented out. Please uncomment it before assigning that flag. Once you do, delete this note. ~Errorage - //Preference toggles #define SOUND_ADMINHELP 1 #define SOUND_MIDI 2 diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 88c1be1a59d..7b7ba3f78ba 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -368,11 +368,11 @@ var/list/binary = list("0","1") if(!istext(into)) into = "" if(!istext(from)) from = "" var/null_ascii = istext(null_char) ? text2ascii(null_char,1) : null_char - + var/previous = 0 var/start = 1 var/end = length(into) + 1 - + for(var/i=1, i= 65536) - var/rights_pt2 = rights / 65536 - if(rights_pt2 & 1) .+= "[seperator]+NUKESERVER" - if(rights_pt2 & 2) .+= "[seperator]+DDOSALLPLAYERS" - if(rights_pt2 & 4) .+= "[seperator]+SPAWN_RL_SINGULARITY" - */ - +/proc/rights2text(rights, seperator="", list/adds, list/subs) if(rights & R_BUILDMODE) . += "[seperator]+BUILDMODE" if(rights & R_ADMIN) . += "[seperator]+ADMIN" if(rights & R_BAN) . += "[seperator]+BAN" @@ -245,6 +237,11 @@ proc/tg_list2text(list/list, glue=",") if(rights & R_VAREDIT) . += "[seperator]+VAREDIT" if(rights & R_SOUNDS) . += "[seperator]+SOUND" if(rights & R_SPAWN) . += "[seperator]+SPAWN" + + for(var/verbpath in adds) + . += "[seperator]+[verbpath]" + for(var/verbpath in subs) + . += "[seperator]-[verbpath]" return . /proc/ui_style2icon(ui_style) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 7613e40f383..7f25b86cb5b 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -402,6 +402,8 @@ client //This should all be moved over to datum/admins/Topic() or something ~Carn if( (usr.client != src) || !src.holder ) return + if(!check_rights(R_VAREDIT)) + return if(href_list["Vars"]) debug_variables(locate(href_list["Vars"])) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 2d00e512ca2..b6cb92a5df3 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -61,7 +61,9 @@ var/list/sacrificed = list() for(var/mob/living/carbon/C in orange(1,src)) if(iscultist(C) && !C.stat) culcount++ - if(culcount>=3) + if(user.loc==src.loc) + return fizzle() + if(culcount>=1) user.say("Sas[pick("'","`")]so c'arta forbici tarem!") user.visible_message("\red You feel air moving from the rune - like as it was swapped with somewhere else.", \ "\red You feel air moving from the rune - like as it was swapped with somewhere else.", \ @@ -530,7 +532,6 @@ var/list/sacrificed = list() for(var/datum/mind/H in ticker.mode.cult) if (H.current) H.current << "\red \b [input]" - del(src) return 1 /////////////////////////////////////////FIFTEENTH RUNE @@ -750,7 +751,7 @@ var/list/sacrificed = list() for(var/mob/living/carbon/C in orange(1,src)) if(iscultist(C) && !C.stat) users+=C - if(users.len>=3) + if(users.len>=1) var/mob/living/carbon/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users) if(!cultist) return fizzle() diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 2f41f3a237d..8c73138bd6f 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -53,7 +53,7 @@ var/bomb_set /obj/machinery/nuclearbomb/attack_hand(mob/user as mob) if (src.extended) user.set_machine(src) - var/dat = text("Nuclear Fission Explosive
\nAuth. Disk: []
", src, (src.auth ? "++++++++++" : "----------")) + var/dat = text("\nAuth. Disk: []
", src, (src.auth ? "++++++++++" : "----------")) if (src.auth) if (src.yes_code) dat += text("\nStatus: []-[]
\nTimer: []
\n
\nTimer: [] Toggle
\nTime: - - [] + +
\n
\nSafety: [] Toggle
\nAnchor: [] Toggle
\n", (src.timing ? "Func/Set" : "Functional"), (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src, src, src, src.timeleft, src, src, (src.safety ? "On" : "Off"), src, (src.anchored ? "Engaged" : "Off"), src) @@ -69,9 +69,10 @@ var/bomb_set message = text("[]", src.code) if (src.yes_code) message = "*****" - dat += text("
\n>[]
\n1-2-3
\n4-5-6
\n7-8-9
\nR-0-E
\n
", message, src, src, src, src, src, src, src, src, src, src, src, src) - user << browse(dat, "window=nuclearbomb;size=300x400") - onclose(user, "nuclearbomb") + dat += text("
\n>[]
\n123
\n456
\n789
\nR0E
\n
", message, src, src, src, src, src, src, src, src, src, src, src, src) + var/datum/browser/popup = new(user, "nuclearbomb", name, 300, 400) + popup.set_content(dat) + popup.open() else user << "You have to deploy the bomb first." return @@ -81,11 +82,12 @@ var/bomb_set set name = "Deploy Bomb" set src in oview(1) - if (!src.extended) - src.anchored = 1 - flick("nuclearbombc", src) - src.icon_state = "nuclearbomb1" - src.extended = 1 + if(isliving(usr)) + if(!src.extended) + src.anchored = 1 + flick("nuclearbombc", src) + src.icon_state = "nuclearbomb1" + src.extended = 1 /obj/machinery/nuclearbomb/Topic(href, href_list) if(..()) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index a872898ee8d..334ce4c994e 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -242,6 +242,7 @@ expel_gas = air_contents.remove(remove_amount) expel_gas.temperature = T20C //Lets expel hot gas and see if that helps people not die as they are removed loc.assume_air(expel_gas) + air_update_turf() /obj/machinery/atmospherics/unary/cryo_cell/proc/go_out() @@ -317,4 +318,4 @@ return if(usr.stat || stat & (NOPOWER|BROKEN)) return - put_mob(usr) \ No newline at end of file + put_mob(usr) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index c34a3a39472..57807b5d538 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -97,6 +97,7 @@ opacity = 0 doortype = 10 glass = 1 + bound_width = 64 // 2x1 /obj/machinery/door/airlock/freezer name = "freezer airlock" diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 060da99d193..38398cc955d 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -109,13 +109,20 @@ /obj/effect/landmark/costume/nyangirl/New() new /obj/item/clothing/under/schoolgirl(src.loc) new /obj/item/clothing/head/kitty(src.loc) + if (prob(50)) + new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc) + else + new /obj/item/clothing/mask/muzzle/gag(src.loc) del(src) /obj/effect/landmark/costume/maid/New() new /obj/item/clothing/under/blackskirt(src.loc) var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears ) new CHOICE(src.loc) - new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc) + if (prob(50)) + new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc) + else + new /obj/item/clothing/mask/muzzle/gag(src.loc) del(src) /obj/effect/landmark/costume/butler/New() diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index fbacf7f0cbe..b00f525adfc 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -269,7 +269,7 @@ var/global/list/obj/item/device/pda/PDAs = list() dat += "

PERSONAL DATA ASSISTANT v.1.2

" dat += "Owner: [owner], [ownjob]
" dat += text("ID: [id ? "[id.registered_name], [id.assignment]" : "----------"]") - dat += text("
[id ? "Update PDA Info" : ""]
") + dat += text("
[id ? "Update PDA Info" : ""]

") dat += "[worldtime2text()]
" //:[world.time / 100 % 6][world.time / 100 % 10]" dat += "[time2text(world.realtime, "MMM DD")] [year_integer+540]" @@ -1136,4 +1136,4 @@ var/global/list/obj/item/device/pda/PDAs = list() for(var/obj/item/device/pda/P in PDAs) if(!P.owner || P.toff || P.hidden) continue . += P - return . \ No newline at end of file + return . diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 9a57b4ff579..29b1678d8b5 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -60,7 +60,10 @@ if(!attached_device) return attached_device.HasProximity(AM) return - +/obj/item/device/transfer_valve/hear_talk(mob/living/M, msg) + if(!attached_device) return + attached_device.hear_talk(M, msg) + return /obj/item/device/transfer_valve/attack_self(mob/user as mob) user.set_machine(src) diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index fe77461a0fc..4d946bfb0f1 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -13,22 +13,23 @@ if(C.holder && C.holder.fakekey) entry += " (as [C.holder.fakekey])" entry += " - Playing as [C.mob.real_name]" - switch(C.mob.stat) - if(UNCONSCIOUS) - entry += " - Unconscious" - if(DEAD) - if(isobserver(C.mob)) - var/mob/dead/observer/O = C.mob - if(O.started_as_observer) - entry += " - Observing" + if(check_rights(R_ADMIN,0)) + switch(C.mob.stat) + if(UNCONSCIOUS) + entry += " - Unconscious" + if(DEAD) + if(isobserver(C.mob)) + var/mob/dead/observer/O = C.mob + if(O.started_as_observer) + entry += " - Observing" + else + entry += " - DEAD" else entry += " - DEAD" - else - entry += " - DEAD" - if(is_special_character(C.mob)) - entry += " - Antagonist" - entry += " (?)" - Lines += entry + if(is_special_character(C.mob)) + entry += " - Antagonist" + entry += " (?)" + Lines += entry else for(var/client/C in clients) if(C.holder && C.holder.fakekey) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index d2d469670ae..e5921b45734 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -421,6 +421,11 @@ var/global/floorIsLava = 0 List DNA (Blood)
List Fingerprints


+ Shuttles
+
+ Move Ferry
+ Move Mining Shuttle
+
"} if(check_rights(R_FUN,0)) @@ -448,11 +453,6 @@ var/global/floorIsLava = 0 Trigger a communication blackout
Trigger a hyper-energetic flux

- Shuttles
-
- Move Ferry
- Move Mining Shuttle
-
Fun Secrets

Turn all humans into monkeys
@@ -467,6 +467,7 @@ var/global/floorIsLava = 0 Break all lights
Fix all lights
The floor is lava! (DANGEROUS: extremely lame)
+
"} /* DEATH SQUADS diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 0f02fe9cdb3..e8cd48844c5 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -1,57 +1,106 @@ -var/list/admin_ranks = list() //list of all ranks with associated rights +var/list/admin_ranks = list() //list of all admin_rank datums + +/datum/admin_rank + var/name = "NoRank" + var/rights = 0 + var/list/adds + var/list/subs + +/datum/admin_rank/New(init_name, init_rights, list/init_adds, list/init_subs) + name = init_name + switch(name) + if("Removed",null,"") + error("invalid admin-rank name. datum deleted") + del(src) + if(init_rights) rights = init_rights + if(!init_adds) init_adds = list() + if(!init_subs) init_subs = list() + adds = init_adds + subs = init_subs + +/datum/admin_rank/proc/process_keyword(word, previous_rights=0) + var/flag = 0 + switch(ckey(word)) + if("buildmode","build") flag = R_BUILDMODE + if("admin") flag = R_ADMIN + if("ban") flag = R_BAN + if("fun") flag = R_FUN + if("server") flag = R_SERVER + if("debug") flag = R_DEBUG + if("permissions","rights") flag = R_PERMISSIONS + if("possess") flag = R_POSSESS + if("stealth") flag = R_STEALTH + if("rejuv","rejuvinate") flag = R_REJUVINATE + if("varedit") flag = R_VAREDIT + if("everything","host","all") flag = 65535 + if("sound","sounds") flag = R_SOUNDS + if("spawn","create") flag = R_SPAWN + if("@","prev") flag = previous_rights + else + //isn't a keyword so maybe it's a verbpath? + var/path = text2path(copytext(word,2,findtext(word," ",2,0))) + if(path) + switch(text2ascii(word,1)) + if(43) + if(!subs.Remove(path)) + adds += path //+ + if(45) + if(!adds.Remove(path)) + subs += path //- + return + switch(text2ascii(word,1)) + if(43) rights |= flag //+ + if(45) rights &= ~flag //- + return //load our rank - > rights associations /proc/load_admin_ranks() admin_ranks.Cut() - var/previous_rights = 0 + if(config.admin_legacy_system) + var/previous_rights = 0 + //load text from file and process each line seperately + for(var/line in file2list("config/admin_ranks.txt")) + if(!line) continue + if(findtextEx(line,"#",1,2)) continue - //load text from file - var/list/Lines = file2list("config/admin_ranks.txt") + var/next = findtext(line, "=") + var/datum/admin_rank/R = new(ckeyEx(copytext(line, 1, next))) + if(!R) continue + admin_ranks += R - //process each line seperately - for(var/line in Lines) - if(!length(line)) continue - if(copytext(line,1,2) == "#") continue + var/prev = findchar(line, "+-", next, 0) + while(prev) + next = findchar(line, "+-", prev+1, 0) + R.process_keyword(copytext(line, prev, next), previous_rights) + prev = next + + previous_rights = R.rights + else + establish_db_connection() + if(!dbcon.IsConnected()) + world.log << "Failed to connect to database in load_admin_ranks(). Reverting to legacy system." + diary << "Failed to connect to database in load_admin_ranks(). Reverting to legacy system." + config.admin_legacy_system = 1 + load_admin_ranks() + return - var/list/List = text2list(line,"+") - if(!List.len) continue - - var/rank = ckeyEx(List[1]) - switch(rank) - if(null,"") continue - if("Removed") continue //Reserved - - var/rights = 0 - for(var/i=2, i<=List.len, i++) - switch(ckey(List[i])) - if("@","prev") rights |= previous_rights - if("buildmode","build") rights |= R_BUILDMODE - if("admin") rights |= R_ADMIN - if("ban") rights |= R_BAN - if("fun") rights |= R_FUN - if("server") rights |= R_SERVER - if("debug") rights |= R_DEBUG - if("permissions","rights") rights |= R_PERMISSIONS - if("possess") rights |= R_POSSESS - if("stealth") rights |= R_STEALTH - if("rejuv","rejuvinate") rights |= R_REJUVINATE - if("varedit") rights |= R_VAREDIT - if("everything","host","all") rights |= ((2 * R_MAXPERMISSION) - 1) - if("sound","sounds") rights |= R_SOUNDS - if("spawn","create") rights |= R_SPAWN - - /* --ONCE FLAGS LARGER OR EQUAL THAN 2^16 = 65536 START BEING USED, USE THIS CODE! - if("nukeeverything") rights += R_NUKEEVERYTHING - */ - - admin_ranks[rank] = rights - previous_rights = rights + var/DBQuery/query = dbcon.NewQuery("SELECT rank, flags FROM erro_admin_ranks") + query.Execute() + while(query.NextRow()) + var/rank_name = ckeyEx(query.item[1]) + var/flags = query.item[2] + if(istext(flags)) flags = text2num(flags) + var/datum/admin_rank/R = new(rank_name, flags) + if(!R) continue + admin_ranks += R #ifdef TESTING var/msg = "Permission Sets Built:\n" - for(var/rank in admin_ranks) - msg += "\t[rank] - [admin_ranks[rank]]\n" + for(var/datum/admin_rank/R in admin_ranks) + msg += "\t[R.name]" + var/rights = rights2text(R.rights,"\n\t\t",R.adds,R.subs) + if(rights) msg += "\t\t[rights]\n" testing(msg) #endif @@ -63,43 +112,39 @@ var/list/admin_ranks = list() //list of all ranks with associated rights C.remove_admin_verbs() C.holder = null admins.Cut() + load_admin_ranks() + var/list/rank_names = list() + for(var/datum/admin_rank/R in admin_ranks) + rank_names[R.name] = R + if(config.admin_legacy_system) - load_admin_ranks() - //load text from file var/list/Lines = file2list("config/admins.txt") //process each line seperately for(var/line in Lines) if(!length(line)) continue - if(copytext(line,1,2) == "#") continue + if(findtextEx(line,"#",1,2)) continue - //Split the line at every "-" - var/list/List = text2list(line, "-") + //Split the line at every "=" + var/list/List = text2list(line, "=") if(!List.len) continue - //ckey is before the first "-" + //ckey is before the first "=" var/ckey = ckey(List[1]) if(!ckey) continue - //rank follows the first "-" + //rank follows the first "=" var/rank = "" if(List.len >= 2) rank = ckeyEx(List[2]) - //load permissions associated with this rank - var/rights = admin_ranks[rank] - - //create the admin datum and store it for later use - var/datum/admins/D = new /datum/admins(rank, rights, ckey) - - //find the client for a ckey if they are connected and associate them with the new admin datum - D.associate(directory[ckey]) + var/datum/admins/D = new(rank_names[rank], ckey) //create the admin datum and store it for later use + if(!D) continue //will occur if an invalid rank is provided + D.associate(directory[ckey]) //find the client for a ckey if they are connected and associate them with the new admin datum else - //The current admin system uses SQL - establish_db_connection() if(!dbcon.IsConnected()) world.log << "Failed to connect to database in load_admins(). Reverting to legacy system." @@ -108,33 +153,20 @@ var/list/admin_ranks = list() //list of all ranks with associated rights load_admins() return - var/DBQuery/query = dbcon.NewQuery("SELECT ckey, rank, level, flags FROM erro_admin") + var/DBQuery/query = dbcon.NewQuery("SELECT ckey, rank FROM erro_admin") query.Execute() while(query.NextRow()) - var/ckey = query.item[1] - var/rank = query.item[2] - if(rank == "Removed") continue //This person was de-adminned. They are only in the admin list for archive purposes. - - var/rights = query.item[4] - if(istext(rights)) rights = text2num(rights) - var/datum/admins/D = new /datum/admins(rank, rights, ckey) - - //find the client for a ckey if they are connected and associate them with the new admin datum - D.associate(directory[ckey]) - if(!admin_datums) - world.log << "The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system." - diary << "The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system." - config.admin_legacy_system = 1 - load_admins() - return + var/ckey = ckey(query.item[1]) + var/rank = ckeyEx(query.item[2]) + var/datum/admins/D = new(rank, ckey) //create the admin datum and store it for later use + if(!D) continue //will occur if an invalid rank is provided + D.associate(directory[ckey]) //find the client for a ckey if they are connected and associate them with the new admin datum #ifdef TESTING var/msg = "Admins Built:\n" for(var/ckey in admin_datums) - var/rank var/datum/admins/D = admin_datums[ckey] - if(D) rank = D.rank - msg += "\t[ckey] - [rank]\n" + msg += "\t[ckey] - [D.rank.name]\n" testing(msg) #endif @@ -143,18 +175,110 @@ var/list/admin_ranks = list() //list of all ranks with associated rights /client/verb/changerank(newrank in admin_ranks) if(holder) holder.rank = newrank - holder.rights = admin_ranks[newrank] else - holder = new /datum/admins(newrank,admin_ranks[newrank],ckey) + holder = new /datum/admins(newrank,ckey) remove_admin_verbs() holder.associate(src) /client/verb/changerights(newrights as num) if(holder) - holder.rights = newrights + holder.rank.rights = newrights else holder = new /datum/admins("testing",newrights,ckey) remove_admin_verbs() holder.associate(src) #endif + +/datum/admins/proc/edit_rights_topic(list/href_list) + if(!check_rights(R_PERMISSIONS)) + message_admins("[key_name_admin(usr)] attempted to edit the admin permissions without sufficient rights.") + log_admin("[key_name(usr)] attempted to edit the admin permissions without sufficient rights.") + return + + var/adm_ckey + var/task = href_list["editrights"] + switch(task) + if("add") + var/new_ckey = ckey(input(usr,"New admin's ckey","Admin ckey", null) as text|null) + if(!new_ckey) return + if(new_ckey in admin_datums) + usr << "Error: Topic 'editrights': [new_ckey] is already an admin" + return + adm_ckey = new_ckey + task = "rank" + else + adm_ckey = ckey(href_list["ckey"]) + if(!adm_ckey) + usr << "Error: Topic 'editrights': No valid ckey" + return + + var/datum/admins/D = admin_datums[adm_ckey] + + switch(task) + if("remove") + if(alert("Are you sure you want to remove [adm_ckey]?","Message","Yes","Cancel") == "Yes") + if(!D) return + admin_datums -= adm_ckey + D.disassociate() + + message_admins("[key_name_admin(usr)] removed [adm_ckey] from the admins list") + log_admin("[key_name(usr)] removed [adm_ckey] from the admins list") + log_admin_rank_modification(adm_ckey, "Removed") + + if("rank") + var/datum/admin_rank/R + + var/list/rank_names = list("*New Rank*") + for(R in admin_ranks) + rank_names[R.name] = R + + var/new_rank = input("Please select a rank", "New rank", null, null) as null|anything in rank_names + + switch(new_rank) + if(null) return + if("*New Rank*") + new_rank = ckeyEx(input("Please input a new rank", "New custom rank", null, null) as null|text) + if(!new_rank) return + + R = rank_names[new_rank] + if(!R) //rank with that name doesn't exist yet - make it + if(D) R = new(new_rank, D.rank.rights, D.rank.adds, D.rank.subs) //duplicate our previous admin_rank but with a new name + else R = new(new_rank) //blank new admin_rank + admin_ranks += R + + if(D) //they were previously an admin + D.disassociate() //existing admin needs to be disassociated + D.rank = R //set the admin_rank as our rank + else + D = new(R,adm_ckey) //new admin + + var/client/C = directory[adm_ckey] //find the client with the specified ckey (if they are logged in) + D.associate(C) //link up with the client and add verbs + + message_admins("[key_name_admin(usr)] edited the admin rank of [adm_ckey] to [new_rank]") + log_admin("[key_name(usr)] edited the admin rank of [adm_ckey] to [new_rank]") + log_admin_rank_modification(adm_ckey, new_rank) + + if("permissions") + if(!D) return //they're not an admin! + + var/keyword = input("Input permission keyword (one at a time):\ne.g. +BAN or -FUN or +/client/proc/someverb", "Permission toggle", null, null) as null|text + if(!keyword) return + + D.disassociate() + + if(!findtext(D.rank.name, "([adm_ckey])")) //not a modified subrank, need to duplicate the admin_rank datum to prevent modifying others too + D.rank = new("[D.rank.name]([adm_ckey])", D.rank.rights, D.rank.adds, D.rank.subs) //duplicate our previous admin_rank but with a new name + //we don't add this clone to the admin_ranks list, as it is unique to that ckey + + D.rank.process_keyword(keyword) + + var/client/C = directory[adm_ckey] //find the client with the specified ckey (if they are logged in) + D.associate(C) //link up with the client and add verbs + + message_admins("[key_name(usr)] added keyword [keyword] to permission of [adm_ckey]") + log_admin("[key_name(usr)] added keyword [keyword] to permission of [adm_ckey]") + log_admin_permission_modification(adm_ckey, D.rank.rights) + + edit_admin_permissions() \ No newline at end of file diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index b5b31aff2a1..df6407153be 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -1,17 +1,11 @@ //admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless var/list/admin_verbs_default = list( - /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/ - /client/proc/game_panel, /*game panel, allows to change game-mode etc*/ - /datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/ - /datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/ /client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/ /client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/ /client/proc/cmd_admin_say, /*admin-only ooc chat*/ /client/proc/hide_verbs, /*hides all our adminverbs*/ /client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/ /client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/ - /client/proc/check_ai_laws, /*shows AI and borg laws*/ - /client/proc/check_antagonists, /*shows all antags*/ /client/proc/admin_memo, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/ /client/proc/deadchat, /*toggles deadchat on/off*/ /client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/ @@ -25,6 +19,11 @@ var/list/admin_verbs_admin = list( /client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/ /client/proc/invisimin, /*allows our mob to go invisible/visible*/ // /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage + /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/ + /client/proc/game_panel, /*game panel, allows to change game-mode etc*/ + /client/proc/check_ai_laws, /*shows AI and borg laws*/ + /datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/ + /datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/ /datum/admins/proc/toggleenter, /*toggles whether people can join the current game*/ /datum/admins/proc/toggleguests, /*toggles whether guests can join the current game*/ /datum/admins/proc/announce, /*priority announce something to all clients.*/ @@ -37,6 +36,7 @@ var/list/admin_verbs_admin = list( /client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/ /client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/ /client/proc/cmd_admin_check_contents, /*displays the contents of an instance*/ + /client/proc/check_antagonists, /*shows all antags*/ /datum/admins/proc/access_news_network, /*allows access of newscasters*/ /client/proc/giveruntimelog, /*allows us to give access to runtime logs to somebody*/ /client/proc/getruntimelog, /*allows us to access runtime logs to somebody*/ @@ -194,19 +194,25 @@ var/list/admin_verbs_hideable = list( /client/proc/add_admin_verbs() if(holder) + var/rights = holder.rank.rights verbs += admin_verbs_default - if(holder.rights & R_BUILDMODE) verbs += /client/proc/togglebuildmodeself - if(holder.rights & R_ADMIN) verbs += admin_verbs_admin - if(holder.rights & R_BAN) verbs += admin_verbs_ban - if(holder.rights & R_FUN) verbs += admin_verbs_fun - if(holder.rights & R_SERVER) verbs += admin_verbs_server - if(holder.rights & R_DEBUG) verbs += admin_verbs_debug - if(holder.rights & R_POSSESS) verbs += admin_verbs_possess - if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions - if(holder.rights & R_STEALTH) verbs += /client/proc/stealth - if(holder.rights & R_REJUVINATE) verbs += admin_verbs_rejuv - if(holder.rights & R_SOUNDS) verbs += admin_verbs_sounds - if(holder.rights & R_SPAWN) verbs += admin_verbs_spawn + if(rights & R_BUILDMODE) verbs += /client/proc/togglebuildmodeself + if(rights & R_ADMIN) verbs += admin_verbs_admin + if(rights & R_BAN) verbs += admin_verbs_ban + if(rights & R_FUN) verbs += admin_verbs_fun + if(rights & R_SERVER) verbs += admin_verbs_server + if(rights & R_DEBUG) verbs += admin_verbs_debug + if(rights & R_POSSESS) verbs += admin_verbs_possess + if(rights & R_PERMISSIONS) verbs += admin_verbs_permissions + if(rights & R_STEALTH) verbs += /client/proc/stealth + if(rights & R_REJUVINATE) verbs += admin_verbs_rejuv + if(rights & R_SOUNDS) verbs += admin_verbs_sounds + if(rights & R_SPAWN) verbs += admin_verbs_spawn + + for(var/path in holder.rank.adds) + verbs += path + for(var/path in holder.rank.subs) + verbs -= path /client/proc/remove_admin_verbs() verbs.Remove( @@ -241,6 +247,8 @@ var/list/admin_verbs_hideable = list( /client/proc/kaboom, /client/proc/cmd_admin_areatest ) + if(holder) + verbs.Remove(holder.rank.adds) /client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs set name = "Adminverbs - Hide Most" diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 00c77eb7d78..cd84af74980 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -1,9 +1,9 @@ var/list/admin_datums = list() /datum/admins - var/rank = "Temporary Admin" + var/datum/admin_rank/rank + var/client/owner = null - var/rights = 0 var/fakekey = null var/datum/marked_datum @@ -13,14 +13,17 @@ var/list/admin_datums = list() var/datum/feed_channel/admincaster_feed_channel = new /datum/feed_channel var/admincaster_signature //What you'll sign the newsfeeds as -/datum/admins/New(initial_rank = "Temporary Admin", initial_rights = 0, ckey) +/datum/admins/New(datum/admin_rank/R, ckey) if(!ckey) error("Admin datum created without a ckey argument. Datum has been deleted") del(src) return + if(!istype(R)) + error("Admin datum created without a rank. Datum has been deleted") + del(src) + return + rank = R admincaster_signature = "Nanotrasen Officer #[rand(0,9)][rand(0,9)][rand(0,9)]" - rank = initial_rank - rights = initial_rights admin_datums[ckey] = src /datum/admins/proc/associate(client/C) @@ -65,14 +68,10 @@ you will have to do something like if(client.rights & R_ADMIN) yourself. if(usr.client.holder) if(!other || !other.holder) return 1 - - var/usr_rights_pt2 = usr.client.holder.rights / 65536 - var/other_rights_pt2 = other.holder.rights / 65536 - if( (usr_rights_pt2 & other_rights_pt2) == other_rights_pt2 ) //Check values larger than 65535 - if(usr.client.holder.rights != other.holder.rights) //Check values smaller than 65536 - if( (usr.client.holder.rights & other.holder.rights) == other.holder.rights ) - return 1 //we have all the rights they have and more - usr << "Error: Cannot proceed. They have more or equal rights to us." + if(usr.client.holder.rank.rights != other.holder.rank.rights) //Check values smaller than 65536 + if( (usr.client.holder.rank.rights & other.holder.rank.rights) == other.holder.rank.rights ) + return 1 //we have all the rights they have and more + usr << "Error: Cannot proceed. They have greater or equal rights to us." return 0 @@ -85,17 +84,8 @@ you will have to do something like if(client.rights & R_ADMIN) yourself. //This proc checks whether subject has at least ONE of the rights specified in rights_required. /proc/check_rights_for(client/subject, rights_required) - if(subject) - if(rights_required) - if(subject.holder) - if(rights_required >= 65536) - var/rights_required_pt2 = rights_required / 65536 - var/rights_pt2 = subject.holder.rights / 65536 - if(rights_required_pt2 & rights_pt2) - return 1 - if(rights_required & subject.holder.rights) - return 1 - else - if(subject.holder) - return 1 + if(subject && subject.holder && subject.holder.rank) + if(rights_required && !(rights_required & subject.holder.rank.rights)) + return 0 + return 1 return 0 \ No newline at end of file diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index 26d1c8b88cf..174dba2ddd7 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -19,21 +19,24 @@
- + + + "} for(var/adm_ckey in admin_datums) var/datum/admins/D = admin_datums[adm_ckey] if(!D) continue - var/rank = D.rank ? D.rank : "*none*" - var/rights = rights2text(D.rights," ") + + var/rights = rights2text(D.rank.rights," ") if(!rights) rights = "*none*" - + output += "" output += "" - output += "" - output += "" + output += "" + output += "" + output += "" output += "" output += {" @@ -42,7 +45,7 @@ "} - usr << browse(output,"window=editrights;size=600x500") + usr << browse(output,"window=editrights;size=900x650") /datum/admins/proc/log_admin_rank_modification(var/adm_ckey, var/new_rank) if(config.admin_legacy_system) return @@ -93,55 +96,30 @@ log_query.Execute() usr << "\blue Admin rank changed." + /datum/admins/proc/log_admin_permission_modification(var/adm_ckey, var/new_permission) if(config.admin_legacy_system) return - - if(!usr.client) - return - - if (check_rights(R_PERMISSIONS)) - return + if(!usr.client) return + if(check_rights(R_PERMISSIONS)) return establish_db_connection() if(!dbcon.IsConnected()) usr << "\red Failed to establish database connection" return - if(!adm_ckey || !new_permission) - return - - adm_ckey = ckey(adm_ckey) - - if(!adm_ckey) - return - - if(istext(new_permission)) - new_permission = text2num(new_permission) - - if(!istext(adm_ckey) || !isnum(new_permission)) + if(!adm_ckey || !istext(adm_ckey) || !isnum(new_permission)) return var/DBQuery/select_query = dbcon.NewQuery("SELECT id, flags FROM erro_admin WHERE ckey = '[adm_ckey]'") select_query.Execute() var/admin_id - var/admin_rights while(select_query.NextRow()) admin_id = text2num(select_query.item[1]) - admin_rights = text2num(select_query.item[2]) - if(!admin_id) - return + if(!admin_id) return - if(admin_rights & new_permission) //This admin already has this permission, so we are removing it. - var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET flags = [admin_rights & ~new_permission] WHERE id = [admin_id]") - insert_query.Execute() - var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Removed permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]');") - log_query.Execute() - usr << "\blue Permission removed." - else //This admin doesn't have this permission, so we are adding it. - var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET flags = '[admin_rights | new_permission]' WHERE id = [admin_id]") - insert_query.Execute() - var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]')") - log_query.Execute() - usr << "\blue Permission added." \ No newline at end of file + var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET flags = [new_permission] WHERE id = [admin_id]") + insert_query.Execute() + var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Edit permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]');") + log_query.Execute() diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 1248e66b118..ce1d1fe1308 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -146,98 +146,7 @@ DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid ) else if(href_list["editrights"]) - if(!check_rights(R_PERMISSIONS)) - message_admins("[key_name_admin(usr)] attempted to edit the admin permissions without sufficient rights.") - log_admin("[key_name(usr)] attempted to edit the admin permissions without sufficient rights.") - return - - var/adm_ckey - - var/task = href_list["editrights"] - if(task == "add") - var/new_ckey = ckey(input(usr,"New admin's ckey","Admin ckey", null) as text|null) - if(!new_ckey) return - if(new_ckey in admin_datums) - usr << "Error: Topic 'editrights': [new_ckey] is already an admin" - return - adm_ckey = new_ckey - task = "rank" - else if(task != "show") - adm_ckey = ckey(href_list["ckey"]) - if(!adm_ckey) - usr << "Error: Topic 'editrights': No valid ckey" - return - - var/datum/admins/D = admin_datums[adm_ckey] - - if(task == "remove") - if(alert("Are you sure you want to remove [adm_ckey]?","Message","Yes","Cancel") == "Yes") - if(!D) return - admin_datums -= adm_ckey - D.disassociate() - - message_admins("[key_name_admin(usr)] removed [adm_ckey] from the admins list") - log_admin("[key_name(usr)] removed [adm_ckey] from the admins list") - log_admin_rank_modification(adm_ckey, "Removed") - - else if(task == "rank") - var/new_rank - if(admin_ranks.len) - new_rank = input("Please select a rank", "New rank", null, null) as null|anything in (admin_ranks|"*New Rank*") - else - new_rank = input("Please select a rank", "New rank", null, null) as null|anything in list("Game Master","Game Admin", "Trial Admin", "Admin Observer","*New Rank*") - - var/rights = 0 - if(D) - rights = D.rights - switch(new_rank) - if(null,"") return - if("*New Rank*") - new_rank = input("Please input a new rank", "New custom rank", null, null) as null|text - if(config.admin_legacy_system) - new_rank = ckeyEx(new_rank) - if(!new_rank) - usr << "Error: Topic 'editrights': Invalid rank" - return - if(config.admin_legacy_system) - if(admin_ranks.len) - if(new_rank in admin_ranks) - rights = admin_ranks[new_rank] //we typed a rank which already exists, use its rights - else - admin_ranks[new_rank] = 0 //add the new rank to admin_ranks - else - if(config.admin_legacy_system) - new_rank = ckeyEx(new_rank) - rights = admin_ranks[new_rank] //we input an existing rank, use its rights - - if(D) - D.disassociate() //remove adminverbs and unlink from client - D.rank = new_rank //update the rank - D.rights = rights //update the rights based on admin_ranks (default: 0) - else - D = new /datum/admins(new_rank, rights, adm_ckey) - - var/client/C = directory[adm_ckey] //find the client with the specified ckey (if they are logged in) - D.associate(C) //link up with the client and add verbs - - message_admins("[key_name_admin(usr)] edited the admin rank of [adm_ckey] to [new_rank]") - log_admin("[key_name(usr)] edited the admin rank of [adm_ckey] to [new_rank]") - log_admin_rank_modification(adm_ckey, new_rank) - - else if(task == "permissions") - if(!D) return - var/list/permissionlist = list() - for(var/i=1, i<=R_MAXPERMISSION, i<<=1) //that <<= is shorthand for i = i << 1. Which is a left bitshift - permissionlist[rights2text(i)] = i - var/new_permission = input("Select a permission to turn on/off", "Permission toggle", null, null) as null|anything in permissionlist - if(!new_permission) return - D.rights ^= permissionlist[new_permission] - - message_admins("[key_name_admin(usr)] toggled the [new_permission] permission of [adm_ckey]") - log_admin("[key_name(usr)] toggled the [new_permission] permission of [adm_ckey]") - log_admin_permission_modification(adm_ckey, permissionlist[new_permission]) - - edit_admin_permissions() + edit_rights_topic(href_list) else if(href_list["call_shuttle"]) if(!check_rights(R_ADMIN)) return @@ -1733,20 +1642,6 @@ ticker.mode.finalize_traitor(A.mind) message_admins("\blue [key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]", 1) log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]") - if("moveminingshuttle") - if(mining_shuttle_moving) - return - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","ShM") - move_mining_shuttle() - message_admins("\blue [key_name_admin(usr)] moved mining shuttle", 1) - log_admin("[key_name(usr)] moved the mining shuttle") - if("moveferry") - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","ShF") - move_ferry() - message_admins("\blue [key_name_admin(usr)] moved the centcom ferry", 1) - log_admin("[key_name(usr)] moved the centcom ferry") if("togglebombcap") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","BC") @@ -2056,6 +1951,20 @@ usr << browse(dat, "window=lawchanges;size=800x500") if("check_antagonist") check_antagonists() + if("moveminingshuttle") + if(mining_shuttle_moving) + return + feedback_inc("admin_secrets_fun_used",1) + feedback_add_details("admin_secrets_fun_used","ShM") + move_mining_shuttle() + message_admins("\blue [key_name_admin(usr)] moved mining shuttle", 1) + log_admin("[key_name(usr)] moved the mining shuttle") + if("moveferry") + feedback_inc("admin_secrets_fun_used",1) + feedback_add_details("admin_secrets_fun_used","ShF") + move_ferry() + message_admins("\blue [key_name_admin(usr)] moved the centcom ferry", 1) + log_admin("[key_name(usr)] moved the centcom ferry") if("kick_all_from_lobby") if(ticker && ticker.current_state == GAME_STATE_PLAYING) var/afkonly = text2num(href_list["afkonly"]) diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 1621b8ea59d..c1441dc4a88 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -10,15 +10,14 @@ var/recorded //the activation message hear_talk(mob/living/M as mob, msg) - if(secured) - if(listening) - recorded = msg - listening = 0 - var/turf/T = get_turf(src) //otherwise it won't work in hand - T.visible_message("\icon[src] beeps, \"Activation message is '[recorded]'.\"") - else - if(findtext(msg, recorded)) - pulse(0) + if(listening) + recorded = msg + listening = 0 + var/turf/T = get_turf(src) //otherwise it won't work in hand + T.visible_message("\icon[src] beeps, \"Activation message is '[recorded]'.\"") + else + if(findtext(msg, recorded)) + pulse(0) activate() if(secured) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 54d2f35038a..2dc35b85ce4 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -210,7 +210,7 @@ datum/preferences dat += "Adminhelp Sound: " dat += "[(toggles & SOUND_ADMINHELP)?"On":"Off"]
" - if(unlock_content || check_rights_for(user, R_ADMIN)) + if(unlock_content || check_rights_for(user.client, R_ADMIN)) dat += "OOC:   Change
" if(unlock_content) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index f40b90c1324..1baca831718 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -7,6 +7,12 @@ w_class = 2 gas_transfer_coefficient = 0.90 +/obj/item/clothing/mask/muzzle/gag + name = "gag" + desc = "Stick this in their mouth to stop the noise." + icon_state = "gag" + w_class = 1 + /obj/item/clothing/mask/muzzle/attack_paw(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user @@ -15,7 +21,6 @@ return ..() - /obj/item/clothing/mask/surgical name = "sterile mask" desc = "A sterile mask designed to help prevent the spread of diseases." diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index db6f8b8fedc..476f4e120be 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -505,6 +505,43 @@ if (istype(O, /obj/item/device/analyzer/plant_analyzer)) user << "- Capsaicin: [reagents.get_reagent_amount("capsaicin")]%" +/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chilli + seed = "/obj/item/seeds/chillighost" + name = "ghost chili" + desc = "It seems to be vibrating gently." + icon_state = "ghostchilipepper" + var/mob/held_mob + New() + ..() + spawn(5) //So potency can be set in the proc that creates these crops + reagents.add_reagent("nutriment", 1+round((potency / 25), 1)) + reagents.add_reagent("capsaicin", 8+round(potency / 2, 1)) + reagents.add_reagent("condensedcapsaicin", 4+round(potency / 4, 1)) + bitesize = 1+round(reagents.total_volume / 4, 1) + +/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chilli/attackby(var/obj/item/O as obj, var/mob/user as mob) + . = ..() + if (istype(O, /obj/item/device/analyzer/plant_analyzer)) + user << "- Capsaicin: [reagents.get_reagent_amount("capsaicin")]%" + +/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chilli/attack_hand(mob/user as mob) + ..() + if( istype(src.loc, /mob) ) + held_mob = src.loc + processing_objects.Add(src) + +/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chilli/process() + if(held_mob && src.loc == held_mob) + if( (held_mob.l_hand == src) || (held_mob.r_hand == src)) + if(hasvar(held_mob,"gloves") && held_mob:gloves) + return + held_mob.bodytemperature += 20 * TEMPERATURE_DAMAGE_COEFFICIENT + if(prob(10)) + held_mob << "Your hand holding [src] burns!" + else + held_mob = null + ..() + /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant seed = "/obj/item/seeds/eggplantseed" name = "eggplant" diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index f2af1a69446..74b271e1b58 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -55,7 +55,7 @@ potency = 20 plant_type = 0 growthstages = 6 - mutatelist = list(/obj/item/seeds/icepepperseed) + mutatelist = list(/obj/item/seeds/icepepperseed, /obj/item/seeds/chillighost) /obj/item/seeds/replicapod @@ -1033,4 +1033,20 @@ return user << "You plant the kudzu. You monster." new /obj/effect/spacevine_controller(user.loc) - del(src) \ No newline at end of file + del(src) + +/obj/item/seeds/chillighost + name = "pack of ghost chilli seeds" + desc = "These seeds grow into a chili said to be the hottest in the galaxy." + icon_state = "seed-chilighost" + species = "chilighost" + plantname = "chilighost" + product = /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chilli + lifespan = 20 + endurance = 10 + maturation = 10 + production = 10 + yield = 3 + potency = 20 + plant_type = 0 + growthstages = 6 diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm index 902454ba214..b085b222fb9 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -12,38 +12,11 @@ var/m_type = 1 var/message - switch(act) - if ("burp") //Alphabetical please. - if (!muzzled) - message = "[src] burps." - m_type = 2 - + switch(act) //Alphabetical please if ("deathgasp") message = "[src] lets out a waning guttural screech, green blood bubbling from its maw..." m_type = 2 - if ("choke") - message = "[src] chokes." - m_type = 2 - - if ("collapse") - Paralyse(2) - message = "[src] collapses!" - m_type = 2 - - if ("dance") - if (!src.restrained()) - message = "[src] dances around happily." - m_type = 1 - - if ("drool") - message = "[src] drools." - m_type = 1 - - if ("gasp") - message = "[src] gasps." - m_type = 2 - if ("gnarl") if (!muzzled) message = "[src] gnarls and shows its teeth.." @@ -54,18 +27,10 @@ message = "[src] hisses." m_type = 2 - if ("jump") - message = "[src] jumps!" - m_type = 1 - if ("moan") message = "[src] moans!" m_type = 2 - if ("nod") - message = "[src] nods its head." - m_type = 1 - if ("roar") if (!muzzled) message = "[src] roars." @@ -86,10 +51,6 @@ message = "[src] scretches." m_type = 2 - if ("shake") - message = "[src] shakes its head." - m_type = 1 - if ("shiver") message = "[src] shivers." m_type = 2 @@ -99,36 +60,15 @@ message = text("[src] signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) m_type = 1 - if ("sit") - message = "[src] sits down." - m_type = 1 - - if ("sulk") - message = "[src] sulks down sadly." - m_type = 1 - - if ("sway") - message = "[src] sways around dizzily." - m_type = 1 - if ("tail") message = "[src] waves its tail." m_type = 1 - if ("twitch") - message = "[src] twitches violently." - m_type = 1 - - if ("whimper") - if (!muzzled) - message = "[src] whimpers." - m_type = 2 - if ("help") //This is an exception - src << "Help for xenomorph emotes. You can use these emotes with say \"*emote\":\nburp, deathgasp, choke, collapse, dance, drool, gasp, gnarl, hiss, jump, moan, nod, roar, roll, scratch, \nscretch, shake, shiver, sign-#, sit, sulk, sway, tail, twitch, whimper" + src << "Help for xenomorph emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow, burp, choke, chucke, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, giggle, glare-(none)/mob, gnarl, hiss, jump, laugh, look-atom, me, moan, nod, point-atom, roar, roll, scream, scratch, scretch, shake, shiver, sign-#, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tail, tremble, twitch, twitch_s, wave, whimper, wink, yawn" else - src << "\blue Unusable emote '[act]'. Say *help for a list." + ..(act) if ((message && src.stat == 0)) log_emote("[name]/[key] : [message]") diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm index 6904d97871e..6a9120a111f 100644 --- a/code/modules/mob/living/carbon/alien/larva/emote.dm +++ b/code/modules/mob/living/carbon/alien/larva/emote.dm @@ -97,7 +97,7 @@ m_type = 2 if ("help") //"The exception" - src << "Help for larva emotes. You can use these emotes with say \"*emote\":\nburp, choke, collapse, dance, drool, gasp, gnarl, hiss, jump, moan, nod, roll, scratch,\nscretch, shake, shiver, sign-#, sulk, sway, tail, twitch, whimper" + src << "Help for larva emotes. You can use these emotes with say \"*emote\":\n\nburp, choke, collapse, dance, drool, gasp, gnarl, hiss, jump, moan, nod, roll, scratch,\nscretch, shake, shiver, sign-#, sulk, sway, tail, twitch, whimper" else src << "\blue Unusable emote '[act]'. Say *help for a list." diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index b63b3164c7a..09123ac0670 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -26,13 +26,9 @@ var/const/MAX_ACTIVE_TIME = 400 var/attached = 0 -/obj/item/clothing/mask/facehugger/attack_paw(user as mob) //can be picked up by aliens - if(isalien(user)) - attack_hand(user) - return - else - ..() - return +/obj/item/clothing/mask/facehugger/attack_alien(user as mob) //can be picked up by aliens + attack_hand(user) + return /obj/item/clothing/mask/facehugger/attack_hand(user as mob) if((stat == CONSCIOUS && !sterile) && !isalien(user)) diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm new file mode 100644 index 00000000000..7f4865797ea --- /dev/null +++ b/code/modules/mob/living/carbon/emote.dm @@ -0,0 +1,346 @@ +//This only assumes that the mob has a body and face with at least one eye, and one mouth. +//Things like airguitar can be done without arms, and the flap thing makes so little sense it's a keeper. +//Intended to be called by a higher up emote proc if the requested emote isn't in the custom emotes. + +/mob/living/carbon/emote(var/act,var/m_type=1,var/message = null) + var/param = null + + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + param = copytext(act, t1 + 1, length(act) + 1) + act = copytext(act, 1, t1) + + if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' + act = copytext(act,1,length(act)) + + var/muzzled = (src.wear_mask && istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) + //var/m_type = 1 + + switch(act)//Even carbon organisms want it alphabetically ordered.. + if ("aflap") + if (!src.restrained()) + message = "[src] flaps \his wings ANGRILY!" + m_type = 2 + + if ("airguitar") + if (!src.restrained()) + message = "[src] is strumming the air and headbanging like a safari chimp." + m_type = 1 + + if ("blink") + message = "[src] blinks." + m_type = 1 + + if ("blink_r") + message = "[src] blinks rapidly." + m_type = 1 + + if ("blush") + message = "[src] blushes." + m_type = 1 + + if ("bow") + if (!src.buckled) + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] bows to [param]." + else + message = "[src] bows." + m_type = 1 + + + if ("burp") + if (!muzzled) + message = "[src] burps." + m_type = 2 + + if ("choke") + if (!muzzled) + message = "[src] chokes!" + m_type = 2 + else + message = "[src] makes a strong noise." + m_type = 2 + + if ("chuckle") + if (!muzzled) + message = "[src] chuckles." + m_type = 2 + else + message = "[src] makes a noise." + m_type = 2 + + if ("clap") + if (!src.restrained()) + message = "[src] claps." + m_type = 2 + + if ("collapse") + Paralyse(2) + message = "[src] collapses!" + m_type = 2 + + if ("cough") + if (!muzzled) + message = "[src] coughs!" + m_type = 2 + else + message = "[src] makes a strong noise." + m_type = 2 + + if ("dance") + if (!src.restrained()) + message = "[src] dances around happily." + m_type = 1 + + + if ("deathgasp") + message = "[src] seizes up and falls limp, \his eyes dead and lifeless..." + m_type = 1 + + if ("drool") + message = "[src] drools." + m_type = 1 + + if ("faint") + message = "[src] faints." + if(src.sleeping) + return //Can't faint while asleep + src.sleeping += 10 //Short-short nap + m_type = 1 + + if ("flap") + if (!src.restrained()) + message = "[src] flaps \his wings." + m_type = 2 + + if ("frown") + message = "[src] frowns." + m_type = 1 + + if ("gasp") + if (!muzzled) + message = "[src] gasps!" + m_type = 2 + else + message = "[src] makes a weak noise." + m_type = 2 + + if ("giggle") + if (!muzzled) + message = "[src] giggles." + m_type = 2 + else + message = "[src] makes a noise." + m_type = 2 + + if ("glare") + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] glares at [param]." + else + message = "[src] glares." + + if ("grin") + message = "[src] grins." + m_type = 1 + + if ("jump") + message = "[src] jumps!" + m_type = 1 + + if ("laugh") + if (!muzzled) + message = "[src] laughs." + m_type = 2 + else + message = "[src] makes a noise." + + if ("look") + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] looks at [param]." + else + message = "[src] looks." + m_type = 1 + + if ("me") + if (src.client) + if(client.prefs.muted & MUTE_IC) + src << "You cannot send IC messages (muted)." + return + if (src.client.handle_spam_prevention(message,MUTE_IC)) + return + if (stat) + return + if(!(message)) + return + else + message = "[src] [message]" + + if ("nod") + message = "[src] nods /his head." + m_type = 1 + + if ("point") + if (!src.restrained()) + var/mob/M = null + if (param) + for (var/atom/A as mob|obj|turf|area in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + message = "[src] points." + else + M.point() + if (M) + message = "[src] points to [M]." + else + m_type = 1 + + if ("scream") + if (!muzzled) + message = "[src] screams!" + m_type = 2 + else + message = "[src] makes a very loud noise." + m_type = 2 + + if ("shake") + message = "[src] shakes \his head." + m_type = 1 + + if ("sit") + message = "[src] sits down." + m_type = 1 + + if ("smile") + message = "[src] smiles." + m_type = 1 + + if ("sneeze") + if (!muzzled) + message = "[src] sneezes." + m_type = 2 + else + message = "[src] makes a strange noise." + m_type = 2 + + if ("sniff") + message = "[src] sniffs." + m_type = 2 + + if ("snore") + if (!muzzled) + message = "[src] snores." + m_type = 2 + else + message = "[src] makes a noise." + m_type = 2 + + if ("stare") + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] stares at [param]." + else + message = "[src] stares." + + if ("sulk") + message = "[src] sulks down sadly." + m_type = 1 + + if ("sway") + message = "[src] sways around dizzily." + m_type = 1 + + if ("tremble") + message = "[src] trembles in fear!" + m_type = 1 + + if ("twitch") + message = "[src] twitches violently." + m_type = 1 + + if ("twitch_s") + message = "[src] twitches." + m_type = 1 + + if ("wave") + message = "[src] waves." + m_type = 1 + + if ("whimper") + if (!muzzled) + message = "[src] whimpers." + m_type = 2 + else + message = "[src] makes a weak noise." + m_type = 2 + + if ("wink") + message = "[src] winks." + m_type = 1 + + if ("yawn") + if (!muzzled) + message = "[src] yawns." + m_type = 2 + + if ("help") + src << "Help for emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, giggle, glare-(none)/mob, grin, jump, laugh, look, me, nod, point-atom, scream, shake, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tremble, twitch, twitch_s, wave, whimper, wink, yawn" + + else + ..(act) + + + + + + if (message) + log_emote("[name]/[key] : [message]") + + //Hearing gasp and such every five seconds is not good emotes were not global for a reason. + // Maybe some people are okay with that. + + for(var/mob/M in dead_mob_list) + if(!M.client || istype(M, /mob/new_player)) + continue //skip monkeys, leavers and new players + if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) + M.show_message(message) + + + if (m_type & 1) + for (var/mob/O in viewers(src, null)) + O.show_message(message, m_type) + else if (m_type & 2) + for (var/mob/O in hearers(src.loc, null)) + O.show_message(message, m_type) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 2c7be0bc704..ddb3ed5221a 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -19,44 +19,74 @@ if(src.stat == 2.0 && (act != "deathgasp")) return switch(act) //Please keep this alphabetically ordered when adding or changing emotes. - if ("aflap") + if ("aflap") //Any emote on human that uses miming must be left in, oh well. if (!src.restrained()) message = "[src] flaps \his wings ANGRILY!" m_type = 2 if(miming) m_type = 1 - if ("airguitar") + + if ("choke") + if(miming) + message = "[src] clutches \his throat desperately!" + m_type = 1 + else + if (!muzzled) + message = "[src] chokes!" + m_type = 2 + else + message = "[src] makes a strong noise." + m_type = 2 + + if ("chuckle") + if(miming) + message = "[src] appears to chuckle." + m_type = 1 + else + if (!muzzled) + message = "[src] chuckles." + m_type = 2 + else + message = "[src] makes a noise." + m_type = 2 + + if ("clap") if (!src.restrained()) - message = "[src] is strumming the air and headbanging like a safari chimp." + message = "[src] claps." + m_type = 2 + if(miming) + m_type = 1 + + if ("collapse") + Paralyse(2) + message = "[src] collapses!" + m_type = 2 + if(miming) m_type = 1 - if ("blink") - message = "[src] blinks." - m_type = 1 - - if ("blink_r") - message = "[src] blinks rapidly." - m_type = 1 - - if ("blush") - message = "[src] blushes." - m_type = 1 - - if ("bow") - if (!src.buckled) - var/M = null - if (param) - for (var/mob/A in view(1, src)) - if (param == A.name) - M = A - break - if (!M) - param = null - if (param) - message = "[src] bows to [param]." + if ("cough") + if(miming) + message = "[src] appears to cough!" + m_type = 1 + else + if (!muzzled) + message = "[src] coughs!" + m_type = 2 else - message = "[src] bows." - m_type = 1 + message = "[src] makes a strong noise." + m_type = 2 + + if ("cry") + if(miming) + message = "[src] cries." + m_type = 1 + else + if (!muzzled) + message = "[src] cries." + m_type = 2 + else + message = "[src] makes a weak noise. \He frowns." + m_type = 2 if ("choke") if(miming) @@ -160,25 +190,10 @@ else message = "[src] sadly can't find anybody to give daps to, and daps \himself. Shameful." - if ("deathgasp") - message = "[src] seizes up and falls limp, \his eyes dead and lifeless..." - m_type = 1 - - if ("drool") - message = "[src] drools." - m_type = 1 - if ("eyebrow") message = "[src] raises an eyebrow." m_type = 1 - if ("faint") - message = "[src] faints." - if(src.sleeping) - return //Can't faint while asleep - src.sleeping += 10 //Short-short nap - m_type = 1 - if ("flap") if (!src.restrained()) message = "[src] flaps \his wings." @@ -186,10 +201,6 @@ if(miming) m_type = 1 - if ("frown") - message = "[src] frowns." - m_type = 1 - if ("gasp") if(miming) message = "[src] appears to be gasping!" @@ -214,20 +225,6 @@ message = "[src] makes a noise." m_type = 2 - if ("glare") - var/M = null - if (param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if (!M) - param = null - if (param) - message = "[src] glares at [param]." - else - message = "[src] glares." - if ("grin") message = "[src] grins." m_type = 1 @@ -260,7 +257,7 @@ if (!src.restrained() && !src.r_hand) var/mob/M = null if (param) - for (var/mob/A in view(1, null)) + for (var/mob/A in view(1, src)) if (param == A.name) M = A break @@ -277,7 +274,7 @@ if (!src.restrained()) var/M = null if (param) - for (var/mob/A in view(1, null)) + for (var/mob/A in view(1, src)) if (param == A.name) M = A break @@ -302,17 +299,62 @@ message = "[src] says, \"[M], please. He had a family.\" [src.name] takes a drag from a cigarette and blows \his name out in smoke." m_type = 2 - if ("laugh") - if(miming) - message = "[src] acts out a laugh." - m_type = 1 + if ("handshake") + m_type = 1 + if (!src.restrained() && !src.r_hand) + var/mob/M = null + if (param) + for (var/mob/A in view(1, null)) + if (param == A.name) + M = A + break + if (M == src) + M = null + if (M) + if (M.canmove && !M.r_hand && !M.restrained()) + message = "[src] shakes hands with [M]." + else + message = "[src] holds out \his hand to [M]." + + if ("look") + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] looks at [param]." else - if (!muzzled) - message = "[src] laughs." - m_type = 2 - else - message = "[src] makes a noise." - m_type = 2 + message = "[src] looks." + m_type = 1 + + if ("me") + if(silent) + return + if (src.client) + if (client.prefs.muted & MUTE_IC) + src << "\red You cannot send IC messages (muted)." + return + if (src.client.handle_spam_prevention(message,MUTE_IC)) + return + if (stat) + return + if(!(message)) + return + if(copytext(message,1,5) == "says") + src << "\red Invalid emote." + return + else if(copytext(message,1,9) == "exclaims") + src << "\red Invalid emote." + return + else if(copytext(message,1,5) == "asks") + src << "\red Invalid emote." + return + else + message = "[src] [message]" if ("look") var/M = null @@ -343,31 +385,6 @@ if(miming) m_type = 1 - if ("me") - if(silent) - return - if (src.client) - if (client.prefs.muted & MUTE_IC) - src << "\red You cannot send IC messages (muted)." - return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return - if (stat) - return - if(!(message)) - return - if(copytext(message,1,5) == "says") - src << "\red Invalid emote." - return - else if(copytext(message,1,9) == "exclaims") - src << "\red Invalid emote." - return - else if(copytext(message,1,5) == "asks") - src << "\red Invalid emote." - return - else - message = "[src] [message]" - if ("nod") message = "[src] nods." m_type = 1 @@ -376,23 +393,6 @@ message = "[src] goes pale for a second." m_type = 1 - if ("point") - if (!src.restrained()) - var/mob/M = null - if (param) - for (var/atom/A as mob|obj|turf|area in view(null, null)) - if (param == A.name) - M = A - break - if (!M) - message = "[src] points." - else - M.point() - if (M) - message = "[src] points to [M]." - else - m_type = 1 - if ("raise") if (!src.restrained()) message = "[src] raises a hand." @@ -426,9 +426,11 @@ message = "[src] makes a very loud noise." m_type = 2 - if ("shake") - message = "[src] shakes \his head." - m_type = 1 + if ("shiver") + message = "[src] shivers." + m_type = 2 + if(miming) + m_type = 1 if ("shiver") message = "[src] shivers." @@ -462,10 +464,6 @@ message = "[src] raises [t1] finger\s." m_type = 1 - if ("smile") - message = "[src] smiles." - m_type = 1 - if ("sneeze") if (miming) message = "[src] sneezes." @@ -538,10 +536,6 @@ message = "[src] makes a weak noise." m_type = 2 - if ("wink") - message = "[src] winks." - m_type = 1 - if ("yawn") if (!muzzled) message = "[src] yawns." @@ -550,10 +544,10 @@ m_type = 1 if ("help") //This can stay at the bottom. - src << "Help for human emotes. You can use these emotes with say \"*emote\":\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, choke, chuckle, clap, collapse, \ncough, cry, custom, dap, deathgasp, drool, eyebrow, faint, frown, flap, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, \nhug-(none)/mob, johnny, laugh, look-(none)/mob, moan, mumble, me, nod, pale, point-(atom), raise, \nsalute, scream, shake, shiver, shrug, sigh, signal-#1-10, smile, sneeze, sniff, snore, \nstare-(none)/mob, tremble, twitch, twitch_s, wave, whimper, wink, yawn" + src << "Help for human emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, dance, dap, deathgasp, drool, eyebrow, faint, frown, flap, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, johnny, jump, laugh, look-(none)/mob, me, moan, mumble, nod, pale, point-(atom), raise, salute, scream, shake, shiver, shrug, sigh, signal-#1-10, smile, sneeze, sniff, snore, stare-(none)/mob, tremble, twitch, twitch_s, wave, whimper, wink, yawn" else - src << "\blue Unusable emote '[act]'. Say *help for a list." + ..(act) diff --git a/code/modules/mob/living/carbon/metroid/emote.dm b/code/modules/mob/living/carbon/metroid/emote.dm index 13d4ec212b3..727e73aa395 100644 --- a/code/modules/mob/living/carbon/metroid/emote.dm +++ b/code/modules/mob/living/carbon/metroid/emote.dm @@ -46,7 +46,7 @@ m_type = 1 if ("help") //This is an exception - src << "Help for slime emotes. You can use these emotes with say \"*emote\":\nbounce, jiggle, light, moan, shiver, sway, twitch, vibrate" + src << "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, jiggle, light, moan, shiver, sway, twitch, vibrate" else src << "\blue Unusable emote '[act]'. Say *help for a list." diff --git a/code/modules/mob/living/carbon/monkey/emote.dm b/code/modules/mob/living/carbon/monkey/emote.dm index 0407198f62a..573c9c42f23 100644 --- a/code/modules/mob/living/carbon/monkey/emote.dm +++ b/code/modules/mob/living/carbon/monkey/emote.dm @@ -14,46 +14,15 @@ var/message switch(act) //Ooh ooh ah ah keep this alphabetical ooh ooh ah ah! - if ("choke") - message = "[src] chokes." - m_type = 2 - - if ("collapse") - Paralyse(2) - message = "[src] collapses!" - m_type = 2 - - if ("dance") - if (!src.restrained()) - message = "[src] dances around happily." - m_type = 1 - if ("deathgasp") message = "[src] lets out a faint chimper as it collapses and stops moving..." m_type = 1 - if ("drool") - message = "[src] drools." - m_type = 1 - - if ("gasp") - message = "[src] gasps." - m_type = 2 - if ("gnarl") if (!muzzled) message = "[src] gnarls and shows its teeth.." m_type = 2 - if ("giggle") - if (!muzzled) - message = "[src] giggles happily." - m_type = 2 - - if ("jump") - message = "[src] jumps!" - m_type = 1 - if ("paw") if (!src.restrained()) message = "[src] flails its paw." @@ -63,10 +32,6 @@ message = "[src] moans!" m_type = 2 - if ("nod") - message = "[src] nods its head." - m_type = 1 - if ("roar") if (!muzzled) message = "[src] roars." @@ -87,10 +52,6 @@ message = "[src] scretches." m_type = 2 - if ("shake") - message = "[src] shakes its head." - m_type = 1 - if ("shiver") message = "[src] shivers." m_type = 2 @@ -100,35 +61,16 @@ message = text("[src] signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) m_type = 1 - if ("sit") - message = "[src] sits down." - m_type = 1 - - if ("sulk") - message = "[src] sulks down sadly." - m_type = 1 - - if ("sway") - message = "[src] sways around dizzily." - m_type = 1 - if ("tail") message = "[src] waves its tail." m_type = 1 - if ("twitch") - message = "[src] twitches violently." - m_type = 1 - - if ("whimper") - if (!muzzled) - message = "[src] whimpers." - m_type = 2 - if ("help") //Ooh ah ooh ooh this is an exception to alphabetical ooh ooh. - src << "Help for monkey emotes. You can use these emotes with say \"*emote\":\nchoke, collapse, dance, deathgasp, drool, gasp, gnarl, giggle, jump, paw, moan, nod, roar, roll, scratch, scretch, \nshake, shiver, sign-#, sit, sulk, sway, tail, twitch, whimper" + src << "Help for monkey emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow, choke, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, gnarl, giggle, glare-(none)/mob, grin, jump, laugh, paw, me, moan, nod, roar, roll, point-atom, scream, scratch, scretch, shake, shiver, sign-#, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tail, tremble, twitch, twitch_s, whimper, yawn" + else - src << text("Invalid Emote: []", act) + ..(act) + if ((message && src.stat == 0)) if(src.client) log_emote("[name]/[key] : [message]") diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm new file mode 100644 index 00000000000..59f66c57fe5 --- /dev/null +++ b/code/modules/mob/living/emote.dm @@ -0,0 +1,283 @@ +//This only assumes that the mob has a body and face with at least one mouth. +//Things like airguitar can be done without arms, and the flap thing makes so little sense it's a keeper. +//Intended to be called by a higher up emote proc if the requested emote isn't in the custom emotes. + +/mob/living/emote(var/act,var/m_type=1,var/message = null) + var/param = null + + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + param = copytext(act, t1 + 1, length(act) + 1) + act = copytext(act, 1, t1) + + if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' + act = copytext(act,1,length(act)) + + switch(act)//Hello, how would you like to order? Alphabetically! + if ("aflap") + if (!src.restrained()) + message = "[src] flaps its wings ANGRILY!" + m_type = 2 + + if ("blush") + message = "[src] blushes." + m_type = 1 + + if ("bow") + if (!src.buckled) + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] bows to [param]." + else + message = "[src] bows." + m_type = 1 + + if ("burp") + message = "[src] burps." + m_type = 2 + + if ("choke") + message = "[src] chokes!" + m_type = 2 + + if ("chuckle") + message = "[src] chuckles." + m_type = 2 + + if ("collapse") + Paralyse(2) + message = "[src] collapses!" + m_type = 2 + + if ("cough") + message = "[src] coughs!" + m_type = 2 + + if ("dance") + if (!src.restrained()) + message = "[src] dances around happily." + m_type = 1 + + + if ("deathgasp") + message = "[src] seizes up and falls limp, its eyes dead and lifeless..." + m_type = 1 + + if ("drool") + message = "[src] drools." + m_type = 1 + + if ("faint") + message = "[src] faints." + if(src.sleeping) + return //Can't faint while asleep + src.sleeping += 10 //Short-short nap + m_type = 1 + + if ("flap") + if (!src.restrained()) + message = "[src] flaps its wings." + m_type = 2 + + if ("frown") + message = "[src] frowns." + m_type = 1 + + if ("gasp") + message = "[src] gasps!" + m_type = 2 + + if ("giggle") + message = "[src] giggles." + m_type = 2 + + if ("glare") + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] glares at [param]." + else + message = "[src] glares." + + if ("grin") + message = "[src] grins." + m_type = 1 + + if ("jump") + message = "[src] jumps!" + m_type = 1 + + if ("laugh") + message = "[src] laughs." + m_type = 2 + + if ("look") + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] looks at [param]." + else + message = "[src] looks." + m_type = 1 + + if ("me") + if (src.client) + if(client.prefs.muted & MUTE_IC) + src << "You cannot send IC messages (muted)." + return + if (src.client.handle_spam_prevention(message,MUTE_IC)) + return + if (stat) + return + if(!(message)) + return + else + message = "[src] [message]" + + if ("nod") + message = "[src] nods its head." + m_type = 1 + + if ("point") + if (!src.restrained()) + var/mob/M = null + if (param) + for (var/atom/A as mob|obj|turf|area in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + message = "[src] points." + else + M.point() + if (M) + message = "[src] points to [M]." + else + m_type = 1 + + if ("scream") + message = "[src] screams!" + m_type = 2 + + if ("shake") + message = "[src] shakes its head." + m_type = 1 + + if ("sit") + message = "[src] sits down." + m_type = 1 + + if ("smile") + message = "[src] smiles." + m_type = 1 + + if ("sneeze") + message = "[src] sneezes." + m_type = 2 + + if ("sniff") + message = "[src] sniffs." + m_type = 2 + + if ("snore") + message = "[src] snores." + m_type = 2 + + if ("stare") + var/M = null + if (param) + for (var/mob/A in view(1, src)) + if (param == A.name) + M = A + break + if (!M) + param = null + if (param) + message = "[src] stares at [param]." + else + message = "[src] stares." + + if ("sulk") + message = "[src] sulks down sadly." + m_type = 1 + + if ("sway") + message = "[src] sways around dizzily." + m_type = 1 + + if ("tremble") + message = "[src] trembles in fear!" + m_type = 1 + + if ("twitch") + message = "[src] twitches violently." + m_type = 1 + + if ("twitch_s") + message = "[src] twitches." + m_type = 1 + + if ("wave") + message = "[src] waves." + m_type = 1 + + if ("whimper") + message = "[src] whimpers." + m_type = 2 + + if ("wink") + message = "[src] winks." + m_type = 1 + + if ("yawn") + message = "[src] yawns." + m_type = 2 + + if ("help") + src << "Help for emotes. You can use these emotes with say \"*emote\":\n\naflap, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, giggle, glare-(none)/mob, grin, jump, laugh, look, me, nod, point-atom, scream, shake, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tremble, twitch, twitch_s, wave, whimper, wink, yawn" + + else + src << "\blue Unusable emote '[act]'. Say *help for a list." + + + + + + if (message) + log_emote("[name]/[key] : [message]") + + //Hearing gasp and such every five seconds is not good emotes were not global for a reason. + // Maybe some people are okay with that. + + for(var/mob/M in dead_mob_list) + if(!M.client || istype(M, /mob/new_player)) + continue //skip monkeys, leavers and new players + if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) + M.show_message(message) + + + if (m_type & 1) + for (var/mob/O in viewers(src, null)) + O.show_message(message, m_type) + else if (m_type & 2) + for (var/mob/O in hearers(src.loc, null)) + O.show_message(message, m_type) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 04e9f332cbb..0a902e97fad 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -8,11 +8,12 @@ if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' act = copytext(act,1,length(act)) - switch(act) + switch(act)//01000001011011000111000001101000011000010110001001100101011101000110100101111010011001010110010000100001 (Seriously please keep it that way.) if ("aflap") if (!src.restrained()) message = "[src] flaps \his wings ANGRILY!" m_type = 2 + m_type = 1 if("beep") var/M = null @@ -23,6 +24,7 @@ break if(!M) param = null + if (param) message = "[src] beeps at [param]." else @@ -46,7 +48,7 @@ message = "[src] bows." m_type = 1 - if("buzz") + if ("buzz") var/M = null if(param) for (var/mob/A in view(1, src)) @@ -55,6 +57,7 @@ break if(!M) param = null + if (param) message = "[src] buzzes at [param]." else @@ -117,7 +120,6 @@ message = "[src] looks at [param]." else message = "[src] looks." - m_type = 1 if ("me") if (src.client) @@ -137,7 +139,7 @@ message = "[src] nods." m_type = 1 - if("ping") + if ("ping") var/M = null if(param) for (var/mob/A in view(1, src)) @@ -168,7 +170,6 @@ message = "[src] salutes to [param]." else message = "[src] salutes." - m_type = 1 if ("stare") var/M = null @@ -183,6 +184,7 @@ message = "[src] stares at [param]." else message = "[src] stares." + m_type = 1 if ("twitch") message = "[src] twitches violently." @@ -193,7 +195,7 @@ m_type = 1 if ("help") - src << "Help for cyborg emotes. You can use these emotes with say \"*emote\":\naflap, beep-(none)/mob, bow-(none)/mob, buzz-(none)/mob, clap, custom, deathgasp, \nflap, glare-(none)/mob, look-(none)/mob, me, nod, ping-(none)/mob, \nsalute-(none)/mob, stare-(none)/mob, twitch, twitch_s," + src << "Help for cyborg emotes. You can use these emotes with say \"*emote\":\n\naflap, beep-(none)/mob, bow-(none)/mob, buzz-(none)/mob, clap, custom, deathgasp, flap, glare-(none)/mob, look-(none)/mob, me, nod, ping-(none)/mob, \nsalute-(none)/mob, twitch, twitch_s," else src << "\blue Unusable emote '[act]'. Say *help for a list." diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm index 5e515bf6007..8a723ae1dd2 100644 --- a/code/modules/mob/living/simple_animal/friendly/pug.dm +++ b/code/modules/mob/living/simple_animal/friendly/pug.dm @@ -9,7 +9,7 @@ speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") speak_emote = list("barks", "woofs") emote_hear = list("barks", "woofs", "yaps","pants") - emote_see = list("shakes its head", "shivers") + emote_see = list("shakes its head", "chases its tail","shivers") speak_chance = 1 turns_per_move = 10 meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/pug @@ -18,3 +18,25 @@ response_disarm = "bops" response_harm = "kicks" see_in_dark = 5 + +/mob/living/simple_animal/pug/Life() + ..() + + if(!stat && !resting && !buckled) + if(prob(1)) + emote(pick("chases its tail")) + spawn(0) + for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) + dir = i + sleep(1) + +/mob/living/simple_animal/pug/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri + if(istype(O, /obj/item/weapon/newspaper)) + if(!stat) + user.visible_message("\blue [user] baps [name] on the nose with the rolled up [O]") + spawn(0) + for(var/i in list(1,2,4,8,4,2,1,2)) + dir = i + sleep(1) + else + ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index dfb8d060e4e..5df695605d8 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -380,7 +380,7 @@ var/list/slot_equipment_priority = list( \ set category = "OOC" var/is_admin = 0 - if(client.holder && (client.holder.rights & R_ADMIN)) + if(check_rights_for(client,R_ADMIN)) is_admin = 1 else if(stat != DEAD || istype(src, /mob/new_player)) usr << "\blue You must be observing to use this!" diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index fa7567bcb28..1265b211f9e 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -50,6 +50,23 @@ ammo_type = "/obj/item/ammo_casing/c9mm" max_ammo = 30 +/obj/item/ammo_magazine/mc10mm + name = "magazine (10mm)" + icon_state = "9x19p" + origin_tech = "combat=2" + ammo_type = "/obj/item/ammo_casing/c10mm" + max_ammo = 8 + multiple_sprites = 1 + +/obj/item/ammo_magazine/mc10mm/empty + max_ammo = 0 + +/obj/item/ammo_magazine/c10mm + name = "Ammunition Box (10mm)" + icon_state = "9mm" + origin_tech = "combat=2" + ammo_type = "/obj/item/ammo_casing/c10mm" + max_ammo = 30 /obj/item/ammo_magazine/c45 diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index cdfc77fa27e..fa954a847c5 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -32,6 +32,12 @@ projectile_type = "/obj/item/projectile/bullet/weakbullet" +/obj/item/ammo_casing/c10mm + desc = "A 10mm bullet casing." + caliber = "10mm" + projectile_type = "/obj/item/projectile/bullet/midbullet3" + + /obj/item/ammo_casing/c9mm desc = "A 9mm bullet casing." caliber = "9mm" diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index c7748091e9f..66ce2d5ed3f 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -86,19 +86,19 @@ /obj/item/weapon/gun/projectile/pistol name = "\improper Stechtkin pistol" - desc = "A small, easily concealable gun. Uses 9mm rounds." + desc = "A small, easily concealable gun. Uses 10mm rounds." icon_state = "pistol" w_class = 2 max_shells = 8 - caliber = "9mm" + caliber = "10mm" silenced = 0 origin_tech = "combat=2;materials=2;syndicate=2" - ammo_type = "/obj/item/ammo_casing/c9mm" + ammo_type = "/obj/item/ammo_casing/c10mm" load_method = 2 /obj/item/weapon/gun/projectile/pistol/New() ..() - empty_mag = new /obj/item/ammo_magazine/mc9mm/empty(src) + empty_mag = new /obj/item/ammo_magazine/mc10mm/empty(src) return /obj/item/weapon/gun/projectile/pistol/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 8918df034fa..0591d18bafa 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -21,6 +21,12 @@ /obj/item/projectile/bullet/midbullet2 damage = 25 + +/obj/item/projectile/bullet/midbullet3 //Only used with the Stechkin Pistol - RobRichards + damage = 30 + + + /obj/item/projectile/bullet/suffocationbullet//How does this even work? name = "co bullet" damage = 20 diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index a6808aa024b..90e14363791 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -484,6 +484,7 @@ datum if(M.canmove && istype(M.loc, /turf/space)) step(M, pick(cardinal)) if(prob(5)) M.emote(pick("twitch","drool","moan")) + M.adjustBrainLoss(2) ..() return @@ -793,7 +794,6 @@ datum O.clean_blood() reaction_turf(var/turf/T, var/volume) if(volume >= 1) - T.overlays.Cut() T.clean_blood() for(var/obj/effect/decal/cleanable/C in src) del(C) @@ -1261,6 +1261,7 @@ datum M.drowsyness = 0 M.stuttering = 0 M.confused = 0 + M.reagents.remove_all_type(/datum/reagent/ethanol, 1*REM, 0, 1) ..() return @@ -1801,6 +1802,12 @@ datum victim.Weaken(3) victim.drop_item() + on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(prob(5)) + M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]") + return + frostoil name = "Frost Oil" id = "frostoil" diff --git a/config/admin_ranks.txt b/config/admin_ranks.txt index 2a33adb3b80..67c08182b01 100644 --- a/config/admin_ranks.txt +++ b/config/admin_ranks.txt @@ -1,15 +1,15 @@ -######################################################################################## -# 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 # -######################################################################################## +############################################################################################################## +# ADMIN RANK DEFINES # +# The format of this is very simple. Rank name goes first. # +# Rank is CASE-SENSITIVE, all punctuation save for '-', '_' and '@' will be stripped so spaces don't matter. # +# You can then define permissions for each rank by adding a '=' followed by keywords # +# These keywords represent groups of verbs and abilities. # +# keywords are preceded by either a '+' or a '-', + adds permissions, - takes them away. # +# +@ (or +prev) is a special shorthand which adds all the rights of the rank above it. # +# You can also specify verbs like so +/client/proc/some_added_verb or -/client/proc/some_restricted_verb # +# 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 @@ -28,13 +28,13 @@ # +EVERYTHING (or +HOST or +ALL) = Simply gives you everything without having to type every flag Admin Observer -Moderator +ADMIN -Admin Candidate +@ -Trial Admin +@ +SPAWN +REJUV +VAREDIT +BAN -Badmin +@ +POSSESS +BUILDMODE +SERVER +FUN -Game Admin +@ +STEALTH +SOUNDS +DEBUG -Game Master +EVERYTHING +Moderator = +ADMIN +Admin Candidate = +@ +Trial Admin = +@ +SPAWN +REJUV +VAREDIT +BAN +Badmin = +@ +POSSESS +BUILDMODE +SERVER +FUN +Game Admin = +@ +STEALTH +SOUNDS +DEBUG +Game Master = +EVERYTHING -Host +EVERYTHING +Host = +EVERYTHING -Coder +DEBUG +VAREDIT +SERVER +SPAWN \ No newline at end of file +Coder = +DEBUG +VAREDIT +SERVER +SPAWN \ No newline at end of file diff --git a/config/admins.txt b/config/admins.txt index 15095ab4cfb..47a6a1e9acf 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -1,30 +1,32 @@ -###################################################################### -# Basically, ckey goes first. Rank goes after the "-" # -# Case is not important for ckey. # -# Case IS important for the rank. However punctuation/spaces are not # -# Ranks can be anything defined in admin_ranks.txt ~Carn # -###################################################################### +############################################################################################### +# Basically, ckey goes first. Rank goes after the "=" # +# Case is not important for ckey. # +# Case IS important for the rank. # +# All punctuation (spaces etc) EXCEPT '-', '_' and '@' will be stripped from rank names. # +# Ranks can be anything defined in admin_ranks.txt # +# NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn # +# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # +############################################################################################### -quarxink - Game Master -tle - Game Master -xsi - Game Master -scaredofshadows - Game Master -neofite - Game Master -trubblebass - Game Master -mport2004 - Game Master -deuryn - Game Master -agouri - Game Master -errorage - Game Master -superxpdude - Game Master -petethegoat - Game Master -korphaeron - Game Master -nodrak - Game Master -carnwennan - Game Master -ikarrus - Game Master -cheridan - Game Master -giacomand - Game Master -rockdtben - Game Master -sieve - Game Master -aranclanos - Game Master -intigracy - Game Master -faerdan - Game Master \ No newline at end of file +quarxink = Game Master +tle = Game Master +xsi = Game Master +scaredofshadows = Game Master +neofite = Game Master +trubblebass = Game Master +mport2004 = Game Master +deuryn = Game Master +agouri = Game Master +errorage = Game Master +superxpdude = Game Master +petethegoat = Game Master +korphaeron = Game Master +nodrak = Game Master +carnwennan = Game Master +ikarrus = Game Master +cheridan = Game Master +giacomand = Game Master +rockdtben = Game Master +sieve = Game Master +aranclanos = Game Master +intigracy = Game Master \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index d5c4ac7093c..e23f79119b3 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,15 @@ should be listed in the changelog upon commit tho. Thanks. --> +
+

30 August 2013

+

Cael_Aislinn updated:

+
    +
  • Terbs Fun Week Day 1: Added ghost chilis as a mutation of chili plants. Be careful, they're one of the hottest foods in the galaxy!
  • +
+
+ +

21 August 2013

Dumpdavidson updated:

@@ -60,17 +69,7 @@ should be listed in the changelog upon commit tho. Thanks. -->
  • Replaced the EMP grenades from the uplink with an EMP kit. The kit contains a grenade, an implant and a flashlight with 5 uses that can EMP any object or mob in melee range.
  • - -
    -

    13 August 2013

    -

    Giacom updated:

    -
      -
    • Malf AIs now have a new power which will spawn a "borging machine". This machine will turn living humans into loyal cyborgs which the AI can use to take over the station with. The AI will limit themselves by using this ability, such as no shunting, and the machine will have a long cooldown usage.
    • -
    -
    - -

    18 August 2013

    @@ -80,9 +79,19 @@ should be listed in the changelog upon commit tho. Thanks. -->
  • Added date to PDA
  • - +
    +

    13 August 2013

    +

    Giacom updated:

    +
      +
    • Malf AIs now have a new power which will spawn a "borging machine". This machine will turn living humans into loyal cyborgs which the AI can use to take over the station with. The AI will limit themselves by using this ability, such as no shunting, and the machine will have a long cooldown usage.
    • +
    +
    + + + +

    12 August 2013

    Giacom updated:

    diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index ececd091e69..25a1015df37 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 5ff5f8632fc..e4b492d46bc 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/monkey.dmi b/icons/mob/monkey.dmi index 09d84e286b9..2e579a26033 100644 Binary files a/icons/mob/monkey.dmi and b/icons/mob/monkey.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index e7698a58535..69cf56300c6 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/harvest.dmi b/icons/obj/harvest.dmi index 55946eb018e..8a1a1a4fea8 100644 Binary files a/icons/obj/harvest.dmi and b/icons/obj/harvest.dmi differ diff --git a/icons/obj/hydroponics.dmi b/icons/obj/hydroponics.dmi index 1f9e2e52c15..b3574c05716 100644 Binary files a/icons/obj/hydroponics.dmi and b/icons/obj/hydroponics.dmi differ diff --git a/icons/obj/seeds.dmi b/icons/obj/seeds.dmi index 50528f91cfb..cd02f476fe4 100644 Binary files a/icons/obj/seeds.dmi and b/icons/obj/seeds.dmi differ diff --git a/maps/RandomZLevels/fileList.txt b/maps/RandomZLevels/fileList.txt index 3708b54e329..178a5710adc 100644 --- a/maps/RandomZLevels/fileList.txt +++ b/maps/RandomZLevels/fileList.txt @@ -11,4 +11,5 @@ #maps/RandomZLevels/Academy.dmm #maps/RandomZLevels/wildwest.dmm #maps/RandomZLevels/challenge.dmm -#maps/RandomZLevels/listeningpost.dmm \ No newline at end of file +#maps/RandomZLevels/listeningpost.dmm +#maps/RandomZLevels/spacehotel.dmm \ No newline at end of file diff --git a/maps/RandomZLevels/spacehotel.dmm b/maps/RandomZLevels/spacehotel.dmm new file mode 100644 index 00000000000..77f6eed4de0 --- /dev/null +++ b/maps/RandomZLevels/spacehotel.dmm @@ -0,0 +1,329 @@ +"aa" = (/turf/space,/area) +"ab" = (/turf/unsimulated/wall,/area) +"ac" = (/turf/unsimulated/wall,/area/awaymission) +"ad" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/wall,/area/awaymission) +"ae" = (/obj/machinery/power/apc{step_y = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/unsimulated/wall,/area/awaymission) +"af" = (/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission) +"ag" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/awaymission) +"ah" = (/obj/item/weapon/cable_coil/random,/obj/effect/decal/remains/human,/turf/simulated/floor/plating,/area/awaymission) +"ai" = (/turf/simulated/floor/plating,/area/awaymission) +"aj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/awaymission) +"ak" = (/obj/machinery/power/smes/magical,/turf/simulated/shuttle/plating,/area/awaymission) +"al" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/awaymission) +"am" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/awaymission) +"an" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/awaymission) +"ao" = (/turf/simulated/wall,/area/awaymission) +"ap" = (/obj/machinery/door/airlock/highsecurity,/turf/simulated/floor/plating,/area/awaymission) +"aq" = (/turf/unsimulated/beach/water,/area/awaymission) +"ar" = (/obj/structure/window/basic{dir = 4},/obj/machinery/shower,/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/awaymission) +"as" = (/obj/structure/rack,/obj/item/clothing/suit/apron,/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/holidaypriest,/obj/item/clothing/suit/judgerobe,/obj/item/clothing/suit/labcoat,/obj/item/clothing/suit/nun,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/wizrobe/fake,/obj/item/clothing/suit/wizrobe/marisa/fake,/obj/effect/decal/cleanable/greenglow,/turf/simulated/floor/carpet,/area/awaymission) +"at" = (/obj/structure/rack,/obj/item/clothing/head/collectable/police,/obj/item/clothing/head/nun_hood,/obj/item/clothing/head/mailman,/obj/item/clothing/head/nursehat,/obj/item/clothing/head/wizard/fake,/obj/item/clothing/head/powdered_wig,/obj/item/clothing/head/wizard/marisa/fake,/obj/machinery/camera{c_tag = "Gold Suite"; c_tag_order = 999; network = list("Hotel")},/obj/item/clothing/mask/gas/sexyclown,/turf/simulated/floor/carpet,/area/awaymission) +"au" = (/obj/structure/rack,/obj/item/clothing/gloves/latex,/obj/item/clothing/gloves/latex,/obj/item/clothing/head/kitty,/obj/item/clothing/head/rabbitears,/obj/item/clothing/mask/muzzle,/obj/item/clothing/tie/stethoscope,/turf/simulated/floor/carpet,/area/awaymission) +"av" = (/obj/structure/dresser,/turf/simulated/floor/carpet,/area/awaymission) +"aw" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/carpet,/area/awaymission) +"ax" = (/obj/structure/rack,/obj/item/clothing/suit/apron,/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/holidaypriest,/obj/item/clothing/suit/judgerobe,/obj/item/clothing/suit/labcoat,/obj/item/clothing/suit/nun,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/wizrobe/fake,/obj/item/clothing/suit/xenos,/obj/item/clothing/suit/wizrobe/marisa/fake,/turf/simulated/floor/carpet,/area/awaymission) +"ay" = (/obj/structure/rack,/obj/item/clothing/head/collectable/police,/obj/item/clothing/head/nun_hood,/obj/item/clothing/head/mailman,/obj/item/clothing/head/nursehat,/obj/item/clothing/head/wizard/fake,/obj/item/clothing/head/powdered_wig,/obj/item/clothing/head/xenos,/obj/item/clothing/head/wizard/marisa/fake,/obj/machinery/camera{c_tag = "Silver Suite"; c_tag_order = 999; network = list("Hotel")},/obj/item/clothing/mask/gas/sexyclown,/turf/simulated/floor/carpet,/area/awaymission) +"az" = (/turf/simulated/floor/wood,/area/awaymission) +"aA" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Bathroom1"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"aB" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Bathroom2"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"aC" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"aD" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/camera{c_tag = "Locker Room"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"aE" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Bathroom3"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"aF" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Bathroom4"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"aG" = (/obj/structure/window/basic{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/awaymission) +"aH" = (/turf/simulated/floor/carpet,/area/awaymission) +"aI" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/captain,/turf/simulated/floor/carpet,/area/awaymission) +"aJ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/hop,/turf/simulated/floor/carpet,/area/awaymission) +"aK" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/wood,/area/awaymission) +"aL" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/wood,/area/awaymission) +"aM" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/wood,/area/awaymission) +"aN" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"aO" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"aP" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"aQ" = (/obj/machinery/light{dir = 8},/obj/item/weapon/soap/deluxe,/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/awaymission) +"aR" = (/turf/simulated/floor{dir = 1; icon_state = "whiteblue"},/area/awaymission) +"aS" = (/obj/structure/window/basic{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/awaymission) +"aT" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/wood,/area/awaymission) +"aU" = (/obj/machinery/gateway/centeraway,/turf/simulated/floor/wood,/area/awaymission) +"aV" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/wood,/area/awaymission) +"aW" = (/obj/machinery/door/airlock,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"aX" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"aY" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"aZ" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"ba" = (/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"bb" = (/obj/machinery/door_control{id = "Gold Suite"; name = "Gold Suite Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission) +"bc" = (/obj/machinery/door_control{id = "Silver Suite"; name = "Silver Suite Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission) +"bd" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/wood,/area/awaymission) +"be" = (/obj/machinery/gateway,/turf/simulated/floor/wood,/area/awaymission) +"bf" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/wood,/area/awaymission) +"bg" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"bh" = (/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"bi" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"bj" = (/obj/structure/mirror,/obj/structure/sink{icon_state = "sink"; dir = 4; pixel_x = -12; pixel_y = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"bk" = (/obj/machinery/door/airlock/gold{id_tag = "Gold Suite"; name = "Gold Suite"},/turf/simulated/floor/carpet,/area/awaymission) +"bl" = (/obj/machinery/door/airlock/silver{id_tag = "Silver Suite"; name = "Silver Suite"},/turf/simulated/floor/carpet,/area/awaymission) +"bm" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area) +"bn" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet,/area/awaymission) +"bo" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area) +"bp" = (/turf/simulated/floor/carpet{icon_state = "carpetsymbol"},/area/awaymission) +"bq" = (/obj/machinery/light,/turf/simulated/floor/carpet,/area/awaymission) +"br" = (/obj/structure/stool/bed/chair/comfy,/turf/simulated/floor/carpet,/area/awaymission) +"bs" = (/turf/unsimulated/wall/fakeglass,/area) +"bt" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/carpet,/area/awaymission) +"bu" = (/obj/machinery/light{dir = 8},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/carpet,/area/awaymission) +"bv" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet,/area/awaymission) +"bw" = (/turf/simulated/floor{dir = 2; icon_state = "whitebluecorner"},/area/awaymission) +"bx" = (/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/awaymission) +"by" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{dir = 8; icon_state = "whitebluecorner"},/area/awaymission) +"bz" = (/obj/machinery/door/airlock{id_tag = "Room301"; name = "Room301"},/turf/simulated/floor,/area/awaymission) +"bA" = (/obj/machinery/door/airlock{id_tag = "Room302"; name = "Room302"},/turf/simulated/floor,/area/awaymission) +"bB" = (/obj/machinery/door/airlock{id_tag = "Room303"; name = "Room303"},/turf/simulated/floor,/area/awaymission) +"bC" = (/turf/simulated/floor{dir = 4; icon_state = "whiteblue"},/area/awaymission) +"bD" = (/turf/simulated/shuttle/floor,/area/awaymission) +"bE" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/awaymission) +"bF" = (/obj/machinery/camera{c_tag = "Room 301"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) +"bG" = (/obj/machinery/door_control{name = "Room301 Bolt Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; id = "Room301"; normaldoorcontrol = 1; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"bH" = (/obj/machinery/camera{c_tag = "Room 302"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) +"bI" = (/obj/machinery/door_control{id = "Room302"; name = "Room302 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"bJ" = (/obj/structure/dresser,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/turf/simulated/floor/carpet,/area/awaymission) +"bK" = (/obj/machinery/camera{c_tag = "Room 303"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) +"bL" = (/obj/machinery/door_control{id = "Room303"; name = "Room303 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"bM" = (/obj/machinery/light{dir = 1},/turf/unsimulated/beach/water,/area/awaymission) +"bN" = (/turf/simulated/floor{dir = 8; icon_state = "whiteblue"},/area/awaymission) +"bO" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission) +"bP" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/turf/simulated/floor/carpet,/area/awaymission) +"bQ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/carpet,/area/awaymission) +"bR" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area) +"bS" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission) +"bT" = (/obj/structure/window/basic,/turf/simulated/floor/carpet,/area/awaymission) +"bU" = (/obj/machinery/door/window/southright,/turf/simulated/floor/carpet,/area/awaymission) +"bV" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaymission) +"bW" = (/obj/structure/mirror,/turf/simulated/wall,/area/awaymission) +"bX" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"bY" = (/obj/machinery/shower{dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"bZ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/effect/decal/cleanable/vomit/old,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"ca" = (/obj/structure/toilet{dir = 1},/obj/effect/decal/cleanable/vomit/old,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"cb" = (/obj/machinery/light{dir = 8},/turf/unsimulated/beach/water,/area/awaymission) +"cc" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/beach/water,/area/awaymission) +"cd" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission) +"ce" = (/obj/machinery/door/airlock{id_tag = "Room201"; name = "Room201"},/turf/simulated/floor,/area/awaymission) +"cf" = (/obj/machinery/door/airlock{id_tag = "Room202"; name = "Room202"},/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor,/area/awaymission) +"cg" = (/obj/machinery/door/airlock{id_tag = "Room203"; name = "Room203"},/turf/simulated/floor,/area/awaymission) +"ch" = (/obj/machinery/camera{c_tag = "Room 201"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) +"ci" = (/obj/machinery/door_control{id = "Room201"; name = "Room201 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"cj" = (/obj/structure/dresser,/obj/item/weapon/lipstick/jade,/turf/simulated/floor/carpet,/area/awaymission) +"ck" = (/obj/machinery/camera{c_tag = "Room 202"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) +"cl" = (/obj/machinery/door_control{id = "Room202"; name = "Room202 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"cm" = (/obj/machinery/camera{c_tag = "Room 203"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) +"cn" = (/obj/machinery/door_control{id = "Room203"; name = "Room203 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"co" = (/obj/structure/dresser,/obj/item/weapon/lipstick/purple,/turf/simulated/floor/carpet,/area/awaymission) +"cp" = (/obj/machinery/light,/turf/unsimulated/beach/water,/area/awaymission) +"cq" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/green,/turf/simulated/floor/carpet,/area/awaymission) +"cr" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet,/area/awaymission) +"cs" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet,/area/awaymission) +"ct" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/purple,/turf/simulated/floor/carpet,/area/awaymission) +"cu" = (/obj/item/weapon/beach_ball,/turf/simulated/shuttle/floor,/area/awaymission) +"cv" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/flour{desc = "Rather caked in there."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission) +"cw" = (/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/awaymission) +"cx" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/awaymission) +"cy" = (/obj/machinery/door/window/southright,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet,/area/awaymission) +"cz" = (/obj/structure/window/basic,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet,/area/awaymission) +"cA" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/carpet,/area/awaymission) +"cB" = (/obj/structure/table,/turf/simulated/floor/carpet,/area/awaymission) +"cC" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"cD" = (/obj/structure/stool,/turf/simulated/floor/carpet,/area/awaymission) +"cE" = (/obj/machinery/door/airlock{id_tag = "Room101"; name = "Room101"},/turf/simulated/floor,/area/awaymission) +"cF" = (/obj/machinery/door/airlock{id_tag = "Room102"; name = "Room102"},/turf/simulated/floor,/area/awaymission) +"cG" = (/obj/machinery/door/airlock{id_tag = "Room103"; name = "Room103"},/turf/simulated/floor,/area/awaymission) +"cH" = (/obj/machinery/camera{c_tag = "Room 101"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) +"cI" = (/obj/machinery/door_control{id = "Room101"; name = "Room101 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"cJ" = (/obj/structure/dresser,/obj/item/clothing/head/xenos,/turf/simulated/floor/carpet,/area/awaymission) +"cK" = (/obj/machinery/camera{c_tag = "Room 102"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) +"cL" = (/obj/machinery/door_control{id = "Room102"; name = "Room102 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"cM" = (/obj/effect/decal/cleanable/blood/gibs/old,/turf/simulated/floor/carpet,/area/awaymission) +"cN" = (/obj/machinery/camera{c_tag = "Room 103"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission) +"cO" = (/obj/machinery/door_control{id = "Room103"; name = "Room103 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"cP" = (/turf/simulated/floor,/area/awaymission) +"cQ" = (/mob/living/simple_animal/hostile/retaliate/goat,/turf/simulated/floor,/area/awaymission) +"cR" = (/mob/living/carbon/alien/humanoid/queen{bodytemperature = 31000.1; maxHealth = 0; suiciding = 0},/turf/simulated/floor/carpet,/area/awaymission) +"cS" = (/obj/structure/stool/bed/nest,/turf/simulated/floor/carpet,/area/awaymission) +"cT" = (/obj/structure/stool/bed/alien,/obj/item/xenos_claw,/turf/simulated/floor/carpet,/area/awaymission) +"cU" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/yellow,/turf/simulated/floor/carpet,/area/awaymission) +"cV" = (/obj/machinery/light{dir = 8},/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission) +"cW" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission) +"cX" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/red,/turf/simulated/floor/carpet,/area/awaymission) +"cY" = (/obj/machinery/vending/coffee,/turf/simulated/floor,/area/awaymission) +"cZ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/turf/simulated/floor,/area/awaymission) +"da" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor,/area/awaymission) +"db" = (/obj/machinery/atmospherics/pipe/simple{color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/structure/table,/turf/simulated/floor,/area/awaymission) +"dc" = (/obj/structure/table,/turf/simulated/floor,/area/awaymission) +"dd" = (/obj/effect/gibspawner/xeno,/turf/simulated/floor/carpet,/area/awaymission) +"de" = (/obj/effect/decal/remains/human,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"df" = (/obj/structure/stool/bed/alien,/obj/item/clothing/suit/xenos,/turf/simulated/floor/carpet,/area/awaymission) +"dg" = (/obj/structure/optable,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission) +"dh" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/red,/obj/effect/decal/cleanable/blood/gibs/old,/turf/simulated/floor/carpet,/area/awaymission) +"di" = (/obj/machinery/vending/boozeomat,/turf/simulated/floor,/area/awaymission) +"dj" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/turf/simulated/floor,/area/awaymission) +"dk" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor,/area/awaymission) +"dl" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor,/area/awaymission) +"dm" = (/obj/machinery/atmospherics/pipe/simple{color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/structure/table,/obj/item/weapon/book/manual/chef_recipes,/turf/simulated/floor,/area/awaymission) +"dn" = (/obj/structure/window/basic,/obj/structure/alien/weeds/node,/turf/simulated/floor/carpet,/area/awaymission) +"do" = (/obj/structure/window/basic,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/carpet,/area/awaymission) +"dp" = (/obj/machinery/door/window/southright,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/carpet,/area/awaymission) +"dq" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/black,/turf/simulated/floor/carpet,/area/awaymission) +"dr" = (/obj/structure/window/basic,/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/blood/gibs/old,/turf/simulated/floor/carpet,/area/awaymission) +"ds" = (/obj/structure/window/basic,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission) +"dt" = (/obj/machinery/door/window/southright,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission) +"du" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor,/area/awaymission) +"dv" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/alien/weeds,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"dw" = (/obj/structure/toilet{dir = 1},/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/item/alien_embryo,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"dx" = (/obj/machinery/door/window/eastleft,/obj/structure/alien/weeds,/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"dy" = (/obj/machinery/shower{dir = 8},/obj/structure/alien/egg,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/awaymission) +"dz" = (/obj/machinery/light,/turf/simulated/floor,/area/awaymission) +"dA" = (/obj/machinery/processor,/turf/simulated/floor,/area/awaymission) +"dB" = (/obj/machinery/chem_master/condimaster,/turf/simulated/floor,/area/awaymission) +"dC" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor,/area/awaymission) +"dD" = (/obj/structure/table,/obj/machinery/microwave,/turf/simulated/floor,/area/awaymission) +"dE" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/simulated/floor,/area/awaymission) +"dF" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor,/area/awaymission) +"dG" = (/obj/structure/kitchenspike,/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/awaymission) +"dH" = (/obj/machinery/door/airlock,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor,/area/awaymission) +"dI" = (/obj/item/weapon/bananapeel,/obj/item/toy/spinningtoy,/turf/simulated/floor/carpet,/area/awaymission) +"dJ" = (/obj/structure/barricade/wooden,/turf/simulated/floor/carpet,/area/awaymission) +"dK" = (/obj/item/target/syndicate,/turf/simulated/floor/carpet,/area/awaymission) +"dL" = (/obj/item/trash/candy,/turf/simulated/floor/carpet,/area/awaymission) +"dM" = (/obj/item/toy/spinningtoy,/turf/simulated/floor/carpet,/area/awaymission) +"dN" = (/obj/item/toy/crossbow,/turf/simulated/floor/carpet,/area/awaymission) +"dO" = (/obj/structure/barricade/wooden,/obj/structure/barricade/wooden,/turf/simulated/floor/carpet,/area/awaymission) +"dP" = (/obj/machinery/door/airlock,/turf/simulated/floor/carpet,/area/awaymission) +"dQ" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/wall,/area/awaymission) +"dR" = (/obj/effect/decal/remains/human,/obj/item/clothing/head/soft/red,/turf/simulated/floor/carpet,/area/awaymission) +"dS" = (/obj/item/toy/prize/honk,/turf/simulated/floor/carpet,/area/awaymission) +"dT" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/carpet,/area/awaymission) +"dU" = (/obj/machinery/vending/sovietsoda,/turf/simulated/floor/carpet,/area/awaymission) +"dV" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 4; network = "Hotel"; use_power = 1},/turf/simulated/floor/carpet,/area/awaymission) +"dW" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"dX" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; network = "Hotel"; use_power = 0},/turf/simulated/floor/carpet,/area/awaymission) +"dY" = (/turf/simulated/wall/cult,/area/awaymission) +"dZ" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/engine/cult,/area/awaymission) +"ea" = (/obj/effect/decal/remains/human,/turf/simulated/floor/carpet,/area/awaymission) +"eb" = (/obj/item/trash/candle,/obj/item/trash/candle,/obj/item/trash/candle,/turf/simulated/floor/carpet,/area/awaymission) +"ec" = (/obj/machinery/vending/snack,/turf/simulated/floor/carpet,/area/awaymission) +"ed" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission) +"ee" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/carpet,/area/awaymission) +"ef" = (/turf/simulated/floor/engine/cult,/area/awaymission) +"eg" = (/obj/effect/gibspawner/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/engine/cult,/area/awaymission) +"eh" = (/obj/item/toy/sword,/turf/simulated/floor/carpet,/area/awaymission) +"ei" = (/obj/machinery/vending/cola,/turf/simulated/floor/carpet,/area/awaymission) +"ej" = (/obj/item/candle,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/engine/cult,/area/awaymission) +"ek" = (/obj/effect/rune,/obj/item/organ/brain,/turf/simulated/floor/engine/cult,/area/awaymission) +"el" = (/obj/item/candle,/turf/simulated/floor/engine/cult,/area/awaymission) +"em" = (/obj/item/weapon/tome,/turf/simulated/floor/engine/cult,/area/awaymission) +"en" = (/obj/effect/rune,/turf/simulated/floor/engine/cult,/area/awaymission) +"eo" = (/obj/structure/stool/bed/chair/comfy,/obj/item/device/soulstone,/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/remains/human,/turf/simulated/floor/engine/cult,/area/awaymission) +"ep" = (/obj/effect/rune,/obj/item/organ/heart,/turf/simulated/floor/engine/cult,/area/awaymission) +"eq" = (/obj/effect/gibspawner/human,/turf/simulated/floor/engine/cult,/area/awaymission) +"er" = (/obj/item/trash/sosjerky,/turf/simulated/floor/carpet,/area/awaymission) +"es" = (/obj/structure/table/woodentable,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor/carpet,/area/awaymission) +"et" = (/obj/item/latexballon,/obj/item/latexballon,/turf/simulated/floor/carpet,/area/awaymission) +"eu" = (/obj/structure/rack,/obj/item/key,/obj/item/key,/obj/item/key,/obj/item/key,/obj/item/key,/turf/simulated/floor/carpet,/area/awaymission) +"ev" = (/obj/structure/stool/bed/chair/comfy,/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission) +"ew" = (/obj/structure/stool/bed/chair/comfy,/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission) +"ex" = (/obj/item/weapon/legcuffs,/turf/simulated/floor/engine/cult,/area/awaymission) +"ey" = (/obj/machinery/space_heater,/turf/simulated/floor/carpet,/area/awaymission) +"ez" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaymission) +"eA" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 1; network = "Hotel"; use_power = 0},/turf/simulated/floor/carpet,/area/awaymission) +"eB" = (/obj/item/weapon/melee/cultblade,/turf/simulated/floor/engine/cult,/area/awaymission) +"eC" = (/obj/item/weapon/butch{blood_DNA = 1e+009},/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/engine/cult,/area/awaymission) +"eD" = (/obj/structure/table/woodentable,/obj/item/weapon/pen,/turf/simulated/floor/carpet,/area/awaymission) +"eE" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission) +"eF" = (/obj/structure/table/woodentable,/obj/item/weapon/clipboard,/obj/item/weapon/paper,/turf/simulated/floor/carpet,/area/awaymission) +"eG" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/carpet,/area/awaymission) +"eH" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/turf/simulated/floor/carpet,/area/awaymission) +"eI" = (/turf/unsimulated/wall/fakeglass{dir = 10; icon_state = "fakewindows"},/area) +"eJ" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area) +"eK" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area) +"eL" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/simulated/floor/plating,/area/awaymission) +"eM" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/awaymission) +"eN" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaymission) +"eO" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area) +"eP" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaymission) +"eQ" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/plating,/area/awaymission) +"eR" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/awaymission) +"eS" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/wall{icon_state = "swallc4"; dir = 2},/area/awaymission) +"eT" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor,/area/awaymission) +"eU" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/awaymission) +"eV" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor,/area/awaymission) +"eW" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/simulated/floor/plating/airless,/area/awaymission) +"eX" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/awaymission) +"eY" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission) +"eZ" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor,/area/awaymission) +"fa" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission) +"fb" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/awaymission) +"fc" = (/turf/simulated/shuttle/wall{icon_state = "swallc1"; dir = 2},/area/awaymission) +"fd" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor,/area/awaymission) +"fe" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission) +"ff" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/awaymission) + +(1,1,1) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacadacacacaeacacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacafagahaiaiaiajaiaiaiaiaiaiacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaabababababababababababababababababababacakalamamamamanaiaiaiaiaiaiacababababababababababababababababababaaaaaaaaaa +aaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoapaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoabaaaaaaaaaa +aaaaaaabaoaqaqarasatauavawaoaqaqaraxayauavawaoazazazazazazazazazazazazazaoaAaoaBaoaCaCaCaDaCaCaCaoaEaoaFaoaoabaaaaaaaaaa +aaaaaaabaoaqaqaGaHaHaHaHaIaoaqaqaGaHaHaHaHaJaoaHazazazazaKaLaMazazazazaoaoaNaoaNaoaOaNaNaNaNaNaPaoaNaoaNaoaoabaaaaaaaaaa +aaaaaaabaoaQaRaSaHaHaHaHaIaoaQaRaSaHaHaHaHaJaoaHaHazazazaTaUaVazazazaHaoaoaWaoaWaoaoaoaoaWaoaoaoaoaWaoaWaoaoabaaaaaaaaaa +aaaaaaabaoaXaYaZaHaHbaaHbbaoaXaYaZaHaHbaaHbcaoaHaHaHazazbdbebfazazaHaHaobgaNaNaNaNaNbhaNaNaNbhaNaNbibiaNbjaoababaaaaaaaa +aaaaaaabaoaoaoaobkbkaoaoaoaoaoaoaoblblaoaoaoaoaHaHaHaHazazazazazazaHaHaoaoaoaoaoaoaoaoaNaNaNaoaoaoaoaoaoaoaoaoabaaaaaaaa +aaaaaaaabmaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHazazazazaHaHaHaHbnaHaHaHaHaHaHbnaHaHaHbnaHaHaHaHaHaHbnaoabaaaaaaaa +aaaaaaaaboaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHaHaHbqaHbqaHaHaHaHaHaHaHbraHaHbraHaHbraHaHbraHaHbraHaHaHaoabaaaaaaaa +aaaaaaaabsaHaHaHaHaHbqaHaHaHaHaHbqaHaHaHaHaHaHaHaHaHaHbtaobuaobvaHaHaHbwbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbyaoabaaaaaaaa +aaaaaaabaoaoaobzaoaoaoaoaobAaoaoaoaoaobBaoaoaoaHaHaHaHaHbnaHbnaHaHaHaHbCbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbEaoabaaaaaaaa +aaaaaaabaoaHbFbGaHavaoaHbHbIaHbJaoaHbKbLaHavaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDaqaqaqaqaqaqaqbMaqaqaqaqaqaqaqbDbNbmaaaaaaaaaa +aaaaaaabaobvaHbaaHbOaobvaHaHaHbPaobvaHaHaHbQaoaHaHaHaHaHbpaHbpaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa +aaaaaaaabRaHaHaHaHbSaoaHaHaHaHbPaoaHaHaHaHbQaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa +aaaaaaabaobTbTbUbTbVaobTbTbUbTbVaobTbTbUbTbVaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa +aaaaaaabbWbXaYaZbYaobWbXaYaZbYaobWbZcaaZbYaoaoaHaHaHaHaHbpaHbpaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa +aaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDcbaqaqaqaqaqaqaqaqaqaqaqaqaqccbDbNboaaaaaaaaaa +aaaaaaaabmaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHbqaHbqaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa +aaaaaaaaboaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHaHbtaobuaobvaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa +aaaaaaaabsaHaHaHaHaHbqaHaHcdcdaHbqaHaHaHaHaHaHaHaHaHaHaHbnaHbnaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa +aaaaaaabaoaoaoceaoaoaoaoaocfaoaoaoaoaocgaoaoaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa +aaaaaaabaoaHchciaHcjaoaHckclaHavaoaHcmcnaHcoaoaHaHaHaHaHbpaHbpaHaHaHaHbCbDaqaqaqaqaqaqaqcpaqaqaqaqaqaqaqbDbNbsaaaaaaaaaa +aaaaaaabaobvaHaHaHcqaocrcrcrcrcsaobvaHaHaHctaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDbDbDcubDbDbDbDbDbDbDbDbDbDbDbDbDbEaoabaaaaaaaa +aaaaaaaabRaHaHaHaHcqaoaHcrcrcrcvaoaHaHaHaHctaoaHaHaHaHaHaHaHaHaHaHaHaHcwaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRcxaoabaaaaaaaa +aaaaaaabaobTbTbUbTbVaobTbTcyczbVaobTbTbUbTbVaoaHaHaHaHaHbpaHbpaHaHaHaobvaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHbmaaaaaaaaaa +aaaaaaabbWbXaYaZbYaobWbXaYaZbYaobWbXaYaZbYaoaoaHaHaHaHaHaHaHaHaHaHaHaHaHcAcBcCcAcBcCcAcBcCcAcBcCcAcBcCcAcBcCboaaaaaaaaaa +aaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaHaHaHaHaHaHaHaHaHaHaHaobvaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHboaaaaaaaaaa +aaaaaaaabmaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHbqaHbqaHaHaHaHaHcAcBcCcAcBcCcAcBcCcAcBcCcAcBcCcAcBcCboaaaaaaaaaa +aaaaaaaaboaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHaHbtaobuaobvaHaHaobvaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHbsaaaaaaaaaa +aaaaaaaabsaHaHaHaHaHbqaHaHaHaHaHbqaHaHaHaHaHaHaHaHaHaHaHbnaHbnaHaHaHaHaHcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDbtaoabaaaaaaaa +aaaaaaabaoaoaocEaoaoaoaoaocFaoaoaoaoaocGaoaoaoaHaHaHaHaHbpaHbpaHaHaHaHcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBaoabaaaaaaaa +aaaaaaabaoaHcHcIaHcJaoaHcKcLaHavaocMcNcOaHavaoaHaHaHaHaHaHaHaHaHaHaHaHcBcPcPcPcQcPcPcPcPcPcPcPcPcPcPcPcQcPcPaoabaaaaaaaa +aaaaaaabaoaHcRaHcScTaobvaHaHaHcUaocVcWcWaHcXaoaHaHaHaHaHaHaHaHaHaHaHaHaocYcPcZdadbdbcPcPcPcPcPdcdcdcdcdccPcYaoabaaaaaaaa +aaaaaaaabRaHdddecSdfaoaHaHaHaHcUaocWdgcWaHdhaoaHaHaHaHaHbpaHbpaHaHaHaHaodicPdadjdkdlcPcPcPcQcPdcdcdmdcdccPdiaoabaaaaaaaa +aaaaaaabaodndodpdodqaobTbTbUbTbVaodrdsdtdsbVaoaHaHaHaHaHaHaHaHaHaHaHaHaoducPcQcPcPcPcPcPcPcPcPcPcPcPcPcPcPduaoabaaaaaaaa +aaaaaaabbWdvdwdxdyaobWbXaYaZbYaobWbXaYaZbYaoaoaHaHaHaHaHbqaHbqaHaHaHaHaocPdzdAdBdCdDcQdzcPdzcPcPdEdFdGcPdzcQaoabaaaaaaaa +aaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaHaHaHaHbtaobuaobvaHaHaHaoaoaoaoaoaoaoaoaodHaoaoaoaoaoaoaoaoaoaoabaaaaaaaa +aaaaaaabaoaHaHaHaHaHaHaHaHaHdIaHaHaHaHaHdJdJdJaHaHaHaHaHbnaHbnaHaHaHaHaHaHaHaHbnaHaHaHaHaHaHaHaHaHaHcWaHaHcWbmaaaaaaaaaa +aaaaaaabaodKaHdLaHaHaHaHaHaHaHdIaHaHaHaHdJdJdJaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHcWcWcWcWaHboaaaaaaaaaa +aaaaaaabaoaHaHaHaHaHaHdIaHaHaHaHaHdMaHaHaHdJdJdJaHaHaHaHbpaHbpaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHcWcWaHcWaHaHbsaaaaaaaaaa +aaaaaaabaodNaHdKaHaHaHaHaHaHaHdMaHaHaHaHaHaHdOaoaHaHaHaHaHaHaHaHaHaHaHaoaoaoaodPaoaoaoaoaoaodQdQdQaoaoaoaoaoaoabaaaaaaaa +aaaaaaabaodRdSaHaHaHaHdMaHaHaHaHaHaHdMaHaHaHaHaodTaHaHaHaHaHaHaHaHaHdUaodVdWaHaHaHdXdXdXaodYdYdZdYdYdYdYdYdYaoabaaaaaaaa +aaaaaaabaoaoeaebaHdIaHaHaHdIaHaHdIaHaHaHaHaHaHaodTaHaHaHbpaHbpaHaHaHecaodVcCaHaHaHedeeeeaodYefegefdYdYdYdYefaoabaaaaaaaa +aaaaaaababaoehdKaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaodTaHaHaHaHaHaHaHaHaHeiaodVdWaHaHaHaHaHaHaodYefefejekelefefemaoabaaaaaaaa +aaaaaaaaabaoaHaHaHaHaHdMaHaHaHaHaHdIaHaHaHdJdJaoaoaoaoaodPaodPaoaoaoaoaodVcCaHaHaHaHaHaHaoefefefeneoepefeqefaoabaaaaaaaa +aaaaaaaaabaoaHeraHaHaHaHaHaHaHaHdIaHaHaHaHdJdJaoaHaHaHaHaHbnaHaHeseteuaobvaHaHbrevbrewevaodYefefelenelefexefaoabaaaaaaaa +aaaaaaaaabaoeyeyaHaHaHaHaHaHaHaHaHaHaHaHaHdJdJdPaHaHaHaHbpaHbpaHezaHaHdPaHaHaHeAeAeAeAeAaodYeBeqefefeCefdYdYaoabaaaaaaaa +aaaaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaobvaHaHaHaHaHaHaHeDeEaHdQaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoabaaaaaaaa +aaaaaaaaabababababababababababababababababababbmaHaHaHaHaHaHaHaHeFcCeGaoababababababababababababababababababababaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboaHaHaHaHbpaHbpaHezaHeGaoabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboaHaHaHaHaHaHaHbqezeHezaoabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeIeJeJeKaoeLaoeLaoaoaoaoaoabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeLaoeLababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeMeNeOeJeKePeQePeQePeOeJeKePeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeMbReSeTeUeUeUbDbDbDbDbDeUeUeUeVeWeXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabReYeZbDbDbDbDbDeUeUeUbDbDbDbDfaeWeXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbbRfcbDeUeYeUbDbDeTbDbDfdfeeUeVeWeXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbePeOeJeKePeNeNeNePeOeJeKePffaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +"} diff --git a/maps/tgstation.2.1.2.dmm b/maps/tgstation.2.1.2.dmm index c913191dc36..2d78e699637 100644 --- a/maps/tgstation.2.1.2.dmm +++ b/maps/tgstation.2.1.2.dmm @@ -6684,11 +6684,13 @@ "cyB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/tcommsat/chamber) "cyC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/tcommsat/chamber) "cyD" = (/turf/simulated/floor/mech_bay_recharge_floor/airless,/area/mine/west_outpost) +"cyE" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor,/area/mine/north_outpost) "cyF" = (/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/airless{icon_state = "dark"},/area/tcommsat/chamber) "cyG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/tcommsat/chamber) "cyH" = (/obj/structure/rack,/obj/item/weapon/circuitboard/teleporter,/turf/simulated/floor/airless,/area/tcommsat/chamber) "cyI" = (/obj/item/device/radio/off,/turf/simulated/floor/airless{icon_state = "dark"},/area/tcommsat/chamber) "cyJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/tcommsat/chamber) +"cyK" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor,/area/mine/west_outpost) "cyL" = (/obj/effect/decal/cleanable/oil,/turf/simulated/floor/plating/airless,/area/tcommsat/chamber) "cyM" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "cyN" = (/obj/machinery/door/poddoor/preopen{id = "CentComPort"; name = "security door"},/turf/unsimulated/floor{dir = 1; icon_state = "loadingarea"},/area/centcom/control) @@ -6734,6 +6736,8 @@ "czB" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/tcommsat/chamber) "czC" = (/obj/item/weapon/paper/crumpled,/turf/simulated/floor,/area/tcommsat/chamber) "czD" = (/obj/structure/closet/malf/suits,/turf/simulated/floor,/area/tcommsat/chamber) +"czE" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor{icon_state = "bar"},/area/mine/living_quarters) +"czF" = (/obj/structure/closet/crate,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor,/area/mine/production) "czG" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/tcommsat/chamber) "czH" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/tcommsat/chamber) "czI" = (/obj/item/weapon/crowbar,/turf/simulated/floor/plating/airless,/area) @@ -6761,6 +6765,7 @@ "cAe" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/AIsattele) "cAf" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plating/airless,/area/AIsattele) "cAg" = (/obj/structure/closet/crate,/obj/item/device/aicard,/obj/item/device/multitool,/turf/simulated/floor/plating/airless,/area/AIsattele) +"cAh" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/mine/production) "cAi" = (/turf/simulated/floor/plating/airless,/area/djstation/solars) "cAj" = (/turf/simulated/wall,/area/djstation) "cAk" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/djstation) @@ -7878,7 +7883,6 @@ "cWO" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor,/area/mine/production) "cWP" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor,/area/mine/production) "cWQ" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/mine/production) -"cWR" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/mine/production) "cWS" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/mine/production) "cWT" = (/obj/machinery/power/apc{dir = 1; name = "Mining Station External APC"; pixel_x = 1; pixel_y = 25},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) "cWU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored) @@ -9024,7 +9028,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcNHcNIcNJcMEcNAcNKcNlcNLcNmcNMcMNcNBbSlcMNcObbAzcNmbzdcMNcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcNFcNScNTcNUcNVcNFcMtcMtcMtcMtcMtcMtcMtcMtcMtcMvcMvcMvcMtcMtcMvcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafcMvcMvcMNcNfcNWcNXcNYcNJcNZcOacNncObbRhcNncOZcMNcObbAObAzbzdcMNcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMtcMLcMLcMLcMLcMLcMLcMtcMtcMtcMtcMtcMtcMtaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafcNFcOdcOecOfcOgcNFcMtcMtcMLcMLcMLcMLcMtcMtcMtcMvcMvcMvcMvcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcMNcMNcMNcMNcMNcMNcNecNmcOhcNWcNmcNBcOicObcObbKZbAzbAOcMNcObcNlbAObzdcMNcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMLcMLcMLcOkcOkcOkcOkcMLcMLcMLcMtcMtcMtcMtcMtaaaaaaaaaaaaaaaaaaaaaaafcNFcNFcNFcNFcNFcOlcOmcNFcNFcNFcNFcNFcNFcNFcNFcNFcOkcMLcMtcMtcMvcMvcMvcMvcMtcMtcMvcMtcMtcMtcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcMNbCrbLbbLabOvcMNcNHbMocNIcMNbFccMNbOybPqbOxcMNcNmbARcNMbAzcNMbAScNmcMNcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMLcMLcOkcOkcOkcOkcOkcOkcOkcOkcMLcMLcMtcMtcMtcMtaaaaaaaaaaaaaaaaafaafaafcNFcOxcOycOzcOAcOBcOCcODcOycOycOycOEcOFcOGcOHcNFcOkcOkcMtcMtcMvcMvcMvcMvcMvcMvcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcMNbCrbLbbLabOvcMNcNHbMocNIcMNbFccMNbOybPqbOxcMNcNmbARcNMbAzcNMbAScNmcMNcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMLcMLcOkcOkcOkcOkcOkcOkcOkcOkcMLcMLcMtcMtcMtcMtaaaaaaaaaaaaaaaaafaafaafcNFcOxcyEcOzcOAcOBcOCcODcOycOycOycOEcOFcOGcOHcNFcOkcOkcMtcMtcMvcMvcMvcMvcMvcMvcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMvcMNbCrcMQcMIcNlbFcbARbAObGsbAObARcNmcNlcNabAzcNmcNlcMQcMNcNMbEWcNMcNMcMNcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMLcMLcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcMLcMLcMtcMtcMtcMtaaaaaaaaaaaaaaaaaaaafcNFcOMcOycONcOOcOPcOQcORcNFcNFcOScOTcOUcOUcOVcNFcOkcOkcMtcMtcMvcMvcMvcMvcMvcMvcMvcMtcMtcMvcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMvcMvcMNbCrcNMcMQcMQcNCcNnbAObKYcNlcNvbARbAObAzbGscNMbAzbAOcMNbAOcNmbARcNMcMNcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMLcPacOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcPbcMLcMLcMLcMLcMLaaaaaaaaaaaaaaaaaaaafcNFcPccPdcPecPfcPecPgcOycPhcNFcPicPjcPkcPlcOkcOkcOkcMLcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMtcMtcMvcMvcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMvcMvcMvcMNbCrbCvcNlbBwcMNcPncMNbBubBvcMNcNncMNbBubBvcMNcNMbARcMNbBtbAScNMcNBcMNcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMLcPrcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcPscPacMLcMLcMLaaaaaaaaaaaaaaaaaaaaaaafcNFcPtcOycPucOAcOycPvcOycPhcNFcPicOkcOkcOkcOkcOkcMLcMLcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMvcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9135,7 +9139,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQfcQfcQfcQ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQfcQfcQycQycQycQycQycQycQfcQfcQfcQfcQfcQfcQfcQfcQfcQfcQycQycQycQycQycQfcQfcQfcQfcQfcQfcQfcQfcQfcOkcOkcOkcOkcOkcOkcOkcOkcRIcRIcRIcOkcOkcOkcMLcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcREcMvcMvcRrcRzcRAcRJcRxcRKcOkcOkcOkcOkcOkcOkcOkcOkcOkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMtcMtcMtcMtcMtcMtcMtcMLcMLcPacMLcMLcOkcOkcQvcOkcOkcOkcOkcOkcOkcOkcOkcPHcMLcMLcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQfcQycQycQycQycQycQycQycQycQfcQfcQfcQfcQfcQfcQfcQycQycQycQycQycQycQfcQfcQfcQfcQfcQfcQfcQfcQfcOkcOkcOkcOkcOkcOkcOkcOkcRLcyDcRNcOkcOkcOkcMLcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMLcMLcMLcMLcMLcMLcMLcMtcMtcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcRrcROcRrcRrcRrcRrcRrcRrcRxcRPcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkaaaaaaaaaaaaaaaaaaaaaaaaaaacMtcMtcMtcMtcMtcMLcMLcOkcRHcOkcOkcOkcQHcQqcQrcOkcOkcOkcOkcOkcOkcOkcPHcPHcMLcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQfcQfcQycQycQycQycQycQycQfcQfcQfcQfcQfcQfcQfcQycQycQycQycQycQycQfcQfcQfcQfcOkcOkcRQcRQcRQcRQcRQcRQcRRcRScRScRTcRQcRQcRQcRQcQJcOkcOkcMLcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMtcMLcMLcOkcOkcOkcOkcOkcMLcMLcMLcMLcMLcMtcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcRrcRrcRrcRrcRUcRVcRWcRrcRvcRXcRrcRDcRrcRrcRrcRYcRZcSacRrcOkcOkcOkcOkcOkcOkaaaaaaaaaaaaaaaaaaaaaaaaaaacMtcMtcMtcMLcMLcOkcOkcOkcOkcOkcOkcQmcQscQocOkcOkcOkcOkcOkcOkcOkcOkcOkcMLcMLcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQfcQfcQycQycQycQycQycQycQfcQfcQfcQfcQfcQfcQfcQycQycQycQycQycQfcQfcMLcOkcOkcOkcRQcSbcSccSdcSecSfcSgcShcSicSicSjcSccSkcSlcQrcOkcOkcMLcMLcMLcMLcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMLcMLcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcMLcMLcMLcMLcMLcMtcMtcMtcMtcMvcMvcMvcRrcSmcSncSocSpcSncSqcRrcRzcRAcSrcRxcRrcSscStcSucSucSucRGcOkcOkcOkcOkcOkcOkcOkaaaaaaaaaaaaaaaaaaaaaaaaaaacMLcMLcMLcOkcOkcOkcOkcOkcOkcOkcOkcSvcSwcSxcSycSwcSwcOkcOkcOkcOkcOkcOkcMLcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQfcQfcQycQycQycQycQycQycQfcQfcQfcQfcQfcQfcQfcQycQycQycQycQycQfcQfcMLcOkcOkcOkcRQcSbcyKcSdcSecSfcSgcShcSicSicSjcSccSkcSlcQrcOkcOkcMLcMLcMLcMLcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMLcMLcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcMLcMLcMLcMLcMLcMtcMtcMtcMtcMvcMvcMvcRrcSmczEcSocSpcSncSqcRrcRzcRAcSrcRxcRrcSscStcSucSucSucRGcOkcOkcOkcOkcOkcOkcOkaaaaaaaaaaaaaaaaaaaaaaaaaaacMLcMLcMLcOkcOkcOkcOkcOkcOkcOkcOkcSvcSwcSxcSycSwcSwcOkcOkcOkcOkcOkcOkcMLcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQfcQfcQfcQycQycQycQfcQfcQfcQfcQfcQfcQfcQfcQycQycQycQfcQfcMtcMLcOkcOkcOkcRQcSzcSccSAcSBcSccSccSccSccSccSCcSccSkcSDcSEcOkcOkcOkcOkcOkcMLcMLcMLcMtcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMLcMLcPacOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcMLcMLcMtcMtcMtcMtcMtcMtcRrcSFcSncSGcSHcSIcSJcRrcRrcRrcRrcRxcRrcSscSKcSKcSKcSLcRKcOkcOkcOkcOkcOkcOkcOkaaaaaaaaaaaaaaaaaaaaaaaaaaacOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcSvcSMcSMcSMcSNcSwcOkcSOcOkcOkcOkcPscPacMLcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQfcQfcQycQycQycQfcQfcQfcQfcQfcQfcQfcQfcQfcQfcQfcQfcQfcMtcMLcOkcOkcOkcRQcSPcSccSccSQcSccSccSccSccSccSjcSRcSScSjcQocOkcOkcOkcOkcOkcOkcOkcMLcMLcMLcMLcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMLcMLcOkcRHcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcMLcMLcMLcMLcMtcMtcMtcRrcSTcSncSUcSncSVcSncSWcSLcSXcSYcSZcRrcSscSKcTacSKcTbcRPcOkcOkcOkcOkcOkcOkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOkcOkcOkcOkcOkcTccTccTdcTecSvcTfcTgcTgcThcSwcSwcSwcSwcOkcOkcOkcOkcMLcMLcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQfcQfcQfcQfcQfcQfcQfcQfcQfcQfcQfcQfcQfcQfcQfcMvcMvcMLcMLcOkcOkcRQcTicSccTjcTkcTlcTmcTncSccTocRQcRQcRQcRQcRQcQHcQrcOkcOkcOkcOkcOkcOkcOkcOkcMLcMLcMLcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMLcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcQHcQrcOkcOkcOkcOkcOkcOkcOkcOkcOkcMLcMLcMtcMtcRrcRrcRrcRrcRrcRrcRrcTpcTqcTrcTpcTqcRrcRrcRrcRrcRrcTscRrcRrcTtcTucOkcOkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOkcOkcTvcTecTwcTxcTycTzcTAcTBcTBcTCcTDcTEcTFcTGcQrcOkcOkcOkcPbcMLcMtcMtcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9146,7 +9150,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMvcMvcMvcMtcMLcMLcOkcOkcOkcRQcRQcRQcRQcRQcRQcOkcOkcMLcMLcMLcMLcMLcMtcMtcMLcMLcOkcOkcOkcOkcQvcOkcOkcOkcOkcOkcOkcMLcMLcMLcMLcMLcMLcOkcOkcOkcOkcOkcQvcOkcOkcMLcMLcMLcMtcMtcMtcMtcMtcMLcOkcOkcOkcOkcOkcOkcQvcOkcOkcOkcQHcQrcOkcOkcOkcOkcOkcOkcOkcMLcRrcVPcVQcVRcVQcRrcVScVTcVUcVVcVWcRrcVXcVYcVZcRrcOkcOkcOkcOkcOkcOkaaaaaaaafaaaaaaaaaaafaafaafaafaafaafaafaafaafcTccWacWbcUIcTccTccTccTccWccTccWdcTccTccWecRocRocRocRocOkcMLcMtcMtcMvcMvcMvcMtcMtcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMvcMvcMtcMtcMLcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcMLcMtcMtcMtcMtcMtcMtcMtcMLcMLcOkcOkcOkcQDcQFcQFcQFcQEcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcQvcOkcMLcMLcMtcMtcMtcMtcMtcMtcMtcMLcMLcOkcOkcOkcOkcOkcQDcQFcQFcQFcQNcQOcQFcQFcQFcQEcOkcOkcOkcOkcRrcWfcWgcWhcWicRrcWjcVWcVWcWkcWlcRrcWmcWncWocRrcOkcOkcOkcOkcOkcOkaafaafaafaafaafaafaafcWpcWpcWpcWpcWpaafaaaaaacTccWqcWrcUIcWscWtcWucVJcVJcWvcVJcVKcTccOkcOkcOkcOkcOkcMLcMLcMtcMtcMvcMvcMtcMtcMtcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMvcMvcMvcMtcMLcOkcOkcOkcOkcOkcOkcOkcOkcOkcMLcMLcMLcMtcMtcMtcMtcMtcMtcMtcMtcMLcMLcMLcOkcOkcOkcOkcOkcQDcQEcOkcOkcQHcQrcOkcOkcQKcQFcQFcQFcQFcQFcQLcOkcMLcMtcMtcMtcMtcMvcMvcMvcMtcMtcMLcMLcMLcOkcOkcOkcOkcOkcOkcOkcQmcQocOkcOkcOkcQvcOkcOkcOkcOkcRrcRrcRrcRrcRrcRrcWwcWxcWycWzcWlcRrcVxcWAcVxcRrcOkcOkcOkcOkcOkcOkaaaaaaaafaaaaaaaaaaafcWpcWpcWpcWpcWpaafaaacTvcTecWBcWCcWDcTccTccTccTccTccTccWEcWFcTccOkcOkcOkcOkcOkcMLcMtcMtcMvcMvcMvcMtcMtcMtcMtcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMvcMvcMvcMvcMLcMLcMLcMLcOkcOkcOkcOkcMLcMLcMLcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMLcMLcMLcOkcQxcOkcOkcQDcQFcQFcQNcQOcQFcQFcQLcOkcOkcOkcOkcOkcOkcOkcMLcMtcMtcMtcMvcMvcMvcMvcMvcMtcMtcMtcMLcMLcMLcMLcOkcOkcOkcOkcOkcOkcOkcOkcOkcQDcQFcQFcQEcOkcOkcOkcOkcOkcOkcRrcRrcRrcRrcRrcRrcRrcWGcWHcSEcWIcOkcOkcOkcOkcOkaaaaaaaaaaafaaaaaaaaaaafcWpcWpcWpcWpcWpcWJcUdcWKcWLcTxcWMcUIcWNcWNcWOcWPcWQcWRcWScWFcTccOkcOkcOkcOkcMLcMLcMtcMtcMvcMvcMtcMtcMtcMtcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMvcMvcMvcMvcMLcMLcMLcMLcOkcOkcOkcOkcMLcMLcMLcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMLcMLcMLcOkcQxcOkcOkcQDcQFcQFcQNcQOcQFcQFcQLcOkcOkcOkcOkcOkcOkcOkcMLcMtcMtcMtcMvcMvcMvcMvcMvcMtcMtcMtcMLcMLcMLcMLcOkcOkcOkcOkcOkcOkcOkcOkcOkcQDcQFcQFcQEcOkcOkcOkcOkcOkcOkcRrcRrcRrcRrcRrcRrcRrcWGcWHcSEcWIcOkcOkcOkcOkcOkaaaaaaaaaaafaaaaaaaaaaafcWpcWpcWpcWpcWpcWJcUdcWKcWLcTxcWMcUIczFcWNcWOcWPcWQcAhcWScWFcTccOkcOkcOkcOkcMLcMLcMtcMtcMvcMvcMtcMtcMtcMtcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMvcMvcMvcMvcMvcMtcMLcMLcMLcMLcMLcMLcMtcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMtcMtcMtcMtcMtcMLcMLcPacMLcOkcOkcOkcOkcQmcQocOkcOkcOkcOkcQxcOkcMLcMLcMLcMLcMLcMtcMtcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMtcMtcMLcMLcMLcMLcMLcMLcMLcMLcOkcOkcOkcOkcOkcQvcOkcOkcOkcOkcOkcOkcOkcOkcQmcWTcWUcWUcWUcWUcWVcQocOkcOkcOkcOkcOkcOkaafaafaafaafaafaafaafaafcWpcWpcWpcWpcWpcWWcTxcWWcTxcTxcWMcUIcTxcTxcWXcTxcTxcWYcWZcXacTccOkcOkcOkcOkcMLcMtcMtcMtcMvcMvcMtcMtcMtcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMvcMvcMvcMvcMvcMvcMtcMtcMtcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMtcMtcMtcMLcMLcOkcOkcOkcOkcOkcOkcOkcOkcOkcPacMLcMLcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMtcMLcMLcOkcOkcOkcOkcQvcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkcOkaaaaaaaaaaaaaaaaaaaafcWpcWpcWpcWpcWpcTdcUdcXbcXccTxcWMcXdcVncVncXecVncVncXfcXgcXhcTccOkcOkcOkcQGcPacMtcMtcMtcMvcMtcMtcMtcMtcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacMvcMvcMvcMvcMtcMvcMvcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMtcMtcMtcMLcMLcMLcOkcOkcOkcMLcMLcMLcMLcMLcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMvcMtcMtcMtcMtcMtcMLcOkcOkcOkcOkcQDcQFcQFcQFcQFcQFcQFcQFcQFcQFcQFcQFcQFcQFcQFcQFcQFcQFcQEcOkcOkcOkcOkcOkcOkaaaaaaaaaaaaaaaaafcWpcWpcWpcWpcWpaafaaacVEcTecXicWMcUIcTxcTxcXjcWNcTxcTxcWEcXkcTccOkcOkcOkcOkcMLcMtcMtcMtcMtcMtcMtcMtcMvcMvcMvcMvcMvcMvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/tgstation.dme b/tgstation.dme index b549d0fc069..daa97922351 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -849,6 +849,7 @@ #include "code\modules\mob\dead\observer\observer.dm" #include "code\modules\mob\dead\observer\say.dm" #include "code\modules\mob\living\damage_procs.dm" +#include "code\modules\mob\living\emote.dm" #include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defines.dm" @@ -858,6 +859,7 @@ #include "code\modules\mob\living\carbon\carbon.dm" #include "code\modules\mob\living\carbon\carbon_defense.dm" #include "code\modules\mob\living\carbon\carbon_defines.dm" +#include "code\modules\mob\living\carbon\emote.dm" #include "code\modules\mob\living\carbon\inventory.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" #include "code\modules\mob\living\carbon\alien\alien_defense.dm"
    CKEY \[+\]RANKPERMISSIONSRANKPERMISSIONSVERB-OVERRIDES
    [adm_ckey] \[-\][rank][rights][D.rank.name][rights][rights2text(0," ",D.rank.adds,D.rank.subs)]