mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 12:07:27 +01:00
@@ -636,34 +636,44 @@ var/list/ghostteleportlocs = list()
|
||||
requires_power = 0
|
||||
|
||||
/area/xenos_station/southwest
|
||||
name = "\improper Aft Port Solars"
|
||||
name = "\improper Aft Port Solars Landing Area"
|
||||
icon_state = "southwest"
|
||||
requires_power = 0
|
||||
|
||||
/area/xenos_station/northwest
|
||||
name = "\improper Fore Port Solars"
|
||||
name = "\improper Fore Port Solars Landing Area"
|
||||
icon_state = "northwest"
|
||||
requires_power = 0
|
||||
|
||||
/area/xenos_station/northeast
|
||||
name = "\improper Fore Starboard Solars"
|
||||
name = "\improper Fore Starboard Solars Landing Area"
|
||||
icon_state = "northeast"
|
||||
requires_power = 0
|
||||
|
||||
/area/xenos_station/southeast
|
||||
name = "\improper Aft Starboard Solars"
|
||||
name = "\improper Aft Starboard Solars Landing Area"
|
||||
icon_state = "southeast"
|
||||
requires_power = 0
|
||||
|
||||
/area/xenos_station/north
|
||||
/area/xenos_station/east
|
||||
name = "\improper East Landing Area"
|
||||
icon_state = "east"
|
||||
requires_power = 0
|
||||
|
||||
/area/xenos_station/west
|
||||
name = "\improper West Landing Area"
|
||||
icon_state = "west"
|
||||
requires_power = 0
|
||||
|
||||
/area/xenos_station/researchoutpost
|
||||
name = "\improper Research Outpost Landing Area"
|
||||
icon_state = "north"
|
||||
requires_power = 0
|
||||
|
||||
/area/xenos_station/south
|
||||
name = "\improper East Landing Area"
|
||||
/area/xenos_station/miningoutpost
|
||||
name = "\improper Mining Outpost Landing Area"
|
||||
icon_state = "south"
|
||||
requires_power = 0
|
||||
requires_power = 0
|
||||
|
||||
//PRISON
|
||||
/area/prison
|
||||
@@ -984,6 +994,10 @@ var/list/ghostteleportlocs = list()
|
||||
/area/blueshield
|
||||
name = "\improper Blueshield's Office"
|
||||
icon_state = "blueold"
|
||||
|
||||
/area/centcomdocks
|
||||
name = "\improper Central Command Docks"
|
||||
icon_state = "centcom"
|
||||
|
||||
//Crew
|
||||
|
||||
|
||||
@@ -74,8 +74,8 @@
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts)
|
||||
precision_coeff = P.rating
|
||||
for(var/obj/item/weapon/stock_parts/micro_laser/P in component_parts)
|
||||
damage_coeff = P.rating
|
||||
|
||||
damage_coeff = P.rating
|
||||
|
||||
/obj/machinery/dna_scannernew/allow_drop()
|
||||
return 0
|
||||
|
||||
@@ -186,8 +186,8 @@
|
||||
default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", item)
|
||||
|
||||
if(exchange_parts(user, item))
|
||||
return
|
||||
|
||||
return
|
||||
|
||||
if(istype(item, /obj/item/weapon/crowbar))
|
||||
if(panel_open)
|
||||
for(var/obj/I in contents) // in case there is something in the scanner
|
||||
@@ -237,22 +237,21 @@
|
||||
|| locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \
|
||||
|| locate(/obj/machinery/computer/cloning, get_step(src, WEST)))
|
||||
|
||||
if(!M.client && M.mind)
|
||||
for(var/mob/dead/observer/ghost in player_list)
|
||||
if(ghost.mind == M.mind)
|
||||
ghost << "<b><font color = #330033><font size = 3>Your corpse has been placed into a cloning scanner. Return to your body if you want to be resurrected/cloned!</b> (Verbs -> Ghost -> Re-enter corpse)</font color>"
|
||||
break
|
||||
var/mob/dead/observer/ghost = occupant.get_ghost()
|
||||
if(ghost)
|
||||
ghost << "<span class='ghostalert'>Your corpse has been placed into a cloning scanner. Return to your body if you want to be cloned!</span> (Verbs -> Ghost -> Re-enter corpse)"
|
||||
ghost << sound('sound/effects/genetics.ogg')
|
||||
return
|
||||
|
||||
/obj/machinery/dna_scannernew/proc/go_out()
|
||||
if (!src.occupant)
|
||||
usr << "<span class=\"warning\">The scanner is empty!</span>"
|
||||
return
|
||||
|
||||
|
||||
if (src.locked)
|
||||
usr << "<span class=\"warning\">The scanner is locked!</span>"
|
||||
return
|
||||
|
||||
|
||||
if (src.occupant.client)
|
||||
src.occupant.client.eye = src.occupant.client.mob
|
||||
src.occupant.client.perspective = MOB_PERSPECTIVE
|
||||
|
||||
@@ -182,7 +182,7 @@ var/list/blob_nodes = list()
|
||||
return
|
||||
|
||||
if (2)
|
||||
command_alert("The biohazard has grown out of control and will soon reach critical mass. Activate the nuclear failsafe to mantain quarantine. The Nuclear Authentication Code is [get_nuke_code()] ", "Biohazard Alert")
|
||||
command_alert("The biohazard has grown out of control and will soon reach critical mass. Activate the nuclear failsafe to maintain quarantine. The Nuclear Authentication Code is [get_nuke_code()] ", "Biohazard Alert")
|
||||
set_security_level("gamma")
|
||||
var/obj/machinery/door/airlock/vault/V = locate(/obj/machinery/door/airlock/vault) in world
|
||||
if(V && V.z == 1)
|
||||
|
||||
@@ -106,8 +106,8 @@
|
||||
|
||||
|
||||
/datum/game_mode/malfunction/proc/capture_the_station()
|
||||
world << {"<FONT size = 3><B>The AI has won!</B></FONT><br />
|
||||
<B>It has fully taken control of all of [station_name()]'s systems.</B>"}
|
||||
world << "<FONT size = 3><B>The AI has won!</B></FONT>"
|
||||
world << "<B>It has fully taken control of all of [station_name()]'s systems.</B>"
|
||||
|
||||
to_nuke_or_not_to_nuke = 1
|
||||
for(var/datum/mind/AI_mind in malf_ai)
|
||||
|
||||
@@ -29,6 +29,7 @@ var/bomb_set
|
||||
var/uititle
|
||||
flags = FPRINT
|
||||
use_power = 0
|
||||
unacidable = 1
|
||||
|
||||
/obj/machinery/nuclearbomb/New()
|
||||
..()
|
||||
|
||||
@@ -52,6 +52,11 @@
|
||||
name = "a functional AI"
|
||||
typepath = /obj/item/device/aicard
|
||||
|
||||
/datum/theft_objective/defib
|
||||
name = "a defibrillator"
|
||||
typepath = /obj/item/weapon/defibrillator
|
||||
protected_jobs = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist", "Psychiatrist", "Paramedic", "Brig Physician")
|
||||
|
||||
/datum/theft_objective/magboots
|
||||
name = "the chief engineer's advanced magnetic boots"
|
||||
typepath = /obj/item/clothing/shoes/magboots/advance
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
var/result = 0
|
||||
var/checkwin_counter = 0
|
||||
var/xenos_list = list()
|
||||
var/gammacalled = 0
|
||||
|
||||
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
|
||||
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
|
||||
|
||||
var/xenoai = 0 //Should the Xenos have their own AI?
|
||||
var/xenoborg = 0 //Should the Xenos have their own borg?
|
||||
var/gammaratio = 3 //At what alien to human ratio will the Gamma security level be called and the nuke be made available?
|
||||
|
||||
/datum/game_mode/xenos/announce()
|
||||
world << "<B>The current game mode is - Xenos!</B>"
|
||||
@@ -87,6 +89,7 @@
|
||||
O.mind.original = O
|
||||
else
|
||||
O.key = xeno_mind.current.key
|
||||
|
||||
//del(xeno_mind)
|
||||
var/obj/loc_landmark
|
||||
for(var/obj/effect/landmark/start/sloc in landmarks_list)
|
||||
@@ -101,6 +104,7 @@
|
||||
O.laws = new /datum/ai_laws/alienmov
|
||||
O.name = "Alien AI"
|
||||
O.real_name = name
|
||||
xeno_mind.name = O.name
|
||||
O.alienAI = 1
|
||||
O.network = list("SS13","Xeno")
|
||||
O.holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo3"))
|
||||
@@ -115,6 +119,7 @@
|
||||
xeno_mind.transfer_to(O)
|
||||
else
|
||||
O.key = xeno_mind.current.key
|
||||
xeno_mind.name = O.name
|
||||
//del(xeno_mind)
|
||||
xenoqueen_selected = 1
|
||||
spawnpos++
|
||||
@@ -135,6 +140,7 @@
|
||||
O.job = "Alien Cyborg"
|
||||
O.name = "Alien Cyborg"
|
||||
O.real_name = name
|
||||
xeno_mind.name = O.name
|
||||
O.module = new /obj/item/weapon/robot_module/alien/hunter(src)
|
||||
O.hands.icon_state = "standard"
|
||||
O.icon = 'icons/mob/alien.dmi'
|
||||
@@ -156,6 +162,7 @@
|
||||
xeno_mind.transfer_to(O)
|
||||
else
|
||||
O.key = xeno_mind.current.key
|
||||
xeno_mind.name = O.name
|
||||
//del(xeno_mind)
|
||||
spawnpos++
|
||||
|
||||
@@ -171,11 +178,13 @@
|
||||
ticker.mode.check_win()
|
||||
checkwin_counter = 0
|
||||
return 0
|
||||
|
||||
|
||||
/datum/game_mode/xenos/check_win()
|
||||
var/xenosalive = xenos_alive()
|
||||
var/playersalive = players_alive()
|
||||
if(emergency_shuttle && (emergency_shuttle.returned() || emergency_shuttle.departed))
|
||||
var/playeralienratio = player_alien_ratio()
|
||||
if(emergency_shuttle && emergency_shuttle.returned())
|
||||
return ..()
|
||||
if(!xenosalive)
|
||||
result = 1
|
||||
@@ -183,20 +192,38 @@
|
||||
else if(!playersalive)
|
||||
result = 2
|
||||
return 1
|
||||
else if(station_was_nuked)
|
||||
result = 3
|
||||
return 1
|
||||
else
|
||||
if(playeralienratio >= gammaratio && !gammacalled)
|
||||
gammacalled = 1
|
||||
command_alert("The aliens have nearly succeeded in capturing the station and exterminating the crew. Activate the nuclear failsafe to stop the alien threat once and for all. The Nuclear Authentication Code is [get_nuke_code()] ", "Alien Lifeform Alert")
|
||||
set_security_level("gamma")
|
||||
var/obj/machinery/door/airlock/vault/V = locate(/obj/machinery/door/airlock/vault) in world
|
||||
if(V && V.z == 1)
|
||||
V.locked = 0
|
||||
V.update_icon()
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/xenos/check_finished()
|
||||
if(config.continous_rounds)
|
||||
if(result)
|
||||
return ..()
|
||||
if(emergency_shuttle && (emergency_shuttle.returned() || emergency_shuttle.departed))
|
||||
if(emergency_shuttle && emergency_shuttle.returned())
|
||||
return ..()
|
||||
if(result)
|
||||
if(result || station_was_nuked)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/datum/game_mode/xenos/proc/get_nuke_code()
|
||||
var/nukecode = "ERROR"
|
||||
for(var/obj/machinery/nuclearbomb/bomb in world)
|
||||
if(bomb && bomb.r_code && bomb.z == 1)
|
||||
nukecode = bomb.r_code
|
||||
return nukecode
|
||||
|
||||
/datum/game_mode/xenos/proc/xenos_alive()
|
||||
var/list/livingxenos = list()
|
||||
for(var/datum/mind/xeno in xenos)
|
||||
@@ -209,12 +236,30 @@
|
||||
var/list/livingplayers = list()
|
||||
for(var/mob/M in player_list)
|
||||
var/turf/T = get_turf(M)
|
||||
if((M) && (M.stat != 2) && M.client && T && (T.z == 1))
|
||||
if((M) && (M.stat != 2) && M.client && T && (T.z == 1 || emergency_shuttle.departed && (T.z == 1 || T.z == 2)))
|
||||
if(ishuman(M))
|
||||
livingplayers += 1
|
||||
return livingplayers.len
|
||||
|
||||
/datum/game_mode/xenos/proc/player_alien_ratio()
|
||||
var/list/livingplayers = list()
|
||||
var/list/livingxenos = list()
|
||||
for(var/mob/M in player_list)
|
||||
if((M) && (M.stat != 2) && M.client)
|
||||
if(ishuman(M))
|
||||
livingplayers += 1
|
||||
for(var/datum/mind/xeno in xenos)
|
||||
if((xeno) && (xeno.current) && (xeno.current.stat != 2) && (xeno.current.client))
|
||||
if(istype(xeno.current,/mob/living/carbon/alien) || (xenoborg && isrobot(xeno.current)) || (xenoai && isAI(xeno.current)))
|
||||
livingxenos += xeno
|
||||
|
||||
/datum/game_mode/xenos/declare_completion()
|
||||
if(!livingxenos.len || !livingplayers.len)
|
||||
return 0
|
||||
|
||||
var/ratio = livingxenos.len / livingplayers.len
|
||||
return ratio
|
||||
|
||||
/datum/game_mode/xenos/declare_completion()
|
||||
if(result == 1)
|
||||
feedback_set_details("round_end_result","win - xenos killed")
|
||||
world << "<FONT size = 3><B>Crew Victory</B></FONT>"
|
||||
@@ -223,6 +268,10 @@
|
||||
feedback_set_details("round_end_result","win - crew killed")
|
||||
world << "<FONT size = 3><B>Alien Victory</B></FONT>"
|
||||
world << "<B>The aliens were successful and slaughtered the crew!</B>"
|
||||
else if(station_was_nuked)
|
||||
feedback_set_details("round_end_result","win - xenos nuked")
|
||||
world << "<FONT size = 3><B>Crew Victory</B></FONT>"
|
||||
world << "<B>The station was destroyed in a nuclear explosion, preventing the aliens from overrunning it!</B>"
|
||||
else
|
||||
feedback_set_details("round_end_result","win - crew escaped")
|
||||
world << "<FONT size = 3><B>Draw</B></FONT>"
|
||||
@@ -231,7 +280,7 @@
|
||||
var/text = "<br><FONT size=3><B>There were [xenos.len] aliens.</B></FONT>"
|
||||
text += "<br><FONT size=3><B>The aliens were:</B></FONT>"
|
||||
for(var/datum/mind/xeno in xenos)
|
||||
text += "<br><b>[xeno.key]</b> was <b>[xeno.current.name]</b> ("
|
||||
text += "<br><b>[xeno.key]</b> was <b>[xeno.name]</b> ("
|
||||
if(xeno.current)
|
||||
if(xeno.current.stat == DEAD)
|
||||
text += "died"
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
|
||||
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
|
||||
access_heads, access_construction, access_sec_doors,
|
||||
access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload)
|
||||
access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_mechanic)
|
||||
minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
|
||||
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
|
||||
access_heads, access_construction, access_sec_doors,
|
||||
|
||||
@@ -246,8 +246,8 @@
|
||||
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
|
||||
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
|
||||
access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
|
||||
access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_lawyer)
|
||||
access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_magistrate)
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_lawyer, access_magistrate)
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -279,8 +279,8 @@
|
||||
spawn_positions = 2
|
||||
supervisors = "the magistrate"
|
||||
selection_color = "#ddddff"
|
||||
access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels, access_magistrate)
|
||||
minimal_access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels, access_magistrate)
|
||||
access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels)
|
||||
minimal_access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels)
|
||||
alt_titles = list("Lawyer","Public Defender")
|
||||
minimal_player_age = 21
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
|
||||
|
||||
/obj/machinery/optable/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
|
||||
if(usr.stat || !ishuman(usr) || usr.restrained() || !check_table(usr))
|
||||
if(usr.stat || !ishuman(usr) || usr.restrained() || !check_table(usr) || usr.weakened || usr.stunned)
|
||||
return
|
||||
|
||||
var/mob/living/L = O
|
||||
|
||||
@@ -247,7 +247,7 @@ Auto Patrol: []"},
|
||||
var/area/location = get_area(src)
|
||||
speak("[arrest_type ? "Detaining" : "Arresting"] level [threatlevel] scumbag <b>[target]</b> in [location].",radio_frequency, radio_name)
|
||||
target.visible_message("<span class='danger'>[target] has been [harmbaton ? "beaten" : "stunned"] by [src]!</span>",\
|
||||
"<span class='userdanger'>[target] has been [harmbaton ? "beaten" : "unlocked"] by [src]!</span>")
|
||||
"<span class='userdanger'>[target] has been [harmbaton ? "beaten" : "stunned"] by [src]!</span>")
|
||||
|
||||
mode = BOT_PREP_ARREST
|
||||
anchored = 1
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
var/light_disabled = 0
|
||||
var/alarm_on = 0
|
||||
var/busy = 0
|
||||
var/indestructible = 0 // If set, prevents aliens from destroying it
|
||||
|
||||
/obj/machinery/camera/New()
|
||||
wires = new(src)
|
||||
@@ -97,6 +98,8 @@
|
||||
/obj/machinery/camera/attack_paw(mob/living/carbon/alien/humanoid/user as mob)
|
||||
if(!istype(user))
|
||||
return
|
||||
if(indestructible)
|
||||
return
|
||||
status = 0
|
||||
visible_message("<span class='warning'>\The [user] slashes at [src]!</span>")
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
var/area/curr_location
|
||||
var/moving = 0
|
||||
var/lastMove = 0
|
||||
unacidable = 1
|
||||
|
||||
|
||||
/obj/machinery/computer/xenos_station/New()
|
||||
@@ -26,9 +27,8 @@
|
||||
|
||||
for(var/obj/machinery/door/airlock/alien/A in world)
|
||||
A.close()
|
||||
if(dest_location == locate(/area/xenos_station/start))
|
||||
A.locked = 1
|
||||
A.update_icon()
|
||||
A.locked = 1
|
||||
A.update_icon()
|
||||
|
||||
for(var/mob/M in curr_location)
|
||||
if(M.client)
|
||||
@@ -109,11 +109,12 @@
|
||||
Ready to move[max(lastMove + XENOS_SHUTTLE_COOLDOWN - world.time, 0) ? " in [max(round((lastMove + XENOS_SHUTTLE_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]<br>
|
||||
<a href='?src=\ref[src];xenos=1'>Alien Space</a><br>
|
||||
<a href='?src=\ref[src];station_nw=1'>North-West of SS13</a> |
|
||||
<a href='?src=\ref[src];station_n=1'>North of SS13</a> |
|
||||
<a href='?src=\ref[src];station_ne=1'>North-East of SS13</a><br>
|
||||
<a href='?src=\ref[src];station_e=1'>East of SS13</a> <br>
|
||||
<a href='?src=\ref[src];station_sw=1'>South-West of SS13</a> |
|
||||
<a href='?src=\ref[src];station_s=1'>South of SS13</a> |
|
||||
<a href='?src=\ref[src];station_se=1'>South-East of SS13</a><br>
|
||||
<a href='?src=\ref[src];station_west=1'>West of SS13</a><br>
|
||||
<a href='?src=\ref[src];station_ro=1'>North of Research Outpost</a><br>
|
||||
<a href='?src=\ref[user];mach_close=computer'>Close</a>"}
|
||||
|
||||
user << browse(dat, "window=computer;size=575x450")
|
||||
@@ -132,17 +133,18 @@
|
||||
xenos_move_to(/area/xenos_station/start)
|
||||
else if(href_list["station_nw"])
|
||||
xenos_move_to(/area/xenos_station/northwest)
|
||||
else if(href_list["station_n"])
|
||||
xenos_move_to(/area/xenos_station/north)
|
||||
else if(href_list["station_ne"])
|
||||
xenos_move_to(/area/xenos_station/northeast)
|
||||
else if(href_list["station_e"])
|
||||
xenos_move_to(/area/xenos_station/east)
|
||||
else if(href_list["station_sw"])
|
||||
xenos_move_to(/area/xenos_station/southwest)
|
||||
else if(href_list["station_s"])
|
||||
xenos_move_to(/area/xenos_station/south)
|
||||
else if(href_list["station_se"])
|
||||
xenos_move_to(/area/xenos_station/southeast)
|
||||
|
||||
else if(href_list["station_w"])
|
||||
xenos_move_to(/area/xenos_station/west)
|
||||
else if(href_list["station_ro"])
|
||||
xenos_move_to(/area/xenos_station/researchoutpost)
|
||||
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -166,6 +166,21 @@
|
||||
connected_weeds = new()
|
||||
..(src.loc, src)
|
||||
|
||||
/obj/effect/alien/weeds/node/Destroy()
|
||||
for(var/obj/effect/alien/weeds/W in connected_weeds)
|
||||
processing_objects.Add(W) // Start processing the weeds so they lose health when there's no connected node
|
||||
..()
|
||||
|
||||
/obj/effect/alien/weeds/process()
|
||||
if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range))
|
||||
if(prob(50))
|
||||
health -= 1
|
||||
else if(prob(50))
|
||||
health -= 2
|
||||
else if(prob(25))
|
||||
health -= 3
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/alien/weeds/New(pos, var/obj/effect/alien/weeds/node/N)
|
||||
..()
|
||||
|
||||
@@ -187,6 +202,7 @@
|
||||
if(linked_node)
|
||||
linked_node.connected_weeds.Remove(src)
|
||||
linked_node = null
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
|
||||
/obj/effect/alien/weeds/proc/Life()
|
||||
|
||||
@@ -91,7 +91,8 @@ REAGENT SCANNER
|
||||
/obj/item/device/healthanalyzer
|
||||
name = "Health Analyzer"
|
||||
icon_state = "health"
|
||||
item_state = "analyzer"
|
||||
item_state = "healthanalyzer"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
desc = "A hand-held body scanner able to distinguish vital signs of the subject."
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
@@ -75,7 +75,8 @@ effective or pretty fucking useless.
|
||||
/obj/item/device/rad_laser
|
||||
name = "Health Analyzer"
|
||||
icon_state = "health"
|
||||
item_state = "analyzer"
|
||||
item_state = "healthanalyzer"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
desc = "A hand-held body scanner able to distinguish vital signs of the subject. A strange microlaser is hooked on to the scanning end."
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
@@ -1,159 +1,362 @@
|
||||
/obj/item/weapon/melee/defibrilator
|
||||
name = "emergency defibrilator"
|
||||
desc = "A handheld emergency defibrilator, used to bring people back from the brink of death or put them there."
|
||||
icon_state = "defib_full"
|
||||
item_state = "defib"
|
||||
flags = FPRINT | TABLEPASS
|
||||
slot_flags = SLOT_BELT
|
||||
//backpack item
|
||||
|
||||
/obj/item/weapon/defibrillator
|
||||
name = "defibrillator"
|
||||
desc = "A device that delivers powerful shocks to detachable paddles that resuscitate incapacitated patients."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "defibunit"
|
||||
item_state = "defibunit"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
slot_flags = SLOT_BACK
|
||||
force = 5
|
||||
throwforce = 5
|
||||
w_class = 3
|
||||
var/emagged = 0
|
||||
var/charges = 10
|
||||
var/status = 0
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread
|
||||
origin_tech = "biotech=3"
|
||||
throwforce = 6
|
||||
w_class = 4
|
||||
origin_tech = "biotech=4"
|
||||
action_button_name = "Toggle Paddles"
|
||||
icon_action_button = "action_defibunit"
|
||||
|
||||
suicide_act(mob/user)
|
||||
viewers(user) << "\red <b>[user] is putting the live paddles on \his chest! It looks like \he's trying to commit suicide.</b>"
|
||||
return (OXYLOSS)
|
||||
var/on = 0 //if the paddles are equipped (1) or on the defib (0)
|
||||
var/safety = 1 //if you can zap people with the defibs on harm mode
|
||||
var/powered = 0 //if there's a cell in the defib with enough power for a revive, blocks paddles from reviving otherwise
|
||||
var/obj/item/weapon/twohanded/shockpaddles/paddles
|
||||
var/obj/item/weapon/cell/high/bcell = null
|
||||
|
||||
/obj/item/weapon/melee/defibrilator/update_icon()
|
||||
if(!status)
|
||||
if(charges >= 7)
|
||||
icon_state = "defib_full"
|
||||
if(charges <= 6 && charges >= 4)
|
||||
icon_state = "defib_half"
|
||||
if(charges <= 3 && charges >= 1)
|
||||
icon_state = "defib_low"
|
||||
if(charges <= 0)
|
||||
icon_state = "defib_empty"
|
||||
else
|
||||
if(charges >= 7)
|
||||
icon_state = "defibpaddleout_full"
|
||||
if(charges <= 6 && charges >= 4)
|
||||
icon_state = "defibpaddleout_half"
|
||||
if(charges <= 3 && charges >= 1)
|
||||
icon_state = "defibpaddleout_low"
|
||||
|
||||
/obj/item/weapon/melee/defibrilator/attack_self(mob/user as mob)
|
||||
if(status && (M_CLUMSY in user.mutations) && prob(50))
|
||||
spark_system.attach(user)
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.start()
|
||||
user << "\red You touch the paddles together shorting the device."
|
||||
user.Weaken(5)
|
||||
charges--
|
||||
if(charges < 1)
|
||||
status = 0
|
||||
update_icon()
|
||||
return
|
||||
if(charges > 0)
|
||||
status = !status
|
||||
user << "<span class='notice'>\The [src] is now [status ? "on" : "off"].</span>"
|
||||
playsound(get_turf(src), "sparks", 75, 1, -1)
|
||||
update_icon()
|
||||
else
|
||||
status = 0
|
||||
user << "<span class='warning'>\The [src] is out of charge.</span>"
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/item/weapon/melee/defibrilator/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
/obj/item/weapon/defibrillator/New() //starts without a cell for rnd
|
||||
..()
|
||||
if(istype(W, /obj/item/weapon/card/emag))
|
||||
var/image/I = image("icon" = "icons/obj/weapons.dmi", "icon_state" = "defib_emag")
|
||||
if(emagged == 0)
|
||||
emagged = 1
|
||||
usr << "\red [W] unlocks [src]'s safety protocols"
|
||||
overlays += I
|
||||
else
|
||||
emagged = 0
|
||||
usr << "\blue [W] sets [src]'s safety protocols"
|
||||
overlays -= I
|
||||
paddles = make_paddles()
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/melee/defibrilator/attack(mob/M as mob, mob/user as mob)
|
||||
var/tobehealed
|
||||
var/threshhold = -config.health_threshold_dead
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!ishuman(M))
|
||||
..()
|
||||
return
|
||||
if(status)
|
||||
if(user.a_intent == "hurt" && emagged)
|
||||
H.visible_message("<span class='danger'>[M.name] has been touched by the defibrilator paddles by [user]!</span>")
|
||||
if(charges >= 2)
|
||||
H.Weaken(10)
|
||||
H.adjustOxyLoss(10)
|
||||
else
|
||||
H.Weaken(5)
|
||||
H.adjustOxyLoss(5)
|
||||
H.updatehealth() //forces health update before next life tick
|
||||
spark_system.attach(M)
|
||||
spark_system.set_up(5, 0, M)
|
||||
spark_system.start()
|
||||
charges -= 2
|
||||
if(charges < 0)
|
||||
charges = 0
|
||||
if(!charges)
|
||||
status = 0
|
||||
/obj/item/weapon/defibrillator/loaded/New() //starts with hicap
|
||||
..()
|
||||
paddles = make_paddles()
|
||||
bcell = new(src)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/defibrillator/update_icon()
|
||||
update_power()
|
||||
update_overlays()
|
||||
update_charge()
|
||||
|
||||
/obj/item/weapon/defibrillator/proc/update_power()
|
||||
if(bcell)
|
||||
if(bcell.charge < paddles.revivecost)
|
||||
powered = 0
|
||||
else
|
||||
powered = 1
|
||||
else
|
||||
powered = 0
|
||||
|
||||
/obj/item/weapon/defibrillator/proc/update_overlays()
|
||||
overlays.Cut()
|
||||
if(!on)
|
||||
overlays += "defibunit-paddles"
|
||||
if(powered)
|
||||
overlays += "defibunit-powered"
|
||||
if(!bcell)
|
||||
overlays += "defibunit-nocell"
|
||||
if(!safety)
|
||||
overlays += "defibunit-emagged"
|
||||
|
||||
/obj/item/weapon/defibrillator/proc/update_charge()
|
||||
if(powered) //so it doesn't show charge if it's unpowered
|
||||
if(bcell)
|
||||
var/ratio = bcell.charge / bcell.maxcharge
|
||||
ratio = Ceiling(ratio*4) * 25
|
||||
overlays += "defibunit-charge[ratio]"
|
||||
|
||||
/obj/item/weapon/defibrillator/CheckParts()
|
||||
bcell = locate(/obj/item/weapon/cell) in contents
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/defibrillator/ui_action_click()
|
||||
if(usr.get_item_by_slot(slot_back) == src)
|
||||
toggle_paddles()
|
||||
else
|
||||
usr << "<span class='warning'>Put the defibrillator on your back first!</span>"
|
||||
return
|
||||
|
||||
/obj/item/weapon/defibrillator/attackby(obj/item/weapon/W, mob/user)
|
||||
if(istype(W, /obj/item/weapon/cell))
|
||||
var/obj/item/weapon/cell/C = W
|
||||
if(bcell)
|
||||
user << "<span class='notice'>[src] already has a cell.</span>"
|
||||
else
|
||||
if(C.maxcharge < paddles.revivecost)
|
||||
user << "<span class='notice'>[src] requires a higher capacity cell.</span>"
|
||||
return
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
bcell = W
|
||||
user << "<span class='notice'>You install a cell in [src].</span>"
|
||||
|
||||
if(istype(W, /obj/item/weapon/card/emag))
|
||||
if(safety)
|
||||
safety = 0
|
||||
user << "<span class='warning'>You silently disable [src]'s safety protocols with the [W]."
|
||||
else
|
||||
safety = 1
|
||||
user << "<span class='notice'>You silently enable [src]'s safety protocols with the [W]."
|
||||
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
if(bcell)
|
||||
bcell.updateicon()
|
||||
bcell.loc = get_turf(src.loc)
|
||||
bcell = null
|
||||
user << "<span class='notice'>You remove the cell from the [src].</span>"
|
||||
|
||||
update_icon()
|
||||
return
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/defibrillator/emp_act(severity)
|
||||
if(bcell)
|
||||
deductcharge(1000 / severity)
|
||||
if(bcell.reliability != 100 && prob(50/severity))
|
||||
bcell.reliability -= 10 / severity
|
||||
if(safety)
|
||||
safety = 0
|
||||
src.visible_message("<span class='notice'>[src] beeps: Safety protocols disabled!</span>")
|
||||
playsound(get_turf(src), 'sound/machines/twobeep.ogg', 50, 0)
|
||||
else
|
||||
safety = 1
|
||||
src.visible_message("<span class='notice'>[src] beeps: Safety protocols enabled!</span>")
|
||||
playsound(get_turf(src), 'sound/machines/twobeep.ogg', 50, 0)
|
||||
update_icon()
|
||||
..()
|
||||
|
||||
/obj/item/weapon/defibrillator/verb/toggle_paddles()
|
||||
set name = "Toggle Paddles"
|
||||
set category = "Object"
|
||||
on = !on
|
||||
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if(on)
|
||||
//Detach the paddles into the user's hands
|
||||
if(!usr.put_in_hands(paddles))
|
||||
on = 0
|
||||
user << "<span class='warning'>You need a free hand to hold the paddles!</span>"
|
||||
update_icon()
|
||||
playsound(get_turf(src), 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
user.attack_log += "\[[time_stamp()]\]<font color='red'> Defibrilated [H.name] ([H.ckey]) with [src.name]</font>"
|
||||
H.attack_log += "\[[time_stamp()]\]<font color='orange'> Defibrilated by [user.name] ([user.ckey]) with [src.name]</font>"
|
||||
log_attack("<font color='red'>[user.name] ([user.ckey]) defibrilated [H.name] ([H.ckey]) with [src.name]</font>" )
|
||||
if(!iscarbon(user))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = user
|
||||
return
|
||||
H.visible_message("\blue [user] places the defibrilator paddles on [M.name]'s chest.", "\blue You place the defibrilator paddles on [M.name]'s chest.")
|
||||
if(do_after(user, 10))
|
||||
if(H.stat == 2 || H.stat == DEAD)
|
||||
var/uni = 0
|
||||
var/armor = 0
|
||||
var/health = H.health
|
||||
for(var/obj/item/carried_item in H.contents)
|
||||
if(istype(carried_item, /obj/item/clothing/under))
|
||||
uni = 1
|
||||
if(istype(carried_item, /obj/item/clothing/suit/armor))
|
||||
armor = 1
|
||||
if(uni && armor)
|
||||
if(prob(30))
|
||||
spark_system.attach(M)
|
||||
spark_system.start()
|
||||
if(prob(30))
|
||||
tobehealed = health + threshhold
|
||||
tobehealed -= 5 //They get 5 health in crit to heal the person or inject stabalizers
|
||||
H.adjustOxyLoss(tobehealed)
|
||||
else if(uni || armor)
|
||||
if(prob(30))
|
||||
spark_system.attach(M)
|
||||
spark_system.start()
|
||||
if(prob(60))
|
||||
tobehealed = health + threshhold
|
||||
tobehealed -= 5 //They get 5 health in crit to heal the person or inject stabalizers
|
||||
H.adjustOxyLoss(tobehealed)
|
||||
else
|
||||
if(prob(90))
|
||||
tobehealed = health + threshhold
|
||||
tobehealed -= 5 //They get 5 health in crit to heal the person or inject stabalizers
|
||||
H.adjustOxyLoss(tobehealed)
|
||||
H.updatehealth() //forces a health update, otherwise the oxyloss adjustment wouldnt do anything
|
||||
M.visible_message("\red [M]'s body convulses a bit.")
|
||||
var/datum/organ/external/temp = H.get_organ("head")
|
||||
if(H.health > -100 && !(temp.status & ORGAN_DESTROYED) && !(M_NOCLONE in H.mutations) && !H.suiciding)
|
||||
viewers(M) << "\blue [src] beeps: Resuscitation successful."
|
||||
spawn(0)
|
||||
H.stat = 1
|
||||
dead_mob_list -= H
|
||||
living_mob_list |= H
|
||||
H.emote("gasp")
|
||||
else
|
||||
viewers(M) << "\blue [src] beeps: Resuscitation failed."
|
||||
charges--
|
||||
if(charges < 1)
|
||||
charges = 0
|
||||
status = 0
|
||||
update_icon()
|
||||
paddles.loc = user
|
||||
else
|
||||
//Remove from their hands and back onto the defib unit
|
||||
remove_paddles(user)
|
||||
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/defibrillator/proc/make_paddles()
|
||||
return new /obj/item/weapon/twohanded/shockpaddles(src)
|
||||
|
||||
/obj/item/weapon/defibrillator/equipped(mob/user, slot)
|
||||
if(slot != slot_back)
|
||||
remove_paddles(user)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/defibrillator/proc/remove_paddles(mob/user)
|
||||
var/mob/living/carbon/human/M = user
|
||||
if(paddles in get_both_hands(M))
|
||||
M.u_equip(paddles)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/defibrillator/Destroy()
|
||||
if(on)
|
||||
var/M = get(paddles, /mob)
|
||||
remove_paddles(M)
|
||||
..()
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/defibrillator/proc/deductcharge(var/chrgdeductamt)
|
||||
if(bcell)
|
||||
if(bcell.charge < (paddles.revivecost+chrgdeductamt))
|
||||
powered = 0
|
||||
update_icon()
|
||||
if(bcell.use(chrgdeductamt))
|
||||
update_icon()
|
||||
return 1
|
||||
else
|
||||
update_icon()
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/defibrillator/proc/cooldowncheck(var/mob/user)
|
||||
spawn(50)
|
||||
if(bcell)
|
||||
if(bcell.charge >= paddles.revivecost)
|
||||
user.visible_message("<span class='notice'>[src] beeps: Unit ready.</span>")
|
||||
playsound(get_turf(src), 'sound/machines/twobeep.ogg', 50, 0)
|
||||
else
|
||||
user.visible_message("\blue [src] beeps: Patient is not in a valid state.")
|
||||
user.visible_message("<span class='notice'>[src] beeps: Charge depleted.</span>")
|
||||
playsound(get_turf(src), 'sound/machines/twobeep.ogg', 50, 0)
|
||||
paddles.cooldown = 0
|
||||
paddles.update_icon()
|
||||
update_icon()
|
||||
|
||||
//paddles
|
||||
|
||||
/obj/item/weapon/twohanded/shockpaddles
|
||||
name = "defibrillator paddles"
|
||||
desc = "A pair of plastic-gripped paddles with flat metal surfaces that are used to deliver powerful electric shocks."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "defibpaddles"
|
||||
item_state = "defibpaddles"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
force = 0
|
||||
throwforce = 6
|
||||
w_class = 4
|
||||
|
||||
var/revivecost = 1000
|
||||
var/cooldown = 0
|
||||
var/busy = 0
|
||||
var/obj/item/weapon/defibrillator/defib
|
||||
|
||||
/obj/item/weapon/twohanded/shockpaddles/New(mainunit)
|
||||
..()
|
||||
if(check_defib_exists(mainunit, src))
|
||||
defib = mainunit
|
||||
loc = defib
|
||||
busy = 0
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/twohanded/shockpaddles/update_icon()
|
||||
icon_state = "defibpaddles[wielded]"
|
||||
item_state = "defibpaddles[wielded]"
|
||||
if(cooldown)
|
||||
icon_state = "defibpaddles[wielded]_cooldown"
|
||||
|
||||
/obj/item/weapon/twohanded/shockpaddles/suicide_act(mob/user)
|
||||
user.visible_message("<span class='danger'>[user] is putting the live paddles on \his chest! It looks like \he's trying to commit suicide.</span>")
|
||||
defib.deductcharge(revivecost)
|
||||
playsound(get_turf(src), 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
return (OXYLOSS)
|
||||
|
||||
/obj/item/weapon/twohanded/shockpaddles/dropped(mob/user as mob)
|
||||
if(user)
|
||||
var/obj/item/weapon/twohanded/O = user.get_inactive_hand()
|
||||
if(istype(O))
|
||||
O.unwield()
|
||||
user << "<span class='notice'>The paddles snap back into the main unit.</span>"
|
||||
defib.on = 0
|
||||
loc = defib
|
||||
defib.update_icon()
|
||||
return unwield()
|
||||
|
||||
/obj/item/weapon/twohanded/shockpaddles/proc/check_defib_exists(mainunit, var/mob/living/carbon/human/M, var/obj/O)
|
||||
if (!mainunit || !istype(mainunit, /obj/item/weapon/defibrillator)) //To avoid weird issues from admin spawns
|
||||
M.u_equip(O)
|
||||
qdel(O)
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/twohanded/shockpaddles/attack(mob/M as mob, mob/user as mob)
|
||||
var/tobehealed
|
||||
var/threshold = -config.health_threshold_dead
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if(busy)
|
||||
return
|
||||
if(!defib.powered)
|
||||
user.visible_message("<span class='notice'>[defib] beeps: Unit is unpowered.</span>")
|
||||
playsound(get_turf(src), 'sound/machines/twobeep.ogg', 50, 0)
|
||||
return
|
||||
if(!wielded)
|
||||
user << "<span class='boldnotice'>You need to wield the paddles in both hands before you can use them on someone!</span>"
|
||||
return
|
||||
if(cooldown)
|
||||
user << "<span class='notice'>[defib] is recharging.</span>"
|
||||
return
|
||||
if(!ishuman(M))
|
||||
user << "<span class='notice'>The instructions on [defib] don't mention how to revive that...</span>"
|
||||
return
|
||||
else
|
||||
if(user.a_intent == "harm" && !defib.safety)
|
||||
busy = 1
|
||||
H.visible_message("<span class='danger'>[user] has touched [H.name] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] has touched [H.name] with [src]!</span>")
|
||||
H.adjustStaminaLoss(50)
|
||||
H.Weaken(5)
|
||||
H.updatehealth() //forces health update before next life tick
|
||||
playsound(get_turf(src), 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
H.emote("gasp")
|
||||
add_logs(user, M, "stunned", object="defibrillator")
|
||||
defib.deductcharge(revivecost)
|
||||
cooldown = 1
|
||||
busy = 0
|
||||
update_icon()
|
||||
defib.cooldowncheck(user)
|
||||
return
|
||||
if(user.zone_sel && user.zone_sel.selecting == "chest")
|
||||
user.visible_message("<span class='warning'>[user] begins to place [src] on [M.name]'s chest.</span>", "<span class='warning'>You begin to place [src] on [M.name]'s chest.</span>")
|
||||
busy = 1
|
||||
update_icon()
|
||||
if(do_after(user, 30)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
|
||||
user.visible_message("<span class='notice'>[user] places [src] on [M.name]'s chest.</span>", "<span class='warning'>You place [src] on [M.name]'s chest.</span>")
|
||||
playsound(get_turf(src), 'sound/weapons/flash.ogg', 50, 0)
|
||||
var/mob/dead/observer/ghost = H.get_ghost()
|
||||
var/tplus = world.time - H.timeofdeath
|
||||
var/tlimit = 3000 //past this much time the patient is unrecoverable (in deciseconds)
|
||||
var/tloss = 900 //brain damage starts setting in on the patient after some time left rotting
|
||||
var/total_burn = 0
|
||||
var/total_brute = 0
|
||||
if(do_after(user, 20)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
|
||||
for(var/obj/item/carried_item in H.contents)
|
||||
if((istype(carried_item, /obj/item/clothing/suit/armor)) || (istype(carried_item, /obj/item/clothing/suit/space)))
|
||||
user.visible_message("<span class='notice'>[defib] buzzes: Patient's chest is obscured. Operation aborted.</span>")
|
||||
playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
busy = 0
|
||||
update_icon()
|
||||
return
|
||||
if(H.stat == 2)
|
||||
var/health = H.health
|
||||
M.visible_message("<span class='warning'>[M]'s body convulses a bit.")
|
||||
playsound(get_turf(src), "bodyfall", 50, 1)
|
||||
playsound(get_turf(src), 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
for(var/datum/organ/external/O in H.organs)
|
||||
total_brute += O.brute_dam
|
||||
total_burn += O.burn_dam
|
||||
if(H.health <= config.health_threshold_dead && total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(M_NOCLONE in H.mutations))
|
||||
tobehealed = health + threshold
|
||||
tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived
|
||||
H.adjustOxyLoss(tobehealed)
|
||||
H.adjustToxLoss(tobehealed)
|
||||
H.adjustFireLoss(tobehealed)
|
||||
H.adjustBruteLoss(tobehealed)
|
||||
user.visible_message("<span class='boldnotice'>[defib] pings: Resuscitation successful.</span>")
|
||||
playsound(get_turf(src), 'sound/machines/ping.ogg', 50, 0)
|
||||
H.stat = 1
|
||||
dead_mob_list -= H
|
||||
living_mob_list |= list(H)
|
||||
H.emote("gasp")
|
||||
if(tplus > tloss)
|
||||
H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100))))
|
||||
defib.deductcharge(revivecost)
|
||||
add_logs(user, M, "revived", object="defibrillator")
|
||||
else
|
||||
if(tplus > tlimit)
|
||||
user.visible_message("<span class='boldnotice'>[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.</span>")
|
||||
else if(total_burn >= 180 || total_brute >= 180)
|
||||
user.visible_message("<span class='boldnotice'>[defib] buzzes: Resuscitation failed - Severe tissue damage detected.</span>")
|
||||
else
|
||||
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed.</span>")
|
||||
if(ghost)
|
||||
ghost << "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)"
|
||||
ghost << sound('sound/effects/genetics.ogg')
|
||||
playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, 0)
|
||||
defib.deductcharge(revivecost)
|
||||
update_icon()
|
||||
cooldown = 1
|
||||
defib.cooldowncheck(user)
|
||||
else
|
||||
user.visible_message("<span class='notice'>[defib] buzzes: Patient is not in a valid state. Operation aborted.</span>")
|
||||
playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
busy = 0
|
||||
update_icon()
|
||||
else
|
||||
user << "<span class='notice'>You need to target your patient's chest with [src].</span>"
|
||||
return
|
||||
@@ -122,7 +122,7 @@
|
||||
new /obj/item/weapon/cartridge/engineering(src)
|
||||
new /obj/item/taperoll/engineering(src)
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/atmos_personal
|
||||
name = "Technician's Locker"
|
||||
req_access = list(access_atmospherics)
|
||||
@@ -147,17 +147,14 @@
|
||||
new /obj/item/clothing/tie/storage/webbing(src)
|
||||
new /obj/item/clothing/suit/fire/firefighter(src)
|
||||
new /obj/item/clothing/head/hardhat/red(src)
|
||||
new /obj/item/clothing/gloves/black(src)
|
||||
new /obj/item/weapon/storage/belt/utility(src)
|
||||
new /obj/item/device/flashlight(src)
|
||||
new /obj/item/weapon/extinguisher(src)
|
||||
new /obj/item/device/radio/headset/headset_eng(src)
|
||||
new /obj/item/clothing/suit/storage/hazardvest(src)
|
||||
new /obj/item/weapon/storage/belt/utility(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/clothing/glasses/meson(src)
|
||||
new /obj/item/weapon/cartridge/atmos(src)
|
||||
new /obj/item/taperoll/engineering(src)
|
||||
new /obj/item/weapon/storage/toolbox/mechanical(src)
|
||||
|
||||
|
||||
return
|
||||
|
||||
@@ -69,51 +69,28 @@
|
||||
new /obj/item/weapon/storage/backpack/medic(src)
|
||||
else
|
||||
new /obj/item/weapon/storage/backpack/satchel_med(src)
|
||||
new /obj/item/clothing/under/rank/nursesuit (src)
|
||||
new /obj/item/clothing/head/nursehat (src)
|
||||
switch(pick("blue", "green", "purple"))
|
||||
if ("blue")
|
||||
new /obj/item/clothing/under/rank/medical/blue(src)
|
||||
new /obj/item/clothing/head/surgery/blue(src)
|
||||
if ("green")
|
||||
new /obj/item/clothing/under/rank/medical/green(src)
|
||||
new /obj/item/clothing/head/surgery/green(src)
|
||||
if ("purple")
|
||||
new /obj/item/clothing/under/rank/medical/purple(src)
|
||||
new /obj/item/clothing/head/surgery/purple(src)
|
||||
switch(pick("blue", "green", "purple"))
|
||||
if ("blue")
|
||||
new /obj/item/clothing/under/rank/medical/blue(src)
|
||||
new /obj/item/clothing/head/surgery/blue(src)
|
||||
if ("green")
|
||||
new /obj/item/clothing/under/rank/medical/green(src)
|
||||
new /obj/item/clothing/head/surgery/green(src)
|
||||
if ("purple")
|
||||
new /obj/item/clothing/under/rank/medical/purple(src)
|
||||
new /obj/item/clothing/head/surgery/purple(src)
|
||||
new /obj/item/clothing/under/rank/medical(src)
|
||||
new /obj/item/clothing/under/rank/nurse(src)
|
||||
new /obj/item/clothing/under/rank/orderly(src)
|
||||
new /obj/item/clothing/suit/storage/labcoat(src)
|
||||
new /obj/item/clothing/suit/storage/fr_jacket(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
// new /obj/item/weapon/cartridge/medical(src)
|
||||
new /obj/item/device/radio/headset/headset_med(src)
|
||||
new /obj/item/clothing/gloves/latex(src)
|
||||
new /obj/item/weapon/defibrillator/loaded(src)
|
||||
new /obj/item/weapon/storage/belt/medical(src)
|
||||
new /obj/item/clothing/glasses/hud/health(src)
|
||||
return
|
||||
|
||||
// Psychiatrist's pill bottle
|
||||
/obj/item/weapon/storage/pill_bottle/psychiatrist
|
||||
name = "psychiatrist's pill bottle"
|
||||
desc = "Contains various pills to calm or sedate patients."
|
||||
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/psychiatrist/New()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/pill/citalopram(src)
|
||||
new /obj/item/weapon/reagent_containers/pill/citalopram(src)
|
||||
new /obj/item/weapon/reagent_containers/pill/methylphenidate(src)
|
||||
new /obj/item/weapon/reagent_containers/pill/methylphenidate(src)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/psychiatrist
|
||||
name = "Psychiatrist's Locker"
|
||||
req_access = list(access_psychiatrist)
|
||||
@@ -164,12 +141,13 @@
|
||||
if ("purple")
|
||||
new /obj/item/clothing/under/rank/medical/purple(src)
|
||||
new /obj/item/clothing/head/surgery/purple(src)
|
||||
new /obj/item/clothing/under/rank/chief_medical_officer(src)
|
||||
new /obj/item/clothing/suit/storage/labcoat/cmo(src)
|
||||
new /obj/item/weapon/cartridge/cmo(src)
|
||||
new /obj/item/clothing/gloves/latex(src)
|
||||
new /obj/item/clothing/under/rank/chief_medical_officer(src)
|
||||
new /obj/item/clothing/shoes/brown (src)
|
||||
new /obj/item/clothing/gloves/latex(src)
|
||||
new /obj/item/device/radio/headset/heads/cmo(src)
|
||||
new /obj/item/clothing/gloves/latex(src)
|
||||
new /obj/item/weapon/defibrillator(src)
|
||||
new /obj/item/weapon/storage/belt/medical(src)
|
||||
new /obj/item/device/flash(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray(src)
|
||||
|
||||
@@ -217,6 +217,27 @@
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
return
|
||||
|
||||
/obj/structure/closet/wardrobe/white/medical
|
||||
name = "medical doctor's wardrobe"
|
||||
|
||||
/obj/structure/closet/wardrobe/white/medical/New()
|
||||
new /obj/item/clothing/under/rank/nursesuit (src)
|
||||
new /obj/item/clothing/head/nursehat (src)
|
||||
new /obj/item/clothing/under/rank/nurse(src)
|
||||
new /obj/item/clothing/under/rank/orderly(src)
|
||||
new /obj/item/clothing/suit/storage/fr_jacket(src)
|
||||
new /obj/item/clothing/suit/storage/fr_jacket(src)
|
||||
new /obj/item/clothing/suit/storage/fr_jacket(src)
|
||||
new /obj/item/clothing/under/rank/medical/blue(src)
|
||||
new /obj/item/clothing/head/surgery/blue(src)
|
||||
new /obj/item/clothing/under/rank/medical/green(src)
|
||||
new /obj/item/clothing/head/surgery/green(src)
|
||||
new /obj/item/clothing/under/rank/medical/purple(src)
|
||||
new /obj/item/clothing/head/surgery/purple(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
return
|
||||
|
||||
/obj/structure/closet/wardrobe/pjs
|
||||
name = "Pajama wardrobe"
|
||||
|
||||
@@ -8,13 +8,13 @@ Doesn't work on other aliens/AI.*/
|
||||
|
||||
/mob/living/carbon/alien/proc/powerc(X, Y)//Y is optional, checks for weed planting. X can be null.
|
||||
if(stat)
|
||||
src << "\green You must be conscious to do this."
|
||||
src << "<span class='noticealien'>You must be conscious to do this.</span>"
|
||||
return 0
|
||||
else if(X && getPlasma() < X)
|
||||
src << "\green Not enough plasma stored."
|
||||
src << "<span class='noticealien'>Not enough plasma stored.</span>"
|
||||
return 0
|
||||
else if(Y && (!isturf(src.loc) || istype(src.loc, /turf/space)))
|
||||
src << "\green Bad place for a garden!"
|
||||
src << "<span class='noticealien'>You can't place that here!</span>"
|
||||
return 0
|
||||
else return 1
|
||||
|
||||
@@ -155,7 +155,7 @@ Doesn't work on other aliens/AI.*/
|
||||
spawn(60)
|
||||
adjustToxLoss(-75)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("<span class='noticealien'>[src] vomits up a thick purple substance and shapes it!</span>"), 1)
|
||||
O.show_message(text("<span class='alertalien'>[src] vomits up a thick purple substance and shapes it!</span>"), 1)
|
||||
switch(choice)
|
||||
if("resin door")
|
||||
new /obj/structure/mineral_door/resin(loc)
|
||||
|
||||
@@ -39,8 +39,9 @@
|
||||
src << "<span class='noticealien'>You begin to evolve!</span>"
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("<span class='alertalien'>[src] begins to twist and contort!</span>"), 1)
|
||||
var/mob/living/carbon/alien/humanoid/queen/new_xeno = new (loc)
|
||||
var/mob/living/carbon/alien/humanoid/queen/new_xeno = new(loc)
|
||||
mind.transfer_to(new_xeno)
|
||||
new_xeno.mind.name = new_xeno.name
|
||||
del(src)
|
||||
else
|
||||
src << "<span class='notice'>We already have an alive queen.</span>"
|
||||
|
||||
@@ -80,12 +80,13 @@
|
||||
adjustToxLoss(-250)
|
||||
src << "\green You begin to evolve!"
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\green <B>[src] begins to twist and contort!</B>"), 1)
|
||||
var/mob/living/carbon/alien/humanoid/sentinel/praetorian/new_xeno = new (loc)
|
||||
O.show_message(text("<span class='alertalien'>[src] begins to twist and contort!</span>"), 1)
|
||||
var/mob/living/carbon/alien/humanoid/sentinel/praetorian/new_xeno = new(loc)
|
||||
if(mind)
|
||||
mind.transfer_to(new_xeno)
|
||||
else
|
||||
new_xeno.key = key
|
||||
new_xeno.mind.name = new_xeno.name
|
||||
del(src)
|
||||
return
|
||||
|
||||
@@ -122,12 +122,13 @@
|
||||
adjustToxLoss(-1000)
|
||||
src << "<span class='noticealien'>You begin to evolve!</span>"
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\green <B>[src] begins to twist and contort!</B>"), 1)
|
||||
var/mob/living/carbon/alien/humanoid/empress/new_xeno = new (loc)
|
||||
O.show_message(text("<span class='alertalien'>[src] begins to twist and contort!</span>"), 1)
|
||||
var/mob/living/carbon/alien/humanoid/empress/new_xeno = new(loc)
|
||||
if(mind)
|
||||
mind.transfer_to(new_xeno)
|
||||
else
|
||||
new_xeno.key = key
|
||||
new_xeno.mind.name = new_xeno.name
|
||||
del(src)
|
||||
else
|
||||
src << "<span class='notice'>We already have an alive empress.</span>"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
if (layer != TURF_LAYER+0.2)
|
||||
layer = TURF_LAYER+0.2
|
||||
src << text("\green You are now hiding.")
|
||||
src << text("<span class='noticealien'>You are now hiding.</span>")
|
||||
for(var/mob/O in oviewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O << text("<B>[] scurries to the ground!</B>", src)
|
||||
@@ -52,8 +52,9 @@
|
||||
mind.transfer_to(new_xeno)
|
||||
else
|
||||
new_xeno.key = key
|
||||
new_xeno.mind.name = new_xeno.name
|
||||
del(src)
|
||||
return
|
||||
else
|
||||
src << "\red You are not fully grown."
|
||||
src << "<span class='warning'>You are not fully grown.</span>"
|
||||
return
|
||||
|
||||
@@ -99,6 +99,7 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
|
||||
new_xeno.key = C.key
|
||||
if(ticker && ticker.mode)
|
||||
ticker.mode.xenos += new_xeno.mind
|
||||
new_xeno.mind.name = new_xeno.name
|
||||
new_xeno.mind.assigned_role = "MODE"
|
||||
new_xeno.mind.special_role = "Alien"
|
||||
new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention
|
||||
|
||||
@@ -1312,4 +1312,12 @@ mob/proc/yank_out_object()
|
||||
return paralysis
|
||||
|
||||
/mob/proc/assess_threat() //For sec bot threat assessment
|
||||
return
|
||||
return
|
||||
|
||||
/mob/proc/get_ghost(even_if_they_cant_reenter = 0)
|
||||
if(mind)
|
||||
for(var/mob/dead/observer/G in dead_mob_list)
|
||||
if(G.mind == mind)
|
||||
if(G.can_reenter_corpse || even_if_they_cant_reenter)
|
||||
return G
|
||||
break
|
||||
@@ -97,6 +97,7 @@
|
||||
var/global/list/status_overlays_equipment
|
||||
var/global/list/status_overlays_lighting
|
||||
var/global/list/status_overlays_environ
|
||||
var/indestructible = 0 // If set, prevents aliens from destroying it
|
||||
|
||||
/obj/machinery/power/apc/updateDialog()
|
||||
if (stat & (BROKEN|MAINT))
|
||||
@@ -667,6 +668,8 @@
|
||||
return
|
||||
if(!istype(user,/mob/living/carbon/alien/humanoid))
|
||||
return
|
||||
if(indestructible)
|
||||
return
|
||||
user.visible_message("\red [user.name] slashes at the [src.name]!", "\blue You slash at the [src.name]!")
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
|
||||
|
||||
|
||||
@@ -331,13 +331,13 @@
|
||||
/obj/machinery/power/smes/attack_ai(mob/user)
|
||||
add_fingerprint(user)
|
||||
ui_interact(user)
|
||||
|
||||
|
||||
|
||||
/obj/machinery/power/smes/attack_hand(mob/user)
|
||||
add_fingerprint(user)
|
||||
ui_interact(user)
|
||||
|
||||
|
||||
/obj/machinery/power/smes/attack_alien(mob/living/carbon/alien/humanoid/user)
|
||||
return
|
||||
|
||||
/obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
icon = 'icons/obj/syringe.dmi'
|
||||
item_state = "hypo"
|
||||
icon_state = "hypo"
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
amount_per_transfer_from_this = 5
|
||||
volume = 30
|
||||
possible_transfer_amounts = list(1,2,3,4,5,10,15,20,25,30)
|
||||
|
||||
@@ -1106,7 +1106,7 @@ datum/design/basic_capacitor
|
||||
build_path = "/obj/item/weapon/stock_parts/capacitor"
|
||||
|
||||
datum/design/basic_sensor
|
||||
name = "Basic Sensor Module"
|
||||
name = "Basic Scanning Module"
|
||||
desc = "A stock part used in the construction of various devices."
|
||||
id = "basic_sensor"
|
||||
req_tech = list("magnets" = 1)
|
||||
@@ -1653,6 +1653,17 @@ datum/design/noreactbeaker
|
||||
build_path = "/obj/item/weapon/reagent_containers/glass/beaker/noreact"
|
||||
category = "Misc"
|
||||
|
||||
datum/design/defib
|
||||
name = "Defibrillator"
|
||||
desc = "A device that delivers powerful shocks to detachable paddles that resuscitate incapacitated patients."
|
||||
id = "defib"
|
||||
req_tech = list("materials" = 7, "biotech" = 5, "powerstorage" = 5)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 5000, "$glass" = 2000, "$silver" = 1000)
|
||||
reliability = 76
|
||||
build_path = "/obj/item/weapon/defibrillator"
|
||||
category = "Misc"
|
||||
|
||||
datum/design/implanter
|
||||
name = "Implanter"
|
||||
desc = "A basic implanter for injecting implants"
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
extended
|
||||
secret
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 5.1 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 38 KiB |
+10830
-10822
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -16,7 +16,7 @@
|
||||
</script>
|
||||
<script type='text/javascript' src='libraries.min.js'></script> <script type='text/javascript' src='nano_utility.js'></script> <script type='text/javascript' src='nano_template.js'></script> <script type='text/javascript' src='nano_state_manager.js'></script> <script type='text/javascript' src='nano_state.js'></script> <script type='text/javascript' src='nano_state_default.js'></script> <script type='text/javascript' src='nano_base_callbacks.js'></script> <script type='text/javascript' src='nano_base_helpers.js'></script> <link rel='stylesheet' type='text/css' href='shared.css'> <link rel='stylesheet' type='text/css' href='icons.css'> <link rel='stylesheet' type='text/css' href='layout_default.css'>
|
||||
</head>
|
||||
<body scroll=auto data-template-data='{"main":"pda.tmpl","layout":"layout_default.tmpl"}' data-url-parameters='{"src":"[0x2101574b]"}' data-initial-data='{"config":{"title":"Personal Data Assistant","srcObject":{"name":"PDA-Astor Wheeler (Blueshield)"},"stateKey":"default","status":2,"autoUpdateLayout":0,"autoUpdateContent":1,"showMap":0,"mapZLevel":1,"user":{"name":"Astor Wheeler"}},"data":{"owner":"Astor Wheeler","ownjob":"Blueshield","mode":0,"scanmode":0,"fon":1,"pai":0,"note":"Congratulations, your station has chosen the Thinktronic 5230 Personal Data Assistant!","silent":0,"toff":0,"active_conversation":null,"idInserted":0,"idLink":"--------","cart_loaded":1,"cartridge":{"access":{"access_security":1,"access_engine":0,"access_atmos":0,"access_medical":0,"access_clown":0,"access_mime":0,"access_janitor":1,"access_quartermaster":1,"access_hydroponics":0,"access_reagent_scanner":0,"access_remote_door":0,"access_status_display":1,"access_detonate_pda":0},"name":"HumanResources9001","radio":3},"stationTime":"12:13","newMessage":0,"messagescount":null,"messages":null}}'>
|
||||
<body scroll=auto data-template-data='{"main":"escape_shuttle_control_console.tmpl","layout":"layout_default.tmpl"}' data-url-parameters='{"src":"[0x2101695f]"}' data-initial-data='{"config":{"title":"Shuttle Control","srcObject":{"name":"shuttle control console"},"stateKey":"default","status":2,"autoUpdateLayout":0,"autoUpdateContent":1,"showMap":0,"mapZLevel":1,"user":{"name":"Courtney Smail"}},"data":{"shuttle_status":"Standing-by at NCS Cyberiad.","shuttle_state":"idle","has_docking":1,"docking_status":"docked","docking_override":0,"can_launch":0,"can_cancel":0,"can_force":0,"auth_list":[{"auth_name":"","auth_hash":null},{"auth_name":"","auth_hash":null}],"has_auth":0,"user":null}}'>
|
||||
<div id='uiLayout'>
|
||||
</div>
|
||||
<noscript>
|
||||
|
||||
@@ -652,6 +652,7 @@
|
||||
#include "code\game\objects\items\weapons\cigs_lighters.dm"
|
||||
#include "code\game\objects\items\weapons\clown_items.dm"
|
||||
#include "code\game\objects\items\weapons\cosmetics.dm"
|
||||
#include "code\game\objects\items\weapons\defib.dm"
|
||||
#include "code\game\objects\items\weapons\dice.dm"
|
||||
#include "code\game\objects\items\weapons\dna_injector.dm"
|
||||
#include "code\game\objects\items\weapons\dnascrambler.dm"
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user