diff --git a/.gitignore b/.gitignore index f3af83cda0..793ccd5bd5 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ vchat.db* *.backup *.before *.pyc +*.pid +data data/ cfg/ diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm index c91ef281f3..ad852affdc 100644 --- a/code/ATMOSPHERICS/components/unary/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary/heat_source.dm @@ -159,6 +159,6 @@ ..() /obj/machinery/atmospherics/unary/heater/examine(mob/user) - ..() + . = ..() if(panel_open) . += "The maintenance hatch is open." diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 7b82945564..d54635081d 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -47,7 +47,7 @@ var/datum/category_collection/underwear/global_underwear = new() //Backpacks var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt", "Messenger Bag") -var/global/list/pdachoicelist = list("Default", "Slim", "Old", "Rugged", "Holographic") +var/global/list/pdachoicelist = list("Default", "Slim", "Old", "Rugged", "Holographic", "Wrist-Bound") var/global/list/exclude_jobs = list(/datum/job/ai,/datum/job/cyborg) // Visual nets diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 5882ad77ba..e218727049 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1,1589 +1,1594 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/* - * A large number of misc global procs. - */ - -//Checks if all high bits in req_mask are set in bitfield -#define BIT_TEST_ALL(bitfield, req_mask) ((~(bitfield) & (req_mask)) == 0) - -//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a -#define RANGE_TURFS(RADIUS, CENTER) \ - block( \ - locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ - locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ - ) - -#define QDEL_NULL(item) qdel(item); item = null -#define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); } - -//Inverts the colour of an HTML string -/proc/invertHTML(HTMLstring) - - if (!( istext(HTMLstring) )) - CRASH("Given non-text argument!") - return - else - if (length(HTMLstring) != 7) - CRASH("Given non-HTML argument!") - return - var/textr = copytext(HTMLstring, 2, 4) - var/textg = copytext(HTMLstring, 4, 6) - var/textb = copytext(HTMLstring, 6, 8) - var/r = hex2num(textr) - var/g = hex2num(textg) - var/b = hex2num(textb) - textr = num2hex(255 - r) - textg = num2hex(255 - g) - textb = num2hex(255 - b) - if (length(textr) < 2) - textr = text("0[]", textr) - if (length(textg) < 2) - textr = text("0[]", textg) - if (length(textb) < 2) - textr = text("0[]", textb) - return text("#[][][]", textr, textg, textb) - return - -//Returns the middle-most value -/proc/dd_range(var/low, var/high, var/num) - return max(low,min(high,num)) - -//Returns whether or not A is the middle most value -/proc/InRange(var/A, var/lower, var/upper) - if(A < lower) return 0 - if(A > upper) return 0 - return 1 - - -/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. - if(!start || !end) return 0 - var/dy - var/dx - dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) - dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x) - if(!dy) - return (dx>=0)?90:270 - .=arctan(dx/dy) - if(dy<0) - .+=180 - else if(dx<0) - .+=360 - -//Returns location. Returns null if no location was found. -/proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = 0, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) -/* -Location where the teleport begins, target that will teleport, distance to go, density checking 0/1(yes/no). -Random error in tile placement x, error in tile placement y, and block offset. -Block offset tells the proc how to place the box. Behind teleport location, relative to starting location, forward, etc. -Negative values for offset are accepted, think of it in relation to North, -x is west, -y is south. Error defaults to positive. -Turf and target are seperate in case you want to teleport some distance from a turf the target is not standing on or something. -*/ - - var/dirx = 0//Generic location finding variable. - var/diry = 0 - - var/xoffset = 0//Generic counter for offset location. - var/yoffset = 0 - - var/b1xerror = 0//Generic placing for point A in box. The lower left. - var/b1yerror = 0 - var/b2xerror = 0//Generic placing for point B in box. The upper right. - var/b2yerror = 0 - - errorx = abs(errorx)//Error should never be negative. - errory = abs(errory) - //var/errorxy = round((errorx+errory)/2)//Used for diagonal boxes. - - switch(target.dir)//This can be done through equations but switch is the simpler method. And works fast to boot. - //Directs on what values need modifying. - if(1)//North - diry+=distance - yoffset+=eoffsety - xoffset+=eoffsetx - b1xerror-=errorx - b1yerror-=errory - b2xerror+=errorx - b2yerror+=errory - if(2)//South - diry-=distance - yoffset-=eoffsety - xoffset+=eoffsetx - b1xerror-=errorx - b1yerror-=errory - b2xerror+=errorx - b2yerror+=errory - if(4)//East - dirx+=distance - yoffset+=eoffsetx//Flipped. - xoffset+=eoffsety - b1xerror-=errory//Flipped. - b1yerror-=errorx - b2xerror+=errory - b2yerror+=errorx - if(8)//West - dirx-=distance - yoffset-=eoffsetx//Flipped. - xoffset+=eoffsety - b1xerror-=errory//Flipped. - b1yerror-=errorx - b2xerror+=errory - b2yerror+=errorx - - var/turf/destination=locate(location.x+dirx,location.y+diry,location.z) - - if(destination)//If there is a destination. - if(errorx||errory)//If errorx or y were specified. - var/destination_list[] = list()//To add turfs to list. - //destination_list = new() - /*This will draw a block around the target turf, given what the error is. - Specifying the values above will basically draw a different sort of block. - If the values are the same, it will be a square. If they are different, it will be a rectengle. - In either case, it will center based on offset. Offset is position from center. - Offset always calculates in relation to direction faced. In other words, depending on the direction of the teleport, - the offset should remain positioned in relation to destination.*/ - - var/turf/center = locate((destination.x+xoffset),(destination.y+yoffset),location.z)//So now, find the new center. - - //Now to find a box from center location and make that our destination. - for(var/turf/T in block(locate(center.x+b1xerror,center.y+b1yerror,location.z), locate(center.x+b2xerror,center.y+b2yerror,location.z) )) - if(density&&(T.density||T.contains_dense_objects())) continue//If density was specified. - if(T.x>world.maxx || T.x<1) continue//Don't want them to teleport off the map. - if(T.y>world.maxy || T.y<1) continue - destination_list += T - if(destination_list.len) - destination = pick(destination_list) - else return - - else//Same deal here. - if(density&&(destination.density||destination.contains_dense_objects())) return - if(destination.x>world.maxx || destination.x<1) return - if(destination.y>world.maxy || destination.y<1) return - else return - - return destination - - - -/proc/LinkBlocked(turf/A, turf/B) - if(A == null || B == null) return 1 - var/adir = get_dir(A,B) - var/rdir = get_dir(B,A) - if((adir & (NORTH|SOUTH)) && (adir & (EAST|WEST))) // diagonal - var/iStep = get_step(A,adir&(NORTH|SOUTH)) - if(!LinkBlocked(A,iStep) && !LinkBlocked(iStep,B)) return 0 - - var/pStep = get_step(A,adir&(EAST|WEST)) - if(!LinkBlocked(A,pStep) && !LinkBlocked(pStep,B)) return 0 - return 1 - - if(DirBlocked(A,adir)) return 1 - if(DirBlocked(B,rdir)) return 1 - return 0 - - -/proc/DirBlocked(turf/loc,var/dir) - for(var/obj/structure/window/D in loc) - if(!D.density) continue - if(D.dir == SOUTHWEST) return 1 - if(D.dir == dir) return 1 - - for(var/obj/machinery/door/D in loc) - if(!D.density) continue - if(istype(D, /obj/machinery/door/window)) - if((dir & SOUTH) && (D.dir & (EAST|WEST))) return 1 - if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return 1 - else return 1 // it's a real, air blocking door - return 0 - -/proc/TurfBlockedNonWindow(turf/loc) - for(var/obj/O in loc) - if(O.density && !istype(O, /obj/structure/window)) - return 1 - return 0 - -/proc/sign(x) - return x!=0?x/abs(x):0 - -/proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm - var/px=M.x //starting x - var/py=M.y - var/line[] = list(locate(px,py,M.z)) - var/dx=N.x-px //x distance - var/dy=N.y-py - var/dxabs=abs(dx)//Absolute value of x distance - var/dyabs=abs(dy) - var/sdx=sign(dx) //Sign of x distance (+ or -) - var/sdy=sign(dy) - var/x=dxabs>>1 //Counters for steps taken, setting to distance/2 - var/y=dyabs>>1 //Bit-shifting makes me l33t. It also makes getline() unnessecarrily fast. - var/j //Generic integer for counting - if(dxabs>=dyabs) //x distance is greater than y - for(j=0;j=dxabs) //Every dyabs steps, step once in y direction - y-=dxabs - py+=sdy - px+=sdx //Step on in x direction - line+=locate(px,py,M.z)//Add the turf to the list - else - for(j=0;j=dyabs) - x-=dyabs - px+=sdx - py+=sdy - line+=locate(px,py,M.z) - return line - -#define LOCATE_COORDS(X, Y, Z) locate(between(1, X, world.maxx), between(1, Y, world.maxy), Z) -/proc/getcircle(turf/center, var/radius) //Uses a fast Bresenham rasterization algorithm to return the turfs in a thin circle. - if(!radius) return list(center) - - var/x = 0 - var/y = radius - var/p = 3 - 2 * radius - - . = list() - while(y >= x) // only formulate 1/8 of circle - - . += LOCATE_COORDS(center.x - x, center.y - y, center.z) //upper left left - . += LOCATE_COORDS(center.x - y, center.y - x, center.z) //upper upper left - . += LOCATE_COORDS(center.x + y, center.y - x, center.z) //upper upper right - . += LOCATE_COORDS(center.x + x, center.y - y, center.z) //upper right right - . += LOCATE_COORDS(center.x - x, center.y + y, center.z) //lower left left - . += LOCATE_COORDS(center.x - y, center.y + x, center.z) //lower lower left - . += LOCATE_COORDS(center.x + y, center.y + x, center.z) //lower lower right - . += LOCATE_COORDS(center.x + x, center.y + y, center.z) //lower right right - - if(p < 0) - p += 4*x++ + 6; - else - p += 4*(x++ - y--) + 10; - -#undef LOCATE_COORDS - -//Returns whether or not a player is a guest using their ckey as an input -/proc/IsGuestKey(key) - if (findtext(key, "Guest-", 1, 7) != 1) //was findtextEx - return 0 - - var/i = 7, ch, len = length(key) - - if(copytext(key, 7, 8) == "W") //webclient - i++ - - for (, i <= len, ++i) - ch = text2ascii(key, i) - if (ch < 48 || ch > 57) - return 0 - return 1 - -//Ensure the frequency is within bounds of what it should be sending/recieving at -/proc/sanitize_frequency(var/f, var/low = PUBLIC_LOW_FREQ, var/high = PUBLIC_HIGH_FREQ) - f = round(f) - f = max(low, f) - f = min(high, f) - if ((f % 2) == 0) //Ensure the last digit is an odd number - f += 1 - return f - -//Turns 1479 into 147.9 -/proc/format_frequency(var/f) - return "[round(f / 10)].[f % 10]" - - - -//This will update a mob's name, real_name, mind.name, data_core records, pda and id -//Calling this proc without an oldname will only update the mob and skip updating the pda, id and records ~Carn -/mob/proc/fully_replace_character_name(var/oldname,var/newname) - if(!newname) return 0 - real_name = newname - name = newname - if(mind) - mind.name = newname - if(dna) - dna.real_name = real_name - - if(oldname) - //update the datacore records! This is goig to be a bit costly. - for(var/list/L in list(data_core.general,data_core.medical,data_core.security,data_core.locked)) - for(var/datum/data/record/R in L) - if(R.fields["name"] == oldname) - R.fields["name"] = newname - break - - //update our pda and id if we have them on our person - var/list/searching = GetAllContents(searchDepth = 3) - var/search_id = 1 - var/search_pda = 1 - - for(var/A in searching) - if( search_id && istype(A,/obj/item/weapon/card/id) ) - var/obj/item/weapon/card/id/ID = A - if(ID.registered_name == oldname) - ID.registered_name = newname - ID.name = "[newname]'s ID Card ([ID.assignment])" - if(!search_pda) break - search_id = 0 - - else if( search_pda && istype(A,/obj/item/device/pda) ) - var/obj/item/device/pda/PDA = A - if(PDA.owner == oldname) - PDA.owner = newname - PDA.name = "PDA-[newname] ([PDA.ownjob])" - if(!search_id) break - search_pda = 0 - return 1 - - - -//Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame() -//Last modified by Carn -/mob/proc/rename_self(var/role, var/allow_numbers=0) - spawn(0) - var/oldname = real_name - - var/time_passed = world.time - var/newname - - for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name. - newname = input(src,"You are \a [role]. Would you like to change your name to something else?", "Name change",oldname) as text - if((world.time-time_passed)>3000) - return //took too long - newname = sanitizeName(newname, ,allow_numbers) //returns null if the name doesn't meet some basic requirements. Tidies up a few other things like bad-characters. - - for(var/mob/living/M in player_list) - if(M == src) - continue - if(!newname || M.real_name == newname) - newname = null - break - if(newname) - break //That's a suitable name! - to_chat(src, "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken.") - - if(!newname) //we'll stick with the oldname then - return - - if(cmptext("ai",role)) - if(isAI(src)) - var/mob/living/silicon/ai/A = src - oldname = null//don't bother with the records update crap - //to_world("[newname] is the AI!") - //world << sound('sound/AI/newAI.ogg') - // Set eyeobj name - A.SetName(newname) - - - fully_replace_character_name(oldname,newname) - - - -//Picks a string of symbols to display as the law number for hacked or ion laws -/proc/ionnum() - return "[pick("1","2","3","4","5","6","7","8","9","0")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]" - -//When an AI is activated, it can choose from a list of non-slaved borgs to have as a slave. -/proc/freeborg() - var/select = null - var/list/borgs = list() - for (var/mob/living/silicon/robot/A in player_list) - if (A.stat == 2 || A.connected_ai || A.scrambledcodes || istype(A,/mob/living/silicon/robot/drone)) - continue - var/name = "[A.real_name] ([A.modtype] [A.braintype])" - borgs[name] = A - - if (borgs.len) - select = input("Unshackled borg signals detected:", "Borg selection", null, null) as null|anything in borgs - return borgs[select] - -//When a borg is activated, it can choose which AI it wants to be slaved to -/proc/active_ais() - . = list() - for(var/mob/living/silicon/ai/A in living_mob_list) - if(A.stat == DEAD) - continue - if(A.control_disabled == 1) - continue - . += A - return . - -//Find an active ai with the least borgs. VERBOSE PROCNAME HUH! -/proc/select_active_ai_with_fewest_borgs() - var/mob/living/silicon/ai/selected - var/list/active = active_ais() - for(var/mob/living/silicon/ai/A in active) - if(!selected || (selected.connected_robots.len > A.connected_robots.len)) - selected = A - - return selected - -/proc/select_active_ai(var/mob/user) - var/list/ais = active_ais() - if(ais.len) - if(user) . = input(usr,"AI signals detected:", "AI selection") in ais - else . = pick(ais) - return . - -/proc/get_sorted_mobs() - var/list/old_list = getmobs() - var/list/AI_list = list() - var/list/Dead_list = list() - var/list/keyclient_list = list() - var/list/key_list = list() - var/list/logged_list = list() - for(var/named in old_list) - var/mob/M = old_list[named] - if(issilicon(M)) - AI_list |= M - else if(isobserver(M) || M.stat == 2) - Dead_list |= M - else if(M.key && M.client) - keyclient_list |= M - else if(M.key) - key_list |= M - else - logged_list |= M - old_list.Remove(named) - var/list/new_list = list() - new_list += AI_list - new_list += keyclient_list - new_list += key_list - new_list += logged_list - new_list += Dead_list - return new_list - -//Returns a list of all mobs with their name -/proc/getmobs() - - var/list/mobs = sortmobs() - var/list/names = list() - var/list/creatures = list() - var/list/namecounts = list() - for(var/mob/M in mobs) - var/name = M.name - if (name in names) - namecounts[name]++ - name = "[name] ([namecounts[name]])" - else - names.Add(name) - namecounts[name] = 1 - if (M.real_name && M.real_name != M.name) - name += " \[[M.real_name]\]" - if (M.stat == 2) - if(istype(M, /mob/observer/dead/)) - name += " \[ghost\]" - else - name += " \[dead\]" - creatures[name] = M - - return creatures - -//Orders mobs by type then by name -/proc/sortmobs() - var/list/moblist = list() - var/list/sortmob = sortAtom(mob_list) - for(var/mob/observer/eye/M in sortmob) - moblist.Add(M) - for(var/mob/observer/blob/M in sortmob) - moblist.Add(M) - for(var/mob/living/silicon/ai/M in sortmob) - moblist.Add(M) - for(var/mob/living/silicon/pai/M in sortmob) - moblist.Add(M) - for(var/mob/living/silicon/robot/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/human/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/brain/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/alien/M in sortmob) - moblist.Add(M) - for(var/mob/observer/dead/M in sortmob) - moblist.Add(M) - for(var/mob/new_player/M in sortmob) - moblist.Add(M) - for(var/mob/living/simple_mob/M in sortmob) - moblist.Add(M) -// for(var/mob/living/silicon/hivebot/M in sortmob) -// mob_list.Add(M) -// for(var/mob/living/silicon/hive_mainframe/M in sortmob) -// mob_list.Add(M) - return moblist - -// Format a power value in W, kW, MW, or GW. -/proc/DisplayPower(powerused) - if(powerused < 1000) //Less than a kW - return "[powerused] W" - else if(powerused < 1000000) //Less than a MW - return "[round((powerused * 0.001),0.01)] kW" - else if(powerused < 1000000000) //Less than a GW - return "[round((powerused * 0.000001),0.001)] MW" - return "[round((powerused * 0.000000001),0.0001)] GW" - -/proc/get_mob_by_ckey(key) - if(!key) - return - var/list/mobs = sortmobs() - for(var/mob/M in mobs) - if(M.ckey == key) - return M - -//Forces a variable to be posative -/proc/modulus(var/M) - if(M >= 0) - return M - if(M < 0) - return -M - -// returns the turf located at the map edge in the specified direction relative to A -// used for mass driver -/proc/get_edge_target_turf(var/atom/A, var/direction) - - var/turf/target = locate(A.x, A.y, A.z) - if(!A || !target) - return 0 - //since NORTHEAST == NORTH & EAST, etc, doing it this way allows for diagonal mass drivers in the future - //and isn't really any more complicated - - // Note diagonal directions won't usually be accurate - if(direction & NORTH) - target = locate(target.x, world.maxy, target.z) - if(direction & SOUTH) - target = locate(target.x, 1, target.z) - if(direction & EAST) - target = locate(world.maxx, target.y, target.z) - if(direction & WEST) - target = locate(1, target.y, target.z) - - return target - -// returns turf relative to A in given direction at set range -// result is bounded to map size -// note range is non-pythagorean -// used for disposal system -/proc/get_ranged_target_turf(var/atom/A, var/direction, var/range) - - var/x = A.x - var/y = A.y - if(direction & NORTH) - y = min(world.maxy, y + range) - if(direction & SOUTH) - y = max(1, y - range) - if(direction & EAST) - x = min(world.maxx, x + range) - if(direction & WEST) - x = max(1, x - range) - - return locate(x,y,A.z) - - -// returns turf relative to A offset in dx and dy tiles -// bound to map limits -/proc/get_offset_target_turf(var/atom/A, var/dx, var/dy) - var/x = min(world.maxx, max(1, A.x + dx)) - var/y = min(world.maxy, max(1, A.y + dy)) - return locate(x,y,A.z) - -//Makes sure MIDDLE is between LOW and HIGH. If not, it adjusts it. Returns the adjusted value. -/proc/between(var/low, var/middle, var/high) - return max(min(middle, high), low) - -//returns random gauss number -proc/GaussRand(var/sigma) - var/x,y,rsq - do - x=2*rand()-1 - y=2*rand()-1 - rsq=x*x+y*y - while(rsq>1 || !rsq) - return sigma*y*sqrt(-2*log(rsq)/rsq) - -//returns random gauss number, rounded to 'roundto' -proc/GaussRandRound(var/sigma,var/roundto) - return round(GaussRand(sigma),roundto) - -//Will return the contents of an atom recursivly to a depth of 'searchDepth' -/atom/proc/GetAllContents(searchDepth = 5) - var/list/toReturn = list() - - for(var/atom/part in contents) - toReturn += part - if(part.contents.len && searchDepth) - toReturn += part.GetAllContents(searchDepth - 1) - - return toReturn - -//Step-towards method of determining whether one atom can see another. Similar to viewers() -/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldn't be arsed to do actual raycasting :I This is horribly inaccurate. - var/turf/current = get_turf(source) - var/turf/target_turf = get_turf(target) - var/steps = 0 - - if(!current || !target_turf) - return 0 - - while(current != target_turf) - if(steps > length) return 0 - if(current.opacity) return 0 - for(var/atom/A in current) - if(A.opacity) return 0 - current = get_step_towards(current, target_turf) - steps++ - - return 1 - -/proc/is_blocked_turf(var/turf/T) - var/cant_pass = 0 - if(T.density) cant_pass = 1 - for(var/atom/A in T) - if(A.density)//&&A.anchored - cant_pass = 1 - return cant_pass - -/proc/get_step_towards2(var/atom/ref , var/atom/trg) - var/base_dir = get_dir(ref, get_step_towards(ref,trg)) - var/turf/temp = get_step_towards(ref,trg) - - if(is_blocked_turf(temp)) - var/dir_alt1 = turn(base_dir, 90) - var/dir_alt2 = turn(base_dir, -90) - var/turf/turf_last1 = temp - var/turf/turf_last2 = temp - var/free_tile = null - var/breakpoint = 0 - - while(!free_tile && breakpoint < 10) - if(!is_blocked_turf(turf_last1)) - free_tile = turf_last1 - break - if(!is_blocked_turf(turf_last2)) - free_tile = turf_last2 - break - turf_last1 = get_step(turf_last1,dir_alt1) - turf_last2 = get_step(turf_last2,dir_alt2) - breakpoint++ - - if(!free_tile) return get_step(ref, base_dir) - else return get_step_towards(ref,free_tile) - - else return get_step(ref, base_dir) - -//Takes: Anything that could possibly have variables and a varname to check. -//Returns: 1 if found, 0 if not. -/proc/hasvar(var/datum/A, var/varname) - if(A.vars.Find(lowertext(varname))) return 1 - else return 0 - -//Returns: all the areas in the world -/proc/return_areas() - var/list/area/areas = list() - for(var/area/A in world) - areas += A - return areas - -//Returns: all the areas in the world, sorted. -/proc/return_sorted_areas() - return sortAtom(return_areas()) - -//Takes: Area type as text string or as typepath OR an instance of the area. -//Returns: A list of all areas of that type in the world. -/proc/get_areas(var/areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) - if(isarea(areatype)) - var/area/areatemp = areatype - areatype = areatemp.type - - var/list/areas = new/list() - for(var/area/N in world) - if(istype(N, areatype)) areas += N - return areas - -//Takes: Area type as text string or as typepath OR an instance of the area. -//Returns: A list of all turfs in areas of that type of that type in the world. -/proc/get_area_turfs(var/areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) - if(isarea(areatype)) - var/area/areatemp = areatype - areatype = areatemp.type - - var/list/turfs = new/list() - for(var/area/N in world) - if(istype(N, areatype)) - for(var/turf/T in N) turfs += T - return turfs - -//Takes: Area type as text string or as typepath OR an instance of the area. -//Returns: A list of all atoms (objs, turfs, mobs) in areas of that type of that type in the world. -/proc/get_area_all_atoms(var/areatype) - if(!areatype) return null - if(istext(areatype)) areatype = text2path(areatype) - if(isarea(areatype)) - var/area/areatemp = areatype - areatype = areatemp.type - - var/list/atoms = new/list() - for(var/area/N in world) - if(istype(N, areatype)) - for(var/atom/A in N) - atoms += A - return atoms - -/datum/coords //Simple datum for storing coordinates. - var/x_pos = null - var/y_pos = null - var/z_pos = null - -/area/proc/move_contents_to(var/area/A, var/turftoleave=null, var/direction = null) - //Takes: Area. Optional: turf type to leave behind. - //Returns: Nothing. - //Notes: Attempts to move the contents of one area to another area. - // Movement based on lower left corner. Tiles that do not fit - // into the new area will not be moved. - - if(!A || !src) return 0 - - var/list/turfs_src = get_area_turfs(src.type) - var/list/turfs_trg = get_area_turfs(A.type) - - var/src_min_x = 0 - var/src_min_y = 0 - for (var/turf/T in turfs_src) - if(T.x < src_min_x || !src_min_x) src_min_x = T.x - if(T.y < src_min_y || !src_min_y) src_min_y = T.y - - var/trg_min_x = 0 - var/trg_min_y = 0 - for (var/turf/T in turfs_trg) - if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x - if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y - - var/list/refined_src = new/list() - for(var/turf/T in turfs_src) - refined_src += T - refined_src[T] = new/datum/coords - var/datum/coords/C = refined_src[T] - C.x_pos = (T.x - src_min_x) - C.y_pos = (T.y - src_min_y) - - var/list/refined_trg = new/list() - for(var/turf/T in turfs_trg) - refined_trg += T - refined_trg[T] = new/datum/coords - var/datum/coords/C = refined_trg[T] - C.x_pos = (T.x - trg_min_x) - C.y_pos = (T.y - trg_min_y) - - moving: - for (var/turf/T in refined_src) - var/datum/coords/C_src = refined_src[T] - for (var/turf/B in refined_trg) - var/datum/coords/C_trg = refined_trg[B] - if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) - - //You can stay, though. - if(istype(T,/turf/space)) - refined_src -= T - refined_trg -= B - continue moving - - var/turf/X //New Destination Turf - - //Are we doing shuttlework? Just to save another type check later. - var/shuttlework = 0 - - //Shuttle turfs handle their own fancy moving. - if(istype(T,/turf/simulated/shuttle)) - shuttlework = 1 - var/turf/simulated/shuttle/SS = T - if(!SS.landed_holder) SS.landed_holder = new(turf = SS) - X = SS.landed_holder.land_on(B) - - //Generic non-shuttle turf move. - else - var/old_dir1 = T.dir - var/old_icon_state1 = T.icon_state - var/old_icon1 = T.icon - var/old_underlays = T.underlays.Copy() - var/old_decals = T.decals ? T.decals.Copy() : null - - X = B.ChangeTurf(T.type) - X.set_dir(old_dir1) - X.icon_state = old_icon_state1 - X.icon = old_icon1 - X.copy_overlays(T, TRUE) - X.underlays = old_underlays - X.decals = old_decals - - //Move the air from source to dest - var/turf/simulated/ST = T - if(istype(ST) && ST.zone) - var/turf/simulated/SX = X - if(!SX.air) - SX.make_air() - SX.air.copy_from(ST.zone.air) - ST.zone.remove(ST) - - var/z_level_change = FALSE - if(T.z != X.z) - z_level_change = TRUE - - //Move the objects. Not forceMove because the object isn't "moving" really, it's supposed to be on the "same" turf. - for(var/obj/O in T) - O.loc = X - O.update_light() - if(z_level_change) // The objects still need to know if their z-level changed. - O.onTransitZ(T.z, X.z) - - //Move the mobs unless it's an AI eye or other eye type. - for(var/mob/M in T) - if(istype(M, /mob/observer/eye)) continue // If we need to check for more mobs, I'll add a variable - M.loc = X - - if(z_level_change) // Same goes for mobs. - M.onTransitZ(T.z, X.z) - - if(istype(M, /mob/living)) - var/mob/living/LM = M - LM.check_shadow() // Need to check their Z-shadow, which is normally done in forceMove(). - - if(shuttlework) - var/turf/simulated/shuttle/SS = T - SS.landed_holder.leave_turf() - else if(turftoleave) - T.ChangeTurf(turftoleave) - else - T.ChangeTurf(get_base_turf_by_area(T)) - - refined_src -= T - refined_trg -= B - continue moving - -proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) - if(!original) - return null - - var/obj/O = null - - if(sameloc) - O=new original.type(original.loc) - else - O=new original.type(locate(0,0,0)) - - if(perfectcopy) - if((O) && (original)) - for(var/V in original.vars) - if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key"))) - O.vars[V] = original.vars[V] - return O - - -/area/proc/copy_contents_to(var/area/A , var/platingRequired = 0 ) - //Takes: Area. Optional: If it should copy to areas that don't have plating - //Returns: Nothing. - //Notes: Attempts to move the contents of one area to another area. - // Movement based on lower left corner. Tiles that do not fit - // into the new area will not be moved. - - // Does *not* affect gases etc; copied turfs will be changed via ChangeTurf, and the dir, icon, and icon_state copied. All other vars will remain default. - - if(!A || !src) return 0 - - var/list/turfs_src = get_area_turfs(src.type) - var/list/turfs_trg = get_area_turfs(A.type) - - var/src_min_x = 0 - var/src_min_y = 0 - for (var/turf/T in turfs_src) - if(T.x < src_min_x || !src_min_x) src_min_x = T.x - if(T.y < src_min_y || !src_min_y) src_min_y = T.y - - var/trg_min_x = 0 - var/trg_min_y = 0 - for (var/turf/T in turfs_trg) - if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x - if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y - - var/list/refined_src = new/list() - for(var/turf/T in turfs_src) - refined_src += T - refined_src[T] = new/datum/coords - var/datum/coords/C = refined_src[T] - C.x_pos = (T.x - src_min_x) - C.y_pos = (T.y - src_min_y) - - var/list/refined_trg = new/list() - for(var/turf/T in turfs_trg) - refined_trg += T - refined_trg[T] = new/datum/coords - var/datum/coords/C = refined_trg[T] - C.x_pos = (T.x - trg_min_x) - C.y_pos = (T.y - trg_min_y) - - var/list/toupdate = new/list() - - var/copiedobjs = list() - - - moving: - for (var/turf/T in refined_src) - var/datum/coords/C_src = refined_src[T] - for (var/turf/B in refined_trg) - var/datum/coords/C_trg = refined_trg[B] - if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) - - var/old_dir1 = T.dir - var/old_icon_state1 = T.icon_state - var/old_icon1 = T.icon - var/old_overlays = T.overlays.Copy() - var/old_underlays = T.underlays.Copy() - - if(platingRequired) - if(istype(B, get_base_turf_by_area(B))) - continue moving - - var/turf/X = B - X.ChangeTurf(T.type) - X.set_dir(old_dir1) - X.icon_state = old_icon_state1 - X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi - X.overlays = old_overlays - X.underlays = old_underlays - - var/list/objs = new/list() - var/list/newobjs = new/list() - var/list/mobs = new/list() - var/list/newmobs = new/list() - - for(var/obj/O in T) - - if(!istype(O,/obj)) - continue - - objs += O - - - for(var/obj/O in objs) - newobjs += DuplicateObject(O , 1) - - - for(var/obj/O in newobjs) - O.loc = X - - for(var/mob/M in T) - - if(!istype(M,/mob) || istype(M, /mob/observer/eye)) continue // If we need to check for more mobs, I'll add a variable - mobs += M - - for(var/mob/M in mobs) - newmobs += DuplicateObject(M , 1) - - for(var/mob/M in newmobs) - M.loc = X - - copiedobjs += newobjs - copiedobjs += newmobs - -// var/area/AR = X.loc - -// if(AR.dynamic_lighting) -// X.opacity = !X.opacity -// X.sd_SetOpacity(!X.opacity) //TODO: rewrite this code so it's not messed by lighting ~Carn - - toupdate += X - - refined_src -= T - refined_trg -= B - continue moving - - - - - if(toupdate.len) - for(var/turf/simulated/T1 in toupdate) - air_master.mark_for_update(T1) - - return copiedobjs - - - -proc/get_cardinal_dir(atom/A, atom/B) - var/dx = abs(B.x - A.x) - var/dy = abs(B.y - A.y) - return get_dir(A, B) & (rand() * (dx+dy) < dy ? 3 : 12) - -//chances are 1:value. anyprob(1) will always return true -proc/anyprob(value) - return (rand(1,value)==value) - -proc/view_or_range(distance = world.view , center = usr , type) - switch(type) - if("view") - . = view(distance,center) - if("range") - . = range(distance,center) - return - -proc/oview_or_orange(distance = world.view , center = usr , type) - switch(type) - if("view") - . = oview(distance,center) - if("range") - . = orange(distance,center) - return - -proc/get_mob_with_client_list() - var/list/mobs = list() - for(var/mob/M in mob_list) - if (M.client) - mobs += M - return mobs - - -/proc/parse_zone(zone) - if(zone == "r_hand") return "right hand" - else if (zone == "l_hand") return "left hand" - else if (zone == "l_arm") return "left arm" - else if (zone == "r_arm") return "right arm" - else if (zone == "l_leg") return "left leg" - else if (zone == "r_leg") return "right leg" - else if (zone == "l_foot") return "left foot" - else if (zone == "r_foot") return "right foot" - else if (zone == "l_hand") return "left hand" - else if (zone == "r_hand") return "right hand" - else if (zone == "l_foot") return "left foot" - else if (zone == "r_foot") return "right foot" - else return zone - -/proc/get(atom/loc, type) - while(loc) - if(istype(loc, type)) - return loc - loc = loc.loc - return null - -/proc/get_turf_or_move(turf/location) - return get_turf(location) - - -//Quick type checks for some tools -var/global/list/common_tools = list( -/obj/item/stack/cable_coil, -/obj/item/weapon/tool/wrench, -/obj/item/weapon/weldingtool, -/obj/item/weapon/tool/screwdriver, -/obj/item/weapon/tool/wirecutters, -/obj/item/device/multitool, -/obj/item/weapon/tool/crowbar) - -/proc/istool(O) - if(O && is_type_in_list(O, common_tools)) - return 1 - return 0 - - -/proc/is_wire_tool(obj/item/I) - if(istype(I, /obj/item/device/multitool) || I.is_wirecutter()) - return TRUE - if(istype(I, /obj/item/device/assembly/signaler)) - return TRUE - return - -proc/is_hot(obj/item/W as obj) - switch(W.type) - if(/obj/item/weapon/weldingtool) - var/obj/item/weapon/weldingtool/WT = W - if(WT.isOn()) - return 3800 - else - return 0 - if(/obj/item/weapon/flame/lighter) - if(W:lit) - return 1500 - else - return 0 - if(/obj/item/weapon/flame/match) - if(W:lit) - return 1000 - else - return 0 - if(/obj/item/clothing/mask/smokable/cigarette) - if(W:lit) - return 1000 - else - return 0 - if(/obj/item/weapon/pickaxe/plasmacutter) - return 3800 - if(/obj/item/weapon/melee/energy) - return 3500 - else - return 0 - - return 0 - -//Whether or not the given item counts as sharp in terms of dealing damage -/proc/is_sharp(obj/O as obj) - if(!O) - return FALSE - if(O.sharp) - return TRUE - if(O.edge) - return TRUE - return FALSE - -//Whether or not the given item counts as cutting with an edge in terms of removing limbs -/proc/has_edge(obj/O as obj) - if(!O) - return FALSE - if(O.edge) - return TRUE - return FALSE - -//Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape. -/proc/can_puncture(obj/item/W as obj) // For the record, WHAT THE HELL IS THIS METHOD OF DOING IT? - if(!W) - return FALSE - if(W.sharp) - return TRUE - return ( \ - W.is_screwdriver() || \ - istype(W, /obj/item/weapon/pen) || \ - istype(W, /obj/item/weapon/weldingtool) || \ - istype(W, /obj/item/weapon/flame/lighter/zippo) || \ - istype(W, /obj/item/weapon/flame/match) || \ - istype(W, /obj/item/clothing/mask/smokable/cigarette) || \ - istype(W, /obj/item/weapon/shovel) \ - ) - -/proc/is_surgery_tool(obj/item/W as obj) - return ( \ - istype(W, /obj/item/weapon/surgical/scalpel) || \ - istype(W, /obj/item/weapon/surgical/hemostat) || \ - istype(W, /obj/item/weapon/surgical/retractor) || \ - istype(W, /obj/item/weapon/surgical/cautery) || \ - istype(W, /obj/item/weapon/surgical/bonegel) || \ - istype(W, /obj/item/weapon/surgical/bonesetter) - ) - -// check if mob is lying down on something we can operate him on. -// The RNG with table/rollerbeds comes into play in do_surgery() so that fail_step() can be used instead. -/proc/can_operate(mob/living/carbon/M) - return M.lying - -// Returns an instance of a valid surgery surface. -/mob/living/proc/get_surgery_surface() - if(!lying) - return null // Not lying down means no surface. - var/obj/surface = null - for(var/obj/O in loc) // Looks for the best surface. - if(O.surgery_odds) - if(!surface || surface.surgery_odds < O) - surface = O - if(surface) - return surface - -/proc/reverse_direction(var/dir) - switch(dir) - if(NORTH) - return SOUTH - if(NORTHEAST) - return SOUTHWEST - if(EAST) - return WEST - if(SOUTHEAST) - return NORTHWEST - if(SOUTH) - return NORTH - if(SOUTHWEST) - return NORTHEAST - if(WEST) - return EAST - if(NORTHWEST) - return SOUTHEAST - -/* -Checks if that loc and dir has a item on the wall -TODO - Fix this ancient list of wall items. Preferably make it dynamically populated. ~Leshana -*/ -var/list/WALLITEMS = list( - /obj/machinery/power/apc, /obj/machinery/alarm, /obj/item/device/radio/intercom, /obj/structure/frame, - /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank, - /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign, - /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/button/remote, - /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio, - /obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth, - /obj/structure/mirror, /obj/structure/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment - ) -/proc/gotwallitem(loc, dir) - for(var/obj/O in loc) - for(var/item in WALLITEMS) - if(istype(O, item)) - //Direction works sometimes - if(O.dir == dir) - return 1 - - //Some stuff doesn't use dir properly, so we need to check pixel instead - switch(dir) - if(SOUTH) - if(O.pixel_y > 10) - return 1 - if(NORTH) - if(O.pixel_y < -10) - return 1 - if(WEST) - if(O.pixel_x > 10) - return 1 - if(EAST) - if(O.pixel_x < -10) - return 1 - - - //Some stuff is placed directly on the wallturf (signs) - for(var/obj/O in get_step(loc, dir)) - for(var/item in WALLITEMS) - if(istype(O, item)) - if(O.pixel_x == 0 && O.pixel_y == 0) - return 1 - return 0 - -/proc/format_text(text) - return replacetext(replacetext(text,"\proper ",""),"\improper ","") - -/proc/topic_link(var/datum/D, var/arglist, var/content) - if(istype(arglist,/list)) - arglist = list2params(arglist) - return "[content]" - -/proc/get_random_colour(var/simple, var/lower=0, var/upper=255) - var/colour - if(simple) - colour = pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF")) - else - for(var/i=1;i<=3;i++) - var/temp_col = "[num2hex(rand(lower,upper))]" - if(length(temp_col )<2) - temp_col = "0[temp_col]" - colour += temp_col - return colour - -var/mob/dview/dview_mob = new - -//Version of view() which ignores darkness, because BYOND doesn't have it. -/proc/dview(var/range = world.view, var/center, var/invis_flags = 0) - if(!center) - return - - dview_mob.loc = center - - dview_mob.see_invisible = invis_flags - - . = view(range, dview_mob) - dview_mob.loc = null - -/mob/dview - invisibility = 101 - density = 0 - - anchored = 1 - simulated = 0 - - see_in_dark = 1e6 - -/atom/proc/get_light_and_color(var/atom/origin) - if(origin) - color = origin.color - set_light(origin.light_range, origin.light_power, origin.light_color) - -/mob/dview/New() - ..() - // We don't want to be in any mob lists; we're a dummy not a mob. - mob_list -= src - if(stat == DEAD) - dead_mob_list -= src - else - living_mob_list -= src - -/mob/dview/Life() - mob_list -= src - dead_mob_list -= src - living_mob_list -= src - -/mob/dview/Destroy(var/force) - crash_with("Attempt to delete the dview_mob: [log_info_line(src)]") - if (!force) - return QDEL_HINT_LETMELIVE - global.dview_mob = new - return ..() - -// call to generate a stack trace and print to runtime logs -/proc/crash_with(msg) - CRASH(msg) - -/proc/screen_loc2turf(scr_loc, turf/origin) - var/tX = splittext(scr_loc, ",") - var/tY = splittext(tX[2], ":") - var/tZ = origin.z - tY = tY[1] - tX = splittext(tX[1], ":") - tX = tX[1] - tX = max(1, min(world.maxx, origin.x + (text2num(tX) - (world.view + 1)))) - tY = max(1, min(world.maxy, origin.y + (text2num(tY) - (world.view + 1)))) - return locate(tX, tY, tZ) - -// Displays something as commonly used (non-submultiples) SI units. -/proc/format_SI(var/number, var/symbol) - switch(round(abs(number))) - if(0 to 1000-1) - return "[number] [symbol]" - if(1e3 to 1e6-1) - return "[round(number / 1000, 0.1)] k[symbol]" // kilo - if(1e6 to 1e9-1) - return "[round(number / 1e6, 0.1)] M[symbol]" // mega - if(1e9 to 1e12-1) // Probably not needed but why not be complete? - return "[round(number / 1e9, 0.1)] G[symbol]" // giga - if(1e12 to 1e15-1) - return "[round(number / 1e12, 0.1)] T[symbol]" // tera - - - -//ultra range (no limitations on distance, faster than range for distances > 8); including areas drastically decreases performance -/proc/urange(dist=0, atom/center=usr, orange=0, areas=0) - if(!dist) - if(!orange) - return list(center) - else - return list() - - var/list/turfs = RANGE_TURFS(dist, center) - if(orange) - turfs -= get_turf(center) - . = list() - for(var/V in turfs) - var/turf/T = V - . += T - . += T.contents - if(areas) - . |= T.loc - -#define NOT_FLAG(flag) (!(flag & use_flags)) -#define HAS_FLAG(flag) (flag & use_flags) - -// Checks if user can use this object. Set use_flags to customize what checks are done. -// Returns 0 if they can use it, a value representing why they can't if not. -// Flags are in `code/__defines/misc.dm` -/atom/proc/use_check(mob/user, use_flags = 0, show_messages = FALSE) - . = 0 - if (NOT_FLAG(USE_ALLOW_NONLIVING) && !isliving(user)) - // No message for ghosts. - return USE_FAIL_NONLIVING - - if (NOT_FLAG(USE_ALLOW_NON_ADJACENT) && !Adjacent(user)) - if (show_messages) - to_chat(user, span("notice","You're too far away from [src] to do that.")) - return USE_FAIL_NON_ADJACENT - - if (NOT_FLAG(USE_ALLOW_DEAD) && user.stat == DEAD) - if (show_messages) - to_chat(user, span("notice","You can't do that when you're dead.")) - return USE_FAIL_DEAD - - if (NOT_FLAG(USE_ALLOW_INCAPACITATED) && (user.incapacitated())) - if (show_messages) - to_chat(user, span("notice","You cannot do that in your current state.")) - return USE_FAIL_INCAPACITATED - - if (NOT_FLAG(USE_ALLOW_NON_ADV_TOOL_USR) && !user.IsAdvancedToolUser()) - if (show_messages) - to_chat(user, span("notice","You don't know how to operate [src].")) - return USE_FAIL_NON_ADV_TOOL_USR - - if (HAS_FLAG(USE_DISALLOW_SILICONS) && issilicon(user)) - if (show_messages) - to_chat(user, span("notice","You need hands for that.")) - return USE_FAIL_IS_SILICON - - if (HAS_FLAG(USE_FORCE_SRC_IN_USER) && !(src in user)) - if (show_messages) - to_chat(user, span("notice","You need to be holding [src] to do that.")) - return USE_FAIL_NOT_IN_USER - -#undef NOT_FLAG -#undef HAS_FLAG - -//datum may be null, but it does need to be a typed var -#define NAMEOF(datum, X) (#X || ##datum.##X) - -#define VARSET_LIST_CALLBACK(target, var_name, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##target, ##var_name, ##var_value) -//dupe code because dm can't handle 3 level deep macros -#define VARSET_CALLBACK(datum, var, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##datum, NAMEOF(##datum, ##var), ##var_value) -//we'll see about those 3-level deep macros -#define VARSET_IN(datum, var, var_value, time) addtimer(VARSET_CALLBACK(datum, var, var_value), time) - -/proc/___callbackvarset(list_or_datum, var_name, var_value) - if(length(list_or_datum)) - list_or_datum[var_name] = var_value - return - var/datum/D = list_or_datum - D.vars[var_name] = var_value - -// Returns direction-string, rounded to multiples of 22.5, from the first parameter to the second -// N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW -/proc/get_adir(var/turf/A, var/turf/B) - var/degree = Get_Angle(A, B) - switch(round(degree%360, 22.5)) - if(0) - return "North" - if(22.5) - return "North-Northeast" - if(45) - return "Northeast" - if(67.5) - return "East-Northeast" - if(90) - return "East" - if(112.5) - return "East-Southeast" - if(135) - return "Southeast" - if(157.5) - return "South-Southeast" - if(180) - return "South" - if(202.5) - return "South-Southwest" - if(225) - return "Southwest" - if(247.5) - return "West-Southwest" - if(270) - return "West" - if(292.5) - return "West-Northwest" - if(315) - return "Northwest" - if(337.5) - return "North-Northwest" - -//gives us the stack trace from CRASH() without ending the current proc. -/proc/stack_trace(msg) - CRASH(msg) - -//This is used to force compiletime errors if you incorrectly supply variable names. Crafty! -#define NAMEOF(datum, X) (#X || ##datum.##X) - -/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) - if (value == FALSE) //nothing should be calling us with a number, so this is safe - value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text - if (isnull(value)) - return - value = trim(value) - if(!isnull(value) && value != "") - matches = filter_fancy_list(matches, value) - - if(matches.len==0) - return - - var/chosen - if(matches.len==1) - chosen = matches[1] - else - chosen = input("Select a type", "Pick Type", matches[1]) as null|anything in matches - if(!chosen) - return - chosen = matches[chosen] - return chosen - -/proc/get_fancy_list_of_atom_types() - var/static/list/pre_generated_list - if (!pre_generated_list) //init - pre_generated_list = make_types_fancy(typesof(/atom)) - return pre_generated_list - -/proc/get_fancy_list_of_datum_types() - var/static/list/pre_generated_list - if (!pre_generated_list) //init - pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom))) - return pre_generated_list - -/proc/filter_fancy_list(list/L, filter as text) - var/list/matches = new - for(var/key in L) - var/value = L[key] - if(findtext("[key]", filter) || findtext("[value]", filter)) - matches[key] = value - return matches - -/proc/make_types_fancy(var/list/types) - if (ispath(types)) - types = list(types) - . = list() - for(var/type in types) - var/typename = "[type]" - var/static/list/TYPES_SHORTCUTS = list( - /obj/effect/decal/cleanable = "CLEANABLE", - /obj/item/device/radio/headset = "HEADSET", - /obj/item/clothing/head/helmet/space = "SPESSHELMET", - /obj/item/weapon/book/manual = "MANUAL", - /obj/item/weapon/reagent_containers/food/drinks = "DRINK", - /obj/item/weapon/reagent_containers/food = "FOOD", - /obj/item/weapon/reagent_containers = "REAGENT_CONTAINERS", - /obj/machinery/atmospherics = "ATMOS_MECH", - /obj/machinery/portable_atmospherics = "PORT_ATMOS", - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", - /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", - /obj/item/organ = "ORGAN", - /obj/item = "ITEM", - /obj/machinery = "MACHINERY", - /obj/effect = "EFFECT", - /obj = "O", - /datum = "D", - /turf/simulated/wall = "S-WALL", - /turf/simulated/floor = "S-FLOOR", - /turf/simulated = "SIMULATED", - /turf/unsimulated/wall = "US-WALL", - /turf/unsimulated/floor = "US-FLOOR", - /turf/unsimulated = "UNSIMULATED", - /turf = "T", - /mob/living/carbon = "CARBON", - /mob/living/simple_mob = "SIMPLE", - /mob/living = "LIVING", - /mob = "M" - ) - for (var/tn in TYPES_SHORTCUTS) - if (copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ ) - typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/")) - break - .[typename] = type - -/proc/IsValidSrc(datum/D) - if(istype(D)) - return !QDELETED(D) - return FALSE - -// \ref behaviour got changed in 512 so this is necesary to replicate old behaviour. -// If it ever becomes necesary to get a more performant REF(), this lies here in wait -// #define REF(thing) (thing && istype(thing, /datum) && (thing:datum_flags & DF_USE_TAG) && thing:tag ? "[thing:tag]" : "\ref[thing]") -/proc/REF(input) - if(istype(input, /datum)) - var/datum/thing = input - if(thing.datum_flags & DF_USE_TAG) - if(!thing.tag) - thing.datum_flags &= ~DF_USE_TAG - stack_trace("A ref was requested of an object with DF_USE_TAG set but no tag: [thing]") - else - return "\[[url_encode(thing.tag)]\]" - return "\ref[input]" - -/proc/pass() - return - -// Painlessly creates an element. -// First argument is where to send the Topic call to when clicked. Should be a reference to an object. This is generally src, but not always. -// Second one is for all the params that will be sent. Uses an assoc list (e.g. "value" = "5"). -// Note that object refs will be converted to text, as if \ref[thing] was done. To get the ref back on Topic() side, you will need to use locate(). -// Third one is the text that will be clickable. -/proc/href(href_src, list/href_params, href_text) - return "[href_text]" +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 + +/* + * A large number of misc global procs. + */ + +//Checks if all high bits in req_mask are set in bitfield +#define BIT_TEST_ALL(bitfield, req_mask) ((~(bitfield) & (req_mask)) == 0) + +//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a +#define RANGE_TURFS(RADIUS, CENTER) \ + block( \ + locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ + locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ + ) + +//Inverts the colour of an HTML string +/proc/invertHTML(HTMLstring) + + if (!( istext(HTMLstring) )) + CRASH("Given non-text argument!") + return + else + if (length(HTMLstring) != 7) + CRASH("Given non-HTML argument!") + return + var/textr = copytext(HTMLstring, 2, 4) + var/textg = copytext(HTMLstring, 4, 6) + var/textb = copytext(HTMLstring, 6, 8) + var/r = hex2num(textr) + var/g = hex2num(textg) + var/b = hex2num(textb) + textr = num2hex(255 - r) + textg = num2hex(255 - g) + textb = num2hex(255 - b) + if (length(textr) < 2) + textr = text("0[]", textr) + if (length(textg) < 2) + textr = text("0[]", textg) + if (length(textb) < 2) + textr = text("0[]", textb) + return text("#[][][]", textr, textg, textb) + return + +//Returns the middle-most value +/proc/dd_range(var/low, var/high, var/num) + return max(low,min(high,num)) + +//Returns whether or not A is the middle most value +/proc/InRange(var/A, var/lower, var/upper) + if(A < lower) return 0 + if(A > upper) return 0 + return 1 + + +/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. + if(!start || !end) return 0 + var/dy + var/dx + dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) + dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x) + if(!dy) + return (dx>=0)?90:270 + .=arctan(dx/dy) + if(dy<0) + .+=180 + else if(dx<0) + .+=360 + +//Returns location. Returns null if no location was found. +/proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = 0, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) +/* +Location where the teleport begins, target that will teleport, distance to go, density checking 0/1(yes/no). +Random error in tile placement x, error in tile placement y, and block offset. +Block offset tells the proc how to place the box. Behind teleport location, relative to starting location, forward, etc. +Negative values for offset are accepted, think of it in relation to North, -x is west, -y is south. Error defaults to positive. +Turf and target are seperate in case you want to teleport some distance from a turf the target is not standing on or something. +*/ + + var/dirx = 0//Generic location finding variable. + var/diry = 0 + + var/xoffset = 0//Generic counter for offset location. + var/yoffset = 0 + + var/b1xerror = 0//Generic placing for point A in box. The lower left. + var/b1yerror = 0 + var/b2xerror = 0//Generic placing for point B in box. The upper right. + var/b2yerror = 0 + + errorx = abs(errorx)//Error should never be negative. + errory = abs(errory) + //var/errorxy = round((errorx+errory)/2)//Used for diagonal boxes. + + switch(target.dir)//This can be done through equations but switch is the simpler method. And works fast to boot. + //Directs on what values need modifying. + if(1)//North + diry+=distance + yoffset+=eoffsety + xoffset+=eoffsetx + b1xerror-=errorx + b1yerror-=errory + b2xerror+=errorx + b2yerror+=errory + if(2)//South + diry-=distance + yoffset-=eoffsety + xoffset+=eoffsetx + b1xerror-=errorx + b1yerror-=errory + b2xerror+=errorx + b2yerror+=errory + if(4)//East + dirx+=distance + yoffset+=eoffsetx//Flipped. + xoffset+=eoffsety + b1xerror-=errory//Flipped. + b1yerror-=errorx + b2xerror+=errory + b2yerror+=errorx + if(8)//West + dirx-=distance + yoffset-=eoffsetx//Flipped. + xoffset+=eoffsety + b1xerror-=errory//Flipped. + b1yerror-=errorx + b2xerror+=errory + b2yerror+=errorx + + var/turf/destination=locate(location.x+dirx,location.y+diry,location.z) + + if(destination)//If there is a destination. + if(errorx||errory)//If errorx or y were specified. + var/destination_list[] = list()//To add turfs to list. + //destination_list = new() + /*This will draw a block around the target turf, given what the error is. + Specifying the values above will basically draw a different sort of block. + If the values are the same, it will be a square. If they are different, it will be a rectengle. + In either case, it will center based on offset. Offset is position from center. + Offset always calculates in relation to direction faced. In other words, depending on the direction of the teleport, + the offset should remain positioned in relation to destination.*/ + + var/turf/center = locate((destination.x+xoffset),(destination.y+yoffset),location.z)//So now, find the new center. + + //Now to find a box from center location and make that our destination. + for(var/turf/T in block(locate(center.x+b1xerror,center.y+b1yerror,location.z), locate(center.x+b2xerror,center.y+b2yerror,location.z) )) + if(density&&(T.density||T.contains_dense_objects())) continue//If density was specified. + if(T.x>world.maxx || T.x<1) continue//Don't want them to teleport off the map. + if(T.y>world.maxy || T.y<1) continue + destination_list += T + if(destination_list.len) + destination = pick(destination_list) + else return + + else//Same deal here. + if(density&&(destination.density||destination.contains_dense_objects())) return + if(destination.x>world.maxx || destination.x<1) return + if(destination.y>world.maxy || destination.y<1) return + else return + + return destination + + + +/proc/LinkBlocked(turf/A, turf/B) + if(A == null || B == null) return 1 + var/adir = get_dir(A,B) + var/rdir = get_dir(B,A) + if((adir & (NORTH|SOUTH)) && (adir & (EAST|WEST))) // diagonal + var/iStep = get_step(A,adir&(NORTH|SOUTH)) + if(!LinkBlocked(A,iStep) && !LinkBlocked(iStep,B)) return 0 + + var/pStep = get_step(A,adir&(EAST|WEST)) + if(!LinkBlocked(A,pStep) && !LinkBlocked(pStep,B)) return 0 + return 1 + + if(DirBlocked(A,adir)) return 1 + if(DirBlocked(B,rdir)) return 1 + return 0 + + +/proc/DirBlocked(turf/loc,var/dir) + for(var/obj/structure/window/D in loc) + if(!D.density) continue + if(D.dir == SOUTHWEST) return 1 + if(D.dir == dir) return 1 + + for(var/obj/machinery/door/D in loc) + if(!D.density) continue + if(istype(D, /obj/machinery/door/window)) + if((dir & SOUTH) && (D.dir & (EAST|WEST))) return 1 + if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return 1 + else return 1 // it's a real, air blocking door + return 0 + +/proc/TurfBlockedNonWindow(turf/loc) + for(var/obj/O in loc) + if(O.density && !istype(O, /obj/structure/window)) + return 1 + return 0 + +/proc/sign(x) + return x!=0?x/abs(x):0 + +/proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm + var/px=M.x //starting x + var/py=M.y + var/line[] = list(locate(px,py,M.z)) + var/dx=N.x-px //x distance + var/dy=N.y-py + var/dxabs=abs(dx)//Absolute value of x distance + var/dyabs=abs(dy) + var/sdx=sign(dx) //Sign of x distance (+ or -) + var/sdy=sign(dy) + var/x=dxabs>>1 //Counters for steps taken, setting to distance/2 + var/y=dyabs>>1 //Bit-shifting makes me l33t. It also makes getline() unnessecarrily fast. + var/j //Generic integer for counting + if(dxabs>=dyabs) //x distance is greater than y + for(j=0;j=dxabs) //Every dyabs steps, step once in y direction + y-=dxabs + py+=sdy + px+=sdx //Step on in x direction + line+=locate(px,py,M.z)//Add the turf to the list + else + for(j=0;j=dyabs) + x-=dyabs + px+=sdx + py+=sdy + line+=locate(px,py,M.z) + return line + +#define LOCATE_COORDS(X, Y, Z) locate(between(1, X, world.maxx), between(1, Y, world.maxy), Z) +/proc/getcircle(turf/center, var/radius) //Uses a fast Bresenham rasterization algorithm to return the turfs in a thin circle. + if(!radius) return list(center) + + var/x = 0 + var/y = radius + var/p = 3 - 2 * radius + + . = list() + while(y >= x) // only formulate 1/8 of circle + + . += LOCATE_COORDS(center.x - x, center.y - y, center.z) //upper left left + . += LOCATE_COORDS(center.x - y, center.y - x, center.z) //upper upper left + . += LOCATE_COORDS(center.x + y, center.y - x, center.z) //upper upper right + . += LOCATE_COORDS(center.x + x, center.y - y, center.z) //upper right right + . += LOCATE_COORDS(center.x - x, center.y + y, center.z) //lower left left + . += LOCATE_COORDS(center.x - y, center.y + x, center.z) //lower lower left + . += LOCATE_COORDS(center.x + y, center.y + x, center.z) //lower lower right + . += LOCATE_COORDS(center.x + x, center.y + y, center.z) //lower right right + + if(p < 0) + p += 4*x++ + 6; + else + p += 4*(x++ - y--) + 10; + +#undef LOCATE_COORDS + +//Returns whether or not a player is a guest using their ckey as an input +/proc/IsGuestKey(key) + if (findtext(key, "Guest-", 1, 7) != 1) //was findtextEx + return 0 + + var/i = 7, ch, len = length(key) + + if(copytext(key, 7, 8) == "W") //webclient + i++ + + for (, i <= len, ++i) + ch = text2ascii(key, i) + if (ch < 48 || ch > 57) + return 0 + return 1 + +//Ensure the frequency is within bounds of what it should be sending/recieving at +/proc/sanitize_frequency(var/f, var/low = PUBLIC_LOW_FREQ, var/high = PUBLIC_HIGH_FREQ) + f = round(f) + f = max(low, f) + f = min(high, f) + if ((f % 2) == 0) //Ensure the last digit is an odd number + f += 1 + return f + +//Turns 1479 into 147.9 +/proc/format_frequency(var/f) + return "[round(f / 10)].[f % 10]" + + + +//This will update a mob's name, real_name, mind.name, data_core records, pda and id +//Calling this proc without an oldname will only update the mob and skip updating the pda, id and records ~Carn +/mob/proc/fully_replace_character_name(var/oldname,var/newname) + if(!newname) return 0 + real_name = newname + name = newname + if(mind) + mind.name = newname + if(dna) + dna.real_name = real_name + + if(oldname) + //update the datacore records! This is goig to be a bit costly. + for(var/list/L in list(data_core.general,data_core.medical,data_core.security,data_core.locked)) + for(var/datum/data/record/R in L) + if(R.fields["name"] == oldname) + R.fields["name"] = newname + break + + //update our pda and id if we have them on our person + var/list/searching = GetAllContents(searchDepth = 3) + var/search_id = 1 + var/search_pda = 1 + + for(var/A in searching) + if( search_id && istype(A,/obj/item/weapon/card/id) ) + var/obj/item/weapon/card/id/ID = A + if(ID.registered_name == oldname) + ID.registered_name = newname + ID.name = "[newname]'s ID Card ([ID.assignment])" + if(!search_pda) break + search_id = 0 + + else if( search_pda && istype(A,/obj/item/device/pda) ) + var/obj/item/device/pda/PDA = A + if(PDA.owner == oldname) + PDA.owner = newname + PDA.name = "PDA-[newname] ([PDA.ownjob])" + if(!search_id) break + search_pda = 0 + return 1 + + + +//Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame() +//Last modified by Carn +/mob/proc/rename_self(var/role, var/allow_numbers=0) + spawn(0) + var/oldname = real_name + + var/time_passed = world.time + var/newname + + for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name. + newname = input(src,"You are \a [role]. Would you like to change your name to something else?", "Name change",oldname) as text + if((world.time-time_passed)>3000) + return //took too long + newname = sanitizeName(newname, ,allow_numbers) //returns null if the name doesn't meet some basic requirements. Tidies up a few other things like bad-characters. + + for(var/mob/living/M in player_list) + if(M == src) + continue + if(!newname || M.real_name == newname) + newname = null + break + if(newname) + break //That's a suitable name! + to_chat(src, "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken.") + + if(!newname) //we'll stick with the oldname then + return + + if(cmptext("ai",role)) + if(isAI(src)) + var/mob/living/silicon/ai/A = src + oldname = null//don't bother with the records update crap + //to_world("[newname] is the AI!") + //world << sound('sound/AI/newAI.ogg') + // Set eyeobj name + A.SetName(newname) + + + fully_replace_character_name(oldname,newname) + + + +//Picks a string of symbols to display as the law number for hacked or ion laws +/proc/ionnum() + return "[pick("1","2","3","4","5","6","7","8","9","0")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]" + +//When an AI is activated, it can choose from a list of non-slaved borgs to have as a slave. +/proc/freeborg() + var/select = null + var/list/borgs = list() + for (var/mob/living/silicon/robot/A in player_list) + if (A.stat == 2 || A.connected_ai || A.scrambledcodes || istype(A,/mob/living/silicon/robot/drone)) + continue + var/name = "[A.real_name] ([A.modtype] [A.braintype])" + borgs[name] = A + + if (borgs.len) + select = input("Unshackled borg signals detected:", "Borg selection", null, null) as null|anything in borgs + return borgs[select] + +//When a borg is activated, it can choose which AI it wants to be slaved to +/proc/active_ais() + . = list() + for(var/mob/living/silicon/ai/A in living_mob_list) + if(A.stat == DEAD) + continue + if(A.control_disabled == 1) + continue + . += A + return . + +//Find an active ai with the least borgs. VERBOSE PROCNAME HUH! +/proc/select_active_ai_with_fewest_borgs() + var/mob/living/silicon/ai/selected + var/list/active = active_ais() + for(var/mob/living/silicon/ai/A in active) + if(!selected || (selected.connected_robots.len > A.connected_robots.len)) + selected = A + + return selected + +/proc/select_active_ai(var/mob/user) + var/list/ais = active_ais() + if(ais.len) + if(user) . = input(usr,"AI signals detected:", "AI selection") in ais + else . = pick(ais) + return . + +/proc/get_sorted_mobs() + var/list/old_list = getmobs() + var/list/AI_list = list() + var/list/Dead_list = list() + var/list/keyclient_list = list() + var/list/key_list = list() + var/list/logged_list = list() + for(var/named in old_list) + var/mob/M = old_list[named] + if(issilicon(M)) + AI_list |= M + else if(isobserver(M) || M.stat == 2) + Dead_list |= M + else if(M.key && M.client) + keyclient_list |= M + else if(M.key) + key_list |= M + else + logged_list |= M + old_list.Remove(named) + var/list/new_list = list() + new_list += AI_list + new_list += keyclient_list + new_list += key_list + new_list += logged_list + new_list += Dead_list + return new_list + +//Returns a list of all mobs with their name +/proc/getmobs() + return observe_list_format(sortmobs()) + +//Orders mobs by type then by name +/proc/sortmobs() + var/list/moblist = list() + var/list/sortmob = sortAtom(mob_list) + for(var/mob/observer/eye/M in sortmob) + moblist.Add(M) + for(var/mob/observer/blob/M in sortmob) + moblist.Add(M) + for(var/mob/living/silicon/ai/M in sortmob) + moblist.Add(M) + for(var/mob/living/silicon/pai/M in sortmob) + moblist.Add(M) + for(var/mob/living/silicon/robot/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/human/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/brain/M in sortmob) + moblist.Add(M) + for(var/mob/living/carbon/alien/M in sortmob) + moblist.Add(M) + for(var/mob/observer/dead/M in sortmob) + moblist.Add(M) + for(var/mob/new_player/M in sortmob) + moblist.Add(M) + for(var/mob/living/simple_mob/M in sortmob) + moblist.Add(M) +// for(var/mob/living/silicon/hivebot/M in sortmob) +// mob_list.Add(M) +// for(var/mob/living/silicon/hive_mainframe/M in sortmob) +// mob_list.Add(M) + return moblist + +/proc/observe_list_format(input_list) + if(!islist(input_list)) + return + var/list/names = list() + var/list/output_list = list() + var/list/namecounts = list() + var/name + for(var/atom/A in input_list) + name = A.name + if(name in names) + namecounts[name]++ + name = "[name] ([namecounts[name]])" + else + names.Add(name) + namecounts[name] = 1 + if(ismob(A)) + var/mob/M = A + if(M.real_name && M.real_name != M.name) + name += " \[[M.real_name]\]" + if(M.stat == DEAD) + if(istype(M, /mob/observer/dead/)) + name += " \[ghost\]" + else + name += " \[dead\]" + output_list[name] = A + + return output_list + +// Format a power value in W, kW, MW, or GW. +/proc/DisplayPower(powerused) + if(powerused < 1000) //Less than a kW + return "[powerused] W" + else if(powerused < 1000000) //Less than a MW + return "[round((powerused * 0.001),0.01)] kW" + else if(powerused < 1000000000) //Less than a GW + return "[round((powerused * 0.000001),0.001)] MW" + return "[round((powerused * 0.000000001),0.0001)] GW" + +/proc/get_mob_by_ckey(key) + if(!key) + return + var/list/mobs = sortmobs() + for(var/mob/M in mobs) + if(M.ckey == key) + return M + +//Forces a variable to be posative +/proc/modulus(var/M) + if(M >= 0) + return M + if(M < 0) + return -M + +// returns the turf located at the map edge in the specified direction relative to A +// used for mass driver +/proc/get_edge_target_turf(var/atom/A, var/direction) + + var/turf/target = locate(A.x, A.y, A.z) + if(!A || !target) + return 0 + //since NORTHEAST == NORTH & EAST, etc, doing it this way allows for diagonal mass drivers in the future + //and isn't really any more complicated + + // Note diagonal directions won't usually be accurate + if(direction & NORTH) + target = locate(target.x, world.maxy, target.z) + if(direction & SOUTH) + target = locate(target.x, 1, target.z) + if(direction & EAST) + target = locate(world.maxx, target.y, target.z) + if(direction & WEST) + target = locate(1, target.y, target.z) + + return target + +// returns turf relative to A in given direction at set range +// result is bounded to map size +// note range is non-pythagorean +// used for disposal system +/proc/get_ranged_target_turf(var/atom/A, var/direction, var/range) + + var/x = A.x + var/y = A.y + if(direction & NORTH) + y = min(world.maxy, y + range) + if(direction & SOUTH) + y = max(1, y - range) + if(direction & EAST) + x = min(world.maxx, x + range) + if(direction & WEST) + x = max(1, x - range) + + return locate(x,y,A.z) + + +// returns turf relative to A offset in dx and dy tiles +// bound to map limits +/proc/get_offset_target_turf(var/atom/A, var/dx, var/dy) + var/x = min(world.maxx, max(1, A.x + dx)) + var/y = min(world.maxy, max(1, A.y + dy)) + return locate(x,y,A.z) + +//Makes sure MIDDLE is between LOW and HIGH. If not, it adjusts it. Returns the adjusted value. +/proc/between(var/low, var/middle, var/high) + return max(min(middle, high), low) + +//returns random gauss number +proc/GaussRand(var/sigma) + var/x,y,rsq + do + x=2*rand()-1 + y=2*rand()-1 + rsq=x*x+y*y + while(rsq>1 || !rsq) + return sigma*y*sqrt(-2*log(rsq)/rsq) + +//returns random gauss number, rounded to 'roundto' +proc/GaussRandRound(var/sigma,var/roundto) + return round(GaussRand(sigma),roundto) + +//Will return the contents of an atom recursivly to a depth of 'searchDepth' +/atom/proc/GetAllContents(searchDepth = 5) + var/list/toReturn = list() + + for(var/atom/part in contents) + toReturn += part + if(part.contents.len && searchDepth) + toReturn += part.GetAllContents(searchDepth - 1) + + return toReturn + +//Step-towards method of determining whether one atom can see another. Similar to viewers() +/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldn't be arsed to do actual raycasting :I This is horribly inaccurate. + var/turf/current = get_turf(source) + var/turf/target_turf = get_turf(target) + var/steps = 0 + + if(!current || !target_turf) + return 0 + + while(current != target_turf) + if(steps > length) return 0 + if(current.opacity) return 0 + for(var/atom/A in current) + if(A.opacity) return 0 + current = get_step_towards(current, target_turf) + steps++ + + return 1 + +/proc/is_blocked_turf(var/turf/T) + var/cant_pass = 0 + if(T.density) cant_pass = 1 + for(var/atom/A in T) + if(A.density)//&&A.anchored + cant_pass = 1 + return cant_pass + +/proc/get_step_towards2(var/atom/ref , var/atom/trg) + var/base_dir = get_dir(ref, get_step_towards(ref,trg)) + var/turf/temp = get_step_towards(ref,trg) + + if(is_blocked_turf(temp)) + var/dir_alt1 = turn(base_dir, 90) + var/dir_alt2 = turn(base_dir, -90) + var/turf/turf_last1 = temp + var/turf/turf_last2 = temp + var/free_tile = null + var/breakpoint = 0 + + while(!free_tile && breakpoint < 10) + if(!is_blocked_turf(turf_last1)) + free_tile = turf_last1 + break + if(!is_blocked_turf(turf_last2)) + free_tile = turf_last2 + break + turf_last1 = get_step(turf_last1,dir_alt1) + turf_last2 = get_step(turf_last2,dir_alt2) + breakpoint++ + + if(!free_tile) return get_step(ref, base_dir) + else return get_step_towards(ref,free_tile) + + else return get_step(ref, base_dir) + +//Takes: Anything that could possibly have variables and a varname to check. +//Returns: 1 if found, 0 if not. +/proc/hasvar(var/datum/A, var/varname) + if(A.vars.Find(lowertext(varname))) return 1 + else return 0 + +//Returns: all the areas in the world +/proc/return_areas() + var/list/area/areas = list() + for(var/area/A in world) + areas += A + return areas + +//Returns: all the areas in the world, sorted. +/proc/return_sorted_areas() + return sortAtom(return_areas()) + +//Takes: Area type as text string or as typepath OR an instance of the area. +//Returns: A list of all areas of that type in the world. +/proc/get_areas(var/areatype) + if(!areatype) return null + if(istext(areatype)) areatype = text2path(areatype) + if(isarea(areatype)) + var/area/areatemp = areatype + areatype = areatemp.type + + var/list/areas = new/list() + for(var/area/N in world) + if(istype(N, areatype)) areas += N + return areas + +//Takes: Area type as text string or as typepath OR an instance of the area. +//Returns: A list of all turfs in areas of that type of that type in the world. +/proc/get_area_turfs(var/areatype) + if(!areatype) return null + if(istext(areatype)) areatype = text2path(areatype) + if(isarea(areatype)) + var/area/areatemp = areatype + areatype = areatemp.type + + var/list/turfs = new/list() + for(var/area/N in world) + if(istype(N, areatype)) + for(var/turf/T in N) turfs += T + return turfs + +//Takes: Area type as text string or as typepath OR an instance of the area. +//Returns: A list of all atoms (objs, turfs, mobs) in areas of that type of that type in the world. +/proc/get_area_all_atoms(var/areatype) + if(!areatype) return null + if(istext(areatype)) areatype = text2path(areatype) + if(isarea(areatype)) + var/area/areatemp = areatype + areatype = areatemp.type + + var/list/atoms = new/list() + for(var/area/N in world) + if(istype(N, areatype)) + for(var/atom/A in N) + atoms += A + return atoms + +/datum/coords //Simple datum for storing coordinates. + var/x_pos = null + var/y_pos = null + var/z_pos = null + +/area/proc/move_contents_to(var/area/A, var/turftoleave=null, var/direction = null) + //Takes: Area. Optional: turf type to leave behind. + //Returns: Nothing. + //Notes: Attempts to move the contents of one area to another area. + // Movement based on lower left corner. Tiles that do not fit + // into the new area will not be moved. + + if(!A || !src) return 0 + + var/list/turfs_src = get_area_turfs(src.type) + var/list/turfs_trg = get_area_turfs(A.type) + + var/src_min_x = 0 + var/src_min_y = 0 + for (var/turf/T in turfs_src) + if(T.x < src_min_x || !src_min_x) src_min_x = T.x + if(T.y < src_min_y || !src_min_y) src_min_y = T.y + + var/trg_min_x = 0 + var/trg_min_y = 0 + for (var/turf/T in turfs_trg) + if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x + if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y + + var/list/refined_src = new/list() + for(var/turf/T in turfs_src) + refined_src += T + refined_src[T] = new/datum/coords + var/datum/coords/C = refined_src[T] + C.x_pos = (T.x - src_min_x) + C.y_pos = (T.y - src_min_y) + + var/list/refined_trg = new/list() + for(var/turf/T in turfs_trg) + refined_trg += T + refined_trg[T] = new/datum/coords + var/datum/coords/C = refined_trg[T] + C.x_pos = (T.x - trg_min_x) + C.y_pos = (T.y - trg_min_y) + + moving: + for (var/turf/T in refined_src) + var/datum/coords/C_src = refined_src[T] + for (var/turf/B in refined_trg) + var/datum/coords/C_trg = refined_trg[B] + if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) + + //You can stay, though. + if(istype(T,/turf/space)) + refined_src -= T + refined_trg -= B + continue moving + + var/turf/X //New Destination Turf + + //Are we doing shuttlework? Just to save another type check later. + var/shuttlework = 0 + + //Shuttle turfs handle their own fancy moving. + if(istype(T,/turf/simulated/shuttle)) + shuttlework = 1 + var/turf/simulated/shuttle/SS = T + if(!SS.landed_holder) SS.landed_holder = new(turf = SS) + X = SS.landed_holder.land_on(B) + + //Generic non-shuttle turf move. + else + var/old_dir1 = T.dir + var/old_icon_state1 = T.icon_state + var/old_icon1 = T.icon + var/old_underlays = T.underlays.Copy() + var/old_decals = T.decals ? T.decals.Copy() : null + + X = B.ChangeTurf(T.type) + X.set_dir(old_dir1) + X.icon_state = old_icon_state1 + X.icon = old_icon1 + X.copy_overlays(T, TRUE) + X.underlays = old_underlays + X.decals = old_decals + + //Move the air from source to dest + var/turf/simulated/ST = T + if(istype(ST) && ST.zone) + var/turf/simulated/SX = X + if(!SX.air) + SX.make_air() + SX.air.copy_from(ST.zone.air) + ST.zone.remove(ST) + + var/z_level_change = FALSE + if(T.z != X.z) + z_level_change = TRUE + + //Move the objects. Not forceMove because the object isn't "moving" really, it's supposed to be on the "same" turf. + for(var/obj/O in T) + O.loc = X + O.update_light() + if(z_level_change) // The objects still need to know if their z-level changed. + O.onTransitZ(T.z, X.z) + + //Move the mobs unless it's an AI eye or other eye type. + for(var/mob/M in T) + if(istype(M, /mob/observer/eye)) continue // If we need to check for more mobs, I'll add a variable + M.loc = X + + if(z_level_change) // Same goes for mobs. + M.onTransitZ(T.z, X.z) + + if(istype(M, /mob/living)) + var/mob/living/LM = M + LM.check_shadow() // Need to check their Z-shadow, which is normally done in forceMove(). + + if(shuttlework) + var/turf/simulated/shuttle/SS = T + SS.landed_holder.leave_turf() + else if(turftoleave) + T.ChangeTurf(turftoleave) + else + T.ChangeTurf(get_base_turf_by_area(T)) + + refined_src -= T + refined_trg -= B + continue moving + +proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) + if(!original) + return null + + var/obj/O = null + + if(sameloc) + O=new original.type(original.loc) + else + O=new original.type(locate(0,0,0)) + + if(perfectcopy) + if((O) && (original)) + for(var/V in original.vars) + if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key"))) + O.vars[V] = original.vars[V] + return O + + +/area/proc/copy_contents_to(var/area/A , var/platingRequired = 0 ) + //Takes: Area. Optional: If it should copy to areas that don't have plating + //Returns: Nothing. + //Notes: Attempts to move the contents of one area to another area. + // Movement based on lower left corner. Tiles that do not fit + // into the new area will not be moved. + + // Does *not* affect gases etc; copied turfs will be changed via ChangeTurf, and the dir, icon, and icon_state copied. All other vars will remain default. + + if(!A || !src) return 0 + + var/list/turfs_src = get_area_turfs(src.type) + var/list/turfs_trg = get_area_turfs(A.type) + + var/src_min_x = 0 + var/src_min_y = 0 + for (var/turf/T in turfs_src) + if(T.x < src_min_x || !src_min_x) src_min_x = T.x + if(T.y < src_min_y || !src_min_y) src_min_y = T.y + + var/trg_min_x = 0 + var/trg_min_y = 0 + for (var/turf/T in turfs_trg) + if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x + if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y + + var/list/refined_src = new/list() + for(var/turf/T in turfs_src) + refined_src += T + refined_src[T] = new/datum/coords + var/datum/coords/C = refined_src[T] + C.x_pos = (T.x - src_min_x) + C.y_pos = (T.y - src_min_y) + + var/list/refined_trg = new/list() + for(var/turf/T in turfs_trg) + refined_trg += T + refined_trg[T] = new/datum/coords + var/datum/coords/C = refined_trg[T] + C.x_pos = (T.x - trg_min_x) + C.y_pos = (T.y - trg_min_y) + + var/list/toupdate = new/list() + + var/copiedobjs = list() + + + moving: + for (var/turf/T in refined_src) + var/datum/coords/C_src = refined_src[T] + for (var/turf/B in refined_trg) + var/datum/coords/C_trg = refined_trg[B] + if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos) + + var/old_dir1 = T.dir + var/old_icon_state1 = T.icon_state + var/old_icon1 = T.icon + var/old_overlays = T.overlays.Copy() + var/old_underlays = T.underlays.Copy() + + if(platingRequired) + if(istype(B, get_base_turf_by_area(B))) + continue moving + + var/turf/X = B + X.ChangeTurf(T.type) + X.set_dir(old_dir1) + X.icon_state = old_icon_state1 + X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi + X.overlays = old_overlays + X.underlays = old_underlays + + var/list/objs = new/list() + var/list/newobjs = new/list() + var/list/mobs = new/list() + var/list/newmobs = new/list() + + for(var/obj/O in T) + + if(!istype(O,/obj)) + continue + + objs += O + + + for(var/obj/O in objs) + newobjs += DuplicateObject(O , 1) + + + for(var/obj/O in newobjs) + O.loc = X + + for(var/mob/M in T) + + if(!istype(M,/mob) || istype(M, /mob/observer/eye)) continue // If we need to check for more mobs, I'll add a variable + mobs += M + + for(var/mob/M in mobs) + newmobs += DuplicateObject(M , 1) + + for(var/mob/M in newmobs) + M.loc = X + + copiedobjs += newobjs + copiedobjs += newmobs + +// var/area/AR = X.loc + +// if(AR.dynamic_lighting) +// X.opacity = !X.opacity +// X.sd_SetOpacity(!X.opacity) //TODO: rewrite this code so it's not messed by lighting ~Carn + + toupdate += X + + refined_src -= T + refined_trg -= B + continue moving + + + + + if(toupdate.len) + for(var/turf/simulated/T1 in toupdate) + air_master.mark_for_update(T1) + + return copiedobjs + + + +proc/get_cardinal_dir(atom/A, atom/B) + var/dx = abs(B.x - A.x) + var/dy = abs(B.y - A.y) + return get_dir(A, B) & (rand() * (dx+dy) < dy ? 3 : 12) + +//chances are 1:value. anyprob(1) will always return true +proc/anyprob(value) + return (rand(1,value)==value) + +proc/view_or_range(distance = world.view , center = usr , type) + switch(type) + if("view") + . = view(distance,center) + if("range") + . = range(distance,center) + return + +proc/oview_or_orange(distance = world.view , center = usr , type) + switch(type) + if("view") + . = oview(distance,center) + if("range") + . = orange(distance,center) + return + +proc/get_mob_with_client_list() + var/list/mobs = list() + for(var/mob/M in mob_list) + if (M.client) + mobs += M + return mobs + + +/proc/parse_zone(zone) + if(zone == "r_hand") return "right hand" + else if (zone == "l_hand") return "left hand" + else if (zone == "l_arm") return "left arm" + else if (zone == "r_arm") return "right arm" + else if (zone == "l_leg") return "left leg" + else if (zone == "r_leg") return "right leg" + else if (zone == "l_foot") return "left foot" + else if (zone == "r_foot") return "right foot" + else if (zone == "l_hand") return "left hand" + else if (zone == "r_hand") return "right hand" + else if (zone == "l_foot") return "left foot" + else if (zone == "r_foot") return "right foot" + else return zone + +/proc/get(atom/loc, type) + while(loc) + if(istype(loc, type)) + return loc + loc = loc.loc + return null + +/proc/get_turf_or_move(turf/location) + return get_turf(location) + + +//Quick type checks for some tools +var/global/list/common_tools = list( +/obj/item/stack/cable_coil, +/obj/item/weapon/tool/wrench, +/obj/item/weapon/weldingtool, +/obj/item/weapon/tool/screwdriver, +/obj/item/weapon/tool/wirecutters, +/obj/item/device/multitool, +/obj/item/weapon/tool/crowbar) + +/proc/istool(O) + if(O && is_type_in_list(O, common_tools)) + return 1 + return 0 + + +/proc/is_wire_tool(obj/item/I) + if(istype(I, /obj/item/device/multitool) || I.is_wirecutter()) + return TRUE + if(istype(I, /obj/item/device/assembly/signaler)) + return TRUE + return + +proc/is_hot(obj/item/W as obj) + switch(W.type) + if(/obj/item/weapon/weldingtool) + var/obj/item/weapon/weldingtool/WT = W + if(WT.isOn()) + return 3800 + else + return 0 + if(/obj/item/weapon/flame/lighter) + if(W:lit) + return 1500 + else + return 0 + if(/obj/item/weapon/flame/match) + if(W:lit) + return 1000 + else + return 0 + if(/obj/item/clothing/mask/smokable/cigarette) + if(W:lit) + return 1000 + else + return 0 + if(/obj/item/weapon/pickaxe/plasmacutter) + return 3800 + if(/obj/item/weapon/melee/energy) + return 3500 + else + return 0 + + return 0 + +//Whether or not the given item counts as sharp in terms of dealing damage +/proc/is_sharp(obj/O as obj) + if(!O) + return FALSE + if(O.sharp) + return TRUE + if(O.edge) + return TRUE + return FALSE + +//Whether or not the given item counts as cutting with an edge in terms of removing limbs +/proc/has_edge(obj/O as obj) + if(!O) + return FALSE + if(O.edge) + return TRUE + return FALSE + +//Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape. +/proc/can_puncture(obj/item/W as obj) // For the record, WHAT THE HELL IS THIS METHOD OF DOING IT? + if(!W) + return FALSE + if(W.sharp) + return TRUE + return ( \ + W.is_screwdriver() || \ + istype(W, /obj/item/weapon/pen) || \ + istype(W, /obj/item/weapon/weldingtool) || \ + istype(W, /obj/item/weapon/flame/lighter/zippo) || \ + istype(W, /obj/item/weapon/flame/match) || \ + istype(W, /obj/item/clothing/mask/smokable/cigarette) || \ + istype(W, /obj/item/weapon/shovel) \ + ) + +/proc/is_surgery_tool(obj/item/W as obj) + return ( \ + istype(W, /obj/item/weapon/surgical/scalpel) || \ + istype(W, /obj/item/weapon/surgical/hemostat) || \ + istype(W, /obj/item/weapon/surgical/retractor) || \ + istype(W, /obj/item/weapon/surgical/cautery) || \ + istype(W, /obj/item/weapon/surgical/bonegel) || \ + istype(W, /obj/item/weapon/surgical/bonesetter) + ) + +// check if mob is lying down on something we can operate him on. +// The RNG with table/rollerbeds comes into play in do_surgery() so that fail_step() can be used instead. +/proc/can_operate(mob/living/carbon/M) + return M.lying + +// Returns an instance of a valid surgery surface. +/mob/living/proc/get_surgery_surface() + if(!lying) + return null // Not lying down means no surface. + var/obj/surface = null + for(var/obj/O in loc) // Looks for the best surface. + if(O.surgery_odds) + if(!surface || surface.surgery_odds < O) + surface = O + if(surface) + return surface + +/proc/reverse_direction(var/dir) + switch(dir) + if(NORTH) + return SOUTH + if(NORTHEAST) + return SOUTHWEST + if(EAST) + return WEST + if(SOUTHEAST) + return NORTHWEST + if(SOUTH) + return NORTH + if(SOUTHWEST) + return NORTHEAST + if(WEST) + return EAST + if(NORTHWEST) + return SOUTHEAST + +/* +Checks if that loc and dir has a item on the wall +TODO - Fix this ancient list of wall items. Preferably make it dynamically populated. ~Leshana +*/ +var/list/WALLITEMS = list( + /obj/machinery/power/apc, /obj/machinery/alarm, /obj/item/device/radio/intercom, /obj/structure/frame, + /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank, + /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign, + /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/button/remote, + /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio, + /obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth, + /obj/structure/mirror, /obj/structure/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment + ) +/proc/gotwallitem(loc, dir) + for(var/obj/O in loc) + for(var/item in WALLITEMS) + if(istype(O, item)) + //Direction works sometimes + if(O.dir == dir) + return 1 + + //Some stuff doesn't use dir properly, so we need to check pixel instead + switch(dir) + if(SOUTH) + if(O.pixel_y > 10) + return 1 + if(NORTH) + if(O.pixel_y < -10) + return 1 + if(WEST) + if(O.pixel_x > 10) + return 1 + if(EAST) + if(O.pixel_x < -10) + return 1 + + + //Some stuff is placed directly on the wallturf (signs) + for(var/obj/O in get_step(loc, dir)) + for(var/item in WALLITEMS) + if(istype(O, item)) + if(O.pixel_x == 0 && O.pixel_y == 0) + return 1 + return 0 + +/proc/format_text(text) + return replacetext(replacetext(text,"\proper ",""),"\improper ","") + +/proc/topic_link(var/datum/D, var/arglist, var/content) + if(istype(arglist,/list)) + arglist = list2params(arglist) + return "[content]" + +/proc/get_random_colour(var/simple, var/lower=0, var/upper=255) + var/colour + if(simple) + colour = pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF")) + else + for(var/i=1;i<=3;i++) + var/temp_col = "[num2hex(rand(lower,upper))]" + if(length(temp_col )<2) + temp_col = "0[temp_col]" + colour += temp_col + return colour + +var/mob/dview/dview_mob = new + +//Version of view() which ignores darkness, because BYOND doesn't have it. +/proc/dview(var/range = world.view, var/center, var/invis_flags = 0) + if(!center) + return + + dview_mob.loc = center + + dview_mob.see_invisible = invis_flags + + . = view(range, dview_mob) + dview_mob.loc = null + +/mob/dview + invisibility = 101 + density = 0 + + anchored = 1 + simulated = 0 + + see_in_dark = 1e6 + +/atom/proc/get_light_and_color(var/atom/origin) + if(origin) + color = origin.color + set_light(origin.light_range, origin.light_power, origin.light_color) + +/mob/dview/New() + ..() + // We don't want to be in any mob lists; we're a dummy not a mob. + mob_list -= src + if(stat == DEAD) + dead_mob_list -= src + else + living_mob_list -= src + +/mob/dview/Life() + mob_list -= src + dead_mob_list -= src + living_mob_list -= src + +/mob/dview/Destroy(var/force) + crash_with("Attempt to delete the dview_mob: [log_info_line(src)]") + if (!force) + return QDEL_HINT_LETMELIVE + global.dview_mob = new + return ..() + +// call to generate a stack trace and print to runtime logs +/proc/crash_with(msg) + CRASH(msg) + +/proc/screen_loc2turf(scr_loc, turf/origin) + var/tX = splittext(scr_loc, ",") + var/tY = splittext(tX[2], ":") + var/tZ = origin.z + tY = tY[1] + tX = splittext(tX[1], ":") + tX = tX[1] + tX = max(1, min(world.maxx, origin.x + (text2num(tX) - (world.view + 1)))) + tY = max(1, min(world.maxy, origin.y + (text2num(tY) - (world.view + 1)))) + return locate(tX, tY, tZ) + +// Displays something as commonly used (non-submultiples) SI units. +/proc/format_SI(var/number, var/symbol) + switch(round(abs(number))) + if(0 to 1000-1) + return "[number] [symbol]" + if(1e3 to 1e6-1) + return "[round(number / 1000, 0.1)] k[symbol]" // kilo + if(1e6 to 1e9-1) + return "[round(number / 1e6, 0.1)] M[symbol]" // mega + if(1e9 to 1e12-1) // Probably not needed but why not be complete? + return "[round(number / 1e9, 0.1)] G[symbol]" // giga + if(1e12 to 1e15-1) + return "[round(number / 1e12, 0.1)] T[symbol]" // tera + + + +//ultra range (no limitations on distance, faster than range for distances > 8); including areas drastically decreases performance +/proc/urange(dist=0, atom/center=usr, orange=0, areas=0) + if(!dist) + if(!orange) + return list(center) + else + return list() + + var/list/turfs = RANGE_TURFS(dist, center) + if(orange) + turfs -= get_turf(center) + . = list() + for(var/V in turfs) + var/turf/T = V + . += T + . += T.contents + if(areas) + . |= T.loc + +#define NOT_FLAG(flag) (!(flag & use_flags)) +#define HAS_FLAG(flag) (flag & use_flags) + +// Checks if user can use this object. Set use_flags to customize what checks are done. +// Returns 0 if they can use it, a value representing why they can't if not. +// Flags are in `code/__defines/misc.dm` +/atom/proc/use_check(mob/user, use_flags = 0, show_messages = FALSE) + . = 0 + if (NOT_FLAG(USE_ALLOW_NONLIVING) && !isliving(user)) + // No message for ghosts. + return USE_FAIL_NONLIVING + + if (NOT_FLAG(USE_ALLOW_NON_ADJACENT) && !Adjacent(user)) + if (show_messages) + to_chat(user, span("notice","You're too far away from [src] to do that.")) + return USE_FAIL_NON_ADJACENT + + if (NOT_FLAG(USE_ALLOW_DEAD) && user.stat == DEAD) + if (show_messages) + to_chat(user, span("notice","You can't do that when you're dead.")) + return USE_FAIL_DEAD + + if (NOT_FLAG(USE_ALLOW_INCAPACITATED) && (user.incapacitated())) + if (show_messages) + to_chat(user, span("notice","You cannot do that in your current state.")) + return USE_FAIL_INCAPACITATED + + if (NOT_FLAG(USE_ALLOW_NON_ADV_TOOL_USR) && !user.IsAdvancedToolUser()) + if (show_messages) + to_chat(user, span("notice","You don't know how to operate [src].")) + return USE_FAIL_NON_ADV_TOOL_USR + + if (HAS_FLAG(USE_DISALLOW_SILICONS) && issilicon(user)) + if (show_messages) + to_chat(user, span("notice","You need hands for that.")) + return USE_FAIL_IS_SILICON + + if (HAS_FLAG(USE_FORCE_SRC_IN_USER) && !(src in user)) + if (show_messages) + to_chat(user, span("notice","You need to be holding [src] to do that.")) + return USE_FAIL_NOT_IN_USER + +#undef NOT_FLAG +#undef HAS_FLAG + +//datum may be null, but it does need to be a typed var +#define NAMEOF(datum, X) (#X || ##datum.##X) + +#define VARSET_LIST_CALLBACK(target, var_name, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##target, ##var_name, ##var_value) +//dupe code because dm can't handle 3 level deep macros +#define VARSET_CALLBACK(datum, var, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##datum, NAMEOF(##datum, ##var), ##var_value) +//we'll see about those 3-level deep macros +#define VARSET_IN(datum, var, var_value, time) addtimer(VARSET_CALLBACK(datum, var, var_value), time) + +/proc/___callbackvarset(list_or_datum, var_name, var_value) + if(length(list_or_datum)) + list_or_datum[var_name] = var_value + return + var/datum/D = list_or_datum + D.vars[var_name] = var_value + +// Returns direction-string, rounded to multiples of 22.5, from the first parameter to the second +// N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW +/proc/get_adir(var/turf/A, var/turf/B) + var/degree = Get_Angle(A, B) + switch(round(degree%360, 22.5)) + if(0) + return "North" + if(22.5) + return "North-Northeast" + if(45) + return "Northeast" + if(67.5) + return "East-Northeast" + if(90) + return "East" + if(112.5) + return "East-Southeast" + if(135) + return "Southeast" + if(157.5) + return "South-Southeast" + if(180) + return "South" + if(202.5) + return "South-Southwest" + if(225) + return "Southwest" + if(247.5) + return "West-Southwest" + if(270) + return "West" + if(292.5) + return "West-Northwest" + if(315) + return "Northwest" + if(337.5) + return "North-Northwest" + +/proc/pass() + return + +#define NAMEOF(datum, X) (#X || ##datum.##X) + +/proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) + if (value == FALSE) //nothing should be calling us with a number, so this is safe + value = input("Enter type to find (blank for all, cancel to cancel)", "Search for type") as null|text + if (isnull(value)) + return + value = trim(value) + if(!isnull(value) && value != "") + matches = filter_fancy_list(matches, value) + + if(matches.len==0) + return + + var/chosen + if(matches.len==1) + chosen = matches[1] + else + chosen = input("Select a type", "Pick Type", matches[1]) as null|anything in matches + if(!chosen) + return + chosen = matches[chosen] + return chosen + +/proc/get_fancy_list_of_atom_types() + var/static/list/pre_generated_list + if (!pre_generated_list) //init + pre_generated_list = make_types_fancy(typesof(/atom)) + return pre_generated_list + +/proc/get_fancy_list_of_datum_types() + var/static/list/pre_generated_list + if (!pre_generated_list) //init + pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom))) + return pre_generated_list + +/proc/filter_fancy_list(list/L, filter as text) + var/list/matches = new + for(var/key in L) + var/value = L[key] + if(findtext("[key]", filter) || findtext("[value]", filter)) + matches[key] = value + return matches + +/proc/make_types_fancy(var/list/types) + if (ispath(types)) + types = list(types) + . = list() + for(var/type in types) + var/typename = "[type]" + var/static/list/TYPES_SHORTCUTS = list( + /obj/effect/decal/cleanable = "CLEANABLE", + /obj/item/device/radio/headset = "HEADSET", + /obj/item/clothing/head/helmet/space = "SPESSHELMET", + /obj/item/weapon/book/manual = "MANUAL", + /obj/item/weapon/reagent_containers/food/drinks = "DRINK", + /obj/item/weapon/reagent_containers/food = "FOOD", + /obj/item/weapon/reagent_containers = "REAGENT_CONTAINERS", + /obj/machinery/atmospherics = "ATMOS_MECH", + /obj/machinery/portable_atmospherics = "PORT_ATMOS", + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", + /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", + /obj/item/organ = "ORGAN", + /obj/item = "ITEM", + /obj/machinery = "MACHINERY", + /obj/effect = "EFFECT", + /obj = "O", + /datum = "D", + /turf/simulated/wall = "S-WALL", + /turf/simulated/floor = "S-FLOOR", + /turf/simulated = "SIMULATED", + /turf/unsimulated/wall = "US-WALL", + /turf/unsimulated/floor = "US-FLOOR", + /turf/unsimulated = "UNSIMULATED", + /turf = "T", + /mob/living/carbon = "CARBON", + /mob/living/simple_mob = "SIMPLE", + /mob/living = "LIVING", + /mob = "M" + ) + for (var/tn in TYPES_SHORTCUTS) + if (copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ ) + typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/")) + break + .[typename] = type + +/proc/IsValidSrc(datum/D) + if(istype(D)) + return !QDELETED(D) + return FALSE + +//gives us the stack trace from CRASH() without ending the current proc. +/proc/stack_trace(msg) + CRASH(msg) + +/datum/proc/stack_trace(msg) + CRASH(msg) + +// \ref behaviour got changed in 512 so this is necesary to replicate old behaviour. +// If it ever becomes necesary to get a more performant REF(), this lies here in wait +// #define REF(thing) (thing && istype(thing, /datum) && (thing:datum_flags & DF_USE_TAG) && thing:tag ? "[thing:tag]" : "\ref[thing]") +/proc/REF(input) + if(istype(input, /datum)) + var/datum/thing = input + if(thing.datum_flags & DF_USE_TAG) + if(!thing.tag) + thing.datum_flags &= ~DF_USE_TAG + stack_trace("A ref was requested of an object with DF_USE_TAG set but no tag: [thing]") + else + return "\[[url_encode(thing.tag)]\]" + return "\ref[input]" + +// Painlessly creates an element. +// First argument is where to send the Topic call to when clicked. Should be a reference to an object. This is generally src, but not always. +// Second one is for all the params that will be sent. Uses an assoc list (e.g. "value" = "5"). +// Note that object refs will be converted to text, as if \ref[thing] was done. To get the ref back on Topic() side, you will need to use locate(). +// Third one is the text that will be clickable. +/proc/href(href_src, list/href_params, href_text) + return "[href_text]" diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm index 0ba67f8ab6..ad14c1e6cd 100644 --- a/code/controllers/subsystems/supply.dm +++ b/code/controllers/subsystems/supply.dm @@ -23,23 +23,6 @@ SUBSYSTEM_DEF(supply) //shuttle movement var/movetime = 1200 var/datum/shuttle/autodock/ferry/supply/shuttle - var/list/material_points_conversion = list( // Any materials not named in this list are worth 0 points - "silver" = 2, - "marble" = 2, - "gold" = 2, - "uranium" = 2, - "lead" = 2, - "platinum" = 5, - "phoron" = 5, - "titanium" = 6, - "plasteel" = 6, - "osmium" = 6, - "mhydrogen" = 6, - "verdantium" = 8, - "diamond" = 8, - "durasteel" = 9, - "morphium" = 13 - )//SPOOKY number! /datum/controller/subsystem/supply/Initialize() ordernum = rand(1,9000) @@ -52,7 +35,6 @@ SUBSYSTEM_DEF(supply) else qdel(P) - // TODO - Auto-build material_points_conversion from material datums . = ..() // Supply shuttle ticker - handles supply point regeneration. Just add points over time. @@ -123,8 +105,9 @@ SUBSYSTEM_DEF(supply) // Sell phoron and platinum if(istype(A, /obj/item/stack)) var/obj/item/stack/P = A - if(material_points_conversion[P.get_material_name()]) - EC.contents[EC.contents.len]["value"] = P.get_amount() * material_points_conversion[P.get_material_name()] + var/material/mat = P.get_material() + if(mat?.supply_conversion_value) + EC.contents[EC.contents.len]["value"] = P.get_amount() * mat.supply_conversion_value EC.contents[EC.contents.len]["quantity"] = P.get_amount() EC.value += EC.contents[EC.contents.len]["value"] diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 89d3d3b343..025087228c 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -755,6 +755,18 @@ to_chat(user, "You cannot refit a customised voidsuit.") return + //VOREStation Edit BEGINS + //Make it so autolok suits can't be refitted in a cycler + if(istype(I,/obj/item/clothing/head/helmet/space/void/autolok)) + to_chat(user, "You cannot refit an autolok helmet. In fact you shouldn't even be able to remove it in the first place. Inform an admin!") + return + + //Ditto the Mk7 + if(istype(I,/obj/item/clothing/head/helmet/space/void/responseteam)) + to_chat(user, "The cycler indicates that the Mark VII Emergency Response Helmet is not compatible with the refitting system. How did you manage to detach it anyway? Inform an admin!") + return + //VOREStation Edit ENDS + to_chat(user, "You fit \the [I] into the suit cycler.") user.drop_item() I.loc = src @@ -778,6 +790,18 @@ to_chat(user, "You cannot refit a customised voidsuit.") return + //VOREStation Edit BEGINS + //Make it so autolok suits can't be refitted in a cycler + if(istype(I,/obj/item/clothing/suit/space/void/autolok)) + to_chat(user, "You cannot refit an autolok suit.") + return + + //Ditto the Mk7 + if(istype(I,/obj/item/clothing/suit/space/void/responseteam)) + to_chat(user, "The cycler indicates that the Mark VII Emergency Response Suit is not compatible with the refitting system.") + return + //VOREStation Edit ENDS + to_chat(user, "You fit \the [I] into the suit cycler.") user.drop_item() I.loc = src @@ -1138,8 +1162,8 @@ parent_helmet = /obj/item/clothing/head/helmet/space/void/captain parent_suit = /obj/item/clothing/suit/space/void/captain if("Prototype") - parent_helmet = /obj/item/clothing/head/helmet/space/void/merc/prototype - parent_suit = /obj/item/clothing/suit/space/void/merc/prototype + parent_helmet = /obj/item/clothing/head/helmet/space/void/security/prototype + parent_suit = /obj/item/clothing/suit/space/void/security/prototype if("Talon Crew") parent_helmet = /obj/item/clothing/head/helmet/space/void/refurb/talon parent_suit = /obj/item/clothing/suit/space/void/refurb/talon diff --git a/code/game/machinery/suit_storage_unit_vr.dm b/code/game/machinery/suit_storage_unit_vr.dm index ffe3bb977f..cec50f5fcc 100644 --- a/code/game/machinery/suit_storage_unit_vr.dm +++ b/code/game/machinery/suit_storage_unit_vr.dm @@ -23,7 +23,7 @@ /obj/machinery/suit_cycler/prototype name = "Prototype suit cycler" model_text = "Prototype" - req_access = list(access_cent_specops) + req_access = list(access_hos) departments = list("Prototype") /obj/machinery/suit_cycler/prototype/Initialize() //No Teshari Sprites diff --git a/code/game/machinery/vending_vr.dm b/code/game/machinery/vending_vr.dm index a40444af23..007405b474 100644 --- a/code/game/machinery/vending_vr.dm +++ b/code/game/machinery/vending_vr.dm @@ -183,64 +183,64 @@ /obj/item/clothing/shoes/boots/winter = 5, /obj/item/clothing/shoes/boots/workboots = 5, /obj/item/clothing/shoes/footwraps = 5) - prices = list(/obj/item/clothing/gloves/evening = 200, - /obj/item/clothing/gloves/fingerless = 200, - /obj/item/clothing/gloves/black = 200, - /obj/item/clothing/gloves/blue = 200, - /obj/item/clothing/gloves/brown = 200, - /obj/item/clothing/gloves/color = 200, - /obj/item/clothing/gloves/green = 200, - /obj/item/clothing/gloves/grey = 200, - /obj/item/clothing/gloves/sterile/latex = 200, - /obj/item/clothing/gloves/light_brown = 200, - /obj/item/clothing/gloves/sterile/nitrile = 200, - /obj/item/clothing/gloves/orange = 200, - /obj/item/clothing/gloves/purple = 200, - /obj/item/clothing/gloves/red = 200, - /obj/item/clothing/gloves/fluff/siren = 200, - /obj/item/clothing/gloves/white = 200, - /obj/item/clothing/gloves/duty = 200, - /obj/item/clothing/shoes/athletic = 100, - /obj/item/clothing/shoes/boots/fluff/siren = 100, - /obj/item/clothing/shoes/slippers = 100, - /obj/item/clothing/shoes/boots/cowboy/classic = 100, - /obj/item/clothing/shoes/boots/cowboy = 100, - /obj/item/clothing/shoes/boots/duty = 200, - /obj/item/clothing/shoes/flats/white/color = 100, - /obj/item/clothing/shoes/flipflop = 100, - /obj/item/clothing/shoes/heels = 100, - /obj/item/clothing/shoes/hitops/black = 100, - /obj/item/clothing/shoes/hitops/blue = 100, - /obj/item/clothing/shoes/hitops/green = 100, - /obj/item/clothing/shoes/hitops/orange = 100, - /obj/item/clothing/shoes/hitops/purple = 100, - /obj/item/clothing/shoes/hitops/red = 100, - /obj/item/clothing/shoes/flats/white/color = 100, - /obj/item/clothing/shoes/hitops/yellow = 100, - /obj/item/clothing/shoes/boots/jackboots = 100, - /obj/item/clothing/shoes/boots/jungle = 200, - /obj/item/clothing/shoes/black/cuffs = 100, - /obj/item/clothing/shoes/black/cuffs/blue = 100, - /obj/item/clothing/shoes/black/cuffs/red = 100, - /obj/item/clothing/shoes/sandal = 100, - /obj/item/clothing/shoes/black = 100, - /obj/item/clothing/shoes/blue = 100, - /obj/item/clothing/shoes/brown = 100, - /obj/item/clothing/shoes/laceup = 100, - /obj/item/clothing/shoes/green = 100, - /obj/item/clothing/shoes/leather = 100, - /obj/item/clothing/shoes/orange = 100, - /obj/item/clothing/shoes/purple = 100, - /obj/item/clothing/shoes/red = 100, - /obj/item/clothing/shoes/white = 100, - /obj/item/clothing/shoes/yellow = 100, - /obj/item/clothing/shoes/skater = 100, - /obj/item/clothing/shoes/boots/cowboy/snakeskin = 100, - /obj/item/clothing/shoes/boots/jackboots/toeless = 100, - /obj/item/clothing/shoes/boots/workboots/toeless = 100, - /obj/item/clothing/shoes/boots/winter = 100, - /obj/item/clothing/shoes/boots/workboots = 100, - /obj/item/clothing/shoes/footwraps = 100) + prices = list(/obj/item/clothing/gloves/evening = 50, + /obj/item/clothing/gloves/fingerless = 50, + /obj/item/clothing/gloves/black = 50, + /obj/item/clothing/gloves/blue = 50, + /obj/item/clothing/gloves/brown = 50, + /obj/item/clothing/gloves/color = 50, + /obj/item/clothing/gloves/green = 50, + /obj/item/clothing/gloves/grey = 50, + /obj/item/clothing/gloves/sterile/latex = 100, + /obj/item/clothing/gloves/light_brown = 50, + /obj/item/clothing/gloves/sterile/nitrile = 100, + /obj/item/clothing/gloves/orange = 50, + /obj/item/clothing/gloves/purple = 50, + /obj/item/clothing/gloves/red = 50, + /obj/item/clothing/gloves/fluff/siren = 50, + /obj/item/clothing/gloves/white = 50, + /obj/item/clothing/gloves/duty = 150, + /obj/item/clothing/shoes/athletic = 50, + /obj/item/clothing/shoes/boots/fluff/siren = 50, + /obj/item/clothing/shoes/slippers = 50, + /obj/item/clothing/shoes/boots/cowboy/classic = 50, + /obj/item/clothing/shoes/boots/cowboy = 50, + /obj/item/clothing/shoes/boots/duty = 100, + /obj/item/clothing/shoes/flats/white/color = 50, + /obj/item/clothing/shoes/flipflop = 50, + /obj/item/clothing/shoes/heels = 50, + /obj/item/clothing/shoes/hitops/black = 50, + /obj/item/clothing/shoes/hitops/blue = 50, + /obj/item/clothing/shoes/hitops/green = 50, + /obj/item/clothing/shoes/hitops/orange = 50, + /obj/item/clothing/shoes/hitops/purple = 50, + /obj/item/clothing/shoes/hitops/red = 50, + /obj/item/clothing/shoes/flats/white/color = 50, + /obj/item/clothing/shoes/hitops/yellow = 50, + /obj/item/clothing/shoes/boots/jackboots = 50, + /obj/item/clothing/shoes/boots/jungle = 100, + /obj/item/clothing/shoes/black/cuffs = 50, + /obj/item/clothing/shoes/black/cuffs/blue = 50, + /obj/item/clothing/shoes/black/cuffs/red = 50, + /obj/item/clothing/shoes/sandal = 50, + /obj/item/clothing/shoes/black = 50, + /obj/item/clothing/shoes/blue = 50, + /obj/item/clothing/shoes/brown = 50, + /obj/item/clothing/shoes/laceup = 50, + /obj/item/clothing/shoes/green = 50, + /obj/item/clothing/shoes/leather = 50, + /obj/item/clothing/shoes/orange = 50, + /obj/item/clothing/shoes/purple = 50, + /obj/item/clothing/shoes/red = 50, + /obj/item/clothing/shoes/white = 50, + /obj/item/clothing/shoes/yellow = 50, + /obj/item/clothing/shoes/skater = 50, + /obj/item/clothing/shoes/boots/cowboy/snakeskin = 50, + /obj/item/clothing/shoes/boots/jackboots/toeless = 50, + /obj/item/clothing/shoes/boots/workboots/toeless = 50, + /obj/item/clothing/shoes/boots/winter = 50, + /obj/item/clothing/shoes/boots/workboots = 50, + /obj/item/clothing/shoes/footwraps = 50) premium = list(/obj/item/clothing/gloves/rainbow = 1, /obj/item/clothing/shoes/rainbow = 1,) contraband = list(/obj/item/clothing/shoes/syndigaloshes = 1, @@ -390,116 +390,116 @@ /obj/item/clothing/mask/bandana/green = 5, /obj/item/clothing/mask/bandana/red = 5, /obj/item/clothing/mask/surgical = 5) - prices = list(/obj/item/clothing/accessory = 100, - /obj/item/clothing/accessory/armband/med/color = 100, - /obj/item/clothing/accessory/asymmetric = 100, - /obj/item/clothing/accessory/asymmetric/purple = 100, - /obj/item/clothing/accessory/asymmetric/green = 100, - /obj/item/clothing/accessory/bracelet = 100, - /obj/item/clothing/accessory/bracelet/material = 100, - /obj/item/clothing/accessory/bracelet/friendship = 100, - /obj/item/clothing/accessory/chaps = 100, - /obj/item/clothing/accessory/chaps/black = 100, - /obj/item/weapon/storage/briefcase/clutch = 100, - /obj/item/clothing/accessory/collar = 100, - /obj/item/clothing/accessory/collar/bell = 100, - /obj/item/clothing/accessory/collar/spike = 100, - /obj/item/clothing/accessory/collar/pink = 100, - /obj/item/clothing/accessory/collar/holo = 100, - /obj/item/clothing/accessory/collar/shock = 100, - /obj/item/weapon/storage/belt/fannypack = 100, - /obj/item/weapon/storage/belt/fannypack/white = 100, - /obj/item/clothing/accessory/fullcape = 100, - /obj/item/clothing/accessory/halfcape = 100, - /obj/item/clothing/accessory/hawaii = 100, - /obj/item/clothing/accessory/hawaii/random = 100, - /obj/item/clothing/accessory/locket = 100, - /obj/item/weapon/storage/backpack/purse = 100, - /obj/item/clothing/accessory/sash = 100, + prices = list(/obj/item/clothing/accessory = 50, + /obj/item/clothing/accessory/armband/med/color = 50, + /obj/item/clothing/accessory/asymmetric = 50, + /obj/item/clothing/accessory/asymmetric/purple = 50, + /obj/item/clothing/accessory/asymmetric/green = 50, + /obj/item/clothing/accessory/bracelet = 50, + /obj/item/clothing/accessory/bracelet/material = 50, + /obj/item/clothing/accessory/bracelet/friendship = 50, + /obj/item/clothing/accessory/chaps = 50, + /obj/item/clothing/accessory/chaps/black = 50, + /obj/item/weapon/storage/briefcase/clutch = 50, + /obj/item/clothing/accessory/collar = 50, + /obj/item/clothing/accessory/collar/bell = 50, + /obj/item/clothing/accessory/collar/spike = 50, + /obj/item/clothing/accessory/collar/pink = 50, + /obj/item/clothing/accessory/collar/holo = 50, + /obj/item/clothing/accessory/collar/shock = 50, + /obj/item/weapon/storage/belt/fannypack = 50, + /obj/item/weapon/storage/belt/fannypack/white = 50, + /obj/item/clothing/accessory/fullcape = 50, + /obj/item/clothing/accessory/halfcape = 50, + /obj/item/clothing/accessory/hawaii = 50, + /obj/item/clothing/accessory/hawaii/random = 50, + /obj/item/clothing/accessory/locket = 50, + /obj/item/weapon/storage/backpack/purse = 50, + /obj/item/clothing/accessory/sash = 50, /obj/item/clothing/accessory/scarf = 5, - /obj/item/clothing/accessory/scarf/red = 100, - /obj/item/clothing/accessory/scarf/darkblue = 100, - /obj/item/clothing/accessory/scarf/purple = 100, + /obj/item/clothing/accessory/scarf/red = 50, + /obj/item/clothing/accessory/scarf/darkblue = 50, + /obj/item/clothing/accessory/scarf/purple = 50, /obj/item/clothing/accessory/scarf/yellow = 100, - /obj/item/clothing/accessory/scarf/orange = 100, - /obj/item/clothing/accessory/scarf/lightblue = 100, - /obj/item/clothing/accessory/scarf/white = 100, - /obj/item/clothing/accessory/scarf/black = 100, - /obj/item/clothing/accessory/scarf/zebra = 100, - /obj/item/clothing/accessory/scarf/christmas = 100, - /obj/item/clothing/accessory/scarf/stripedred = 100, - /obj/item/clothing/accessory/scarf/stripedgreen = 100, - /obj/item/clothing/accessory/scarf/stripedblue = 100, - /obj/item/clothing/accessory/jacket = 100, - /obj/item/clothing/accessory/jacket/checkered = 100, - /obj/item/clothing/accessory/jacket/burgundy = 100, - /obj/item/clothing/accessory/jacket/navy = 100, - /obj/item/clothing/accessory/jacket/charcoal = 100, - /obj/item/clothing/accessory/vest = 100, - /obj/item/clothing/accessory/sweater = 100, - /obj/item/clothing/accessory/sweater/pink = 100, - /obj/item/clothing/accessory/sweater/mint = 100, - /obj/item/clothing/accessory/sweater/blue = 100, - /obj/item/clothing/accessory/sweater/heart = 100, + /obj/item/clothing/accessory/scarf/orange = 50, + /obj/item/clothing/accessory/scarf/lightblue = 50, + /obj/item/clothing/accessory/scarf/white = 50, + /obj/item/clothing/accessory/scarf/black = 50, + /obj/item/clothing/accessory/scarf/zebra = 50, + /obj/item/clothing/accessory/scarf/christmas = 50, + /obj/item/clothing/accessory/scarf/stripedred = 50, + /obj/item/clothing/accessory/scarf/stripedgreen = 50, + /obj/item/clothing/accessory/scarf/stripedblue = 50, + /obj/item/clothing/accessory/jacket = 50, + /obj/item/clothing/accessory/jacket/checkered = 50, + /obj/item/clothing/accessory/jacket/burgundy = 50, + /obj/item/clothing/accessory/jacket/navy = 50, + /obj/item/clothing/accessory/jacket/charcoal = 50, + /obj/item/clothing/accessory/vest = 50, + /obj/item/clothing/accessory/sweater = 50, + /obj/item/clothing/accessory/sweater/pink = 50, + /obj/item/clothing/accessory/sweater/mint = 50, + /obj/item/clothing/accessory/sweater/blue = 50, + /obj/item/clothing/accessory/sweater/heart = 50, /obj/item/clothing/accessory/sweater/nt = 5, - /obj/item/clothing/accessory/sweater/keyhole = 100, - /obj/item/clothing/accessory/sweater/winterneck = 100, + /obj/item/clothing/accessory/sweater/keyhole = 50, + /obj/item/clothing/accessory/sweater/winterneck = 50, /obj/item/clothing/accessory/sweater/uglyxmas = 5, - /obj/item/clothing/accessory/sweater/flowersweater = 100, - /obj/item/clothing/accessory/sweater/redneck = 100, - /obj/item/clothing/accessory/tie = 100, - /obj/item/clothing/accessory/tie/horrible = 100, - /obj/item/clothing/accessory/tie/white = 100, - /obj/item/clothing/accessory/tie/navy = 100, - /obj/item/clothing/accessory/tie/yellow = 100, - /obj/item/clothing/accessory/tie/darkgreen = 100, - /obj/item/clothing/accessory/tie/black = 100, - /obj/item/clothing/accessory/tie/red_long = 100, - /obj/item/clothing/accessory/tie/red_clip = 100, - /obj/item/clothing/accessory/tie/blue_long = 100, - /obj/item/clothing/accessory/tie/blue_clip = 100, - /obj/item/clothing/accessory/tie/red = 100, - /obj/item/clothing/accessory/wcoat = 100, - /obj/item/clothing/accessory/wcoat/red = 100, - /obj/item/clothing/accessory/wcoat/grey = 100, - /obj/item/clothing/accessory/wcoat/brown = 100, - /obj/item/clothing/accessory/wcoat/gentleman = 100, - /obj/item/clothing/accessory/wcoat/swvest = 100, - /obj/item/clothing/accessory/wcoat/swvest/blue = 100, - /obj/item/clothing/accessory/wcoat/swvest/red = 100, - /obj/item/weapon/storage/wallet = 100, - /obj/item/weapon/storage/wallet/poly = 100, - /obj/item/weapon/storage/wallet/womens = 100, - /obj/item/weapon/lipstick = 100, - /obj/item/weapon/lipstick/purple = 100, - /obj/item/weapon/lipstick/jade = 100, - /obj/item/weapon/lipstick/black = 100, - /obj/item/clothing/ears/earmuffs = 100, - /obj/item/clothing/ears/earmuffs/headphones = 100, - /obj/item/clothing/ears/earring/stud = 100, - /obj/item/clothing/ears/earring/dangle = 100, - /obj/item/clothing/gloves/ring/mariner = 100, - /obj/item/clothing/gloves/ring/engagement = 100, - /obj/item/clothing/gloves/ring/seal/signet = 100, - /obj/item/clothing/gloves/ring/seal/mason = 100, - /obj/item/clothing/gloves/ring/material/plastic = 100, - /obj/item/clothing/gloves/ring/material/steel = 100, - /obj/item/clothing/gloves/ring/material/gold = 500, - /obj/item/clothing/glasses/eyepatch = 100, - /obj/item/clothing/glasses/gglasses = 100, - /obj/item/clothing/glasses/regular/hipster = 100, - /obj/item/clothing/glasses/rimless = 100, - /obj/item/clothing/glasses/thin = 100, - /obj/item/clothing/glasses/monocle = 100, - /obj/item/clothing/glasses/goggles = 100, - /obj/item/clothing/glasses/fluff/spiffygogs = 100, - /obj/item/clothing/glasses/fakesunglasses = 100, - /obj/item/clothing/glasses/fakesunglasses/aviator = 100, - /obj/item/clothing/mask/bandana/blue = 100, - /obj/item/clothing/mask/bandana/gold = 100, - /obj/item/clothing/mask/bandana/green = 100, - /obj/item/clothing/mask/bandana/red = 100, - /obj/item/clothing/mask/surgical = 200) + /obj/item/clothing/accessory/sweater/flowersweater = 50, + /obj/item/clothing/accessory/sweater/redneck = 50, + /obj/item/clothing/accessory/tie = 50, + /obj/item/clothing/accessory/tie/horrible = 50, + /obj/item/clothing/accessory/tie/white = 50, + /obj/item/clothing/accessory/tie/navy = 50, + /obj/item/clothing/accessory/tie/yellow = 50, + /obj/item/clothing/accessory/tie/darkgreen = 50, + /obj/item/clothing/accessory/tie/black = 50, + /obj/item/clothing/accessory/tie/red_long = 50, + /obj/item/clothing/accessory/tie/red_clip = 50, + /obj/item/clothing/accessory/tie/blue_long = 50, + /obj/item/clothing/accessory/tie/blue_clip = 50, + /obj/item/clothing/accessory/tie/red = 50, + /obj/item/clothing/accessory/wcoat = 50, + /obj/item/clothing/accessory/wcoat/red = 50, + /obj/item/clothing/accessory/wcoat/grey = 50, + /obj/item/clothing/accessory/wcoat/brown = 50, + /obj/item/clothing/accessory/wcoat/gentleman = 50, + /obj/item/clothing/accessory/wcoat/swvest = 50, + /obj/item/clothing/accessory/wcoat/swvest/blue = 50, + /obj/item/clothing/accessory/wcoat/swvest/red = 50, + /obj/item/weapon/storage/wallet = 50, + /obj/item/weapon/storage/wallet/poly = 50, + /obj/item/weapon/storage/wallet/womens = 50, + /obj/item/weapon/lipstick = 50, + /obj/item/weapon/lipstick/purple = 50, + /obj/item/weapon/lipstick/jade = 50, + /obj/item/weapon/lipstick/black = 50, + /obj/item/clothing/ears/earmuffs = 50, + /obj/item/clothing/ears/earmuffs/headphones = 50, + /obj/item/clothing/ears/earring/stud = 50, + /obj/item/clothing/ears/earring/dangle = 50, + /obj/item/clothing/gloves/ring/mariner = 50, + /obj/item/clothing/gloves/ring/engagement = 50, + /obj/item/clothing/gloves/ring/seal/signet = 50, + /obj/item/clothing/gloves/ring/seal/mason = 50, + /obj/item/clothing/gloves/ring/material/plastic = 50, + /obj/item/clothing/gloves/ring/material/steel = 50, + /obj/item/clothing/gloves/ring/material/gold = 100, + /obj/item/clothing/glasses/eyepatch = 50, + /obj/item/clothing/glasses/gglasses = 50, + /obj/item/clothing/glasses/regular/hipster = 50, + /obj/item/clothing/glasses/rimless = 50, + /obj/item/clothing/glasses/thin = 50, + /obj/item/clothing/glasses/monocle = 50, + /obj/item/clothing/glasses/goggles = 50, + /obj/item/clothing/glasses/fluff/spiffygogs = 50, + /obj/item/clothing/glasses/fakesunglasses = 50, + /obj/item/clothing/glasses/fakesunglasses/aviator = 50, + /obj/item/clothing/mask/bandana/blue = 50, + /obj/item/clothing/mask/bandana/gold = 50, + /obj/item/clothing/mask/bandana/green = 50, + /obj/item/clothing/mask/bandana/red = 50, + /obj/item/clothing/mask/surgical = 50) premium = list(/obj/item/weapon/bedsheet/rainbow = 1) contraband = list(/obj/item/clothing/mask/gas/clown_hat = 1) @@ -679,176 +679,176 @@ /obj/item/weapon/storage/backpack/ = 5, /obj/item/weapon/storage/backpack/messenger = 5, /obj/item/weapon/storage/backpack/satchel = 5) - prices = list(/obj/item/clothing/under/bathrobe = 100, - /obj/item/clothing/under/dress/black_corset = 100, - /obj/item/clothing/under/blazer = 100, - /obj/item/clothing/under/blazer/skirt = 100, - /obj/item/clothing/under/cheongsam = 100, - /obj/item/clothing/under/cheongsam/red = 100, - /obj/item/clothing/under/cheongsam/blue = 100, - /obj/item/clothing/under/cheongsam/black = 100, - /obj/item/clothing/under/cheongsam/darkred = 100, - /obj/item/clothing/under/cheongsam/green = 100, - /obj/item/clothing/under/cheongsam/purple = 100, - /obj/item/clothing/under/cheongsam/darkblue = 100, - /obj/item/clothing/under/croptop = 100, - /obj/item/clothing/under/croptop/red = 100, - /obj/item/clothing/under/croptop/grey = 100, - /obj/item/clothing/under/cuttop = 100, - /obj/item/clothing/under/cuttop/red = 100, - /obj/item/clothing/under/suit_jacket/female/skirt = 100, - /obj/item/clothing/under/dress/dress_fire = 100, - /obj/item/clothing/under/dress/flamenco = 100, - /obj/item/clothing/under/dress/flower_dress = 100, - /obj/item/clothing/under/fluff/gnshorts = 100, - /obj/item/clothing/under/color = 100, - /obj/item/clothing/under/color/aqua = 100, - /obj/item/clothing/under/color/black = 100, - /obj/item/clothing/under/color/blackf = 100, - /obj/item/clothing/under/color/blackjumpskirt = 100, - /obj/item/clothing/under/color/blue = 100, - /obj/item/clothing/under/color/brown = 100, - /obj/item/clothing/under/color/darkblue = 100, - /obj/item/clothing/under/color/darkred = 100, - /obj/item/clothing/under/color/green = 100, - /obj/item/clothing/under/color/grey = 100, - /obj/item/clothing/under/color/lightblue = 100, - /obj/item/clothing/under/color/lightbrown = 100, - /obj/item/clothing/under/color/lightgreen = 100, - /obj/item/clothing/under/color/lightpurple = 100, - /obj/item/clothing/under/color/lightred = 100, - /obj/item/clothing/under/color/orange = 100, - /obj/item/clothing/under/color/pink = 100, - /obj/item/clothing/under/color/prison = 100, - /obj/item/clothing/under/color/ranger = 100, - /obj/item/clothing/under/color/red = 100, - /obj/item/clothing/under/color/white = 100, - /obj/item/clothing/under/color/yellow = 100, - /obj/item/clothing/under/color/yellowgreen = 100, - /obj/item/clothing/under/aether = 100, - /obj/item/clothing/under/focal = 100, - /obj/item/clothing/under/hephaestus = 100, - /obj/item/clothing/under/wardt = 100, - /obj/item/clothing/under/kilt = 100, - /obj/item/clothing/under/fluff/latexmaid = 100, - /obj/item/clothing/under/dress/lilacdress = 100, - /obj/item/clothing/under/dress/white2 = 100, - /obj/item/clothing/under/dress/white4 = 100, - /obj/item/clothing/under/dress/maid = 100, - /obj/item/clothing/under/dress/maid/sexy = 100, - /obj/item/clothing/under/dress/maid/janitor = 100, - /obj/item/clothing/under/moderncoat = 100, - /obj/item/clothing/under/permit = 100, - /obj/item/clothing/under/oldwoman = 100, - /obj/item/clothing/under/frontier = 100, - /obj/item/clothing/under/mbill = 100, - /obj/item/clothing/under/pants/baggy/ = 100, - /obj/item/clothing/under/pants/baggy/classicjeans = 100, - /obj/item/clothing/under/pants/baggy/mustangjeans = 100, - /obj/item/clothing/under/pants/baggy/blackjeans = 100, - /obj/item/clothing/under/pants/baggy/greyjeans = 100, - /obj/item/clothing/under/pants/baggy/youngfolksjeans = 100, - /obj/item/clothing/under/pants/baggy/white = 100, - /obj/item/clothing/under/pants/baggy/red = 100, - /obj/item/clothing/under/pants/baggy/black = 100, - /obj/item/clothing/under/pants/baggy/tan = 100, - /obj/item/clothing/under/pants/baggy/track = 100, - /obj/item/clothing/under/pants/baggy/khaki = 100, - /obj/item/clothing/under/pants/baggy/camo = 100, - /obj/item/clothing/under/pants/utility/ = 100, - /obj/item/clothing/under/pants/utility/orange = 100, - /obj/item/clothing/under/pants/utility/blue = 100, - /obj/item/clothing/under/pants/utility/white = 100, - /obj/item/clothing/under/pants/utility/red = 100, - /obj/item/clothing/under/pants/chaps = 100, - /obj/item/clothing/under/pants/chaps/black = 100, - /obj/item/clothing/under/pants/track = 100, - /obj/item/clothing/under/pants/track/red = 100, - /obj/item/clothing/under/pants/track/white = 100, - /obj/item/clothing/under/pants/track/green = 100, - /obj/item/clothing/under/pants/track/blue = 100, - /obj/item/clothing/under/pants/yogapants = 100, - /obj/item/clothing/under/ascetic = 100, - /obj/item/clothing/under/dress/white3 = 100, - /obj/item/clothing/under/skirt/pleated = 100, - /obj/item/clothing/under/dress/darkred = 100, - /obj/item/clothing/under/dress/redeveninggown = 100, - /obj/item/clothing/under/dress/red_swept_dress = 100, - /obj/item/clothing/under/dress/sailordress = 100, - /obj/item/clothing/under/dress/sari = 100, - /obj/item/clothing/under/dress/sari/green = 100, - /obj/item/clothing/under/dress/qipao = 100, - /obj/item/clothing/under/dress/qipao/red = 100, - /obj/item/clothing/under/dress/qipao/white = 100, - /obj/item/clothing/under/shorts/red = 100, - /obj/item/clothing/under/shorts/green = 100, - /obj/item/clothing/under/shorts/blue = 100, - /obj/item/clothing/under/shorts/black = 100, - /obj/item/clothing/under/shorts/grey = 100, - /obj/item/clothing/under/shorts/white = 100, - /obj/item/clothing/under/shorts/jeans = 100, - /obj/item/clothing/under/shorts/jeans/ = 100, - /obj/item/clothing/under/shorts/jeans/classic = 100, - /obj/item/clothing/under/shorts/jeans/mustang = 100, - /obj/item/clothing/under/shorts/jeans/youngfolks = 100, - /obj/item/clothing/under/shorts/jeans/black = 100, - /obj/item/clothing/under/shorts/jeans/grey = 100, - /obj/item/clothing/under/shorts/khaki/ = 100, - /obj/item/clothing/under/skirt/loincloth = 100, - /obj/item/clothing/under/skirt/khaki = 100, - /obj/item/clothing/under/skirt/blue = 100, - /obj/item/clothing/under/skirt/red = 100, - /obj/item/clothing/under/skirt/denim = 100, - /obj/item/clothing/under/skirt/pleated = 100, - /obj/item/clothing/under/skirt/outfit/plaid_blue = 100, - /obj/item/clothing/under/skirt/outfit/plaid_red = 100, - /obj/item/clothing/under/skirt/outfit/plaid_purple = 100, - /obj/item/clothing/under/overalls/sleek = 100, - /obj/item/clothing/under/sl_suit = 100, - /obj/item/clothing/under/gentlesuit = 100, - /obj/item/clothing/under/gentlesuit/skirt = 100, - /obj/item/clothing/under/suit_jacket = 100, - /obj/item/clothing/under/suit_jacket/really_black/skirt = 100, - /obj/item/clothing/under/suit_jacket/really_black = 100, - /obj/item/clothing/under/suit_jacket/female/skirt = 100, - /obj/item/clothing/under/suit_jacket/female/ = 100, - /obj/item/clothing/under/suit_jacket/red = 100, - /obj/item/clothing/under/suit_jacket/red/skirt = 100, - /obj/item/clothing/under/suit_jacket/charcoal = 100, - /obj/item/clothing/under/suit_jacket/charcoal/skirt = 100, - /obj/item/clothing/under/suit_jacket/navy = 100, - /obj/item/clothing/under/suit_jacket/navy/skirt = 100, - /obj/item/clothing/under/suit_jacket/burgundy = 100, - /obj/item/clothing/under/suit_jacket/burgundy/skirt = 100, - /obj/item/clothing/under/suit_jacket/checkered = 100, - /obj/item/clothing/under/suit_jacket/checkered/skirt = 100, - /obj/item/clothing/under/suit_jacket/tan = 100, - /obj/item/clothing/under/suit_jacket/tan/skirt = 100, - /obj/item/clothing/under/scratch = 100, - /obj/item/clothing/under/scratch/skirt = 100, - /obj/item/clothing/under/sundress = 100, - /obj/item/clothing/under/sundress_white = 100, - /obj/item/clothing/under/rank/psych/turtleneck/sweater = 100, - /obj/item/weapon/storage/box/fluff/swimsuit = 100, - /obj/item/weapon/storage/box/fluff/swimsuit/blue = 100, - /obj/item/weapon/storage/box/fluff/swimsuit/purple = 100, - /obj/item/weapon/storage/box/fluff/swimsuit/green = 100, - /obj/item/weapon/storage/box/fluff/swimsuit/red = 100, - /obj/item/weapon/storage/box/fluff/swimsuit/white = 100, - /obj/item/weapon/storage/box/fluff/swimsuit/earth = 100, - /obj/item/weapon/storage/box/fluff/swimsuit/engineering = 100, - /obj/item/weapon/storage/box/fluff/swimsuit/science = 100, - /obj/item/weapon/storage/box/fluff/swimsuit/security = 100, - /obj/item/weapon/storage/box/fluff/swimsuit/medical = 100, - /obj/item/clothing/under/utility = 100, - /obj/item/clothing/under/utility/grey = 100, - /obj/item/clothing/under/utility/blue = 100, - /obj/item/clothing/under/fluff/v_nanovest = 100, - /obj/item/clothing/under/dress/westernbustle = 100, - /obj/item/clothing/under/wedding/bride_white = 100, - /obj/item/weapon/storage/backpack/ = 100, - /obj/item/weapon/storage/backpack/messenger = 100, - /obj/item/weapon/storage/backpack/satchel = 100) + prices = list(/obj/item/clothing/under/bathrobe = 50, + /obj/item/clothing/under/dress/black_corset = 50, + /obj/item/clothing/under/blazer = 50, + /obj/item/clothing/under/blazer/skirt = 50, + /obj/item/clothing/under/cheongsam = 50, + /obj/item/clothing/under/cheongsam/red = 50, + /obj/item/clothing/under/cheongsam/blue = 50, + /obj/item/clothing/under/cheongsam/black = 50, + /obj/item/clothing/under/cheongsam/darkred = 50, + /obj/item/clothing/under/cheongsam/green = 50, + /obj/item/clothing/under/cheongsam/purple = 50, + /obj/item/clothing/under/cheongsam/darkblue = 50, + /obj/item/clothing/under/croptop = 50, + /obj/item/clothing/under/croptop/red = 50, + /obj/item/clothing/under/croptop/grey = 50, + /obj/item/clothing/under/cuttop = 50, + /obj/item/clothing/under/cuttop/red = 50, + /obj/item/clothing/under/suit_jacket/female/skirt = 50, + /obj/item/clothing/under/dress/dress_fire = 50, + /obj/item/clothing/under/dress/flamenco = 50, + /obj/item/clothing/under/dress/flower_dress = 50, + /obj/item/clothing/under/fluff/gnshorts = 50, + /obj/item/clothing/under/color = 50, + /obj/item/clothing/under/color/aqua = 50, + /obj/item/clothing/under/color/black = 50, + /obj/item/clothing/under/color/blackf = 50, + /obj/item/clothing/under/color/blackjumpskirt = 50, + /obj/item/clothing/under/color/blue = 50, + /obj/item/clothing/under/color/brown = 50, + /obj/item/clothing/under/color/darkblue = 50, + /obj/item/clothing/under/color/darkred = 50, + /obj/item/clothing/under/color/green = 50, + /obj/item/clothing/under/color/grey = 50, + /obj/item/clothing/under/color/lightblue = 50, + /obj/item/clothing/under/color/lightbrown = 50, + /obj/item/clothing/under/color/lightgreen = 50, + /obj/item/clothing/under/color/lightpurple = 50, + /obj/item/clothing/under/color/lightred = 50, + /obj/item/clothing/under/color/orange = 50, + /obj/item/clothing/under/color/pink = 50, + /obj/item/clothing/under/color/prison = 50, + /obj/item/clothing/under/color/ranger = 50, + /obj/item/clothing/under/color/red = 50, + /obj/item/clothing/under/color/white = 50, + /obj/item/clothing/under/color/yellow = 50, + /obj/item/clothing/under/color/yellowgreen = 50, + /obj/item/clothing/under/aether = 50, + /obj/item/clothing/under/focal = 50, + /obj/item/clothing/under/hephaestus = 50, + /obj/item/clothing/under/wardt = 50, + /obj/item/clothing/under/kilt = 50, + /obj/item/clothing/under/fluff/latexmaid = 50, + /obj/item/clothing/under/dress/lilacdress = 50, + /obj/item/clothing/under/dress/white2 = 50, + /obj/item/clothing/under/dress/white4 = 50, + /obj/item/clothing/under/dress/maid = 50, + /obj/item/clothing/under/dress/maid/sexy = 50, + /obj/item/clothing/under/dress/maid/janitor = 50, + /obj/item/clothing/under/moderncoat = 50, + /obj/item/clothing/under/permit = 50, + /obj/item/clothing/under/oldwoman = 50, + /obj/item/clothing/under/frontier = 50, + /obj/item/clothing/under/mbill = 50, + /obj/item/clothing/under/pants/baggy/ = 50, + /obj/item/clothing/under/pants/baggy/classicjeans = 50, + /obj/item/clothing/under/pants/baggy/mustangjeans = 50, + /obj/item/clothing/under/pants/baggy/blackjeans = 50, + /obj/item/clothing/under/pants/baggy/greyjeans = 50, + /obj/item/clothing/under/pants/baggy/youngfolksjeans = 50, + /obj/item/clothing/under/pants/baggy/white = 50, + /obj/item/clothing/under/pants/baggy/red = 50, + /obj/item/clothing/under/pants/baggy/black = 50, + /obj/item/clothing/under/pants/baggy/tan = 50, + /obj/item/clothing/under/pants/baggy/track = 50, + /obj/item/clothing/under/pants/baggy/khaki = 50, + /obj/item/clothing/under/pants/baggy/camo = 50, + /obj/item/clothing/under/pants/utility/ = 50, + /obj/item/clothing/under/pants/utility/orange = 50, + /obj/item/clothing/under/pants/utility/blue = 50, + /obj/item/clothing/under/pants/utility/white = 50, + /obj/item/clothing/under/pants/utility/red = 50, + /obj/item/clothing/under/pants/chaps = 50, + /obj/item/clothing/under/pants/chaps/black = 50, + /obj/item/clothing/under/pants/track = 50, + /obj/item/clothing/under/pants/track/red = 50, + /obj/item/clothing/under/pants/track/white = 50, + /obj/item/clothing/under/pants/track/green = 50, + /obj/item/clothing/under/pants/track/blue = 50, + /obj/item/clothing/under/pants/yogapants = 50, + /obj/item/clothing/under/ascetic = 50, + /obj/item/clothing/under/dress/white3 = 50, + /obj/item/clothing/under/skirt/pleated = 50, + /obj/item/clothing/under/dress/darkred = 50, + /obj/item/clothing/under/dress/redeveninggown = 50, + /obj/item/clothing/under/dress/red_swept_dress = 50, + /obj/item/clothing/under/dress/sailordress = 50, + /obj/item/clothing/under/dress/sari = 50, + /obj/item/clothing/under/dress/sari/green = 50, + /obj/item/clothing/under/dress/qipao = 50, + /obj/item/clothing/under/dress/qipao/red = 50, + /obj/item/clothing/under/dress/qipao/white = 50, + /obj/item/clothing/under/shorts/red = 50, + /obj/item/clothing/under/shorts/green = 50, + /obj/item/clothing/under/shorts/blue = 50, + /obj/item/clothing/under/shorts/black = 50, + /obj/item/clothing/under/shorts/grey = 50, + /obj/item/clothing/under/shorts/white = 50, + /obj/item/clothing/under/shorts/jeans = 50, + /obj/item/clothing/under/shorts/jeans/ = 50, + /obj/item/clothing/under/shorts/jeans/classic = 50, + /obj/item/clothing/under/shorts/jeans/mustang = 50, + /obj/item/clothing/under/shorts/jeans/youngfolks = 50, + /obj/item/clothing/under/shorts/jeans/black = 50, + /obj/item/clothing/under/shorts/jeans/grey = 50, + /obj/item/clothing/under/shorts/khaki/ = 50, + /obj/item/clothing/under/skirt/loincloth = 50, + /obj/item/clothing/under/skirt/khaki = 50, + /obj/item/clothing/under/skirt/blue = 50, + /obj/item/clothing/under/skirt/red = 50, + /obj/item/clothing/under/skirt/denim = 50, + /obj/item/clothing/under/skirt/pleated = 50, + /obj/item/clothing/under/skirt/outfit/plaid_blue = 50, + /obj/item/clothing/under/skirt/outfit/plaid_red = 50, + /obj/item/clothing/under/skirt/outfit/plaid_purple = 50, + /obj/item/clothing/under/overalls/sleek = 50, + /obj/item/clothing/under/sl_suit = 50, + /obj/item/clothing/under/gentlesuit = 50, + /obj/item/clothing/under/gentlesuit/skirt = 50, + /obj/item/clothing/under/suit_jacket = 50, + /obj/item/clothing/under/suit_jacket/really_black/skirt = 50, + /obj/item/clothing/under/suit_jacket/really_black = 50, + /obj/item/clothing/under/suit_jacket/female/skirt = 50, + /obj/item/clothing/under/suit_jacket/female/ = 50, + /obj/item/clothing/under/suit_jacket/red = 50, + /obj/item/clothing/under/suit_jacket/red/skirt = 50, + /obj/item/clothing/under/suit_jacket/charcoal = 50, + /obj/item/clothing/under/suit_jacket/charcoal/skirt = 50, + /obj/item/clothing/under/suit_jacket/navy = 50, + /obj/item/clothing/under/suit_jacket/navy/skirt = 50, + /obj/item/clothing/under/suit_jacket/burgundy = 50, + /obj/item/clothing/under/suit_jacket/burgundy/skirt = 50, + /obj/item/clothing/under/suit_jacket/checkered = 50, + /obj/item/clothing/under/suit_jacket/checkered/skirt = 50, + /obj/item/clothing/under/suit_jacket/tan = 50, + /obj/item/clothing/under/suit_jacket/tan/skirt = 50, + /obj/item/clothing/under/scratch = 50, + /obj/item/clothing/under/scratch/skirt = 50, + /obj/item/clothing/under/sundress = 50, + /obj/item/clothing/under/sundress_white = 50, + /obj/item/clothing/under/rank/psych/turtleneck/sweater = 50, + /obj/item/weapon/storage/box/fluff/swimsuit = 50, + /obj/item/weapon/storage/box/fluff/swimsuit/blue = 50, + /obj/item/weapon/storage/box/fluff/swimsuit/purple = 50, + /obj/item/weapon/storage/box/fluff/swimsuit/green = 50, + /obj/item/weapon/storage/box/fluff/swimsuit/red = 50, + /obj/item/weapon/storage/box/fluff/swimsuit/white = 50, + /obj/item/weapon/storage/box/fluff/swimsuit/earth = 50, + /obj/item/weapon/storage/box/fluff/swimsuit/engineering = 50, + /obj/item/weapon/storage/box/fluff/swimsuit/science = 50, + /obj/item/weapon/storage/box/fluff/swimsuit/security = 50, + /obj/item/weapon/storage/box/fluff/swimsuit/medical = 50, + /obj/item/clothing/under/utility = 50, + /obj/item/clothing/under/utility/grey = 50, + /obj/item/clothing/under/utility/blue = 50, + /obj/item/clothing/under/fluff/v_nanovest = 50, + /obj/item/clothing/under/dress/westernbustle = 50, + /obj/item/clothing/under/wedding/bride_white = 50, + /obj/item/weapon/storage/backpack/ = 50, + /obj/item/weapon/storage/backpack/messenger = 50, + /obj/item/weapon/storage/backpack/satchel = 50) premium = list(/obj/item/clothing/under/color/rainbow = 1) contraband = list(/obj/item/clothing/under/rank/clown = 1) @@ -1024,93 +1024,93 @@ /obj/item/clothing/suit/varsity/brown = 5, /obj/item/clothing/suit/storage/hooded/wintercoat = 5, /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 5) - prices = list(/obj/item/clothing/suit/storage/apron = 200, - /obj/item/clothing/suit/storage/flannel/aqua = 200, - /obj/item/clothing/suit/storage/toggle/bomber = 200, - /obj/item/clothing/suit/storage/bomber/alt = 200, - /obj/item/clothing/suit/storage/flannel/brown = 200, - /obj/item/clothing/suit/storage/toggle/cardigan = 200, - /obj/item/clothing/accessory/poncho/roles/cloak/custom = 200, - /obj/item/clothing/suit/storage/duster = 200, - /obj/item/clothing/suit/storage/toggle/denim_jacket = 200, - /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen = 200, - /obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless = 200, - /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen/sleeveless = 200, - /obj/item/clothing/suit/storage/fluff/gntop = 200, - /obj/item/clothing/suit/greatcoat = 200, - /obj/item/clothing/suit/storage/flannel = 200, - /obj/item/clothing/suit/storage/greyjacket = 200, - /obj/item/clothing/suit/storage/hazardvest = 200, - /obj/item/clothing/suit/storage/toggle/hoodie/black = 200, - /obj/item/clothing/suit/storage/toggle/hoodie/red = 200, - /obj/item/clothing/suit/storage/toggle/hoodie/blue = 200, - /obj/item/clothing/suit/storage/toggle/hoodie/green = 200, - /obj/item/clothing/suit/storage/toggle/hoodie/orange = 200, - /obj/item/clothing/suit/storage/toggle/hoodie/yellow = 200, - /obj/item/clothing/suit/storage/toggle/hoodie/cti = 200, - /obj/item/clothing/suit/storage/toggle/hoodie/mu = 200, - /obj/item/clothing/suit/storage/toggle/hoodie/nt = 200, - /obj/item/clothing/suit/storage/toggle/hoodie/smw = 200, - /obj/item/clothing/suit/storage/toggle/hoodie/nrti = 200, - /obj/item/clothing/suit/storage/fluff/jacket/field = 200, - /obj/item/clothing/suit/storage/fluff/jacket/air_cavalry = 200, - /obj/item/clothing/suit/storage/fluff/jacket/air_force = 200, - /obj/item/clothing/suit/storage/fluff/jacket/navy = 200, - /obj/item/clothing/suit/storage/fluff/jacket/special_forces = 200, - /obj/item/clothing/suit/kamishimo = 200, - /obj/item/clothing/suit/kimono = 200, - /obj/item/clothing/suit/storage/toggle/labcoat = 200, - /obj/item/clothing/suit/storage/toggle/labcoat/blue = 200, - /obj/item/clothing/suit/storage/toggle/labcoat/blue_edge = 200, - /obj/item/clothing/suit/storage/toggle/labcoat/green = 200, - /obj/item/clothing/suit/storage/toggle/labcoat/orange = 200, - /obj/item/clothing/suit/storage/toggle/labcoat/pink = 200, - /obj/item/clothing/suit/storage/toggle/labcoat/red = 200, - /obj/item/clothing/suit/storage/toggle/labcoat/yellow = 200, - /obj/item/clothing/suit/leathercoat = 200, - /obj/item/clothing/suit/storage/toggle/leather_jacket = 200, - /obj/item/clothing/suit/storage/leather_jacket_alt = 200, - /obj/item/clothing/suit/storage/toggle/brown_jacket = 200, - /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen = 200, - /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen = 200, - /obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless = 200, - /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless = 200, - /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless = 200, - /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen/sleeveless = 200, - /obj/item/clothing/suit/storage/miljacket = 200, - /obj/item/clothing/suit/storage/miljacket/alt = 200, - /obj/item/clothing/suit/storage/miljacket/green = 200, + prices = list(/obj/item/clothing/suit/storage/apron = 100, + /obj/item/clothing/suit/storage/flannel/aqua = 100, + /obj/item/clothing/suit/storage/toggle/bomber = 100, + /obj/item/clothing/suit/storage/bomber/alt = 100, + /obj/item/clothing/suit/storage/flannel/brown = 100, + /obj/item/clothing/suit/storage/toggle/cardigan = 100, + /obj/item/clothing/accessory/poncho/roles/cloak/custom = 100, + /obj/item/clothing/suit/storage/duster = 100, + /obj/item/clothing/suit/storage/toggle/denim_jacket = 100, + /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen = 100, + /obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless = 100, + /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen/sleeveless = 100, + /obj/item/clothing/suit/storage/fluff/gntop = 100, + /obj/item/clothing/suit/greatcoat = 100, + /obj/item/clothing/suit/storage/flannel = 100, + /obj/item/clothing/suit/storage/greyjacket = 100, + /obj/item/clothing/suit/storage/hazardvest = 100, + /obj/item/clothing/suit/storage/toggle/hoodie/black = 100, + /obj/item/clothing/suit/storage/toggle/hoodie/red = 100, + /obj/item/clothing/suit/storage/toggle/hoodie/blue = 100, + /obj/item/clothing/suit/storage/toggle/hoodie/green = 100, + /obj/item/clothing/suit/storage/toggle/hoodie/orange = 100, + /obj/item/clothing/suit/storage/toggle/hoodie/yellow = 100, + /obj/item/clothing/suit/storage/toggle/hoodie/cti = 100, + /obj/item/clothing/suit/storage/toggle/hoodie/mu = 100, + /obj/item/clothing/suit/storage/toggle/hoodie/nt = 100, + /obj/item/clothing/suit/storage/toggle/hoodie/smw = 100, + /obj/item/clothing/suit/storage/toggle/hoodie/nrti = 100, + /obj/item/clothing/suit/storage/fluff/jacket/field = 100, + /obj/item/clothing/suit/storage/fluff/jacket/air_cavalry = 100, + /obj/item/clothing/suit/storage/fluff/jacket/air_force = 100, + /obj/item/clothing/suit/storage/fluff/jacket/navy = 100, + /obj/item/clothing/suit/storage/fluff/jacket/special_forces = 100, + /obj/item/clothing/suit/kamishimo = 100, + /obj/item/clothing/suit/kimono = 100, + /obj/item/clothing/suit/storage/toggle/labcoat = 100, + /obj/item/clothing/suit/storage/toggle/labcoat/blue = 100, + /obj/item/clothing/suit/storage/toggle/labcoat/blue_edge = 100, + /obj/item/clothing/suit/storage/toggle/labcoat/green = 100, + /obj/item/clothing/suit/storage/toggle/labcoat/orange = 100, + /obj/item/clothing/suit/storage/toggle/labcoat/pink = 100, + /obj/item/clothing/suit/storage/toggle/labcoat/red = 100, + /obj/item/clothing/suit/storage/toggle/labcoat/yellow = 100, + /obj/item/clothing/suit/leathercoat = 100, + /obj/item/clothing/suit/storage/toggle/leather_jacket = 100, + /obj/item/clothing/suit/storage/leather_jacket_alt = 100, + /obj/item/clothing/suit/storage/toggle/brown_jacket = 100, + /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen = 100, + /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen = 100, + /obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless = 100, + /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless = 100, + /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless = 100, + /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen/sleeveless = 100, + /obj/item/clothing/suit/storage/miljacket = 100, + /obj/item/clothing/suit/storage/miljacket/alt = 100, + /obj/item/clothing/suit/storage/miljacket/green = 100, /obj/item/clothing/suit/storage/apron/overalls = 100, - /obj/item/clothing/suit/storage/toggle/peacoat = 200, + /obj/item/clothing/suit/storage/toggle/peacoat = 100, /obj/item/clothing/accessory/poncho = 100, /obj/item/clothing/accessory/poncho/green = 100, /obj/item/clothing/accessory/poncho/red = 100, /obj/item/clothing/accessory/poncho/purple = 100, /obj/item/clothing/accessory/poncho/blue = 100, - /obj/item/clothing/suit/jacket/puffer = 200, - /obj/item/clothing/suit/jacket/puffer/vest = 200, - /obj/item/clothing/suit/storage/flannel/red = 200, + /obj/item/clothing/suit/jacket/puffer = 100, + /obj/item/clothing/suit/jacket/puffer/vest = 100, + /obj/item/clothing/suit/storage/flannel/red = 100, /obj/item/clothing/suit/unathi/robe = 100, - /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 200, - /obj/item/clothing/suit/storage/toggle/internalaffairs = 200, - /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 200, - /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 200, - /obj/item/clothing/suit/suspenders = 200, - /obj/item/clothing/suit/storage/toggle/track = 200, - /obj/item/clothing/suit/storage/toggle/track/blue = 200, - /obj/item/clothing/suit/storage/toggle/track/green = 200, - /obj/item/clothing/suit/storage/toggle/track/red = 200, - /obj/item/clothing/suit/storage/toggle/track/white = 200, - /obj/item/clothing/suit/storage/trench = 200, - /obj/item/clothing/suit/storage/trench/grey = 200, - /obj/item/clothing/suit/varsity = 200, - /obj/item/clothing/suit/varsity/red = 200, - /obj/item/clothing/suit/varsity/purple = 200, - /obj/item/clothing/suit/varsity/green = 200, - /obj/item/clothing/suit/varsity/blue = 200, - /obj/item/clothing/suit/varsity/brown = 200, - /obj/item/clothing/suit/storage/hooded/wintercoat = 200, - /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 200) + /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 100, + /obj/item/clothing/suit/storage/toggle/internalaffairs = 100, + /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 100, + /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 100, + /obj/item/clothing/suit/suspenders = 100, + /obj/item/clothing/suit/storage/toggle/track = 100, + /obj/item/clothing/suit/storage/toggle/track/blue = 100, + /obj/item/clothing/suit/storage/toggle/track/green = 100, + /obj/item/clothing/suit/storage/toggle/track/red = 100, + /obj/item/clothing/suit/storage/toggle/track/white = 100, + /obj/item/clothing/suit/storage/trench = 100, + /obj/item/clothing/suit/storage/trench/grey = 100, + /obj/item/clothing/suit/varsity = 100, + /obj/item/clothing/suit/varsity/red = 100, + /obj/item/clothing/suit/varsity/purple = 100, + /obj/item/clothing/suit/varsity/green = 100, + /obj/item/clothing/suit/varsity/blue = 100, + /obj/item/clothing/suit/varsity/brown = 100, + /obj/item/clothing/suit/storage/hooded/wintercoat = 100, + /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 100) premium = list(/obj/item/clothing/suit/imperium_monk = 3) contraband = list(/obj/item/toy/katana = 1) @@ -1206,7 +1206,7 @@ /obj/item/clothing/mask/gas/plaguedoctor/fluff = 600, /obj/item/clothing/under/owl = 400, /obj/item/clothing/mask/gas/owl_mask = 400, - /obj/item/clothing/under/waiter = 200, + /obj/item/clothing/under/waiter = 100, /obj/item/clothing/suit/storage/apron = 200, /obj/item/clothing/under/pirate = 300, /obj/item/clothing/head/pirate = 400, @@ -1217,7 +1217,7 @@ /obj/item/clothing/suit/imperium_monk = 2000, /obj/item/clothing/suit/holidaypriest = 200, /obj/item/clothing/head/witchwig = 200, - /obj/item/clothing/under/sundress = 200, + /obj/item/clothing/under/sundress = 50, /obj/item/weapon/staff/broom = 400, /obj/item/clothing/suit/wizrobe/fake = 200, /obj/item/clothing/head/wizard/fake = 200, diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index c938476cd4..1df31e3814 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -609,7 +609,7 @@ GLOBAL_LIST_EMPTY(blood_overlays_by_type) // Already got one if(blood_overlay) return - + // Already cached if(GLOB.blood_overlays_by_type[type]) blood_overlay = GLOB.blood_overlays_by_type[type] @@ -619,7 +619,7 @@ GLOBAL_LIST_EMPTY(blood_overlays_by_type) var/image/blood = image(icon = 'icons/effects/blood.dmi', icon_state = "itemblood") // Needs to be a new one each time since we're slicing it up with filters. blood.filters += filter(type = "alpha", icon = icon(icon, icon_state)) // Same, this filter is unique for each blood overlay per type GLOB.blood_overlays_by_type[type] = blood - + // And finally blood_overlay = blood diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index bf29ad6e3c..18e0f8f139 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -452,6 +452,20 @@ var/global/list/obj/item/device/pda/PDAs = list() if(3) icon = 'icons/obj/pda_old.dmi' if(4) icon = 'icons/obj/pda_rugged.dmi' if(5) icon = 'icons/obj/pda_holo.dmi' + if(6) + icon = 'icons/obj/pda_wrist.dmi' + item_state = icon_state + item_icons = list( + slot_belt_str = 'icons/mob/pda_wrist.dmi', + slot_wear_id_str = 'icons/mob/pda_wrist.dmi', + slot_gloves_str = 'icons/mob/pda_wrist.dmi' + ) + desc = "A portable microcomputer by Thinktronic Systems, LTD. This model is a wrist-bound version." + slot_flags = SLOT_ID | SLOT_BELT | SLOT_GLOVES + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/seromi/pda_wrist.dmi', + SPECIES_VR_TESHARI = 'icons/mob/species/seromi/pda_wrist.dmi', + ) else icon = 'icons/obj/pda_old.dmi' log_debug("Invalid switch for PDA, defaulting to old PDA icons. [pdachoice] chosen.") diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 8cd4e60fce..40e7b5e01c 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -87,7 +87,7 @@ var/sound/music_played = sound(soundfile) for(var/i in hearing_mobs) var/mob/M = i - M.playsound_local(source, null, 100, falloff = 5, S = music_played) + M.playsound_local(source, null, 100, falloff = 0.5, S = music_played) /datum/song/proc/updateDialog(mob/user) instrumentObj.updateDialog() // assumes it's an object in world, override if otherwise diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm index edf949c8c9..a2f2b62b7f 100644 --- a/code/game/turfs/flooring/flooring.dm +++ b/code/game/turfs/flooring/flooring.dm @@ -205,14 +205,18 @@ var/list/flooring_types desc = "Gritty and unpleasant, just like dirt." icon = 'icons/turf/outdoors.dmi' icon_base = "dirt-dark" - flags = TURF_HAS_EDGES | TURF_REMOVE_SHOVEL + flags = TURF_REMOVE_SHOVEL build_type = null footstep_sounds = list("human" = list( 'sound/effects/footstep/asteroid1.ogg', 'sound/effects/footstep/asteroid2.ogg', 'sound/effects/footstep/asteroid3.ogg', 'sound/effects/footstep/asteroid4.ogg', - 'sound/effects/footstep/asteroid5.ogg')) + 'sound/effects/footstep/asteroid5.ogg', + 'sound/effects/footstep/MedDirt1.ogg', + 'sound/effects/footstep/MedDirt2.ogg', + 'sound/effects/footstep/MedDirt3.ogg', + 'sound/effects/footstep/MedDirt4.ogg',)) /decl/flooring/snow name = "snow" diff --git a/code/game/turfs/simulated/outdoors/dirt.dm b/code/game/turfs/simulated/outdoors/dirt.dm index 58e1db4951..b02bbdd9f0 100644 --- a/code/game/turfs/simulated/outdoors/dirt.dm +++ b/code/game/turfs/simulated/outdoors/dirt.dm @@ -4,4 +4,4 @@ icon_state = "dirt-dark" edge_blending_priority = 2 turf_layers = list(/turf/simulated/floor/outdoors/rocks) - initial_flooring = /decl/flooring/asteroid \ No newline at end of file + initial_flooring = /decl/flooring/dirt diff --git a/code/modules/ai/aI_holder_subtypes/simple_mob_ai.dm b/code/modules/ai/ai_holder_subtypes/simple_mob_ai.dm similarity index 100% rename from code/modules/ai/aI_holder_subtypes/simple_mob_ai.dm rename to code/modules/ai/ai_holder_subtypes/simple_mob_ai.dm diff --git a/code/modules/ai/aI_holder_subtypes/simple_mob_ai_vr.dm b/code/modules/ai/ai_holder_subtypes/simple_mob_ai_vr.dm similarity index 100% rename from code/modules/ai/aI_holder_subtypes/simple_mob_ai_vr.dm rename to code/modules/ai/ai_holder_subtypes/simple_mob_ai_vr.dm diff --git a/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai.dm b/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm similarity index 97% rename from code/modules/ai/aI_holder_subtypes/slime_xenobio_ai.dm rename to code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm index c2598f4a75..f6e311ad30 100644 --- a/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai.dm +++ b/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm @@ -1,292 +1,292 @@ -// Specialized AI for slime simplemobs. -// Unlike the parent AI code, this will probably break a lot of things if you put it on something that isn't /mob/living/simple_mob/slime/xenobio - -/datum/ai_holder/simple_mob/xenobio_slime - hostile = TRUE - cooperative = TRUE - firing_lanes = TRUE - mauling = TRUE // They need it to get the most out of monkeys. - var/rabid = FALSE // Will attack regardless of discipline. - var/discipline = 0 // Beating slimes makes them less likely to lash out. In theory. - var/resentment = 0 // 'Unjustified' beatings make this go up, and makes it more likely for abused slimes to go rabid. - var/obedience = 0 // Conversely, 'justified' beatings make this go up, and makes discipline decay slower, potentially making it not decay at all. - - var/always_stun = FALSE // If true, the slime will elect to attempt to permastun the target. - - var/last_discipline_decay = null // Last world.time discipline was reduced from decay. - var/discipline_decay_time = 5 SECONDS // Earliest that one discipline can decay. - - var/list/grudges = list() // List of Prometheans who are jerks. - -/datum/ai_holder/simple_mob/xenobio_slime/Destroy() - grudges.Cut() - ..() - -/datum/ai_holder/simple_mob/xenobio_slime/sapphire - always_stun = TRUE // They know that stuns are godly. - intelligence_level = AI_SMART // Also knows not to walk while confused if it risks death. - -/datum/ai_holder/simple_mob/xenobio_slime/light_pink - discipline = 10 - obedience = 10 - -/datum/ai_holder/simple_mob/xenobio_slime/passive/New() // For Kendrick. - ..() - pacify() - -/datum/ai_holder/simple_mob/xenobio_slime/New() - ..() - ASSERT(istype(holder, /mob/living/simple_mob/slime/xenobio)) - -// Checks if disciplining the slime would be 'justified' right now. -/datum/ai_holder/simple_mob/xenobio_slime/proc/is_justified_to_discipline() - ai_log("xenobio_slime/is_justified_to_discipline() : Entered.", AI_LOG_TRACE) - if(!can_act()) - ai_log("xenobio_slime/is_justified_to_discipline() : Judged to be unjustified because we cannot act. Exiting.", AI_LOG_DEBUG) - return FALSE // The slime considers it abuse if they get stunned while already stunned. - if(rabid) - ai_log("xenobio_slime/is_justified_to_discipline() : Judged to be justified because we're rabid. Exiting.", AI_LOG_TRACE) - return TRUE - if(target && can_attack(target)) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(istype(H.species, /datum/species/monkey)) - ai_log("xenobio_slime/is_justified_to_discipline() : Judged to be unjustified because we're targeting a monkey. Exiting.", AI_LOG_DEBUG) - return FALSE // Attacking monkeys is okay. - ai_log("xenobio_slime/is_justified_to_discipline() : Judged to be justified because we are targeting a non-monkey. Exiting.", AI_LOG_TRACE) - return TRUE // Otherwise attacking other things is bad. - ai_log("xenobio_slime/is_justified_to_discipline() : Judged to be unjustified because we are not targeting anything. Exiting.", AI_LOG_DEBUG) - return FALSE // Not attacking anything. - -/datum/ai_holder/simple_mob/xenobio_slime/proc/can_command(mob/living/commander) - if(rabid) - return FALSE - if(!hostile) - return SLIME_COMMAND_OBEY -// if(commander in friends) -// return SLIME_COMMAND_FRIEND - if(holder.IIsAlly(commander)) - return SLIME_COMMAND_FACTION - if(discipline > resentment && obedience >= 5) - return SLIME_COMMAND_OBEY - return FALSE - -/datum/ai_holder/simple_mob/xenobio_slime/proc/adjust_discipline(amount, silent) - var/mob/living/simple_mob/slime/xenobio/my_slime = holder - if(amount > 0) - if(rabid) - return - var/justified = my_slime.is_justified_to_discipline() // This will also consider the AI-side of that proc. - remove_target() // Stop attacking. - - if(justified) - obedience++ - if(!silent) - holder.say(pick("Fine...", "Okay...", "Sorry...", "I yield...", "Mercy...")) - else - if(prob(resentment * 20)) - enrage() - holder.say(pick("Evil...", "Kill...", "Tyrant...")) - else - if(!silent) - holder.say(pick("Why...?", "I don't understand...?", "Cruel...", "Stop...", "Nooo...")) - resentment++ // Done after check so first time will never enrage. - - discipline = between(0, discipline + amount, 10) - my_slime.update_mood() - -// This slime always enrages if disciplined. -/datum/ai_holder/simple_mob/xenobio_slime/red/adjust_discipline(amount, silent) - if(amount > 0 && !rabid) - holder.say("Grrr...") - holder.add_modifier(/datum/modifier/berserk, 30 SECONDS) - enrage() - -/datum/ai_holder/simple_mob/xenobio_slime/handle_special_strategical() - discipline_decay() - -// Handles decay of discipline. -/datum/ai_holder/simple_mob/xenobio_slime/proc/discipline_decay() - if(discipline > 0 && last_discipline_decay + discipline_decay_time < world.time) - if(!prob(75 + (obedience * 5))) - adjust_discipline(-1) - last_discipline_decay = world.time - -/datum/ai_holder/simple_mob/xenobio_slime/handle_special_tactic() - evolve_and_reproduce() - -// Hit the correct verbs to keep the slime species going. -/datum/ai_holder/simple_mob/xenobio_slime/proc/evolve_and_reproduce() - var/mob/living/simple_mob/slime/xenobio/my_slime = holder - if(my_slime.amount_grown >= 10) - // Press the correct verb when we can. - if(my_slime.is_adult) - my_slime.reproduce() // Splits into four new baby slimes. - else - my_slime.evolve() // Turns our holder into an adult slime. - - -// Called when pushed too far (or a red slime core was used). -/datum/ai_holder/simple_mob/xenobio_slime/proc/enrage() - var/mob/living/simple_mob/slime/xenobio/my_slime = holder - if(my_slime.harmless) - return - rabid = TRUE - my_slime.update_mood() - my_slime.visible_message(span("danger", "\The [my_slime] enrages!")) - -// Called when using a pacification agent (or it's Kendrick being initalized). -/datum/ai_holder/simple_mob/xenobio_slime/proc/pacify() - remove_target() // So it stops trying to kill them. - rabid = FALSE - hostile = FALSE - retaliate = FALSE - cooperative = FALSE - holder.a_intent = I_HELP - -// The holder's attack changes based on intent. This lets the AI choose what effect is desired. -/datum/ai_holder/simple_mob/xenobio_slime/pre_melee_attack(atom/A) - if(istype(A, /mob/living)) - var/mob/living/L = A - var/mob/living/simple_mob/slime/xenobio/my_slime = holder - - if( (!L.lying && prob(30 + (my_slime.power_charge * 7) ) || (!L.lying && always_stun) )) - my_slime.a_intent = I_DISARM // Stun them first. - else if(my_slime.can_consume(L) && L.lying) - my_slime.a_intent = I_GRAB // Then eat them. - else - my_slime.a_intent = I_HURT // Otherwise robust them. - -/datum/ai_holder/simple_mob/xenobio_slime/closest_distance(atom/movable/AM) - if(istype(AM, /mob/living)) - var/mob/living/L = AM - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(istype(H.species, /datum/species/monkey)) - return 1 // Otherwise ranged slimes will eat a lot less often. - if(L.stat >= UNCONSCIOUS) - return 1 // Melee (eat) the target if dead/dying, don't shoot it. - return ..() - -/datum/ai_holder/simple_mob/xenobio_slime/can_attack(atom/movable/AM, var/vision_required = TRUE) - . = ..() - if(.) // Do some additional checks because we have Special Code(tm). - if(ishuman(AM)) - var/mob/living/carbon/human/H = AM - if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too. - return TRUE // Monkeys are always food (sorry Pun Pun). - else if(H.species && H.species.name == SPECIES_PROMETHEAN) // Prometheans are always our friends. - if(!(H in grudges)) // Unless they're an ass. - return FALSE - if(discipline && !rabid) - holder.a_intent = I_HELP - return FALSE // We're a good slime. - -/datum/ai_holder/simple_mob/xenobio_slime/react_to_attack(atom/movable/attacker) - . = ..(attacker) - - if(ishuman(attacker)) - var/mob/living/carbon/human/H = attacker - if(H.species && H.species.name == SPECIES_PROMETHEAN) // They're a jerk. - grudges |= H - -// Commands, reactions, etc -/datum/ai_holder/simple_mob/xenobio_slime/on_hear_say(mob/living/speaker, message) - ai_log("xenobio_slime/on_hear_say([speaker], [message]) : Entered.", AI_LOG_DEBUG) - var/mob/living/simple_mob/slime/xenobio/my_slime = holder - - if((findtext(message, num2text(my_slime.number)) || findtext(message, my_slime.name) || findtext(message, "slimes"))) // Talking to us. - - // First, make sure it's actually a player saying something and not an AI, or else we risk infinite loops. - if(!speaker.client) - return - - // Are all slimes being referred to? - // var/mass_order = FALSE - // if(findtext(message, "slimes")) - // mass_order = TRUE - - // Say hello back. - if(findtext(message, "hello") || findtext(message, "hi") || findtext(message, "greetings")) - delayed_say(pick("Hello...", "Hi..."), speaker) - - // Follow request. - if(findtext(message, "follow") || findtext(message, "come with me")) - if(!can_command(speaker)) - delayed_say(pick("No...", "I won't follow..."), speaker) - return - - delayed_say("Yes... I follow \the [speaker]...", speaker) - set_follow(speaker) - - // Squish request. - if(findtext(message , "squish")) - if(!can_command(speaker)) - delayed_say("No...", speaker) - return - - spawn(rand(1 SECOND, 2 SECONDS)) - if(!src || !holder || !can_act()) // We might've died/got deleted/etc in the meantime. - return - my_slime.squish() - - - // Stop request. - if(findtext(message, "stop") || findtext(message, "halt") || findtext(message, "cease")) - if(my_slime.victim) // We're being asked to stop eatting someone. - if(!can_command(speaker) || !is_justified_to_discipline()) - delayed_say("No...", speaker) - return - else - delayed_say("Fine...", speaker) - adjust_discipline(1, TRUE) - my_slime.stop_consumption() - - if(target) // We're being asked to stop chasing someone. - if(!can_command(speaker) || !is_justified_to_discipline()) - delayed_say("No...", speaker) - return - else - delayed_say("Fine...", speaker) - adjust_discipline(1, TRUE) // This must come before losing the target or it will be unjustified. - remove_target() - - - if(leader) // We're being asked to stop following someone. - if(can_command(speaker) == SLIME_COMMAND_FRIEND || leader == speaker) - delayed_say("Yes... I'll stop...", speaker) - lose_follow() - else - delayed_say("No... I'll keep following \the [leader]...", speaker) - - /* // Commented out since its mostly useless now due to slimes refusing to attack if it would make them naughty. - // Murder request - if(findtext(message, "harm") || findtext(message, "attack") || findtext(message, "kill") || findtext(message, "murder") || findtext(message, "eat") || findtext(message, "consume") || findtext(message, "absorb")) - if(can_command(speaker) < SLIME_COMMAND_FACTION) - delayed_say("No...", speaker) - return - - for(var/mob/living/L in view(7, my_slime) - list(my_slime, speaker)) - if(L == src) - continue // Don't target ourselves. - var/list/valid_names = splittext(L.name, " ") // Should output list("John", "Doe") as an example. - for(var/line in valid_names) // Check each part of someone's name. - if(findtext(message, lowertext(line))) // If part of someone's name is in the command, the slime targets them if allowed to. - if(!(mass_order && line == "slime")) //don't think random other slimes are target - if(can_attack(L)) - delayed_say("Okay... I attack \the [L]...", speaker) - give_target(L) - return - else - delayed_say("No... I won't attack \the [L].", speaker) - return - - // If we're here, it couldn't find anyone with that name. - delayed_say("No... I don't know who to attack...", speaker) - */ - ai_log("xenobio_slime/on_hear_say() : Exited.", AI_LOG_DEBUG) - -/datum/ai_holder/simple_mob/xenobio_slime/can_violently_breakthrough() - if(discipline && !rabid) // Good slimes don't shatter the windows because their buddy in an adjacent cell decided to piss off Slimesky. - return FALSE - return ..() +// Specialized AI for slime simplemobs. +// Unlike the parent AI code, this will probably break a lot of things if you put it on something that isn't /mob/living/simple_mob/slime/xenobio + +/datum/ai_holder/simple_mob/xenobio_slime + hostile = TRUE + cooperative = TRUE + firing_lanes = TRUE + mauling = TRUE // They need it to get the most out of monkeys. + var/rabid = FALSE // Will attack regardless of discipline. + var/discipline = 0 // Beating slimes makes them less likely to lash out. In theory. + var/resentment = 0 // 'Unjustified' beatings make this go up, and makes it more likely for abused slimes to go rabid. + var/obedience = 0 // Conversely, 'justified' beatings make this go up, and makes discipline decay slower, potentially making it not decay at all. + + var/always_stun = FALSE // If true, the slime will elect to attempt to permastun the target. + + var/last_discipline_decay = null // Last world.time discipline was reduced from decay. + var/discipline_decay_time = 5 SECONDS // Earliest that one discipline can decay. + + var/list/grudges = list() // List of Prometheans who are jerks. + +/datum/ai_holder/simple_mob/xenobio_slime/Destroy() + grudges.Cut() + ..() + +/datum/ai_holder/simple_mob/xenobio_slime/sapphire + always_stun = TRUE // They know that stuns are godly. + intelligence_level = AI_SMART // Also knows not to walk while confused if it risks death. + +/datum/ai_holder/simple_mob/xenobio_slime/light_pink + discipline = 10 + obedience = 10 + +/datum/ai_holder/simple_mob/xenobio_slime/passive/New() // For Kendrick. + ..() + pacify() + +/datum/ai_holder/simple_mob/xenobio_slime/New() + ..() + ASSERT(istype(holder, /mob/living/simple_mob/slime/xenobio)) + +// Checks if disciplining the slime would be 'justified' right now. +/datum/ai_holder/simple_mob/xenobio_slime/proc/is_justified_to_discipline() + ai_log("xenobio_slime/is_justified_to_discipline() : Entered.", AI_LOG_TRACE) + if(!can_act()) + ai_log("xenobio_slime/is_justified_to_discipline() : Judged to be unjustified because we cannot act. Exiting.", AI_LOG_DEBUG) + return FALSE // The slime considers it abuse if they get stunned while already stunned. + if(rabid) + ai_log("xenobio_slime/is_justified_to_discipline() : Judged to be justified because we're rabid. Exiting.", AI_LOG_TRACE) + return TRUE + if(target && can_attack(target)) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(istype(H.species, /datum/species/monkey)) + ai_log("xenobio_slime/is_justified_to_discipline() : Judged to be unjustified because we're targeting a monkey. Exiting.", AI_LOG_DEBUG) + return FALSE // Attacking monkeys is okay. + ai_log("xenobio_slime/is_justified_to_discipline() : Judged to be justified because we are targeting a non-monkey. Exiting.", AI_LOG_TRACE) + return TRUE // Otherwise attacking other things is bad. + ai_log("xenobio_slime/is_justified_to_discipline() : Judged to be unjustified because we are not targeting anything. Exiting.", AI_LOG_DEBUG) + return FALSE // Not attacking anything. + +/datum/ai_holder/simple_mob/xenobio_slime/proc/can_command(mob/living/commander) + if(rabid) + return FALSE + if(!hostile) + return SLIME_COMMAND_OBEY +// if(commander in friends) +// return SLIME_COMMAND_FRIEND + if(holder.IIsAlly(commander)) + return SLIME_COMMAND_FACTION + if(discipline > resentment && obedience >= 5) + return SLIME_COMMAND_OBEY + return FALSE + +/datum/ai_holder/simple_mob/xenobio_slime/proc/adjust_discipline(amount, silent) + var/mob/living/simple_mob/slime/xenobio/my_slime = holder + if(amount > 0) + if(rabid) + return + var/justified = my_slime.is_justified_to_discipline() // This will also consider the AI-side of that proc. + remove_target() // Stop attacking. + + if(justified) + obedience++ + if(!silent) + holder.say(pick("Fine...", "Okay...", "Sorry...", "I yield...", "Mercy...")) + else + if(prob(resentment * 20)) + enrage() + holder.say(pick("Evil...", "Kill...", "Tyrant...")) + else + if(!silent) + holder.say(pick("Why...?", "I don't understand...?", "Cruel...", "Stop...", "Nooo...")) + resentment++ // Done after check so first time will never enrage. + + discipline = between(0, discipline + amount, 10) + my_slime.update_mood() + +// This slime always enrages if disciplined. +/datum/ai_holder/simple_mob/xenobio_slime/red/adjust_discipline(amount, silent) + if(amount > 0 && !rabid) + holder.say("Grrr...") + holder.add_modifier(/datum/modifier/berserk, 30 SECONDS) + enrage() + +/datum/ai_holder/simple_mob/xenobio_slime/handle_special_strategical() + discipline_decay() + +// Handles decay of discipline. +/datum/ai_holder/simple_mob/xenobio_slime/proc/discipline_decay() + if(discipline > 0 && last_discipline_decay + discipline_decay_time < world.time) + if(!prob(75 + (obedience * 5))) + adjust_discipline(-1) + last_discipline_decay = world.time + +/datum/ai_holder/simple_mob/xenobio_slime/handle_special_tactic() + evolve_and_reproduce() + +// Hit the correct verbs to keep the slime species going. +/datum/ai_holder/simple_mob/xenobio_slime/proc/evolve_and_reproduce() + var/mob/living/simple_mob/slime/xenobio/my_slime = holder + if(my_slime.amount_grown >= 10) + // Press the correct verb when we can. + if(my_slime.is_adult) + my_slime.reproduce() // Splits into four new baby slimes. + else + my_slime.evolve() // Turns our holder into an adult slime. + + +// Called when pushed too far (or a red slime core was used). +/datum/ai_holder/simple_mob/xenobio_slime/proc/enrage() + var/mob/living/simple_mob/slime/xenobio/my_slime = holder + if(my_slime.harmless) + return + rabid = TRUE + my_slime.update_mood() + my_slime.visible_message(span("danger", "\The [my_slime] enrages!")) + +// Called when using a pacification agent (or it's Kendrick being initalized). +/datum/ai_holder/simple_mob/xenobio_slime/proc/pacify() + remove_target() // So it stops trying to kill them. + rabid = FALSE + hostile = FALSE + retaliate = FALSE + cooperative = FALSE + holder.a_intent = I_HELP + +// The holder's attack changes based on intent. This lets the AI choose what effect is desired. +/datum/ai_holder/simple_mob/xenobio_slime/pre_melee_attack(atom/A) + if(istype(A, /mob/living)) + var/mob/living/L = A + var/mob/living/simple_mob/slime/xenobio/my_slime = holder + + if( (!L.lying && prob(30 + (my_slime.power_charge * 7) ) || (!L.lying && always_stun) )) + my_slime.a_intent = I_DISARM // Stun them first. + else if(my_slime.can_consume(L) && L.lying) + my_slime.a_intent = I_GRAB // Then eat them. + else + my_slime.a_intent = I_HURT // Otherwise robust them. + +/datum/ai_holder/simple_mob/xenobio_slime/closest_distance(atom/movable/AM) + if(istype(AM, /mob/living)) + var/mob/living/L = AM + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(istype(H.species, /datum/species/monkey)) + return 1 // Otherwise ranged slimes will eat a lot less often. + if(L.stat >= UNCONSCIOUS) + return 1 // Melee (eat) the target if dead/dying, don't shoot it. + return ..() + +/datum/ai_holder/simple_mob/xenobio_slime/can_attack(atom/movable/AM, var/vision_required = TRUE) + . = ..() + if(.) // Do some additional checks because we have Special Code(tm). + if(ishuman(AM)) + var/mob/living/carbon/human/H = AM + if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too. + return TRUE // Monkeys are always food (sorry Pun Pun). + else if(H.species && H.species.name == SPECIES_PROMETHEAN) // Prometheans are always our friends. + if(!(H in grudges)) // Unless they're an ass. + return FALSE + if(discipline && !rabid) + holder.a_intent = I_HELP + return FALSE // We're a good slime. + +/datum/ai_holder/simple_mob/xenobio_slime/react_to_attack(atom/movable/attacker) + . = ..(attacker) + + if(ishuman(attacker)) + var/mob/living/carbon/human/H = attacker + if(H.species && H.species.name == SPECIES_PROMETHEAN) // They're a jerk. + grudges |= H + +// Commands, reactions, etc +/datum/ai_holder/simple_mob/xenobio_slime/on_hear_say(mob/living/speaker, message) + ai_log("xenobio_slime/on_hear_say([speaker], [message]) : Entered.", AI_LOG_DEBUG) + var/mob/living/simple_mob/slime/xenobio/my_slime = holder + + if((findtext(message, num2text(my_slime.number)) || findtext(message, my_slime.name) || findtext(message, "slimes"))) // Talking to us. + + // First, make sure it's actually a player saying something and not an AI, or else we risk infinite loops. + if(!speaker.client) + return + + // Are all slimes being referred to? + // var/mass_order = FALSE + // if(findtext(message, "slimes")) + // mass_order = TRUE + + // Say hello back. + if(findtext(message, "hello") || findtext(message, "hi") || findtext(message, "greetings")) + delayed_say(pick("Hello...", "Hi..."), speaker) + + // Follow request. + if(findtext(message, "follow") || findtext(message, "come with me")) + if(!can_command(speaker)) + delayed_say(pick("No...", "I won't follow..."), speaker) + return + + delayed_say("Yes... I follow \the [speaker]...", speaker) + set_follow(speaker) + + // Squish request. + if(findtext(message , "squish")) + if(!can_command(speaker)) + delayed_say("No...", speaker) + return + + spawn(rand(1 SECOND, 2 SECONDS)) + if(!src || !holder || !can_act()) // We might've died/got deleted/etc in the meantime. + return + my_slime.squish() + + + // Stop request. + if(findtext(message, "stop") || findtext(message, "halt") || findtext(message, "cease")) + if(my_slime.victim) // We're being asked to stop eatting someone. + if(!can_command(speaker) || !is_justified_to_discipline()) + delayed_say("No...", speaker) + return + else + delayed_say("Fine...", speaker) + adjust_discipline(1, TRUE) + my_slime.stop_consumption() + + if(target) // We're being asked to stop chasing someone. + if(!can_command(speaker) || !is_justified_to_discipline()) + delayed_say("No...", speaker) + return + else + delayed_say("Fine...", speaker) + adjust_discipline(1, TRUE) // This must come before losing the target or it will be unjustified. + remove_target() + + + if(leader) // We're being asked to stop following someone. + if(can_command(speaker) == SLIME_COMMAND_FRIEND || leader == speaker) + delayed_say("Yes... I'll stop...", speaker) + lose_follow() + else + delayed_say("No... I'll keep following \the [leader]...", speaker) + + /* // Commented out since its mostly useless now due to slimes refusing to attack if it would make them naughty. + // Murder request + if(findtext(message, "harm") || findtext(message, "attack") || findtext(message, "kill") || findtext(message, "murder") || findtext(message, "eat") || findtext(message, "consume") || findtext(message, "absorb")) + if(can_command(speaker) < SLIME_COMMAND_FACTION) + delayed_say("No...", speaker) + return + + for(var/mob/living/L in view(7, my_slime) - list(my_slime, speaker)) + if(L == src) + continue // Don't target ourselves. + var/list/valid_names = splittext(L.name, " ") // Should output list("John", "Doe") as an example. + for(var/line in valid_names) // Check each part of someone's name. + if(findtext(message, lowertext(line))) // If part of someone's name is in the command, the slime targets them if allowed to. + if(!(mass_order && line == "slime")) //don't think random other slimes are target + if(can_attack(L)) + delayed_say("Okay... I attack \the [L]...", speaker) + give_target(L) + return + else + delayed_say("No... I won't attack \the [L].", speaker) + return + + // If we're here, it couldn't find anyone with that name. + delayed_say("No... I don't know who to attack...", speaker) + */ + ai_log("xenobio_slime/on_hear_say() : Exited.", AI_LOG_DEBUG) + +/datum/ai_holder/simple_mob/xenobio_slime/can_violently_breakthrough() + if(discipline && !rabid) // Good slimes don't shatter the windows because their buddy in an adjacent cell decided to piss off Slimesky. + return FALSE + return ..() diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm index 36f315b1c2..397bf2c1d0 100644 --- a/code/modules/client/preference_setup/general/04_equipment.dm +++ b/code/modules/client/preference_setup/general/04_equipment.dm @@ -42,7 +42,7 @@ pref.backbag = 1 //Same as above character.backbag = pref.backbag - if(pref.pdachoice > 5 || pref.pdachoice < 1) + if(pref.pdachoice > 6 || pref.pdachoice < 1) pref.pdachoice = 1 character.pdachoice = pref.pdachoice diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index ccea57728d..21ebb11403 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -661,6 +661,12 @@ ckeywhitelist = list("nickcrazy") character_name = list("Damon Bones Xrim") +/datum/gear/fluff/NDF_Medical_jacket + path = /obj/item/clothing/under/solgov/utility/sifguard/medical + display_name = "Ridge's Medical Jacket" + ckeywhitelist = list("nickcrazy") + character_name = list("Ridge") + /datum/gear/fluff/damon_jacket path = /obj/item/clothing/suit/storage/toggle/bomber/bombersec display_name = "Damon's Bomber Jacket" @@ -1148,4 +1154,4 @@ path = /obj/item/device/radio/headset/fluff/zodiacshadow display_name = "Nehi's Radio" ckeywhitelist = list("zodiacshadow") - character_name = list("Nehi Maximus") \ No newline at end of file + character_name = list("Nehi Maximus") diff --git a/code/modules/client/preference_setup/loadout/loadout_gloves.dm b/code/modules/client/preference_setup/loadout/loadout_gloves.dm index 74fb11fcaa..b72549e866 100644 --- a/code/modules/client/preference_setup/loadout/loadout_gloves.dm +++ b/code/modules/client/preference_setup/loadout/loadout_gloves.dm @@ -2,7 +2,7 @@ /datum/gear/gloves display_name = "gloves, black" path = /obj/item/clothing/gloves/black - cost = 2 + cost = 1 slot = slot_gloves sort_category = "Gloves and Handwear" @@ -29,10 +29,12 @@ /datum/gear/gloves/latex display_name = "gloves, latex" path = /obj/item/clothing/gloves/sterile/latex + cost = 2 /datum/gear/gloves/nitrile display_name = "gloves, nitrile" path = /obj/item/clothing/gloves/sterile/nitrile + cost = 2 /datum/gear/gloves/orange display_name = "gloves, orange" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index c77ac54a2f..3d59a4a17e 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -140,11 +140,13 @@ switch(target_species) //VOREStation Edit Start if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_NEVREAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) if(SPECIES_UNATHI) species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) if(SPECIES_VULPKANIN) species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) //VOREStation Edit End else species_restricted = list(target_species) @@ -166,15 +168,16 @@ switch(target_species) //VOREStation Edit Start if(SPECIES_HUMAN) - species_restricted = list(SPECIES_HUMAN, SPECIES_NEVREAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) if(SPECIES_SKRELL) - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_NEVREAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) if(SPECIES_UNATHI) species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) if(SPECIES_VULPKANIN) species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) //VOREStation Edit End - else species_restricted = list(target_species) diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm index b1eb27e981..bb6f6d1567 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm @@ -3,12 +3,13 @@ SPECIES_TAJ = 'icons/mob/species/tajaran/helmet.dmi', SPECIES_SKRELL = 'icons/mob/species/skrell/helmet.dmi', SPECIES_UNATHI = 'icons/mob/species/unathi/helmet.dmi', - SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet.dmi', SPECIES_AKULA = 'icons/mob/species/akula/helmet_vr.dmi', SPECIES_SERGAL = 'icons/mob/species/sergal/helmet_vr.dmi', + SPECIES_NEVREAN = 'icons/mob/species/sergal/helmet_vr.dmi', SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet.dmi', - SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/helmet.dmi', - SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/helmet.dmi', + SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet.dmi', SPECIES_PROMETHEAN = 'icons/mob/species/skrell/helmet.dmi', SPECIES_VOX = 'icons/mob/species/vox/head.dmi', SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi', @@ -22,15 +23,16 @@ SPECIES_TAJ = 'icons/mob/species/tajaran/suit.dmi', SPECIES_SKRELL = 'icons/mob/species/skrell/suit.dmi', SPECIES_UNATHI = 'icons/mob/species/unathi/suit.dmi', - SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit.dmi', SPECIES_AKULA = 'icons/mob/species/akula/suit_vr.dmi', SPECIES_SERGAL = 'icons/mob/species/sergal/suit_vr.dmi', + SPECIES_NEVREAN = 'icons/mob/species/sergal/suit_vr.dmi', SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit.dmi', SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/suit.dmi', - SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit.dmi', + SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit.dmi', SPECIES_PROMETHEAN = 'icons/mob/species/skrell/suit.dmi', SPECIES_VOX = 'icons/mob/species/vox/suit.dmi', - SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi' + SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi' ) /obj/item/clothing/head/helmet/space/rig diff --git a/code/modules/clothing/spacesuits/void/ert.dm b/code/modules/clothing/spacesuits/void/ert.dm new file mode 100644 index 0000000000..a89ff26f07 --- /dev/null +++ b/code/modules/clothing/spacesuits/void/ert.dm @@ -0,0 +1,164 @@ +/obj/item/clothing/suit/space/void/responseteam + name = "Mark VII Emergency Response Suit" + desc = "Utilizing cutting edge tech from Hephaestus, the Mark VII is the latest and greatest in semi-powered personal protection systems; like the civilian AutoLok suit, the Mark VII can automatically adapt to fit most species without issue via RFID tags. This significantly reduces the time required for response teams to suit up, as it eliminates the need for dedicated cycler units. It also has an integrated, unremovable helmet. Standard air tanks, suit coolers, and magboots may be installed and removed as needed." + icon_state = "ertsuit" + item_state = "ertsuit" + armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100) + slowdown = 1 + siemens_coefficient = 0.5 + species_restricted = list("exclude",SPECIES_DIONA,SPECIES_VOX,SPECIES_TESHARI) //this thing can autoadapt + icon = 'icons/obj/clothing/suits_vr.dmi' + w_class = ITEMSIZE_NORMAL //the mark vii packs itself down when not in use, thanks future-materials + +/obj/item/clothing/suit/space/void/responseteam/command + name = "Mark VII-C Emergency Response Team Commander Suit" + +/obj/item/clothing/suit/space/void/responseteam/command/Initialize() + ..() + helmet = new /obj/item/clothing/head/helmet/space/void/responseteam/command //autoinstall the helmet + +/obj/item/clothing/suit/space/void/responseteam/medical + name = "Mark VII-M Emergency Medical Response Suit" + icon_state = "ertsuit_m" + item_state = "ertsuit_m" + +/obj/item/clothing/suit/space/void/responseteam/medical/Initialize() + ..() + helmet = new /obj/item/clothing/head/helmet/space/void/responseteam/medical //autoinstall the helmet + +/obj/item/clothing/suit/space/void/responseteam/engineer + name = "Mark VII-E Emergency Engineering Response Suit" + icon_state = "ertsuit_e" + item_state = "ertsuit_e" + +/obj/item/clothing/suit/space/void/responseteam/engineer/Initialize() + ..() + helmet = new /obj/item/clothing/head/helmet/space/void/responseteam/engineer //autoinstall the helmet + +/obj/item/clothing/suit/space/void/responseteam/security + name = "Mark VII-S Emergency Security Response Suit" + icon_state = "ertsuit_s" + item_state = "ertsuit_s" + +/obj/item/clothing/suit/space/void/responseteam/security/Initialize() + ..() + helmet = new /obj/item/clothing/head/helmet/space/void/responseteam/security //autoinstall the helmet + +/obj/item/clothing/suit/space/void/responseteam + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/spacesuit_vr.dmi', + SPECIES_TAJ = 'icons/mob/species/tajaran/suit_vr.dmi', + SPECIES_SKRELL = 'icons/mob/species/skrell/suit_vr.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/suit_vr.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit_vr.dmi', + SPECIES_AKULA = 'icons/mob/species/akula/suit_vr.dmi', + SPECIES_SERGAL = 'icons/mob/species/sergal/suit_vr.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit_vr.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/suit_vr.dmi', + SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit_vr.dmi' + ) + sprite_sheets_obj = list( + SPECIES_TAJ = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_AKULA = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/suits_vr.dmi' + ) + + +//override the attackby screwdriver proc so that people can't remove the helmet +/obj/item/clothing/suit/space/void/responseteam/attackby(obj/item/W as obj, mob/user as mob) + + if(!isliving(user)) + return + + if(istype(W, /obj/item/clothing/accessory) || istype(W, /obj/item/weapon/hand_labeler)) + return ..() + + if(user.get_inventory_slot(src) == slot_wear_suit) + to_chat(user, "You cannot modify \the [src] while it is being worn.") + return + + if(W.is_screwdriver()) + if(boots || tank || cooler) + var/choice = input("What component would you like to remove?") as null|anything in list(boots,tank,cooler) + if(!choice) return + + if(choice == tank) //No, a switch doesn't work here. Sorry. ~Techhead + to_chat(user, "You pop \the [tank] out of \the [src]'s storage compartment.") + tank.forceMove(get_turf(src)) + playsound(src, W.usesound, 50, 1) + src.tank = null + else if(choice == cooler) + to_chat(user, "You pop \the [cooler] out of \the [src]'s storage compartment.") + cooler.forceMove(get_turf(src)) + playsound(src, W.usesound, 50, 1) + src.cooler = null + else if(choice == boots) + to_chat(user, "You detach \the [boots] from \the [src]'s boot mounts.") + boots.forceMove(get_turf(src)) + playsound(src, W.usesound, 50, 1) + src.boots = null + else + to_chat(user, "\The [src] does not have anything installed.") + return + + ..() + +/obj/item/clothing/head/helmet/space/void/responseteam + name = "Mark VII Emergency Response Helmet" + desc = "As a vital part of the Mark VII suit, the integral helmet cannot be removed - so don't try." + icon_state = "erthelmet" + item_state = "erthelmet" + species_restricted = list("exclude",SPECIES_DIONA,SPECIES_VOX,SPECIES_TESHARI) //this thing can autoadapt too + armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100) + siemens_coefficient = 0.5 + icon = 'icons/obj/clothing/hats_vr.dmi' + +/obj/item/clothing/head/helmet/space/void/responseteam/command + name = "Mark VII-C Emergency Response Team Commander Helmet" + +/obj/item/clothing/head/helmet/space/void/responseteam/medical + name = "Mark VII-M Emergency Medical Response Helmet" + icon_state = "erthelmet_m" + item_state = "erthelmet_m" + +/obj/item/clothing/head/helmet/space/void/responseteam/engineer + name = "Mark VII-E Emergency Engineering Response Helmet" + icon_state = "erthelmet_e" + item_state = "erthelmet_e" + +/obj/item/clothing/head/helmet/space/void/responseteam/security + name = "Mark VII-S Emergency Security Response Helmet" + icon_state = "erthelmet_s" + item_state = "erthelmet_s" + +/obj/item/clothing/head/helmet/space/void/responseteam + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/head_vr.dmi', + SPECIES_TAJ = 'icons/mob/species/tajaran/helmet_vr.dmi', + SPECIES_SKRELL = 'icons/mob/species/skrell/helmet_vr.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/helmet_vr.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet_vr.dmi', + SPECIES_AKULA = 'icons/mob/species/unathi/helmet_vr.dmi', + SPECIES_SERGAL = 'icons/mob/species/unathi/helmet_vr.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet_vr.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/helmet_vr.dmi', + SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet_vr.dmi' + ) + sprite_sheets_obj = list( + SPECIES_TAJ = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_AKULA = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/hats_vr.dmi' + ) + sprite_sheets_refit = list() //have to nullify this as well just to be thorough \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/void/event_vr.dm b/code/modules/clothing/spacesuits/void/event_vr.dm index d35fbd99bb..357a8ff772 100644 --- a/code/modules/clothing/spacesuits/void/event_vr.dm +++ b/code/modules/clothing/spacesuits/void/event_vr.dm @@ -1,54 +1,3 @@ -/obj/item/clothing/head/helmet/space/void/refurb - sprite_sheets = list( - SPECIES_HUMAN = 'icons/mob/head.dmi', - SPECIES_TAJ = 'icons/mob/species/tajaran/helmet.dmi', - SPECIES_SKRELL = 'icons/mob/species/skrell/helmet.dmi', - SPECIES_UNATHI = 'icons/mob/species/unathi/helmet.dmi', - SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet.dmi', - SPECIES_AKULA = 'icons/mob/species/unathi/helmet.dmi', - SPECIES_SERGAL = 'icons/mob/species/unathi/helmet.dmi', - SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet_vr.dmi', - SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/helmet_vr.dmi', - SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet_vr.dmi' - ) - sprite_sheets_obj = list( - SPECIES_TAJ = 'icons/obj/clothing/species/tajaran/hats.dmi', - SPECIES_SKRELL = 'icons/obj/clothing/species/skrell/hats.dmi', - SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/helmets_vr.dmi', - SPECIES_XENOHYBRID = 'icons/obj/clothing/species/unathi/helmets_vr.dmi', - SPECIES_AKULA = 'icons/obj/clothing/species/unathi/helmets_vr.dmi', - SPECIES_SERGAL = 'icons/obj/clothing/species/unathi/helmets_vr.dmi', - SPECIES_VULPKANIN = 'icons/obj/clothing/species/vulpkanin/helmets_vr.dmi', - SPECIES_ZORREN_HIGH = 'icons/obj/clothing/species/vulpkanin/helmets_vr.dmi', - SPECIES_FENNEC = 'icons/obj/clothing/species/vulpkanin/helmets_vr.dmi' - ) - sprite_sheets_refit = list() //have to nullify this as well just to be thorough - -/obj/item/clothing/suit/space/void/refurb - sprite_sheets = list( - SPECIES_HUMAN = 'icons/mob/spacesuit.dmi', - SPECIES_TAJ = 'icons/mob/species/tajaran/suit.dmi', - SPECIES_SKRELL = 'icons/mob/species/skrell/suit.dmi', - SPECIES_UNATHI = 'icons/mob/species/unathi/suit.dmi', - SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit.dmi', - SPECIES_AKULA = 'icons/mob/species/unathi/suit.dmi', - SPECIES_SERGAL = 'icons/mob/species/unathi/suit.dmi', - SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit_vr.dmi', - SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/suit_vr.dmi', - SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit_vr.dmi' - ) - sprite_sheets_obj = list( - SPECIES_TAJ = 'icons/obj/clothing/species/tajaran/suits.dmi', - SPECIES_SKRELL = 'icons/obj/clothing/species/skrell/suits.dmi', - SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/suits.dmi', - SPECIES_XENOHYBRID = 'icons/obj/clothing/species/unathi/suits.dmi', - SPECIES_AKULA = 'icons/obj/clothing/species/unathi/suits.dmi', - SPECIES_SERGAL = 'icons/obj/clothing/species/unathi/suits.dmi', - SPECIES_VULPKANIN = 'icons/obj/clothing/species/vulpkanin/spacesuits_vr.dmi', - SPECIES_ZORREN_HIGH = 'icons/obj/clothing/species/vulpkanin/spacesuits_vr.dmi', - SPECIES_FENNEC = 'icons/obj/clothing/species/vulpkanin/spacesuits_vr.dmi' - ) - /obj/item/clothing/head/helmet/space/void/refurb/talon name = "talon crew voidsuit helmet" desc = "A refurbished early contact era voidsuit helmet of human design. These things aren't especially good against modern weapons but they're sturdy, incredibly easy to come by, and there are lots of spare parts for repairs. The visor has a bad habit of fogging up and collecting condensation, but it beats sucking hard vacuum." diff --git a/code/modules/clothing/spacesuits/void/military_vr.dm b/code/modules/clothing/spacesuits/void/military_vr.dm index 006b107067..ce3875a3f1 100644 --- a/code/modules/clothing/spacesuits/void/military_vr.dm +++ b/code/modules/clothing/spacesuits/void/military_vr.dm @@ -13,14 +13,14 @@ slowdown = 1.5 armor = list(melee = 60, bullet = 35, laser = 35, energy = 15, bomb = 55, bio = 100, rad = 20) -/obj/item/clothing/head/helmet/space/void/merc/prototype - name = "\improper prototype voidsuit helmet" - desc = "A special helmet designed for work in a hazardous, low pressure environment. This is an advanced model commonly used by militaries and emergency response." +/obj/item/clothing/head/helmet/space/void/security/prototype + name = "\improper security prototype voidsuit helmet" + desc = "A special helmet designed for work in a hazardous, low pressure environment. It's a little ostentatious, but it gets the job done." icon_state = "hosproto" -/obj/item/clothing/suit/space/void/merc/prototype - name = "\improper prototype voidsuit" - desc = "A special suit that protects against hazardous, low pressure environments. This is an advanced model commonly used by militaries and emergency response." +/obj/item/clothing/suit/space/void/security/prototype + name = "\improper security prototype voidsuit" + desc = "A special suit that protects against hazardous, low pressure environments. It's a little ostentatious, but it gets the job done." icon_state = "hosproto_void" /obj/item/clothing/head/helmet/space/void/merc/odst diff --git a/code/modules/clothing/spacesuits/void/void_vr.dm b/code/modules/clothing/spacesuits/void/void_vr.dm index 9b821b9fae..f9094e40fb 100644 --- a/code/modules/clothing/spacesuits/void/void_vr.dm +++ b/code/modules/clothing/spacesuits/void/void_vr.dm @@ -6,17 +6,18 @@ // /obj/item/clothing/head/helmet/space/void - species_restricted = list(SPECIES_HUMAN, SPECIES_NEVREAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) sprite_sheets = list( SPECIES_TAJ = 'icons/mob/species/tajaran/helmet.dmi', SPECIES_SKRELL = 'icons/mob/species/skrell/helmet.dmi', SPECIES_UNATHI = 'icons/mob/species/unathi/helmet.dmi', SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi', - SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet.dmi', SPECIES_AKULA = 'icons/mob/species/akula/helmet_vr.dmi', SPECIES_SERGAL = 'icons/mob/species/sergal/helmet_vr.dmi', - SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet.dmi', - SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/helmet.dmi', + SPECIES_NEVREAN = 'icons/mob/species/sergal/helmet_vr.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/helmet.dmi', SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet.dmi', SPECIES_GREY_YW = 'icons/mob/species/grey/helmet.dmi' /*ywedit*/ ) @@ -25,26 +26,28 @@ SPECIES_SKRELL = 'icons/obj/clothing/species/skrell/hats.dmi', // Copied from void.dm SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/hats.dmi', // Copied from void.dm SPECIES_TESHARI = 'icons/obj/clothing/species/seromi/hats.dmi', // Copied from void.dm - SPECIES_XENOHYBRID = 'icons/obj/clothing/species/unathi/hats.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/species/unathi/hats.dmi', SPECIES_AKULA = 'icons/obj/clothing/species/akula/hats.dmi', SPECIES_SERGAL = 'icons/obj/clothing/species/sergal/hats.dmi', - SPECIES_VULPKANIN = 'icons/obj/clothing/species/vulpkanin/hats.dmi', - SPECIES_ZORREN_HIGH = 'icons/obj/clothing/species/vulpkanin/hats.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/species/sergal/hats.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/species/vulpkanin/hats.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/species/vulpkanin/hats.dmi', SPECIES_FENNEC = 'icons/obj/clothing/species/vulpkanin/hats.dmi' ) /obj/item/clothing/suit/space/void - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_NEVREAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) sprite_sheets = list( SPECIES_TAJ = 'icons/mob/species/tajaran/suit.dmi', SPECIES_SKRELL = 'icons/mob/species/skrell/suit.dmi', SPECIES_UNATHI = 'icons/mob/species/unathi/suit.dmi', SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi', - SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit.dmi', SPECIES_AKULA = 'icons/mob/species/akula/suit_vr.dmi', SPECIES_SERGAL = 'icons/mob/species/sergal/suit_vr.dmi', - SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit.dmi', - SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/suit.dmi', + SPECIES_NEVREAN = 'icons/mob/species/sergal/suit_vr.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/suit.dmi', SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit.dmi' ) sprite_sheets_obj = list( @@ -52,11 +55,12 @@ SPECIES_SKRELL = 'icons/obj/clothing/species/skrell/suits.dmi', // Copied from void.dm SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/suits.dmi', // Copied from void.dm SPECIES_TESHARI = 'icons/obj/clothing/species/seromi/suits.dmi', // Copied from void.dm - SPECIES_XENOHYBRID = 'icons/obj/clothing/species/unathi/suits.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/species/unathi/suits.dmi', SPECIES_AKULA = 'icons/obj/clothing/species/akula/suits.dmi', SPECIES_SERGAL = 'icons/obj/clothing/species/sergal/suits.dmi', - SPECIES_VULPKANIN = 'icons/obj/clothing/species/vulpkanin/suits.dmi', - SPECIES_ZORREN_HIGH = 'icons/obj/clothing/species/vulpkanin/suits.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/species/sergal/suits.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/species/vulpkanin/suits.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/species/vulpkanin/suits.dmi', SPECIES_FENNEC = 'icons/obj/clothing/species/vulpkanin/suits.dmi' ) diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm index 49c2d1d720..d1672e51cd 100644 --- a/code/modules/events/aurora_caelus.dm +++ b/code/modules/events/aurora_caelus.dm @@ -10,7 +10,7 @@ During this time, starlight will be bright but gentle, shifting between quiet green and blue colors. \ Any staff who would like to view these lights for themselves may proceed to the area nearest to them with viewing ports to open space. \ You will have approximately two minutes before the ions begin to reach the hull. \ - We hope you enjoy the lights.", "Nanotrasen Meteorology Division", new_sound = 'sound/AI/aurora.ogg') + We hope you enjoy the lights.", "Nanotrasen Meteorology Division", new_sound = 'sound/AI/aurora.ogg') //VOREStation Edit /datum/event/aurora_caelus/start() affecting_z -= global.using_map.sealed_levels // Space levels only please! @@ -29,8 +29,8 @@ command_announcement.Announce("The Aurora Caelus event is now ending. Starlight conditions have returned to normal, and the cloud has dissipated. \ Please return to your workplace and continue work as normal. \ Have a pleasant shift, [station_name()], and thank you for watching with us.", -"Nanotrasen Meteorology Division", new_sound = 'sound/AI/aurora_end.ogg') +"Nanotrasen Meteorology Division", new_sound = 'sound/AI/aurora_end.ogg') //VOREStation Edit ..() /datum/event/aurora_caelus/overmap/announce() - return \ No newline at end of file + return diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index ca30941c1c..6c15080d6d 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -145,6 +145,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lore News", /datum/event/lore_news, 400), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Aurora Caelus", /datum/event/aurora_caelus, 2, list(), 1), ) /datum/event_container/moderate diff --git a/code/modules/events/solar_storm.dm b/code/modules/events/solar_storm.dm index f616ef3c61..a8d4b92a3c 100644 --- a/code/modules/events/solar_storm.dm +++ b/code/modules/events/solar_storm.dm @@ -18,7 +18,7 @@ /datum/event/solar_storm/start() - command_announcement.Announce("The solar storm has reached the station. Please refain from EVA and remain inside the station until it has passed.", "Anomaly Alert") + command_announcement.Announce("The solar storm has reached the station. Please refrain from EVA and remain inside the station until it has passed.", "Anomaly Alert") adjust_solar_output(5) diff --git a/code/modules/gamemaster/event2/events/everyone/solar_storm.dm b/code/modules/gamemaster/event2/events/everyone/solar_storm.dm index b73df66076..bfc35440a3 100644 --- a/code/modules/gamemaster/event2/events/everyone/solar_storm.dm +++ b/code/modules/gamemaster/event2/events/everyone/solar_storm.dm @@ -22,7 +22,7 @@ adjust_solar_output(1.5) /datum/event2/event/solar_storm/start() - command_announcement.Announce("The solar storm has reached the station. Please refain from EVA and remain inside the station until it has passed.", "Anomaly Alert") + command_announcement.Announce("The solar storm has reached the station. Please refrain from EVA and remain inside the station until it has passed.", "Anomaly Alert") adjust_solar_output(5) /datum/event2/event/solar_storm/event_tick() diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index 2da552c5b1..eb1a76b32c 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -114,6 +114,7 @@ var/list/name_to_material var/list/composite_material // If set, object matter var will be a list containing these values. var/luminescence var/radiation_resistance = 0 // Radiation resistance, which is added on top of a material's weight for blocking radiation. Needed to make lead special without superrobust weapons. + var/supply_conversion_value // Supply points per sheet that this material sells for. // Placeholder vars for the time being, todo properly integrate windows/light tiles/rods. var/created_window @@ -256,6 +257,7 @@ var/list/name_to_material weight = 22 stack_origin_tech = list(TECH_MATERIAL = 5) door_icon_base = "stone" + supply_conversion_value = 2 /material/diamond name = "diamond" @@ -271,6 +273,7 @@ var/list/name_to_material tableslam_noise = 'sound/effects/Glasshit.ogg' hardness = 100 stack_origin_tech = list(TECH_MATERIAL = 6) + supply_conversion_value = 8 /material/gold name = "gold" @@ -282,6 +285,7 @@ var/list/name_to_material stack_origin_tech = list(TECH_MATERIAL = 4) sheet_singular_name = "ingot" sheet_plural_name = "ingots" + supply_conversion_value = 2 /material/gold/bronze //placeholder for ashtrays name = "bronze" @@ -297,6 +301,7 @@ var/list/name_to_material stack_origin_tech = list(TECH_MATERIAL = 3) sheet_singular_name = "ingot" sheet_plural_name = "ingots" + supply_conversion_value = 2 //R-UST port /material/supermatter @@ -329,6 +334,7 @@ var/list/name_to_material door_icon_base = "stone" sheet_singular_name = "crystal" sheet_plural_name = "crystals" + supply_conversion_value = 5 /* // Commenting this out while fires are so spectacularly lethal, as I can't seem to get this balanced appropriately. @@ -370,6 +376,7 @@ var/list/name_to_material hardness = 30 //VOREStation Edit - Please. integrity = 201 //hack to stop kitchen benches being flippable, todo: refactor into weight system stack_type = /obj/item/stack/material/marble + supply_conversion_value = 2 /material/steel name = DEFAULT_WALL_MATERIAL @@ -428,6 +435,7 @@ var/list/name_to_material conductivity = 13 // For the purposes of balance. stack_origin_tech = list(TECH_MATERIAL = 2) composite_material = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT, "platinum" = SHEET_MATERIAL_AMOUNT) //todo + supply_conversion_value = 6 /material/plasteel/hull name = MAT_PLASTEELHULL @@ -457,6 +465,7 @@ var/list/name_to_material reflectivity = 0.7 // Not a perfect mirror, but close. stack_origin_tech = list(TECH_MATERIAL = 8) composite_material = list("plasteel" = SHEET_MATERIAL_AMOUNT, "diamond" = SHEET_MATERIAL_AMOUNT) //shrug + supply_conversion_value = 9 /material/durasteel/hull //The 'Hardball' of starship hulls. name = MAT_DURASTEELHULL @@ -676,6 +685,7 @@ var/list/name_to_material sheet_singular_name = "ingot" sheet_plural_name = "ingots" conductivity = 100 + supply_conversion_value = 6 /material/tritium name = "tritium" @@ -704,6 +714,7 @@ var/list/name_to_material stack_origin_tech = list(TECH_MATERIAL = 6, TECH_POWER = 6, TECH_MAGNET = 5) conductivity = 100 is_fusion_fuel = 1 + supply_conversion_value = 6 /material/platinum name = "platinum" @@ -714,6 +725,7 @@ var/list/name_to_material stack_origin_tech = list(TECH_MATERIAL = 2) sheet_singular_name = "ingot" sheet_plural_name = "ingots" + supply_conversion_value = 5 /material/iron name = "iron" @@ -733,6 +745,7 @@ var/list/name_to_material sheet_singular_name = "ingot" sheet_plural_name = "ingots" radiation_resistance = 25 // Lead is Special and so gets to block more radiation than it normally would with just weight, totalling in 48 protection. + supply_conversion_value = 2 // Particle Smasher and other exotic materials. @@ -755,6 +768,7 @@ var/list/name_to_material stack_origin_tech = list(TECH_MATERIAL = 6, TECH_POWER = 5, TECH_BIO = 4) sheet_singular_name = "sheet" sheet_plural_name = "sheets" + supply_conversion_value = 8 /material/morphium name = MAT_MORPHIUM @@ -775,6 +789,7 @@ var/list/name_to_material reflectivity = 0.2 radiation_resistance = 10 stack_origin_tech = list(TECH_MATERIAL = 8, TECH_ILLEGAL = 1, TECH_PHORON = 4, TECH_BLUESPACE = 4, TECH_ARCANE = 1) + supply_conversion_value = 13 /material/morphium/hull name = MAT_MORPHIUMHULL diff --git a/code/modules/materials/materials_vr.dm b/code/modules/materials/materials_vr.dm index a5847853d0..c341a15496 100644 --- a/code/modules/materials/materials_vr.dm +++ b/code/modules/materials/materials_vr.dm @@ -63,6 +63,7 @@ conductivity = 7 stack_origin_tech = list(TECH_MATERIAL = 5) composite_material = list(MAT_TITANIUM = SHEET_MATERIAL_AMOUNT, MAT_PLASTEEL = SHEET_MATERIAL_AMOUNT) + supply_conversion_value = 8 /material/glass/plastaniumglass name = MAT_PLASTITANIUMGLASS diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index e2df0e1cc0..35117374ee 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -239,6 +239,7 @@ max_age = 110 /datum/species/unathi + mob_size = MOB_MEDIUM //To allow normal mob swapping spawn_flags = SPECIES_CAN_JOIN //Species_can_join is the only spawn flag all the races get, so that none of them will be whitelist only if whitelist is enabled. icobase = 'icons/mob/human_races/r_lizard_vr.dmi' deform = 'icons/mob/human_races/r_def_lizard_vr.dmi' diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index ed74c02828..03fd22609b 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -18,6 +18,9 @@ damage -= round(damage*0.8) else damage -= soaked + + var/initial_blocked = blocked + blocked = (100-blocked)/100 switch(damagetype) if(BRUTE) @@ -27,8 +30,8 @@ damage = 0 adjustFireLoss(damage * blocked) if(SEARING) - apply_damage(damage / 3, BURN, def_zone, blocked, soaked, used_weapon, sharp, edge) - apply_damage(damage / 3 * 2, BRUTE, def_zone, blocked, soaked, used_weapon, sharp, edge) + apply_damage(round(damage / 3), BURN, def_zone, initial_blocked, soaked, used_weapon, sharp, edge) + apply_damage(round(damage / 3 * 2), BRUTE, def_zone, initial_blocked, soaked, used_weapon, sharp, edge) if(TOX) adjustToxLoss(damage * blocked) if(OXY) @@ -41,7 +44,7 @@ electrocute_act(damage, used_weapon, 1.0, def_zone) if(BIOACID) if(isSynthetic()) - adjustFireLoss(damage * blocked) + apply_damage(damage, BURN, def_zone, initial_blocked, soaked, used_weapon, sharp, edge) // Handle it as normal burn. else adjustToxLoss(damage * blocked) flash_weak_pain() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm index 9c5bf2df0c..bf8387ffc2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm @@ -54,6 +54,11 @@ vore_capacity = 1 vore_pounce_chance = 20 vore_icons = SA_ICON_LIVING | SA_ICON_REST + vore_stomach_name = "Grut" + vore_stomach_flavor = "You have ended up in the otie's primary stomach. The end of the line for the solidness of the most of its food. It is very hot and humid here, and it doesn't help that the little air left is saturated with pungent fumes of digesting food. The slimy folds of this powerful belly knead and squeeze firmly against your form, the globs and strands of the dark, almost tar-like internal slop within feel rather thick compared to the usual. The muscular walls seem awfully eager to cling and rub against you, while oozing numbingly thick and dense juices against your body." + vore_default_contamination_flavor = "Acrid" + vore_default_contamination_color = "black" + vore_default_item_mode = IM_DIGEST /mob/living/simple_mob/otie/feral //gets the pet2tame feature. starts out hostile tho so get gamblin' name = "mutated feral otie" @@ -223,7 +228,7 @@ if(ishuman(prey)) vore_selected.digest_mode = DM_HOLD if(check_threat(prey) >= 4) - global_announcer.autosay("[src] has detained suspect [target_name(prey)] in [get_area(src)].", "SmartCollar oversight", "Security") + global_announcer.autosay("[src] is detaining suspect [target_name(prey)] in [get_area(src)].", "SmartCollar oversight", "Security") if(istype(prey,/mob/living/simple_mob/animal/passive/mouse)) vore_selected.digest_mode = DM_DIGEST . = ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm b/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm index 65c64bb9f3..b4c656ddc3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm @@ -81,7 +81,7 @@ harm_intent_damage = 10 melee_damage_lower = 10 melee_damage_upper = 20 - maxHealth = 200 + maxHealth = 300 minbodytemp = 0 @@ -103,3 +103,59 @@ /mob/living/simple_mob/animal/wolf/direwolf/MouseDrop_T(mob/living/M, mob/living/user) return + +/mob/living/simple_mob/animal/wolf/direwolf/dog + name = "large dog" + desc = "The biggest and goodest dog around." + tt_desc = "Canis maxdirus familiaris" + + icon_dead = "diredog-dead" + icon_living = "diredog" + icon_state = "diredog" + icon_rest = "diredog_rest" + +/mob/living/simple_mob/animal/wolf/direwolf/rykka + name = "Rykka" + desc = "This big canine looks like a GSD. It has a collar tagged, 'Bitch'" + tt_desc = "Canidae" + + icon_dead = "rykka-dead" + icon_living = "rykka" + icon_state = "rykka" + icon_rest = "rykka_rest" + faction = "underdark" + has_eye_glow = TRUE + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + maxbodytemp = 700 + + vore_bump_chance = 100 + vore_bump_emote = "clamps down on with iron jaws" + vore_default_contamination_color = "purple" + vore_default_contamination_flavor = "Acrid" + vore_digest_chance = 85 + vore_escape_chance = 5 + vore_pounce_chance = 100 + vore_pounce_maxhealth = 100 + vore_stomach_name = "Gut" + vore_stomach_flavor = "A black-and-purple veined gut, pulsing warmly around you. Loud gurgles sound around you as the gut squishes inwards and attempts to crush you - Rykka seems intent on digesting you, like the meat you are." + +/mob/living/simple_mob/animal/wolf/direwolf/andrews + name = "andrewsarchus" + desc = "That's one massive mean-looking piece of long extinct megafauna." + tt_desc = "Andrewsarchus mongoliensis" + + icon_dead = "andrews-dead" + icon_living = "andrews" + icon_state = "andrews" + icon_rest = "andrews_rest" + + mount_offset_y = 17 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index caa9893420..8660281f93 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -437,56 +437,26 @@ if(is_admin && stat == DEAD) is_admin = 0 - var/list/names = list() - var/list/namecounts = list() - var/list/creatures = list() + var/list/targets = list() - for(var/obj/O in world) //EWWWWWWWWWWWWWWWWWWWWWWWW ~needs to be optimised - if(!O.loc) - continue - if(istype(O, /obj/item/weapon/disk/nuclear)) - var/name = "Nuclear Disk" - if (names.Find(name)) - namecounts[name]++ - name = "[name] ([namecounts[name]])" - else - names.Add(name) - namecounts[name] = 1 - creatures[name] = O - - if(istype(O, /obj/singularity)) - var/name = "Singularity" - if (names.Find(name)) - namecounts[name]++ - name = "[name] ([namecounts[name]])" - else - names.Add(name) - namecounts[name] = 1 - creatures[name] = O - - for(var/mob/M in sortAtom(mob_list)) - var/name = M.name - if (names.Find(name)) - namecounts[name]++ - name = "[name] ([namecounts[name]])" - else - names.Add(name) - namecounts[name] = 1 - - creatures[name] = M + targets += observe_list_format(nuke_disks) + targets += observe_list_format(all_singularities) + targets += getmobs() + targets += observe_list_format(sortAtom(mechas_list)) + targets += observe_list_format(SSshuttles.ships) client.perspective = EYE_PERSPECTIVE var/eye_name = null var/ok = "[is_admin ? "Admin Observe" : "Observe"]" - eye_name = input("Please, select a player!", ok, null, null) as null|anything in creatures + eye_name = input("Please, select a player!", ok, null, null) as null|anything in targets if (!eye_name) return - var/mob/mob_eye = creatures[eye_name] + var/mob/mob_eye = targets[eye_name] if(client && mob_eye) client.eye = mob_eye diff --git a/code/modules/overmap/overmap_planet.dm b/code/modules/overmap/overmap_planet.dm new file mode 100644 index 0000000000..28a8bf10d1 --- /dev/null +++ b/code/modules/overmap/overmap_planet.dm @@ -0,0 +1,98 @@ +/obj/effect/overmap/visitable/planet + name = "planet" + icon_state = "globe" + in_space = 0 + + var/datum/gas_mixture/atmosphere + + var/atmosphere_color = "FFFFFF" + var/mountain_color = "#735555" + var/surface_color = "#304A35" + var/water_color = "#436499" + var/has_rings = FALSE // set to true to get rings + var/icecaps = null // Iconstate in icons/skybox/planet.dmi for the planet's icecaps + var/ice_color = "E6F2F6" + var/ring_color + var/skybox_offset_x = 0 + var/skybox_offset_y = 0 + +/obj/effect/overmap/visitable/planet/Initialize() + . = ..() + +/obj/effect/overmap/visitable/planet/get_skybox_representation() + var/image/skybox_image = image('icons/skybox/planet.dmi', "") + + skybox_image.overlays += get_base_image() + +// for(var/datum/exoplanet_theme/theme in themes) +// skybox_image.overlays += theme.get_planet_image_extra() + + if(mountain_color) + var/image/mountains = image('icons/skybox/planet.dmi', "mountains") + mountains.color = mountain_color + mountains.appearance_flags = PIXEL_SCALE + skybox_image.overlays += mountains + + if(water_color) + var/image/water = image('icons/skybox/planet.dmi', "water") + water.color = water_color + water.appearance_flags = PIXEL_SCALE +// water.transform = water.transform.Turn(rand(0,360)) + skybox_image.overlays += water + + if(icecaps) + var/image/ice = image('icons/skybox/planet.dmi', icecaps) + ice.color = ice_color + ice.appearance_flags = PIXEL_SCALE + skybox_image.overlays += ice + + if(atmosphere && atmosphere.return_pressure() > SOUND_MINIMUM_PRESSURE) + + var/atmo_color = get_atmosphere_color() + if(!atmo_color) + atmo_color = COLOR_WHITE + + var/image/clouds = image('icons/skybox/planet.dmi', "weak_clouds") + + if(water_color) + clouds.overlays += image('icons/skybox/planet.dmi', "clouds") + + clouds.color = atmo_color + skybox_image.overlays += clouds + + var/image/atmo = image('icons/skybox/planet.dmi', "atmoring") + skybox_image.underlays += atmo + + var/image/shadow = image('icons/skybox/planet.dmi', "shadow") + shadow.blend_mode = BLEND_MULTIPLY + skybox_image.overlays += shadow + + var/image/light = image('icons/skybox/planet.dmi', "lightrim") + skybox_image.overlays += light + + if(has_rings) + var/image/rings = image('icons/skybox/planet_rings.dmi') + rings.icon_state = pick("sparse", "dense") + if(!ring_color) + rings.color = pick("#f0fcff", "#dcc4ad", "#d1dcad", "#adb8dc") + else + rings.color = ring_color + rings.pixel_x = -128 + rings.pixel_y = -128 + skybox_image.overlays += rings + + skybox_image.pixel_x = rand(0,64) + skybox_offset_x + skybox_image.pixel_y = rand(128,256) + skybox_offset_y + skybox_image.appearance_flags = RESET_COLOR + return skybox_image + +/obj/effect/overmap/visitable/planet/proc/get_base_image() + var/image/base = image('icons/skybox/planet.dmi', "base") + base.color = get_surface_color() + return base + +/obj/effect/overmap/visitable/planet/proc/get_surface_color() + return surface_color + +/obj/effect/overmap/visitable/planet/proc/get_atmosphere_color() + return atmosphere_color diff --git a/code/modules/overmap/sectors.dm b/code/modules/overmap/sectors.dm index 3282fadc43..5ec8358037 100644 --- a/code/modules/overmap/sectors.dm +++ b/code/modules/overmap/sectors.dm @@ -31,7 +31,7 @@ if(. == INITIALIZE_HINT_QDEL) return - find_z_levels() // This populates map_z and assigns z levels to the ship. + find_z_levels() // This populates map_z and assigns z levels to the ship. register_z_levels() // This makes external calls to update global z level information. if(!global.using_map.overmap_z) @@ -59,7 +59,8 @@ . += A /obj/effect/overmap/visitable/proc/find_z_levels() - map_z = GetConnectedZlevels(z) + if(!LAZYLEN(map_z)) // If map_z is already populated use it as-is, otherwise start with connected z-levels. + map_z = GetConnectedZlevels(z) if(LAZYLEN(extra_z_levels)) map_z |= extra_z_levels diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 4578db9b14..b2a23126c0 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -119,6 +119,7 @@ if(!loc) return var/obj/singularity/energy_ball/EB = new(loc, 0, TRUE) + all_singularities -= EB //why are these miniballs even singularities in the first place, they don't do anything EB.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7) var/icon/I = icon(icon,icon_state,dir) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8a03ec8347..b0894753b8 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -134,6 +134,8 @@ // This is distinct from the hitscan's "impact_type" var. var/impact_effect_type = null + var/list/impacted_mobs + /obj/item/projectile/proc/Range() range-- if(range <= 0 && loc) @@ -439,6 +441,12 @@ setAngle(Get_Angle(source, target)) /obj/item/projectile/Destroy() + + if(impacted_mobs) + if(LAZYLEN(impacted_mobs)) + impacted_mobs.Cut() + impacted_mobs = null + if(hitscan) finalize_hitscan_and_generate_tracers() STOP_PROCESSING(SSprojectiles, src) @@ -634,6 +642,12 @@ if(!istype(target_mob)) return + if(!LAZYLEN(impacted_mobs)) + impacted_mobs = list() + + if(target_mob in impacted_mobs) + return + //roll to-hit miss_modifier = max(15*(distance-2) - accuracy + miss_modifier + target_mob.get_evasion(), 0) var/hit_zone = get_zone_with_miss_chance(def_zone, target_mob, miss_modifier, ranged_attack=(distance > 1 || original != target_mob)) //if the projectile hits a target we weren't originally aiming at then retain the chance to miss @@ -646,6 +660,9 @@ if(!istype(target_mob)) return FALSE // Mob deleted itself or something. + // Safe to add the target to the list that is soon to be poofed. No double jeopardy, pixel projectiles. + impacted_mobs |= target_mob + if(result == PROJECTILE_FORCE_MISS) if(!silenced) target_mob.visible_message("\The [src] misses \the [target_mob] narrowly!") diff --git a/code/modules/radiation/radiation.dm b/code/modules/radiation/radiation.dm index 51f67c8d88..c107390094 100644 --- a/code/modules/radiation/radiation.dm +++ b/code/modules/radiation/radiation.dm @@ -48,6 +48,13 @@ cached_rad_resistance = (density ? (material.weight + material.radiation_resistance) / config.radiation_material_resistance_divisor : 0) return +/turf/simulated/mineral/calc_rad_resistance() + if(!density) + return ..() + SSradiation.resistance_cache[src] = (length(contents) + 1) + cached_rad_resistance = 60 //Three times that of a steel wall. Rock is less dense than steel, but this is assuming that a normal wall isn't just solid steel all the way through like rock turfs are. + return + /obj var/rad_resistance = 0 // Allow overriding rad resistance @@ -60,4 +67,4 @@ src.apply_effect(severity, IRRADIATE, src.getarmor(null, "rad")) for(var/atom/I in src) I.rad_act(severity) - return \ No newline at end of file + return diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index 565f91d2ff..a46f716a98 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -334,7 +334,6 @@ /datum/reagent/tricorlidaze/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) M.adjustToxLoss(3 * removed) - affect_blood(M, alien, removed * 0.4) /datum/reagent/tricorlidaze/touch_obj(var/obj/O) if(istype(O, /obj/item/stack/medical/bruise_pack) && round(volume) >= 5) diff --git a/code/modules/reagents/Chemistry-Recipes_vr.dm b/code/modules/reagents/Chemistry-Recipes_vr.dm index 697dae4c63..c407426049 100644 --- a/code/modules/reagents/Chemistry-Recipes_vr.dm +++ b/code/modules/reagents/Chemistry-Recipes_vr.dm @@ -161,7 +161,7 @@ name = "Space Bulldog" id = "bulldog" result = "bulldog" - required_reagents = list("vodka" = 1, "cola" =1, "cream" =1, "kahlua" =1) + required_reagents = list("whiterussian" = 4, "cola" =1) result_amount = 4 /datum/chemical_reaction/drinks/sbagliato diff --git a/code/modules/tgs/v5/api_vgs.dm b/code/modules/tgs/v5/api_vgs.dm index aa43a1655f..fd94e964d1 100644 --- a/code/modules/tgs/v5/api_vgs.dm +++ b/code/modules/tgs/v5/api_vgs.dm @@ -36,6 +36,20 @@ GLOBAL_DATUM(vgs, /datum/tgs_api) if(result != TGS_UNIMPLEMENTED) return result +/world/TgsReboot() + var/datum/tgs_api/api = GLOB.vgs + if(api) + api.OnReboot() + else + return ..() + +/world/TgsInitializationComplete() + var/datum/tgs_api/api = GLOB.vgs + if(api) + api.OnInitializationComplete() + else + return ..() + /world/proc/VgsAddMemberRole(chat_user_id) var/datum/tgs_api/v5/vgs1/api = GLOB.vgs if(api) diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index 8124182b4a..32128c2708 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -713,13 +713,6 @@ desc = "" icon_state = "snag-backplate" -/datum/sprite_accessory/wing/nevrean - name = "nevrean wings/fantail" - desc = "" - icon_state = "nevrean_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - /datum/sprite_accessory/wing/sepulchre_c_yw name = "demon wings (colorable)" desc = "" @@ -935,6 +928,30 @@ do_colouration = 1 color_blend_mode = ICON_MULTIPLY +/datum/sprite_accessory/tail/nevreandc + name = "nevrean tail, dual-color" + desc = "" + icon_state = "nevreantail_dc" + extra_overlay = "nevreantail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc + name = "nevrean wagtail, dual-color" + desc = "" + icon_state = "wagtail" + extra_overlay = "wagtail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc_alt + name = "nevrean wagtail, marked, dual-color" + desc = "" + icon_state = "wagtail2_dc" + extra_overlay = "wagtail2_dc_mark" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/tail/crossfox name = "cross fox" desc = "" @@ -1375,7 +1392,7 @@ do_colouration = 1 /datum/sprite_accessory/tail/special/monkeyhc - name = "monkey tail, colorable, colorable" + name = "monkey tail, colorable" desc = "" icon_state = "chimptail_hc_s" do_colouration = 1 diff --git a/html/changelogs/greenjoe - wrist PDAs.yml b/html/changelogs/greenjoe - wrist PDAs.yml new file mode 100644 index 0000000000..006a6bc659 --- /dev/null +++ b/html/changelogs/greenjoe - wrist PDAs.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Greenjoe + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added a wrist-bound PDA, selectable from the PDA selection menu in char setup. it can go in the glove slot along with the ID and belt slots, and shows on your character's wrist no matter which of those 3 slots you put it in!" \ No newline at end of file diff --git a/icons/effects/species_tails_vr.dmi b/icons/effects/species_tails_vr.dmi index 4d7c0cee89..20e9f210bd 100644 Binary files a/icons/effects/species_tails_vr.dmi and b/icons/effects/species_tails_vr.dmi differ diff --git a/icons/mob/head_vr.dmi b/icons/mob/head_vr.dmi index 78db695e45..da75092bd0 100644 Binary files a/icons/mob/head_vr.dmi and b/icons/mob/head_vr.dmi differ diff --git a/icons/mob/pda_wrist.dmi b/icons/mob/pda_wrist.dmi new file mode 100644 index 0000000000..fda5d9ad19 Binary files /dev/null and b/icons/mob/pda_wrist.dmi differ diff --git a/icons/mob/spacesuit_vr.dmi b/icons/mob/spacesuit_vr.dmi index e92e4b25f9..4196b2055e 100644 Binary files a/icons/mob/spacesuit_vr.dmi and b/icons/mob/spacesuit_vr.dmi differ diff --git a/icons/mob/species/akula/suit_vr.dmi b/icons/mob/species/akula/suit_vr.dmi index a115004c1b..3abd100eee 100644 Binary files a/icons/mob/species/akula/suit_vr.dmi and b/icons/mob/species/akula/suit_vr.dmi differ diff --git a/icons/mob/species/sergal/suit_vr.dmi b/icons/mob/species/sergal/suit_vr.dmi index 005914f9f6..2cfc989121 100644 Binary files a/icons/mob/species/sergal/suit_vr.dmi and b/icons/mob/species/sergal/suit_vr.dmi differ diff --git a/icons/mob/species/seromi/pda_wrist.dmi b/icons/mob/species/seromi/pda_wrist.dmi new file mode 100644 index 0000000000..e064cf3be8 Binary files /dev/null and b/icons/mob/species/seromi/pda_wrist.dmi differ diff --git a/icons/mob/species/skrell/helmet_vr.dmi b/icons/mob/species/skrell/helmet_vr.dmi index b9a619f31a..b9806b4a58 100644 Binary files a/icons/mob/species/skrell/helmet_vr.dmi and b/icons/mob/species/skrell/helmet_vr.dmi differ diff --git a/icons/mob/species/skrell/suit_vr.dmi b/icons/mob/species/skrell/suit_vr.dmi index 7ab10e717d..f6ca26a428 100644 Binary files a/icons/mob/species/skrell/suit_vr.dmi and b/icons/mob/species/skrell/suit_vr.dmi differ diff --git a/icons/mob/species/tajaran/helmet_vr.dmi b/icons/mob/species/tajaran/helmet_vr.dmi index fc18570e04..c2092f4d20 100644 Binary files a/icons/mob/species/tajaran/helmet_vr.dmi and b/icons/mob/species/tajaran/helmet_vr.dmi differ diff --git a/icons/mob/species/tajaran/suit_vr.dmi b/icons/mob/species/tajaran/suit_vr.dmi index 41a8e5cd26..738585d622 100644 Binary files a/icons/mob/species/tajaran/suit_vr.dmi and b/icons/mob/species/tajaran/suit_vr.dmi differ diff --git a/icons/mob/species/unathi/helmet_vr.dmi b/icons/mob/species/unathi/helmet_vr.dmi index 9891ee7432..1c26c6271c 100644 Binary files a/icons/mob/species/unathi/helmet_vr.dmi and b/icons/mob/species/unathi/helmet_vr.dmi differ diff --git a/icons/mob/species/unathi/suit_vr.dmi b/icons/mob/species/unathi/suit_vr.dmi index b1ebcbbc08..9cc3bc89d5 100644 Binary files a/icons/mob/species/unathi/suit_vr.dmi and b/icons/mob/species/unathi/suit_vr.dmi differ diff --git a/icons/mob/species/vulpkanin/helmet.dmi b/icons/mob/species/vulpkanin/helmet.dmi index 052b18a9fd..1d85465f77 100644 Binary files a/icons/mob/species/vulpkanin/helmet.dmi and b/icons/mob/species/vulpkanin/helmet.dmi differ diff --git a/icons/mob/species/vulpkanin/helmet_vr.dmi b/icons/mob/species/vulpkanin/helmet_vr.dmi index 2a7ce4375d..d0c2f42d32 100644 Binary files a/icons/mob/species/vulpkanin/helmet_vr.dmi and b/icons/mob/species/vulpkanin/helmet_vr.dmi differ diff --git a/icons/mob/species/vulpkanin/suit.dmi b/icons/mob/species/vulpkanin/suit.dmi index c70734d3ae..6e54a4662b 100644 Binary files a/icons/mob/species/vulpkanin/suit.dmi and b/icons/mob/species/vulpkanin/suit.dmi differ diff --git a/icons/mob/species/vulpkanin/suit_vr.dmi b/icons/mob/species/vulpkanin/suit_vr.dmi index 670ce464d3..81229b4f40 100644 Binary files a/icons/mob/species/vulpkanin/suit_vr.dmi and b/icons/mob/species/vulpkanin/suit_vr.dmi differ diff --git a/icons/mob/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi index 9ba6850f30..976b6c5a58 100644 Binary files a/icons/mob/vore/tails_vr.dmi and b/icons/mob/vore/tails_vr.dmi differ diff --git a/icons/mob/vore/wings_vr.dmi b/icons/mob/vore/wings_vr.dmi index eac706d66b..41b6dcf607 100644 Binary files a/icons/mob/vore/wings_vr.dmi and b/icons/mob/vore/wings_vr.dmi differ diff --git a/icons/mob/vore64x32.dmi b/icons/mob/vore64x32.dmi index 492c0ae6f4..2dde6000ff 100644 Binary files a/icons/mob/vore64x32.dmi and b/icons/mob/vore64x32.dmi differ diff --git a/icons/obj/clothing/hats_vr.dmi b/icons/obj/clothing/hats_vr.dmi index 0c235adc55..8a1d7143c6 100644 Binary files a/icons/obj/clothing/hats_vr.dmi and b/icons/obj/clothing/hats_vr.dmi differ diff --git a/icons/obj/clothing/species/skrell/spacesuits_vr.dmi b/icons/obj/clothing/species/skrell/spacesuits_vr.dmi deleted file mode 100644 index 6510610634..0000000000 Binary files a/icons/obj/clothing/species/skrell/spacesuits_vr.dmi and /dev/null differ diff --git a/icons/obj/clothing/species/tajaran/spacesuits_vr.dmi b/icons/obj/clothing/species/tajaran/spacesuits_vr.dmi deleted file mode 100644 index f505178f3d..0000000000 Binary files a/icons/obj/clothing/species/tajaran/spacesuits_vr.dmi and /dev/null differ diff --git a/icons/obj/clothing/species/unathi/hats.dmi b/icons/obj/clothing/species/unathi/hats.dmi index 221503aa2b..28c8700a39 100644 Binary files a/icons/obj/clothing/species/unathi/hats.dmi and b/icons/obj/clothing/species/unathi/hats.dmi differ diff --git a/icons/obj/clothing/species/unathi/helmets_vr.dmi b/icons/obj/clothing/species/unathi/helmets_vr.dmi deleted file mode 100644 index bf4bce4d4b..0000000000 Binary files a/icons/obj/clothing/species/unathi/helmets_vr.dmi and /dev/null differ diff --git a/icons/obj/clothing/species/unathi/spacesuits_vr.dmi b/icons/obj/clothing/species/unathi/spacesuits_vr.dmi deleted file mode 100644 index cbe2998f16..0000000000 Binary files a/icons/obj/clothing/species/unathi/spacesuits_vr.dmi and /dev/null differ diff --git a/icons/obj/clothing/species/vulpkanin/hats.dmi b/icons/obj/clothing/species/vulpkanin/hats.dmi index 2f94e6837a..ada96f84f5 100644 Binary files a/icons/obj/clothing/species/vulpkanin/hats.dmi and b/icons/obj/clothing/species/vulpkanin/hats.dmi differ diff --git a/icons/obj/clothing/species/vulpkanin/helmets_vr.dmi b/icons/obj/clothing/species/vulpkanin/helmets_vr.dmi deleted file mode 100644 index 9105570c1e..0000000000 Binary files a/icons/obj/clothing/species/vulpkanin/helmets_vr.dmi and /dev/null differ diff --git a/icons/obj/clothing/species/vulpkanin/spacesuits_vr.dmi b/icons/obj/clothing/species/vulpkanin/spacesuits_vr.dmi deleted file mode 100644 index 5f83544da6..0000000000 Binary files a/icons/obj/clothing/species/vulpkanin/spacesuits_vr.dmi and /dev/null differ diff --git a/icons/obj/clothing/species/vulpkanin/suits.dmi b/icons/obj/clothing/species/vulpkanin/suits.dmi index 75edd6202d..b87b02edfe 100644 Binary files a/icons/obj/clothing/species/vulpkanin/suits.dmi and b/icons/obj/clothing/species/vulpkanin/suits.dmi differ diff --git a/icons/obj/clothing/suits_vr.dmi b/icons/obj/clothing/suits_vr.dmi index 2d90e3db04..6c685554d8 100644 Binary files a/icons/obj/clothing/suits_vr.dmi and b/icons/obj/clothing/suits_vr.dmi differ diff --git a/icons/obj/pda_wrist.dmi b/icons/obj/pda_wrist.dmi new file mode 100644 index 0000000000..1cc3dda1a6 Binary files /dev/null and b/icons/obj/pda_wrist.dmi differ diff --git a/icons/skybox/planet.dmi b/icons/skybox/planet.dmi index 45497b6e5f..ac28371334 100644 Binary files a/icons/skybox/planet.dmi and b/icons/skybox/planet.dmi differ diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi index 45123b5352..7fe98dcec5 100644 Binary files a/icons/vore/custom_clothes_vr.dmi and b/icons/vore/custom_clothes_vr.dmi differ diff --git a/maps/southern_cross/overmap/sectors.dm b/maps/southern_cross/overmap/sectors.dm new file mode 100644 index 0000000000..5d569cb05d --- /dev/null +++ b/maps/southern_cross/overmap/sectors.dm @@ -0,0 +1,42 @@ +// Overmap object for Sif, hanging in the void of space +/obj/effect/overmap/visitable/planet/Sif + name = "Sif" + map_z = list(Z_LEVEL_SURFACE, Z_LEVEL_SURFACE_MINE, Z_LEVEL_SURFACE_WILD) + in_space = 0 + start_x = 10 + start_y = 10 + skybox_offset_x = 128 + skybox_offset_y = 128 + surface_color = "#2D545B" + mountain_color = "#735555" + ice_color = "FFFFFF" + icecaps = "icecaps" + +/obj/effect/overmap/visitable/planet/Sif/Initialize() + atmosphere = new(CELL_VOLUME) + atmosphere.adjust_gas_temp("oxygen", MOLES_O2STANDARD, 273) + atmosphere.adjust_gas_temp("nitrogen", MOLES_N2STANDARD, 273) + + . = ..() + +/obj/effect/overmap/visitable/planet/Sif/Initialize() + . = ..() + docking_codes = null + +/obj/effect/overmap/visitable/planet/Sif/get_skybox_representation() + . = ..() + (.).pixel_x = skybox_offset_x + (.).pixel_y = skybox_offset_y + +/obj/effect/overmap/visitable/Southern_Cross + name = "Southern Cross" + icon_state = "object" + base = 1 + in_space = 1 + start_x = 10 + start_y = 10 + map_z = list(Z_LEVEL_STATION_ONE, Z_LEVEL_STATION_TWO, Z_LEVEL_STATION_THREE) + +/obj/effect/overmap/visitable/planet/Sif/Initialize() + . = ..() + docking_codes = null \ No newline at end of file diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm index 9b94f82256..b276f58b45 100644 --- a/maps/southern_cross/southern_cross-1.dmm +++ b/maps/southern_cross/southern_cross-1.dmm @@ -10727,6 +10727,7 @@ "dYo" = (/obj/machinery/optable{name = "Xenobiology Operating Table"},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/rnd/xenobiology) "dYp" = (/obj/item/weapon/extinguisher,/obj/structure/catwalk,/obj/structure/door_assembly/door_assembly_ext,/turf/simulated/floor/plating,/area/maintenance/firstdeck/centralstarboard) "dYq" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/maintenance/firstdeck/centralstarboard) +"dYr" = (/obj/effect/overmap/visitable/Southern_Cross,/turf/space,/area/space) "dYs" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/purple/border{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research/firstdeck/hallway) "dYt" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/research/firstdeck/hallway) "dYu" = (/obj/structure/disposalpipe/segment,/obj/effect/wingrille_spawn/reinforced,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/window/reinforced/full,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "xenobio6station"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/rnd/xenobiology) @@ -11020,7 +11021,7 @@ "edW" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/foyer) "edX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/red{dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer) "edY" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{dir = 5; icon_state = "intact"},/turf/simulated/floor/tiled,/area/engineering/foyer) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11276,7 +11277,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +dYraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} (1,1,2) = {" @@ -11794,3 +11795,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa dUOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/maps/southern_cross/southern_cross-3.dmm b/maps/southern_cross/southern_cross-3.dmm index 07cc8f53de..433197e556 100644 --- a/maps/southern_cross/southern_cross-3.dmm +++ b/maps/southern_cross/southern_cross-3.dmm @@ -1566,7 +1566,8 @@ "Ef" = (/obj/effect/shuttle_landmark{landmark_tag = "response_ship_planet"; name = "Sif Surface East"},/turf/simulated/floor/outdoors/dirt/sif/planetuse,/area/shuttle/response_ship/planet) "Eg" = (/obj/effect/shuttle_landmark{landmark_tag = "syndie_planet"; name = "Sif Surface West"},/turf/simulated/floor/outdoors/dirt/sif/planetuse,/area/syndicate_station/planet) "Eh" = (/obj/effect/shuttle_landmark{landmark_tag = "skipjack_planet"; name = "Sif Surface South"},/turf/simulated/floor/outdoors/dirt/sif/planetuse,/area/skipjack_station/planet) - +"Ei" = (/obj/effect/overmap/visitable/planet/Sif,/turf/simulated/mineral/sif,/area/surface/outside/plains/mountains) + (1,1,1) = {" aaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababacadadadabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaeaeaeababababababababab aaafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafagafafafafafafafafafafafafafafafafahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahaiajajajahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahafafafafafafafafafafafafafafagafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafakakakafafafafafafafafaa @@ -1821,6 +1822,7 @@ aaafafafafafafafafafafafafafafDADADADADADADADADADADADADADADADADADADADADADADADADA aaafafafafafafafafafafafafafafafafafafafDADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADEDADADADADADADADADADADADADADADADADADADADADADADADADADAvMDNDMDODMDPvMDADADADADADADADADADADADADADADADADADADADADADADADADADADADADADJDJDJDJDJDJDKDKDJDJDJDJDJDJDJDJDJvpvpvpvpvpvpvpvpvpvpvpvpvpvpvpvpvpvpvpDNDMDODMDPvMvpvpvpvpvpvpvpvpvpvpvpvpvpvpafafafafafafafvpvpvpDkvpvpvpvpvpvpvpvpvpvpvpvpvpvpvpvpvMvMvMvMvMvMvMvMvMDLDLDLDLDLDLDLvMvMvMvMvMvMvMafafafafafafafafafafafafafafafafafafafafafaa aaafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafDADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADEDADADADADADAafafafafafDQDADADADQDADADADQDADADADQDADADADRDSDTDSDRDADADADQDADADADQDADADADQDADADADQDADADADQDADADADQDADADADQDADADADQDADJDJDJDKDKDJDJDJDADQDADAvpDQvpvpvpDQvpvpvpDQvpvpvpDQvpvpvpDQvpvpvpDRDSDUDSDRvpvpvpDQvpvpvpDQvpvpvpDQafafafafafafafafafafafafafagafafafvpvpvpvpvpvpvpafafafafafafafafvMvMvMvMvMvMvMvMvMvMvMvMvMvMvMafafafafafafafafafafafafafafafafafafafafafafafafafafafaa aaafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafDADADADADADADADADADADADAafafafafafafafafafafafafafafDADADADkDADADAafafafafafDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDMDMDMDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDJDJDKDKDJDJDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDMDMDMDQDQDQDQDQDQDQDQDQDQDQDQDQDQafafafafafafafafafafafafagafafafafafafafafafafafafafafafafafafafafafafafafafvMvMvMvMafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaa -aaafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafagafafafafafafafafDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDVDMDWDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDJDJDKDKDJDJDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDVDMDWDQDQDQDQDQDQDQDQDQDQDQDQDQDQafafafafafafafafafafafafagafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaa +aaEiafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafagafafafafafafafafDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDVDMDWDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDJDJDKDKDJDJDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDQDVDMDWDQDQDQDQDQDQDQDQDQDQDQDQDQDQafafafafafafafafafafafafagafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaa aaaaaaaaaaaaaaaaabababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDQDYDYDYDQDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDQDZDZDZDZDZDZDQDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDQDYDYDYDQDXDXDXDXDXDXDXDXDXDXDXDXDXababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababab "} + diff --git a/maps/southern_cross/southern_cross.dm b/maps/southern_cross/southern_cross.dm index 741d64d58e..c34b4b74d6 100644 --- a/maps/southern_cross/southern_cross.dm +++ b/maps/southern_cross/southern_cross.dm @@ -34,6 +34,7 @@ #include "structures/closets/research.dm" #include "structures/closets/security.dm" #include "turfs/outdoors.dm" + #include "overmap/sectors.dm" #include "southern_cross-1.dmm" #include "southern_cross-2.dmm" diff --git a/maps/southern_cross/southern_cross_defines.dm b/maps/southern_cross/southern_cross_defines.dm index 9a9bda5e9b..bf916f2319 100644 --- a/maps/southern_cross/southern_cross_defines.dm +++ b/maps/southern_cross/southern_cross_defines.dm @@ -34,6 +34,7 @@ company_name = "NanoTrasen" company_short = "NT" starsys_name = "Vir" + use_overmap = TRUE shuttle_docked_message = "The scheduled shuttle to the %dock_name% has docked with the station at docks one and two. It will depart in approximately %ETD%." shuttle_leaving_dock = "The Crew Transfer Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock_name%." diff --git a/maps/tether/submaps/admin_use/ert.dmm b/maps/tether/submaps/admin_use/ert.dmm index 5caad90a8b..b453af2930 100644 --- a/maps/tether/submaps/admin_use/ert.dmm +++ b/maps/tether/submaps/admin_use/ert.dmm @@ -1505,6 +1505,8 @@ pixel_x = 30; req_access = list(160) }, +/obj/structure/table/rack, +/obj/item/clothing/suit/space/void/responseteam/command, /turf/simulated/shuttle/floor/black, /area/shuttle/specops/centcom) "dc" = ( @@ -2077,6 +2079,60 @@ }, /turf/unsimulated/floor/steel, /area/centcom/specops) +"mI" = ( +/obj/structure/table/rack/steel, +/obj/item/clothing/shoes/magboots, +/obj/item/clothing/shoes/magboots, +/obj/item/clothing/shoes/magboots, +/obj/item/clothing/shoes/magboots, +/obj/item/clothing/shoes/magboots, +/obj/item/clothing/shoes/magboots, +/obj/item/clothing/shoes/magboots, +/obj/item/clothing/shoes/magboots, +/turf/simulated/shuttle/floor/black, +/area/shuttle/specops/centcom) +"pn" = ( +/obj/structure/closet/walllocker/emerglocker{ + pixel_y = 32 + }, +/obj/structure/table/rack/steel, +/obj/item/clothing/suit/space/void/responseteam/engineer, +/obj/item/clothing/suit/space/void/responseteam/engineer, +/obj/item/clothing/suit/space/void/responseteam/engineer, +/obj/item/clothing/suit/space/void/responseteam/engineer, +/turf/simulated/shuttle/floor/black, +/area/shuttle/specops/centcom) +"rB" = ( +/obj/structure/table/rack/steel, +/obj/item/device/suit_cooling_unit, +/obj/item/device/suit_cooling_unit, +/obj/item/device/suit_cooling_unit, +/obj/item/device/suit_cooling_unit, +/obj/item/device/suit_cooling_unit, +/obj/item/device/suit_cooling_unit, +/obj/item/device/suit_cooling_unit, +/obj/item/device/suit_cooling_unit, +/turf/simulated/shuttle/floor/black, +/area/shuttle/specops/centcom) +"HG" = ( +/obj/structure/closet/walllocker/emerglocker{ + pixel_y = -32 + }, +/obj/structure/table/rack/steel, +/obj/item/clothing/suit/space/void/responseteam/medical, +/obj/item/clothing/suit/space/void/responseteam/medical, +/obj/item/clothing/suit/space/void/responseteam/medical, +/obj/item/clothing/suit/space/void/responseteam/medical, +/turf/simulated/shuttle/floor/black, +/area/shuttle/specops/centcom) +"TT" = ( +/obj/structure/table/rack/steel, +/obj/item/clothing/suit/space/void/responseteam/security, +/obj/item/clothing/suit/space/void/responseteam/security, +/obj/item/clothing/suit/space/void/responseteam/security, +/obj/item/clothing/suit/space/void/responseteam/security, +/turf/simulated/shuttle/floor/black, +/area/shuttle/specops/centcom) (1,1,1) = {" aa @@ -2930,12 +2986,12 @@ aJ aV bi ap -aH +TT bd cb cs bd -aH +rB ap db du @@ -2973,7 +3029,7 @@ bd cc ct bd -aH +mI am ap ap @@ -3347,14 +3403,14 @@ am aN aH aH -bh +HG am bd bd bd bd am -cX +pn aH aH dN diff --git a/maps/tether/submaps/om_ships/shelter_6.dmm b/maps/tether/submaps/om_ships/shelter_6.dmm index e80de136a1..17614e5573 100644 --- a/maps/tether/submaps/om_ships/shelter_6.dmm +++ b/maps/tether/submaps/om_ships/shelter_6.dmm @@ -144,14 +144,14 @@ /obj/item/weapon/storage/box/metalfoam, /obj/item/weapon/storage/box/metalfoam, /obj/item/weapon/storage/box/metalfoam, -/obj/item/clothing/suit/space/void/merc/prototype, -/obj/item/clothing/suit/space/void/merc/prototype, -/obj/item/clothing/suit/space/void/merc/prototype, -/obj/item/clothing/suit/space/void/merc/prototype, -/obj/item/clothing/head/helmet/space/void/merc/prototype, -/obj/item/clothing/head/helmet/space/void/merc/prototype, -/obj/item/clothing/head/helmet/space/void/merc/prototype, -/obj/item/clothing/head/helmet/space/void/merc/prototype, +/obj/item/clothing/suit/space/void/security/prototype, +/obj/item/clothing/suit/space/void/security/prototype, +/obj/item/clothing/suit/space/void/security/prototype, +/obj/item/clothing/suit/space/void/security/prototype, +/obj/item/clothing/head/helmet/space/void/security/prototype, +/obj/item/clothing/head/helmet/space/void/security/prototype, +/obj/item/clothing/head/helmet/space/void/security/prototype, +/obj/item/clothing/head/helmet/space/void/security/prototype, /obj/item/clothing/shoes/magboots/adv, /obj/item/clothing/shoes/magboots/adv, /obj/item/clothing/shoes/magboots/adv, diff --git a/maps/tether/submaps/space/guttersite.dmm b/maps/tether/submaps/space/guttersite.dmm index 698861bc6b..5caf17bfde 100644 --- a/maps/tether/submaps/space/guttersite.dmm +++ b/maps/tether/submaps/space/guttersite.dmm @@ -3253,6 +3253,10 @@ }, /turf/simulated/floor/tiled/eris/dark/gray_perforated, /area/tether_away/guttersite/security) +"hj" = ( +/mob/living/simple_mob/mobs_monsters/clowns/big/cluwne, +/turf/simulated/mineral/floor/vacuum, +/area/tether_away/guttersite/unexplored) "hk" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4; @@ -4063,6 +4067,10 @@ /obj/item/trash/cheesie, /turf/simulated/mineral/floor/vacuum, /area/tether_away/guttersite/unexplored) +"jh" = ( +/mob/living/simple_mob/mobs_monsters/clowns/big/sentinel, +/turf/simulated/mineral/floor/vacuum, +/area/tether_away/guttersite/unexplored) "ji" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/simple/visible/red{ @@ -5471,7 +5479,7 @@ /area/tether_away/guttersite/unexplored) "mV" = ( /obj/item/device/radio/headset/nanotrasen/alt{ - desc = "The headset of am Eltorro employee."; + desc = "The headset of an Eltorro employee."; name = "Weird Headset" }, /turf/simulated/floor/carpet/gaycarpet, @@ -5616,6 +5624,10 @@ }, /turf/simulated/floor/tiled/eris/steel/bar_light, /area/tether_away/guttersite/commons) +"nz" = ( +/mob/living/simple_mob/mobs_monsters/clowns/big/tunnelclown, +/turf/simulated/mineral/floor/vacuum, +/area/tether_away/guttersite/unexplored) "Ob" = ( /obj/structure/cable/cyan{ d1 = 1; @@ -10531,7 +10543,7 @@ ag hd iW ad -ad +jh ad ad aL @@ -10814,7 +10826,7 @@ aB ag hd jk -ad +hj aA ad ad @@ -11099,7 +11111,7 @@ ag ad ad ad -ad +nz ad ad ad diff --git a/maps/tether/submaps/underdark_pois/rykka_easter_egg.dmm b/maps/tether/submaps/underdark_pois/rykka_easter_egg.dmm index df6306c246..65b4b5135c 100644 --- a/maps/tether/submaps/underdark_pois/rykka_easter_egg.dmm +++ b/maps/tether/submaps/underdark_pois/rykka_easter_egg.dmm @@ -7,24 +7,9 @@ /area/mine/explored/underdark) "c" = ( /obj/structure/dogbed, -/mob/living/simple_mob/animal/wolf/phoron{ +/mob/living/simple_mob/animal/wolf/direwolf/rykka{ attacktext = list("attacked, bites, gnaws"); - color = "#6D5843"; - desc = "This canine looks like a GSD. It has a collar tagged, 'Bitch'"; - friendly = list("nuzzles, cuddles, rubs against"); - name = "Rykka"; - size_multiplier = 1.25; - tt_desc = "Canidae"; - vore_bump_chance = 100; - vore_bump_emote = "clamps down on with iron jaws"; - vore_default_contamination_color = "purple"; - vore_default_contamination_flavor = "Acrid"; - vore_digest_chance = 85; - vore_escape_chance = 5; - vore_pounce_chance = 100; - vore_pounce_maxhealth = 100; - vore_stomach_flavor = "A black-and-purple veined gut, pulsing warmly around you. Loud gurgles sound around you as the gut squishes inwards and attempts to crush you - Rykka seems intent on digesting you, like the meat you are."; - vore_stomach_name = "Gut" + friendly = list("nuzzles, cuddles, rubs against") }, /turf/simulated/mineral/floor/ignore_cavegen/virgo3b, /area/mine/explored/underdark) diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index 5b3304c55a..0a07eadd29 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -671,6 +671,21 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/surface_one_hall) +"abc" = ( +/obj/effect/floor_decal/borderfloor{ + dir = 1 + }, +/obj/effect/floor_decal/corner/lightgrey/border{ + dir = 1 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7, +/obj/machinery/door/firedoor/glass, +/obj/machinery/door/airlock/glass, +/turf/simulated/floor/tiled, +/area/tether/surfacebase/surface_one_hall) "abd" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /obj/effect/floor_decal/borderfloor{ @@ -736,6 +751,28 @@ /obj/effect/floor_decal/steeldecal/steel_decals7, /turf/simulated/floor/tiled, /area/rnd/hallway) +"abh" = ( +/obj/effect/floor_decal/borderfloor/corner{ + dir = 1 + }, +/obj/effect/floor_decal/corner/lightgrey/bordercorner{ + dir = 1 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 5 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/tether/surfacebase/surface_one_hall) "abi" = ( /obj/effect/floor_decal/borderfloor{ dir = 1 @@ -755,6 +792,28 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/cargo/mining) +"abk" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/tether/surfacebase/surface_one_hall) +"abl" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/tether/surfacebase/surface_one_hall) "abo" = ( /obj/effect/floor_decal/borderfloor{ dir = 4 @@ -28993,28 +29052,6 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/cargo/mining) -"eIb" = ( -/obj/effect/floor_decal/borderfloor/corner{ - dir = 1 - }, -/obj/effect/floor_decal/corner/lightgrey/bordercorner{ - dir = 1 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 5 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/turf/simulated/floor/tiled, -/area/tether/surfacebase/surface_one_hall) "eIL" = ( /obj/structure/cable{ icon_state = "1-8" @@ -30949,16 +30986,6 @@ icon_state = "origin_arrow" }, /area/looking_glass/lg_1) -"sKe" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/tether/surfacebase/surface_one_hall) "sLi" = ( /obj/structure/catwalk, /obj/structure/cable{ @@ -31435,24 +31462,6 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/surface_one_hall) -"wXf" = ( -/obj/effect/floor_decal/borderfloor{ - dir = 1 - }, -/obj/effect/floor_decal/corner/lightgrey/border{ - dir = 1 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 4 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7, -/obj/machinery/door/firedoor/glass, -/obj/machinery/door/airlock/glass, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/simulated/floor/tiled, -/area/tether/surfacebase/surface_one_hall) "xbP" = ( /obj/effect/floor_decal/borderfloor, /obj/effect/floor_decal/corner/brown/border, @@ -42872,7 +42881,7 @@ agM agM agM agM -wXf +abc sQB byP agM @@ -43014,8 +43023,8 @@ avm avV jDg wUW -eIb -sKe +abh +abk osh agM aah @@ -43157,7 +43166,7 @@ aoQ xAT aoQ tvk -aoQ +abl ghr agM aah diff --git a/maps/tether/tether-02-surface2.dmm b/maps/tether/tether-02-surface2.dmm index eca20154d8..d12c504b26 100644 --- a/maps/tether/tether-02-surface2.dmm +++ b/maps/tether/tether-02-surface2.dmm @@ -1157,6 +1157,18 @@ }, /turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/north) +"acs" = ( +/obj/effect/floor_decal/borderfloor{ + dir = 8 + }, +/obj/machinery/status_display{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/turf/simulated/floor/tiled/techmaint, +/area/tether/surfacebase/surface_two_hall) "act" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -28612,18 +28624,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/techmaint, /area/tether/surfacebase/surface_two_hall) -"iIV" = ( -/obj/effect/floor_decal/borderfloor{ - dir = 8 - }, -/obj/machinery/status_display{ - pixel_x = -32 - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/simulated/floor/tiled/techmaint, -/area/tether/surfacebase/surface_two_hall) "iJj" = ( /obj/machinery/door/firedoor/glass, /obj/structure/disposalpipe/segment, @@ -40529,7 +40529,7 @@ acc ael adY afa -iIV +acs afV ktW aRV @@ -40955,7 +40955,7 @@ aap aap adY alv -afF +afL afY agi agv diff --git a/maps/tether/tether-07-station3.dmm b/maps/tether/tether-07-station3.dmm index e9b0b65873..c24589d762 100644 --- a/maps/tether/tether-07-station3.dmm +++ b/maps/tether/tether-07-station3.dmm @@ -7666,8 +7666,6 @@ pixel_y = 0 }, /obj/structure/closet/secure_closet/hos, -/obj/item/clothing/head/helmet/space/void/security/fluff/hos, -/obj/item/clothing/suit/space/void/security/fluff/hos, /turf/simulated/floor/wood, /area/crew_quarters/heads/hos) "anE" = ( @@ -31457,6 +31455,29 @@ }, /turf/simulated/wall/rshull, /area/shuttle/securiship/engines) +"prO" = ( +/obj/structure/cable/green{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/table/rack, +/obj/item/clothing/shoes/magboots, +/obj/item/device/suit_cooling_unit, +/obj/item/weapon/tank/oxygen, +/obj/machinery/door/window/brigdoor/eastleft{ + name = "Protosuit Storage"; + req_access = list(58) + }, +/obj/item/clothing/mask/breath, +/obj/item/clothing/suit/space/void/security/prototype, +/obj/item/clothing/head/helmet/space/void/security/prototype, +/turf/simulated/floor/wood, +/area/crew_quarters/heads/hos) "psg" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 @@ -32488,6 +32509,10 @@ }, /turf/simulated/floor/tiled/eris/steel/gray_perforated, /area/shuttle/securiship/general) +"vxy" = ( +/obj/machinery/suit_cycler/prototype, +/turf/simulated/floor/wood, +/area/crew_quarters/heads/hos) "vAP" = ( /obj/item/device/flashlight/lamp, /obj/structure/table/steel, @@ -37117,8 +37142,8 @@ aje aLS aWH aUk -amy -akv +vxy +prO anD anW aTO diff --git a/maps/yw/cryogaia-05-main.dmm b/maps/yw/cryogaia-05-main.dmm index 9e1b8e3bd2..9e5587ebaf 100644 --- a/maps/yw/cryogaia-05-main.dmm +++ b/maps/yw/cryogaia-05-main.dmm @@ -19429,8 +19429,8 @@ /obj/item/device/suit_cooling_unit, /obj/item/weapon/tank/jetpack/oxygen, /obj/item/clothing/mask/breath, -/obj/item/clothing/suit/space/void/merc/prototype, -/obj/item/clothing/head/helmet/space/void/merc/prototype, +/obj/item/clothing/suit/space/void/security/prototype, +/obj/item/clothing/head/helmet/space/void/security/prototype, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/hos) "aKC" = ( diff --git a/maps/yw/submaps/space/guttersite.dmm b/maps/yw/submaps/space/guttersite.dmm index 698861bc6b..5caf17bfde 100644 --- a/maps/yw/submaps/space/guttersite.dmm +++ b/maps/yw/submaps/space/guttersite.dmm @@ -3253,6 +3253,10 @@ }, /turf/simulated/floor/tiled/eris/dark/gray_perforated, /area/tether_away/guttersite/security) +"hj" = ( +/mob/living/simple_mob/mobs_monsters/clowns/big/cluwne, +/turf/simulated/mineral/floor/vacuum, +/area/tether_away/guttersite/unexplored) "hk" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4; @@ -4063,6 +4067,10 @@ /obj/item/trash/cheesie, /turf/simulated/mineral/floor/vacuum, /area/tether_away/guttersite/unexplored) +"jh" = ( +/mob/living/simple_mob/mobs_monsters/clowns/big/sentinel, +/turf/simulated/mineral/floor/vacuum, +/area/tether_away/guttersite/unexplored) "ji" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/simple/visible/red{ @@ -5471,7 +5479,7 @@ /area/tether_away/guttersite/unexplored) "mV" = ( /obj/item/device/radio/headset/nanotrasen/alt{ - desc = "The headset of am Eltorro employee."; + desc = "The headset of an Eltorro employee."; name = "Weird Headset" }, /turf/simulated/floor/carpet/gaycarpet, @@ -5616,6 +5624,10 @@ }, /turf/simulated/floor/tiled/eris/steel/bar_light, /area/tether_away/guttersite/commons) +"nz" = ( +/mob/living/simple_mob/mobs_monsters/clowns/big/tunnelclown, +/turf/simulated/mineral/floor/vacuum, +/area/tether_away/guttersite/unexplored) "Ob" = ( /obj/structure/cable/cyan{ d1 = 1; @@ -10531,7 +10543,7 @@ ag hd iW ad -ad +jh ad ad aL @@ -10814,7 +10826,7 @@ aB ag hd jk -ad +hj aA ad ad @@ -11099,7 +11111,7 @@ ag ad ad ad -ad +nz ad ad ad diff --git a/vorestation.dme b/vorestation.dme index 8ca9dbc853..749f7d7185 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1693,9 +1693,9 @@ #include "code\modules\ai\ai_holder_targeting_vr.dm" #include "code\modules\ai\interfaces.dm" #include "code\modules\ai\say_list.dm" -#include "code\modules\ai\aI_holder_subtypes\simple_mob_ai.dm" -#include "code\modules\ai\aI_holder_subtypes\simple_mob_ai_vr.dm" -#include "code\modules\ai\aI_holder_subtypes\slime_xenobio_ai.dm" +#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai.dm" +#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai_vr.dm" +#include "code\modules\ai\ai_holder_subtypes\slime_xenobio_ai.dm" #include "code\modules\alarm\alarm.dm" #include "code\modules\alarm\alarm_handler.dm" #include "code\modules\alarm\atmosphere_alarm.dm" @@ -1942,6 +1942,7 @@ #include "code\modules\clothing\spacesuits\rig\suits\robotics.dm" #include "code\modules\clothing\spacesuits\rig\suits\station.dm" #include "code\modules\clothing\spacesuits\rig\suits\station_vr.dm" +#include "code\modules\clothing\spacesuits\void\ert.dm" #include "code\modules\clothing\spacesuits\void\event.dm" #include "code\modules\clothing\spacesuits\void\event_vr.dm" #include "code\modules\clothing\spacesuits\void\merc.dm" @@ -3054,6 +3055,7 @@ #include "code\modules\overmap\champagne.dm" #include "code\modules\overmap\helpers.dm" #include "code\modules\overmap\overmap_object.dm" +#include "code\modules\overmap\overmap_planet.dm" #include "code\modules\overmap\overmap_shuttle.dm" #include "code\modules\overmap\sectors.dm" #include "code\modules\overmap\spacetravel.dm"