diff --git a/.travis.yml b/.travis.yml
index a7e048d1029..399b67e07d1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,7 +4,7 @@ sudo: false
env:
BYOND_MAJOR="510"
BYOND_MINOR="1346"
- MACRO_COUNT=1233
+ MACRO_COUNT=1178
cache:
directories:
diff --git a/code/controllers/Processes/garbage.dm b/code/controllers/Processes/garbage.dm
index 57399c82b9f..44de0d0216c 100644
--- a/code/controllers/Processes/garbage.dm
+++ b/code/controllers/Processes/garbage.dm
@@ -139,7 +139,6 @@ world/loop_checks = 0
return
if(!istype(A))
warning("qdel() passed object of type [A.type]. qdel() can only handle /datum types.")
- crash_with("qdel() passed object of type [A.type]. qdel() can only handle /datum types.")
del(A)
if(garbage_collector)
garbage_collector.total_dels++
diff --git a/code/game/machinery/computer3/computers/camera.dm.back b/code/game/machinery/computer3/computers/camera.dm.back
deleted file mode 100644
index 642e199afca..00000000000
--- a/code/game/machinery/computer3/computers/camera.dm.back
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- Camera monitoring computers
-
- NOTE: If we actually split the station camera network into regions that will help with sorting through the
- tediously large list of cameras. The new camnet_key architecture lets you switch between keys easily,
- so you don't lose the capability of seeing everything, you just switch to a subnet.
-*/
-
-/obj/machinery/computer3/security
- default_prog = /datum/file/program/security
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/cameras)
- spawn_files = list(/datum/file/camnet_key)
- icon_state = "frame-sec"
-
-
-/obj/machinery/computer3/security/wooden_tv
- name = "security cameras"
- desc = "An old TV hooked into the stations camera network."
- icon = 'icons/obj/computer.dmi'
- icon_state = "security_det"
-
- legacy_icon = 1
- allow_disassemble = 0
-
- // No operating system
- New()
- ..(built=0)
- os = program
- circuit.OS = os
-
-
-/obj/machinery/computer3/security/mining
- name = "Outpost Cameras"
- desc = "Used to access the various cameras on the outpost."
- spawn_files = list(/datum/file/camnet_key/mining)
-
-/*
- Camera monitoring computers, wall-mounted
-*/
-/obj/machinery/computer3/wall_comp/telescreen
- default_prog = /datum/file/program/security
- spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/networking/cameras)
- spawn_files = list(/datum/file/camnet_key)
-
-/obj/machinery/computer3/wall_comp/telescreen/entertainment
- desc = "Damn, they better have /tg/thechannel on these things."
- spawn_files = list(/datum/file/camnet_key/entertainment)
-
-
-/*
- File containing an encrypted camera network key.
-
- (Where by encrypted I don't actually mean encrypted at all)
-*/
-/datum/file/camnet_key
- name = "Security Camera Network Main Key"
- var/title = "Station"
- var/desc = "Connects to station security cameras."
- var/networks = list("ALL") // A little workaround as it is not possible to place station_networks here
- var/screen = "cameras"
-
- execute(var/datum/file/source)
- if(istype(source,/datum/file/program/security))
- var/datum/file/program/security/prog = source
- prog.key = src
- prog.camera_list = null
- return
- if(istype(source,/datum/file/program/ntos))
- for(var/obj/item/part/computer/storage/S in list(computer.hdd,computer.floppy))
- for(var/datum/file/F in S.files)
- if(istype(F,/datum/file/program/security))
- var/datum/file/program/security/Sec = F
- Sec.key = src
- Sec.camera_list = null
- Sec.execute(source)
- return
- computer.Crash(MISSING_PROGRAM)
-
-/datum/file/camnet_key/New()
- for(var/N in networks)
- if(N == "ALL")
- networks = station_networks
- break
- return ..()
-
-/datum/file/camnet_key/mining
- name = "Mining Camera Network Key"
- title = "mining station"
- desc = "Connects to mining security cameras."
- networks = list(NETWORK_MINE)
- screen = "miningcameras"
-
-/datum/file/camnet_key/research
- name = "Research Camera Network Key"
- title = "research"
- networks = list(NETWORK_RESEARCH)
-
-/datum/file/camnet_key/bombrange
- name = "R&D Bomb Range Camera Network Key"
- title = "bomb range"
- desc = "Monitors the bomb range."
- networks = list(NETWORK_RESEARCH)
-
-/datum/file/camnet_key/xeno
- name = "R&D Misc. Research Camera Network Key"
- title = "special research"
- networks = list(NETWORK_RESEARCH)
-
-/datum/file/camnet_key/singulo
- name = "Singularity Camera Network Key"
- title = "singularity"
- networks = list(NETWORK_ENGINE)
-
-/datum/file/camnet_key/entertainment
- name = "Entertainment Channel Encryption Key"
- title = "entertainment"
- desc = "Damn, I hope they have /tg/thechannel on here."
- networks = list(NETWORK_THUNDER)
- screen = "entertainment"
-
-/datum/file/camnet_key/creed
- name = "Special Ops Camera Encryption Key"
- title = "special ops"
- desc = "Connects to special ops secure camera feeds."
- networks = list(NETWORK_ERT)
-
-/datum/file/camnet_key/prison
- name = "Prison Camera Network Key"
- title = "prison"
- desc = "Monitors the prison."
- networks = list(NETWORK_SECURITY)
-
-/datum/file/camnet_key/syndicate
- name = "Camera Network Key"
- title = "%!#BUFFER OVERFLOW"
- desc = "Connects to security cameras."
- networks = list("ALL")
- hidden_file = 1
-
-
-/*
- Computer part needed to connect to cameras
-*/
-
-/obj/item/part/computer/networking/cameras
- name = "camera network access module"
- desc = "Connects a computer to the camera network."
-
- // I have no idea what the following does
- var/mapping = 0//For the overview file, interesting bit of code.
-
- //proc/camera_list(var/datum/file/camnet_key/key)
- get_machines(var/datum/file/camnet_key/key)
- if (!computer || computer.z > 6)
- return null
-
- cameranet.process_sort()
-
- var/list/L = list()
- for(var/obj/machinery/camera/C in cameranet.cameras)
- var/list/temp = C.network & key.networks
- if(temp.len)
- L.Add(C)
-
- return L
- verify_machine(var/obj/machinery/camera/C,var/datum/file/camnet_key/key = null)
- if(!istype(C) || !C.can_use())
- return 0
-
- if(key)
- var/list/temp = C.network & key.networks
- if(!temp.len)
- return 0
- return 1
-
-/*
- Camera monitoring program
-
- The following things should break you out of the camera view:
- * The computer resetting, being damaged, losing power, etc
- * The program quitting
- * Closing the window
- * Going out of range of the computer
- * Becoming incapacitated
- * The camera breaking, emping, disconnecting, etc
-*/
-
-/datum/file/program/security
- name = "camera monitor"
- desc = "Connects to the Nanotrasen Camera Network"
- image = 'icons/ntos/camera.png'
- active_state = "camera-static"
-
- var/datum/file/camnet_key/key = null
- var/last_pic = 1.0
- var/last_camera_refresh = 0
- var/camera_list = null
-
- var/obj/machinery/camera/current = null
-
- execute(var/datum/file/program/caller)
- ..(caller)
- if(computer && !key)
- var/list/fkeys = computer.list_files(/datum/file/camnet_key)
- if(fkeys && fkeys.len)
- key = fkeys[1]
- update_icon()
- computer.update_icon()
- for(var/mob/living/L in viewers(1))
- if(!istype(L,/mob/living/silicon/ai) && L.machine == src)
- L.reset_view(null)
-
-
- Reset()
- ..()
- reset_current()
- for(var/mob/living/L in viewers(1))
- if(!istype(L,/mob/living/silicon/ai) && L.machine == src)
- L.reset_view(null)
-
- interact()
- if(!interactable())
- return
-
- if(!computer.camnet)
- computer.Crash(MISSING_PERIPHERAL)
- return
-
- if(!key)
- var/list/fkeys = computer.list_files(/datum/file/camnet_key)
- if(fkeys && fkeys.len)
- key = fkeys[1]
- update_icon()
- computer.update_icon()
- if(!key)
- return
-
- if(computer.camnet.verify_machine(current))
- usr.reset_view(current)
-
- if(world.time - last_camera_refresh > 50 || !camera_list)
- last_camera_refresh = world.time
-
- var/list/temp_list = computer.camnet.get_machines(key)
-
- camera_list = "Network Key: [key.title] [topic_link(src,"keyselect","\[ Select key \]")]
"
- for(var/obj/machinery/camera/C in temp_list)
- if(C.can_use())
- camera_list += "[C.c_tag] - [topic_link(src,"show=\ref[C]","Show")]
"
- else
- camera_list += "[C.c_tag] - DEACTIVATED
"
- //camera_list += "
" + topic_link(src,"close","Close")
-
- popup.set_content(camera_list)
- popup.open()
-
-
- update_icon()
- if(key)
- overlay.icon_state = key.screen
- name = key.title + " Camera Monitor"
- else
- overlay.icon_state = "camera-static"
- name = initial(name)
-
-
-
- Topic(var/href,var/list/href_list)
- if(!interactable() || !computer.camnet || ..(href,href_list))
- return
-
- if("show" in href_list)
- var/obj/machinery/camera/C = locate(href_list["show"])
- if(istype(C) && C.can_use())
- set_current(C)
- usr.reset_view(C)
- return
-
- if("keyselect" in href_list)
- reset_current()
- usr.reset_view(null)
- key = input(usr,"Select a camera network key:", "Key Select", null) as null|anything in computer.list_files(/datum/file/camnet_key)
- select_key(key)
- if(key)
- interact()
- else
- usr << "The screen turns to static."
- return
-
-/datum/file/program/security/proc/select_key(var/selected_key)
- key = selected_key
- camera_list = null
- update_icon()
- computer.update_icon()
-
-/datum/file/program/security/proc/set_current(var/obj/machinery/camera/C)
- if(current == C)
- return
-
- if(current)
- reset_current()
-
- src.current = C
- if(current)
- var/mob/living/L = current.loc
- if(istype(L))
- L.tracking_initiated()
-
-/datum/file/program/security/proc/reset_current()
- if(current)
- var/mob/living/L = current.loc
- if(istype(L))
- L.tracking_cancelled()
- current = null
-
- // Atlantis: Required for camnetkeys to work.
-/datum/file/program/security/hidden
- hidden_file = 1
-
-/*
- Camera monitoring program
-
- Works much as the parent program, except:
- * It requires a camera to be found using the proximity network card.
- * It begins with all cam-access.
-*/
-
-/datum/file/program/security/syndicate
- name = "camer# moni!%r"
- desc = "Cons the Nanotrash Camera Network"
- var/special_key = new/datum/file/camnet_key/syndicate
- var/camera_conn = null
-
- interact()
- if(!interactable())
- return
-
- if(!computer.net)
- computer.Crash(MISSING_PERIPHERAL)
- return
-
- camera_conn = computer.net.connect_to(/obj/machinery/camera,camera_conn)
-
- if(!camera_conn)
- computer.Crash(NETWORK_FAILURE)
- return
-
- // On interact, override camera key selection
- select_key(special_key)
- ..()
diff --git a/code/game/machinery/turrets.dm.back b/code/game/machinery/turrets.dm.back
deleted file mode 100644
index 5d578e11ced..00000000000
--- a/code/game/machinery/turrets.dm.back
+++ /dev/null
@@ -1,513 +0,0 @@
-/area/turret_protected
- name = "Turret Protected Area"
- var/list/turretTargets = list()
-
-/area/turret_protected/proc/subjectDied(target)
- if( isliving(target) )
- if( !issilicon(target) )
- var/mob/living/L = target
- if( L.stat )
- if( L in turretTargets )
- src.Exited(L)
-
-
-/area/turret_protected/Entered(O)
- ..()
- if( iscarbon(O) )
- turretTargets |= O
- else if( istype(O, /obj/mecha) )
- var/obj/mecha/Mech = O
- if( Mech.occupant )
- turretTargets |= Mech
- else if(istype(O,/mob/living/simple_animal))
- turretTargets |= O
- return 1
-
-/area/turret_protected/Exited(O)
- if( ismob(O) && !issilicon(O) )
- turretTargets -= O
- else if( istype(O, /obj/mecha) )
- turretTargets -= O
- ..()
- return 1
-
-
-/obj/machinery/turret
- name = "turret"
- icon = 'icons/obj/turrets.dmi'
- icon_state = "grey_target_prism"
- var/raised = 0
- var/enabled = 1
- anchored = 1
- layer = 3
- invisibility = INVISIBILITY_LEVEL_TWO
- density = 1
- var/lasers = 0
- var/lasertype = 1
- // 1 = lasers
- // 2 = cannons
- // 3 = pulse
- // 4 = change (HONK)
- // 5 = bluetag
- // 6 = redtag
- var/health = 80
- var/maxhealth = 80
- var/auto_repair = 0
- var/obj/machinery/turretcover/cover = null
- var/popping = 0
- var/wasvalid = 0
- var/lastfired = 0
- var/shot_delay = 30 //3 seconds between shots
- var/datum/effect/effect/system/spark_spread/spark_system
- use_power = 1
- idle_power_usage = 50
- active_power_usage = 300
-// var/list/targets
- var/atom/movable/cur_target
- var/targeting_active = 0
- var/area/turret_protected/protected_area
-
-/obj/machinery/turret/proc/take_damage(damage)
- src.health -= damage
- if(src.health<=0)
- qdel(src)
- return
-
-/obj/machinery/turret/attack_hand(var/mob/living/carbon/human/user)
-
- if(!istype(user))
- return ..()
-
- if(user.species.can_shred(user) && !(stat & BROKEN))
- playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1)
- visible_message("\red [user] has slashed at [src]!")
- src.take_damage(15)
- return
-
-/obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj)
- if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN))
- return
- take_damage(Proj.damage)
- ..()
- return
-
-/obj/machinery/turret/New()
- maxhealth = health
- spark_system = new /datum/effect/effect/system/spark_spread
- spark_system.set_up(5, 0, src)
- spark_system.attach(src)
-// targets = new
- ..()
- return
-
-/obj/machinery/turret/proc/update_health()
- if(src.health<=0)
- qdel(src)
- return
-
-/obj/machinery/turretcover
- name = "pop-up turret cover"
- icon = 'icons/obj/turrets.dmi'
- icon_state = "turretCover"
- anchored = 1
- layer = 3.5
- density = 0
- var/obj/machinery/turret/host = null
-
-/obj/machinery/turret/proc/isPopping()
- return (popping!=0)
-
-/obj/machinery/turret/power_change()
- ..()
- if(stat & BROKEN)
- icon_state = "grey_target_prism"
- else
- if( !(stat & NOPOWER) )
- if (src.enabled)
- if (src.lasers)
- icon_state = "orange_target_prism"
- else
- icon_state = "target_prism"
- else
- icon_state = "grey_target_prism"
- stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- src.icon_state = "grey_target_prism"
- stat |= NOPOWER
-
-/obj/machinery/turret/proc/setState(var/enabled, var/lethal)
- src.enabled = enabled
- src.lasers = lethal
- src.power_change()
-
-
-/obj/machinery/turret/proc/get_protected_area()
- var/area/turret_protected/TP = get_area(src)
- if(istype(TP))
- return TP
- return
-
-/obj/machinery/turret/proc/check_target(var/atom/movable/T as mob|obj)
- if( T && T in protected_area.turretTargets )
- var/area/area_T = get_area(T)
- if( !area_T || (area_T.type != protected_area.type) )
- protected_area.Exited(T)
- return 0 //If the guy is somehow not in the turret's area (teleportation), get them out the damn list. --NEO
- if( iscarbon(T) )
- var/mob/living/carbon/MC = T
- if( !MC.stat )
- if( !MC.lying || lasers )
- return 1
- else if( istype(T, /obj/mecha) )
- var/obj/mecha/ME = T
- if( ME.occupant )
- return 1
- else if(istype(T,/mob/living/simple_animal))
- var/mob/living/simple_animal/A = T
- if( !A.stat )
- if(lasers)
- return 1
- return 0
-
-/obj/machinery/turret/proc/get_new_target()
- var/list/new_targets = new
- var/new_target
- for(var/mob/living/carbon/M in protected_area.turretTargets)
- if(!M.stat)
- if(!M.lying || lasers)
- new_targets += M
- for(var/obj/mecha/M in protected_area.turretTargets)
- if(M.occupant)
- new_targets += M
- for(var/mob/living/simple_animal/M in protected_area.turretTargets)
- if(!M.stat)
- new_targets += M
- if(new_targets.len)
- new_target = pick(new_targets)
- return new_target
-
-
-/obj/machinery/turret/process()
- if(stat & (NOPOWER|BROKEN))
- return
- if(src.cover==null)
- src.cover = new /obj/machinery/turretcover(src.loc)
- src.cover.host = src
- protected_area = get_protected_area()
- if(!enabled || !protected_area || protected_area.turretTargets.len<=0)
- if(!isDown() && !isPopping())
- popDown()
- return
- if(!check_target(cur_target)) //if current target fails target check
- cur_target = get_new_target() //get new target
-
- if(cur_target) //if it's found, proceed
-// world << "[cur_target]"
- if(!isPopping())
- if(isDown())
- popUp()
- use_power = 2
- else
- spawn()
- if(!targeting_active)
- targeting_active = 1
- target()
- targeting_active = 0
-
- if(prob(15))
- if(prob(50))
- playsound(src.loc, 'sound/effects/turret/move1.wav', 60, 1)
- else
- playsound(src.loc, 'sound/effects/turret/move2.wav', 60, 1)
- else if(!isPopping())//else, pop down
- if(!isDown())
- popDown()
- use_power = 1
-
- // Auto repair requires massive amount of power, but slowly regenerates the turret's health.
- // Currently only used by malfunction hardware, but may be used as admin-settable option too.
- if(auto_repair)
- if(health < maxhealth)
- use_power(20000)
- health = min(health + 1, maxhealth)
- return
-
-
-/obj/machinery/turret/proc/target()
- while(src && enabled && !stat && check_target(cur_target))
- src.set_dir(get_dir(src, cur_target))
- shootAt(cur_target)
- sleep(shot_delay)
- return
-
-/obj/machinery/turret/proc/shootAt(var/atom/movable/target)
- var/turf/T = get_turf(src)
- var/turf/U = get_turf(target)
- if (!T || !U)
- return
- var/obj/item/projectile/A
- if (src.lasers)
- switch(lasertype)
- if(1)
- A = new /obj/item/projectile/beam( loc )
- if(2)
- A = new /obj/item/projectile/beam/heavylaser( loc )
- if(3)
- A = new /obj/item/projectile/beam/pulse( loc )
- if(4)
- A = new /obj/item/projectile/change( loc )
- if(5)
- A = new /obj/item/projectile/beam/lastertag/blue( loc )
- if(6)
- A = new /obj/item/projectile/beam/lastertag/red( loc )
- use_power(500)
- else
- A = new /obj/item/projectile/energy/electrode( loc )
- use_power(200)
-
- //Turrets aim for the center of mass by default.
- //If the target is grabbing someone then the turret smartly aims for extremities
- var/def_zone = get_exposed_defense_zone(target)
-
- A.launch(target, def_zone)
-
- return
-
-
-/obj/machinery/turret/proc/isDown()
- return (invisibility!=0)
-
-/obj/machinery/turret/proc/popUp()
- if ((!isPopping()) || src.popping==-1)
- invisibility = 0
- popping = 1
- playsound(src.loc, 'sound/effects/turret/open.wav', 60, 1)
- if (src.cover!=null)
- flick("popup", src.cover)
- src.cover.icon_state = "openTurretCover"
- spawn(10)
- if (popping==1) popping = 0
-
-/obj/machinery/turret/proc/popDown()
- if ((!isPopping()) || src.popping==1)
- popping = -1
- playsound(src.loc, 'sound/effects/turret/open.wav', 60, 1)
- if (src.cover!=null)
- flick("popdown", src.cover)
- src.cover.icon_state = "turretCover"
- spawn(10)
- if (popping==-1)
- invisibility = INVISIBILITY_LEVEL_TWO
- popping = 0
-
-/obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj)
- if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN))
- return
- src.health -= Proj.damage
- ..()
- if(prob(45) && Proj.damage > 0) src.spark_system.start()
- qdel (Proj)
- if (src.health <= 0)
- src.die()
- return
-
-/obj/machinery/turret/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N
- ..()
- playsound(src.loc, 'sound/weapons/smash.ogg', 60, 1)
- src.spark_system.start()
- src.health -= W.force * 0.5
- if (src.health <= 0)
- src.die()
- return
-
-/obj/machinery/turret/emp_act(severity)
- switch(severity)
- if(1)
- enabled = 0
- lasers = 0
- power_change()
- ..()
-
-/obj/machinery/turret/ex_act(severity)
- if(severity < 3)
- src.die()
-
-/obj/machinery/turret/proc/die()
- src.health = 0
- src.density = 0
- src.stat |= BROKEN
- src.icon_state = "destroyed_target_prism"
- if (cover!=null)
- qdel(cover)
- sleep(3)
- flick("explosion", src)
- spawn(13)
- qdel(src)
-
-/obj/machinery/turret/attack_generic(var/mob/user, var/damage, var/attack_message)
- if(!damage)
- return 0
- if(stat & BROKEN)
- user << "That object is useless to you."
- return 0
- user.do_attack_animation(src)
- visible_message("[user] [attack_message] the [src]!")
- user.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
- src.health -= damage
- if (src.health <= 0)
- src.die()
- return 1
-
-/obj/structure/turret/gun_turret
- name = "Gun Turret"
- density = 1
- anchored = 1
- var/cooldown = 20
- var/projectiles = 100
- var/projectiles_per_shot = 2
- var/deviation = 0.3
- var/list/exclude = list()
- var/atom/cur_target
- var/scan_range = 7
- var/health = 40
- var/list/scan_for = list("human"=0,"cyborg"=0,"mecha"=0,"alien"=1)
- var/on = 0
- icon = 'icons/obj/turrets.dmi'
- icon_state = "gun_turret"
-
- proc/take_damage(damage)
- src.health -= damage
- if(src.health<=0)
- qdel(src)
- return
-
-
- bullet_act(var/obj/item/projectile/Proj)
- if(Proj.damage_type == HALLOSS)
- return
- take_damage(Proj.damage)
- ..()
- return
-
-
- ex_act()
- qdel(src)
- return
-
- emp_act()
- qdel(src)
- return
-
- meteorhit()
- qdel(src)
- return
-
- attack_hand(mob/user as mob)
- user.set_machine(src)
- var/dat = {"
- [src] Control
-
- Power: [on?"on":"off"]
- Scan Range: - [scan_range] +
- Scan for: "}
- for(var/scan in scan_for)
- dat += ""
-
- dat += {"Ammo: [max(0, projectiles)]
-
- "}
- user << browse(dat, "window=turret")
- onclose(user, "turret")
- return
-
- attack_ai(mob/user as mob)
- return attack_hand(user)
-
- Topic(href, href_list)
- if(href_list["power"])
- src.on = !src.on
- if(src.on)
- spawn(50)
- if(src)
- src.process()
- if(href_list["scan_range"])
- src.scan_range = between(1,src.scan_range+text2num(href_list["scan_range"]),8)
- if(href_list["scan_for"])
- if(href_list["scan_for"] in scan_for)
- scan_for[href_list["scan_for"]] = !scan_for[href_list["scan_for"]]
- src.updateUsrDialog()
- return
-
-
- proc/validate_target(atom/target)
- if(get_dist(target, src)>scan_range)
- return 0
- if(istype(target, /mob))
- var/mob/M = target
- if(!M.stat && !M.lying)//ninjas can't catch you if you're lying
- return 1
- else if(istype(target, /obj/mecha))
- return 1
- return 0
-
-
- process()
- spawn while(on)
- if(projectiles<=0)
- on = 0
- return
- if(cur_target && !validate_target(cur_target))
- cur_target = null
- if(!cur_target)
- cur_target = get_target()
- fire(cur_target)
- sleep(cooldown)
- return
-
- proc/get_target()
- var/list/pos_targets = list()
- var/target = null
- if(scan_for["human"])
- for(var/mob/living/carbon/human/M in oview(scan_range,src))
- if(M.stat || M.lying || M in exclude)
- continue
- pos_targets += M
- if(scan_for["cyborg"])
- for(var/mob/living/silicon/M in oview(scan_range,src))
- if(M.stat || M.lying || M in exclude)
- continue
- pos_targets += M
- if(scan_for["mecha"])
- for(var/obj/mecha/M in oview(scan_range, src))
- if(M in exclude)
- continue
- pos_targets += M
- if(scan_for["alien"])
- for(var/mob/living/carbon/alien/M in oview(scan_range,src))
- if(M.stat || M.lying || M in exclude)
- continue
- pos_targets += M
- if(pos_targets.len)
- target = pick(pos_targets)
- return target
-
-
- proc/fire(atom/target)
- if(!target)
- cur_target = null
- return
- src.set_dir(get_dir(src,target))
- spawn for(var/i=1 to min(projectiles, projectiles_per_shot))
- if(!src) break
- var/turf/curloc = get_turf(src)
-
- playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1)
- var/obj/item/projectile/A = new /obj/item/projectile(curloc)
- src.projectiles--
-
- var/def_zone = get_exposed_defense_zone(target)
-
- A.launch(target, def_zone)
- sleep(2)
- return
diff --git a/code/game/verbs/suicide.dm.back b/code/game/verbs/suicide.dm.back
deleted file mode 100644
index 13a565b5c80..00000000000
--- a/code/game/verbs/suicide.dm.back
+++ /dev/null
@@ -1,182 +0,0 @@
-/mob/var/suiciding = 0
-
-/mob/living/carbon/human/verb/suicide()
- set hidden = 1
-
- if (stat == DEAD)
- src << "You're already dead!"
- return
-
- if (!ticker)
- src << "You can't commit suicide before the game starts!"
- return
-
- if(!player_is_antag(mind))
- message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1)
- src << "No. Adminhelp if there is a legitimate reason."
- return
-
- if (suiciding)
- src << "You're already committing suicide! Be patient!"
- return
-
- var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
-
- if(confirm == "Yes")
- if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide
- src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))"
- return
- suiciding = 1
- var/obj/item/held_item = get_active_hand()
- if(held_item)
- var/damagetype = held_item.suicide_act(src)
- if(damagetype)
- log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]")
- var/damage_mod = 1
- switch(damagetype) //Sorry about the magic numbers.
- //brute = 1, burn = 2, tox = 4, oxy = 8
- if(15) //4 damage types
- damage_mod = 4
-
- if(6, 11, 13, 14) //3 damage types
- damage_mod = 3
-
- if(3, 5, 7, 9, 10, 12) //2 damage types
- damage_mod = 2
-
- if(1, 2, 4, 8) //1 damage type
- damage_mod = 1
-
- else //This should not happen, but if it does, everything should still work
- damage_mod = 1
-
- //Do 175 damage divided by the number of damage types applied.
- if(damagetype & BRUTELOSS)
- adjustBruteLoss(30/damage_mod) //hack to prevent gibbing
- adjustOxyLoss(145/damage_mod)
-
- if(damagetype & FIRELOSS)
- adjustFireLoss(175/damage_mod)
-
- if(damagetype & TOXLOSS)
- adjustToxLoss(175/damage_mod)
-
- if(damagetype & OXYLOSS)
- adjustOxyLoss(175/damage_mod)
-
- //If something went wrong, just do normal oxyloss
- if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS))
- adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
-
- updatehealth()
- return
-
- log_and_message_admins("[key_name(src)] commited suicide")
- viewers(src) << pick("\red [src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \
- "\red [src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \
- "\red [src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \
- "\red [src] is holding \his breath! It looks like \he's trying to commit suicide.")
- adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
- updatehealth()
-
-/mob/living/carbon/brain/verb/suicide()
- set hidden = 1
-
- if (stat == 2)
- src << "You're already dead!"
- return
-
- if (!ticker)
- src << "You can't commit suicide before the game starts!"
- return
-
- if (suiciding)
- src << "You're already committing suicide! Be patient!"
- return
-
- var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
-
- if(confirm == "Yes")
- suiciding = 1
- viewers(loc) << "\red [src]'s brain is growing dull and lifeless. It looks like it's lost the will to live."
- spawn(50)
- death(0)
- suiciding = 0
-
-/mob/living/silicon/ai/verb/suicide()
- set hidden = 1
-
- if (stat == 2)
- src << "You're already dead!"
- return
-
- if (suiciding)
- src << "You're already committing suicide! Be patient!"
- return
-
- var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
-
- if(confirm == "Yes")
- suiciding = 1
- viewers(src) << "\red [src] is powering down. It looks like \he's trying to commit suicide."
- //put em at -175
- adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
- updatehealth()
-
-/mob/living/silicon/robot/verb/suicide()
- set hidden = 1
-
- if (stat == 2)
- src << "You're already dead!"
- return
-
- if (suiciding)
- src << "You're already committing suicide! Be patient!"
- return
-
- var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
-
- if(confirm == "Yes")
- suiciding = 1
- viewers(src) << "\red [src] is powering down. It looks like \he's trying to commit suicide."
- //put em at -175
- adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
- updatehealth()
-
-/mob/living/silicon/pai/verb/suicide()
- set category = "pAI Commands"
- set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)"
- set name = "pAI Suicide"
- var/answer = input("REALLY kill yourself? This action can't be undone.", "Suicide", "No") in list ("Yes", "No")
- if(answer == "Yes")
-// var/obj/item/device/paicard/card = loc //why? This was causing runtime errors..
- card.removePersonality()
- if(src.loc != card)
- close_up()
- var/turf/T = get_turf_or_move(card.loc)
- for (var/mob/M in viewers(T))
- M.show_message("\blue [src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "\blue [src] bleeps electronically.", 2)
- death(0)
- else
- src << "Aborting suicide attempt."
-
-/mob/living/carbon/slime/verb/suicide()
- set hidden = 1
- if (stat == 2)
- src << "You're already dead!"
- return
-
- if (suiciding)
- src << "You're already committing suicide! Be patient!"
- return
-
- var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
-
- if(confirm == "Yes")
- suiciding = 1
- setOxyLoss(100)
- adjustBruteLoss(100 - getBruteLoss())
- setToxLoss(100)
- setCloneLoss(100)
-
- updatehealth()