diff --git a/baystation12.dme b/baystation12.dme index 2218c3fa7cd..075645d281c 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -533,6 +533,7 @@ #include "code\game\machinery\computer\communications.dm" #include "code\game\machinery\computer\computer.dm" #include "code\game\machinery\computer\crew.dm" +#include "code\game\machinery\computer\HolodeckControl.dm" #include "code\game\machinery\computer\hologram.dm" #include "code\game\machinery\computer\id.dm" #include "code\game\machinery\computer\lockdown.dm" diff --git a/code/datums/shuttle_controller.dm b/code/datums/shuttle_controller.dm index 23a1f155ccc..6b4925481c6 100644 --- a/code/datums/shuttle_controller.dm +++ b/code/datums/shuttle_controller.dm @@ -140,9 +140,13 @@ datum/shuttle_controller AM.throw_at(E, 1, 1) return */ + if(istype(T, /turf/simulated)) del(T) + for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area... + bug.gib() + start_location.move_contents_to(end_location) settimeleft(SHUTTLELEAVETIME) world << "The Emergency Shuttle has docked with the station! You have [timeleft()/60] minutes to board the Emergency Shuttle." @@ -151,6 +155,7 @@ datum/shuttle_controller return 1 if(1) + if(timeleft>0) return 0 diff --git a/code/defines/obj/computer.dm b/code/defines/obj/computer.dm index 23f9581fedc..fcb954a18eb 100644 --- a/code/defines/obj/computer.dm +++ b/code/defines/obj/computer.dm @@ -128,31 +128,6 @@ var/h_b = 245.0 -/obj/machinery/computer/med_data - name = "Medical Records" - desc = "This can be used to check medical records." - icon_state = "medcomp" - req_access = list(access_medical) - circuit = "/obj/item/weapon/circuitboard/med_data" - var/obj/item/weapon/card/id/scan = null - var/obj/item/weapon/disk/records/disk = null - var/authenticated = null - var/rank = null - var/screen = null - var/datum/data/record/active1 = null - var/datum/data/record/active2 = null - var/a_id = null - var/temp = null - var/printing = null - var/list/Perp - var/tempname = null - - -/obj/machinery/computer/med_data/laptop - name = "Medical Laptop" - desc = "Cheap Nanotrasen Laptop." - icon_state = "medlaptop" - /obj/machinery/computer/pod name = "Pod Launch Control" diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm index 075cb3e4150..304645172f6 100644 --- a/code/defines/procs/helpers.dm +++ b/code/defines/procs/helpers.dm @@ -229,6 +229,8 @@ return max(low,min(high,num)) /proc/dd_replacetext(text, search_string, replacement_string) + if(!text || !istext(text) || !search_string || !istext(search_string) || !istext(replacement_string)) + return null var/textList = dd_text2list(text, search_string) return dd_list2text(textList, replacement_string) @@ -1383,7 +1385,7 @@ proc/listclearnulls(list/list) var/y_pos = null var/z_pos = null -/area/proc/move_contents_to(var/area/A, var/turftoleave=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. @@ -1442,7 +1444,39 @@ proc/listclearnulls(list/list) X.icon_state = old_icon_state1 X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi + /* Quick visual fix for some weird shuttle corner artefacts when on transit space tiles */ + if(direction && findtext(X.icon_state, "swall_s")) + + // Spawn a new shuttle corner object + var/obj/corner = new() + corner.loc = X + corner.density = 1 + corner.anchored = 1 + corner.icon = X.icon + corner.icon_state = dd_replacetext(X.icon_state, "_s", "_f") + corner.tag = "delete me" + corner.name = "wall" + + // Find a new turf to take on the property of + var/turf/nextturf = get_step(corner, direction) + if(!nextturf || !istype(nextturf, /turf/space)) + nextturf = get_step(corner, turn(direction, 180)) + + + // Take on the icon of a neighboring scrolling space icon + X.icon = nextturf.icon + X.icon_state = nextturf.icon_state + + for(var/obj/O in T) + + // Reset the shuttle corners + if(O.tag == "delete me") + X.icon = 'shuttle.dmi' + X.icon_state = dd_replacetext(O.icon_state, "_f", "_s") // revert the turf to the old icon_state + X.name = "wall" + del(O) // prevents multiple shuttle corners from stacking + continue if(!istype(O,/obj)) continue O.loc = X for(var/mob/M in T) @@ -1500,6 +1534,172 @@ proc/listclearnulls(list/list) +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. + + 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 + + if(platingRequired) + if(istype(B, /turf/space)) + continue moving + + var/turf/X = new T.type(B) + X.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 + + + 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)) + continue + + 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 + + + + for(var/V in T.vars) + if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key","x","y","z","contents", "luminosity", "sd_light_spill",))) + X.vars[V] = T.vars[V] + + var/area/AR = X.loc + + if(AR.sd_lighting) + X.opacity = !X.opacity + X.sd_SetOpacity(!X.opacity) + + toupdate += X + + refined_src -= T + refined_trg -= B + continue moving + + + + + var/list/doors = new/list() + + if(toupdate.len) + for(var/turf/simulated/T1 in toupdate) + for(var/obj/machinery/door/D2 in T1) + doors += D2 + if(T1.parent) + air_master.groups_to_rebuild += T1.parent + else + air_master.tiles_to_update += T1 + + for(var/obj/O in doors) + O:update_nearby_tiles(1) + + + + + return copiedobjs + + + + + + proc/get_cardinal_dir(atom/A, atom/B) var/dx = abs(B.x - A.x) var/dy = abs(B.y - A.y) diff --git a/code/game/events/EventProcs/space_ninja.dm b/code/game/events/EventProcs/space_ninja.dm index 28bd1088c42..c600efd4057 100644 --- a/code/game/events/EventProcs/space_ninja.dm +++ b/code/game/events/EventProcs/space_ninja.dm @@ -109,9 +109,9 @@ When I already created about 4 new objectives, this doesn't seem terribly import var/commando_list[] = list()//Commandos. //We want the ninja to appear only in certain modes. - var/acceptable_modes_list[] = list("traitor","revolution","cult","wizard","changeling","traitorchan","nuclear","malfunction","monkey") - if(!(current_mode.config_tag in acceptable_modes_list)) - return +// var/acceptable_modes_list[] = list("traitor","revolution","cult","wizard","changeling","traitorchan","nuclear","malfunction","monkey") // Commented out for both testing and ninjas +// if(!(current_mode.config_tag in acceptable_modes_list)) +// return /*No longer need to determine what mode it is since bad guys are basically universal. And there is now a mode with two types of bad guys.*/ @@ -187,7 +187,7 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp if(sent_strike_team&&side=="heel"&&antagonist_list.len)//If a strike team was sent, murder them all like a champ. for(current_mind in antagonist_list)//Search and destroy. Since we already have an antagonist list, they should appear there. - if(current_mind.special_role=="Death Commando") + if(current_mind && current_mind.special_role=="Death Commando") commando_list += current_mind if(commando_list.len)//If there are living commandos still in play. for(var/mob/living/carbon/human/commando in commando_list) @@ -230,8 +230,7 @@ In either case, it's a good idea to spawn the ninja with a semi-random set of ob objective_list -= 3 switch(pick(objective_list)) if(1)//kill - while (!isnull(current_mind) && hostile_targets.len) - current_mind = pick(hostile_targets) + current_mind = pick(hostile_targets) if(current_mind) var/datum/objective/assassinate/ninja_objective = new @@ -239,6 +238,9 @@ In either case, it's a good idea to spawn the ninja with a semi-random set of ob ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))//If they have a special role, use that instead to find em. ninja_mind.objectives += ninja_objective + else + i++ + hostile_targets -= current_mind//Remove them from the list. if(2)//Steal var/list/datum/objective/theft = GenerateTheft(ninja_mind.assigned_role,ninja_mind) @@ -247,26 +249,32 @@ In either case, it's a good idea to spawn the ninja with a semi-random set of ob objective_list -= 2 if(3)//Protect. Keeping people alive can be pretty difficult. - while (!isnull(current_mind) && friendly_targets.len) - current_mind = pick(friendly_targets) + current_mind = pick(friendly_targets) if(current_mind) + var/datum/objective/protection/ninja_objective = new ninja_objective.owner = ninja_mind ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0)) ninja_mind.objectives += ninja_objective + else + i++ + friendly_targets -= current_mind if(4)//Debrain - while (!isnull(current_mind) && hostile_targets.len) - current_mind = pick(hostile_targets) + current_mind = pick(hostile_targets) if(current_mind) + var/datum/objective/debrain/ninja_objective = new ninja_objective.owner = ninja_mind ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0)) ninja_mind.objectives += ninja_objective + else + i++ + hostile_targets -= current_mind//Remove them from the list. if(5)//Download research var/datum/objective/download/ninja_objective = new diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index e13d4cd37a2..e351f3d82a3 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -227,9 +227,8 @@ /obj/item/weapon/disk/nuclear/Del() - if (ticker.mode && ticker.mode.name == "nuclear emergency") - if(blobstart.len > 0) - var/obj/D = new /obj/item/weapon/disk/nuclear(pick(blobstart)) - message_admins("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).") - log_game("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).") + if(blobstart.len > 0) + var/obj/D = new /obj/item/weapon/disk/nuclear(pick(blobstart)) + message_admins("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).") + log_game("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).") ..() diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 683e5328cc3..6a0f2d475e5 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -92,9 +92,12 @@ dat += "10 milk (20)
" dat += "Slab of meat (50)
" dat += "Nutrient
" - dat += "E-Z-Nutrient (10)
" - dat += "Left 4 Zed (20)
" - dat += "Robust Harvest (25)
" + dat += "E-Z-Nutrient (10) | x5
" + dat += "Left 4 Zed (20) | x5
" + dat += "Robust Harvest (25) | x5
" + dat += "Leather
" + dat += "Botanical gloves (350)
" + dat += "Utility belt (400)
" //dat += "Other
" //dat += "Monkey (500)
" else @@ -163,6 +166,28 @@ new/obj/item/nutrient/l4z(src.loc) if("rh") new/obj/item/nutrient/rh(src.loc) + if("ez5") //It's not an elegant method, but it's safe and easy. -Cheridan + new/obj/item/nutrient/ez(src.loc) + new/obj/item/nutrient/ez(src.loc) + new/obj/item/nutrient/ez(src.loc) + new/obj/item/nutrient/ez(src.loc) + new/obj/item/nutrient/ez(src.loc) + if("l4z5") + new/obj/item/nutrient/l4z(src.loc) + new/obj/item/nutrient/l4z(src.loc) + new/obj/item/nutrient/l4z(src.loc) + new/obj/item/nutrient/l4z(src.loc) + new/obj/item/nutrient/l4z(src.loc) + if("rh5") + new/obj/item/nutrient/rh(src.loc) + new/obj/item/nutrient/rh(src.loc) + new/obj/item/nutrient/rh(src.loc) + new/obj/item/nutrient/rh(src.loc) + new/obj/item/nutrient/rh(src.loc) + if("gloves") + new/obj/item/clothing/gloves/botanic_leather(src.loc) + if("tbelt") + new/obj/item/weapon/storage/belt/utility(src.loc) if("monkey") new/mob/living/carbon/monkey(src.loc) processing = 0 @@ -181,9 +206,10 @@ if("activate") activate() if("detach") - beaker.loc = src.loc - beaker = null - update_icon() + if(beaker) + beaker.loc = src.loc + beaker = null + update_icon() if("create") create_product(href_list["item"],text2num(href_list["cost"])) if("menu") diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm new file mode 100644 index 00000000000..567f10801f9 --- /dev/null +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -0,0 +1,459 @@ +/obj/machinery/computer/HolodeckControl + name = "Holodeck Control Computer" + desc = "A computer used to control a nearby holodeck." + icon_state = "computer_generic" + var/area/linkedholodeck = null + var/area/target = null + var/active = 0 + var/list/holographic_items = list() + var/damaged = 0 + + + attack_ai(var/mob/user as mob) + return src.attack_hand(user) + + attack_paw(var/mob/user as mob) + return + + attack_hand(var/mob/user as mob) + + if(..()) + return + user.machine = src + var/dat + + + dat += "Holodeck Control System
" + dat += "
Current Loaded Programs:
" + + dat += "((Empty Court))
" + dat += "((Boxing Court))
" + dat += "((Thunderdome Court))
" + dat += "((Beach))
" +// dat += "((Shutdown System))
" + + dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
" + + if(issilicon(user) && !emagged) + dat += "(Override Safety Protocols?)
" + + if(emagged) + dat += "(Begin Atmospheric Burn Simulation)
" + dat += "Ensure the holodeck is empty before testing.
" + dat += "
" + dat += "(Begin Wildlife Simulation)
" + dat += "Ensure the holodeck is empty before testing.
" + dat += "
" + dat += "Safety Protocols are DISABLED
" + else + dat += "
" + dat += "Safety Protocols are ENABLED
" + + user << browse(dat, "window=computer;size=400x500") + onclose(user, "computer") + + + return + + + Topic(href, href_list) + if(..()) + return + if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + usr.machine = src + + if(href_list["emptycourt"]) + target = locate(/area/holodeck/source_emptycourt) + if(target) + loadProgram(target) + + else if(href_list["boxingcourt"]) + target = locate(/area/holodeck/source_boxingcourt) + if(target) + loadProgram(target) + + else if(href_list["thunderdomecourt"]) + target = locate(/area/holodeck/source_thunderdomecourt) + if(target) + loadProgram(target) + + else if(href_list["beach"]) + target = locate(/area/holodeck/source_beach) + if(target) + loadProgram(target) + + else if(href_list["turnoff"]) + target = locate(/area/holodeck/source_plating) + if(target) + loadProgram(target) + + else if(href_list["burntest"]) + target = locate(/area/holodeck/source_burntest) + if(target) + loadProgram(target) + + else if(href_list["wildlifecarp"]) + target = locate(/area/holodeck/source_wildlife) + if(target) + loadProgram(target) + + else if(href_list["AIoverride"]) + emagged = 1 + + src.add_fingerprint(usr) + src.updateUsrDialog() + return + + + +/obj/machinery/computer/HolodeckControl/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) +/* if(istype(D, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'Screwdriver.ogg', 50, 1) + if(do_after(user, 20)) + if (src.stat & BROKEN) + user << "\blue The broken glass falls out." + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) + new /obj/item/weapon/shard( src.loc ) + var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 3 + A.icon_state = "3" + A.anchored = 1 + del(src) + else + user << "\blue You disconnect the monitor." + var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) + var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A ) + for (var/obj/C in src) + C.loc = src.loc + A.circuit = M + A.state = 4 + A.icon_state = "4" + A.anchored = 1 + del(src) + +*/ + if(istype(D, /obj/item/weapon/card/emag) && !emagged) + playsound(src.loc, 'sparks4.ogg', 75, 1) + emagged = 1 + user << "\blue You vastly increase projector power and override the safety and security protocols." + user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintence and do not use the simulator." + src.updateUsrDialog() + return + +/obj/machinery/computer/HolodeckControl/New() + ..() + linkedholodeck = locate(/area/holodeck/alphadeck) + //if(linkedholodeck) + // target = locate(/area/holodeck/source_emptycourt) + // if(target) + // loadProgram(target) + + +/obj/machinery/computer/HolodeckControl/process() + + if(active) + + if(!checkInteg(linkedholodeck)) + damaged = 1 + target = locate(/area/holodeck/source_plating) + if(target) + loadProgram(target) + active = 0 + for(var/mob/M in range(10,src)) + M.show_message("The holodeck overloads!") + + + for(var/turf/T in linkedholodeck) + if(prob(30)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, T) + s.start() + T.ex_act(3) + T.hotspot_expose(1000,500,1) + + + for(var/item in holographic_items) + if(!(get_turf(item) in linkedholodeck)) + derez(item, 0) + + + +/obj/machinery/computer/HolodeckControl/proc/derez(var/obj , var/silent = 1) + holographic_items.Remove(obj) + + if(istype(obj , /obj/)) + if(istype(obj:loc , /mob/)) + var/mob/M = obj:loc + M.drop_from_slot(obj) + + if(!silent) + var/obj/oldobj = obj + for(var/mob/M in viewers(world.view,get_turf(obj))) + M << "The [oldobj.name] fades away!" + del(obj) + +/obj/machinery/computer/HolodeckControl/proc/checkInteg(var/area/A) + for(var/turf/T in A) + if(istype(T, /turf/space)) + return 0 + + return 1 + +/obj/machinery/computer/HolodeckControl/proc/togglePower(var/toggleOn = 0) + + if(toggleOn) + var/area/targetsource = locate(/area/holodeck/source_emptycourt) + holographic_items = targetsource.copy_contents_to(linkedholodeck) + + spawn(30) + for(var/obj/effect/landmark/L in linkedholodeck) + if(L.name=="Atmospheric Test Start") + spawn(20) + var/turf/T = get_turf(L) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, T) + s.start() + if(T) + T.temperature = 5000 + T.hotspot_expose(50000,50000,1) + + active = 1 + else + for(var/item in holographic_items) + derez(item) + var/area/targetsource = locate(/area/holodeck/source_plating) + targetsource.copy_contents_to(linkedholodeck , 1) + active = 0 + + +/obj/machinery/computer/HolodeckControl/proc/loadProgram(var/area/A) + + active = 1 + + for(var/item in holographic_items) + derez(item) + + for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck) + del(B) + + holographic_items = A.copy_contents_to(linkedholodeck , 1) + + if(emagged) + for(var/obj/item/weapon/melee/energy/sword/holosword/H in linkedholodeck) + H.damtype = BRUTE + + spawn(30) + for(var/obj/effect/landmark/L in linkedholodeck) + if(L.name=="Atmospheric Test Start") + spawn(20) + var/turf/T = get_turf(L) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, T) + s.start() + if(T) + T.temperature = 5000 + T.hotspot_expose(50000,50000,1) + + + + + + + + + + +// Holographic Items! + +/turf/simulated/floor/holofloor/ + thermal_conductivity = 0 + +/turf/simulated/floor/holofloor/grass + name = "Lush Grass" + icon_state = "grass1" + floor_tile = new/obj/item/stack/tile/grass + + New() + floor_tile.New() //I guess New() isn't run on objects spawned without the definition of a turf to house them, ah well. + icon_state = "grass[pick("1","2","3","4")]" + ..() + spawn(4) + update_icon() + for(var/direction in cardinal) + if(istype(get_step(src,direction),/turf/simulated/floor)) + var/turf/simulated/floor/FF = get_step(src,direction) + FF.update_icon() //so siding get updated properly + +/turf/simulated/floor/holofloor/attackby(obj/item/weapon/W as obj, mob/user as mob) + return + // HOLOFLOOR DOES NOT GIVE A FUCK + + + + + + + + + + +/obj/structure/table/holotable + name = "table" + desc = "A square piece of metal standing on four metal legs. It can not move." + icon = 'structures.dmi' + icon_state = "table" + density = 1 + anchored = 1.0 + layer = 2.8 +// throwpass = 1 //You can throw objects over this, despite it's density. + + +/obj/structure/table/holotable/attack_paw(mob/user as mob) + return attack_hand(user) + +/obj/structure/table/holotable/attack_alien(mob/user as mob) //Removed code for larva since it doesn't work. Previous code is now a larva ability. /N + return attack_hand(user) + +/obj/structure/table/holotable/attack_animal(mob/living/simple_animal/user as mob) //Removed code for larva since it doesn't work. Previous code is now a larva ability. /N + return attack_hand(user) + +/obj/structure/table/holotable/attack_hand(mob/user as mob) + return // HOLOTABLE DOES NOT GIVE A FUCK + + +/obj/structure/table/holotable/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) + var/obj/item/weapon/grab/G = W + if(G.state<2) + user << "\red You need a better grip to do that!" + return + G.affecting.loc = src.loc + G.affecting.Weaken(5) + for(var/mob/O in viewers(world.view, src)) + if (O.client) + O << text("\red [] puts [] on the table.", G.assailant, G.affecting) + del(W) + return + + if (istype(W, /obj/item/weapon/wrench)) + user << "It's a holotable! There are no bolts!" + return + + if(isrobot(user)) + return + + + +/obj/item/clothing/gloves/boxing/hologlove + name = "boxing gloves" + desc = "Because you really needed another excuse to punch your crewmates." + icon_state = "boxing" + item_state = "boxing" + +/obj/structure/holowindow + name = "reinforced window" + icon = 'structures.dmi' + icon_state = "rwindow" + desc = "A window." + density = 1 + layer = 3.2//Just above doors + pressure_resistance = 4*ONE_ATMOSPHERE + anchored = 1.0 + flags = ON_BORDER + + +/obj/structure/holowindow/Del() + ..() + + +/obj/item/weapon/melee/energy/sword/holosword + damtype = HALLOSS + +/obj/item/weapon/melee/energy/sword/holosword/green + New() + color = "green" + +/obj/item/weapon/melee/energy/sword/holosword/red + New() + color = "red" + + + + + + +/obj/machinery/readybutton + name = "Ready Declaration Device" + desc = "This device is used to declare ready. If all devices in an area are ready, the event will begin!" + icon = 'monitors.dmi' + icon_state = "auth_off" + var/ready = 0 + var/area/currentarea = null + var/eventstarted = 0 + + anchored = 1.0 + use_power = 1 + idle_power_usage = 2 + active_power_usage = 6 + power_channel = ENVIRON + +/obj/machinery/readybutton/attack_ai(mob/user as mob) + user << "The station AI is not to interact with these devices" + return + +/obj/machinery/readybutton/attack_paw(mob/user as mob) + user << "You are too primitive to use this device" + return + +/obj/machinery/readybutton/New() + ..() + + +/obj/machinery/readybutton/attackby(obj/item/weapon/W as obj, mob/user as mob) + user << "The device is a solid button, there's nothing you can do with it!" + +/obj/machinery/readybutton/attack_hand(mob/user as mob) + if(user.stat || stat & (NOPOWER|BROKEN)) + user << "This device is not powered." + return + + currentarea = get_area(src.loc) + if(!currentarea) + del(src) + + if(eventstarted) + usr << "The event has already begun!" + return + + ready = !ready + + update_icon() + + var/numbuttons = 0 + var/numready = 0 + for(var/obj/machinery/readybutton/button in currentarea) + numbuttons++ + if (button.ready) + numready++ + + if(numbuttons == numready) + begin_event() + +/obj/machinery/readybutton/update_icon() + if(ready) + icon_state = "auth_on" + else + icon_state = "auth_off" + +/obj/machinery/readybutton/proc/begin_event() + + eventstarted = 1 + + for(var/obj/structure/holowindow/W in currentarea) + del(W) + + for(var/mob/M in currentarea) + M << "FIGHT!" \ No newline at end of file diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 14c0ceb7485..0fd688bed81 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -192,6 +192,11 @@ build_path = "/obj/machinery/computer/telecomms/server" origin_tech = "programming=3" +/obj/item/weapon/circuitboard/comm_traffic + name = "Circuitboard (Telecommunications Traffic Control)" + build_path = "/obj/machinery/computer/telecomms/traffic" + origin_tech = "programming=3" + /obj/item/weapon/circuitboard/curefab name = "Circuit board (Cure fab)" build_path = "/obj/machinery/computer/curer" diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 3c200f6158a..c7035736f6d 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -1,3 +1,24 @@ +/obj/machinery/computer/med_data//TODO:SANITY + name = "Medical Records" + desc = "This can be used to check medical records." + icon_state = "medcomp" + req_access = list(access_medical) + circuit = "/obj/item/weapon/circuitboard/med_data" + var + obj/item/weapon/card/id/scan = null + obj/item/weapon/disk/records/disk = null + authenticated = null + rank = null + screen = null + datum/data/record/active1 = null + datum/data/record/active2 = null + a_id = null + temp = null + printing = null + list/Perp + tempname = null + + /obj/machinery/computer/med_data/attackby(obj/item/O as obj, user as mob) if(istype(O, /obj/item/weapon/card/id) && !scan) usr.drop_item() @@ -21,7 +42,6 @@ if(..()) return var/dat - if (src.temp) dat = text("[src.temp]

Clear Screen") else @@ -540,3 +560,8 @@ src.updateUsrDialog() return + +/obj/machinery/computer/med_data/laptop + name = "Medical Laptop" + desc = "Cheap Nanotrasen Laptop." + icon_state = "medlaptop" diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 2ead66f3eb7..7d87be6345b 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -90,19 +90,25 @@ del(src) + attack_ai(var/mob/user as mob) + attack_hand(user) + attack_hand(var/mob/user as mob) - // You need a multitool to use this. - if(user.equipped()) - if(!istype(user.equipped(), /obj/item/device/multitool)) + // You need a multitool to use this, or be silicon + if(!issilicon(user)) + if(user.equipped()) + if(!istype(user.equipped(), /obj/item/device/multitool)) + return + else return - else - return if(stat & (BROKEN|NOPOWER) || !on) return - var/obj/item/device/multitool/P = user.equipped() + var/obj/item/device/multitool/P = null + if(!issilicon(user)) + P = user.equipped() user.machine = src var/dat @@ -138,10 +144,12 @@ dat += "
\[Add Filter\]" dat += "
" - if(P.buffer) - dat += "

MULTITOOL BUFFER: [P.buffer] ([P.buffer.id]) \[Link\] \[Flush\]" - else - dat += "

MULTITOOL BUFFER:
\[Add Machine\]" + + if(P) + if(P.buffer) + dat += "

MULTITOOL BUFFER: [P.buffer] ([P.buffer.id]) \[Link\] \[Flush\]" + else + dat += "

MULTITOOL BUFFER:
\[Add Machine\]" dat += "" temp = "" @@ -150,16 +158,19 @@ Topic(href, href_list) - if(usr.equipped()) - if(!istype(usr.equipped(), /obj/item/device/multitool)) + if(!issilicon(usr)) + if(usr.equipped()) + if(!istype(usr.equipped(), /obj/item/device/multitool)) + return + else return - else - return if(stat & (BROKEN|NOPOWER) || !on) return - var/obj/item/device/multitool/P = usr.equipped() + var/obj/item/device/multitool/P = null + if(!issilicon(usr)) + P = usr.equipped() if(href_list["input"]) switch(href_list["input"]) @@ -205,27 +216,30 @@ if(href_list["unlink"]) - var/obj/machinery/telecomms/T = links[text2num(href_list["unlink"])] - temp = "-% Removed \ref[T] [T.name] from linked entities. %-" + if(text2num(href_list["unlink"]) <= length(links)) + var/obj/machinery/telecomms/T = links[text2num(href_list["unlink"])] + temp = "-% Removed \ref[T] [T.name] from linked entities. %-" - // Remove link entries from both T and src. - if(src in T.links) - T.links.Remove(src) - links.Remove(T) + // Remove link entries from both T and src. + if(src in T.links) + T.links.Remove(src) + links.Remove(T) if(href_list["link"]) - if(P.buffer) - if(!(src in P.buffer.links)) - P.buffer.links.Add(src) + if(P) - if(!(P.buffer in src.links)) - src.links.Add(P.buffer) + if(P.buffer) + if(!(src in P.buffer.links)) + P.buffer.links.Add(src) - temp = "-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-" + if(!(P.buffer in src.links)) + src.links.Add(P.buffer) - else - temp = "-% Unable to acquire buffer %-" + temp = "-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-" + + else + temp = "-% Unable to acquire buffer %-" if(href_list["buffer"]) @@ -244,3 +258,4 @@ updateUsrDialog() + diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index 1866477d7a8..b777f24a70b 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -108,7 +108,7 @@ if(href_list["network"]) var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text - if(newnet && usr in range(1, src)) + if(newnet && ((usr in range(1, src) || issilicon(usr)))) if(length(newnet) > 15) temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index 972c36e9110..accfd0abea5 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -35,7 +35,7 @@ winset(editingcode, "tcscode", "is-disabled=false") // If the player's not manning the keyboard anymore, adjust everything - if(!(editingcode in range(1, src)) || editingcode.machine != src) + if( (!(editingcode in range(1, src)) && !issilicon(editingcode)) || (editingcode.machine != src && !issilicon(editingcode))) if(editingcode) winshow(editingcode, "Telecomms IDE", 0) // hide the window! editingcode = null @@ -169,6 +169,7 @@ editingcode = usr winshow(editingcode, "Telecomms IDE", 1) // show the IDE winset(editingcode, "tcscode", "is-disabled=false") + winset(editingcode, "tcscode", "text=\"\"") var/showcode = dd_replacetext(storedcode, "\\\"", "\\\\\"") showcode = dd_replacetext(storedcode, "\"", "\\\"") winset(editingcode, "tcscode", "text=\"[showcode]\"") @@ -189,7 +190,7 @@ var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text - if(newnet && usr in range(1, src)) + if(newnet && ((usr in range(1, src) || issilicon(usr)))) if(length(newnet) > 15) temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" @@ -211,7 +212,7 @@ user << "\blue The broken glass falls out." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) new /obj/item/weapon/shard( src.loc ) - var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A ) + var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A ) for (var/obj/C in src) C.loc = src.loc A.circuit = M @@ -222,7 +223,7 @@ else user << "\blue You disconnect the monitor." var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) - var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A ) + var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A ) for (var/obj/C in src) C.loc = src.loc A.circuit = M diff --git a/code/game/objects/closets/secure/medical.dm b/code/game/objects/closets/secure/medical.dm index 3d220fb37de..383296c9636 100644 --- a/code/game/objects/closets/secure/medical.dm +++ b/code/game/objects/closets/secure/medical.dm @@ -1,12 +1,12 @@ /obj/structure/closet/secure_closet/medicine name = "Medicine Closet" desc = "Filled with medical junk." - icon_state = "medical1" - icon_closed = "medical" - icon_locked = "medical1" - icon_opened = "medicalopen" - icon_broken = "medicalbroken" - icon_off = "medical1" + icon_state = "securemed1" + icon_closed = "securemed" + icon_locked = "securemed1" + icon_opened = "securemedopen" + icon_broken = "securemedbroken" + icon_off = "securemed1" req_access = list(access_medical) @@ -28,13 +28,13 @@ /obj/structure/closet/secure_closet/anaesthetic name = "Anesthetic" - desc = "Used to knock people out, either by sleeping gas or brute force." - icon_state = "medical1" - icon_closed = "medical" - icon_locked = "medical1" - icon_opened = "medicalopen" - icon_broken = "medicalbroken" - icon_off = "medical1" + desc = "Used to knock people out." + icon_state = "securemed1" + icon_closed = "securemed" + icon_locked = "securemed1" + icon_opened = "securemedopen" + icon_broken = "securemedbroken" + icon_off = "securemed1" req_access = list(access_medical) @@ -51,6 +51,31 @@ +/obj/structure/closet/secure_closet/doctor_personal + name = "Doctor's Locker" + req_access = list(access_medical) + icon_state = "securemed1" + icon_closed = "securemed" + icon_locked = "securemed1" + icon_opened = "securemedopen" + icon_broken = "securemedbroken" + icon_off = "securemed1" + + New() + ..() + sleep(2) + new /obj/item/wardrobe/doctor(src) + // + var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src) + var/obj/item/weapon/storage/box/B = new(BPK) + new /obj/item/weapon/pen(B) + new /obj/item/device/pda/medical(src) + new /obj/item/weapon/storage/firstaid/regular(src) + new /obj/item/device/flashlight/pen(src) + new /obj/item/weapon/cartridge/medical(src) + new /obj/item/device/radio/headset/headset_med(src) + return + /obj/structure/closet/secure_closet/chemist_personal name = "Chemist's Locker" req_access = list(access_chemistry) @@ -67,25 +92,6 @@ new /obj/item/device/pda/toxins(src) return -/obj/structure/closet/secure_closet/doctor_personal - name = "Doctor's Locker" - req_access = list(access_medical) - - New() - ..() - sleep(2) - new /obj/item/wardrobe/doctor(src) - // - var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src) - var/obj/item/weapon/storage/box/B = new(BPK) - new /obj/item/weapon/pen(B) - new /obj/item/device/pda/medical(src) - new /obj/item/weapon/storage/firstaid/regular(src) - new /obj/item/device/flashlight/pen(src) - new /obj/item/weapon/cartridge/medical(src) - new /obj/item/device/radio/headset/headset_med(src) - return - /obj/structure/closet/secure_closet/genetics_personal name = "Geneticist's Locker" req_access = list(access_medlab) @@ -122,6 +128,12 @@ /obj/structure/closet/secure_closet/CMO name = "Chief Medical Officer's Locker" req_access = list(access_cmo) + icon_state = "cmosecure1" + icon_closed = "cmosecure" + icon_locked = "cmosecure1" + icon_opened = "cmosecureopen" + icon_broken = "cmosecurebroken" + icon_off = "cmosecure1" New() ..() @@ -159,12 +171,12 @@ /obj/structure/closet/secure_closet/chemical name = "Chemical Closet" desc = "Store dangerous chemicals in here." - icon_state = "medical1" - icon_closed = "medical" - icon_locked = "medical1" - icon_opened = "medicalopen" - icon_broken = "medicalbroken" - icon_off = "medical1" + icon_state = "securemed1" + icon_closed = "securemed" + icon_locked = "securemed1" + icon_opened = "securemedopen" + icon_broken = "securemedbroken" + icon_off = "securemed1" req_access = list(access_medical) diff --git a/code/game/objects/closets/secure/research.dm b/code/game/objects/closets/secure/research.dm index ebfc674f687..77caa212bd4 100755 --- a/code/game/objects/closets/secure/research.dm +++ b/code/game/objects/closets/secure/research.dm @@ -1,7 +1,37 @@ +/obj/structure/closet/secure_closet/scientist + name = "Scientist's Locker" + req_access = list(access_research) + icon_state = "secureres1" + icon_closed = "secureres" + icon_locked = "secureres1" + icon_opened = "secureresopen" + icon_broken = "secureresbroken" + icon_off = "secureres1" + + New() + ..() + sleep(2) + new /obj/item/wardrobe/scientist(src) + // + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + var/obj/item/weapon/storage/box/B = new(BPK) + new /obj/item/weapon/pen(B) + new /obj/item/device/pda/toxins(src) + new /obj/item/weapon/tank/oxygen(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/device/radio/headset/headset_sci(src) + + /obj/structure/closet/secure_closet/rd name = "Research Director's Locker" req_access = list(access_rd) + icon_state = "rdsecure1" + icon_closed = "rdsecure" + icon_locked = "rdsecure1" + icon_opened = "rdsecureopen" + icon_broken = "rdsecurebroken" + icon_off = "rdsecure1" New() ..() @@ -16,21 +46,4 @@ new /obj/item/clothing/mask/gas(src) new /obj/item/device/flash(src) new /obj/item/device/radio/headset/heads/rd(src) - // - -/obj/structure/closet/secure_closet/scientist - name = "Scientist's Locker" - req_access = list(access_research) - - New() - ..() - sleep(2) - new /obj/item/wardrobe/scientist(src) - // - var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) - var/obj/item/weapon/storage/box/B = new(BPK) - new /obj/item/weapon/pen(B) - new /obj/item/device/pda/toxins(src) - new /obj/item/weapon/tank/oxygen(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/device/radio/headset/headset_sci(src) \ No newline at end of file + // \ No newline at end of file diff --git a/code/game/objects/closets/secure/scientist.dm b/code/game/objects/closets/secure/scientist.dm index 57c5981e6ec..e28b2212f49 100644 --- a/code/game/objects/closets/secure/scientist.dm +++ b/code/game/objects/closets/secure/scientist.dm @@ -1,7 +1,12 @@ /obj/structure/closet/secure_closet/RD name = "Research Director" req_access = list(access_rd) - + icon_state = "rdsecure1" + icon_closed = "rdsecure" + icon_locked = "rdsecure1" + icon_opened = "rdsecureopen" + icon_broken = "rdsecurebroken" + icon_off = "rdsecure1" New() ..() diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm index 4eff5bf31ac..ac9c3069ce5 100755 --- a/code/game/objects/items/item.dm +++ b/code/game/objects/items/item.dm @@ -339,7 +339,8 @@ mob/proc/flash_weak_pain() if(Metroid) Metroid.SStun = 1 sleep(rand(5,20)) - Metroid.SStun = 0 + if(Metroid) + Metroid.SStun = 0 spawn(0) Metroid.canmove = 0 diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index c5ce4deb9ef..d206312b0a2 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -106,6 +106,7 @@ if(isigniter(W)) var/obj/item/device/assembly/igniter/I = W if(I.secured) return 0 + if(src.igniter) return user.remove_from_mob(I) I.loc = src igniter = I diff --git a/code/game/objects/radio/radio.dm b/code/game/objects/radio/radio.dm index de52b3703c5..0498b7aafee 100644 --- a/code/game/objects/radio/radio.dm +++ b/code/game/objects/radio/radio.dm @@ -129,11 +129,12 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use if(!src.loc) on = 0 - var/area/A = get_area(src) - if(!A || !isarea(A) || !A.master) - on = 0 else - on = A.master.powered(EQUIP) // set "on" to the power status + var/area/A = src.loc.loc + if(!A || !isarea(A) || !A.master) + on = 0 + else + on = A.master.powered(EQUIP) // set "on" to the power status if(!on) icon_state = "intercom-p" diff --git a/code/game/objects/window.dm b/code/game/objects/window.dm index 34c42f24bb7..a022f63f137 100644 --- a/code/game/objects/window.dm +++ b/code/game/objects/window.dm @@ -224,9 +224,11 @@ playsound(src.loc, 'Crowbar.ogg', 75, 1) user << (state ? "You have pried the window into the frame." : "You have pried the window out of the frame.") else + var/aforce = W.force if(reinf) aforce /= 2.0 - src.health = max(0, src.health - aforce) + if(W.damtype == BRUTE || W.damtype == BURN) + src.health = max(0, src.health - aforce) playsound(src.loc, 'Glasshit.ogg', 75, 1) if (src.health <= 7) src.anchored = 0 diff --git a/code/game/syndicate_specops_shuttle.dm b/code/game/syndicate_specops_shuttle.dm index 8dbfb79ba2a..15b9456c8c5 100644 --- a/code/game/syndicate_specops_shuttle.dm +++ b/code/game/syndicate_specops_shuttle.dm @@ -243,7 +243,7 @@ var/syndicate_elite_shuttle_timeleft = 0 elite_squad.readyalert()//Trigger alarm for the spec ops area. syndicate_elite_shuttle_moving_to_station = 1 - syndicate_elite_shuttle_time = world.timeofday + syndicate_elite_shuttle_time = world.timeofday + SYNDICATE_ELITE_MOVETIME spawn(0) syndicate_elite_process() diff --git a/code/game/turf.dm b/code/game/turf.dm index effb872f879..ca8444f4415 100644 --- a/code/game/turf.dm +++ b/code/game/turf.dm @@ -1283,58 +1283,46 @@ turf/simulated/floor/return_siding_icon_state() // Okay, so let's make it so that people can travel z levels but not nuke disks! // if(ticker.mode.name == "nuclear emergency") return + if (src.x <= TRANSITIONEDGE || A.x >= (world.maxx - TRANSITIONEDGE - 1) || src.y <= TRANSITIONEDGE || A.y >= (world.maxy - TRANSITIONEDGE - 1)) + if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) + del(A) + return + if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels ... And moving this shit down here so it only fires when they're actually trying to change z-level. + del(A) //The disk's Del() proc ensures a new one is created + return - if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels - return + if(!isemptylist(A.search_contents_for(/obj/item/weapon/disk/nuclear))) + if(istype(A, /mob/living)) + var/mob/living/MM = A + if(MM.client) + MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is." + return -// else if(ticker.mode.name == "extended"||ticker.mode.name == "sandbox") Sandbox_Spacemove(A) + var/move_to_z_str = pickweight(accessable_z_levels) - else - if (src.x <= 2 || A.x >= (world.maxx - 1) || src.y <= 2 || A.y >= (world.maxy - 1)) - if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust)) - del(A) - return + var/move_to_z = text2num(move_to_z_str) - if(!isemptylist(A.search_contents_for(/obj/item/weapon/disk/nuclear))) - if(istype(A, /mob/living)) - var/mob/living/MM = A - if(MM.client) - MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is." - return + if(!move_to_z) + return + A.z = move_to_z + if(src.x <= TRANSITIONEDGE) + A.x = world.maxx - TRANSITIONEDGE - 2 - var/move_to_z_str = pickweight(accessable_z_levels) + else if (A.x >= (world.maxx - TRANSITIONEDGE - 1)) + A.x = TRANSITIONEDGE + 1 - var/move_to_z = text2num(move_to_z_str) + else if (src.y <= TRANSITIONEDGE) + A.y = world.maxy - TRANSITIONEDGE -2 - if(!move_to_z) - return + else if (A.y >= (world.maxy - TRANSITIONEDGE - 1)) + A.y = TRANSITIONEDGE +1 - - - A.z = move_to_z - - - if(src.x <= 2) - A.x = world.maxx - 2 - - else if (A.x >= (world.maxx - 1)) - A.x = 3 - - else if (src.y <= 2) - A.y = world.maxy - 2 - - else if (A.y >= (world.maxy - 1)) - A.y = 3 - - spawn (0) - if ((A && A.loc)) - A.loc.Entered(A) - -// if(istype(A, /obj/structure/closet/coffin)) -// coffinhandler.Add(A) + spawn (0) + if ((A && A.loc)) + A.loc.Entered(A) /* /turf/space/proc/Sandbox_Spacemove(atom/movable/A as mob|obj) var/cur_x diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index c330f574512..82149e232d1 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -195,6 +195,7 @@ verbs += /client/proc/spawn_xeno verbs += /client/proc/toggleprayers verbs += /client/proc/deadmin_self + verbs += /client/proc/tension_report verbs += /proc/possess verbs += /proc/release verbs += /client/proc/admin_deny_shuttle @@ -229,7 +230,6 @@ //verbs += /proc/togglebuildmode --Merged with view variables //verbs += /client/proc/cmd_modify_object_variables --Merged with view variables verbs += /client/proc/togglebuildmodeself - verbs += /client/proc/tension_report verbs += /client/proc/toggleadminhelpsound else return diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 69ffc12b836..47e61313879 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -17,6 +17,7 @@ M << "\blue \icon[cross] PRAY: [key_name(src, M)] (PP) (VV) (SM) (JMP) (CA): [msg]" usr << "Your prayers have been received by the gods." + //feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //log_admin("HELP: [key_name(src)]: [msg]") diff --git a/code/modules/chemical/Chemistry-Machinery.dm b/code/modules/chemical/Chemistry-Machinery.dm index 57eb90fbeac..2e31bce08f2 100644 --- a/code/modules/chemical/Chemistry-Machinery.dm +++ b/code/modules/chemical/Chemistry-Machinery.dm @@ -462,23 +462,23 @@ if (href_list["create_vaccine"]) if(!src.wait) var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) - var/vaccine_type = text2path(href_list["create_vaccine"])//the path is received as string - converting - var/datum/disease/D = new vaccine_type - var/name = input(usr,"Name:","Name the vaccine",D.name) - if(!name || name == " ") name = D.name - B.name = "[name] vaccine bottle" - B.reagents.add_reagent("vaccine",15,vaccine_type) - del(D) - wait = 1 - var/datum/reagents/R = beaker.reagents - var/datum/reagent/blood/Blood = null - for(var/datum/reagent/blood/L in R.reagent_list) - if(L) - Blood = L - break - var/list/res = Blood.data["resistances"] - spawn(res.len*500) - src.wait = null + if(B) + var/vaccine_type = text2path(href_list["create_vaccine"])//the path is received as string - converting + var/datum/disease/D = new vaccine_type + if(D) + B.name = "[D.name] vaccine bottle" + B.reagents.add_reagent("vaccine",15,vaccine_type) + del(D) + wait = 1 + var/datum/reagents/R = beaker.reagents + var/datum/reagent/blood/Blood = null + for(var/datum/reagent/blood/L in R.reagent_list) + if(L) + Blood = L + break + var/list/res = Blood.data["resistances"] + spawn(res.len*500) + src.wait = null else src.temphtml = "The replicator is not ready yet." src.updateUsrDialog() diff --git a/code/modules/chemical/Chemistry-Recipes.dm b/code/modules/chemical/Chemistry-Recipes.dm index b78486260f6..0ecef3b724f 100644 --- a/code/modules/chemical/Chemistry-Recipes.dm +++ b/code/modules/chemical/Chemistry-Recipes.dm @@ -759,13 +759,14 @@ datum if(M:eyecheck() <= 0) flick("e_flash", M.flash) - for(var/i = 1, i <= created_volume, i++) + for(var/i = 1, i <= created_volume + rand(1,2), i++) var/chosen = pick(borks) var/obj/B = new chosen - B.loc = get_turf_loc(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) + if(B) + B.loc = get_turf_loc(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(B, pick(NORTH,SOUTH,EAST,WEST)) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 9fac994c5f5..a2f976ea90e 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -6,6 +6,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + /obj/item/clothing/suit/storage/wcoat name = "waistcoat" desc = "The height of class." @@ -13,6 +14,24 @@ item_state = "wcoat" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + + + +/obj/item/clothing/suit/bluetag + name = "blue laser tag armour" + desc = "Blue Pride, Station Wide" + icon_state = "bluetag" + item_state = "bluetag" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + +/obj/item/clothing/suit/redtag + name = "red laser tag armour" + desc = "Pew pew pew" + icon_state = "redtag" + item_state = "redtag" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + + /obj/item/clothing/suit/storage/apron name = "apron" desc = "A basic blue apron. It has a large pocket you can store things in." @@ -21,6 +40,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS allowed = list (/obj/item/weapon/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/nutrient,/obj/item/weapon/minihoe) + /obj/item/clothing/suit/storage/chef name = "chef's apron" desc = "An apron used by a high class chef. Has a few pockets for nic-naks." @@ -33,6 +53,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS allowed = list (/obj/item/weapon/kitchenknife,/obj/item/weapon/butch) + /obj/item/clothing/suit/storage/chef/classic name = "classic chef's apron" desc = "A basic, dull, white chef's apron." @@ -40,18 +61,21 @@ item_state = "apronchef" body_parts_covered = UPPER_TORSO|LOWER_TORSO + /obj/item/clothing/suit/hazardvest name = "hazard vest" desc = "A high-visibility vest used in work zones." icon_state = "hazard" item_state = "hazard" + /obj/item/clothing/suit/suspenders name = "suspenders" desc = "They suspend the illusion of the mime's play." icon = 'belts.dmi' icon_state = "suspenders" + /obj/item/clothing/suit/syndicatefake name = "red space suit replica" icon_state = "syndicate" @@ -62,6 +86,7 @@ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + /obj/item/clothing/suit/storage/captunic name = "captain's parade tunic" desc = "Worn by a Captain to show their class." @@ -70,6 +95,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEJUMPSUIT + /obj/item/clothing/suit/nun name = "nun robe" desc = "Maximum piety in this star system." @@ -92,14 +118,16 @@ item_state = "chaplain_hoodie" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + /obj/item/clothing/suit/hastur - name = "Hastur's robes" + name = "\improper Hastur's robes" desc = "Robes not meant to be worn by man" icon_state = "hastur" item_state = "hastur" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + /obj/item/clothing/suit/imperium_monk name = "imperium monk robes" desc = "A set of strange robes." @@ -108,6 +136,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDESHOES|HIDEJUMPSUIT + /obj/item/clothing/suit/chickensuit name = "chicken suit" desc = "Bwak!" @@ -116,6 +145,7 @@ body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET|HEAD flags_inv = HIDESHOES|HIDEJUMPSUIT + /obj/item/clothing/suit/monkeysuit name = "monkey suit" desc = "A suit that looks like a primate" @@ -124,6 +154,7 @@ body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET|HANDS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + /obj/item/clothing/suit/holidaypriest name = "holiday priest" desc = "This is a nice holiday my son." @@ -131,6 +162,8 @@ item_state = "holidaypriest" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + + // BubbleWrap - Nothing to see here /obj/item/clothing/suit/cardborg diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 28cde78ffcf..806a37dd8ff 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -44,6 +44,36 @@ proc/move_mining_shuttle() else fromArea = locate(/area/shuttle/mining/station) toArea = locate(/area/shuttle/mining/outpost) + + + var/list/dstturfs = list() + var/throwy = world.maxy + + for(var/turf/T in toArea) + dstturfs += T + if(T.y < throwy) + throwy = T.y + + // hey you, get out of the way! + for(var/turf/T in dstturfs) + // find the turf to move things to + var/turf/D = locate(T.x, throwy - 1, 1) + //var/turf/E = get_step(D, SOUTH) + for(var/atom/movable/AM as mob|obj in T) + AM.Move(D) + // NOTE: Commenting this out to avoid recreating mass driver glitch + /* + spawn(0) + AM.throw_at(E, 1, 1) + return + */ + + if(istype(T, /turf/simulated)) + del(T) + + for(var/mob/living/carbon/bug in toArea) // If someone somehow is still in the shuttle's docking area... + bug.gib() + fromArea.move_contents_to(toArea) if (mining_shuttle_location) mining_shuttle_location = 0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b50b0eb84ee..4ca82ab7435 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -193,11 +193,13 @@ var/status = "" var/brutedamage = org.brute_dam var/burndamage = org.burn_dam + if(halloss > 0) if(prob(30)) brutedamage += halloss if(prob(30)) burndamage += halloss + if(brutedamage > 0) status = "bruised" if(brutedamage > 20) @@ -208,6 +210,7 @@ status += " and " if(burndamage > 40) status += "peeling away" + else if(burndamage > 10) status += "blistered" else if(burndamage > 0) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index e1d2364f92e..024bb726c99 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -180,14 +180,14 @@ distance = 1 if (src.stat == 1 || stat == 2) - msg += "[name] doesn't seem to be responding to anything around [t_him], [t_his] eyes closed as though asleep.\n" + msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n" if((!isbreathing || holdbreath) && distance <= 3) - msg += "[name] does not appear to be breathing.\n" + msg += "[t_He] does not appear to be breathing.\n" if(istype(usr, /mob/living/carbon/human) && usr.stat == 0 && src.stat == 1 && distance <= 1) for(var/mob/O in viewers(usr.loc, null)) O.show_message("[usr] checks [src]'s pulse.", 1) spawn(15) - usr << "\blue [name] has a pulse!" + usr << "\blue [t_He] has a pulse!" if (src.stat == 2 || (changeling && changeling.changeling_fakedeath == 1)) if(distance <= 1) @@ -195,7 +195,19 @@ for(var/mob/O in viewers(usr.loc, null)) O.show_message("[usr] checks [src]'s pulse.", 1) spawn(15) - usr << "\red [name] has no pulse!" + if(!src.client) + var/foundghost = 0 + for(var/mob/dead/observer/G in world) + if(G.client) + if(G.corpse == src) + foundghost++ + break + if(!foundghost) + usr << "[t_He] has no pulse and [t_his] soul has departed..." + else + usr << "[t_He] has no pulse..." + + msg += "" /* if (src.getBruteLoss()) if (src.getBruteLoss() < 30) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 7d434f659a5..0340f2a925e 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -32,6 +32,30 @@ visible_message("\red [src] has been touched with the stun gloves by [M]!") return + if(istype(M.gloves , /obj/item/clothing/gloves/boxing/hologlove)) + + var/damage = rand(0, 9) + if(!damage) + playsound(loc, 'punchmiss.ogg', 25, 1, -1) + visible_message("\red [M] has attempted to punch [src]!") + return 0 + var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting)) + var/armor_block = run_armor_check(affecting, "melee") + + if(M.mutations & HULK) damage += 5 + playsound(loc, "punch", 25, 1, -1) + + visible_message("\red [M] has punched [src]!") + + apply_damage(damage, HALLOSS, affecting, armor_block) + if(damage >= 9) + visible_message("\red [M] has weakened [src]!") + apply_effect(4, WEAKEN, armor_block) + UpdateDamageIcon() + + return + + switch(M.a_intent) if("help") if(health > 0) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index f88b78787d1..4b96f26273a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -143,7 +143,7 @@ emp_act apply_damage(power, I.damtype, affecting, armor, is_cut(I), I.name) var/bloody = 0 - if((I.damtype == BRUTE) && prob(25 + is_sharp(I) * 50 + (I.force * 2))) + if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + is_sharp(I) * 50 + (I.force * 2))) I.add_blood(src) //Make the weapon bloody, not the person. bloody = 1 var/turf/location = loc diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 58f3628941e..aa4c7e09b35 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -186,15 +186,24 @@ // a.hallucinate(src) if(!handling_hal && hallucination > 20) spawn handle_hallucinations() //The not boring kind! - hallucination = max(hallucination - 2, 0) + hallucination = max(hallucination - 2, 0) //if(health < 0) // for(var/obj/a in hallucinations) // del a else - halloss = 0 + //halloss = 0 for(var/atom/a in hallucinations) del a + if(halloss > 100) + src << "You're too tired to keep going..." + for(var/mob/O in viewers(src, null)) + if(O == src) + continue + O.show_message(text("\red [src] slumps to the ground panting, too weak to continue fighting."), 1) + Paralyse(15) + setHalLoss(99) + if(mutations2 & mSmallsize) if(!(pass_flags & PASSTABLE)) pass_flags |= PASSTABLE @@ -927,7 +936,7 @@ if(getOxyLoss() > 50) Paralyse(3) if(sleeping) -// adjustHalLoss(-5) + adjustHalLoss(-5) if(paralysis <= 0) Paralyse(2) if (prob(10) && health && !hal_crit) spawn(0) emote("snore") diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm index d7bca333688..f53ca6f66f0 100644 --- a/code/modules/mob/living/carbon/shock.dm +++ b/code/modules/mob/living/carbon/shock.dm @@ -3,7 +3,7 @@ // proc to find out in how much pain the mob is at the moment /mob/living/carbon/proc/updateshock() - src.traumatic_shock = src.getOxyLoss() + src.getToxLoss() + src.getFireLoss() + 1.2*src.getBruteLoss() + 2*src.getCloneLoss() + src.traumatic_shock = src.getOxyLoss() + src.getToxLoss() + src.getFireLoss() + 1.2*src.getBruteLoss() + 2*src.getCloneLoss() + src.halloss if(reagents.has_reagent("alkysine")) src.traumatic_shock -= 10 if(reagents.has_reagent("inaprovaline")) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index b1778089a8c..78e4257cf86 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -22,18 +22,21 @@ adjustOxyLoss(damage/(blocked+1)) if(CLONE) adjustCloneLoss(damage/(blocked+1)) + if(HALLOSS) + adjustHalLoss(damage/(blocked+1)) UpdateDamageIcon() updatehealth() return 1 -/mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/def_zone = null, var/blocked = 0) +/mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/def_zone = null, var/blocked = 0, var/halloss = 0) if(blocked >= 2) return 0 if(brute) apply_damage(brute, BRUTE, def_zone, blocked) if(burn) apply_damage(burn, BURN, def_zone, blocked) if(tox) apply_damage(tox, TOX, def_zone, blocked) if(oxy) apply_damage(oxy, OXY, def_zone, blocked) if(clone) apply_damage(clone, CLONE, def_zone, blocked) + if(halloss) apply_damage(halloss, HALLOSS, def_zone, blocked) return 1 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4a1104141b6..be090aaa13f 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1102,7 +1102,26 @@ Frequency: . = ..() if ((s_active && !( s_active in contents ) )) s_active.close(src) - return + + if(module) + if(module.type == /obj/item/weapon/robot_module/janitor) //you'd think checking the module would work + var/turf/tile = get_turf(loc) + + tile.clean_blood() + for(var/obj/effect/R in tile) + if(istype(R, /obj/effect/rune) || istype(R, /obj/effect/decal/cleanable) || istype(R, /obj/effect/overlay)) + del(R) + + for(var/obj/item/cleaned_item in tile) + cleaned_item.clean_blood() + + for(var/mob/living/carbon/human/cleaned_human in tile) //HUE HUE I CLEAN U + if(cleaned_human.lying) + cleaned_human.clean_blood() + cleaned_human << "\red [src] cleans your face!" + for(var/obj/item/carried_item in cleaned_human.contents) + carried_item.clean_blood() + return /mob/living/silicon/robot/proc/reset_module() modtype = "robot" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index ffe76a3b76c..ae36d76944c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -163,9 +163,7 @@ New() ..() - src.modules += new /obj/item/weapon/cleaner(src) - src.modules += new /obj/item/weapon/mop(src) - src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src) + src.modules += new /obj/item/weapon/soap/nanotrasen(src) src.modules += new /obj/item/weapon/trashbag(src) src.emag = new /obj/item/weapon/cleaner(src) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index fa15f854fdf..9ac8ee68130 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1149,3 +1149,66 @@ note dizziness decrements automatically in the mob's Life() proc. /mob/proc/AdjustParalysis(amount) paralysis = max(paralysis + amount,0) return + +// ++++ROCKDTBEN++++ MOB PROCS -- Ask me before touching + +/mob/proc/getBruteLoss() + return bruteloss + +/mob/proc/adjustBruteLoss(var/amount) + bruteloss = max(bruteloss + amount, 0) + +/mob/proc/getOxyLoss() + return oxyloss + +/mob/proc/adjustOxyLoss(var/amount) + oxyloss = max(oxyloss + amount, 0) + +/mob/proc/setOxyLoss(var/amount) + oxyloss = amount + +/mob/proc/getToxLoss() + return toxloss + +/mob/proc/adjustToxLoss(var/amount) + toxloss = max(toxloss + amount, 0) + +/mob/proc/setToxLoss(var/amount) + toxloss = amount + +/mob/proc/getFireLoss() + return fireloss + +/mob/proc/adjustFireLoss(var/amount) + fireloss = max(fireloss + amount, 0) + +/mob/proc/getCloneLoss() + return cloneloss + +/mob/proc/adjustCloneLoss(var/amount) + cloneloss = max(cloneloss + amount, 0) + +/mob/proc/setCloneLoss(var/amount) + cloneloss = amount + +/mob/proc/getHalLoss() + return halloss + +/mob/proc/adjustHalLoss(var/amount) + halloss = max(halloss + amount, 0) + +/mob/proc/setHalLoss(var/amount) + halloss = amount + + + +/mob/proc/getBrainLoss() + return brainloss + +/mob/proc/adjustBrainLoss(var/amount) + brainloss = max(brainloss + amount, 0) + +/mob/proc/setBrainLoss(var/amount) + brainloss = amount + +// ++++ROCKDTBEN++++ MOB PROCS //END \ No newline at end of file diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 1da6a25f4f3..a727014738f 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -288,58 +288,3 @@ the mob is also allowed to move without any sort of restriction. For instance, i //Singularity wants you! var/grav_delay = 0 var/being_strangled = 0 - - - -// ++++ROCKDTBEN++++ MOB PROCS - -/mob/proc/getBruteLoss() - return bruteloss - -/mob/proc/adjustBruteLoss(var/amount) - bruteloss = max(bruteloss + amount, 0) - -/mob/proc/getOxyLoss() - return oxyloss - -/mob/proc/adjustOxyLoss(var/amount) - oxyloss = max(oxyloss + amount, 0) - -/mob/proc/setOxyLoss(var/amount) - oxyloss = amount - -/mob/proc/getToxLoss() - return toxloss - -/mob/proc/adjustToxLoss(var/amount) - toxloss = max(toxloss + amount, 0) - -/mob/proc/setToxLoss(var/amount) - toxloss = amount - -/mob/proc/getFireLoss() - return fireloss - -/mob/proc/adjustFireLoss(var/amount) - fireloss = max(fireloss + amount, 0) - -/mob/proc/getCloneLoss() - return cloneloss - -/mob/proc/adjustCloneLoss(var/amount) - cloneloss = max(cloneloss + amount, 0) - -/mob/proc/setCloneLoss(var/amount) - cloneloss = amount - -/mob/proc/getBrainLoss() - return brainloss - -/mob/proc/adjustBrainLoss(var/amount) - brainloss = max(brainloss + amount, 0) - -/mob/proc/setBrainLoss(var/amount) - brainloss = amount - -// ++++ROCKDTBEN++++ MOB PROCS //END - diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 94b761882b4..8a4514cfee7 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -14,6 +14,7 @@ last_power = 0 active = 0 locked = 0 + drainratio = 1 process() if(P) @@ -21,7 +22,7 @@ P.air_contents.toxins = 0 eject() else - P.air_contents.toxins -= 0.001 + P.air_contents.toxins -= 0.001*drainratio return diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index c6acb29eb54..1377d5934d9 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -76,7 +76,8 @@ field_generator power level display power = field_generator_max_power anchored = 1 warming_up = 3 - turn_on() + start_fields() + update_icon() Varedit_start = 0 if(src.active == 2) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 2e86e4fea35..2233b41d551 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -1,5 +1,5 @@ /obj/item/weapon/gun/energy/laser - name = "\improper Laser Gun" + name = "laser gun" desc = "a basic weapon designed kill with concentrated energy bolts" icon_state = "laser" item_state = "laser" @@ -17,7 +17,7 @@ obj/item/weapon/gun/energy/laser/retro - name ="\improper Retro Laser" + name ="retro laser" icon_state = "retro" desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws." @@ -68,9 +68,84 @@ obj/item/weapon/gun/energy/laser/retro /obj/item/weapon/gun/energy/lasercannon - name = "\improper Laser Cannon" + name = "laser cannon" desc = "With the L.A.S.E.R. cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!" icon_state = "lasercannon" fire_sound = 'lasercannonfire.ogg' origin_tech = "combat=4;materials=3;powerstorage=3" projectile_type = "/obj/item/projectile/beam/heavylaser" + + + + + +////////Laser Tag//////////////////// + +/obj/item/weapon/gun/energy/laser/bluetag + name = "laser tag gun" + icon_state = "bluetag" + desc = "Standard issue weapon of the Imperial Guard" + projectile_type = "/obj/item/projectile/bluetag" + + special_check(var/mob/living/carbon/human/M) + if(ishuman(M)) + if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag)) + return 1 + M << "\red You need to be wearing your laser tag vest!" + return 0 + var/charge_tick = 0 + + + New() + ..() + processing_objects.Add(src) + + + Del() + processing_objects.Remove(src) + ..() + + + process() + charge_tick++ + if(charge_tick < 4) return 0 + charge_tick = 0 + if(!power_supply) return 0 + power_supply.give(100) + update_icon() + return 1 + + + +/obj/item/weapon/gun/energy/laser/redtag + name = "laser tag gun" + icon_state = "redtag" + desc = "Standard issue weapon of the Imperial Guard" + projectile_type = "/obj/item/projectile/redtag" + var/charge_tick = 0 + + special_check(var/mob/living/carbon/human/M) + if(ishuman(M)) + if(istype(M.wear_suit, /obj/item/clothing/suit/redtag)) + return 1 + M << "\red You need to be wearing your laser tag vest!" + return 0 + + New() + ..() + processing_objects.Add(src) + + + Del() + processing_objects.Remove(src) + ..() + + + process() + charge_tick++ + if(charge_tick < 4) return 0 + charge_tick = 0 + if(!power_supply) return 0 + power_supply.give(100) + update_icon() + return 1 \ No newline at end of file diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index d9606bcd987..12e0ca517df 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -1,5 +1,5 @@ /obj/item/projectile/beam - name = "\improper Laser" + name = "laser" icon_state = "laser" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE damage = 40 @@ -56,20 +56,21 @@ flag = "laser" eyeblur = 2 + /obj/item/projectile/beam/heavylaser - name = "\improper Heavy Laser" + name = "heavy laser" icon_state = "heavylaser" damage = 60 /obj/item/projectile/beam/pulse - name = "\improper Pulse" + name = "pulse" icon_state = "u_laser" damage = 40 /obj/item/projectile/beam/deathlaser - name = "\improper Death Laser" + name = "death laser" icon_state = "heavylaser" damage = 60 @@ -79,4 +80,32 @@ +/obj/item/projectile/bluetag + name = "lasertag beam" + icon_state = "ice_2" + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + damage = 0 + damage_type = BURN + flag = "laser" + on_hit(var/atom/target, var/blocked = 0) + if(istype(target, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = target + if(istype(M.wear_suit, /obj/item/clothing/suit/redtag)) + M.Weaken(5) + return 1 + +/obj/item/projectile/redtag + name = "lasertag beam" + icon_state = "laser" + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + damage = 0 + damage_type = BURN + flag = "laser" + + on_hit(var/atom/target, var/blocked = 0) + if(istype(target, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = target + if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag)) + M.Weaken(5) + return 1 \ No newline at end of file diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 027e9afecab..15135220b22 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -511,7 +511,7 @@ for (var/mob/V in viewers(usr)) V.show_message("[user] dunks [GM.name] into the toilet!", 3) if(do_after(user, 30)) - if(G.state>1&&!GM.internal) + if(G && G.state>1 && !GM.internal) GM.oxyloss += 5 else if(I.w_class < 4) diff --git a/code/setup.dm b/code/setup.dm index 3d174db55fd..c3e5a03ce55 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -281,3 +281,5 @@ var/static/list/scarySounds = list('thudswoosh.ogg','Taser.ogg','armbomb.ogg','h #define SEC_LEVEL_BLUE 1 #define SEC_LEVEL_RED 2 #define SEC_LEVEL_DELTA 3 + +#define TRANSITIONEDGE 7 //Distance from edge to move to another z-level \ No newline at end of file diff --git a/code/unused/_debug.dm b/code/unused/_debug.dm index b9cbcdf4306..ced557f197e 100644 --- a/code/unused/_debug.dm +++ b/code/unused/_debug.dm @@ -615,3 +615,5 @@ Doing this because FindTurfs() isn't even used playsound(pt.loc, 'explosionfar.ogg', 100, 1,10) pt.gas.temperature = 500+T0C pt.ignite() + + diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index 9aa23ca974b..14e84d67326 100644 Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi index 30f36441a35..a35fc84e968 100644 Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ diff --git a/icons/mob/livestock.dmi b/icons/mob/livestock.dmi index d8a5fd79f0f..d83b8209668 100644 Binary files a/icons/mob/livestock.dmi and b/icons/mob/livestock.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 6502aeaa3f6..1f503ac05c8 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/obj/harvest.dmi b/icons/obj/harvest.dmi index 9b34ebfb4ad..6405a1e47dd 100644 Binary files a/icons/obj/harvest.dmi and b/icons/obj/harvest.dmi differ diff --git a/icons/obj/seeds.dmi b/icons/obj/seeds.dmi index aa5a3613af4..e8d9ae4daf9 100644 Binary files a/icons/obj/seeds.dmi and b/icons/obj/seeds.dmi differ diff --git a/sound/effects/glassknock.ogg b/sound/effects/glassknock.ogg index efdb198fd39..8878dda8013 100644 Binary files a/sound/effects/glassknock.ogg and b/sound/effects/glassknock.ogg differ