This commit is contained in:
kevinz000
2017-05-21 21:58:11 -07:00
parent 0bf9f163f3
commit ff4ef6a1f5
52 changed files with 7490 additions and 7478 deletions

View File

@@ -340,20 +340,20 @@ Proc for attack log creation, because really why not
qdel(progbar) qdel(progbar)
//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action //some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action
/mob/proc/break_do_after_checks(list/checked_health, check_clicks) /mob/proc/break_do_after_checks(list/checked_health, check_clicks)
if(check_clicks && next_move > world.time) if(check_clicks && next_move > world.time)
return FALSE return FALSE
return TRUE return TRUE
//pass a list in the format list("health" = mob's health var) to check health during this //pass a list in the format list("health" = mob's health var) to check health during this
/mob/living/break_do_after_checks(list/checked_health, check_clicks) /mob/living/break_do_after_checks(list/checked_health, check_clicks)
if(islist(checked_health)) if(islist(checked_health))
if(health < checked_health["health"]) if(health < checked_health["health"])
return FALSE return FALSE
checked_health["health"] = health checked_health["health"] = health
return ..() return ..()
/proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null) /proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null)
if(!user) if(!user)
return 0 return 0

View File

@@ -28,7 +28,7 @@
if(sharpness) if(sharpness)
to_chat(user, "<span class='notice'>You begin to butcher [src]...</span>") to_chat(user, "<span class='notice'>You begin to butcher [src]...</span>")
playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1) playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
if(do_mob(user, src, 80/sharpness) && Adjacent(I)) if(do_mob(user, src, 80/sharpness) && Adjacent(I))
harvest(user) harvest(user)
return 1 return 1
return I.attack(src, user) return I.attack(src, user)

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,6 @@ SUBSYSTEM_DEF(server_maint)
var/list/currentrun var/list/currentrun
/datum/controller/subsystem/server_maint/Initialize(timeofday) /datum/controller/subsystem/server_maint/Initialize(timeofday)
reload_custom_roundstart_items_list()
if (config.hub) if (config.hub)
world.visibility = 1 world.visibility = 1
..() ..()

View File

@@ -3,7 +3,7 @@ SUBSYSTEM_DEF(spacedrift)
priority = 30 priority = 30
wait = 5 wait = 5
flags = SS_NO_INIT|SS_KEEP_TIMING flags = SS_NO_INIT|SS_KEEP_TIMING
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/list/currentrun = list() var/list/currentrun = list()
var/list/processing = list() var/list/processing = list()

View File

@@ -142,25 +142,25 @@
/obj/item/weapon/antag_spawner/nuke_ops/proc/check_usability(mob/user) /obj/item/weapon/antag_spawner/nuke_ops/proc/check_usability(mob/user)
if(used) if(used)
to_chat(user, "<span class='warning'>[src] is out of power!</span>") to_chat(user, "<span class='warning'>[src] is out of power!</span>")
return 0 return FALSE
if(!(user.mind in SSticker.mode.syndicates)) if(!(user.mind in SSticker.mode.syndicates))
to_chat(user, "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>") to_chat(user, "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>")
return 0 return FALSE
if(user.z != ZLEVEL_CENTCOM) if(user.z != ZLEVEL_CENTCOM)
to_chat(user, "<span class='warning'>[src] is out of range! It can only be used at your base!</span>") to_chat(user, "<span class='warning'>[src] is out of range! It can only be used at your base!</span>")
return 0 return FALSE
return 1 return TRUE
/obj/item/weapon/antag_spawner/nuke_ops/attack_self(mob/user) /obj/item/weapon/antag_spawner/nuke_ops/attack_self(mob/user)
if(!(check_usability(user))) if(!(check_usability(user)))
return return
to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>") to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>")
var/list/nuke_candidates = pollCandidatesForMob("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE, src) var/list/nuke_candidates = pollGhostCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE)
if(nuke_candidates.len) if(nuke_candidates.len)
if(!(check_usability(user))) if(!(check_usability(user)))
return return
used = 1 used = TRUE
var/mob/dead/observer/theghost = pick(nuke_candidates) var/mob/dead/observer/theghost = pick(nuke_candidates)
spawn_antag(theghost.client, get_turf(src), "syndieborg") spawn_antag(theghost.client, get_turf(src), "syndieborg")
do_sparks(4, TRUE, src) do_sparks(4, TRUE, src)

File diff suppressed because it is too large Load Diff

View File

@@ -1,172 +1,172 @@
/obj/machinery/computer/robotics /obj/machinery/computer/robotics
name = "robotics control console" name = "robotics control console"
desc = "Used to remotely lockdown or detonate linked Cyborgs." desc = "Used to remotely lockdown or detonate linked Cyborgs."
icon_screen = "robot" icon_screen = "robot"
icon_keyboard = "rd_key" icon_keyboard = "rd_key"
req_access = list(GLOB.access_robotics) req_access = list(GLOB.access_robotics)
circuit = /obj/item/weapon/circuitboard/computer/robotics circuit = /obj/item/weapon/circuitboard/computer/robotics
var/temp = null var/temp = null
light_color = LIGHT_COLOR_PINK light_color = LIGHT_COLOR_PINK
/obj/machinery/computer/robotics/proc/can_control(mob/user, mob/living/silicon/robot/R) /obj/machinery/computer/robotics/proc/can_control(mob/user, mob/living/silicon/robot/R)
if(!istype(R)) if(!istype(R))
return 0 return 0
if(isAI(user)) if(isAI(user))
if (R.connected_ai != user) if (R.connected_ai != user)
return 0 return 0
if(iscyborg(user)) if(iscyborg(user))
if (R != user) if (R != user)
return 0 return 0
if(R.scrambledcodes) if(R.scrambledcodes)
return 0 return 0
return 1 return 1
/obj/machinery/computer/robotics/attack_hand(mob/user) /obj/machinery/computer/robotics/attack_hand(mob/user)
if(..()) if(..())
return return
interact(user) interact(user)
/obj/machinery/computer/robotics/interact(mob/user) /obj/machinery/computer/robotics/interact(mob/user)
if (src.z > 6) if (src.z > 6)
to_chat(user, "<span class='boldannounce'>Unable to establish a connection</span>: \black You're too far away from the station!") to_chat(user, "<span class='boldannounce'>Unable to establish a connection</span>: \black You're too far away from the station!")
return return
user.set_machine(src) user.set_machine(src)
var/dat var/dat
var/robots = 0 var/robots = 0
for(var/mob/living/silicon/robot/R in GLOB.mob_list) for(var/mob/living/silicon/robot/R in GLOB.mob_list)
if(!can_control(user, R)) if(!can_control(user, R))
continue continue
robots++ robots++
dat += "[R.name] |" dat += "[R.name] |"
if(R.stat) if(R.stat)
dat += " Not Responding |" dat += " Not Responding |"
else if (!R.canmove) else if (!R.canmove)
dat += " Locked Down |" dat += " Locked Down |"
else else
dat += " Operating Normally |" dat += " Operating Normally |"
if (!R.canmove) if (!R.canmove)
else if(R.cell) else if(R.cell)
dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |" dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |"
else else
dat += " No Cell Installed |" dat += " No Cell Installed |"
if(R.module) if(R.module)
dat += " Module Installed ([R.module.name]) |" dat += " Module Installed ([R.module.name]) |"
else else
dat += " No Module Installed |" dat += " No Module Installed |"
if(R.connected_ai) if(R.connected_ai)
dat += " Slaved to [R.connected_ai.name] |" dat += " Slaved to [R.connected_ai.name] |"
else else
dat += " Independent from AI |" dat += " Independent from AI |"
if(issilicon(user) || IsAdminGhost(user)) if(issilicon(user) || IsAdminGhost(user))
if(is_servant_of_ratvar(user) && user != R) if(is_servant_of_ratvar(user) && user != R)
dat += "<A href='?src=\ref[src];convert=\ref[R]'>(<font color=#BE8700><i>Convert</i></font>)</A> " dat += "<A href='?src=\ref[src];convert=\ref[R]'>(<font color=#BE8700><i>Convert</i></font>)</A> "
else if(((issilicon(user) && is_special_character(user)) || IsAdminGhost(user)) && !R.emagged && (user != R || R.syndicate)) else if(((issilicon(user) && is_special_character(user)) || IsAdminGhost(user)) && !R.emagged && (user != R || R.syndicate))
dat += "<A href='?src=\ref[src];magbot=\ref[R]'>(<font color=blue><i>Hack</i></font>)</A> " dat += "<A href='?src=\ref[src];magbot=\ref[R]'>(<font color=blue><i>Hack</i></font>)</A> "
dat += "<A href='?src=\ref[src];stopbot=\ref[R]'>(<font color=green><i>[R.canmove ? "Lockdown" : "Release"]</i></font>)</A> " dat += "<A href='?src=\ref[src];stopbot=\ref[R]'>(<font color=green><i>[R.canmove ? "Lockdown" : "Release"]</i></font>)</A> "
dat += "<A href='?src=\ref[src];killbot=\ref[R]'>(<font color=red><i>Destroy</i></font>)</A>" dat += "<A href='?src=\ref[src];killbot=\ref[R]'>(<font color=red><i>Destroy</i></font>)</A>"
dat += "<BR>" dat += "<BR>"
if(!robots) if(!robots)
dat += "No Cyborg Units detected within access parameters." dat += "No Cyborg Units detected within access parameters."
dat += "<BR>" dat += "<BR>"
var/drones = 0 var/drones = 0
for(var/mob/living/simple_animal/drone/D in GLOB.mob_list) for(var/mob/living/simple_animal/drone/D in GLOB.mob_list)
if(D.hacked) if(D.hacked)
continue continue
drones++ drones++
dat += "[D.name] |" dat += "[D.name] |"
if(D.stat) if(D.stat)
dat += " Not Responding |" dat += " Not Responding |"
dat += "<A href='?src=\ref[src];killdrone=\ref[D]'>(<font color=red><i>Destroy</i></font>)</A>" dat += "<A href='?src=\ref[src];killdrone=\ref[D]'>(<font color=red><i>Destroy</i></font>)</A>"
dat += "<BR>" dat += "<BR>"
if(!drones) if(!drones)
dat += "No Drone Units detected within access parameters." dat += "No Drone Units detected within access parameters."
var/datum/browser/popup = new(user, "computer", "Cyborg Control Console", 400, 500) var/datum/browser/popup = new(user, "computer", "Cyborg Control Console", 400, 500)
popup.set_content(dat) popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open() popup.open()
return return
/obj/machinery/computer/robotics/Topic(href, href_list) /obj/machinery/computer/robotics/Topic(href, href_list)
if(..()) if(..())
return return
if (href_list["temp"]) if (href_list["temp"])
src.temp = null src.temp = null
else if (href_list["killbot"]) else if (href_list["killbot"])
if(src.allowed(usr)) if(src.allowed(usr))
var/mob/living/silicon/robot/R = locate(href_list["killbot"]) in GLOB.silicon_mobs var/mob/living/silicon/robot/R = locate(href_list["killbot"]) in GLOB.silicon_mobs
if(can_control(usr, R)) if(can_control(usr, R))
var/choice = input("Are you certain you wish to detonate [R.name]?") in list("Confirm", "Abort") var/choice = input("Are you certain you wish to detonate [R.name]?") in list("Confirm", "Abort")
if(choice == "Confirm" && can_control(usr, R) && !..()) if(choice == "Confirm" && can_control(usr, R) && !..())
if(R.syndicate && R.emagged) if(R.syndicate && R.emagged)
to_chat(R, "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered.") to_chat(R, "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered.")
if(R.connected_ai) if(R.connected_ai)
to_chat(R.connected_ai, "<br><br><span class='alert'>ALERT - Cyborg detonation detected: [R.name]</span><br>") to_chat(R.connected_ai, "<br><br><span class='alert'>ALERT - Cyborg detonation detected: [R.name]</span><br>")
R.ResetSecurityCodes() R.ResetSecurityCodes()
else else
var/turf/T = get_turf(R) var/turf/T = get_turf(R)
message_admins("<span class='notice'>[ADMIN_LOOKUPFLW(usr)] detonated [key_name(R, R.client)][ADMIN_JMP(T)]!</span>") message_admins("<span class='notice'>[ADMIN_LOOKUPFLW(usr)] detonated [key_name(R, R.client)][ADMIN_JMP(T)]!</span>")
log_game("\<span class='notice'>[key_name(usr)] detonated [key_name(R)]!</span>") log_game("\<span class='notice'>[key_name(usr)] detonated [key_name(R)]!</span>")
if(R.connected_ai) if(R.connected_ai)
to_chat(R.connected_ai, "<br><br><span class='alert'>ALERT - Cyborg detonation detected: [R.name]</span><br>") to_chat(R.connected_ai, "<br><br><span class='alert'>ALERT - Cyborg detonation detected: [R.name]</span><br>")
R.self_destruct() R.self_destruct()
else else
to_chat(usr, "<span class='danger'>Access Denied.</span>") to_chat(usr, "<span class='danger'>Access Denied.</span>")
else if (href_list["stopbot"]) else if (href_list["stopbot"])
if(src.allowed(usr)) if(src.allowed(usr))
var/mob/living/silicon/robot/R = locate(href_list["stopbot"]) in GLOB.silicon_mobs var/mob/living/silicon/robot/R = locate(href_list["stopbot"]) in GLOB.silicon_mobs
if(can_control(usr, R)) if(can_control(usr, R))
var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort") var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort")
if(choice == "Confirm" && can_control(usr, R) && !..()) if(choice == "Confirm" && can_control(usr, R) && !..())
message_admins("<span class='notice'>[ADMIN_LOOKUPFLW(usr)] [R.canmove ? "locked down" : "released"] [key_name(R, R.client)][ADMIN_LOOKUPFLW(R)]!</span>") message_admins("<span class='notice'>[ADMIN_LOOKUPFLW(usr)] [R.canmove ? "locked down" : "released"] [key_name(R, R.client)][ADMIN_LOOKUPFLW(R)]!</span>")
log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [key_name(R)]!") log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [key_name(R)]!")
R.SetLockdown(!R.lockcharge) R.SetLockdown(!R.lockcharge)
to_chat(R, "[!R.lockcharge ? "<span class='notice'>Your lockdown has been lifted!" : "<span class='alert'>You have been locked down!"]</span>") to_chat(R, "[!R.lockcharge ? "<span class='notice'>Your lockdown has been lifted!" : "<span class='alert'>You have been locked down!"]</span>")
if(R.connected_ai) if(R.connected_ai)
to_chat(R.connected_ai, "[!R.lockcharge ? "<span class='notice'>NOTICE - Cyborg lockdown lifted" : "<span class='alert'>ALERT - Cyborg lockdown detected"]: <a href='?src=\ref[R.connected_ai];track=[html_encode(R.name)]'>[R.name]</a></span><br>") to_chat(R.connected_ai, "[!R.lockcharge ? "<span class='notice'>NOTICE - Cyborg lockdown lifted" : "<span class='alert'>ALERT - Cyborg lockdown detected"]: <a href='?src=\ref[R.connected_ai];track=[html_encode(R.name)]'>[R.name]</a></span><br>")
else else
to_chat(usr, "<span class='danger'>Access Denied.</span>") to_chat(usr, "<span class='danger'>Access Denied.</span>")
else if (href_list["magbot"]) else if (href_list["magbot"])
if((issilicon(usr) && is_special_character(usr)) || IsAdminGhost(usr)) if((issilicon(usr) && is_special_character(usr)) || IsAdminGhost(usr))
var/mob/living/silicon/robot/R = locate(href_list["magbot"]) in GLOB.silicon_mobs var/mob/living/silicon/robot/R = locate(href_list["magbot"]) in GLOB.silicon_mobs
if(istype(R) && !R.emagged && ((R.syndicate && R == usr) || R.connected_ai == usr || IsAdminGhost(usr)) && !R.scrambledcodes && can_control(usr, R)) if(istype(R) && !R.emagged && ((R.syndicate && R == usr) || R.connected_ai == usr || IsAdminGhost(usr)) && !R.scrambledcodes && can_control(usr, R))
log_game("[key_name(usr)] emagged [R.name] using robotic console!") log_game("[key_name(usr)] emagged [R.name] using robotic console!")
message_admins("[key_name_admin(usr)] emagged cyborg [key_name_admin(R)] using robotic console!") message_admins("[key_name_admin(usr)] emagged cyborg [key_name_admin(R)] using robotic console!")
R.SetEmagged(1) R.SetEmagged(1)
if(is_special_character(R)) if(is_special_character(R))
R.verbs += /mob/living/silicon/robot/proc/ResetSecurityCodes R.verbs += /mob/living/silicon/robot/proc/ResetSecurityCodes
else if(href_list["convert"]) else if(href_list["convert"])
if(issilicon(usr) && is_special_character(usr)) if(issilicon(usr) && is_special_character(usr))
var/mob/living/silicon/robot/R = locate(href_list["convert"]) in GLOB.silicon_mobs var/mob/living/silicon/robot/R = locate(href_list["convert"]) in GLOB.silicon_mobs
if(istype(R) && !is_servant_of_ratvar(R) && is_servant_of_ratvar(usr) && R.connected_ai == usr) if(istype(R) && !is_servant_of_ratvar(R) && is_servant_of_ratvar(usr) && R.connected_ai == usr)
log_game("[key_name(usr)] converted [R.name] using robotic console!") log_game("[key_name(usr)] converted [R.name] using robotic console!")
message_admins("[key_name_admin(usr)] converted cyborg [key_name_admin(R)] using robotic console!") message_admins("[key_name_admin(usr)] converted cyborg [key_name_admin(R)] using robotic console!")
add_servant_of_ratvar(R) add_servant_of_ratvar(R)
else if (href_list["killdrone"]) else if (href_list["killdrone"])
if(src.allowed(usr)) if(src.allowed(usr))
var/mob/living/simple_animal/drone/D = locate(href_list["killdrone"]) var/mob/living/simple_animal/drone/D = locate(href_list["killdrone"])
if(D.hacked) if(D.hacked)
to_chat(usr, "<span class='danger'>ERROR: [D] is not responding to external commands.</span>") to_chat(usr, "<span class='danger'>ERROR: [D] is not responding to external commands.</span>")
else else
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, D) s.set_up(3, 1, D)
s.start() s.start()
D.visible_message("<span class='danger'>\the [D] self destructs!</span>") D.visible_message("<span class='danger'>\the [D] self destructs!</span>")
D.gib() D.gib()
src.updateUsrDialog() src.updateUsrDialog()
return return

View File

@@ -1,211 +1,211 @@
#define SAFETY_COOLDOWN 100 #define SAFETY_COOLDOWN 100
/obj/machinery/recycler /obj/machinery/recycler
name = "recycler" name = "recycler"
desc = "A large crushing machine used to recycle small items inefficiently. There are lights on the side." desc = "A large crushing machine used to recycle small items inefficiently. There are lights on the side."
icon = 'icons/obj/recycling.dmi' icon = 'icons/obj/recycling.dmi'
icon_state = "grinder-o0" icon_state = "grinder-o0"
layer = ABOVE_ALL_MOB_LAYER // Overhead layer = ABOVE_ALL_MOB_LAYER // Overhead
anchored = 1 anchored = 1
density = 1 density = 1
var/safety_mode = FALSE // Temporarily stops machine if it detects a mob var/safety_mode = FALSE // Temporarily stops machine if it detects a mob
var/icon_name = "grinder-o" var/icon_name = "grinder-o"
var/blood = 0 var/blood = 0
var/eat_dir = WEST var/eat_dir = WEST
var/amount_produced = 50 var/amount_produced = 50
var/datum/material_container/materials var/datum/material_container/materials
var/crush_damage = 1000 var/crush_damage = 1000
var/eat_victim_items = TRUE var/eat_victim_items = TRUE
var/item_recycle_sound = 'sound/items/Welder.ogg' var/item_recycle_sound = 'sound/items/Welder.ogg'
/obj/machinery/recycler/New() /obj/machinery/recycler/New()
..() ..()
materials = new /datum/material_container(src, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM)) materials = new /datum/material_container(src, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM))
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/recycler(null) var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/recycler(null)
B.apply_default_parts(src) B.apply_default_parts(src)
update_icon() update_icon()
/obj/item/weapon/circuitboard/machine/recycler /obj/item/weapon/circuitboard/machine/recycler
name = "Recycler (Machine Board)" name = "Recycler (Machine Board)"
build_path = /obj/machinery/recycler build_path = /obj/machinery/recycler
origin_tech = "programming=2;engineering=2" origin_tech = "programming=2;engineering=2"
req_components = list( req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/manipulator = 1) /obj/item/weapon/stock_parts/manipulator = 1)
/obj/machinery/recycler/RefreshParts() /obj/machinery/recycler/RefreshParts()
var/amt_made = 0 var/amt_made = 0
var/mat_mod = 0 var/mat_mod = 0
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
mat_mod = 2 * B.rating mat_mod = 2 * B.rating
mat_mod *= 50000 mat_mod *= 50000
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
amt_made = 12.5 * M.rating //% of materials salvaged amt_made = 12.5 * M.rating //% of materials salvaged
materials.max_amount = mat_mod materials.max_amount = mat_mod
amount_produced = min(50, amt_made) + 50 amount_produced = min(50, amt_made) + 50
/obj/machinery/recycler/examine(mob/user) /obj/machinery/recycler/examine(mob/user)
..() ..()
to_chat(user, "The power light is [(stat & NOPOWER) ? "off" : "on"].") to_chat(user, "The power light is [(stat & NOPOWER) ? "off" : "on"].")
to_chat(user, "The safety-mode light is [safety_mode ? "on" : "off"].") to_chat(user, "The safety-mode light is [safety_mode ? "on" : "off"].")
to_chat(user, "The safety-sensors status light is [emagged ? "off" : "on"].") to_chat(user, "The safety-sensors status light is [emagged ? "off" : "on"].")
/obj/machinery/recycler/power_change() /obj/machinery/recycler/power_change()
..() ..()
update_icon() update_icon()
/obj/machinery/recycler/attackby(obj/item/I, mob/user, params) /obj/machinery/recycler/attackby(obj/item/I, mob/user, params)
if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I)) if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I))
return return
if(exchange_parts(user, I)) if(exchange_parts(user, I))
return return
if(default_pry_open(I)) if(default_pry_open(I))
return return
if(default_unfasten_wrench(user, I)) if(default_unfasten_wrench(user, I))
return return
if(default_deconstruction_crowbar(I)) if(default_deconstruction_crowbar(I))
return return
return ..() return ..()
/obj/machinery/recycler/emag_act(mob/user) /obj/machinery/recycler/emag_act(mob/user)
if(!emagged) if(!emagged)
emagged = TRUE emagged = TRUE
if(safety_mode) if(safety_mode)
safety_mode = FALSE safety_mode = FALSE
update_icon() update_icon()
playsound(src.loc, "sparks", 75, 1, -1) playsound(src.loc, "sparks", 75, 1, -1)
to_chat(user, "<span class='notice'>You use the cryptographic sequencer on the [src.name].</span>") to_chat(user, "<span class='notice'>You use the cryptographic sequencer on the [src.name].</span>")
/obj/machinery/recycler/update_icon() /obj/machinery/recycler/update_icon()
..() ..()
var/is_powered = !(stat & (BROKEN|NOPOWER)) var/is_powered = !(stat & (BROKEN|NOPOWER))
if(safety_mode) if(safety_mode)
is_powered = FALSE is_powered = FALSE
icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end
// This is purely for admin possession !FUN!. // This is purely for admin possession !FUN!.
/obj/machinery/recycler/Bump(atom/movable/AM) /obj/machinery/recycler/Bump(atom/movable/AM)
..() ..()
if(AM) if(AM)
Bumped(AM) Bumped(AM)
/obj/machinery/recycler/Bumped(atom/movable/AM) /obj/machinery/recycler/Bumped(atom/movable/AM)
if(stat & (BROKEN|NOPOWER)) if(stat & (BROKEN|NOPOWER))
return return
if(!anchored) if(!anchored)
return return
if(safety_mode) if(safety_mode)
return return
var/move_dir = get_dir(loc, AM.loc) var/move_dir = get_dir(loc, AM.loc)
if(move_dir == eat_dir) if(move_dir == eat_dir)
eat(AM) eat(AM)
/obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE) /obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE)
var/list/to_eat var/list/to_eat
if(istype(AM0, /obj/item)) if(istype(AM0, /obj/item))
to_eat = AM0.GetAllContents() to_eat = AM0.GetAllContents()
else else
to_eat = list(AM0) to_eat = list(AM0)
var/items_recycled = 0 var/items_recycled = 0
for(var/i in to_eat) for(var/i in to_eat)
var/atom/movable/AM = i var/atom/movable/AM = i
var/obj/item/bodypart/head/as_head = AM var/obj/item/bodypart/head/as_head = AM
var/obj/item/device/mmi/as_mmi = AM var/obj/item/device/mmi/as_mmi = AM
var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /mob/living/brain) var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /mob/living/brain)
if(isliving(AM) || brain_holder) if(isliving(AM) || brain_holder)
if(emagged) if(emagged)
if(!brain_holder) if(!brain_holder)
crush_living(AM) crush_living(AM)
else else
emergency_stop(AM) emergency_stop(AM)
else if(istype(AM, /obj/item)) else if(istype(AM, /obj/item))
recycle_item(AM) recycle_item(AM)
items_recycled++ items_recycled++
else else
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
AM.loc = src.loc AM.loc = src.loc
if(items_recycled && sound) if(items_recycled && sound)
playsound(src.loc, item_recycle_sound, 50, 1) playsound(src.loc, item_recycle_sound, 50, 1)
/obj/machinery/recycler/proc/recycle_item(obj/item/I) /obj/machinery/recycler/proc/recycle_item(obj/item/I)
I.loc = src.loc I.loc = src.loc
var/material_amount = materials.get_item_material_amount(I) var/material_amount = materials.get_item_material_amount(I)
if(!material_amount) if(!material_amount)
qdel(I) qdel(I)
return return
materials.insert_item(I, multiplier = (amount_produced / 100)) materials.insert_item(I, multiplier = (amount_produced / 100))
qdel(I) qdel(I)
materials.retrieve_all() materials.retrieve_all()
/obj/machinery/recycler/proc/emergency_stop(mob/living/L) /obj/machinery/recycler/proc/emergency_stop(mob/living/L)
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
safety_mode = TRUE safety_mode = TRUE
update_icon() update_icon()
L.loc = src.loc L.loc = src.loc
addtimer(CALLBACK(src, .proc/reboot), SAFETY_COOLDOWN) addtimer(CALLBACK(src, .proc/reboot), SAFETY_COOLDOWN)
/obj/machinery/recycler/proc/reboot() /obj/machinery/recycler/proc/reboot()
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
safety_mode = FALSE safety_mode = FALSE
update_icon() update_icon()
/obj/machinery/recycler/proc/crush_living(mob/living/L) /obj/machinery/recycler/proc/crush_living(mob/living/L)
L.loc = src.loc L.loc = src.loc
if(issilicon(L)) if(issilicon(L))
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
else else
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
var/gib = TRUE var/gib = TRUE
// By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count) // By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count)
if(iscarbon(L)) if(iscarbon(L))
gib = FALSE gib = FALSE
if(L.stat == CONSCIOUS) if(L.stat == CONSCIOUS)
L.say("ARRRRRRRRRRRGH!!!") L.say("ARRRRRRRRRRRGH!!!")
add_mob_blood(L) add_mob_blood(L)
if(!blood && !issilicon(L)) if(!blood && !issilicon(L))
blood = TRUE blood = TRUE
update_icon() update_icon()
// Remove and recycle the equipped items // Remove and recycle the equipped items
if(eat_victim_items) if(eat_victim_items)
for(var/obj/item/I in L.get_equipped_items()) for(var/obj/item/I in L.get_equipped_items())
if(L.dropItemToGround(I)) if(L.dropItemToGround(I))
eat(I, sound=FALSE) eat(I, sound=FALSE)
// Instantly lie down, also go unconscious from the pain, before you die. // Instantly lie down, also go unconscious from the pain, before you die.
L.Paralyse(5) L.Paralyse(5)
// For admin fun, var edit emagged to 2. // For admin fun, var edit emagged to 2.
if(gib || emagged == 2) if(gib || emagged == 2)
L.gib() L.gib()
else if(emagged == 1) else if(emagged == 1)
L.adjustBruteLoss(crush_damage) L.adjustBruteLoss(crush_damage)
/obj/machinery/recycler/deathtrap /obj/machinery/recycler/deathtrap
name = "dangerous old crusher" name = "dangerous old crusher"
emagged = TRUE emagged = TRUE
crush_damage = 120 crush_damage = 120
flags = NODECONSTRUCT flags = NODECONSTRUCT
/obj/item/weapon/paper/recycler /obj/item/weapon/paper/recycler
name = "paper - 'garbage duty instructions'" name = "paper - 'garbage duty instructions'"
info = "<h2>New Assignment</h2> You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect the said trash.<br><br>There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then deliver these minerals to cargo or engineering. You are our last hope for a clean station, do not screw this up!" info = "<h2>New Assignment</h2> You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect the said trash.<br><br>There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then deliver these minerals to cargo or engineering. You are our last hope for a clean station, do not screw this up!"
#undef SAFETY_COOLDOWN #undef SAFETY_COOLDOWN

View File

@@ -1,388 +1,388 @@
// SUIT STORAGE UNIT ///////////////// // SUIT STORAGE UNIT /////////////////
/obj/machinery/suit_storage_unit /obj/machinery/suit_storage_unit
name = "suit storage unit" name = "suit storage unit"
desc = "An industrial unit made to hold space suits. It comes with a built-in UV cauterization mechanism. A small warning label advises that organic matter should not be placed into the unit." desc = "An industrial unit made to hold space suits. It comes with a built-in UV cauterization mechanism. A small warning label advises that organic matter should not be placed into the unit."
icon = 'icons/obj/suitstorage.dmi' icon = 'icons/obj/suitstorage.dmi'
icon_state = "close" icon_state = "close"
anchored = 1 anchored = 1
density = 1 density = 1
obj_integrity = 250 obj_integrity = 250
max_integrity = 250 max_integrity = 250
var/obj/item/clothing/suit/space/suit = null var/obj/item/clothing/suit/space/suit = null
var/obj/item/clothing/head/helmet/space/helmet = null var/obj/item/clothing/head/helmet/space/helmet = null
var/obj/item/clothing/mask/mask = null var/obj/item/clothing/mask/mask = null
var/obj/item/storage = null var/obj/item/storage = null
var/suit_type = null var/suit_type = null
var/helmet_type = null var/helmet_type = null
var/mask_type = null var/mask_type = null
var/storage_type = null var/storage_type = null
state_open = FALSE state_open = FALSE
var/locked = FALSE var/locked = FALSE
panel_open = FALSE panel_open = FALSE
var/safeties = TRUE var/safeties = TRUE
var/uv = FALSE var/uv = FALSE
var/uv_super = FALSE var/uv_super = FALSE
var/uv_cycles = 6 var/uv_cycles = 6
/obj/machinery/suit_storage_unit/standard_unit /obj/machinery/suit_storage_unit/standard_unit
suit_type = /obj/item/clothing/suit/space/eva suit_type = /obj/item/clothing/suit/space/eva
helmet_type = /obj/item/clothing/head/helmet/space/eva helmet_type = /obj/item/clothing/head/helmet/space/eva
mask_type = /obj/item/clothing/mask/breath mask_type = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/captain /obj/machinery/suit_storage_unit/captain
suit_type = /obj/item/clothing/suit/space/hardsuit/captain suit_type = /obj/item/clothing/suit/space/hardsuit/captain
mask_type = /obj/item/clothing/mask/gas/sechailer mask_type = /obj/item/clothing/mask/gas/sechailer
storage_type = /obj/item/weapon/tank/jetpack/oxygen/captain storage_type = /obj/item/weapon/tank/jetpack/oxygen/captain
/obj/machinery/suit_storage_unit/engine /obj/machinery/suit_storage_unit/engine
suit_type = /obj/item/clothing/suit/space/hardsuit/engine suit_type = /obj/item/clothing/suit/space/hardsuit/engine
mask_type = /obj/item/clothing/mask/breath mask_type = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/ce /obj/machinery/suit_storage_unit/ce
suit_type = /obj/item/clothing/suit/space/hardsuit/engine/elite suit_type = /obj/item/clothing/suit/space/hardsuit/engine/elite
mask_type = /obj/item/clothing/mask/breath mask_type = /obj/item/clothing/mask/breath
storage_type= /obj/item/clothing/shoes/magboots/advance storage_type= /obj/item/clothing/shoes/magboots/advance
/obj/machinery/suit_storage_unit/security /obj/machinery/suit_storage_unit/security
suit_type = /obj/item/clothing/suit/space/hardsuit/security suit_type = /obj/item/clothing/suit/space/hardsuit/security
mask_type = /obj/item/clothing/mask/gas/sechailer mask_type = /obj/item/clothing/mask/gas/sechailer
/obj/machinery/suit_storage_unit/hos /obj/machinery/suit_storage_unit/hos
suit_type = /obj/item/clothing/suit/space/hardsuit/security/hos suit_type = /obj/item/clothing/suit/space/hardsuit/security/hos
mask_type = /obj/item/clothing/mask/gas/sechailer mask_type = /obj/item/clothing/mask/gas/sechailer
storage_type = /obj/item/weapon/tank/internals/oxygen storage_type = /obj/item/weapon/tank/internals/oxygen
/obj/machinery/suit_storage_unit/atmos /obj/machinery/suit_storage_unit/atmos
suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos
mask_type = /obj/item/clothing/mask/gas mask_type = /obj/item/clothing/mask/gas
storage_type = /obj/item/weapon/watertank/atmos storage_type = /obj/item/weapon/watertank/atmos
/obj/machinery/suit_storage_unit/mining /obj/machinery/suit_storage_unit/mining
suit_type = /obj/item/clothing/suit/hooded/explorer suit_type = /obj/item/clothing/suit/hooded/explorer
mask_type = /obj/item/clothing/mask/gas/explorer mask_type = /obj/item/clothing/mask/gas/explorer
/obj/machinery/suit_storage_unit/mining/eva /obj/machinery/suit_storage_unit/mining/eva
suit_type = /obj/item/clothing/suit/space/hardsuit/mining suit_type = /obj/item/clothing/suit/space/hardsuit/mining
mask_type = /obj/item/clothing/mask/breath mask_type = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/cmo /obj/machinery/suit_storage_unit/cmo
suit_type = /obj/item/clothing/suit/space/hardsuit/medical suit_type = /obj/item/clothing/suit/space/hardsuit/medical
mask_type = /obj/item/clothing/mask/breath mask_type = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/rd /obj/machinery/suit_storage_unit/rd
suit_type = /obj/item/clothing/suit/space/hardsuit/rd suit_type = /obj/item/clothing/suit/space/hardsuit/rd
mask_type = /obj/item/clothing/mask/breath mask_type = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/syndicate /obj/machinery/suit_storage_unit/syndicate
suit_type = /obj/item/clothing/suit/space/hardsuit/syndi suit_type = /obj/item/clothing/suit/space/hardsuit/syndi
mask_type = /obj/item/clothing/mask/gas/syndicate mask_type = /obj/item/clothing/mask/gas/syndicate
storage_type = /obj/item/weapon/tank/jetpack/oxygen/harness storage_type = /obj/item/weapon/tank/jetpack/oxygen/harness
/obj/machinery/suit_storage_unit/ert/command /obj/machinery/suit_storage_unit/ert/command
suit_type = /obj/item/clothing/suit/space/hardsuit/ert suit_type = /obj/item/clothing/suit/space/hardsuit/ert
mask_type = /obj/item/clothing/mask/breath mask_type = /obj/item/clothing/mask/breath
storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double
/obj/machinery/suit_storage_unit/ert/security /obj/machinery/suit_storage_unit/ert/security
suit_type = /obj/item/clothing/suit/space/hardsuit/ert/sec suit_type = /obj/item/clothing/suit/space/hardsuit/ert/sec
mask_type = /obj/item/clothing/mask/breath mask_type = /obj/item/clothing/mask/breath
storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double
/obj/machinery/suit_storage_unit/ert/engineer /obj/machinery/suit_storage_unit/ert/engineer
suit_type = /obj/item/clothing/suit/space/hardsuit/ert/engi suit_type = /obj/item/clothing/suit/space/hardsuit/ert/engi
mask_type = /obj/item/clothing/mask/breath mask_type = /obj/item/clothing/mask/breath
storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double
/obj/machinery/suit_storage_unit/ert/medical /obj/machinery/suit_storage_unit/ert/medical
suit_type = /obj/item/clothing/suit/space/hardsuit/ert/med suit_type = /obj/item/clothing/suit/space/hardsuit/ert/med
mask_type = /obj/item/clothing/mask/breath mask_type = /obj/item/clothing/mask/breath
storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double
/obj/machinery/suit_storage_unit/New() /obj/machinery/suit_storage_unit/New()
..() ..()
wires = new /datum/wires/suit_storage_unit(src) wires = new /datum/wires/suit_storage_unit(src)
if(suit_type) if(suit_type)
suit = new suit_type(src) suit = new suit_type(src)
if(helmet_type) if(helmet_type)
helmet = new helmet_type(src) helmet = new helmet_type(src)
if(mask_type) if(mask_type)
mask = new mask_type(src) mask = new mask_type(src)
if(storage_type) if(storage_type)
storage = new storage_type(src) storage = new storage_type(src)
update_icon() update_icon()
/obj/machinery/suit_storage_unit/Destroy() /obj/machinery/suit_storage_unit/Destroy()
if(suit) if(suit)
qdel(suit) qdel(suit)
suit = null suit = null
if(helmet) if(helmet)
qdel(helmet) qdel(helmet)
helmet = null helmet = null
if(mask) if(mask)
qdel(mask) qdel(mask)
mask = null mask = null
if(storage) if(storage)
qdel(storage) qdel(storage)
storage = null storage = null
return ..() return ..()
/obj/machinery/suit_storage_unit/update_icon() /obj/machinery/suit_storage_unit/update_icon()
cut_overlays() cut_overlays()
if(uv) if(uv)
if(uv_super) if(uv_super)
add_overlay("super") add_overlay("super")
else if(occupant) else if(occupant)
add_overlay("uvhuman") add_overlay("uvhuman")
else else
add_overlay("uv") add_overlay("uv")
else if(state_open) else if(state_open)
if(stat & BROKEN) if(stat & BROKEN)
add_overlay("broken") add_overlay("broken")
else else
add_overlay("open") add_overlay("open")
if(suit) if(suit)
add_overlay("suit") add_overlay("suit")
if(helmet) if(helmet)
add_overlay("helm") add_overlay("helm")
if(storage) if(storage)
add_overlay("storage") add_overlay("storage")
else if(occupant) else if(occupant)
add_overlay("human") add_overlay("human")
/obj/machinery/suit_storage_unit/power_change() /obj/machinery/suit_storage_unit/power_change()
..() ..()
if(!is_operational() && state_open) if(!is_operational() && state_open)
open_machine() open_machine()
dump_contents() dump_contents()
update_icon() update_icon()
/obj/machinery/suit_storage_unit/proc/dump_contents() /obj/machinery/suit_storage_unit/proc/dump_contents()
dropContents() dropContents()
helmet = null helmet = null
suit = null suit = null
mask = null mask = null
storage = null storage = null
occupant = null occupant = null
/obj/machinery/suit_storage_unit/deconstruct(disassembled = TRUE) /obj/machinery/suit_storage_unit/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT)) if(!(flags & NODECONSTRUCT))
open_machine() open_machine()
dump_contents() dump_contents()
new /obj/item/stack/sheet/metal (loc, 2) new /obj/item/stack/sheet/metal (loc, 2)
qdel(src) qdel(src)
/obj/machinery/suit_storage_unit/MouseDrop_T(atom/A, mob/user) /obj/machinery/suit_storage_unit/MouseDrop_T(atom/A, mob/user)
if(user.stat || user.lying || !Adjacent(user) || !Adjacent(A) || !isliving(A)) if(user.stat || user.lying || !Adjacent(user) || !Adjacent(A) || !isliving(A))
return return
var/mob/living/target = A var/mob/living/target = A
if(!state_open) if(!state_open)
to_chat(user, "<span class='warning'>The unit's doors are shut!</span>") to_chat(user, "<span class='warning'>The unit's doors are shut!</span>")
return return
if(!is_operational()) if(!is_operational())
to_chat(user, "<span class='warning'>The unit is not operational!</span>") to_chat(user, "<span class='warning'>The unit is not operational!</span>")
return return
if(occupant || helmet || suit || storage) if(occupant || helmet || suit || storage)
to_chat(user, "<span class='warning'>It's too cluttered inside to fit in!</span>") to_chat(user, "<span class='warning'>It's too cluttered inside to fit in!</span>")
return return
if(target == user) if(target == user)
user.visible_message("<span class='warning'>[user] starts squeezing into [src]!</span>", "<span class='notice'>You start working your way into [src]...</span>") user.visible_message("<span class='warning'>[user] starts squeezing into [src]!</span>", "<span class='notice'>You start working your way into [src]...</span>")
else else
target.visible_message("<span class='warning'>[user] starts shoving [target] into [src]!</span>", "<span class='userdanger'>[user] starts shoving you into [src]!</span>") target.visible_message("<span class='warning'>[user] starts shoving [target] into [src]!</span>", "<span class='userdanger'>[user] starts shoving you into [src]!</span>")
if(do_mob(user, target, 30)) if(do_mob(user, target, 30))
if(occupant || helmet || suit || storage) if(occupant || helmet || suit || storage)
return return
if(target == user) if(target == user)
user.visible_message("<span class='warning'>[user] slips into [src] and closes the door behind them!</span>", "<span class=notice'>You slip into [src]'s cramped space and shut its door.</span>") user.visible_message("<span class='warning'>[user] slips into [src] and closes the door behind them!</span>", "<span class=notice'>You slip into [src]'s cramped space and shut its door.</span>")
else else
target.visible_message("<span class='warning'>[user] pushes [target] into [src] and shuts its door!<span>", "<span class='userdanger'>[user] shoves you into [src] and shuts the door!</span>") target.visible_message("<span class='warning'>[user] pushes [target] into [src] and shuts its door!<span>", "<span class='userdanger'>[user] shoves you into [src] and shuts the door!</span>")
close_machine(target) close_machine(target)
add_fingerprint(user) add_fingerprint(user)
/obj/machinery/suit_storage_unit/proc/cook() /obj/machinery/suit_storage_unit/proc/cook()
if(uv_cycles) if(uv_cycles)
uv_cycles-- uv_cycles--
uv = TRUE uv = TRUE
locked = TRUE locked = TRUE
update_icon() update_icon()
if(occupant) if(occupant)
var/mob/living/mob_occupant = occupant var/mob/living/mob_occupant = occupant
if(uv_super) if(uv_super)
mob_occupant.adjustFireLoss(rand(20, 36)) mob_occupant.adjustFireLoss(rand(20, 36))
else else
mob_occupant.adjustFireLoss(rand(10, 16)) mob_occupant.adjustFireLoss(rand(10, 16))
mob_occupant.emote("scream") mob_occupant.emote("scream")
addtimer(CALLBACK(src, .proc/cook), 50) addtimer(CALLBACK(src, .proc/cook), 50)
else else
uv_cycles = initial(uv_cycles) uv_cycles = initial(uv_cycles)
uv = FALSE uv = FALSE
locked = FALSE locked = FALSE
if(uv_super) if(uv_super)
visible_message("<span class='warning'>[src]'s door creaks open with a loud whining noise. A cloud of foul black smoke escapes from its chamber.</span>") visible_message("<span class='warning'>[src]'s door creaks open with a loud whining noise. A cloud of foul black smoke escapes from its chamber.</span>")
playsound(src, 'sound/machines/airlock_alien_prying.ogg', 50, 1) playsound(src, 'sound/machines/airlock_alien_prying.ogg', 50, 1)
helmet = null helmet = null
qdel(helmet) qdel(helmet)
suit = null suit = null
qdel(suit) // Delete everything but the occupant. qdel(suit) // Delete everything but the occupant.
mask = null mask = null
qdel(mask) qdel(mask)
storage = null storage = null
qdel(storage) qdel(storage)
// The wires get damaged too. // The wires get damaged too.
wires.cut_all() wires.cut_all()
else else
if(!occupant) if(!occupant)
visible_message("<span class='notice'>[src]'s door slides open. The glowing yellow lights dim to a gentle green.</span>") visible_message("<span class='notice'>[src]'s door slides open. The glowing yellow lights dim to a gentle green.</span>")
else else
visible_message("<span class='warning'>[src]'s door slides open, barraging you with the nauseating smell of charred flesh.</span>") visible_message("<span class='warning'>[src]'s door slides open, barraging you with the nauseating smell of charred flesh.</span>")
playsound(src, 'sound/machines/AirlockClose.ogg', 25, 1) playsound(src, 'sound/machines/AirlockClose.ogg', 25, 1)
for(var/obj/item/I in src) //Scorches away blood and forensic evidence, although the SSU itself is unaffected for(var/obj/item/I in src) //Scorches away blood and forensic evidence, although the SSU itself is unaffected
I.clean_blood() I.clean_blood()
I.fingerprints = list() I.fingerprints = list()
open_machine(FALSE) open_machine(FALSE)
if(occupant) if(occupant)
dump_contents() dump_contents()
/obj/machinery/suit_storage_unit/proc/shock(mob/user, prb) /obj/machinery/suit_storage_unit/proc/shock(mob/user, prb)
if(!prob(prb)) if(!prob(prb))
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src) s.set_up(5, 1, src)
s.start() s.start()
if(electrocute_mob(user, src, src, 1, TRUE)) if(electrocute_mob(user, src, src, 1, TRUE))
return 1 return 1
/obj/machinery/suit_storage_unit/relaymove(mob/user) /obj/machinery/suit_storage_unit/relaymove(mob/user)
container_resist(user) container_resist(user)
/obj/machinery/suit_storage_unit/container_resist(mob/living/user) /obj/machinery/suit_storage_unit/container_resist(mob/living/user)
add_fingerprint(user) add_fingerprint(user)
if(locked) if(locked)
visible_message("<span class='notice'>You see [user] kicking against the doors of [src]!</span>", "<span class='notice'>You start kicking against the doors...</span>") visible_message("<span class='notice'>You see [user] kicking against the doors of [src]!</span>", "<span class='notice'>You start kicking against the doors...</span>")
addtimer(CALLBACK(src, .proc/resist_open, user), 300) addtimer(CALLBACK(src, .proc/resist_open, user), 300)
else else
open_machine() open_machine()
dump_contents() dump_contents()
/obj/machinery/suit_storage_unit/proc/resist_open(mob/user) /obj/machinery/suit_storage_unit/proc/resist_open(mob/user)
if(!state_open && occupant && (user in src) && user.stat == 0) // Check they're still here. if(!state_open && occupant && (user in src) && user.stat == 0) // Check they're still here.
visible_message("<span class='notice'>You see [user] bursts out of [src]!</span>", "<span class='notice'>You escape the cramped confines of [src]!</span>") visible_message("<span class='notice'>You see [user] bursts out of [src]!</span>", "<span class='notice'>You escape the cramped confines of [src]!</span>")
open_machine() open_machine()
/obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params) /obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params)
if(state_open && is_operational()) if(state_open && is_operational())
if(istype(I, /obj/item/clothing/suit/space)) if(istype(I, /obj/item/clothing/suit/space))
if(suit) if(suit)
to_chat(user, "<span class='warning'>The unit already contains a suit!.</span>") to_chat(user, "<span class='warning'>The unit already contains a suit!.</span>")
return return
if(!user.drop_item()) if(!user.drop_item())
return return
suit = I suit = I
else if(istype(I, /obj/item/clothing/head/helmet)) else if(istype(I, /obj/item/clothing/head/helmet))
if(helmet) if(helmet)
to_chat(user, "<span class='warning'>The unit already contains a helmet!</span>") to_chat(user, "<span class='warning'>The unit already contains a helmet!</span>")
return return
if(!user.drop_item()) if(!user.drop_item())
return return
helmet = I helmet = I
else if(istype(I, /obj/item/clothing/mask)) else if(istype(I, /obj/item/clothing/mask))
if(mask) if(mask)
to_chat(user, "<span class='warning'>The unit already contains a mask!</span>") to_chat(user, "<span class='warning'>The unit already contains a mask!</span>")
return return
if(!user.drop_item()) if(!user.drop_item())
return return
mask = I mask = I
else else
if(storage) if(storage)
to_chat(user, "<span class='warning'>The auxiliary storage compartment is full!</span>") to_chat(user, "<span class='warning'>The auxiliary storage compartment is full!</span>")
return return
if(!user.drop_item()) if(!user.drop_item())
return return
storage = I storage = I
I.loc = src I.loc = src
visible_message("<span class='notice'>[user] inserts [I] into [src]</span>", "<span class='notice'>You load [I] into [src].</span>") visible_message("<span class='notice'>[user] inserts [I] into [src]</span>", "<span class='notice'>You load [I] into [src].</span>")
update_icon() update_icon()
return return
if(panel_open && is_wire_tool(I)) if(panel_open && is_wire_tool(I))
wires.interact(user) wires.interact(user)
if(!state_open) if(!state_open)
if(default_deconstruction_screwdriver(user, "panel", "close", I)) if(default_deconstruction_screwdriver(user, "panel", "close", I))
return return
if(default_pry_open(I)) if(default_pry_open(I))
dump_contents() dump_contents()
return return
return ..() return ..()
/obj/machinery/suit_storage_unit/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ /obj/machinery/suit_storage_unit/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state) datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui) if(!ui)
ui = new(user, src, ui_key, "suit_storage_unit", name, 400, 305, master_ui, state) ui = new(user, src, ui_key, "suit_storage_unit", name, 400, 305, master_ui, state)
ui.open() ui.open()
/obj/machinery/suit_storage_unit/ui_data() /obj/machinery/suit_storage_unit/ui_data()
var/list/data = list() var/list/data = list()
data["locked"] = locked data["locked"] = locked
data["open"] = state_open data["open"] = state_open
data["safeties"] = safeties data["safeties"] = safeties
data["uv_active"] = uv data["uv_active"] = uv
data["uv_super"] = uv_super data["uv_super"] = uv_super
if(helmet) if(helmet)
data["helmet"] = helmet.name data["helmet"] = helmet.name
if(suit) if(suit)
data["suit"] = suit.name data["suit"] = suit.name
if(mask) if(mask)
data["mask"] = mask.name data["mask"] = mask.name
if(storage) if(storage)
data["storage"] = storage.name data["storage"] = storage.name
if(occupant) if(occupant)
data["occupied"] = 1 data["occupied"] = 1
return data return data
/obj/machinery/suit_storage_unit/ui_act(action, params) /obj/machinery/suit_storage_unit/ui_act(action, params)
if(..() || uv) if(..() || uv)
return return
switch(action) switch(action)
if("door") if("door")
if(state_open) if(state_open)
close_machine() close_machine()
else else
open_machine(0) open_machine(0)
if(occupant) if(occupant)
dump_contents() // Dump out contents if someone is in there. dump_contents() // Dump out contents if someone is in there.
. = TRUE . = TRUE
if("lock") if("lock")
locked = !locked locked = !locked
. = TRUE . = TRUE
if("uv") if("uv")
if(occupant && safeties) if(occupant && safeties)
return return
else if(!helmet && !mask && !suit && !storage && !occupant) else if(!helmet && !mask && !suit && !storage && !occupant)
return return
else else
if(occupant) if(occupant)
var/mob/living/mob_occupant = occupant var/mob/living/mob_occupant = occupant
to_chat(mob_occupant, "<span class='userdanger'>[src]'s confines grow warm, then hot, then scorching. You're being burned [!mob_occupant.stat ? "alive" : "away"]!</span>") to_chat(mob_occupant, "<span class='userdanger'>[src]'s confines grow warm, then hot, then scorching. You're being burned [!mob_occupant.stat ? "alive" : "away"]!</span>")
cook() cook()
. = TRUE . = TRUE
if("dispense") if("dispense")
if(!state_open) if(!state_open)
return return
var/static/list/valid_items = list("helmet", "suit", "mask", "storage") var/static/list/valid_items = list("helmet", "suit", "mask", "storage")
var/item_name = params["item"] var/item_name = params["item"]
if(item_name in valid_items) if(item_name in valid_items)
var/obj/item/I = vars[item_name] var/obj/item/I = vars[item_name]
vars[item_name] = null vars[item_name] = null
if(I) if(I)
I.forceMove(loc) I.forceMove(loc)
. = TRUE . = TRUE
update_icon() update_icon()

View File

@@ -1,69 +1,69 @@
/obj/effect/portal /obj/effect/portal
name = "portal" name = "portal"
desc = "Looks unstable. Best to test it with the clown." desc = "Looks unstable. Best to test it with the clown."
icon = 'icons/obj/stationobjs.dmi' icon = 'icons/obj/stationobjs.dmi'
icon_state = "portal" icon_state = "portal"
density = 1 density = 1
var/obj/item/target = null var/obj/item/target = null
var/creator = null var/creator = null
anchored = 1 anchored = 1
var/precision = 1 // how close to the portal you will teleport. 0 = on the portal, 1 = adjacent var/precision = 1 // how close to the portal you will teleport. 0 = on the portal, 1 = adjacent
var/mech_sized = FALSE var/mech_sized = FALSE
/obj/effect/portal/Bumped(mob/M as mob|obj) /obj/effect/portal/Bumped(mob/M as mob|obj)
teleport(M) teleport(M)
/obj/effect/portal/attack_tk(mob/user) /obj/effect/portal/attack_tk(mob/user)
return return
/obj/effect/portal/attack_hand(mob/user) /obj/effect/portal/attack_hand(mob/user)
if(Adjacent(user)) if(Adjacent(user))
teleport(user) teleport(user)
/obj/effect/portal/attackby(obj/item/weapon/W, mob/user, params) /obj/effect/portal/attackby(obj/item/weapon/W, mob/user, params)
if(user && Adjacent(user)) if(user && Adjacent(user))
teleport(user) teleport(user)
/obj/effect/portal/make_frozen_visual() /obj/effect/portal/make_frozen_visual()
return return
/obj/effect/portal/New(loc, turf/target, creator=null, lifespan=300) /obj/effect/portal/New(loc, turf/target, creator=null, lifespan=300)
..() ..()
GLOB.portals += src GLOB.portals += src
src.target = target src.target = target
src.creator = creator src.creator = creator
var/area/A = get_area(target) var/area/A = get_area(target)
if(A && A.noteleport) // No point in persisting if the target is unreachable. if(A && A.noteleport) // No point in persisting if the target is unreachable.
qdel(src) qdel(src)
return return
if(lifespan > 0) if(lifespan > 0)
QDEL_IN(src, lifespan) QDEL_IN(src, lifespan)
/obj/effect/portal/Destroy() /obj/effect/portal/Destroy()
GLOB.portals -= src GLOB.portals -= src
if(istype(creator, /obj/item/weapon/hand_tele)) if(istype(creator, /obj/item/weapon/hand_tele))
var/obj/item/weapon/hand_tele/O = creator var/obj/item/weapon/hand_tele/O = creator
O.active_portals-- O.active_portals--
else if(istype(creator, /obj/item/weapon/gun/energy/wormhole_projector)) else if(istype(creator, /obj/item/weapon/gun/energy/wormhole_projector))
var/obj/item/weapon/gun/energy/wormhole_projector/P = creator var/obj/item/weapon/gun/energy/wormhole_projector/P = creator
P.portal_destroyed(src) P.portal_destroyed(src)
creator = null creator = null
return ..() return ..()
/obj/effect/portal/proc/teleport(atom/movable/M as mob|obj) /obj/effect/portal/proc/teleport(atom/movable/M as mob|obj)
if(istype(M, /obj/effect)) //sparks don't teleport if(istype(M, /obj/effect)) //sparks don't teleport
return return
if(M.anchored) if(M.anchored)
if(!(istype(M, /obj/mecha) && mech_sized)) if(!(istype(M, /obj/mecha) && mech_sized))
return return
if (!( target )) if (!( target ))
qdel(src) qdel(src)
return return
if (istype(M, /atom/movable)) if (istype(M, /atom/movable))
if(ismegafauna(M)) if(ismegafauna(M))
message_admins("[M] [ADMIN_FLW(M)] has teleported through [src].") message_admins("[M] [ADMIN_FLW(M)] has teleported through [src].")
do_teleport(M, target, precision) ///You will appear adjacent to the beacon do_teleport(M, target, precision) ///You will appear adjacent to the beacon

View File

@@ -8,8 +8,8 @@
var/on = 0 //Are we currently active?? var/on = 0 //Are we currently active??
var/menu_message = "" var/menu_message = ""
/obj/item/radio/integrated/Initialize() /obj/item/radio/integrated/Initialize()
. = ..() . = ..()
if (istype(loc.loc, /obj/item/device/pda)) if (istype(loc.loc, /obj/item/device/pda))
hostpda = loc.loc hostpda = loc.loc

View File

@@ -1,145 +1,145 @@
// Powersink - used to drain station power // Powersink - used to drain station power
/obj/item/device/powersink /obj/item/device/powersink
desc = "A nulling power sink which drains energy from electrical systems." desc = "A nulling power sink which drains energy from electrical systems."
name = "power sink" name = "power sink"
icon_state = "powersink0" icon_state = "powersink0"
item_state = "electronic" item_state = "electronic"
w_class = WEIGHT_CLASS_BULKY w_class = WEIGHT_CLASS_BULKY
flags = CONDUCT flags = CONDUCT
throwforce = 5 throwforce = 5
throw_speed = 1 throw_speed = 1
throw_range = 2 throw_range = 2
materials = list(MAT_METAL=750) materials = list(MAT_METAL=750)
origin_tech = "powerstorage=5;syndicate=5" origin_tech = "powerstorage=5;syndicate=5"
var/drain_rate = 1600000 // amount of power to drain per tick var/drain_rate = 1600000 // amount of power to drain per tick
var/power_drained = 0 // has drained this much power var/power_drained = 0 // has drained this much power
var/max_power = 1e10 // maximum power that can be drained before exploding var/max_power = 1e10 // maximum power that can be drained before exploding
var/mode = 0 // 0 = off, 1=clamped (off), 2=operating var/mode = 0 // 0 = off, 1=clamped (off), 2=operating
var/admins_warned = 0 // stop spam, only warn the admins once that we are about to boom var/admins_warned = 0 // stop spam, only warn the admins once that we are about to boom
var/const/DISCONNECTED = 0 var/const/DISCONNECTED = 0
var/const/CLAMPED_OFF = 1 var/const/CLAMPED_OFF = 1
var/const/OPERATING = 2 var/const/OPERATING = 2
var/obj/structure/cable/attached // the attached cable var/obj/structure/cable/attached // the attached cable
/obj/item/device/powersink/update_icon() /obj/item/device/powersink/update_icon()
icon_state = "powersink[mode == OPERATING]" icon_state = "powersink[mode == OPERATING]"
/obj/item/device/powersink/proc/set_mode(value) /obj/item/device/powersink/proc/set_mode(value)
if(value == mode) if(value == mode)
return return
switch(value) switch(value)
if(DISCONNECTED) if(DISCONNECTED)
attached = null attached = null
if(mode == OPERATING) if(mode == OPERATING)
STOP_PROCESSING(SSobj, src) STOP_PROCESSING(SSobj, src)
anchored = 0 anchored = 0
if(CLAMPED_OFF) if(CLAMPED_OFF)
if(!attached) if(!attached)
return return
if(mode == OPERATING) if(mode == OPERATING)
STOP_PROCESSING(SSobj, src) STOP_PROCESSING(SSobj, src)
anchored = 1 anchored = 1
if(OPERATING) if(OPERATING)
if(!attached) if(!attached)
return return
START_PROCESSING(SSobj, src) START_PROCESSING(SSobj, src)
anchored = 1 anchored = 1
mode = value mode = value
update_icon() update_icon()
set_light(0) set_light(0)
/obj/item/device/powersink/attackby(obj/item/I, mob/user, params) /obj/item/device/powersink/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/screwdriver)) if(istype(I, /obj/item/weapon/screwdriver))
if(mode == DISCONNECTED) if(mode == DISCONNECTED)
var/turf/T = loc var/turf/T = loc
if(isturf(T) && !T.intact) if(isturf(T) && !T.intact)
attached = locate() in T attached = locate() in T
if(!attached) if(!attached)
to_chat(user, "<span class='warning'>This device must be placed over an exposed, powered cable node!</span>") to_chat(user, "<span class='warning'>This device must be placed over an exposed, powered cable node!</span>")
else else
set_mode(CLAMPED_OFF) set_mode(CLAMPED_OFF)
user.visible_message( \ user.visible_message( \
"[user] attaches \the [src] to the cable.", \ "[user] attaches \the [src] to the cable.", \
"<span class='notice'>You attach \the [src] to the cable.</span>", "<span class='notice'>You attach \the [src] to the cable.</span>",
"<span class='italics'>You hear some wires being connected to something.</span>") "<span class='italics'>You hear some wires being connected to something.</span>")
else else
to_chat(user, "<span class='warning'>This device must be placed over an exposed, powered cable node!</span>") to_chat(user, "<span class='warning'>This device must be placed over an exposed, powered cable node!</span>")
else else
set_mode(DISCONNECTED) set_mode(DISCONNECTED)
user.visible_message( \ user.visible_message( \
"[user] detaches \the [src] from the cable.", \ "[user] detaches \the [src] from the cable.", \
"<span class='notice'>You detach \the [src] from the cable.</span>", "<span class='notice'>You detach \the [src] from the cable.</span>",
"<span class='italics'>You hear some wires being disconnected from something.</span>") "<span class='italics'>You hear some wires being disconnected from something.</span>")
else else
return ..() return ..()
/obj/item/device/powersink/attack_paw() /obj/item/device/powersink/attack_paw()
return return
/obj/item/device/powersink/attack_ai() /obj/item/device/powersink/attack_ai()
return return
/obj/item/device/powersink/attack_hand(mob/user) /obj/item/device/powersink/attack_hand(mob/user)
switch(mode) switch(mode)
if(DISCONNECTED) if(DISCONNECTED)
..() ..()
if(CLAMPED_OFF) if(CLAMPED_OFF)
user.visible_message( \ user.visible_message( \
"[user] activates \the [src]!", \ "[user] activates \the [src]!", \
"<span class='notice'>You activate \the [src].</span>", "<span class='notice'>You activate \the [src].</span>",
"<span class='italics'>You hear a click.</span>") "<span class='italics'>You hear a click.</span>")
message_admins("Power sink activated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(src)]") message_admins("Power sink activated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(src)]")
log_game("Power sink activated by [key_name(user)] at [COORD(src)]") log_game("Power sink activated by [key_name(user)] at [COORD(src)]")
set_mode(OPERATING) set_mode(OPERATING)
if(OPERATING) if(OPERATING)
user.visible_message( \ user.visible_message( \
"[user] deactivates \the [src]!", \ "[user] deactivates \the [src]!", \
"<span class='notice'>You deactivate \the [src].</span>", "<span class='notice'>You deactivate \the [src].</span>",
"<span class='italics'>You hear a click.</span>") "<span class='italics'>You hear a click.</span>")
set_mode(CLAMPED_OFF) set_mode(CLAMPED_OFF)
/obj/item/device/powersink/process() /obj/item/device/powersink/process()
if(!attached) if(!attached)
set_mode(DISCONNECTED) set_mode(DISCONNECTED)
return return
var/datum/powernet/PN = attached.powernet var/datum/powernet/PN = attached.powernet
if(PN) if(PN)
set_light(5) set_light(5)
// found a powernet, so drain up to max power from it // found a powernet, so drain up to max power from it
var/drained = min ( drain_rate, PN.avail ) var/drained = min ( drain_rate, PN.avail )
PN.load += drained PN.load += drained
power_drained += drained power_drained += drained
// if tried to drain more than available on powernet // if tried to drain more than available on powernet
// now look for APCs and drain their cells // now look for APCs and drain their cells
if(drained < drain_rate) if(drained < drain_rate)
for(var/obj/machinery/power/terminal/T in PN.nodes) for(var/obj/machinery/power/terminal/T in PN.nodes)
if(istype(T.master, /obj/machinery/power/apc)) if(istype(T.master, /obj/machinery/power/apc))
var/obj/machinery/power/apc/A = T.master var/obj/machinery/power/apc/A = T.master
if(A.operating && A.cell) if(A.operating && A.cell)
A.cell.charge = max(0, A.cell.charge - 50) A.cell.charge = max(0, A.cell.charge - 50)
power_drained += 50 power_drained += 50
if(A.charging == 2) // If the cell was full if(A.charging == 2) // If the cell was full
A.charging = 1 // It's no longer full A.charging = 1 // It's no longer full
if(power_drained > max_power * 0.98) if(power_drained > max_power * 0.98)
if (!admins_warned) if (!admins_warned)
admins_warned = 1 admins_warned = 1
message_admins("Power sink at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>) is 95% full. Explosion imminent.") message_admins("Power sink at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>) is 95% full. Explosion imminent.")
playsound(src, 'sound/effects/screech.ogg', 100, 1, 1) playsound(src, 'sound/effects/screech.ogg', 100, 1, 1)
if(power_drained >= max_power) if(power_drained >= max_power)
STOP_PROCESSING(SSobj, src) STOP_PROCESSING(SSobj, src)
explosion(src.loc, 4,8,16,32) explosion(src.loc, 4,8,16,32)
qdel(src) qdel(src)

View File

@@ -7,8 +7,8 @@
origin_tech = "bluespace=1" origin_tech = "bluespace=1"
dog_fashion = null dog_fashion = null
/obj/item/device/radio/beacon/Initialize() /obj/item/device/radio/beacon/Initialize()
. = ..() . = ..()
GLOB.teleportbeacons += src GLOB.teleportbeacons += src
/obj/item/device/radio/beacon/Destroy() /obj/item/device/radio/beacon/Destroy()

View File

@@ -11,8 +11,8 @@
var/obj/item/device/encryptionkey/keyslot2 = null var/obj/item/device/encryptionkey/keyslot2 = null
dog_fashion = null dog_fashion = null
/obj/item/device/radio/headset/Initialize() /obj/item/device/radio/headset/Initialize()
. = ..() . = ..()
recalculateChannels() recalculateChannels()
/obj/item/device/radio/headset/Destroy() /obj/item/device/radio/headset/Destroy()
@@ -47,21 +47,21 @@
item_state = "syndie_headset" item_state = "syndie_headset"
/obj/item/device/radio/headset/syndicate/alt/Initialize(mapload) /obj/item/device/radio/headset/syndicate/alt/Initialize(mapload)
. = ..() . = ..()
SET_SECONDARY_FLAG(src, BANG_PROTECT) SET_SECONDARY_FLAG(src, BANG_PROTECT)
/obj/item/device/radio/headset/syndicate/alt/leader /obj/item/device/radio/headset/syndicate/alt/leader
name = "team leader headset" name = "team leader headset"
command = TRUE command = TRUE
/obj/item/device/radio/headset/syndicate/Initialize() /obj/item/device/radio/headset/syndicate/Initialize()
. = ..() . = ..()
make_syndie() make_syndie()
/obj/item/device/radio/headset/binary /obj/item/device/radio/headset/binary
origin_tech = "syndicate=3" origin_tech = "syndicate=3"
/obj/item/device/radio/headset/binary/Initialize() /obj/item/device/radio/headset/binary/Initialize()
. = ..() . = ..()
qdel(keyslot) qdel(keyslot)
keyslot = new /obj/item/device/encryptionkey/binary keyslot = new /obj/item/device/encryptionkey/binary
recalculateChannels() recalculateChannels()
@@ -79,7 +79,7 @@
item_state = "sec_headset_alt" item_state = "sec_headset_alt"
/obj/item/device/radio/headset/headset_sec/alt/Initialize(mapload) /obj/item/device/radio/headset/headset_sec/alt/Initialize(mapload)
. = ..() . = ..()
SET_SECONDARY_FLAG(src, BANG_PROTECT) SET_SECONDARY_FLAG(src, BANG_PROTECT)
/obj/item/device/radio/headset/headset_eng /obj/item/device/radio/headset/headset_eng
@@ -134,7 +134,7 @@
item_state = "com_headset_alt" item_state = "com_headset_alt"
/obj/item/device/radio/headset/heads/captain/alt/Initialize(mapload) /obj/item/device/radio/headset/heads/captain/alt/Initialize(mapload)
. = ..() . = ..()
SET_SECONDARY_FLAG(src, BANG_PROTECT) SET_SECONDARY_FLAG(src, BANG_PROTECT)
/obj/item/device/radio/headset/heads/rd /obj/item/device/radio/headset/heads/rd
@@ -156,7 +156,7 @@
item_state = "com_headset_alt" item_state = "com_headset_alt"
/obj/item/device/radio/headset/heads/hos/alt/Initialize(mapload) /obj/item/device/radio/headset/heads/hos/alt/Initialize(mapload)
. = ..() . = ..()
SET_SECONDARY_FLAG(src, BANG_PROTECT) SET_SECONDARY_FLAG(src, BANG_PROTECT)
/obj/item/device/radio/headset/heads/ce /obj/item/device/radio/headset/heads/ce
@@ -213,7 +213,7 @@
keyslot = null keyslot = null
/obj/item/device/radio/headset/headset_cent/alt/Initialize(mapload) /obj/item/device/radio/headset/headset_cent/alt/Initialize(mapload)
. = ..() . = ..()
SET_SECONDARY_FLAG(src, BANG_PROTECT) SET_SECONDARY_FLAG(src, BANG_PROTECT)
/obj/item/device/radio/headset/ai /obj/item/device/radio/headset/ai

View File

@@ -11,8 +11,8 @@
var/last_tick //used to delay the powercheck var/last_tick //used to delay the powercheck
dog_fashion = null dog_fashion = null
/obj/item/device/radio/intercom/Initialize() /obj/item/device/radio/intercom/Initialize()
. = ..() . = ..()
START_PROCESSING(SSobj, src) START_PROCESSING(SSobj, src)
/obj/item/device/radio/intercom/Destroy() /obj/item/device/radio/intercom/Destroy()

View File

@@ -1,211 +1,211 @@
/obj/item/device/transfer_valve /obj/item/device/transfer_valve
icon = 'icons/obj/assemblies.dmi' icon = 'icons/obj/assemblies.dmi'
name = "tank transfer valve" name = "tank transfer valve"
icon_state = "valve_1" icon_state = "valve_1"
item_state = "ttv" item_state = "ttv"
desc = "Regulates the transfer of air between two tanks" desc = "Regulates the transfer of air between two tanks"
var/obj/item/weapon/tank/tank_one var/obj/item/weapon/tank/tank_one
var/obj/item/weapon/tank/tank_two var/obj/item/weapon/tank/tank_two
var/obj/item/device/attached_device var/obj/item/device/attached_device
var/mob/attacher = null var/mob/attacher = null
var/valve_open = 0 var/valve_open = 0
var/toggle = 1 var/toggle = 1
origin_tech = "materials=1;engineering=1" origin_tech = "materials=1;engineering=1"
/obj/item/device/transfer_valve/IsAssemblyHolder() /obj/item/device/transfer_valve/IsAssemblyHolder()
return 1 return 1
/obj/item/device/transfer_valve/attackby(obj/item/item, mob/user, params) /obj/item/device/transfer_valve/attackby(obj/item/item, mob/user, params)
if(istype(item, /obj/item/weapon/tank)) if(istype(item, /obj/item/weapon/tank))
if(tank_one && tank_two) if(tank_one && tank_two)
to_chat(user, "<span class='warning'>There are already two tanks attached, remove one first!</span>") to_chat(user, "<span class='warning'>There are already two tanks attached, remove one first!</span>")
return return
if(!tank_one) if(!tank_one)
if(!user.transferItemToLoc(item, src)) if(!user.transferItemToLoc(item, src))
return return
tank_one = item tank_one = item
to_chat(user, "<span class='notice'>You attach the tank to the transfer valve.</span>") to_chat(user, "<span class='notice'>You attach the tank to the transfer valve.</span>")
if(item.w_class > w_class) if(item.w_class > w_class)
w_class = item.w_class w_class = item.w_class
else if(!tank_two) else if(!tank_two)
if(!user.transferItemToLoc(item, src)) if(!user.transferItemToLoc(item, src))
return return
tank_two = item tank_two = item
to_chat(user, "<span class='notice'>You attach the tank to the transfer valve.</span>") to_chat(user, "<span class='notice'>You attach the tank to the transfer valve.</span>")
if(item.w_class > w_class) if(item.w_class > w_class)
w_class = item.w_class w_class = item.w_class
update_icon() update_icon()
//TODO: Have this take an assemblyholder //TODO: Have this take an assemblyholder
else if(isassembly(item)) else if(isassembly(item))
var/obj/item/device/assembly/A = item var/obj/item/device/assembly/A = item
if(A.secured) if(A.secured)
to_chat(user, "<span class='notice'>The device is secured.</span>") to_chat(user, "<span class='notice'>The device is secured.</span>")
return return
if(attached_device) if(attached_device)
to_chat(user, "<span class='warning'>There is already a device attached to the valve, remove it first!</span>") to_chat(user, "<span class='warning'>There is already a device attached to the valve, remove it first!</span>")
return return
if(!user.transferItemToLoc(item, src)) if(!user.transferItemToLoc(item, src))
return return
attached_device = A attached_device = A
to_chat(user, "<span class='notice'>You attach the [item] to the valve controls and secure it.</span>") to_chat(user, "<span class='notice'>You attach the [item] to the valve controls and secure it.</span>")
A.holder = src A.holder = src
A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb). A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb).
GLOB.bombers += "[key_name(user)] attached a [item] to a transfer valve." GLOB.bombers += "[key_name(user)] attached a [item] to a transfer valve."
message_admins("[key_name_admin(user)] attached a [item] to a transfer valve.") message_admins("[key_name_admin(user)] attached a [item] to a transfer valve.")
log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") log_game("[key_name_admin(user)] attached a [item] to a transfer valve.")
attacher = user attacher = user
return return
/obj/item/device/transfer_valve/attack_self(mob/user) /obj/item/device/transfer_valve/attack_self(mob/user)
user.set_machine(src) user.set_machine(src)
var/dat = {"<B> Valve properties: </B> var/dat = {"<B> Valve properties: </B>
<BR> <B> Attachment one:</B> [tank_one] [tank_one ? "<A href='?src=\ref[src];tankone=1'>Remove</A>" : ""] <BR> <B> Attachment one:</B> [tank_one] [tank_one ? "<A href='?src=\ref[src];tankone=1'>Remove</A>" : ""]
<BR> <B> Attachment two:</B> [tank_two] [tank_two ? "<A href='?src=\ref[src];tanktwo=1'>Remove</A>" : ""] <BR> <B> Attachment two:</B> [tank_two] [tank_two ? "<A href='?src=\ref[src];tanktwo=1'>Remove</A>" : ""]
<BR> <B> Valve attachment:</B> [attached_device ? "<A href='?src=\ref[src];device=1'>[attached_device]</A>" : "None"] [attached_device ? "<A href='?src=\ref[src];rem_device=1'>Remove</A>" : ""] <BR> <B> Valve attachment:</B> [attached_device ? "<A href='?src=\ref[src];device=1'>[attached_device]</A>" : "None"] [attached_device ? "<A href='?src=\ref[src];rem_device=1'>Remove</A>" : ""]
<BR> <B> Valve status: </B> [ valve_open ? "<A href='?src=\ref[src];open=1'>Closed</A> <B>Open</B>" : "<B>Closed</B> <A href='?src=\ref[src];open=1'>Open</A>"]"} <BR> <B> Valve status: </B> [ valve_open ? "<A href='?src=\ref[src];open=1'>Closed</A> <B>Open</B>" : "<B>Closed</B> <A href='?src=\ref[src];open=1'>Open</A>"]"}
var/datum/browser/popup = new(user, "trans_valve", name) var/datum/browser/popup = new(user, "trans_valve", name)
popup.set_content(dat) popup.set_content(dat)
popup.open() popup.open()
return return
/obj/item/device/transfer_valve/Topic(href, href_list) /obj/item/device/transfer_valve/Topic(href, href_list)
..() ..()
if ( usr.stat || usr.restrained() ) if ( usr.stat || usr.restrained() )
return return
if (src.loc == usr) if (src.loc == usr)
if(tank_one && href_list["tankone"]) if(tank_one && href_list["tankone"])
split_gases() split_gases()
valve_open = 0 valve_open = 0
tank_one.loc = get_turf(src) tank_one.loc = get_turf(src)
tank_one = null tank_one = null
update_icon() update_icon()
if((!tank_two || tank_two.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL)) if((!tank_two || tank_two.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL))
w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_NORMAL
else if(tank_two && href_list["tanktwo"]) else if(tank_two && href_list["tanktwo"])
split_gases() split_gases()
valve_open = 0 valve_open = 0
tank_two.loc = get_turf(src) tank_two.loc = get_turf(src)
tank_two = null tank_two = null
update_icon() update_icon()
if((!tank_one || tank_one.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL)) if((!tank_one || tank_one.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL))
w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_NORMAL
else if(href_list["open"]) else if(href_list["open"])
toggle_valve() toggle_valve()
else if(attached_device) else if(attached_device)
if(href_list["rem_device"]) if(href_list["rem_device"])
attached_device.loc = get_turf(src) attached_device.loc = get_turf(src)
attached_device:holder = null attached_device:holder = null
attached_device = null attached_device = null
update_icon() update_icon()
if(href_list["device"]) if(href_list["device"])
attached_device.attack_self(usr) attached_device.attack_self(usr)
src.attack_self(usr) src.attack_self(usr)
src.add_fingerprint(usr) src.add_fingerprint(usr)
return return
return return
/obj/item/device/transfer_valve/proc/process_activation(obj/item/device/D) /obj/item/device/transfer_valve/proc/process_activation(obj/item/device/D)
if(toggle) if(toggle)
toggle = 0 toggle = 0
toggle_valve() toggle_valve()
spawn(50) // To stop a signal being spammed from a proxy sensor constantly going off or whatever spawn(50) // To stop a signal being spammed from a proxy sensor constantly going off or whatever
toggle = 1 toggle = 1
/obj/item/device/transfer_valve/update_icon() /obj/item/device/transfer_valve/update_icon()
cut_overlays() cut_overlays()
underlays = null underlays = null
if(!tank_one && !tank_two && !attached_device) if(!tank_one && !tank_two && !attached_device)
icon_state = "valve_1" icon_state = "valve_1"
return return
icon_state = "valve" icon_state = "valve"
if(tank_one) if(tank_one)
add_overlay("[tank_one.icon_state]") add_overlay("[tank_one.icon_state]")
if(tank_two) if(tank_two)
var/icon/J = new(icon, icon_state = "[tank_two.icon_state]") var/icon/J = new(icon, icon_state = "[tank_two.icon_state]")
J.Shift(WEST, 13) J.Shift(WEST, 13)
underlays += J underlays += J
if(attached_device) if(attached_device)
add_overlay("device") add_overlay("device")
/obj/item/device/transfer_valve/proc/merge_gases() /obj/item/device/transfer_valve/proc/merge_gases()
tank_two.air_contents.volume += tank_one.air_contents.volume tank_two.air_contents.volume += tank_one.air_contents.volume
var/datum/gas_mixture/temp var/datum/gas_mixture/temp
temp = tank_one.air_contents.remove_ratio(1) temp = tank_one.air_contents.remove_ratio(1)
tank_two.air_contents.merge(temp) tank_two.air_contents.merge(temp)
/obj/item/device/transfer_valve/proc/split_gases() /obj/item/device/transfer_valve/proc/split_gases()
if (!valve_open || !tank_one || !tank_two) if (!valve_open || !tank_one || !tank_two)
return return
var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume
var/datum/gas_mixture/temp var/datum/gas_mixture/temp
temp = tank_two.air_contents.remove_ratio(ratio1) temp = tank_two.air_contents.remove_ratio(ratio1)
tank_one.air_contents.merge(temp) tank_one.air_contents.merge(temp)
tank_two.air_contents.volume -= tank_one.air_contents.volume tank_two.air_contents.volume -= tank_one.air_contents.volume
/* /*
Exadv1: I know this isn't how it's going to work, but this was just to check Exadv1: I know this isn't how it's going to work, but this was just to check
it explodes properly when it gets a signal (and it does). it explodes properly when it gets a signal (and it does).
*/ */
/obj/item/device/transfer_valve/proc/toggle_valve() /obj/item/device/transfer_valve/proc/toggle_valve()
if(!valve_open && tank_one && tank_two) if(!valve_open && tank_one && tank_two)
valve_open = 1 valve_open = 1
var/turf/bombturf = get_turf(src) var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf) var/area/A = get_area(bombturf)
var/attachment = "no device" var/attachment = "no device"
if(attached_device) if(attached_device)
if(istype(attached_device, /obj/item/device/assembly/signaler)) if(istype(attached_device, /obj/item/device/assembly/signaler))
attachment = "<A HREF='?_src_=holder;secrets=list_signalers'>[attached_device]</A>" attachment = "<A HREF='?_src_=holder;secrets=list_signalers'>[attached_device]</A>"
else else
attachment = attached_device attachment = attached_device
var/attacher_name = "" var/attacher_name = ""
if(!attacher) if(!attacher)
attacher_name = "Unknown" attacher_name = "Unknown"
else else
attacher_name = "[key_name_admin(attacher)]" attacher_name = "[key_name_admin(attacher)]"
var/log_str1 = "Bomb valve opened in " var/log_str1 = "Bomb valve opened in "
var/log_str2 = "with [attachment] attacher: [attacher_name]" var/log_str2 = "with [attachment] attacher: [attacher_name]"
var/log_attacher = "" var/log_attacher = ""
if(attacher) if(attacher)
log_attacher = "[ADMIN_QUE(attacher)] [ADMIN_FLW(attacher)]" log_attacher = "[ADMIN_QUE(attacher)] [ADMIN_FLW(attacher)]"
var/mob/mob = get_mob_by_key(src.fingerprintslast) var/mob/mob = get_mob_by_key(src.fingerprintslast)
var/last_touch_info = "" var/last_touch_info = ""
if(mob) if(mob)
last_touch_info = "[ADMIN_QUE(mob)] [ADMIN_FLW(mob)]" last_touch_info = "[ADMIN_QUE(mob)] [ADMIN_FLW(mob)]"
var/log_str3 = " Last touched by: [key_name_admin(mob)]" var/log_str3 = " Last touched by: [key_name_admin(mob)]"
var/bomb_message = "[log_str1] [A.name][ADMIN_JMP(bombturf)] [log_str2][log_attacher] [log_str3][last_touch_info]" var/bomb_message = "[log_str1] [A.name][ADMIN_JMP(bombturf)] [log_str2][log_attacher] [log_str3][last_touch_info]"
GLOB.bombers += bomb_message GLOB.bombers += bomb_message
message_admins(bomb_message, 0, 1) message_admins(bomb_message, 0, 1)
log_game("[log_str1] [A.name][COORD(bombturf)] [log_str2] [log_str3]") log_game("[log_str1] [A.name][COORD(bombturf)] [log_str2] [log_str3]")
merge_gases() merge_gases()
spawn(20) // In case one tank bursts spawn(20) // In case one tank bursts
for (var/i=0,i<5,i++) for (var/i=0,i<5,i++)
src.update_icon() src.update_icon()
sleep(10) sleep(10)
src.update_icon() src.update_icon()
else if(valve_open && tank_one && tank_two) else if(valve_open && tank_one && tank_two)
split_gases() split_gases()
valve_open = 0 valve_open = 0
src.update_icon() src.update_icon()
// this doesn't do anything but the timer etc. expects it to be here // this doesn't do anything but the timer etc. expects it to be here
// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs // eventually maybe have it update icon to show state (timer, prox etc.) like old bombs
/obj/item/device/transfer_valve/proc/c_state() /obj/item/device/transfer_valve/proc/c_state()
return return

View File

@@ -50,7 +50,7 @@
M.dna.uni_identity = merge_text(M.dna.uni_identity, fields["UI"]) M.dna.uni_identity = merge_text(M.dna.uni_identity, fields["UI"])
M.updateappearance(mutations_overlay_update=1) M.updateappearance(mutations_overlay_update=1)
log_attack(log_msg) log_attack(log_msg)
return TRUE return TRUE
/obj/item/weapon/dnainjector/attack(mob/target, mob/user) /obj/item/weapon/dnainjector/attack(mob/target, mob/user)
if(!user.IsAdvancedToolUser()) if(!user.IsAdvancedToolUser())
@@ -77,9 +77,9 @@
add_logs(user, target, "injected", src) add_logs(user, target, "injected", src)
if(!inject(target, user)) //Now we actually do the heavy lifting. if(!inject(target, user)) //Now we actually do the heavy lifting.
to_chat(user, "<span class='notice'>It appears that [target] does not have compatible DNA.</span>") to_chat(user, "<span class='notice'>It appears that [target] does not have compatible DNA.</span>")
used = 1 used = 1
icon_state = "dnainjector0" icon_state = "dnainjector0"
desc += " This one is used up." desc += " This one is used up."

View File

@@ -48,27 +48,27 @@
/obj/item/weapon/grenade/attack_self(mob/user) /obj/item/weapon/grenade/attack_self(mob/user)
if(!active) if(!active)
if(clown_check(user)) if(clown_check(user))
preprime(user) preprime(user)
if(iscarbon(user)) if(iscarbon(user))
var/mob/living/carbon/C = user var/mob/living/carbon/C = user
C.throw_mode_on() C.throw_mode_on()
/obj/item/weapon/grenade/proc/preprime(mob/user) /obj/item/weapon/grenade/proc/preprime(mob/user)
if(user) if(user)
to_chat(user, "<span class='warning'>You prime the [name]! [det_time/10] seconds!</span>") to_chat(user, "<span class='warning'>You prime the [name]! [det_time/10] seconds!</span>")
playsound(loc, 'sound/weapons/armbomb.ogg', 60, 1) playsound(loc, 'sound/weapons/armbomb.ogg', 60, 1)
active = TRUE active = TRUE
icon_state = initial(icon_state) + "_active" icon_state = initial(icon_state) + "_active"
add_fingerprint(user) add_fingerprint(user)
var/turf/bombturf = get_turf(src) var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf) var/area/A = get_area(bombturf)
if(user) if(user)
var/message = "[ADMIN_LOOKUPFLW(user)]) has primed a [name] for detonation at [ADMIN_COORDJMP(bombturf)]" var/message = "[ADMIN_LOOKUPFLW(user)]) has primed a [name] for detonation at [ADMIN_COORDJMP(bombturf)]"
GLOB.bombers += message GLOB.bombers += message
message_admins(message) message_admins(message)
log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].") log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].")
addtimer(CALLBACK(src, .proc/prime), det_time) addtimer(CALLBACK(src, .proc/prime), det_time)
/obj/item/weapon/grenade/proc/prime() /obj/item/weapon/grenade/proc/prime()
@@ -108,4 +108,4 @@
if(damage && attack_type == PROJECTILE_ATTACK && prob(15)) if(damage && attack_type == PROJECTILE_ATTACK && prob(15))
owner.visible_message("<span class='danger'>[attack_text] hits [owner]'s [src], setting it off! What a shot!</span>") owner.visible_message("<span class='danger'>[attack_text] hits [owner]'s [src], setting it off! What a shot!</span>")
prime() prime()
return 1 //It hit the grenade, not them return 1 //It hit the grenade, not them

View File

@@ -1,189 +1,189 @@
/obj/machinery/implantchair /obj/machinery/implantchair
name = "mindshield implanter" name = "mindshield implanter"
desc = "Used to implant occupants with mindshield implants." desc = "Used to implant occupants with mindshield implants."
icon = 'icons/obj/machines/implantchair.dmi' icon = 'icons/obj/machines/implantchair.dmi'
icon_state = "implantchair" icon_state = "implantchair"
density = 1 density = 1
opacity = 0 opacity = 0
anchored = TRUE anchored = TRUE
var/ready = TRUE var/ready = TRUE
var/replenishing = FALSE var/replenishing = FALSE
var/ready_implants = 5 var/ready_implants = 5
var/max_implants = 5 var/max_implants = 5
var/injection_cooldown = 600 var/injection_cooldown = 600
var/replenish_cooldown = 6000 var/replenish_cooldown = 6000
var/implant_type = /obj/item/weapon/implant/mindshield var/implant_type = /obj/item/weapon/implant/mindshield
var/auto_inject = FALSE var/auto_inject = FALSE
var/auto_replenish = TRUE var/auto_replenish = TRUE
var/special = FALSE var/special = FALSE
var/special_name = "special function" var/special_name = "special function"
/obj/machinery/implantchair/New() /obj/machinery/implantchair/New()
..() ..()
open_machine() open_machine()
update_icon() update_icon()
/obj/machinery/implantchair/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ /obj/machinery/implantchair/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state) datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui) if(!ui)
ui = new(user, src, ui_key, "implantchair", name, 375, 280, master_ui, state) ui = new(user, src, ui_key, "implantchair", name, 375, 280, master_ui, state)
ui.open() ui.open()
/obj/machinery/implantchair/ui_data() /obj/machinery/implantchair/ui_data()
var/list/data = list() var/list/data = list()
data["occupied"] = occupant ? 1 : 0 data["occupied"] = occupant ? 1 : 0
data["open"] = state_open data["open"] = state_open
data["occupant"] = list() data["occupant"] = list()
if(occupant) if(occupant)
var/mob/living/mob_occupant = occupant var/mob/living/mob_occupant = occupant
data["occupant"]["name"] = mob_occupant.name data["occupant"]["name"] = mob_occupant.name
data["occupant"]["stat"] = mob_occupant.stat data["occupant"]["stat"] = mob_occupant.stat
data["special_name"] = special ? special_name : null data["special_name"] = special ? special_name : null
data["ready_implants"] = ready_implants data["ready_implants"] = ready_implants
data["ready"] = ready data["ready"] = ready
data["replenishing"] = replenishing data["replenishing"] = replenishing
return data return data
/obj/machinery/implantchair/ui_act(action, params) /obj/machinery/implantchair/ui_act(action, params)
if(..()) if(..())
return return
switch(action) switch(action)
if("door") if("door")
if(state_open) if(state_open)
close_machine() close_machine()
else else
open_machine() open_machine()
. = TRUE . = TRUE
if("implant") if("implant")
implant(occupant,usr) implant(occupant,usr)
. = TRUE . = TRUE
/obj/machinery/implantchair/proc/implant(mob/living/M,mob/user) /obj/machinery/implantchair/proc/implant(mob/living/M,mob/user)
if (!istype(M)) if (!istype(M))
return return
if(!ready_implants || !ready) if(!ready_implants || !ready)
return return
if(implant_action(M,user)) if(implant_action(M,user))
ready_implants-- ready_implants--
if(!replenishing && auto_replenish) if(!replenishing && auto_replenish)
replenishing = TRUE replenishing = TRUE
addtimer(CALLBACK(src,"replenish"),replenish_cooldown) addtimer(CALLBACK(src,"replenish"),replenish_cooldown)
if(injection_cooldown > 0) if(injection_cooldown > 0)
ready = FALSE ready = FALSE
addtimer(CALLBACK(src,"set_ready"),injection_cooldown) addtimer(CALLBACK(src,"set_ready"),injection_cooldown)
else else
playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, 1) playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, 1)
update_icon() update_icon()
/obj/machinery/implantchair/proc/implant_action(mob/living/M) /obj/machinery/implantchair/proc/implant_action(mob/living/M)
var/obj/item/weapon/implant/I = new implant_type var/obj/item/weapon/implant/I = new implant_type
if(I.implant(M)) if(I.implant(M))
visible_message("<span class='warning'>[M] has been implanted by the [name].</span>") visible_message("<span class='warning'>[M] has been implanted by the [name].</span>")
return 1 return 1
/obj/machinery/implantchair/update_icon() /obj/machinery/implantchair/update_icon()
icon_state = initial(icon_state) icon_state = initial(icon_state)
if(state_open) if(state_open)
icon_state += "_open" icon_state += "_open"
if(occupant) if(occupant)
icon_state += "_occupied" icon_state += "_occupied"
if(ready) if(ready)
add_overlay("ready") add_overlay("ready")
else else
cut_overlays() cut_overlays()
/obj/machinery/implantchair/proc/replenish() /obj/machinery/implantchair/proc/replenish()
if(ready_implants < max_implants) if(ready_implants < max_implants)
ready_implants++ ready_implants++
if(ready_implants < max_implants) if(ready_implants < max_implants)
addtimer(CALLBACK(src,"replenish"),replenish_cooldown) addtimer(CALLBACK(src,"replenish"),replenish_cooldown)
else else
replenishing = FALSE replenishing = FALSE
/obj/machinery/implantchair/proc/set_ready() /obj/machinery/implantchair/proc/set_ready()
ready = TRUE ready = TRUE
update_icon() update_icon()
/obj/machinery/implantchair/container_resist(mob/living/user) /obj/machinery/implantchair/container_resist(mob/living/user)
if(state_open) if(state_open)
return return
user.changeNext_move(CLICK_CD_BREAKOUT) user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT user.last_special = world.time + CLICK_CD_BREAKOUT
to_chat(user, "<span class='notice'>You lean on the back of [src] and start pushing the door open... (this will take about about a minute.)</span>") to_chat(user, "<span class='notice'>You lean on the back of [src] and start pushing the door open... (this will take about about a minute.)</span>")
audible_message("<span class='italics'>You hear a metallic creaking from [src]!</span>",hearing_distance = 2) audible_message("<span class='italics'>You hear a metallic creaking from [src]!</span>",hearing_distance = 2)
if(do_after(user, 600, target = src)) if(do_after(user, 600, target = src))
if(!user || user.stat != CONSCIOUS || user.loc != src || state_open) if(!user || user.stat != CONSCIOUS || user.loc != src || state_open)
return return
visible_message("<span class='warning'>[user] successfully broke out of [src]!</span>") visible_message("<span class='warning'>[user] successfully broke out of [src]!</span>")
to_chat(user, "<span class='notice'>You successfully break out of [src]!</span>") to_chat(user, "<span class='notice'>You successfully break out of [src]!</span>")
open_machine() open_machine()
/obj/machinery/implantchair/relaymove(mob/user) /obj/machinery/implantchair/relaymove(mob/user)
container_resist(user) container_resist(user)
/obj/machinery/implantchair/MouseDrop_T(mob/target, mob/user) /obj/machinery/implantchair/MouseDrop_T(mob/target, mob/user)
if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !isliving(target) || !user.IsAdvancedToolUser()) if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !isliving(target) || !user.IsAdvancedToolUser())
return return
close_machine(target) close_machine(target)
/obj/machinery/implantchair/close_machine(mob/living/user) /obj/machinery/implantchair/close_machine(mob/living/user)
if((isnull(user) || istype(user)) && state_open) if((isnull(user) || istype(user)) && state_open)
..(user) ..(user)
if(auto_inject && ready && ready_implants > 0) if(auto_inject && ready && ready_implants > 0)
implant(user,null) implant(user,null)
/obj/machinery/implantchair/genepurge /obj/machinery/implantchair/genepurge
name = "Genetic purifier" name = "Genetic purifier"
desc = "Used to purge human genome of foreign influences" desc = "Used to purge human genome of foreign influences"
special = TRUE special = TRUE
special_name = "Purge genome" special_name = "Purge genome"
injection_cooldown = 0 injection_cooldown = 0
replenish_cooldown = 300 replenish_cooldown = 300
/obj/machinery/implantchair/genepurge/implant_action(mob/living/carbon/human/H,mob/user) /obj/machinery/implantchair/genepurge/implant_action(mob/living/carbon/human/H,mob/user)
if(!istype(H)) if(!istype(H))
return 0 return 0
H.set_species(/datum/species/human, 1)//lizards go home H.set_species(/datum/species/human, 1)//lizards go home
purrbation_remove(H)//remove cats purrbation_remove(H)//remove cats
H.dna.remove_all_mutations()//hulks out H.dna.remove_all_mutations()//hulks out
return 1 return 1
/obj/machinery/implantchair/brainwash /obj/machinery/implantchair/brainwash
name = "Neural Imprinter" name = "Neural Imprinter"
desc = "Used to <s>indoctrinate</s> rehabilitate hardened recidivists." desc = "Used to <s>indoctrinate</s> rehabilitate hardened recidivists."
special_name = "Imprint" special_name = "Imprint"
injection_cooldown = 3000 injection_cooldown = 3000
auto_inject = FALSE auto_inject = FALSE
auto_replenish = FALSE auto_replenish = FALSE
special = TRUE special = TRUE
var/objective = "Obey the law. Praise Nanotrasen." var/objective = "Obey the law. Praise Nanotrasen."
var/custom = FALSE var/custom = FALSE
/obj/machinery/implantchair/brainwash/implant_action(mob/living/C,mob/user) /obj/machinery/implantchair/brainwash/implant_action(mob/living/C,mob/user)
if(!istype(C) || !C.mind) // I don't know how this makes any sense for silicons but laws trump objectives anyway. if(!istype(C) || !C.mind) // I don't know how this makes any sense for silicons but laws trump objectives anyway.
return 0 return 0
if(custom) if(custom)
if(!user || !user.Adjacent(src)) if(!user || !user.Adjacent(src))
return 0 return 0
objective = stripped_input(usr,"What order do you want to imprint on [C]?","Enter the order","",120) objective = stripped_input(usr,"What order do you want to imprint on [C]?","Enter the order","",120)
message_admins("[key_name_admin(user)] set brainwash machine objective to '[objective]'.") message_admins("[key_name_admin(user)] set brainwash machine objective to '[objective]'.")
log_game("[key_name_admin(user)] set brainwash machine objective to '[objective]'.") log_game("[key_name_admin(user)] set brainwash machine objective to '[objective]'.")
var/datum/objective/custom_objective = new/datum/objective(objective) var/datum/objective/custom_objective = new/datum/objective(objective)
custom_objective.owner = C.mind custom_objective.owner = C.mind
C.mind.objectives += custom_objective C.mind.objectives += custom_objective
C.mind.announce_objectives() C.mind.announce_objectives()
message_admins("[key_name_admin(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.") message_admins("[key_name_admin(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.")
log_game("[key_name_admin(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.") log_game("[key_name_admin(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.")
return 1 return 1

View File

@@ -1,305 +1,305 @@
/obj/item/weapon/storage/box/syndicate /obj/item/weapon/storage/box/syndicate
/obj/item/weapon/storage/box/syndicate/PopulateContents() /obj/item/weapon/storage/box/syndicate/PopulateContents()
switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1))) switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1)))
if("bloodyspai") // 27 tc now this is more right if("bloodyspai") // 27 tc now this is more right
new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set
new /obj/item/clothing/mask/chameleon(src) // Goes with above new /obj/item/clothing/mask/chameleon(src) // Goes with above
new /obj/item/weapon/card/id/syndicate(src) // 2 tc new /obj/item/weapon/card/id/syndicate(src) // 2 tc
new /obj/item/clothing/shoes/chameleon(src) // 2 tc new /obj/item/clothing/shoes/chameleon(src) // 2 tc
new /obj/item/device/camera_bug(src) // 1 tc new /obj/item/device/camera_bug(src) // 1 tc
new /obj/item/device/multitool/ai_detect(src) // 1 tc new /obj/item/device/multitool/ai_detect(src) // 1 tc
new /obj/item/device/encryptionkey/syndicate(src) // 2 tc new /obj/item/device/encryptionkey/syndicate(src) // 2 tc
new /obj/item/weapon/reagent_containers/syringe/mulligan(src) // 4 tc new /obj/item/weapon/reagent_containers/syringe/mulligan(src) // 4 tc
new /obj/item/weapon/switchblade(src) //I'll count this as 2 tc new /obj/item/weapon/switchblade(src) //I'll count this as 2 tc
new /obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate (src) // 2 tc this shit heals new /obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate (src) // 2 tc this shit heals
new /obj/item/device/flashlight/emp(src) // 2 tc new /obj/item/device/flashlight/emp(src) // 2 tc
new /obj/item/device/chameleon(src) // 7 tc new /obj/item/device/chameleon(src) // 7 tc
if("stealth") // 31 tc if("stealth") // 31 tc
new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow(src) new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow(src)
new /obj/item/weapon/pen/sleepy(src) new /obj/item/weapon/pen/sleepy(src)
new /obj/item/device/healthanalyzer/rad_laser(src) new /obj/item/device/healthanalyzer/rad_laser(src)
new /obj/item/device/chameleon(src) new /obj/item/device/chameleon(src)
new /obj/item/weapon/soap/syndie(src) new /obj/item/weapon/soap/syndie(src)
new /obj/item/clothing/glasses/thermal/syndi(src) new /obj/item/clothing/glasses/thermal/syndi(src)
if("bond") // 29 tc if("bond") // 29 tc
new /obj/item/weapon/gun/ballistic/automatic/pistol(src) new /obj/item/weapon/gun/ballistic/automatic/pistol(src)
new /obj/item/weapon/suppressor(src) new /obj/item/weapon/suppressor(src)
new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/clothing/under/chameleon(src) new /obj/item/clothing/under/chameleon(src)
new /obj/item/weapon/card/id/syndicate(src) new /obj/item/weapon/card/id/syndicate(src)
new /obj/item/weapon/reagent_containers/syringe/stimulants(src) new /obj/item/weapon/reagent_containers/syringe/stimulants(src)
if("screwed") // 29 tc if("screwed") // 29 tc
new /obj/item/device/sbeacondrop/bomb(src) new /obj/item/device/sbeacondrop/bomb(src)
new /obj/item/weapon/grenade/syndieminibomb(src) new /obj/item/weapon/grenade/syndieminibomb(src)
new /obj/item/device/sbeacondrop/powersink(src) new /obj/item/device/sbeacondrop/powersink(src)
new /obj/item/clothing/suit/space/syndicate/black/red(src) new /obj/item/clothing/suit/space/syndicate/black/red(src)
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
new /obj/item/device/encryptionkey/syndicate(src) new /obj/item/device/encryptionkey/syndicate(src)
if("guns") // 28 tc now if("guns") // 28 tc now
new /obj/item/weapon/gun/ballistic/revolver(src) new /obj/item/weapon/gun/ballistic/revolver(src)
new /obj/item/ammo_box/a357(src) new /obj/item/ammo_box/a357(src)
new /obj/item/ammo_box/a357(src) new /obj/item/ammo_box/a357(src)
new /obj/item/weapon/card/emag(src) new /obj/item/weapon/card/emag(src)
new /obj/item/weapon/grenade/plastic/c4(src) new /obj/item/weapon/grenade/plastic/c4(src)
new /obj/item/clothing/gloves/color/latex/nitrile(src) new /obj/item/clothing/gloves/color/latex/nitrile(src)
new /obj/item/clothing/mask/gas/clown_hat(src) new /obj/item/clothing/mask/gas/clown_hat(src)
new /obj/item/clothing/under/suit_jacket/really_black(src) new /obj/item/clothing/under/suit_jacket/really_black(src)
if("murder") // 28 tc now if("murder") // 28 tc now
new /obj/item/weapon/melee/energy/sword/saber(src) new /obj/item/weapon/melee/energy/sword/saber(src)
new /obj/item/clothing/glasses/thermal/syndi(src) new /obj/item/clothing/glasses/thermal/syndi(src)
new /obj/item/weapon/card/emag(src) new /obj/item/weapon/card/emag(src)
new /obj/item/clothing/shoes/chameleon(src) new /obj/item/clothing/shoes/chameleon(src)
new /obj/item/device/encryptionkey/syndicate(src) new /obj/item/device/encryptionkey/syndicate(src)
new /obj/item/weapon/grenade/syndieminibomb(src) new /obj/item/weapon/grenade/syndieminibomb(src)
if("implant") // 55+ tc holy shit what the fuck this is a lottery disguised as fun boxes isn't it? if("implant") // 55+ tc holy shit what the fuck this is a lottery disguised as fun boxes isn't it?
new /obj/item/weapon/implanter/freedom(src) new /obj/item/weapon/implanter/freedom(src)
new /obj/item/weapon/implanter/uplink/precharged(src) new /obj/item/weapon/implanter/uplink/precharged(src)
new /obj/item/weapon/implanter/emp(src) new /obj/item/weapon/implanter/emp(src)
new /obj/item/weapon/implanter/adrenalin(src) new /obj/item/weapon/implanter/adrenalin(src)
new /obj/item/weapon/implanter/explosive(src) new /obj/item/weapon/implanter/explosive(src)
new /obj/item/weapon/implanter/storage(src) new /obj/item/weapon/implanter/storage(src)
if("hacker") // 26 tc if("hacker") // 26 tc
new /obj/item/weapon/aiModule/syndicate(src) new /obj/item/weapon/aiModule/syndicate(src)
new /obj/item/weapon/card/emag(src) new /obj/item/weapon/card/emag(src)
new /obj/item/device/encryptionkey/binary(src) new /obj/item/device/encryptionkey/binary(src)
new /obj/item/weapon/aiModule/toyAI(src) new /obj/item/weapon/aiModule/toyAI(src)
new /obj/item/device/multitool/ai_detect(src) new /obj/item/device/multitool/ai_detect(src)
if("lordsingulo") // 24 tc if("lordsingulo") // 24 tc
new /obj/item/device/sbeacondrop(src) new /obj/item/device/sbeacondrop(src)
new /obj/item/clothing/suit/space/syndicate/black/red(src) new /obj/item/clothing/suit/space/syndicate/black/red(src)
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
new /obj/item/weapon/card/emag(src) new /obj/item/weapon/card/emag(src)
if("sabotage") // 26 tc now if("sabotage") // 26 tc now
new /obj/item/weapon/grenade/plastic/c4 (src) new /obj/item/weapon/grenade/plastic/c4 (src)
new /obj/item/weapon/grenade/plastic/c4 (src) new /obj/item/weapon/grenade/plastic/c4 (src)
new /obj/item/device/doorCharge(src) new /obj/item/device/doorCharge(src)
new /obj/item/device/doorCharge(src) new /obj/item/device/doorCharge(src)
new /obj/item/device/camera_bug(src) new /obj/item/device/camera_bug(src)
new /obj/item/device/sbeacondrop/powersink(src) new /obj/item/device/sbeacondrop/powersink(src)
new /obj/item/weapon/cartridge/syndicate(src) new /obj/item/weapon/cartridge/syndicate(src)
new /obj/item/weapon/storage/toolbox/syndicate(src) //To actually get to those places new /obj/item/weapon/storage/toolbox/syndicate(src) //To actually get to those places
new /obj/item/pizzabox/bomb new /obj/item/pizzabox/bomb
if("darklord") //20 tc + tk + summon item close enough for now if("darklord") //20 tc + tk + summon item close enough for now
new /obj/item/weapon/twohanded/dualsaber(src) new /obj/item/weapon/twohanded/dualsaber(src)
new /obj/item/weapon/dnainjector/telemut/darkbundle(src) new /obj/item/weapon/dnainjector/telemut/darkbundle(src)
new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
new /obj/item/weapon/card/id/syndicate(src) new /obj/item/weapon/card/id/syndicate(src)
new /obj/item/clothing/shoes/chameleon(src) //because slipping while being a dark lord sucks new /obj/item/clothing/shoes/chameleon(src) //because slipping while being a dark lord sucks
new /obj/item/weapon/spellbook/oneuse/summonitem(src) new /obj/item/weapon/spellbook/oneuse/summonitem(src)
if("sniper") //This shit is unique so can't really balance it around tc, also no silencer because getting killed without ANY indicator on what killed you sucks if("sniper") //This shit is unique so can't really balance it around tc, also no silencer because getting killed without ANY indicator on what killed you sucks
new /obj/item/weapon/gun/ballistic/automatic/sniper_rifle(src) // 12 tc new /obj/item/weapon/gun/ballistic/automatic/sniper_rifle(src) // 12 tc
new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src) new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src)
new /obj/item/clothing/glasses/thermal/syndi(src) new /obj/item/clothing/glasses/thermal/syndi(src)
new /obj/item/clothing/gloves/color/latex/nitrile(src) new /obj/item/clothing/gloves/color/latex/nitrile(src)
new /obj/item/clothing/mask/gas/clown_hat(src) new /obj/item/clothing/mask/gas/clown_hat(src)
new /obj/item/clothing/under/suit_jacket/really_black(src) new /obj/item/clothing/under/suit_jacket/really_black(src)
if("metaops") // 30 tc if("metaops") // 30 tc
new /obj/item/clothing/suit/space/hardsuit/syndi(src) // 8 tc new /obj/item/clothing/suit/space/hardsuit/syndi(src) // 8 tc
new /obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/unrestricted(src) // 8 tc new /obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/unrestricted(src) // 8 tc
new /obj/item/weapon/implanter/explosive(src) // 2 tc new /obj/item/weapon/implanter/explosive(src) // 2 tc
new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc
new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc
new /obj/item/weapon/grenade/plastic/c4 (src) // 1 tc new /obj/item/weapon/grenade/plastic/c4 (src) // 1 tc
new /obj/item/weapon/grenade/plastic/c4 (src) // 1 tc new /obj/item/weapon/grenade/plastic/c4 (src) // 1 tc
new /obj/item/weapon/card/emag(src) // 6 tc new /obj/item/weapon/card/emag(src) // 6 tc
if("ninja") // 33 tc worth if("ninja") // 33 tc worth
new /obj/item/weapon/katana(src) // Unique , hard to tell how much tc this is worth. 8 tc? new /obj/item/weapon/katana(src) // Unique , hard to tell how much tc this is worth. 8 tc?
new /obj/item/weapon/implanter/adrenalin(src) // 8 tc new /obj/item/weapon/implanter/adrenalin(src) // 8 tc
new /obj/item/weapon/throwing_star(src) // ~5 tc for all 6 new /obj/item/weapon/throwing_star(src) // ~5 tc for all 6
new /obj/item/weapon/throwing_star(src) new /obj/item/weapon/throwing_star(src)
new /obj/item/weapon/throwing_star(src) new /obj/item/weapon/throwing_star(src)
new /obj/item/weapon/throwing_star(src) new /obj/item/weapon/throwing_star(src)
new /obj/item/weapon/throwing_star(src) new /obj/item/weapon/throwing_star(src)
new /obj/item/weapon/throwing_star(src) new /obj/item/weapon/throwing_star(src)
new /obj/item/weapon/storage/belt/chameleon(src) // Unique but worth at least 2 tc new /obj/item/weapon/storage/belt/chameleon(src) // Unique but worth at least 2 tc
new /obj/item/weapon/card/id/syndicate(src) // 2 tc new /obj/item/weapon/card/id/syndicate(src) // 2 tc
new /obj/item/device/chameleon(src) // 7 tc new /obj/item/device/chameleon(src) // 7 tc
/obj/item/weapon/storage/box/syndie_kit /obj/item/weapon/storage/box/syndie_kit
name = "box" name = "box"
desc = "A sleek, sturdy box." desc = "A sleek, sturdy box."
icon_state = "syndiebox" icon_state = "syndiebox"
illustration = "writing_syndie" illustration = "writing_syndie"
/obj/item/weapon/storage/box/syndie_kit/imp_freedom /obj/item/weapon/storage/box/syndie_kit/imp_freedom
name = "boxed freedom implant (with injector)" name = "boxed freedom implant (with injector)"
/obj/item/weapon/storage/box/syndie_kit/imp_freedom/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/imp_freedom/PopulateContents()
var/obj/item/weapon/implanter/O = new(src) var/obj/item/weapon/implanter/O = new(src)
O.imp = new /obj/item/weapon/implant/freedom(O) O.imp = new /obj/item/weapon/implant/freedom(O)
O.update_icon() O.update_icon()
/obj/item/weapon/storage/box/syndie_kit/imp_microbomb /obj/item/weapon/storage/box/syndie_kit/imp_microbomb
name = "Microbomb Implant (with injector)" name = "Microbomb Implant (with injector)"
/obj/item/weapon/storage/box/syndie_kit/imp_microbomb/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/imp_microbomb/PopulateContents()
var/obj/item/weapon/implanter/O = new(src) var/obj/item/weapon/implanter/O = new(src)
O.imp = new /obj/item/weapon/implant/explosive(O) O.imp = new /obj/item/weapon/implant/explosive(O)
O.update_icon() O.update_icon()
/obj/item/weapon/storage/box/syndie_kit/imp_macrobomb /obj/item/weapon/storage/box/syndie_kit/imp_macrobomb
name = "Macrobomb Implant (with injector)" name = "Macrobomb Implant (with injector)"
/obj/item/weapon/storage/box/syndie_kit/imp_macrobomb/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/imp_macrobomb/PopulateContents()
var/obj/item/weapon/implanter/O = new(src) var/obj/item/weapon/implanter/O = new(src)
O.imp = new /obj/item/weapon/implant/explosive/macro(O) O.imp = new /obj/item/weapon/implant/explosive/macro(O)
O.update_icon() O.update_icon()
/obj/item/weapon/storage/box/syndie_kit/imp_uplink /obj/item/weapon/storage/box/syndie_kit/imp_uplink
name = "boxed uplink implant (with injector)" name = "boxed uplink implant (with injector)"
/obj/item/weapon/storage/box/syndie_kit/imp_uplink/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/imp_uplink/PopulateContents()
..() ..()
var/obj/item/weapon/implanter/O = new(src) var/obj/item/weapon/implanter/O = new(src)
O.imp = new /obj/item/weapon/implant/uplink(O) O.imp = new /obj/item/weapon/implant/uplink(O)
O.update_icon() O.update_icon()
/obj/item/weapon/storage/box/syndie_kit/bioterror /obj/item/weapon/storage/box/syndie_kit/bioterror
name = "bioterror syringe box" name = "bioterror syringe box"
/obj/item/weapon/storage/box/syndie_kit/bioterror/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/bioterror/PopulateContents()
for(var/i in 1 to 7) for(var/i in 1 to 7)
new /obj/item/weapon/reagent_containers/syringe/bioterror(src) new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
/obj/item/weapon/storage/box/syndie_kit/imp_adrenal /obj/item/weapon/storage/box/syndie_kit/imp_adrenal
name = "boxed adrenal implant (with injector)" name = "boxed adrenal implant (with injector)"
/obj/item/weapon/storage/box/syndie_kit/imp_adrenal/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/imp_adrenal/PopulateContents()
var/obj/item/weapon/implanter/O = new(src) var/obj/item/weapon/implanter/O = new(src)
O.imp = new /obj/item/weapon/implant/adrenalin(O) O.imp = new /obj/item/weapon/implant/adrenalin(O)
O.update_icon() O.update_icon()
/obj/item/weapon/storage/box/syndie_kit/imp_storage /obj/item/weapon/storage/box/syndie_kit/imp_storage
name = "boxed storage implant (with injector)" name = "boxed storage implant (with injector)"
/obj/item/weapon/storage/box/syndie_kit/imp_storage/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/imp_storage/PopulateContents()
new /obj/item/weapon/implanter/storage(src) new /obj/item/weapon/implanter/storage(src)
/obj/item/weapon/storage/box/syndie_kit/space /obj/item/weapon/storage/box/syndie_kit/space
name = "boxed space suit and helmet" name = "boxed space suit and helmet"
can_hold = list(/obj/item/clothing/suit/space/syndicate, /obj/item/clothing/head/helmet/space/syndicate) can_hold = list(/obj/item/clothing/suit/space/syndicate, /obj/item/clothing/head/helmet/space/syndicate)
max_w_class = WEIGHT_CLASS_NORMAL max_w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/storage/box/syndie_kit/space/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/space/PopulateContents()
new /obj/item/clothing/suit/space/syndicate/black/red(src) // Black and red is so in right now new /obj/item/clothing/suit/space/syndicate/black/red(src) // Black and red is so in right now
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
/obj/item/weapon/storage/box/syndie_kit/emp /obj/item/weapon/storage/box/syndie_kit/emp
name = "boxed EMP kit" name = "boxed EMP kit"
/obj/item/weapon/storage/box/syndie_kit/emp/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/emp/PopulateContents()
new /obj/item/weapon/grenade/empgrenade(src) new /obj/item/weapon/grenade/empgrenade(src)
new /obj/item/weapon/grenade/empgrenade(src) new /obj/item/weapon/grenade/empgrenade(src)
new /obj/item/weapon/grenade/empgrenade(src) new /obj/item/weapon/grenade/empgrenade(src)
new /obj/item/weapon/grenade/empgrenade(src) new /obj/item/weapon/grenade/empgrenade(src)
new /obj/item/weapon/grenade/empgrenade(src) new /obj/item/weapon/grenade/empgrenade(src)
new /obj/item/weapon/implanter/emp(src) new /obj/item/weapon/implanter/emp(src)
/obj/item/weapon/storage/box/syndie_kit/chemical /obj/item/weapon/storage/box/syndie_kit/chemical
name = "boxed chemical kit" name = "boxed chemical kit"
storage_slots = 14 storage_slots = 14
/obj/item/weapon/storage/box/syndie_kit/chemical/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/chemical/PopulateContents()
new /obj/item/weapon/reagent_containers/glass/bottle/polonium(src) new /obj/item/weapon/reagent_containers/glass/bottle/polonium(src)
new /obj/item/weapon/reagent_containers/glass/bottle/venom(src) new /obj/item/weapon/reagent_containers/glass/bottle/venom(src)
new /obj/item/weapon/reagent_containers/glass/bottle/neurotoxin2(src) new /obj/item/weapon/reagent_containers/glass/bottle/neurotoxin2(src)
new /obj/item/weapon/reagent_containers/glass/bottle/formaldehyde(src) new /obj/item/weapon/reagent_containers/glass/bottle/formaldehyde(src)
new /obj/item/weapon/reagent_containers/glass/bottle/spewium(src) new /obj/item/weapon/reagent_containers/glass/bottle/spewium(src)
new /obj/item/weapon/reagent_containers/glass/bottle/cyanide(src) new /obj/item/weapon/reagent_containers/glass/bottle/cyanide(src)
new /obj/item/weapon/reagent_containers/glass/bottle/histamine(src) new /obj/item/weapon/reagent_containers/glass/bottle/histamine(src)
new /obj/item/weapon/reagent_containers/glass/bottle/initropidril(src) new /obj/item/weapon/reagent_containers/glass/bottle/initropidril(src)
new /obj/item/weapon/reagent_containers/glass/bottle/pancuronium(src) new /obj/item/weapon/reagent_containers/glass/bottle/pancuronium(src)
new /obj/item/weapon/reagent_containers/glass/bottle/sodium_thiopental(src) new /obj/item/weapon/reagent_containers/glass/bottle/sodium_thiopental(src)
new /obj/item/weapon/reagent_containers/glass/bottle/coniine(src) new /obj/item/weapon/reagent_containers/glass/bottle/coniine(src)
new /obj/item/weapon/reagent_containers/glass/bottle/curare(src) new /obj/item/weapon/reagent_containers/glass/bottle/curare(src)
new /obj/item/weapon/reagent_containers/glass/bottle/amanitin(src) new /obj/item/weapon/reagent_containers/glass/bottle/amanitin(src)
new /obj/item/weapon/reagent_containers/syringe(src) new /obj/item/weapon/reagent_containers/syringe(src)
/obj/item/weapon/storage/box/syndie_kit/nuke /obj/item/weapon/storage/box/syndie_kit/nuke
name = "box" name = "box"
/obj/item/weapon/storage/box/syndie_kit/nuke/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/nuke/PopulateContents()
new /obj/item/weapon/screwdriver/nuke(src) new /obj/item/weapon/screwdriver/nuke(src)
new /obj/item/nuke_core_container(src) new /obj/item/nuke_core_container(src)
new /obj/item/weapon/paper/nuke_instructions(src) new /obj/item/weapon/paper/nuke_instructions(src)
/obj/item/weapon/storage/box/syndie_kit/tuberculosisgrenade /obj/item/weapon/storage/box/syndie_kit/tuberculosisgrenade
name = "boxed virus grenade kit" name = "boxed virus grenade kit"
/obj/item/weapon/storage/box/syndie_kit/tuberculosisgrenade/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/tuberculosisgrenade/PopulateContents()
new /obj/item/weapon/grenade/chem_grenade/tuberculosis(src) new /obj/item/weapon/grenade/chem_grenade/tuberculosis(src)
for(var/i in 1 to 5) for(var/i in 1 to 5)
new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src) new /obj/item/weapon/reagent_containers/hypospray/medipen/tuberculosiscure(src)
new /obj/item/weapon/reagent_containers/syringe(src) new /obj/item/weapon/reagent_containers/syringe(src)
new /obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure(src) new /obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure(src)
/obj/item/weapon/storage/box/syndie_kit/chameleon /obj/item/weapon/storage/box/syndie_kit/chameleon
name = "chameleon kit" name = "chameleon kit"
/obj/item/weapon/storage/box/syndie_kit/chameleon/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/chameleon/PopulateContents()
new /obj/item/clothing/under/chameleon(src) new /obj/item/clothing/under/chameleon(src)
new /obj/item/clothing/suit/chameleon(src) new /obj/item/clothing/suit/chameleon(src)
new /obj/item/clothing/gloves/chameleon(src) new /obj/item/clothing/gloves/chameleon(src)
new /obj/item/clothing/shoes/chameleon(src) new /obj/item/clothing/shoes/chameleon(src)
new /obj/item/clothing/glasses/chameleon(src) new /obj/item/clothing/glasses/chameleon(src)
new /obj/item/clothing/head/chameleon(src) new /obj/item/clothing/head/chameleon(src)
new /obj/item/clothing/mask/chameleon(src) new /obj/item/clothing/mask/chameleon(src)
new /obj/item/weapon/storage/backpack/chameleon(src) new /obj/item/weapon/storage/backpack/chameleon(src)
new /obj/item/device/radio/headset/chameleon(src) new /obj/item/device/radio/headset/chameleon(src)
new /obj/item/weapon/stamp/chameleon(src) new /obj/item/weapon/stamp/chameleon(src)
new /obj/item/device/pda/chameleon(src) new /obj/item/device/pda/chameleon(src)
new /obj/item/weapon/gun/energy/laser/chameleon(src) new /obj/item/weapon/gun/energy/laser/chameleon(src)
//5*(2*4) = 5*8 = 45, 45 damage if you hit one person with all 5 stars. //5*(2*4) = 5*8 = 45, 45 damage if you hit one person with all 5 stars.
//Not counting the damage it will do while embedded (2*4 = 8, at 15% chance) //Not counting the damage it will do while embedded (2*4 = 8, at 15% chance)
/obj/item/weapon/storage/box/syndie_kit/throwing_weapons/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/throwing_weapons/PopulateContents()
new /obj/item/weapon/throwing_star(src) new /obj/item/weapon/throwing_star(src)
new /obj/item/weapon/throwing_star(src) new /obj/item/weapon/throwing_star(src)
new /obj/item/weapon/throwing_star(src) new /obj/item/weapon/throwing_star(src)
new /obj/item/weapon/throwing_star(src) new /obj/item/weapon/throwing_star(src)
new /obj/item/weapon/throwing_star(src) new /obj/item/weapon/throwing_star(src)
new /obj/item/weapon/restraints/legcuffs/bola/tactical(src) new /obj/item/weapon/restraints/legcuffs/bola/tactical(src)
new /obj/item/weapon/restraints/legcuffs/bola/tactical(src) new /obj/item/weapon/restraints/legcuffs/bola/tactical(src)
/obj/item/weapon/storage/box/syndie_kit/cutouts/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/cutouts/PopulateContents()
for(var/i in 1 to 3) for(var/i in 1 to 3)
new/obj/item/cardboard_cutout/adaptive(src) new/obj/item/cardboard_cutout/adaptive(src)
new/obj/item/toy/crayon/rainbow(src) new/obj/item/toy/crayon/rainbow(src)
/obj/item/weapon/storage/box/syndie_kit/romerol/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/romerol/PopulateContents()
new /obj/item/weapon/reagent_containers/glass/bottle/romerol(src) new /obj/item/weapon/reagent_containers/glass/bottle/romerol(src)
new /obj/item/weapon/reagent_containers/syringe(src) new /obj/item/weapon/reagent_containers/syringe(src)
new /obj/item/weapon/reagent_containers/dropper(src) new /obj/item/weapon/reagent_containers/dropper(src)
/obj/item/weapon/storage/box/syndie_kit/ez_clean/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/ez_clean/PopulateContents()
for(var/i in 1 to 3) for(var/i in 1 to 3)
new/obj/item/weapon/grenade/chem_grenade/ez_clean(src) new/obj/item/weapon/grenade/chem_grenade/ez_clean(src)
/obj/item/weapon/storage/box/hug/reverse_revolver/PopulateContents() /obj/item/weapon/storage/box/hug/reverse_revolver/PopulateContents()
new /obj/item/weapon/gun/ballistic/revolver/reverse(src) new /obj/item/weapon/gun/ballistic/revolver/reverse(src)
/obj/item/weapon/storage/box/syndie_kit/mimery/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/mimery/PopulateContents()
new /obj/item/weapon/spellbook/oneuse/mimery_blockade(src) new /obj/item/weapon/spellbook/oneuse/mimery_blockade(src)
new /obj/item/weapon/spellbook/oneuse/mimery_guns(src) new /obj/item/weapon/spellbook/oneuse/mimery_guns(src)
/obj/item/weapon/storage/box/syndie_kit/holoparasite /obj/item/weapon/storage/box/syndie_kit/holoparasite
name = "box" name = "box"
/obj/item/weapon/storage/box/syndie_kit/holoparasite/PopulateContents() /obj/item/weapon/storage/box/syndie_kit/holoparasite/PopulateContents()
new /obj/item/weapon/guardiancreator/tech/choose/traitor(src) new /obj/item/weapon/guardiancreator/tech/choose/traitor(src)
new /obj/item/weapon/paper/guardian(src) new /obj/item/weapon/paper/guardian(src)

4
code/game/objects/items/weapons/tanks/tank_types.dm Normal file → Executable file
View File

@@ -140,8 +140,8 @@
item_state = "plasmaman_tank_belt" item_state = "plasmaman_tank_belt"
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
force = 5 force = 5
volume = 3 volume = 3
w_class = WEIGHT_CLASS_SMALL //thanks i forgot this w_class = WEIGHT_CLASS_SMALL //thanks i forgot this
/obj/item/weapon/tank/internals/plasmaman/belt/full/New() /obj/item/weapon/tank/internals/plasmaman/belt/full/New()
..() ..()

File diff suppressed because it is too large Load Diff

View File

@@ -1,316 +1,316 @@
/* /*
CONTAINS: CONTAINS:
BEDSHEETS BEDSHEETS
LINEN BINS LINEN BINS
*/ */
/obj/item/weapon/bedsheet /obj/item/weapon/bedsheet
name = "bedsheet" name = "bedsheet"
desc = "A surprisingly soft linen bedsheet." desc = "A surprisingly soft linen bedsheet."
icon = 'icons/obj/bedsheets.dmi' icon = 'icons/obj/bedsheets.dmi'
icon_state = "sheetwhite" icon_state = "sheetwhite"
item_state = "bedsheet" item_state = "bedsheet"
slot_flags = SLOT_NECK slot_flags = SLOT_NECK
layer = MOB_LAYER layer = MOB_LAYER
throwforce = 0 throwforce = 0
throw_speed = 1 throw_speed = 1
throw_range = 2 throw_range = 2
w_class = WEIGHT_CLASS_TINY w_class = WEIGHT_CLASS_TINY
item_color = "white" item_color = "white"
resistance_flags = FLAMMABLE resistance_flags = FLAMMABLE
dog_fashion = /datum/dog_fashion/head/ghost dog_fashion = /datum/dog_fashion/head/ghost
/obj/item/weapon/bedsheet/attack(mob/living/M, mob/user) /obj/item/weapon/bedsheet/attack(mob/living/M, mob/user)
if(!attempt_initiate_surgery(src, M, user)) if(!attempt_initiate_surgery(src, M, user))
..() ..()
/obj/item/weapon/bedsheet/attack_self(mob/user) /obj/item/weapon/bedsheet/attack_self(mob/user)
user.drop_item() user.drop_item()
if(layer == initial(layer)) if(layer == initial(layer))
layer = ABOVE_MOB_LAYER layer = ABOVE_MOB_LAYER
to_chat(user, "<span class='notice'>You cover yourself with [src].</span>") to_chat(user, "<span class='notice'>You cover yourself with [src].</span>")
else else
layer = initial(layer) layer = initial(layer)
to_chat(user, "<span class='notice'>You smooth [src] out beneath you.</span>") to_chat(user, "<span class='notice'>You smooth [src] out beneath you.</span>")
add_fingerprint(user) add_fingerprint(user)
return return
/obj/item/weapon/bedsheet/attackby(obj/item/I, mob/user, params) /obj/item/weapon/bedsheet/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/wirecutters) || I.is_sharp()) if(istype(I, /obj/item/weapon/wirecutters) || I.is_sharp())
var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3) var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3)
transfer_fingerprints_to(C) transfer_fingerprints_to(C)
C.add_fingerprint(user) C.add_fingerprint(user)
qdel(src) qdel(src)
to_chat(user, "<span class='notice'>You tear [src] up.</span>") to_chat(user, "<span class='notice'>You tear [src] up.</span>")
else else
return ..() return ..()
/obj/item/weapon/bedsheet/blue /obj/item/weapon/bedsheet/blue
icon_state = "sheetblue" icon_state = "sheetblue"
item_color = "blue" item_color = "blue"
/obj/item/weapon/bedsheet/green /obj/item/weapon/bedsheet/green
icon_state = "sheetgreen" icon_state = "sheetgreen"
item_color = "green" item_color = "green"
/obj/item/weapon/bedsheet/orange /obj/item/weapon/bedsheet/orange
icon_state = "sheetorange" icon_state = "sheetorange"
item_color = "orange" item_color = "orange"
/obj/item/weapon/bedsheet/purple /obj/item/weapon/bedsheet/purple
icon_state = "sheetpurple" icon_state = "sheetpurple"
item_color = "purple" item_color = "purple"
/obj/item/weapon/bedsheet/patriot /obj/item/weapon/bedsheet/patriot
name = "patriotic bedsheet" name = "patriotic bedsheet"
desc = "You've never felt more free than when sleeping on this." desc = "You've never felt more free than when sleeping on this."
icon_state = "sheetUSA" icon_state = "sheetUSA"
item_color = "sheetUSA" item_color = "sheetUSA"
/obj/item/weapon/bedsheet/rainbow /obj/item/weapon/bedsheet/rainbow
name = "rainbow bedsheet" name = "rainbow bedsheet"
desc = "A multicolored blanket. It's actually several different sheets cut up and sewn together." desc = "A multicolored blanket. It's actually several different sheets cut up and sewn together."
icon_state = "sheetrainbow" icon_state = "sheetrainbow"
item_color = "rainbow" item_color = "rainbow"
/obj/item/weapon/bedsheet/red /obj/item/weapon/bedsheet/red
icon_state = "sheetred" icon_state = "sheetred"
item_color = "red" item_color = "red"
/obj/item/weapon/bedsheet/yellow /obj/item/weapon/bedsheet/yellow
icon_state = "sheetyellow" icon_state = "sheetyellow"
item_color = "yellow" item_color = "yellow"
/obj/item/weapon/bedsheet/mime /obj/item/weapon/bedsheet/mime
name = "mime's blanket" name = "mime's blanket"
desc = "A very soothing striped blanket. All the noise just seems to fade out when you're under the covers in this." desc = "A very soothing striped blanket. All the noise just seems to fade out when you're under the covers in this."
icon_state = "sheetmime" icon_state = "sheetmime"
item_color = "mime" item_color = "mime"
/obj/item/weapon/bedsheet/clown /obj/item/weapon/bedsheet/clown
name = "clown's blanket" name = "clown's blanket"
desc = "A rainbow blanket with a clown mask woven in. It smells faintly of bananas." desc = "A rainbow blanket with a clown mask woven in. It smells faintly of bananas."
icon_state = "sheetclown" icon_state = "sheetclown"
item_color = "clown" item_color = "clown"
/obj/item/weapon/bedsheet/captain /obj/item/weapon/bedsheet/captain
name = "captain's bedsheet" name = "captain's bedsheet"
desc = "It has a Nanotrasen symbol on it, and was woven with a revolutionary new kind of thread guaranteed to have 0.01% permeability for most non-chemical substances, popular among most modern captains." desc = "It has a Nanotrasen symbol on it, and was woven with a revolutionary new kind of thread guaranteed to have 0.01% permeability for most non-chemical substances, popular among most modern captains."
icon_state = "sheetcaptain" icon_state = "sheetcaptain"
item_color = "captain" item_color = "captain"
/obj/item/weapon/bedsheet/rd /obj/item/weapon/bedsheet/rd
name = "research director's bedsheet" name = "research director's bedsheet"
desc = "It appears to have a beaker emblem, and is made out of fire-resistant material, although it probably won't protect you in the event of fires you're familiar with every day." desc = "It appears to have a beaker emblem, and is made out of fire-resistant material, although it probably won't protect you in the event of fires you're familiar with every day."
icon_state = "sheetrd" icon_state = "sheetrd"
item_color = "director" item_color = "director"
// for Free Golems. // for Free Golems.
/obj/item/weapon/bedsheet/rd/royal_cape /obj/item/weapon/bedsheet/rd/royal_cape
name = "Royal Cape of the Liberator" name = "Royal Cape of the Liberator"
desc = "Majestic." desc = "Majestic."
/obj/item/weapon/bedsheet/medical /obj/item/weapon/bedsheet/medical
name = "medical blanket" name = "medical blanket"
desc = "It's a sterilized* blanket commonly used in the Medbay. *Sterilization is voided if a virologist is present onboard the station." desc = "It's a sterilized* blanket commonly used in the Medbay. *Sterilization is voided if a virologist is present onboard the station."
icon_state = "sheetmedical" icon_state = "sheetmedical"
item_color = "medical" item_color = "medical"
/obj/item/weapon/bedsheet/cmo /obj/item/weapon/bedsheet/cmo
name = "chief medical officer's bedsheet" name = "chief medical officer's bedsheet"
desc = "It's a sterilized blanket that has a cross emblem. There's some cat fur on it, likely from Runtime." desc = "It's a sterilized blanket that has a cross emblem. There's some cat fur on it, likely from Runtime."
icon_state = "sheetcmo" icon_state = "sheetcmo"
item_color = "cmo" item_color = "cmo"
/obj/item/weapon/bedsheet/hos /obj/item/weapon/bedsheet/hos
name = "head of security's bedsheet" name = "head of security's bedsheet"
desc = "It is decorated with a shield emblem. While crime doesn't sleep, you do, but you are still THE LAW!" desc = "It is decorated with a shield emblem. While crime doesn't sleep, you do, but you are still THE LAW!"
icon_state = "sheethos" icon_state = "sheethos"
item_color = "hosred" item_color = "hosred"
/obj/item/weapon/bedsheet/hop /obj/item/weapon/bedsheet/hop
name = "head of personnel's bedsheet" name = "head of personnel's bedsheet"
desc = "It is decorated with a key emblem. For those rare moments when you can rest and cuddle with Ian without someone screaming for you over the radio." desc = "It is decorated with a key emblem. For those rare moments when you can rest and cuddle with Ian without someone screaming for you over the radio."
icon_state = "sheethop" icon_state = "sheethop"
item_color = "hop" item_color = "hop"
/obj/item/weapon/bedsheet/ce /obj/item/weapon/bedsheet/ce
name = "chief engineer's bedsheet" name = "chief engineer's bedsheet"
desc = "It is decorated with a wrench emblem. It's highly reflective and stain resistant, so you don't need to worry about ruining it with oil." desc = "It is decorated with a wrench emblem. It's highly reflective and stain resistant, so you don't need to worry about ruining it with oil."
icon_state = "sheetce" icon_state = "sheetce"
item_color = "chief" item_color = "chief"
/obj/item/weapon/bedsheet/qm /obj/item/weapon/bedsheet/qm
name = "quartermaster's bedsheet" name = "quartermaster's bedsheet"
desc = "It is decorated with a crate emblem in silver lining. It's rather tough, and just the thing to lie on after a hard day of pushing paper." desc = "It is decorated with a crate emblem in silver lining. It's rather tough, and just the thing to lie on after a hard day of pushing paper."
icon_state = "sheetqm" icon_state = "sheetqm"
item_color = "qm" item_color = "qm"
/obj/item/weapon/bedsheet/brown /obj/item/weapon/bedsheet/brown
icon_state = "sheetbrown" icon_state = "sheetbrown"
item_color = "cargo" item_color = "cargo"
/obj/item/weapon/bedsheet/black /obj/item/weapon/bedsheet/black
icon_state = "sheetblack" icon_state = "sheetblack"
item_color = "black" item_color = "black"
/obj/item/weapon/bedsheet/centcom /obj/item/weapon/bedsheet/centcom
name = "\improper Centcom bedsheet" name = "\improper Centcom bedsheet"
desc = "Woven with advanced nanothread for warmth as well as being very decorated, essential for all officials." desc = "Woven with advanced nanothread for warmth as well as being very decorated, essential for all officials."
icon_state = "sheetcentcom" icon_state = "sheetcentcom"
item_color = "centcom" item_color = "centcom"
/obj/item/weapon/bedsheet/syndie /obj/item/weapon/bedsheet/syndie
name = "syndicate bedsheet" name = "syndicate bedsheet"
desc = "It has a syndicate emblem and it has an aura of evil." desc = "It has a syndicate emblem and it has an aura of evil."
icon_state = "sheetsyndie" icon_state = "sheetsyndie"
item_color = "syndie" item_color = "syndie"
/obj/item/weapon/bedsheet/cult /obj/item/weapon/bedsheet/cult
name = "cultist's bedsheet" name = "cultist's bedsheet"
desc = "You might dream of Nar'Sie if you sleep with this. It seems rather tattered and glows of an eldritch presence." desc = "You might dream of Nar'Sie if you sleep with this. It seems rather tattered and glows of an eldritch presence."
icon_state = "sheetcult" icon_state = "sheetcult"
item_color = "cult" item_color = "cult"
/obj/item/weapon/bedsheet/wiz /obj/item/weapon/bedsheet/wiz
name = "wizard's bedsheet" name = "wizard's bedsheet"
desc = "A special fabric enchanted with magic so you can have an enchanted night. It even glows!" desc = "A special fabric enchanted with magic so you can have an enchanted night. It even glows!"
icon_state = "sheetwiz" icon_state = "sheetwiz"
item_color = "wiz" item_color = "wiz"
/obj/item/weapon/bedsheet/nanotrasen /obj/item/weapon/bedsheet/nanotrasen
name = "nanotrasen bedsheet" name = "nanotrasen bedsheet"
desc = "It has the Nanotrasen logo on it and has an aura of duty." desc = "It has the Nanotrasen logo on it and has an aura of duty."
icon_state = "sheetNT" icon_state = "sheetNT"
item_color = "nanotrasen" item_color = "nanotrasen"
/obj/item/weapon/bedsheet/ian /obj/item/weapon/bedsheet/ian
icon_state = "sheetian" icon_state = "sheetian"
item_color = "ian" item_color = "ian"
/obj/item/weapon/bedsheet/random /obj/item/weapon/bedsheet/random
icon_state = "sheetrainbow" icon_state = "sheetrainbow"
item_color = "rainbow" item_color = "rainbow"
name = "random bedsheet" name = "random bedsheet"
desc = "If you're reading this description ingame, something has gone wrong! Honk!" desc = "If you're reading this description ingame, something has gone wrong! Honk!"
/obj/item/weapon/bedsheet/random/New() /obj/item/weapon/bedsheet/random/New()
var/obj/item/weapon/bedsheet/B = pick(subtypesof(/obj/item/weapon/bedsheet) - /obj/item/weapon/bedsheet/random) var/obj/item/weapon/bedsheet/B = pick(subtypesof(/obj/item/weapon/bedsheet) - /obj/item/weapon/bedsheet/random)
name = initial(B.name) name = initial(B.name)
desc = initial(B.desc) desc = initial(B.desc)
icon_state = initial(B.icon_state) icon_state = initial(B.icon_state)
item_state = initial(B.item_state) item_state = initial(B.item_state)
item_color = initial(B.item_color) item_color = initial(B.item_color)
/obj/structure/bedsheetbin /obj/structure/bedsheetbin
name = "linen bin" name = "linen bin"
desc = "It looks rather cosy." desc = "It looks rather cosy."
icon = 'icons/obj/structures.dmi' icon = 'icons/obj/structures.dmi'
icon_state = "linenbin-full" icon_state = "linenbin-full"
anchored = 1 anchored = 1
resistance_flags = FLAMMABLE resistance_flags = FLAMMABLE
obj_integrity = 70 obj_integrity = 70
max_integrity = 70 max_integrity = 70
var/amount = 10 var/amount = 10
var/list/sheets = list() var/list/sheets = list()
var/obj/item/hidden = null var/obj/item/hidden = null
/obj/structure/bedsheetbin/examine(mob/user) /obj/structure/bedsheetbin/examine(mob/user)
..() ..()
if(amount < 1) if(amount < 1)
to_chat(user, "There are no bed sheets in the bin.") to_chat(user, "There are no bed sheets in the bin.")
else if(amount == 1) else if(amount == 1)
to_chat(user, "There is one bed sheet in the bin.") to_chat(user, "There is one bed sheet in the bin.")
else else
to_chat(user, "There are [amount] bed sheets in the bin.") to_chat(user, "There are [amount] bed sheets in the bin.")
/obj/structure/bedsheetbin/update_icon() /obj/structure/bedsheetbin/update_icon()
switch(amount) switch(amount)
if(0) if(0)
icon_state = "linenbin-empty" icon_state = "linenbin-empty"
if(1 to 5) if(1 to 5)
icon_state = "linenbin-half" icon_state = "linenbin-half"
else else
icon_state = "linenbin-full" icon_state = "linenbin-full"
/obj/structure/bedsheetbin/fire_act(exposed_temperature, exposed_volume) /obj/structure/bedsheetbin/fire_act(exposed_temperature, exposed_volume)
if(amount) if(amount)
amount = 0 amount = 0
update_icon() update_icon()
..() ..()
/obj/structure/bedsheetbin/attackby(obj/item/I, mob/user, params) /obj/structure/bedsheetbin/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/bedsheet)) if(istype(I, /obj/item/weapon/bedsheet))
if(!user.drop_item()) if(!user.drop_item())
return return
I.loc = src I.loc = src
sheets.Add(I) sheets.Add(I)
amount++ amount++
to_chat(user, "<span class='notice'>You put [I] in [src].</span>") to_chat(user, "<span class='notice'>You put [I] in [src].</span>")
update_icon() update_icon()
else if(amount && !hidden && I.w_class < WEIGHT_CLASS_BULKY) //make sure there's sheets to hide it among, make sure nothing else is hidden in there. else if(amount && !hidden && I.w_class < WEIGHT_CLASS_BULKY) //make sure there's sheets to hide it among, make sure nothing else is hidden in there.
if(!user.drop_item()) if(!user.drop_item())
to_chat(user, "<span class='warning'>\The [I] is stuck to your hand, you cannot hide it among the sheets!</span>") to_chat(user, "<span class='warning'>\The [I] is stuck to your hand, you cannot hide it among the sheets!</span>")
return return
I.loc = src I.loc = src
hidden = I hidden = I
to_chat(user, "<span class='notice'>You hide [I] among the sheets.</span>") to_chat(user, "<span class='notice'>You hide [I] among the sheets.</span>")
/obj/structure/bedsheetbin/attack_paw(mob/user) /obj/structure/bedsheetbin/attack_paw(mob/user)
return attack_hand(user) return attack_hand(user)
/obj/structure/bedsheetbin/attack_hand(mob/user) /obj/structure/bedsheetbin/attack_hand(mob/user)
if(user.lying) if(user.lying)
return return
if(amount >= 1) if(amount >= 1)
amount-- amount--
var/obj/item/weapon/bedsheet/B var/obj/item/weapon/bedsheet/B
if(sheets.len > 0) if(sheets.len > 0)
B = sheets[sheets.len] B = sheets[sheets.len]
sheets.Remove(B) sheets.Remove(B)
else else
B = new /obj/item/weapon/bedsheet(loc) B = new /obj/item/weapon/bedsheet(loc)
B.loc = user.loc B.loc = user.loc
user.put_in_hands(B) user.put_in_hands(B)
to_chat(user, "<span class='notice'>You take [B] out of [src].</span>") to_chat(user, "<span class='notice'>You take [B] out of [src].</span>")
update_icon() update_icon()
if(hidden) if(hidden)
hidden.loc = user.loc hidden.loc = user.loc
to_chat(user, "<span class='notice'>[hidden] falls out of [B]!</span>") to_chat(user, "<span class='notice'>[hidden] falls out of [B]!</span>")
hidden = null hidden = null
add_fingerprint(user) add_fingerprint(user)
/obj/structure/bedsheetbin/attack_tk(mob/user) /obj/structure/bedsheetbin/attack_tk(mob/user)
if(amount >= 1) if(amount >= 1)
amount-- amount--
var/obj/item/weapon/bedsheet/B var/obj/item/weapon/bedsheet/B
if(sheets.len > 0) if(sheets.len > 0)
B = sheets[sheets.len] B = sheets[sheets.len]
sheets.Remove(B) sheets.Remove(B)
else else
B = new /obj/item/weapon/bedsheet(loc) B = new /obj/item/weapon/bedsheet(loc)
B.loc = loc B.loc = loc
to_chat(user, "<span class='notice'>You telekinetically remove [B] from [src].</span>") to_chat(user, "<span class='notice'>You telekinetically remove [B] from [src].</span>")
update_icon() update_icon()
if(hidden) if(hidden)
hidden.loc = loc hidden.loc = loc
hidden = null hidden = null
add_fingerprint(user) add_fingerprint(user)

View File

@@ -1,283 +1,283 @@
/obj/structure/closet/secure_closet/captains /obj/structure/closet/secure_closet/captains
name = "\proper captain's locker" name = "\proper captain's locker"
req_access = list(GLOB.access_captain) req_access = list(GLOB.access_captain)
icon_state = "cap" icon_state = "cap"
/obj/structure/closet/secure_closet/captains/PopulateContents() /obj/structure/closet/secure_closet/captains/PopulateContents()
..() ..()
new /obj/item/clothing/suit/hooded/wintercoat/captain(src) new /obj/item/clothing/suit/hooded/wintercoat/captain(src)
if(prob(50)) if(prob(50))
new /obj/item/weapon/storage/backpack/captain(src) new /obj/item/weapon/storage/backpack/captain(src)
else else
new /obj/item/weapon/storage/backpack/satchel/cap(src) new /obj/item/weapon/storage/backpack/satchel/cap(src)
new /obj/item/clothing/neck/cloak/cap(src) new /obj/item/clothing/neck/cloak/cap(src)
new /obj/item/weapon/storage/daki(src) new /obj/item/weapon/storage/daki(src)
new /obj/item/weapon/storage/backpack/dufflebag/captain(src) new /obj/item/weapon/storage/backpack/dufflebag/captain(src)
new /obj/item/clothing/head/crown/fancy(src) new /obj/item/clothing/head/crown/fancy(src)
new /obj/item/clothing/suit/captunic(src) new /obj/item/clothing/suit/captunic(src)
new /obj/item/clothing/under/captainparade(src) new /obj/item/clothing/under/captainparade(src)
new /obj/item/clothing/head/caphat/parade(src) new /obj/item/clothing/head/caphat/parade(src)
new /obj/item/clothing/under/rank/captain(src) new /obj/item/clothing/under/rank/captain(src)
new /obj/item/clothing/suit/armor/vest/capcarapace/alt(src) new /obj/item/clothing/suit/armor/vest/capcarapace/alt(src)
new /obj/item/weapon/cartridge/captain(src) new /obj/item/weapon/cartridge/captain(src)
new /obj/item/clothing/shoes/sneakers/brown(src) new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/weapon/storage/box/silver_ids(src) new /obj/item/weapon/storage/box/silver_ids(src)
new /obj/item/device/radio/headset/heads/captain/alt(src) new /obj/item/device/radio/headset/heads/captain/alt(src)
new /obj/item/device/radio/headset/heads/captain(src) new /obj/item/device/radio/headset/heads/captain(src)
new /obj/item/clothing/glasses/sunglasses/gar/supergar(src) new /obj/item/clothing/glasses/sunglasses/gar/supergar(src)
new /obj/item/clothing/gloves/color/captain(src) new /obj/item/clothing/gloves/color/captain(src)
new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) new /obj/item/weapon/restraints/handcuffs/cable/zipties(src)
new /obj/item/weapon/storage/belt/sabre(src) new /obj/item/weapon/storage/belt/sabre(src)
new /obj/item/weapon/gun/energy/e_gun(src) new /obj/item/weapon/gun/energy/e_gun(src)
new /obj/item/weapon/door_remote/captain(src) new /obj/item/weapon/door_remote/captain(src)
/obj/structure/closet/secure_closet/hop /obj/structure/closet/secure_closet/hop
name = "\proper head of personnel's locker" name = "\proper head of personnel's locker"
req_access = list(GLOB.access_hop) req_access = list(GLOB.access_hop)
icon_state = "hop" icon_state = "hop"
/obj/structure/closet/secure_closet/hop/PopulateContents() /obj/structure/closet/secure_closet/hop/PopulateContents()
..() ..()
new /obj/item/clothing/neck/cloak/hop(src) new /obj/item/clothing/neck/cloak/hop(src)
new /obj/item/clothing/under/rank/head_of_personnel(src) new /obj/item/clothing/under/rank/head_of_personnel(src)
new /obj/item/clothing/head/hopcap(src) new /obj/item/clothing/head/hopcap(src)
new /obj/item/weapon/cartridge/hop(src) new /obj/item/weapon/cartridge/hop(src)
new /obj/item/device/radio/headset/heads/hop(src) new /obj/item/device/radio/headset/heads/hop(src)
new /obj/item/clothing/shoes/sneakers/brown(src) new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/weapon/storage/box/ids(src) new /obj/item/weapon/storage/box/ids(src)
new /obj/item/weapon/storage/box/ids(src) new /obj/item/weapon/storage/box/ids(src)
new /obj/item/device/megaphone/command(src) new /obj/item/device/megaphone/command(src)
new /obj/item/clothing/suit/armor/vest/alt(src) new /obj/item/clothing/suit/armor/vest/alt(src)
new /obj/item/device/assembly/flash/handheld(src) new /obj/item/device/assembly/flash/handheld(src)
new /obj/item/clothing/glasses/sunglasses(src) new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) new /obj/item/weapon/restraints/handcuffs/cable/zipties(src)
new /obj/item/weapon/gun/energy/e_gun(src) new /obj/item/weapon/gun/energy/e_gun(src)
new /obj/item/clothing/neck/petcollar(src) new /obj/item/clothing/neck/petcollar(src)
new /obj/item/weapon/door_remote/civillian(src) new /obj/item/weapon/door_remote/civillian(src)
/obj/structure/closet/secure_closet/hos /obj/structure/closet/secure_closet/hos
name = "\proper head of security's locker" name = "\proper head of security's locker"
req_access = list(GLOB.access_hos) req_access = list(GLOB.access_hos)
icon_state = "hos" icon_state = "hos"
/obj/structure/closet/secure_closet/hos/PopulateContents() /obj/structure/closet/secure_closet/hos/PopulateContents()
..() ..()
new /obj/item/clothing/neck/cloak/hos(src) new /obj/item/clothing/neck/cloak/hos(src)
new /obj/item/weapon/cartridge/hos(src) new /obj/item/weapon/cartridge/hos(src)
new /obj/item/device/radio/headset/heads/hos(src) new /obj/item/device/radio/headset/heads/hos(src)
new /obj/item/clothing/under/hosparadefem(src) new /obj/item/clothing/under/hosparadefem(src)
new /obj/item/clothing/under/hosparademale(src) new /obj/item/clothing/under/hosparademale(src)
new /obj/item/clothing/suit/armor/vest/leather(src) new /obj/item/clothing/suit/armor/vest/leather(src)
new /obj/item/clothing/suit/armor/hos(src) new /obj/item/clothing/suit/armor/hos(src)
new /obj/item/clothing/under/rank/head_of_security/alt(src) new /obj/item/clothing/under/rank/head_of_security/alt(src)
new /obj/item/clothing/head/HoS(src) new /obj/item/clothing/head/HoS(src)
new /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch(src) new /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch(src)
new /obj/item/clothing/glasses/hud/security/sunglasses/gars/supergars(src) new /obj/item/clothing/glasses/hud/security/sunglasses/gars/supergars(src)
new /obj/item/device/megaphone/sec(src) new /obj/item/device/megaphone/sec(src)
new /obj/item/weapon/holosign_creator/security(src) new /obj/item/weapon/holosign_creator/security(src)
new /obj/item/weapon/storage/lockbox/loyalty(src) new /obj/item/weapon/storage/lockbox/loyalty(src)
new /obj/item/clothing/mask/gas/sechailer/swat(src) new /obj/item/clothing/mask/gas/sechailer/swat(src)
new /obj/item/weapon/storage/box/flashbangs(src) new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/shield/riot/tele(src) new /obj/item/weapon/shield/riot/tele(src)
new /obj/item/weapon/storage/belt/security/full(src) new /obj/item/weapon/storage/belt/security/full(src)
new /obj/item/weapon/gun/energy/e_gun/hos(src) new /obj/item/weapon/gun/energy/e_gun/hos(src)
new /obj/item/device/flashlight/seclite(src) new /obj/item/device/flashlight/seclite(src)
new /obj/item/weapon/pinpointer(src) new /obj/item/weapon/pinpointer(src)
/obj/structure/closet/secure_closet/warden /obj/structure/closet/secure_closet/warden
name = "\proper warden's locker" name = "\proper warden's locker"
req_access = list(GLOB.access_armory) req_access = list(GLOB.access_armory)
icon_state = "warden" icon_state = "warden"
/obj/structure/closet/secure_closet/warden/PopulateContents() /obj/structure/closet/secure_closet/warden/PopulateContents()
..() ..()
new /obj/item/device/radio/headset/headset_sec(src) new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/clothing/suit/armor/vest/warden(src) new /obj/item/clothing/suit/armor/vest/warden(src)
new /obj/item/clothing/head/warden(src) new /obj/item/clothing/head/warden(src)
new /obj/item/clothing/head/beret/sec/navywarden(src) new /obj/item/clothing/head/beret/sec/navywarden(src)
new /obj/item/clothing/suit/armor/vest/warden/alt(src) new /obj/item/clothing/suit/armor/vest/warden/alt(src)
new /obj/item/clothing/under/rank/warden/navyblue(src) new /obj/item/clothing/under/rank/warden/navyblue(src)
new /obj/item/clothing/glasses/hud/security/sunglasses(src) new /obj/item/clothing/glasses/hud/security/sunglasses(src)
new /obj/item/weapon/holosign_creator/security(src) new /obj/item/weapon/holosign_creator/security(src)
new /obj/item/clothing/mask/gas/sechailer(src) new /obj/item/clothing/mask/gas/sechailer(src)
new /obj/item/weapon/storage/box/zipties(src) new /obj/item/weapon/storage/box/zipties(src)
new /obj/item/weapon/storage/box/flashbangs(src) new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/storage/belt/security/full(src) new /obj/item/weapon/storage/belt/security/full(src)
new /obj/item/device/flashlight/seclite(src) new /obj/item/device/flashlight/seclite(src)
new /obj/item/clothing/gloves/krav_maga/sec(src) new /obj/item/clothing/gloves/krav_maga/sec(src)
new /obj/item/weapon/door_remote/head_of_security(src) new /obj/item/weapon/door_remote/head_of_security(src)
new /obj/item/weapon/gun/ballistic/shotgun/automatic/dual_tube(src) new /obj/item/weapon/gun/ballistic/shotgun/automatic/dual_tube(src)
/obj/structure/closet/secure_closet/security /obj/structure/closet/secure_closet/security
name = "security officer's locker" name = "security officer's locker"
req_access = list(GLOB.access_security) req_access = list(GLOB.access_security)
icon_state = "sec" icon_state = "sec"
/obj/structure/closet/secure_closet/security/PopulateContents() /obj/structure/closet/secure_closet/security/PopulateContents()
..() ..()
new /obj/item/clothing/suit/armor/vest(src) new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/clothing/head/helmet/sec(src) new /obj/item/clothing/head/helmet/sec(src)
new /obj/item/device/radio/headset/headset_sec(src) new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/device/radio/headset/headset_sec/alt(src) new /obj/item/device/radio/headset/headset_sec/alt(src)
new /obj/item/clothing/glasses/hud/security/sunglasses(src) new /obj/item/clothing/glasses/hud/security/sunglasses(src)
new /obj/item/device/flashlight/seclite(src) new /obj/item/device/flashlight/seclite(src)
/obj/structure/closet/secure_closet/security/sec /obj/structure/closet/secure_closet/security/sec
/obj/structure/closet/secure_closet/security/sec/PopulateContents() /obj/structure/closet/secure_closet/security/sec/PopulateContents()
..() ..()
new /obj/item/weapon/storage/belt/security/full(src) new /obj/item/weapon/storage/belt/security/full(src)
/obj/structure/closet/secure_closet/security/cargo /obj/structure/closet/secure_closet/security/cargo
/obj/structure/closet/secure_closet/security/cargo/PopulateContents() /obj/structure/closet/secure_closet/security/cargo/PopulateContents()
..() ..()
new /obj/item/clothing/tie/armband/cargo(src) new /obj/item/clothing/tie/armband/cargo(src)
new /obj/item/device/encryptionkey/headset_cargo(src) new /obj/item/device/encryptionkey/headset_cargo(src)
/obj/structure/closet/secure_closet/security/engine /obj/structure/closet/secure_closet/security/engine
/obj/structure/closet/secure_closet/security/engine/PopulateContents() /obj/structure/closet/secure_closet/security/engine/PopulateContents()
..() ..()
new /obj/item/clothing/tie/armband/engine(src) new /obj/item/clothing/tie/armband/engine(src)
new /obj/item/device/encryptionkey/headset_eng(src) new /obj/item/device/encryptionkey/headset_eng(src)
/obj/structure/closet/secure_closet/security/science /obj/structure/closet/secure_closet/security/science
/obj/structure/closet/secure_closet/security/science/PopulateContents() /obj/structure/closet/secure_closet/security/science/PopulateContents()
..() ..()
new /obj/item/clothing/tie/armband/science(src) new /obj/item/clothing/tie/armband/science(src)
new /obj/item/device/encryptionkey/headset_sci(src) new /obj/item/device/encryptionkey/headset_sci(src)
/obj/structure/closet/secure_closet/security/med /obj/structure/closet/secure_closet/security/med
/obj/structure/closet/secure_closet/security/med/PopulateContents() /obj/structure/closet/secure_closet/security/med/PopulateContents()
..() ..()
new /obj/item/clothing/tie/armband/medblue(src) new /obj/item/clothing/tie/armband/medblue(src)
new /obj/item/device/encryptionkey/headset_med(src) new /obj/item/device/encryptionkey/headset_med(src)
/obj/structure/closet/secure_closet/detective /obj/structure/closet/secure_closet/detective
name = "\proper detective's cabinet" name = "\proper detective's cabinet"
req_access = list(GLOB.access_forensics_lockers) req_access = list(GLOB.access_forensics_lockers)
icon_state = "cabinet" icon_state = "cabinet"
resistance_flags = FLAMMABLE resistance_flags = FLAMMABLE
obj_integrity = 70 obj_integrity = 70
max_integrity = 70 max_integrity = 70
/obj/structure/closet/secure_closet/detective/PopulateContents() /obj/structure/closet/secure_closet/detective/PopulateContents()
..() ..()
new /obj/item/clothing/under/rank/det(src) new /obj/item/clothing/under/rank/det(src)
new /obj/item/clothing/suit/det_suit(src) new /obj/item/clothing/suit/det_suit(src)
new /obj/item/clothing/head/det_hat(src) new /obj/item/clothing/head/det_hat(src)
new /obj/item/clothing/gloves/color/black(src) new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/under/rank/det/grey(src) new /obj/item/clothing/under/rank/det/grey(src)
new /obj/item/clothing/tie/waistcoat(src) new /obj/item/clothing/tie/waistcoat(src)
new /obj/item/clothing/suit/det_suit/grey(src) new /obj/item/clothing/suit/det_suit/grey(src)
new /obj/item/clothing/head/fedora(src) new /obj/item/clothing/head/fedora(src)
new /obj/item/clothing/shoes/laceup(src) new /obj/item/clothing/shoes/laceup(src)
new /obj/item/weapon/storage/box/evidence(src) new /obj/item/weapon/storage/box/evidence(src)
new /obj/item/device/radio/headset/headset_sec(src) new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/device/detective_scanner(src) new /obj/item/device/detective_scanner(src)
new /obj/item/device/flashlight/seclite(src) new /obj/item/device/flashlight/seclite(src)
new /obj/item/weapon/holosign_creator/security(src) new /obj/item/weapon/holosign_creator/security(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src) new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/clothing/suit/armor/vest/det_suit(src) new /obj/item/clothing/suit/armor/vest/det_suit(src)
new /obj/item/weapon/storage/belt/holster/full(src) new /obj/item/weapon/storage/belt/holster/full(src)
/obj/structure/closet/secure_closet/injection /obj/structure/closet/secure_closet/injection
name = "lethal injections" name = "lethal injections"
req_access = list(GLOB.access_hos) req_access = list(GLOB.access_hos)
/obj/structure/closet/secure_closet/injection/PopulateContents() /obj/structure/closet/secure_closet/injection/PopulateContents()
..() ..()
for(var/i in 1 to 5) for(var/i in 1 to 5)
new /obj/item/weapon/reagent_containers/syringe/lethal/execution(src) new /obj/item/weapon/reagent_containers/syringe/lethal/execution(src)
/obj/structure/closet/secure_closet/brig /obj/structure/closet/secure_closet/brig
name = "brig locker" name = "brig locker"
req_access = list(GLOB.access_brig) req_access = list(GLOB.access_brig)
anchored = 1 anchored = 1
var/id = null var/id = null
/obj/structure/closet/secure_closet/brig/PopulateContents() /obj/structure/closet/secure_closet/brig/PopulateContents()
..() ..()
new /obj/item/clothing/under/rank/prisoner( src ) new /obj/item/clothing/under/rank/prisoner( src )
new /obj/item/clothing/shoes/sneakers/orange( src ) new /obj/item/clothing/shoes/sneakers/orange( src )
/obj/structure/closet/secure_closet/courtroom /obj/structure/closet/secure_closet/courtroom
name = "courtroom locker" name = "courtroom locker"
req_access = list(GLOB.access_court) req_access = list(GLOB.access_court)
/obj/structure/closet/secure_closet/courtroom/PopulateContents() /obj/structure/closet/secure_closet/courtroom/PopulateContents()
..() ..()
new /obj/item/clothing/shoes/sneakers/brown(src) new /obj/item/clothing/shoes/sneakers/brown(src)
for(var/i in 1 to 3) for(var/i in 1 to 3)
new /obj/item/weapon/paper/Court (src) new /obj/item/weapon/paper/Court (src)
new /obj/item/weapon/pen (src) new /obj/item/weapon/pen (src)
new /obj/item/clothing/suit/judgerobe (src) new /obj/item/clothing/suit/judgerobe (src)
new /obj/item/clothing/head/powdered_wig (src) new /obj/item/clothing/head/powdered_wig (src)
new /obj/item/weapon/storage/briefcase(src) new /obj/item/weapon/storage/briefcase(src)
/obj/structure/closet/secure_closet/armory1 /obj/structure/closet/secure_closet/armory1
name = "armory armor locker" name = "armory armor locker"
req_access = list(GLOB.access_armory) req_access = list(GLOB.access_armory)
icon_state = "armory" icon_state = "armory"
/obj/structure/closet/secure_closet/armory1/PopulateContents() /obj/structure/closet/secure_closet/armory1/PopulateContents()
..() ..()
new /obj/item/clothing/suit/armor/laserproof(src) new /obj/item/clothing/suit/armor/laserproof(src)
for(var/i in 1 to 3) for(var/i in 1 to 3)
new /obj/item/clothing/suit/armor/riot(src) new /obj/item/clothing/suit/armor/riot(src)
for(var/i in 1 to 3) for(var/i in 1 to 3)
new /obj/item/clothing/head/helmet/riot(src) new /obj/item/clothing/head/helmet/riot(src)
for(var/i in 1 to 3) for(var/i in 1 to 3)
new /obj/item/weapon/shield/riot(src) new /obj/item/weapon/shield/riot(src)
/obj/structure/closet/secure_closet/armory2 /obj/structure/closet/secure_closet/armory2
name = "armory ballistics locker" name = "armory ballistics locker"
req_access = list(GLOB.access_armory) req_access = list(GLOB.access_armory)
icon_state = "armory" icon_state = "armory"
/obj/structure/closet/secure_closet/armory2/PopulateContents() /obj/structure/closet/secure_closet/armory2/PopulateContents()
..() ..()
new /obj/item/weapon/storage/box/firingpins(src) new /obj/item/weapon/storage/box/firingpins(src)
for(var/i in 1 to 3) for(var/i in 1 to 3)
new /obj/item/weapon/storage/box/rubbershot(src) new /obj/item/weapon/storage/box/rubbershot(src)
for(var/i in 1 to 3) for(var/i in 1 to 3)
new /obj/item/weapon/gun/ballistic/shotgun/riot(src) new /obj/item/weapon/gun/ballistic/shotgun/riot(src)
/obj/structure/closet/secure_closet/armory3 /obj/structure/closet/secure_closet/armory3
name = "armory energy gun locker" name = "armory energy gun locker"
req_access = list(GLOB.access_armory) req_access = list(GLOB.access_armory)
icon_state = "armory" icon_state = "armory"
/obj/structure/closet/secure_closet/armory3/PopulateContents() /obj/structure/closet/secure_closet/armory3/PopulateContents()
..() ..()
new /obj/item/weapon/storage/box/firingpins(src) new /obj/item/weapon/storage/box/firingpins(src)
new /obj/item/weapon/gun/energy/ionrifle(src) new /obj/item/weapon/gun/energy/ionrifle(src)
for(var/i in 1 to 3) for(var/i in 1 to 3)
new /obj/item/weapon/gun/energy/e_gun(src) new /obj/item/weapon/gun/energy/e_gun(src)
for(var/i in 1 to 3) for(var/i in 1 to 3)
new /obj/item/weapon/gun/energy/laser(src) new /obj/item/weapon/gun/energy/laser(src)
/obj/structure/closet/secure_closet/tac /obj/structure/closet/secure_closet/tac
name = "armory tac locker" name = "armory tac locker"
req_access = list(GLOB.access_armory) req_access = list(GLOB.access_armory)
icon_state = "tac" icon_state = "tac"
/obj/structure/closet/secure_closet/tac/PopulateContents() /obj/structure/closet/secure_closet/tac/PopulateContents()
..() ..()
new /obj/item/weapon/gun/ballistic/automatic/wt550(src) new /obj/item/weapon/gun/ballistic/automatic/wt550(src)
new /obj/item/clothing/head/helmet/alt(src) new /obj/item/clothing/head/helmet/alt(src)
new /obj/item/clothing/mask/gas/sechailer(src) new /obj/item/clothing/mask/gas/sechailer(src)
new /obj/item/clothing/suit/armor/bulletproof(src) new /obj/item/clothing/suit/armor/bulletproof(src)
/obj/structure/closet/secure_closet/lethalshots /obj/structure/closet/secure_closet/lethalshots
name = "shotgun lethal rounds" name = "shotgun lethal rounds"
req_access = list(GLOB.access_armory) req_access = list(GLOB.access_armory)
icon_state = "tac" icon_state = "tac"
/obj/structure/closet/secure_closet/lethalshots/PopulateContents() /obj/structure/closet/secure_closet/lethalshots/PopulateContents()
..() ..()
for(var/i in 1 to 3) for(var/i in 1 to 3)
new /obj/item/weapon/storage/box/lethalshot(src) new /obj/item/weapon/storage/box/lethalshot(src)

View File

@@ -1,221 +1,221 @@
//NOT using the existing /obj/machinery/door type, since that has some complications on its own, mainly based on its //NOT using the existing /obj/machinery/door type, since that has some complications on its own, mainly based on its
//machineryness //machineryness
/obj/structure/mineral_door /obj/structure/mineral_door
name = "metal door" name = "metal door"
density = 1 density = 1
anchored = 1 anchored = 1
opacity = 1 opacity = 1
icon = 'icons/obj/doors/mineral_doors.dmi' icon = 'icons/obj/doors/mineral_doors.dmi'
icon_state = "metal" icon_state = "metal"
var/initial_state var/initial_state
var/state = 0 //closed, 1 == open var/state = 0 //closed, 1 == open
var/isSwitchingStates = 0 var/isSwitchingStates = 0
var/close_delay = -1 //-1 if does not auto close. var/close_delay = -1 //-1 if does not auto close.
obj_integrity = 200 obj_integrity = 200
max_integrity = 200 max_integrity = 200
armor = list(melee = 10, bullet = 0, laser = 0, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 50, acid = 50) armor = list(melee = 10, bullet = 0, laser = 0, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 50, acid = 50)
var/sheetType = /obj/item/stack/sheet/metal var/sheetType = /obj/item/stack/sheet/metal
var/sheetAmount = 7 var/sheetAmount = 7
var/openSound = 'sound/effects/stonedoor_openclose.ogg' var/openSound = 'sound/effects/stonedoor_openclose.ogg'
var/closeSound = 'sound/effects/stonedoor_openclose.ogg' var/closeSound = 'sound/effects/stonedoor_openclose.ogg'
CanAtmosPass = ATMOS_PASS_DENSITY CanAtmosPass = ATMOS_PASS_DENSITY
/obj/structure/mineral_door/New(location) /obj/structure/mineral_door/New(location)
..() ..()
initial_state = icon_state initial_state = icon_state
air_update_turf(1) air_update_turf(1)
/obj/structure/mineral_door/Destroy() /obj/structure/mineral_door/Destroy()
density = 0 density = 0
air_update_turf(1) air_update_turf(1)
return ..() return ..()
/obj/structure/mineral_door/Move() /obj/structure/mineral_door/Move()
var/turf/T = loc var/turf/T = loc
..() ..()
move_update_air(T) move_update_air(T)
/obj/structure/mineral_door/Bumped(atom/user) /obj/structure/mineral_door/Bumped(atom/user)
..() ..()
if(!state) if(!state)
return TryToSwitchState(user) return TryToSwitchState(user)
/obj/structure/mineral_door/attack_ai(mob/user) //those aren't machinery, they're just big fucking slabs of a mineral /obj/structure/mineral_door/attack_ai(mob/user) //those aren't machinery, they're just big fucking slabs of a mineral
if(isAI(user)) //so the AI can't open it if(isAI(user)) //so the AI can't open it
return return
else if(iscyborg(user)) //but cyborgs can else if(iscyborg(user)) //but cyborgs can
if(get_dist(user,src) <= 1) //not remotely though if(get_dist(user,src) <= 1) //not remotely though
return TryToSwitchState(user) return TryToSwitchState(user)
/obj/structure/mineral_door/attack_paw(mob/user) /obj/structure/mineral_door/attack_paw(mob/user)
return TryToSwitchState(user) return TryToSwitchState(user)
/obj/structure/mineral_door/attack_hand(mob/user) /obj/structure/mineral_door/attack_hand(mob/user)
return TryToSwitchState(user) return TryToSwitchState(user)
/obj/structure/mineral_door/CanPass(atom/movable/mover, turf/target, height=0) /obj/structure/mineral_door/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover, /obj/effect/beam)) if(istype(mover, /obj/effect/beam))
return !opacity return !opacity
return !density return !density
/obj/structure/mineral_door/proc/TryToSwitchState(atom/user) /obj/structure/mineral_door/proc/TryToSwitchState(atom/user)
if(isSwitchingStates) if(isSwitchingStates)
return return
if(isliving(user)) if(isliving(user))
var/mob/living/M = user var/mob/living/M = user
if(world.time - M.last_bumped <= 60) if(world.time - M.last_bumped <= 60)
return //NOTE do we really need that? return //NOTE do we really need that?
if(M.client) if(M.client)
if(iscarbon(M)) if(iscarbon(M))
var/mob/living/carbon/C = M var/mob/living/carbon/C = M
if(!C.handcuffed) if(!C.handcuffed)
SwitchState() SwitchState()
else else
SwitchState() SwitchState()
else if(istype(user, /obj/mecha)) else if(istype(user, /obj/mecha))
SwitchState() SwitchState()
/obj/structure/mineral_door/proc/SwitchState() /obj/structure/mineral_door/proc/SwitchState()
if(state) if(state)
Close() Close()
else else
Open() Open()
/obj/structure/mineral_door/proc/Open() /obj/structure/mineral_door/proc/Open()
isSwitchingStates = 1 isSwitchingStates = 1
playsound(loc, openSound, 100, 1) playsound(loc, openSound, 100, 1)
flick("[initial_state]opening",src) flick("[initial_state]opening",src)
sleep(10) sleep(10)
density = 0 density = 0
opacity = 0 opacity = 0
state = 1 state = 1
air_update_turf(1) air_update_turf(1)
update_icon() update_icon()
isSwitchingStates = 0 isSwitchingStates = 0
if(close_delay != -1) if(close_delay != -1)
addtimer(CALLBACK(src, .proc/Close), close_delay) addtimer(CALLBACK(src, .proc/Close), close_delay)
/obj/structure/mineral_door/proc/Close() /obj/structure/mineral_door/proc/Close()
if(isSwitchingStates || state != 1) if(isSwitchingStates || state != 1)
return return
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
for(var/mob/living/L in T) for(var/mob/living/L in T)
return return
isSwitchingStates = 1 isSwitchingStates = 1
playsound(loc, closeSound, 100, 1) playsound(loc, closeSound, 100, 1)
flick("[initial_state]closing",src) flick("[initial_state]closing",src)
sleep(10) sleep(10)
density = 1 density = 1
opacity = 1 opacity = 1
state = 0 state = 0
air_update_turf(1) air_update_turf(1)
update_icon() update_icon()
isSwitchingStates = 0 isSwitchingStates = 0
/obj/structure/mineral_door/update_icon() /obj/structure/mineral_door/update_icon()
if(state) if(state)
icon_state = "[initial_state]open" icon_state = "[initial_state]open"
else else
icon_state = initial_state icon_state = initial_state
/obj/structure/mineral_door/attackby(obj/item/weapon/W, mob/user, params) /obj/structure/mineral_door/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W,/obj/item/weapon/pickaxe)) if(istype(W,/obj/item/weapon/pickaxe))
var/obj/item/weapon/pickaxe/digTool = W var/obj/item/weapon/pickaxe/digTool = W
to_chat(user, "<span class='notice'>You start digging the [name]...</span>") to_chat(user, "<span class='notice'>You start digging the [name]...</span>")
if(do_after(user,digTool.digspeed*(1+round(max_integrity*0.01)), target = src) && src) if(do_after(user,digTool.digspeed*(1+round(max_integrity*0.01)), target = src) && src)
to_chat(user, "<span class='notice'>You finish digging.</span>") to_chat(user, "<span class='notice'>You finish digging.</span>")
deconstruct(TRUE) deconstruct(TRUE)
else if(user.a_intent != INTENT_HARM) else if(user.a_intent != INTENT_HARM)
attack_hand(user) attack_hand(user)
else else
return ..() return ..()
/obj/structure/mineral_door/deconstruct(disassembled = TRUE) /obj/structure/mineral_door/deconstruct(disassembled = TRUE)
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
if(disassembled) if(disassembled)
new sheetType(T, sheetAmount) new sheetType(T, sheetAmount)
else else
new sheetType(T, max(sheetAmount - 2, 1)) new sheetType(T, max(sheetAmount - 2, 1))
qdel(src) qdel(src)
/obj/structure/mineral_door/iron /obj/structure/mineral_door/iron
name = "iron door" name = "iron door"
obj_integrity = 300 obj_integrity = 300
max_integrity = 300 max_integrity = 300
/obj/structure/mineral_door/silver /obj/structure/mineral_door/silver
name = "silver door" name = "silver door"
icon_state = "silver" icon_state = "silver"
sheetType = /obj/item/stack/sheet/mineral/silver sheetType = /obj/item/stack/sheet/mineral/silver
obj_integrity = 300 obj_integrity = 300
max_integrity = 300 max_integrity = 300
/obj/structure/mineral_door/gold /obj/structure/mineral_door/gold
name = "gold door" name = "gold door"
icon_state = "gold" icon_state = "gold"
sheetType = /obj/item/stack/sheet/mineral/gold sheetType = /obj/item/stack/sheet/mineral/gold
/obj/structure/mineral_door/uranium /obj/structure/mineral_door/uranium
name = "uranium door" name = "uranium door"
icon_state = "uranium" icon_state = "uranium"
sheetType = /obj/item/stack/sheet/mineral/uranium sheetType = /obj/item/stack/sheet/mineral/uranium
obj_integrity = 300 obj_integrity = 300
max_integrity = 300 max_integrity = 300
light_range = 2 light_range = 2
/obj/structure/mineral_door/sandstone /obj/structure/mineral_door/sandstone
name = "sandstone door" name = "sandstone door"
icon_state = "sandstone" icon_state = "sandstone"
sheetType = /obj/item/stack/sheet/mineral/sandstone sheetType = /obj/item/stack/sheet/mineral/sandstone
obj_integrity = 100 obj_integrity = 100
max_integrity = 100 max_integrity = 100
/obj/structure/mineral_door/transparent /obj/structure/mineral_door/transparent
opacity = 0 opacity = 0
/obj/structure/mineral_door/transparent/Close() /obj/structure/mineral_door/transparent/Close()
..() ..()
opacity = 0 opacity = 0
/obj/structure/mineral_door/transparent/plasma /obj/structure/mineral_door/transparent/plasma
name = "plasma door" name = "plasma door"
icon_state = "plasma" icon_state = "plasma"
sheetType = /obj/item/stack/sheet/mineral/plasma sheetType = /obj/item/stack/sheet/mineral/plasma
/obj/structure/mineral_door/transparent/plasma/attackby(obj/item/weapon/W, mob/user, params) /obj/structure/mineral_door/transparent/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(W.is_hot()) if(W.is_hot())
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
message_admins("Plasma mineral door ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1) message_admins("Plasma mineral door ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
log_game("Plasma mineral door ignited by [key_name(user)] in [COORD(T)]") log_game("Plasma mineral door ignited by [key_name(user)] in [COORD(T)]")
TemperatureAct() TemperatureAct()
else else
return ..() return ..()
/obj/structure/mineral_door/transparent/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) /obj/structure/mineral_door/transparent/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300) if(exposed_temperature > 300)
TemperatureAct() TemperatureAct()
/obj/structure/mineral_door/transparent/plasma/proc/TemperatureAct() /obj/structure/mineral_door/transparent/plasma/proc/TemperatureAct()
atmos_spawn_air("plasma=500;TEMP=1000") atmos_spawn_air("plasma=500;TEMP=1000")
deconstruct(FALSE) deconstruct(FALSE)
/obj/structure/mineral_door/transparent/diamond /obj/structure/mineral_door/transparent/diamond
name = "diamond door" name = "diamond door"
icon_state = "diamond" icon_state = "diamond"
sheetType = /obj/item/stack/sheet/mineral/diamond sheetType = /obj/item/stack/sheet/mineral/diamond
obj_integrity = 1000 obj_integrity = 1000
max_integrity = 1000 max_integrity = 1000
/obj/structure/mineral_door/wood /obj/structure/mineral_door/wood
name = "wood door" name = "wood door"
icon_state = "wood" icon_state = "wood"
openSound = 'sound/effects/doorcreaky.ogg' openSound = 'sound/effects/doorcreaky.ogg'
closeSound = 'sound/effects/doorcreaky.ogg' closeSound = 'sound/effects/doorcreaky.ogg'
sheetType = /obj/item/stack/sheet/mineral/wood sheetType = /obj/item/stack/sheet/mineral/wood
resistance_flags = FLAMMABLE resistance_flags = FLAMMABLE
obj_integrity = 200 obj_integrity = 200
max_integrity = 200 max_integrity = 200

View File

@@ -387,8 +387,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
for(var/obj/effect/landmark/L in GLOB.landmarks_list) for(var/obj/effect/landmark/L in GLOB.landmarks_list)
if(L.name=="carpspawn") if(L.name=="carpspawn")
ninja_spawn += L ninja_spawn += L
var/datum/antagonist/ninja/ninjadatum = new_character.mind.has_antag_datum(ANTAG_DATUM_NINJA) var/datum/antagonist/ninja/ninjadatum = new_character.mind.has_antag_datum(ANTAG_DATUM_NINJA)
ninjadatum.equip_space_ninja() ninjadatum.equip_space_ninja()
if(ninja_spawn.len) if(ninja_spawn.len)
var/obj/effect/landmark/ninja_spawn_here = pick(ninja_spawn) var/obj/effect/landmark/ninja_spawn_here = pick(ninja_spawn)
new_character.loc = ninja_spawn_here.loc new_character.loc = ninja_spawn_here.loc
@@ -586,7 +586,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
empulse(O, heavy, light) empulse(O, heavy, light)
log_admin("[key_name(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])") log_admin("[key_name(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])")
message_admins("[key_name_admin(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])") message_admins("[key_name_admin(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])")
SSblackbox.add_details("admin_verb","EM Pulse") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! SSblackbox.add_details("admin_verb","EM Pulse") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return return

View File

@@ -1,115 +1,115 @@
/obj/item/device/assembly/timer /obj/item/device/assembly/timer
name = "timer" name = "timer"
desc = "Used to time things. Works well with contraptions which has to count down. Tick tock." desc = "Used to time things. Works well with contraptions which has to count down. Tick tock."
icon_state = "timer" icon_state = "timer"
materials = list(MAT_METAL=500, MAT_GLASS=50) materials = list(MAT_METAL=500, MAT_GLASS=50)
origin_tech = "magnets=1;engineering=1" origin_tech = "magnets=1;engineering=1"
attachable = 1 attachable = 1
var/timing = 0 var/timing = 0
var/time = 5 var/time = 5
var/saved_time = 5 var/saved_time = 5
var/loop = 0 var/loop = 0
/obj/item/device/assembly/timer/New() /obj/item/device/assembly/timer/New()
..() ..()
START_PROCESSING(SSobj, src) START_PROCESSING(SSobj, src)
/obj/item/device/assembly/timer/describe() /obj/item/device/assembly/timer/describe()
if(timing) if(timing)
return "The timer is counting down from [time]!" return "The timer is counting down from [time]!"
return "The timer is set for [time] seconds." return "The timer is set for [time] seconds."
/obj/item/device/assembly/timer/activate() /obj/item/device/assembly/timer/activate()
if(!..()) if(!..())
return 0//Cooldown check return 0//Cooldown check
timing = !timing timing = !timing
update_icon() update_icon()
return 1 return 1
/obj/item/device/assembly/timer/toggle_secure() /obj/item/device/assembly/timer/toggle_secure()
secured = !secured secured = !secured
if(secured) if(secured)
START_PROCESSING(SSobj, src) START_PROCESSING(SSobj, src)
else else
timing = 0 timing = 0
STOP_PROCESSING(SSobj, src) STOP_PROCESSING(SSobj, src)
update_icon() update_icon()
return secured return secured
/obj/item/device/assembly/timer/proc/timer_end() /obj/item/device/assembly/timer/proc/timer_end()
if(!secured || next_activate > world.time) if(!secured || next_activate > world.time)
return FALSE return FALSE
pulse(0) pulse(0)
audible_message("\icon[src] *beep* *beep*", null, 3) audible_message("\icon[src] *beep* *beep*", null, 3)
if(loop) if(loop)
timing = 1 timing = 1
update_icon() update_icon()
/obj/item/device/assembly/timer/process() /obj/item/device/assembly/timer/process()
if(timing) if(timing)
time-- time--
if(time <= 0) if(time <= 0)
timing = 0 timing = 0
timer_end() timer_end()
time = saved_time time = saved_time
/obj/item/device/assembly/timer/update_icon() /obj/item/device/assembly/timer/update_icon()
cut_overlays() cut_overlays()
attached_overlays = list() attached_overlays = list()
if(timing) if(timing)
add_overlay("timer_timing") add_overlay("timer_timing")
attached_overlays += "timer_timing" attached_overlays += "timer_timing"
if(holder) if(holder)
holder.update_icon() holder.update_icon()
/obj/item/device/assembly/timer/interact(mob/user)//TODO: Have this use the wires /obj/item/device/assembly/timer/interact(mob/user)//TODO: Have this use the wires
if(is_secured(user)) if(is_secured(user))
var/second = time % 60 var/second = time % 60
var/minute = (time - second) / 60 var/minute = (time - second) / 60
var/dat = "<TT><B>Timing Unit</B>\n[(timing ? "<A href='?src=\ref[src];time=0'>Timing</A>" : "<A href='?src=\ref[src];time=1'>Not Timing</A>")] [minute]:[second]\n<A href='?src=\ref[src];tp=-30'>-</A> <A href='?src=\ref[src];tp=-1'>-</A> <A href='?src=\ref[src];tp=1'>+</A> <A href='?src=\ref[src];tp=30'>+</A>\n</TT>" var/dat = "<TT><B>Timing Unit</B>\n[(timing ? "<A href='?src=\ref[src];time=0'>Timing</A>" : "<A href='?src=\ref[src];time=1'>Not Timing</A>")] [minute]:[second]\n<A href='?src=\ref[src];tp=-30'>-</A> <A href='?src=\ref[src];tp=-1'>-</A> <A href='?src=\ref[src];tp=1'>+</A> <A href='?src=\ref[src];tp=30'>+</A>\n</TT>"
dat += "<BR><BR><A href='?src=\ref[src];repeat=[(loop ? "0'>Stop repeating" : "1'>Set to repeat")]</A>" dat += "<BR><BR><A href='?src=\ref[src];repeat=[(loop ? "0'>Stop repeating" : "1'>Set to repeat")]</A>"
dat += "<BR><BR><A href='?src=\ref[src];refresh=1'>Refresh</A>" dat += "<BR><BR><A href='?src=\ref[src];refresh=1'>Refresh</A>"
dat += "<BR><BR><A href='?src=\ref[src];close=1'>Close</A>" dat += "<BR><BR><A href='?src=\ref[src];close=1'>Close</A>"
var/datum/browser/popup = new(user, "timer", name) var/datum/browser/popup = new(user, "timer", name)
popup.set_content(dat) popup.set_content(dat)
popup.open() popup.open()
/obj/item/device/assembly/timer/Topic(href, href_list) /obj/item/device/assembly/timer/Topic(href, href_list)
..() ..()
if(usr.incapacitated() || !in_range(loc, usr)) if(usr.incapacitated() || !in_range(loc, usr))
usr << browse(null, "window=timer") usr << browse(null, "window=timer")
onclose(usr, "timer") onclose(usr, "timer")
return return
if(href_list["time"]) if(href_list["time"])
timing = text2num(href_list["time"]) timing = text2num(href_list["time"])
if(timing && istype(holder, /obj/item/device/transfer_valve)) if(timing && istype(holder, /obj/item/device/transfer_valve))
var/timer_message = "[ADMIN_LOOKUPFLW(usr)] activated [src] attachment on [holder]." var/timer_message = "[ADMIN_LOOKUPFLW(usr)] activated [src] attachment on [holder]."
message_admins(timer_message) message_admins(timer_message)
GLOB.bombers += timer_message GLOB.bombers += timer_message
log_game("[key_name(usr)] activated [src] attachment on [holder]") log_game("[key_name(usr)] activated [src] attachment on [holder]")
update_icon() update_icon()
if(href_list["repeat"]) if(href_list["repeat"])
loop = text2num(href_list["repeat"]) loop = text2num(href_list["repeat"])
if(href_list["tp"]) if(href_list["tp"])
var/tp = text2num(href_list["tp"]) var/tp = text2num(href_list["tp"])
time += tp time += tp
time = min(max(round(time), 1), 600) time = min(max(round(time), 1), 600)
saved_time = time saved_time = time
if(href_list["close"]) if(href_list["close"])
usr << browse(null, "window=timer") usr << browse(null, "window=timer")
return return
if(usr) if(usr)
attack_self(usr) attack_self(usr)

View File

@@ -1,142 +1,142 @@
#define PUMP_OUT "out" #define PUMP_OUT "out"
#define PUMP_IN "in" #define PUMP_IN "in"
#define PUMP_MAX_PRESSURE (ONE_ATMOSPHERE * 30) #define PUMP_MAX_PRESSURE (ONE_ATMOSPHERE * 30)
#define PUMP_MIN_PRESSURE (ONE_ATMOSPHERE / 10) #define PUMP_MIN_PRESSURE (ONE_ATMOSPHERE / 10)
#define PUMP_DEFAULT_PRESSURE (ONE_ATMOSPHERE) #define PUMP_DEFAULT_PRESSURE (ONE_ATMOSPHERE)
/obj/machinery/portable_atmospherics/pump /obj/machinery/portable_atmospherics/pump
name = "portable air pump" name = "portable air pump"
icon_state = "psiphon:0" icon_state = "psiphon:0"
density = 1 density = 1
var/on = FALSE var/on = FALSE
var/direction = PUMP_OUT var/direction = PUMP_OUT
var/obj/machinery/atmospherics/components/binary/pump/pump var/obj/machinery/atmospherics/components/binary/pump/pump
volume = 1000 volume = 1000
/obj/machinery/portable_atmospherics/pump/Initialize() /obj/machinery/portable_atmospherics/pump/Initialize()
..() ..()
pump = new(src, FALSE) pump = new(src, FALSE)
pump.on = TRUE pump.on = TRUE
pump.stat = 0 pump.stat = 0
pump.build_network() pump.build_network()
/obj/machinery/portable_atmospherics/pump/Destroy() /obj/machinery/portable_atmospherics/pump/Destroy()
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
T.assume_air(air_contents) T.assume_air(air_contents)
air_update_turf() air_update_turf()
qdel(pump) qdel(pump)
pump = null pump = null
return ..() return ..()
/obj/machinery/portable_atmospherics/pump/update_icon() /obj/machinery/portable_atmospherics/pump/update_icon()
icon_state = "psiphon:[on]" icon_state = "psiphon:[on]"
cut_overlays() cut_overlays()
if(holding) if(holding)
add_overlay("siphon-open") add_overlay("siphon-open")
if(connected_port) if(connected_port)
add_overlay("siphon-connector") add_overlay("siphon-connector")
/obj/machinery/portable_atmospherics/pump/process_atmos() /obj/machinery/portable_atmospherics/pump/process_atmos()
..() ..()
if(!on) if(!on)
pump.AIR1 = null pump.AIR1 = null
pump.AIR2 = null pump.AIR2 = null
return return
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
if(direction == PUMP_OUT) // Hook up the internal pump. if(direction == PUMP_OUT) // Hook up the internal pump.
pump.AIR1 = holding ? holding.air_contents : air_contents pump.AIR1 = holding ? holding.air_contents : air_contents
pump.AIR2 = holding ? air_contents : T.return_air() pump.AIR2 = holding ? air_contents : T.return_air()
else else
pump.AIR1 = holding ? air_contents : T.return_air() pump.AIR1 = holding ? air_contents : T.return_air()
pump.AIR2 = holding ? holding.air_contents : air_contents pump.AIR2 = holding ? holding.air_contents : air_contents
pump.process_atmos() // Pump gas. pump.process_atmos() // Pump gas.
if(!holding) if(!holding)
air_update_turf() // Update the environment if needed. air_update_turf() // Update the environment if needed.
/obj/machinery/portable_atmospherics/pump/emp_act(severity) /obj/machinery/portable_atmospherics/pump/emp_act(severity)
if(is_operational()) if(is_operational())
if(prob(50 / severity)) if(prob(50 / severity))
on = !on on = !on
if(prob(100 / severity)) if(prob(100 / severity))
direction = PUMP_OUT direction = PUMP_OUT
pump.target_pressure = rand(0, 100 * ONE_ATMOSPHERE) pump.target_pressure = rand(0, 100 * ONE_ATMOSPHERE)
update_icon() update_icon()
..() ..()
/obj/machinery/portable_atmospherics/pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ /obj/machinery/portable_atmospherics/pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state) datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui) if(!ui)
ui = new(user, src, ui_key, "portable_pump", name, 420, 415, master_ui, state) ui = new(user, src, ui_key, "portable_pump", name, 420, 415, master_ui, state)
ui.open() ui.open()
/obj/machinery/portable_atmospherics/pump/ui_data() /obj/machinery/portable_atmospherics/pump/ui_data()
var/data = list() var/data = list()
data["on"] = on data["on"] = on
data["direction"] = direction data["direction"] = direction
data["connected"] = connected_port ? 1 : 0 data["connected"] = connected_port ? 1 : 0
data["pressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) data["pressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0)
data["target_pressure"] = round(pump.target_pressure ? pump.target_pressure : 0) data["target_pressure"] = round(pump.target_pressure ? pump.target_pressure : 0)
data["default_pressure"] = round(PUMP_DEFAULT_PRESSURE) data["default_pressure"] = round(PUMP_DEFAULT_PRESSURE)
data["min_pressure"] = round(PUMP_MIN_PRESSURE) data["min_pressure"] = round(PUMP_MIN_PRESSURE)
data["max_pressure"] = round(PUMP_MAX_PRESSURE) data["max_pressure"] = round(PUMP_MAX_PRESSURE)
if(holding) if(holding)
data["holding"] = list() data["holding"] = list()
data["holding"]["name"] = holding.name data["holding"]["name"] = holding.name
data["holding"]["pressure"] = round(holding.air_contents.return_pressure()) data["holding"]["pressure"] = round(holding.air_contents.return_pressure())
return data return data
/obj/machinery/portable_atmospherics/pump/ui_act(action, params) /obj/machinery/portable_atmospherics/pump/ui_act(action, params)
if(..()) if(..())
return return
switch(action) switch(action)
if("power") if("power")
on = !on on = !on
if(on && !holding) if(on && !holding)
var/plasma = air_contents.gases["plasma"] var/plasma = air_contents.gases["plasma"]
var/n2o = air_contents.gases["n2o"] var/n2o = air_contents.gases["n2o"]
if(n2o || plasma) if(n2o || plasma)
var/area/A = get_area(src) var/area/A = get_area(src)
message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][ADMIN_JMP(src)]") message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][ADMIN_JMP(src)]")
log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][COORD(src)]") log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][COORD(src)]")
. = TRUE . = TRUE
if("direction") if("direction")
if(direction == PUMP_OUT) if(direction == PUMP_OUT)
direction = PUMP_IN direction = PUMP_IN
else else
direction = PUMP_OUT direction = PUMP_OUT
. = TRUE . = TRUE
if("pressure") if("pressure")
var/pressure = params["pressure"] var/pressure = params["pressure"]
if(pressure == "reset") if(pressure == "reset")
pressure = PUMP_DEFAULT_PRESSURE pressure = PUMP_DEFAULT_PRESSURE
. = TRUE . = TRUE
else if(pressure == "min") else if(pressure == "min")
pressure = PUMP_MIN_PRESSURE pressure = PUMP_MIN_PRESSURE
. = TRUE . = TRUE
else if(pressure == "max") else if(pressure == "max")
pressure = PUMP_MAX_PRESSURE pressure = PUMP_MAX_PRESSURE
. = TRUE . = TRUE
else if(pressure == "input") else if(pressure == "input")
pressure = input("New release pressure ([PUMP_MIN_PRESSURE]-[PUMP_MAX_PRESSURE] kPa):", name, pump.target_pressure) as num|null pressure = input("New release pressure ([PUMP_MIN_PRESSURE]-[PUMP_MAX_PRESSURE] kPa):", name, pump.target_pressure) as num|null
if(!isnull(pressure) && !..()) if(!isnull(pressure) && !..())
. = TRUE . = TRUE
else if(text2num(pressure) != null) else if(text2num(pressure) != null)
pressure = text2num(pressure) pressure = text2num(pressure)
. = TRUE . = TRUE
if(.) if(.)
pump.target_pressure = Clamp(round(pressure), PUMP_MIN_PRESSURE, PUMP_MAX_PRESSURE) pump.target_pressure = Clamp(round(pressure), PUMP_MIN_PRESSURE, PUMP_MAX_PRESSURE)
investigate_log("was set to [pump.target_pressure] kPa by [key_name(usr)].", "atmos") investigate_log("was set to [pump.target_pressure] kPa by [key_name(usr)].", "atmos")
if("eject") if("eject")
if(holding) if(holding)
holding.loc = get_turf(src) holding.loc = get_turf(src)
holding = null holding = null
. = TRUE . = TRUE
update_icon() update_icon()

View File

@@ -75,8 +75,6 @@
H.dna.features["ears"] = "None" H.dna.features["ears"] = "None"
H.regenerate_icons() H.regenerate_icons()
handle_roundstart_items(H)
/datum/job/proc/get_access() /datum/job/proc/get_access()
if(!config) //Needed for robots. if(!config) //Needed for robots.
return src.minimal_access.Copy() return src.minimal_access.Copy()

View File

@@ -1,93 +1,93 @@
/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins) /proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins)
if(!z_levels || !z_levels.len) if(!z_levels || !z_levels.len)
WARNING("No Z levels provided - Not generating ruins") WARNING("No Z levels provided - Not generating ruins")
return return
for(var/zl in z_levels) for(var/zl in z_levels)
var/turf/T = locate(1, 1, zl) var/turf/T = locate(1, 1, zl)
if(!T) if(!T)
WARNING("Z level [zl] does not exist - Not generating ruins") WARNING("Z level [zl] does not exist - Not generating ruins")
return return
var/overall_sanity = 100 var/overall_sanity = 100
var/list/ruins = potentialRuins.Copy() var/list/ruins = potentialRuins.Copy()
while(budget > 0 && overall_sanity > 0) while(budget > 0 && overall_sanity > 0)
// Pick a ruin // Pick a ruin
var/datum/map_template/ruin/ruin = null var/datum/map_template/ruin/ruin = null
if(ruins && ruins.len) if(ruins && ruins.len)
ruin = ruins[pick(ruins)] ruin = ruins[pick(ruins)]
else else
log_world("Ruin loader had no ruins to pick from with [budget] left to spend.") log_world("Ruin loader had no ruins to pick from with [budget] left to spend.")
break break
// Can we afford it // Can we afford it
if(ruin.cost > budget) if(ruin.cost > budget)
overall_sanity-- overall_sanity--
continue continue
// If so, try to place it // If so, try to place it
var/sanity = 100 var/sanity = 100
// And if we can't fit it anywhere, give up, try again // And if we can't fit it anywhere, give up, try again
while(sanity > 0) while(sanity > 0)
sanity-- sanity--
var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(ruin.width / 2) var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(ruin.width / 2)
var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(ruin.height / 2) var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(ruin.height / 2)
var/z_level = pick(z_levels) var/z_level = pick(z_levels)
var/turf/T = locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z_level) var/turf/T = locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z_level)
var/valid = TRUE var/valid = TRUE
for(var/turf/check in ruin.get_affected_turfs(T,1)) for(var/turf/check in ruin.get_affected_turfs(T,1))
var/area/new_area = get_area(check) var/area/new_area = get_area(check)
if(!(istype(new_area, whitelist))) if(!(istype(new_area, whitelist)))
valid = FALSE valid = FALSE
break break
if(!valid) if(!valid)
continue continue
log_world("Ruin \"[ruin.name]\" placed at ([T.x], [T.y], [T.z])") log_world("Ruin \"[ruin.name]\" placed at ([T.x], [T.y], [T.z])")
var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T) var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T)
R.Load(ruins,ruin) R.Load(ruins,ruin)
budget -= ruin.cost budget -= ruin.cost
if(!ruin.allow_duplicates) if(!ruin.allow_duplicates)
ruins -= ruin.name ruins -= ruin.name
break break
if(!overall_sanity) if(!overall_sanity)
log_world("Ruin loader gave up with [budget] left to spend.") log_world("Ruin loader gave up with [budget] left to spend.")
/obj/effect/ruin_loader /obj/effect/ruin_loader
name = "random ruin" name = "random ruin"
icon = 'icons/obj/weapons.dmi' icon = 'icons/obj/weapons.dmi'
icon_state = "syndballoon" icon_state = "syndballoon"
invisibility = 0 invisibility = 0
/obj/effect/ruin_loader/proc/Load(list/potentialRuins, datum/map_template/template) /obj/effect/ruin_loader/proc/Load(list/potentialRuins, datum/map_template/template)
var/list/possible_ruins = list() var/list/possible_ruins = list()
for(var/A in potentialRuins) for(var/A in potentialRuins)
var/datum/map_template/T = potentialRuins[A] var/datum/map_template/T = potentialRuins[A]
if(!T.loaded) if(!T.loaded)
possible_ruins += T possible_ruins += T
if(!template && possible_ruins.len) if(!template && possible_ruins.len)
template = safepick(possible_ruins) template = safepick(possible_ruins)
if(!template) if(!template)
return FALSE return FALSE
var/turf/central_turf = get_turf(src) var/turf/central_turf = get_turf(src)
for(var/i in template.get_affected_turfs(central_turf, 1)) for(var/i in template.get_affected_turfs(central_turf, 1))
var/turf/T = i var/turf/T = i
for(var/mob/living/simple_animal/monster in T) for(var/mob/living/simple_animal/monster in T)
qdel(monster) qdel(monster)
for(var/obj/structure/flora/ash/plant in T) for(var/obj/structure/flora/ash/plant in T)
qdel(plant) qdel(plant)
template.load(central_turf,centered = TRUE) template.load(central_turf,centered = TRUE)
template.loaded++ template.loaded++
var/datum/map_template/ruin = template var/datum/map_template/ruin = template
if(istype(ruin)) if(istype(ruin))
new /obj/effect/landmark/ruin(central_turf, ruin) new /obj/effect/landmark/ruin(central_turf, ruin)
qdel(src) qdel(src)
return TRUE return TRUE

View File

@@ -24,10 +24,10 @@
loc = pick(GLOB.newplayer_start) loc = pick(GLOB.newplayer_start)
else else
loc = locate(1,1,1) loc = locate(1,1,1)
. = ..() . = ..()
/mob/dead/new_player/prepare_huds() /mob/dead/new_player/prepare_huds()
return return
/mob/dead/new_player/proc/new_player_panel() /mob/dead/new_player/proc/new_player_panel()
@@ -146,7 +146,7 @@
return 1 return 1
if(href_list["late_join"]) if(href_list["late_join"])
if(!SSticker || !SSticker.IsRoundInProgress()) if(!SSticker || !SSticker.IsRoundInProgress())
to_chat(usr, "<span class='danger'>The round is either not ready, or has already finished...</span>") to_chat(usr, "<span class='danger'>The round is either not ready, or has already finished...</span>")
return return
@@ -371,7 +371,6 @@
if(SHUTTLE_CALL) if(SHUTTLE_CALL)
if(SSshuttle.emergency.timeLeft(1) > initial(SSshuttle.emergencyCallTime)*0.5) if(SSshuttle.emergency.timeLeft(1) > initial(SSshuttle.emergencyCallTime)*0.5)
SSticker.mode.make_antag_chance(humanc) SSticker.mode.make_antag_chance(humanc)
handle_roundstart_items(character)
qdel(src) qdel(src)
/mob/dead/new_player/proc/AddEmploymentContract(mob/living/carbon/human/employee) /mob/dead/new_player/proc/AddEmploymentContract(mob/living/carbon/human/employee)

View File

@@ -354,8 +354,8 @@
dropItemToGround(I) dropItemToGround(I)
drop_all_held_items() drop_all_held_items()
/obj/item/proc/equip_to_best_slot(var/mob/M, override_held_check = FALSE) /obj/item/proc/equip_to_best_slot(var/mob/M)
if((src != M.get_active_held_item()) && !override_held_check) if(src != M.get_active_held_item())
to_chat(M, "<span class='warning'>You are not holding anything to equip!</span>") to_chat(M, "<span class='warning'>You are not holding anything to equip!</span>")
return FALSE return FALSE

View File

@@ -1,245 +1,245 @@
/mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = 0) /mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = 0)
return dna.species.can_equip(I, slot, disable_warning, src) return dna.species.can_equip(I, slot, disable_warning, src)
// Return the item currently in the slot ID // Return the item currently in the slot ID
/mob/living/carbon/human/get_item_by_slot(slot_id) /mob/living/carbon/human/get_item_by_slot(slot_id)
switch(slot_id) switch(slot_id)
if(slot_back) if(slot_back)
return back return back
if(slot_wear_mask) if(slot_wear_mask)
return wear_mask return wear_mask
if(slot_neck) if(slot_neck)
return wear_neck return wear_neck
if(slot_handcuffed) if(slot_handcuffed)
return handcuffed return handcuffed
if(slot_legcuffed) if(slot_legcuffed)
return legcuffed return legcuffed
if(slot_belt) if(slot_belt)
return belt return belt
if(slot_wear_id) if(slot_wear_id)
return wear_id return wear_id
if(slot_ears) if(slot_ears)
return ears return ears
if(slot_glasses) if(slot_glasses)
return glasses return glasses
if(slot_gloves) if(slot_gloves)
return gloves return gloves
if(slot_head) if(slot_head)
return head return head
if(slot_shoes) if(slot_shoes)
return shoes return shoes
if(slot_wear_suit) if(slot_wear_suit)
return wear_suit return wear_suit
if(slot_w_uniform) if(slot_w_uniform)
return w_uniform return w_uniform
if(slot_l_store) if(slot_l_store)
return l_store return l_store
if(slot_r_store) if(slot_r_store)
return r_store return r_store
if(slot_s_store) if(slot_s_store)
return s_store return s_store
return null return null
/mob/living/carbon/human/proc/get_all_slots() /mob/living/carbon/human/proc/get_all_slots()
. = get_head_slots() | get_body_slots() . = get_head_slots() | get_body_slots()
/mob/living/carbon/human/proc/get_body_slots() /mob/living/carbon/human/proc/get_body_slots()
return list( return list(
back, back,
s_store, s_store,
handcuffed, handcuffed,
legcuffed, legcuffed,
wear_suit, wear_suit,
gloves, gloves,
shoes, shoes,
belt, belt,
wear_id, wear_id,
l_store, l_store,
r_store, r_store,
w_uniform w_uniform
) )
/mob/living/carbon/human/proc/get_head_slots() /mob/living/carbon/human/proc/get_head_slots()
return list( return list(
head, head,
wear_mask, wear_mask,
glasses, glasses,
ears, ears,
) )
/mob/living/carbon/human/proc/get_storage_slots() /mob/living/carbon/human/proc/get_storage_slots()
return list( return list(
back, back,
belt, belt,
l_store, l_store,
r_store, r_store,
s_store, s_store,
) )
//This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible()
/mob/living/carbon/human/equip_to_slot(obj/item/I, slot) /mob/living/carbon/human/equip_to_slot(obj/item/I, slot)
if(!..()) //a check failed or the item has already found its slot if(!..()) //a check failed or the item has already found its slot
return return
var/not_handled = FALSE //Added in case we make this type path deeper one day var/not_handled = FALSE //Added in case we make this type path deeper one day
switch(slot) switch(slot)
if(slot_belt) if(slot_belt)
belt = I belt = I
update_inv_belt() update_inv_belt()
if(slot_wear_id) if(slot_wear_id)
wear_id = I wear_id = I
sec_hud_set_ID() sec_hud_set_ID()
update_inv_wear_id() update_inv_wear_id()
if(slot_ears) if(slot_ears)
ears = I ears = I
update_inv_ears() update_inv_ears()
if(slot_glasses) if(slot_glasses)
glasses = I glasses = I
var/obj/item/clothing/glasses/G = I var/obj/item/clothing/glasses/G = I
if(G.glass_colour_type) if(G.glass_colour_type)
update_glasses_color(G, 1) update_glasses_color(G, 1)
if(G.tint) if(G.tint)
update_tint() update_tint()
if(G.vision_correction) if(G.vision_correction)
clear_fullscreen("nearsighted") clear_fullscreen("nearsighted")
if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha))
update_sight() update_sight()
update_inv_glasses() update_inv_glasses()
if(slot_gloves) if(slot_gloves)
gloves = I gloves = I
update_inv_gloves() update_inv_gloves()
if(slot_shoes) if(slot_shoes)
shoes = I shoes = I
update_inv_shoes() update_inv_shoes()
if(slot_wear_suit) if(slot_wear_suit)
wear_suit = I wear_suit = I
if(I.flags_inv & HIDEJUMPSUIT) if(I.flags_inv & HIDEJUMPSUIT)
update_inv_w_uniform() update_inv_w_uniform()
if(wear_suit.breakouttime) //when equipping a straightjacket if(wear_suit.breakouttime) //when equipping a straightjacket
stop_pulling() //can't pull if restrained stop_pulling() //can't pull if restrained
update_action_buttons_icon() //certain action buttons will no longer be usable. update_action_buttons_icon() //certain action buttons will no longer be usable.
update_inv_wear_suit() update_inv_wear_suit()
if(slot_w_uniform) if(slot_w_uniform)
w_uniform = I w_uniform = I
update_suit_sensors() update_suit_sensors()
update_inv_w_uniform() update_inv_w_uniform()
if(slot_l_store) if(slot_l_store)
l_store = I l_store = I
update_inv_pockets() update_inv_pockets()
if(slot_r_store) if(slot_r_store)
r_store = I r_store = I
update_inv_pockets() update_inv_pockets()
if(slot_s_store) if(slot_s_store)
s_store = I s_store = I
update_inv_s_store() update_inv_s_store()
else else
to_chat(src, "<span class='danger'>You are trying to equip this item to an unsupported inventory slot. Report this to a coder!</span>") to_chat(src, "<span class='danger'>You are trying to equip this item to an unsupported inventory slot. Report this to a coder!</span>")
//Item is handled and in slot, valid to call callback, for this proc should always be true //Item is handled and in slot, valid to call callback, for this proc should always be true
if(!not_handled) if(!not_handled)
I.equipped(src, slot) I.equipped(src, slot)
return not_handled //For future deeper overrides return not_handled //For future deeper overrides
/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) /mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE)
var/index = get_held_index_of_item(I) var/index = get_held_index_of_item(I)
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should. . = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
if(!. || !I) if(!. || !I)
return return
if(index && dna.species.mutanthands) if(index && dna.species.mutanthands)
put_in_hand(new dna.species.mutanthands(), index) put_in_hand(new dna.species.mutanthands(), index)
if(I == wear_suit) if(I == wear_suit)
if(s_store && invdrop) if(s_store && invdrop)
dropItemToGround(s_store, TRUE) //It makes no sense for your suit storage to stay on you if you drop your suit. dropItemToGround(s_store, TRUE) //It makes no sense for your suit storage to stay on you if you drop your suit.
if(wear_suit.breakouttime) //when unequipping a straightjacket if(wear_suit.breakouttime) //when unequipping a straightjacket
update_action_buttons_icon() //certain action buttons may be usable again. update_action_buttons_icon() //certain action buttons may be usable again.
wear_suit = null wear_suit = null
if(I.flags_inv & HIDEJUMPSUIT) if(I.flags_inv & HIDEJUMPSUIT)
update_inv_w_uniform() update_inv_w_uniform()
update_inv_wear_suit() update_inv_wear_suit()
else if(I == w_uniform) else if(I == w_uniform)
if(invdrop) if(invdrop)
if(r_store) if(r_store)
dropItemToGround(r_store, TRUE) //Again, makes sense for pockets to drop. dropItemToGround(r_store, TRUE) //Again, makes sense for pockets to drop.
if(l_store) if(l_store)
dropItemToGround(l_store, TRUE) dropItemToGround(l_store, TRUE)
if(wear_id) if(wear_id)
dropItemToGround(wear_id) dropItemToGround(wear_id)
if(belt) if(belt)
dropItemToGround(belt) dropItemToGround(belt)
w_uniform = null w_uniform = null
update_suit_sensors() update_suit_sensors()
update_inv_w_uniform(invdrop) update_inv_w_uniform(invdrop)
else if(I == gloves) else if(I == gloves)
gloves = null gloves = null
update_inv_gloves() update_inv_gloves()
else if(I == glasses) else if(I == glasses)
glasses = null glasses = null
var/obj/item/clothing/glasses/G = I var/obj/item/clothing/glasses/G = I
if(G.glass_colour_type) if(G.glass_colour_type)
update_glasses_color(G, 0) update_glasses_color(G, 0)
if(G.tint) if(G.tint)
update_tint() update_tint()
if(G.vision_correction) if(G.vision_correction)
if(disabilities & NEARSIGHT) if(disabilities & NEARSIGHT)
overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha))
update_sight() update_sight()
update_inv_glasses() update_inv_glasses()
else if(I == ears) else if(I == ears)
ears = null ears = null
update_inv_ears() update_inv_ears()
else if(I == shoes) else if(I == shoes)
shoes = null shoes = null
update_inv_shoes() update_inv_shoes()
else if(I == belt) else if(I == belt)
belt = null belt = null
update_inv_belt() update_inv_belt()
else if(I == wear_id) else if(I == wear_id)
wear_id = null wear_id = null
sec_hud_set_ID() sec_hud_set_ID()
update_inv_wear_id() update_inv_wear_id()
else if(I == r_store) else if(I == r_store)
r_store = null r_store = null
update_inv_pockets() update_inv_pockets()
else if(I == l_store) else if(I == l_store)
l_store = null l_store = null
update_inv_pockets() update_inv_pockets()
else if(I == s_store) else if(I == s_store)
s_store = null s_store = null
update_inv_s_store() update_inv_s_store()
/mob/living/carbon/human/wear_mask_update(obj/item/clothing/C, toggle_off = 1) /mob/living/carbon/human/wear_mask_update(obj/item/clothing/C, toggle_off = 1)
if((C.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || (initial(C.flags_inv) & (HIDEHAIR|HIDEFACIALHAIR))) if((C.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || (initial(C.flags_inv) & (HIDEHAIR|HIDEFACIALHAIR)))
update_hair() update_hair()
if(toggle_off && internal && !getorganslot("breathing_tube")) if(toggle_off && internal && !getorganslot("breathing_tube"))
update_internals_hud_icon(0) update_internals_hud_icon(0)
internal = null internal = null
if(C.flags_inv & HIDEEYES) if(C.flags_inv & HIDEEYES)
update_inv_glasses() update_inv_glasses()
sec_hud_set_security_status() sec_hud_set_security_status()
..() ..()
/mob/living/carbon/human/head_update(obj/item/I, forced) /mob/living/carbon/human/head_update(obj/item/I, forced)
if((I.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || forced) if((I.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || forced)
update_hair() update_hair()
if(I.flags_inv & HIDEEYES || forced) if(I.flags_inv & HIDEEYES || forced)
update_inv_glasses() update_inv_glasses()
if(I.flags_inv & HIDEEARS || forced) if(I.flags_inv & HIDEEARS || forced)
update_body() update_body()
sec_hud_set_security_status() sec_hud_set_security_status()
..() ..()
/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE) /mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE)
var/datum/outfit/O = null var/datum/outfit/O = null
if(ispath(outfit)) if(ispath(outfit))
O = new outfit O = new outfit
else else
O = outfit O = outfit
if(!istype(O)) if(!istype(O))
return 0 return 0
if(!O) if(!O)
return 0 return 0
return O.equip(src, visualsOnly) return O.equip(src, visualsOnly)

File diff suppressed because it is too large Load Diff

View File

@@ -1,50 +1,50 @@
/datum/species/zombie /datum/species/zombie
// 1spooky // 1spooky
name = "High Functioning Zombie" name = "High Functioning Zombie"
id = "zombie" id = "zombie"
say_mod = "moans" say_mod = "moans"
sexes = 0 sexes = 0
blacklisted = 1 blacklisted = 1
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT) species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT)
mutant_organs = list(/obj/item/organ/tongue/zombie) mutant_organs = list(/obj/item/organ/tongue/zombie)
/datum/species/zombie/infectious /datum/species/zombie/infectious
name = "Infectious Zombie" name = "Infectious Zombie"
id = "memezombies" id = "memezombies"
limbs_id = "zombie" limbs_id = "zombie"
mutanthands = /obj/item/zombie_hand mutanthands = /obj/item/zombie_hand
no_equip = list(slot_wear_mask, slot_head) no_equip = list(slot_wear_mask, slot_head)
armor = 20 // 120 damage to KO a zombie, which kills it armor = 20 // 120 damage to KO a zombie, which kills it
speedmod = 2 speedmod = 2
mutanteyes = /obj/item/organ/eyes/night_vision/zombie mutanteyes = /obj/item/organ/eyes/night_vision/zombie
/datum/species/zombie/infectious/spec_life(mob/living/carbon/C) /datum/species/zombie/infectious/spec_life(mob/living/carbon/C)
. = ..() . = ..()
C.a_intent = INTENT_HARM // THE SUFFERING MUST FLOW C.a_intent = INTENT_HARM // THE SUFFERING MUST FLOW
if(C.InCritical()) if(C.InCritical())
C.death() C.death()
// Zombies only move around when not in crit, they instantly // Zombies only move around when not in crit, they instantly
// succumb otherwise, and will standup again soon // succumb otherwise, and will standup again soon
/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/C, datum/species/old_species) /datum/species/zombie/infectious/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..() . = ..()
// Deal with the source of this zombie corruption // Deal with the source of this zombie corruption
// Infection organ needs to be handled separately from mutant_organs // Infection organ needs to be handled separately from mutant_organs
// because it persists through species transitions // because it persists through species transitions
var/obj/item/organ/zombie_infection/infection var/obj/item/organ/zombie_infection/infection
infection = C.getorganslot("zombie_infection") infection = C.getorganslot("zombie_infection")
if(!infection) if(!infection)
infection = new() infection = new()
infection.Insert(C) infection.Insert(C)
// Your skin falls off // Your skin falls off
/datum/species/krokodil_addict /datum/species/krokodil_addict
name = "Human" name = "Human"
id = "goofzombies" id = "goofzombies"
limbs_id = "zombie" //They look like zombies limbs_id = "zombie" //They look like zombies
sexes = 0 sexes = 0
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
mutant_organs = list(/obj/item/organ/tongue/zombie) mutant_organs = list(/obj/item/organ/tongue/zombie)

View File

@@ -1,274 +1,274 @@
//Cat //Cat
/mob/living/simple_animal/pet/cat /mob/living/simple_animal/pet/cat
name = "cat" name = "cat"
desc = "Kitty!!" desc = "Kitty!!"
icon = 'icons/mob/pets.dmi' icon = 'icons/mob/pets.dmi'
icon_state = "cat2" icon_state = "cat2"
icon_living = "cat2" icon_living = "cat2"
icon_dead = "cat2_dead" icon_dead = "cat2_dead"
gender = MALE gender = MALE
speak = list("Meow!", "Esp!", "Purr!", "HSSSSS") speak = list("Meow!", "Esp!", "Purr!", "HSSSSS")
speak_emote = list("purrs", "meows") speak_emote = list("purrs", "meows")
emote_hear = list("meows", "mews") emote_hear = list("meows", "mews")
emote_see = list("shakes its head", "shivers") emote_see = list("shakes its head", "shivers")
speak_chance = 1 speak_chance = 1
turns_per_move = 5 turns_per_move = 5
see_in_dark = 6 see_in_dark = 6
ventcrawler = VENTCRAWLER_ALWAYS ventcrawler = VENTCRAWLER_ALWAYS
pass_flags = PASSTABLE pass_flags = PASSTABLE
mob_size = MOB_SIZE_SMALL mob_size = MOB_SIZE_SMALL
minbodytemp = 200 minbodytemp = 200
maxbodytemp = 400 maxbodytemp = 400
unsuitable_atmos_damage = 1 unsuitable_atmos_damage = 1
animal_species = /mob/living/simple_animal/pet/cat animal_species = /mob/living/simple_animal/pet/cat
childtype = list(/mob/living/simple_animal/pet/cat/kitten) childtype = list(/mob/living/simple_animal/pet/cat/kitten)
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 2) butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 2)
response_help = "pets" response_help = "pets"
response_disarm = "gently pushes aside" response_disarm = "gently pushes aside"
response_harm = "kicks" response_harm = "kicks"
var/turns_since_scan = 0 var/turns_since_scan = 0
var/mob/living/simple_animal/mouse/movement_target var/mob/living/simple_animal/mouse/movement_target
gold_core_spawnable = 2 gold_core_spawnable = 2
devourable = TRUE devourable = TRUE
/mob/living/simple_animal/pet/cat/Initialize() /mob/living/simple_animal/pet/cat/Initialize()
..() ..()
verbs += /mob/living/proc/lay_down verbs += /mob/living/proc/lay_down
/mob/living/simple_animal/pet/cat/update_canmove() /mob/living/simple_animal/pet/cat/update_canmove()
..() ..()
if(client) if(client)
if (resting) if (resting)
icon_state = "[icon_living]_rest" icon_state = "[icon_living]_rest"
else else
icon_state = "[icon_living]" icon_state = "[icon_living]"
/mob/living/simple_animal/pet/cat/space /mob/living/simple_animal/pet/cat/space
name = "space cat" name = "space cat"
desc = "It's a cat... in space!" desc = "It's a cat... in space!"
icon_state = "spacecat" icon_state = "spacecat"
icon_living = "spacecat" icon_living = "spacecat"
icon_dead = "spacecat_dead" icon_dead = "spacecat_dead"
unsuitable_atmos_damage = 0 unsuitable_atmos_damage = 0
minbodytemp = TCMB minbodytemp = TCMB
maxbodytemp = T0C + 40 maxbodytemp = T0C + 40
/mob/living/simple_animal/pet/cat/original /mob/living/simple_animal/pet/cat/original
name = "Batsy" name = "Batsy"
desc = "The product of alien DNA and bored geneticists." desc = "The product of alien DNA and bored geneticists."
gender = FEMALE gender = FEMALE
icon_state = "original" icon_state = "original"
icon_living = "original" icon_living = "original"
icon_dead = "original_dead" icon_dead = "original_dead"
/mob/living/simple_animal/pet/cat/kitten /mob/living/simple_animal/pet/cat/kitten
name = "kitten" name = "kitten"
desc = "D'aaawwww." desc = "D'aaawwww."
icon_state = "kitten" icon_state = "kitten"
icon_living = "kitten" icon_living = "kitten"
icon_dead = "kitten_dead" icon_dead = "kitten_dead"
density = 0 density = 0
pass_flags = PASSMOB pass_flags = PASSMOB
mob_size = MOB_SIZE_SMALL mob_size = MOB_SIZE_SMALL
//RUNTIME IS ALIVE! SQUEEEEEEEE~ //RUNTIME IS ALIVE! SQUEEEEEEEE~
/mob/living/simple_animal/pet/cat/Runtime /mob/living/simple_animal/pet/cat/Runtime
name = "Runtime" name = "Runtime"
desc = "GCAT" desc = "GCAT"
icon_state = "cat" icon_state = "cat"
icon_living = "cat" icon_living = "cat"
icon_dead = "cat_dead" icon_dead = "cat_dead"
gender = FEMALE gender = FEMALE
gold_core_spawnable = 0 gold_core_spawnable = 0
var/list/family = list()//var restored from savefile, has count of each child type var/list/family = list()//var restored from savefile, has count of each child type
var/list/children = list()//Actual mob instances of children var/list/children = list()//Actual mob instances of children
var/cats_deployed = 0 var/cats_deployed = 0
var/memory_saved = 0 var/memory_saved = 0
/mob/living/simple_animal/pet/cat/Runtime/Initialize() /mob/living/simple_animal/pet/cat/Runtime/Initialize()
if(prob(5)) if(prob(5))
icon_state = "original" icon_state = "original"
icon_living = "original" icon_living = "original"
icon_dead = "original_dead" icon_dead = "original_dead"
Read_Memory() Read_Memory()
..() ..()
/mob/living/simple_animal/pet/cat/Runtime/Life() /mob/living/simple_animal/pet/cat/Runtime/Life()
if(!cats_deployed && SSticker.current_state >= GAME_STATE_SETTING_UP) if(!cats_deployed && SSticker.current_state >= GAME_STATE_SETTING_UP)
Deploy_The_Cats() Deploy_The_Cats()
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory() Write_Memory()
..() ..()
/mob/living/simple_animal/pet/cat/Runtime/make_babies() /mob/living/simple_animal/pet/cat/Runtime/make_babies()
var/mob/baby = ..() var/mob/baby = ..()
if(baby) if(baby)
children += baby children += baby
return baby return baby
/mob/living/simple_animal/pet/cat/Runtime/death() /mob/living/simple_animal/pet/cat/Runtime/death()
if(!memory_saved) if(!memory_saved)
Write_Memory(1) Write_Memory(1)
..() ..()
/mob/living/simple_animal/pet/cat/Runtime/proc/Read_Memory() /mob/living/simple_animal/pet/cat/Runtime/proc/Read_Memory()
var/savefile/S = new /savefile("data/npc_saves/Runtime.sav") var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
S["family"] >> family S["family"] >> family
if(isnull(family)) if(isnull(family))
family = list() family = list()
/mob/living/simple_animal/pet/cat/Runtime/proc/Write_Memory(dead) /mob/living/simple_animal/pet/cat/Runtime/proc/Write_Memory(dead)
var/savefile/S = new /savefile("data/npc_saves/Runtime.sav") var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
family = list() family = list()
if(!dead) if(!dead)
for(var/mob/living/simple_animal/pet/cat/kitten/C in children) for(var/mob/living/simple_animal/pet/cat/kitten/C in children)
if(istype(C,type) || C.stat || !C.z || !C.butcher_results) //That last one is a work around for hologram cats if(istype(C,type) || C.stat || !C.z || !C.butcher_results) //That last one is a work around for hologram cats
continue continue
if(C.type in family) if(C.type in family)
family[C.type] += 1 family[C.type] += 1
else else
family[C.type] = 1 family[C.type] = 1
S["family"] << family S["family"] << family
memory_saved = 1 memory_saved = 1
/mob/living/simple_animal/pet/cat/Runtime/proc/Deploy_The_Cats() /mob/living/simple_animal/pet/cat/Runtime/proc/Deploy_The_Cats()
cats_deployed = 1 cats_deployed = 1
for(var/cat_type in family) for(var/cat_type in family)
if(family[cat_type] > 0) if(family[cat_type] > 0)
for(var/i in 1 to min(family[cat_type],100)) //Limits to about 500 cats, you wouldn't think this would be needed (BUT IT IS) for(var/i in 1 to min(family[cat_type],100)) //Limits to about 500 cats, you wouldn't think this would be needed (BUT IT IS)
new cat_type(loc) new cat_type(loc)
/mob/living/simple_animal/pet/cat/Proc /mob/living/simple_animal/pet/cat/Proc
name = "Proc" name = "Proc"
gender = MALE gender = MALE
gold_core_spawnable = 0 gold_core_spawnable = 0
/mob/living/simple_animal/pet/cat/Life() /mob/living/simple_animal/pet/cat/Life()
if(!stat && !buckled && !client) if(!stat && !buckled && !client)
if(prob(1)) if(prob(1))
emote("me", 1, pick("stretches out for a belly rub.", "wags its tail.", "lies down.")) emote("me", 1, pick("stretches out for a belly rub.", "wags its tail.", "lies down."))
icon_state = "[icon_living]_rest" icon_state = "[icon_living]_rest"
resting = 1 resting = 1
update_canmove() update_canmove()
else if (prob(1)) else if (prob(1))
emote("me", 1, pick("sits down.", "crouches on its hind legs.", "looks alert.")) emote("me", 1, pick("sits down.", "crouches on its hind legs.", "looks alert."))
icon_state = "[icon_living]_sit" icon_state = "[icon_living]_sit"
resting = 1 resting = 1
update_canmove() update_canmove()
else if (prob(1)) else if (prob(1))
if (resting) if (resting)
emote("me", 1, pick("gets up and meows.", "walks around.", "stops resting.")) emote("me", 1, pick("gets up and meows.", "walks around.", "stops resting."))
icon_state = "[icon_living]" icon_state = "[icon_living]"
resting = 0 resting = 0
update_canmove() update_canmove()
else else
emote("me", 1, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat.")) emote("me", 1, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat."))
//MICE! //MICE!
if((src.loc) && isturf(src.loc)) if((src.loc) && isturf(src.loc))
if(!stat && !resting && !buckled) if(!stat && !resting && !buckled)
for(var/mob/living/simple_animal/mouse/M in view(1,src)) for(var/mob/living/simple_animal/mouse/M in view(1,src))
if(!M.stat && Adjacent(M)) if(!M.stat && Adjacent(M))
emote("me", 1, "splats \the [M]!") emote("me", 1, "splats \the [M]!")
M.splat() M.splat()
movement_target = null movement_target = null
stop_automated_movement = 0 stop_automated_movement = 0
break break
for(var/obj/item/toy/cattoy/T in view(1,src)) for(var/obj/item/toy/cattoy/T in view(1,src))
if (T.cooldown < (world.time - 400)) if (T.cooldown < (world.time - 400))
emote("me", 1, "bats \the [T] around with its paw!") emote("me", 1, "bats \the [T] around with its paw!")
T.cooldown = world.time T.cooldown = world.time
..() ..()
make_babies() make_babies()
if(!stat && !resting && !buckled) if(!stat && !resting && !buckled)
turns_since_scan++ turns_since_scan++
if(turns_since_scan > 5) if(turns_since_scan > 5)
walk_to(src,0) walk_to(src,0)
turns_since_scan = 0 turns_since_scan = 0
if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) )) if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) ))
movement_target = null movement_target = null
stop_automated_movement = 0 stop_automated_movement = 0
if( !movement_target || !(movement_target.loc in oview(src, 3)) ) if( !movement_target || !(movement_target.loc in oview(src, 3)) )
movement_target = null movement_target = null
stop_automated_movement = 0 stop_automated_movement = 0
for(var/mob/living/simple_animal/mouse/snack in oview(src,3)) for(var/mob/living/simple_animal/mouse/snack in oview(src,3))
if(isturf(snack.loc) && !snack.stat) if(isturf(snack.loc) && !snack.stat)
movement_target = snack movement_target = snack
break break
if(movement_target) if(movement_target)
stop_automated_movement = 1 stop_automated_movement = 1
walk_to(src,movement_target,0,3) walk_to(src,movement_target,0,3)
/mob/living/simple_animal/pet/cat/attack_hand(mob/living/carbon/human/M) /mob/living/simple_animal/pet/cat/attack_hand(mob/living/carbon/human/M)
. = ..() . = ..()
switch(M.a_intent) switch(M.a_intent)
if("help") if("help")
wuv(1, M) wuv(1, M)
if("harm") if("harm")
wuv(-1, M) wuv(-1, M)
/mob/living/simple_animal/pet/cat/proc/wuv(change, mob/M) /mob/living/simple_animal/pet/cat/proc/wuv(change, mob/M)
if(change) if(change)
if(change > 0) if(change > 0)
if(M && stat != DEAD) if(M && stat != DEAD)
new /obj/effect/overlay/temp/heart(loc) new /obj/effect/overlay/temp/heart(loc)
emote("me", 1, "purrs!") emote("me", 1, "purrs!")
else else
if(M && stat != DEAD) if(M && stat != DEAD)
emote("me", 1, "hisses!") emote("me", 1, "hisses!")
/mob/living/simple_animal/pet/cat/cak //I told you I'd do it, Remie /mob/living/simple_animal/pet/cat/cak //I told you I'd do it, Remie
name = "Keeki" name = "Keeki"
desc = "It's a cat made out of cake." desc = "It's a cat made out of cake."
icon_state = "cak" icon_state = "cak"
icon_living = "cak" icon_living = "cak"
icon_dead = "cak_dead" icon_dead = "cak_dead"
health = 50 health = 50
maxHealth = 50 maxHealth = 50
gender = FEMALE gender = FEMALE
harm_intent_damage = 10 harm_intent_damage = 10
butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/weapon/reagent_containers/food/snacks/cakeslice/birthday = 3, \ butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/weapon/reagent_containers/food/snacks/cakeslice/birthday = 3, \
/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 2) /obj/item/weapon/reagent_containers/food/snacks/meat/slab = 2)
response_harm = "takes a bite out of" response_harm = "takes a bite out of"
attacked_sound = 'sound/items/eatfood.ogg' attacked_sound = 'sound/items/eatfood.ogg'
deathmessage = "loses its false life and collapses!" deathmessage = "loses its false life and collapses!"
death_sound = "bodyfall" death_sound = "bodyfall"
/mob/living/simple_animal/pet/cat/cak/CheckParts(list/parts) /mob/living/simple_animal/pet/cat/cak/CheckParts(list/parts)
..() ..()
var/obj/item/organ/brain/B = locate(/obj/item/organ/brain) in contents var/obj/item/organ/brain/B = locate(/obj/item/organ/brain) in contents
if(!B || !B.brainmob || !B.brainmob.mind) if(!B || !B.brainmob || !B.brainmob.mind)
return return
B.brainmob.mind.transfer_to(src) B.brainmob.mind.transfer_to(src)
to_chat(src, "<font size=3><b>Y</b></font><b>ou are a cak! You're a harmless cat/cake hybrid that everyone loves. People can take bites out of you if they're hungry, but you regenerate health \ to_chat(src, "<font size=3><b>Y</b></font><b>ou are a cak! You're a harmless cat/cake hybrid that everyone loves. People can take bites out of you if they're hungry, but you regenerate health \
so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \ so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \
free cake to the station!</b>") free cake to the station!</b>")
var/new_name = stripped_input(src, "Enter your name, or press \"Cancel\" to stick with Keeki.", "Name Change") var/new_name = stripped_input(src, "Enter your name, or press \"Cancel\" to stick with Keeki.", "Name Change")
if(new_name) if(new_name)
to_chat(src, "<span class='notice'>Your name is now <b>\"new_name\"</b>!</span>") to_chat(src, "<span class='notice'>Your name is now <b>\"new_name\"</b>!</span>")
name = new_name name = new_name
/mob/living/simple_animal/pet/cat/cak/Life() /mob/living/simple_animal/pet/cat/cak/Life()
..() ..()
if(stat) if(stat)
return return
if(health < maxHealth) if(health < maxHealth)
adjustBruteLoss(-8) //Fast life regen adjustBruteLoss(-8) //Fast life regen
for(var/obj/item/weapon/reagent_containers/food/snacks/donut/D in range(1, src)) //Frosts nearby donuts! for(var/obj/item/weapon/reagent_containers/food/snacks/donut/D in range(1, src)) //Frosts nearby donuts!
if(D.icon_state != "donut2") if(D.icon_state != "donut2")
D.name = "frosted donut" D.name = "frosted donut"
D.icon_state = "donut2" D.icon_state = "donut2"
D.reagents.add_reagent("sprinkles", 2) D.reagents.add_reagent("sprinkles", 2)
D.bonus_reagents = list("sprinkles" = 2, "sugar" = 1) D.bonus_reagents = list("sprinkles" = 2, "sugar" = 1)
D.filling_color = "#FF69B4" D.filling_color = "#FF69B4"
/mob/living/simple_animal/pet/cat/cak/attack_hand(mob/living/L) /mob/living/simple_animal/pet/cat/cak/attack_hand(mob/living/L)
..() ..()
if(L.a_intent == INTENT_HARM && L.reagents && !stat) if(L.a_intent == INTENT_HARM && L.reagents && !stat)
L.reagents.add_reagent("nutriment", 0.4) L.reagents.add_reagent("nutriment", 0.4)
L.reagents.add_reagent("vitamin", 0.4) L.reagents.add_reagent("vitamin", 0.4)

View File

@@ -1,122 +1,122 @@
/obj/item/weapon/clipboard /obj/item/weapon/clipboard
name = "clipboard" name = "clipboard"
icon = 'icons/obj/bureaucracy.dmi' icon = 'icons/obj/bureaucracy.dmi'
icon_state = "clipboard" icon_state = "clipboard"
item_state = "clipboard" item_state = "clipboard"
throwforce = 0 throwforce = 0
w_class = WEIGHT_CLASS_SMALL w_class = WEIGHT_CLASS_SMALL
throw_speed = 3 throw_speed = 3
throw_range = 7 throw_range = 7
var/obj/item/weapon/pen/haspen //The stored pen. var/obj/item/weapon/pen/haspen //The stored pen.
var/obj/item/weapon/paper/toppaper //The topmost piece of paper. var/obj/item/weapon/paper/toppaper //The topmost piece of paper.
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
resistance_flags = FLAMMABLE resistance_flags = FLAMMABLE
/obj/item/weapon/clipboard/Initialize() /obj/item/weapon/clipboard/Initialize()
update_icon() update_icon()
. = ..() . = ..()
/obj/item/weapon/clipboard/Destroy() /obj/item/weapon/clipboard/Destroy()
QDEL_NULL(haspen) QDEL_NULL(haspen)
QDEL_NULL(toppaper) //let movable/Destroy handle the rest QDEL_NULL(toppaper) //let movable/Destroy handle the rest
return ..() return ..()
/obj/item/weapon/clipboard/update_icon() /obj/item/weapon/clipboard/update_icon()
cut_overlays() cut_overlays()
if(toppaper) if(toppaper)
add_overlay(toppaper.icon_state) add_overlay(toppaper.icon_state)
copy_overlays(toppaper) copy_overlays(toppaper)
if(haspen) if(haspen)
add_overlay("clipboard_pen") add_overlay("clipboard_pen")
add_overlay("clipboard_over") add_overlay("clipboard_over")
/obj/item/weapon/clipboard/attackby(obj/item/weapon/W, mob/user, params) /obj/item/weapon/clipboard/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/paper)) if(istype(W, /obj/item/weapon/paper))
if(!user.transferItemToLoc(W, src)) if(!user.transferItemToLoc(W, src))
return return
toppaper = W toppaper = W
to_chat(user, "<span class='notice'>You clip the paper onto \the [src].</span>") to_chat(user, "<span class='notice'>You clip the paper onto \the [src].</span>")
update_icon() update_icon()
else if(toppaper) else if(toppaper)
toppaper.attackby(user.get_active_held_item(), user) toppaper.attackby(user.get_active_held_item(), user)
update_icon() update_icon()
/obj/item/weapon/clipboard/attack_self(mob/user) /obj/item/weapon/clipboard/attack_self(mob/user)
var/dat = "<title>Clipboard</title>" var/dat = "<title>Clipboard</title>"
if(haspen) if(haspen)
dat += "<A href='?src=\ref[src];pen=1'>Remove Pen</A><BR><HR>" dat += "<A href='?src=\ref[src];pen=1'>Remove Pen</A><BR><HR>"
else else
dat += "<A href='?src=\ref[src];addpen=1'>Add Pen</A><BR><HR>" dat += "<A href='?src=\ref[src];addpen=1'>Add Pen</A><BR><HR>"
//The topmost paper. You can't organise contents directly in byond, so this is what we're stuck with. -Pete //The topmost paper. You can't organise contents directly in byond, so this is what we're stuck with. -Pete
if(toppaper) if(toppaper)
var/obj/item/weapon/paper/P = toppaper var/obj/item/weapon/paper/P = toppaper
dat += "<A href='?src=\ref[src];write=\ref[P]'>Write</A> <A href='?src=\ref[src];remove=\ref[P]'>Remove</A> - <A href='?src=\ref[src];read=\ref[P]'>[P.name]</A><BR><HR>" dat += "<A href='?src=\ref[src];write=\ref[P]'>Write</A> <A href='?src=\ref[src];remove=\ref[P]'>Remove</A> - <A href='?src=\ref[src];read=\ref[P]'>[P.name]</A><BR><HR>"
for(P in src) for(P in src)
if(P == toppaper) if(P == toppaper)
continue continue
dat += "<A href='?src=\ref[src];write=\ref[P]'>Write</A> <A href='?src=\ref[src];remove=\ref[P]'>Remove</A> <A href='?src=\ref[src];top=\ref[P]'>Move to top</A> - <A href='?src=\ref[src];read=\ref[P]'>[P.name]</A><BR>" dat += "<A href='?src=\ref[src];write=\ref[P]'>Write</A> <A href='?src=\ref[src];remove=\ref[P]'>Remove</A> <A href='?src=\ref[src];top=\ref[P]'>Move to top</A> - <A href='?src=\ref[src];read=\ref[P]'>[P.name]</A><BR>"
user << browse(dat, "window=clipboard") user << browse(dat, "window=clipboard")
onclose(user, "clipboard") onclose(user, "clipboard")
add_fingerprint(usr) add_fingerprint(usr)
/obj/item/weapon/clipboard/Topic(href, href_list) /obj/item/weapon/clipboard/Topic(href, href_list)
..() ..()
if(usr.stat || usr.restrained()) if(usr.stat || usr.restrained())
return return
if(usr.contents.Find(src)) if(usr.contents.Find(src))
if(href_list["pen"]) if(href_list["pen"])
if(haspen) if(haspen)
haspen.loc = usr.loc haspen.loc = usr.loc
usr.put_in_hands(haspen) usr.put_in_hands(haspen)
haspen = null haspen = null
if(href_list["addpen"]) if(href_list["addpen"])
if(!haspen) if(!haspen)
var/obj/item/held = usr.get_active_held_item() var/obj/item/held = usr.get_active_held_item()
if(istype(held, /obj/item/weapon/pen)) if(istype(held, /obj/item/weapon/pen))
var/obj/item/weapon/pen/W = held var/obj/item/weapon/pen/W = held
if(!usr.transferItemToLoc(W, src)) if(!usr.transferItemToLoc(W, src))
return return
haspen = W haspen = W
to_chat(usr, "<span class='notice'>You slot [W] into [src].</span>") to_chat(usr, "<span class='notice'>You slot [W] into [src].</span>")
if(href_list["write"]) if(href_list["write"])
var/obj/item/P = locate(href_list["write"]) var/obj/item/P = locate(href_list["write"])
if(istype(P) && P.loc == src) if(istype(P) && P.loc == src)
if(usr.get_active_held_item()) if(usr.get_active_held_item())
P.attackby(usr.get_active_held_item(), usr) P.attackby(usr.get_active_held_item(), usr)
if(href_list["remove"]) if(href_list["remove"])
var/obj/item/P = locate(href_list["remove"]) var/obj/item/P = locate(href_list["remove"])
if(istype(P) && P.loc == src) if(istype(P) && P.loc == src)
P.loc = usr.loc P.loc = usr.loc
usr.put_in_hands(P) usr.put_in_hands(P)
if(P == toppaper) if(P == toppaper)
toppaper = null toppaper = null
var/obj/item/weapon/paper/newtop = locate(/obj/item/weapon/paper) in src var/obj/item/weapon/paper/newtop = locate(/obj/item/weapon/paper) in src
if(newtop && (newtop != P)) if(newtop && (newtop != P))
toppaper = newtop toppaper = newtop
else else
toppaper = null toppaper = null
if(href_list["read"]) if(href_list["read"])
var/obj/item/weapon/paper/P = locate(href_list["read"]) var/obj/item/weapon/paper/P = locate(href_list["read"])
if(istype(P) && P.loc == src) if(istype(P) && P.loc == src)
usr.examinate(P) usr.examinate(P)
if(href_list["top"]) if(href_list["top"])
var/obj/item/P = locate(href_list["top"]) var/obj/item/P = locate(href_list["top"])
if(istype(P) && P.loc == src) if(istype(P) && P.loc == src)
toppaper = P toppaper = P
to_chat(usr, "<span class='notice'>You move [P.name] to the top.</span>") to_chat(usr, "<span class='notice'>You move [P.name] to the top.</span>")
//Update everything //Update everything
attack_self(usr) attack_self(usr)
update_icon() update_icon()

View File

@@ -78,8 +78,8 @@
name = "folder- 'TOP SECRET'" name = "folder- 'TOP SECRET'"
desc = "A folder stamped \"Top Secret - Property of Nanotrasen Corporation. Unauthorized distribution is punishable by death.\"" desc = "A folder stamped \"Top Secret - Property of Nanotrasen Corporation. Unauthorized distribution is punishable by death.\""
/obj/item/weapon/folder/documents/Initialize() /obj/item/weapon/folder/documents/Initialize()
. = ..() . = ..()
new /obj/item/documents/nanotrasen(src) new /obj/item/documents/nanotrasen(src)
update_icon() update_icon()
@@ -91,20 +91,20 @@
/obj/item/weapon/folder/syndicate/red /obj/item/weapon/folder/syndicate/red
icon_state = "folder_sred" icon_state = "folder_sred"
/obj/item/weapon/folder/syndicate/red/Initialize() /obj/item/weapon/folder/syndicate/red/Initialize()
. = ..() . = ..()
new /obj/item/documents/syndicate/red(src) new /obj/item/documents/syndicate/red(src)
update_icon() update_icon()
/obj/item/weapon/folder/syndicate/blue /obj/item/weapon/folder/syndicate/blue
icon_state = "folder_sblue" icon_state = "folder_sblue"
/obj/item/weapon/folder/syndicate/blue/Initialize() /obj/item/weapon/folder/syndicate/blue/Initialize()
. = ..() . = ..()
new /obj/item/documents/syndicate/blue(src) new /obj/item/documents/syndicate/blue(src)
update_icon() update_icon()
/obj/item/weapon/folder/syndicate/mining/Initialize() /obj/item/weapon/folder/syndicate/mining/Initialize()
. = ..() . = ..()
new /obj/item/documents/syndicate/mining(src) new /obj/item/documents/syndicate/mining(src)
update_icon() update_icon()

View File

@@ -20,7 +20,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
/obj/machinery/gravity_generator /obj/machinery/gravity_generator
name = "gravitational generator" name = "gravitational generator"
desc = "A device which produces a graviton field when set up." desc = "A device which produces a graviton field when set up."
icon = 'icons/obj/machines/gravity_generator.dmi' icon = 'icons/obj/machines/gravity_generator.dmi'
anchored = 1 anchored = 1
density = 1 density = 1
@@ -304,17 +304,17 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
// Sound the alert if gravity was just enabled or disabled. // Sound the alert if gravity was just enabled or disabled.
var/alert = 0 var/alert = 0
var/area/A = get_area(src) var/area/A = get_area(src)
if(SSticker.IsRoundInProgress()) if(SSticker.IsRoundInProgress())
if(on) // If we turned on and the game is live. if(on) // If we turned on and the game is live.
if(gravity_in_level() == 0) if(gravity_in_level() == 0)
alert = 1 alert = 1
investigate_log("was brought online and is now producing gravity for this level.", "gravity") investigate_log("was brought online and is now producing gravity for this level.", "gravity")
message_admins("The gravity generator was brought online [A][ADMIN_COORDJMP(src)]") message_admins("The gravity generator was brought online [A][ADMIN_COORDJMP(src)]")
else else
if(gravity_in_level() == 1) if(gravity_in_level() == 1)
alert = 1 alert = 1
investigate_log("was brought offline and there is now no gravity for this level.", "gravity") investigate_log("was brought offline and there is now no gravity for this level.", "gravity")
message_admins("The gravity generator was brought offline with no backup generator. [A][ADMIN_COORDJMP(src)]") message_admins("The gravity generator was brought offline with no backup generator. [A][ADMIN_COORDJMP(src)]")
update_icon() update_icon()
update_list() update_list()

View File

@@ -1,493 +1,493 @@
/obj/machinery/power/emitter /obj/machinery/power/emitter
name = "Emitter" name = "Emitter"
desc = "A heavy duty industrial laser.\n<span class='notice'>Alt-click to rotate it clockwise.</span>" desc = "A heavy duty industrial laser.\n<span class='notice'>Alt-click to rotate it clockwise.</span>"
icon = 'icons/obj/singularity.dmi' icon = 'icons/obj/singularity.dmi'
icon_state = "emitter" icon_state = "emitter"
var/icon_state_on = "emitter_+a" var/icon_state_on = "emitter_+a"
anchored = 0 anchored = 0
density = 1 density = 1
req_access = list(GLOB.access_engine_equip) req_access = list(GLOB.access_engine_equip)
// The following 3 vars are mostly for the prototype // The following 3 vars are mostly for the prototype
var/manual = FALSE var/manual = FALSE
var/charge = 0 var/charge = 0
var/atom/target = null var/atom/target = null
use_power = 0 use_power = 0
idle_power_usage = 10 idle_power_usage = 10
active_power_usage = 300 active_power_usage = 300
var/active = 0 var/active = 0
var/powered = 0 var/powered = 0
var/fire_delay = 100 var/fire_delay = 100
var/maximum_fire_delay = 100 var/maximum_fire_delay = 100
var/minimum_fire_delay = 20 var/minimum_fire_delay = 20
var/last_shot = 0 var/last_shot = 0
var/shot_number = 0 var/shot_number = 0
var/state = 0 var/state = 0
var/locked = 0 var/locked = 0
var/projectile_type = /obj/item/projectile/beam/emitter var/projectile_type = /obj/item/projectile/beam/emitter
var/projectile_sound = 'sound/weapons/emitter.ogg' var/projectile_sound = 'sound/weapons/emitter.ogg'
var/datum/effect_system/spark_spread/sparks var/datum/effect_system/spark_spread/sparks
/obj/machinery/power/emitter/New() /obj/machinery/power/emitter/New()
..() ..()
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/emitter(null) var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/emitter(null)
B.apply_default_parts(src) B.apply_default_parts(src)
RefreshParts() RefreshParts()
wires = new /datum/wires/emitter(src) wires = new /datum/wires/emitter(src)
/obj/item/weapon/circuitboard/machine/emitter /obj/item/weapon/circuitboard/machine/emitter
name = "Emitter (Machine Board)" name = "Emitter (Machine Board)"
build_path = /obj/machinery/power/emitter build_path = /obj/machinery/power/emitter
origin_tech = "programming=3;powerstorage=4;engineering=4" origin_tech = "programming=3;powerstorage=4;engineering=4"
req_components = list( req_components = list(
/obj/item/weapon/stock_parts/micro_laser = 1, /obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/manipulator = 1) /obj/item/weapon/stock_parts/manipulator = 1)
/obj/machinery/power/emitter/RefreshParts() /obj/machinery/power/emitter/RefreshParts()
var/max_firedelay = 120 var/max_firedelay = 120
var/firedelay = 120 var/firedelay = 120
var/min_firedelay = 24 var/min_firedelay = 24
var/power_usage = 350 var/power_usage = 350
for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts) for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts)
max_firedelay -= 20 * L.rating max_firedelay -= 20 * L.rating
min_firedelay -= 4 * L.rating min_firedelay -= 4 * L.rating
firedelay -= 20 * L.rating firedelay -= 20 * L.rating
maximum_fire_delay = max_firedelay maximum_fire_delay = max_firedelay
minimum_fire_delay = min_firedelay minimum_fire_delay = min_firedelay
fire_delay = firedelay fire_delay = firedelay
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
power_usage -= 50 * M.rating power_usage -= 50 * M.rating
active_power_usage = power_usage active_power_usage = power_usage
/obj/machinery/power/emitter/verb/rotate() /obj/machinery/power/emitter/verb/rotate()
set name = "Rotate" set name = "Rotate"
set category = "Object" set category = "Object"
set src in oview(1) set src in oview(1)
if(usr.stat || !usr.canmove || usr.restrained()) if(usr.stat || !usr.canmove || usr.restrained())
return return
if (src.anchored) if (src.anchored)
to_chat(usr, "<span class='warning'>It is fastened to the floor!</span>") to_chat(usr, "<span class='warning'>It is fastened to the floor!</span>")
return 0 return 0
src.setDir(turn(src.dir, 270)) src.setDir(turn(src.dir, 270))
return 1 return 1
/obj/machinery/power/emitter/AltClick(mob/user) /obj/machinery/power/emitter/AltClick(mob/user)
..() ..()
if(user.incapacitated()) if(user.incapacitated())
to_chat(user, "<span class='warning'>You can't do that right now!</span>") to_chat(user, "<span class='warning'>You can't do that right now!</span>")
return return
if(!in_range(src, user)) if(!in_range(src, user))
return return
else else
rotate() rotate()
/obj/machinery/power/emitter/Initialize() /obj/machinery/power/emitter/Initialize()
. = ..() . = ..()
if(state == 2 && anchored) if(state == 2 && anchored)
connect_to_network() connect_to_network()
sparks = new sparks = new
sparks.attach(src) sparks.attach(src)
sparks.set_up(5, TRUE, src) sparks.set_up(5, TRUE, src)
/obj/machinery/power/emitter/Destroy() /obj/machinery/power/emitter/Destroy()
if(SSticker && SSticker.IsRoundInProgress()) if(SSticker && SSticker.IsRoundInProgress())
message_admins("Emitter deleted at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1) message_admins("Emitter deleted at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("Emitter deleted at ([x],[y],[z])") log_game("Emitter deleted at ([x],[y],[z])")
investigate_log("<font color='red'>deleted</font> at ([x],[y],[z]) at [get_area(src)]","singulo") investigate_log("<font color='red'>deleted</font> at ([x],[y],[z]) at [get_area(src)]","singulo")
QDEL_NULL(sparks) QDEL_NULL(sparks)
return ..() return ..()
/obj/machinery/power/emitter/update_icon() /obj/machinery/power/emitter/update_icon()
if (active && powernet && avail(active_power_usage)) if (active && powernet && avail(active_power_usage))
icon_state = icon_state_on icon_state = icon_state_on
else else
icon_state = initial(icon_state) icon_state = initial(icon_state)
/obj/machinery/power/emitter/attack_hand(mob/user) /obj/machinery/power/emitter/attack_hand(mob/user)
src.add_fingerprint(user) src.add_fingerprint(user)
if(state == 2) if(state == 2)
if(!powernet) if(!powernet)
to_chat(user, "<span class='warning'>The emitter isn't connected to a wire!</span>") to_chat(user, "<span class='warning'>The emitter isn't connected to a wire!</span>")
return 1 return 1
if(!src.locked) if(!src.locked)
if(src.active==1) if(src.active==1)
src.active = 0 src.active = 0
to_chat(user, "<span class='notice'>You turn off \the [src].</span>") to_chat(user, "<span class='notice'>You turn off \the [src].</span>")
message_admins("Emitter turned off by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1) message_admins("Emitter turned off by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1)
log_game("Emitter turned off by [key_name(user)] in [COORD(src)]") log_game("Emitter turned off by [key_name(user)] in [COORD(src)]")
investigate_log("turned <font color='red'>off</font> by [key_name(user)] at [get_area(src)]","singulo") investigate_log("turned <font color='red'>off</font> by [key_name(user)] at [get_area(src)]","singulo")
else else
src.active = 1 src.active = 1
to_chat(user, "<span class='notice'>You turn on \the [src].</span>") to_chat(user, "<span class='notice'>You turn on \the [src].</span>")
src.shot_number = 0 src.shot_number = 0
src.fire_delay = maximum_fire_delay src.fire_delay = maximum_fire_delay
investigate_log("turned <font color='green'>on</font> by [key_name(user)] at [get_area(src)]","singulo") investigate_log("turned <font color='green'>on</font> by [key_name(user)] at [get_area(src)]","singulo")
update_icon() update_icon()
else else
to_chat(user, "<span class='warning'>The controls are locked!</span>") to_chat(user, "<span class='warning'>The controls are locked!</span>")
else else
to_chat(user, "<span class='warning'>The [src] needs to be firmly secured to the floor first!</span>") to_chat(user, "<span class='warning'>The [src] needs to be firmly secured to the floor first!</span>")
return 1 return 1
/obj/machinery/power/emitter/attack_animal(mob/living/simple_animal/M) /obj/machinery/power/emitter/attack_animal(mob/living/simple_animal/M)
if(ismegafauna(M) && anchored) if(ismegafauna(M) && anchored)
state = 0 state = 0
anchored = FALSE anchored = FALSE
M.visible_message("<span class='warning'>[M] rips [src] free from its moorings!</span>") M.visible_message("<span class='warning'>[M] rips [src] free from its moorings!</span>")
else else
..() ..()
if(!anchored) if(!anchored)
step(src, get_dir(M, src)) step(src, get_dir(M, src))
/obj/machinery/power/emitter/emp_act(severity)//Emitters are hardened but still might have issues /obj/machinery/power/emitter/emp_act(severity)//Emitters are hardened but still might have issues
// add_load(1000) // add_load(1000)
/* if((severity == 1)&&prob(1)&&prob(1)) /* if((severity == 1)&&prob(1)&&prob(1))
if(src.active) if(src.active)
src.active = 0 src.active = 0
src.use_power = 1 */ src.use_power = 1 */
return 1 return 1
/obj/machinery/power/emitter/process() /obj/machinery/power/emitter/process()
if(stat & (BROKEN)) if(stat & (BROKEN))
return return
if(src.state != 2 || (!powernet && active_power_usage)) if(src.state != 2 || (!powernet && active_power_usage))
src.active = 0 src.active = 0
update_icon() update_icon()
return return
if(src.active == 1) if(src.active == 1)
if(!active_power_usage || avail(active_power_usage)) if(!active_power_usage || avail(active_power_usage))
add_load(active_power_usage) add_load(active_power_usage)
if(!powered) if(!powered)
powered = 1 powered = 1
update_icon() update_icon()
investigate_log("regained power and turned <font color='green'>on</font> at [get_area(src)]","singulo") investigate_log("regained power and turned <font color='green'>on</font> at [get_area(src)]","singulo")
else else
if(powered) if(powered)
powered = 0 powered = 0
update_icon() update_icon()
investigate_log("lost power and turned <font color='red'>off</font> at [get_area(src)]","singulo") investigate_log("lost power and turned <font color='red'>off</font> at [get_area(src)]","singulo")
log_game("Emitter lost power in ([x],[y],[z])") log_game("Emitter lost power in ([x],[y],[z])")
return return
if(charge <=80) if(charge <=80)
charge+=5 charge+=5
if(!check_delay() || manual == TRUE) if(!check_delay() || manual == TRUE)
return FALSE return FALSE
fire_beam(target) fire_beam(target)
/obj/machinery/power/emitter/proc/check_delay() /obj/machinery/power/emitter/proc/check_delay()
if((src.last_shot + src.fire_delay) <= world.time) if((src.last_shot + src.fire_delay) <= world.time)
return TRUE return TRUE
return FALSE return FALSE
/obj/machinery/power/emitter/proc/fire_beam_pulse() /obj/machinery/power/emitter/proc/fire_beam_pulse()
if(!check_delay()) if(!check_delay())
return FALSE return FALSE
if(state != 2) if(state != 2)
return FALSE return FALSE
if(avail(active_power_usage)) if(avail(active_power_usage))
add_load(active_power_usage) add_load(active_power_usage)
fire_beam() fire_beam()
/obj/machinery/power/emitter/proc/fire_beam(atom/targeted_atom, mob/user) /obj/machinery/power/emitter/proc/fire_beam(atom/targeted_atom, mob/user)
var/turf/targets_from = get_turf(src) var/turf/targets_from = get_turf(src)
if(targeted_atom && (targeted_atom == user || targeted_atom == targets_from || targeted_atom == src)) if(targeted_atom && (targeted_atom == user || targeted_atom == targets_from || targeted_atom == src))
return return
var/obj/item/projectile/P = new projectile_type(targets_from) var/obj/item/projectile/P = new projectile_type(targets_from)
playsound(src.loc, projectile_sound, 50, 1) playsound(src.loc, projectile_sound, 50, 1)
if(prob(35)) if(prob(35))
sparks.start() sparks.start()
switch(dir) switch(dir)
if(NORTH) if(NORTH)
P.yo = 20 P.yo = 20
P.xo = 0 P.xo = 0
if(NORTHEAST) if(NORTHEAST)
P.yo = 20 P.yo = 20
P.xo = 20 P.xo = 20
if(EAST) if(EAST)
P.yo = 0 P.yo = 0
P.xo = 20 P.xo = 20
if(SOUTHEAST) if(SOUTHEAST)
P.yo = -20 P.yo = -20
P.xo = 20 P.xo = 20
if(WEST) if(WEST)
P.yo = 0 P.yo = 0
P.xo = -20 P.xo = -20
if(SOUTHWEST) if(SOUTHWEST)
P.yo = -20 P.yo = -20
P.xo = -20 P.xo = -20
if(NORTHWEST) if(NORTHWEST)
P.yo = 20 P.yo = 20
P.xo = -20 P.xo = -20
else // Any other else // Any other
P.yo = -20 P.yo = -20
P.xo = 0 P.xo = 0
if(target) if(target)
P.yo = targeted_atom.y - targets_from.y P.yo = targeted_atom.y - targets_from.y
P.xo = targeted_atom.x - targets_from.x P.xo = targeted_atom.x - targets_from.x
P.current = targets_from P.current = targets_from
P.starting = targets_from P.starting = targets_from
P.firer = src P.firer = src
P.original = targeted_atom P.original = targeted_atom
if(!manual) if(!manual)
last_shot = world.time last_shot = world.time
if(shot_number < 3) if(shot_number < 3)
fire_delay = 20 fire_delay = 20
shot_number ++ shot_number ++
else else
fire_delay = rand(minimum_fire_delay,maximum_fire_delay) fire_delay = rand(minimum_fire_delay,maximum_fire_delay)
shot_number = 0 shot_number = 0
if(!target) if(!target)
P.setDir(src.dir) P.setDir(src.dir)
P.starting = loc P.starting = loc
else else
if(QDELETED(target)) if(QDELETED(target))
target = null target = null
P.fire() P.fire()
return P return P
/obj/machinery/power/emitter/can_be_unfasten_wrench(mob/user, silent) /obj/machinery/power/emitter/can_be_unfasten_wrench(mob/user, silent)
if(state == EM_WELDED) if(state == EM_WELDED)
if(!silent) if(!silent)
to_chat(user, "<span class='warning'>[src] is welded to the floor!</span>") to_chat(user, "<span class='warning'>[src] is welded to the floor!</span>")
return FAILED_UNFASTEN return FAILED_UNFASTEN
return ..() return ..()
/obj/machinery/power/emitter/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20) /obj/machinery/power/emitter/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20)
. = ..() . = ..()
if(. == SUCCESSFUL_UNFASTEN) if(. == SUCCESSFUL_UNFASTEN)
if(anchored) if(anchored)
state = EM_SECURED state = EM_SECURED
else else
state = EM_UNSECURED state = EM_UNSECURED
/obj/machinery/power/emitter/attackby(obj/item/W, mob/user, params) /obj/machinery/power/emitter/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench)) if(istype(W, /obj/item/weapon/wrench))
if(active) if(active)
to_chat(user, "<span class='warning'>Turn \the [src] off first!</span>") to_chat(user, "<span class='warning'>Turn \the [src] off first!</span>")
return return
default_unfasten_wrench(user, W, 0) default_unfasten_wrench(user, W, 0)
return return
if(istype(W, /obj/item/weapon/weldingtool)) if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W var/obj/item/weapon/weldingtool/WT = W
if(active) if(active)
to_chat(user, "Turn \the [src] off first.") to_chat(user, "Turn \the [src] off first.")
return return
switch(state) switch(state)
if(EM_UNSECURED) if(EM_UNSECURED)
to_chat(user, "<span class='warning'>The [src.name] needs to be wrenched to the floor!</span>") to_chat(user, "<span class='warning'>The [src.name] needs to be wrenched to the floor!</span>")
if(EM_SECURED) if(EM_SECURED)
if(WT.remove_fuel(0,user)) if(WT.remove_fuel(0,user))
playsound(loc, WT.usesound, 50, 1) playsound(loc, WT.usesound, 50, 1)
user.visible_message("[user.name] starts to weld the [name] to the floor.", \ user.visible_message("[user.name] starts to weld the [name] to the floor.", \
"<span class='notice'>You start to weld \the [src] to the floor...</span>", \ "<span class='notice'>You start to weld \the [src] to the floor...</span>", \
"<span class='italics'>You hear welding.</span>") "<span class='italics'>You hear welding.</span>")
if(do_after(user,20*W.toolspeed, target = src) && WT.isOn()) if(do_after(user,20*W.toolspeed, target = src) && WT.isOn())
state = EM_WELDED state = EM_WELDED
to_chat(user, "<span class='notice'>You weld \the [src] to the floor.</span>") to_chat(user, "<span class='notice'>You weld \the [src] to the floor.</span>")
connect_to_network() connect_to_network()
if(EM_WELDED) if(EM_WELDED)
if(WT.remove_fuel(0,user)) if(WT.remove_fuel(0,user))
playsound(loc, WT.usesound, 50, 1) playsound(loc, WT.usesound, 50, 1)
user.visible_message("[user.name] starts to cut the [name] free from the floor.", \ user.visible_message("[user.name] starts to cut the [name] free from the floor.", \
"<span class='notice'>You start to cut \the [src] free from the floor...</span>", \ "<span class='notice'>You start to cut \the [src] free from the floor...</span>", \
"<span class='italics'>You hear welding.</span>") "<span class='italics'>You hear welding.</span>")
if(do_after(user,20*W.toolspeed, target = src) && WT.isOn()) if(do_after(user,20*W.toolspeed, target = src) && WT.isOn())
state = EM_SECURED state = EM_SECURED
to_chat(user, "<span class='notice'>You cut \the [src] free from the floor.</span>") to_chat(user, "<span class='notice'>You cut \the [src] free from the floor.</span>")
disconnect_from_network() disconnect_from_network()
return return
if(W.GetID()) if(W.GetID())
if(emagged) if(emagged)
to_chat(user, "<span class='warning'>The lock seems to be broken!</span>") to_chat(user, "<span class='warning'>The lock seems to be broken!</span>")
return return
if(allowed(user)) if(allowed(user))
if(active) if(active)
locked = !locked locked = !locked
to_chat(user, "<span class='notice'>You [src.locked ? "lock" : "unlock"] the controls.</span>") to_chat(user, "<span class='notice'>You [src.locked ? "lock" : "unlock"] the controls.</span>")
else else
to_chat(user, "<span class='warning'>The controls can only be locked when \the [src] is online!</span>") to_chat(user, "<span class='warning'>The controls can only be locked when \the [src] is online!</span>")
else else
to_chat(user, "<span class='danger'>Access denied.</span>") to_chat(user, "<span class='danger'>Access denied.</span>")
return return
if(is_wire_tool(W) && panel_open) if(is_wire_tool(W) && panel_open)
wires.interact(user) wires.interact(user)
return return
if(default_deconstruction_screwdriver(user, "emitter_open", "emitter", W)) if(default_deconstruction_screwdriver(user, "emitter_open", "emitter", W))
return return
if(exchange_parts(user, W)) if(exchange_parts(user, W))
return return
if(default_pry_open(W)) if(default_pry_open(W))
return return
if(default_deconstruction_crowbar(W)) if(default_deconstruction_crowbar(W))
return return
return ..() return ..()
/obj/machinery/power/emitter/emag_act(mob/user) /obj/machinery/power/emitter/emag_act(mob/user)
if(!emagged) if(!emagged)
locked = 0 locked = 0
emagged = 1 emagged = 1
if(user) if(user)
user.visible_message("[user.name] emags the [src.name].","<span class='notice'>You short out the lock.</span>") user.visible_message("[user.name] emags the [src.name].","<span class='notice'>You short out the lock.</span>")
/obj/machinery/power/emitter/prototype /obj/machinery/power/emitter/prototype
name = "Prototype Emitter" name = "Prototype Emitter"
icon = 'icons/obj/turrets.dmi' icon = 'icons/obj/turrets.dmi'
icon_state = "protoemitter" icon_state = "protoemitter"
icon_state_on = "protoemitter_+a" icon_state_on = "protoemitter_+a"
can_buckle = TRUE can_buckle = TRUE
buckle_lying = 0 buckle_lying = 0
var/view_range = 12 var/view_range = 12
var/datum/action/innate/protoemitter/firing/auto var/datum/action/innate/protoemitter/firing/auto
//BUCKLE HOOKS //BUCKLE HOOKS
/obj/machinery/power/emitter/prototype/unbuckle_mob(mob/living/buckled_mob,force = 0) /obj/machinery/power/emitter/prototype/unbuckle_mob(mob/living/buckled_mob,force = 0)
playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) playsound(src,'sound/mecha/mechmove01.ogg', 50, 1)
manual = FALSE manual = FALSE
for(var/obj/item/I in buckled_mob.held_items) for(var/obj/item/I in buckled_mob.held_items)
if(istype(I, /obj/item/weapon/turret_control)) if(istype(I, /obj/item/weapon/turret_control))
qdel(I) qdel(I)
if(istype(buckled_mob)) if(istype(buckled_mob))
buckled_mob.pixel_x = 0 buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 0 buckled_mob.pixel_y = 0
if(buckled_mob.client) if(buckled_mob.client)
buckled_mob.client.change_view(world.view) buckled_mob.client.change_view(world.view)
auto.Remove(buckled_mob) auto.Remove(buckled_mob)
. = ..() . = ..()
/obj/machinery/power/emitter/prototype/user_buckle_mob(mob/living/M, mob/living/carbon/user) /obj/machinery/power/emitter/prototype/user_buckle_mob(mob/living/M, mob/living/carbon/user)
if(user.incapacitated() || !istype(user)) if(user.incapacitated() || !istype(user))
return return
for(var/atom/movable/A in get_turf(src)) for(var/atom/movable/A in get_turf(src))
if(A.density && (A != src && A != M)) if(A.density && (A != src && A != M))
return return
M.forceMove(get_turf(src)) M.forceMove(get_turf(src))
..() ..()
playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) playsound(src,'sound/mecha/mechmove01.ogg', 50, 1)
M.pixel_y = 14 M.pixel_y = 14
layer = 4.1 layer = 4.1
if(M.client) if(M.client)
M.client.change_view(view_range) M.client.change_view(view_range)
if(!auto) if(!auto)
auto = new() auto = new()
auto.Grant(M, src) auto.Grant(M, src)
/datum/action/innate/protoemitter /datum/action/innate/protoemitter
check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_CONSCIOUS check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_CONSCIOUS
var/obj/machinery/power/emitter/prototype/PE var/obj/machinery/power/emitter/prototype/PE
var/mob/living/carbon/U var/mob/living/carbon/U
/datum/action/innate/protoemitter/Grant(mob/living/carbon/L, obj/machinery/power/emitter/prototype/proto) /datum/action/innate/protoemitter/Grant(mob/living/carbon/L, obj/machinery/power/emitter/prototype/proto)
PE = proto PE = proto
U = L U = L
. = ..() . = ..()
/datum/action/innate/protoemitter/firing /datum/action/innate/protoemitter/firing
name = "Switch to Manual Firing" name = "Switch to Manual Firing"
desc = "The emitter will only fire on your command and at your designated target" desc = "The emitter will only fire on your command and at your designated target"
button_icon_state = "mech_zoom_on" button_icon_state = "mech_zoom_on"
/datum/action/innate/protoemitter/firing/Activate() /datum/action/innate/protoemitter/firing/Activate()
if(PE.manual) if(PE.manual)
playsound(PE,'sound/mecha/mechmove01.ogg', 50, 1) playsound(PE,'sound/mecha/mechmove01.ogg', 50, 1)
PE.manual = FALSE PE.manual = FALSE
name = "Switch to Manual Firing" name = "Switch to Manual Firing"
desc = "The emitter will only fire on your command and at your designated target" desc = "The emitter will only fire on your command and at your designated target"
button_icon_state = "mech_zoom_on" button_icon_state = "mech_zoom_on"
for(var/obj/item/I in U.held_items) for(var/obj/item/I in U.held_items)
if(istype(I, /obj/item/weapon/turret_control)) if(istype(I, /obj/item/weapon/turret_control))
qdel(I) qdel(I)
UpdateButtonIcon() UpdateButtonIcon()
return return
else else
playsound(PE,'sound/mecha/mechmove01.ogg', 50, 1) playsound(PE,'sound/mecha/mechmove01.ogg', 50, 1)
name = "Switch to Automatic Firing" name = "Switch to Automatic Firing"
desc = "Emitters will switch to periodic firing at your last target" desc = "Emitters will switch to periodic firing at your last target"
button_icon_state = "mech_zoom_off" button_icon_state = "mech_zoom_off"
PE.manual = TRUE PE.manual = TRUE
for(var/V in U.held_items) for(var/V in U.held_items)
var/obj/item/I = V var/obj/item/I = V
if(istype(I)) if(istype(I))
if(U.dropItemToGround(I)) if(U.dropItemToGround(I))
var/obj/item/weapon/turret_control/TC = new /obj/item/weapon/turret_control() var/obj/item/weapon/turret_control/TC = new /obj/item/weapon/turret_control()
U.put_in_hands(TC) U.put_in_hands(TC)
else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
var/obj/item/weapon/turret_control/TC = new /obj/item/weapon/turret_control() var/obj/item/weapon/turret_control/TC = new /obj/item/weapon/turret_control()
U.put_in_hands(TC) U.put_in_hands(TC)
UpdateButtonIcon() UpdateButtonIcon()
/obj/item/weapon/turret_control /obj/item/weapon/turret_control
name = "turret controls" name = "turret controls"
icon_state = "offhand" icon_state = "offhand"
w_class = WEIGHT_CLASS_HUGE w_class = WEIGHT_CLASS_HUGE
flags = ABSTRACT | NODROP flags = ABSTRACT | NODROP
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | NOBLUDGEON resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | NOBLUDGEON
var/delay = 0 var/delay = 0
/obj/item/weapon/turret_control/afterattack(atom/targeted_atom, mob/user) /obj/item/weapon/turret_control/afterattack(atom/targeted_atom, mob/user)
..() ..()
var/obj/machinery/power/emitter/E = user.buckled var/obj/machinery/power/emitter/E = user.buckled
E.setDir(get_dir(E,targeted_atom)) E.setDir(get_dir(E,targeted_atom))
user.setDir(E.dir) user.setDir(E.dir)
switch(E.dir) switch(E.dir)
if(NORTH) if(NORTH)
E.layer = 3.9 E.layer = 3.9
user.pixel_x = 0 user.pixel_x = 0
user.pixel_y = -14 user.pixel_y = -14
if(NORTHEAST) if(NORTHEAST)
E.layer = 3.9 E.layer = 3.9
user.pixel_x = -8 user.pixel_x = -8
user.pixel_y = -12 user.pixel_y = -12
if(EAST) if(EAST)
E.layer = 4.1 E.layer = 4.1
user.pixel_x = -14 user.pixel_x = -14
user.pixel_y = 0 user.pixel_y = 0
if(SOUTHEAST) if(SOUTHEAST)
E.layer = 3.9 E.layer = 3.9
user.pixel_x = -8 user.pixel_x = -8
user.pixel_y = 12 user.pixel_y = 12
if(SOUTH) if(SOUTH)
E.layer = 4.1 E.layer = 4.1
user.pixel_x = 0 user.pixel_x = 0
user.pixel_y = 14 user.pixel_y = 14
if(SOUTHWEST) if(SOUTHWEST)
E.layer = 3.9 E.layer = 3.9
user.pixel_x = 8 user.pixel_x = 8
user.pixel_y = 12 user.pixel_y = 12
if(WEST) if(WEST)
E.layer = 4.1 E.layer = 4.1
user.pixel_x = 14 user.pixel_x = 14
user.pixel_y = 0 user.pixel_y = 0
if(NORTHWEST) if(NORTHWEST)
E.layer = 3.9 E.layer = 3.9
user.pixel_x = 8 user.pixel_x = 8
user.pixel_y = -12 user.pixel_y = -12
if(E.charge >= 10 && world.time > delay) if(E.charge >= 10 && world.time > delay)
E.charge -= 10 E.charge -= 10
E.target = targeted_atom E.target = targeted_atom
E.fire_beam(targeted_atom, user) E.fire_beam(targeted_atom, user)
delay = world.time + 10 delay = world.time + 10
else if (E.charge < 10) else if (E.charge < 10)
playsound(get_turf(user),'sound/machines/buzz-sigh.ogg', 50, 1) playsound(get_turf(user),'sound/machines/buzz-sigh.ogg', 50, 1)

View File

@@ -1,328 +1,328 @@
/obj/machinery/particle_accelerator/control_box /obj/machinery/particle_accelerator/control_box
name = "Particle Accelerator Control Console" name = "Particle Accelerator Control Console"
desc = "This controls the density of the particles." desc = "This controls the density of the particles."
icon = 'icons/obj/machines/particle_accelerator.dmi' icon = 'icons/obj/machines/particle_accelerator.dmi'
icon_state = "control_box" icon_state = "control_box"
anchored = 0 anchored = 0
density = 1 density = 1
use_power = 0 use_power = 0
idle_power_usage = 500 idle_power_usage = 500
active_power_usage = 10000 active_power_usage = 10000
dir = NORTH dir = NORTH
var/strength_upper_limit = 2 var/strength_upper_limit = 2
var/interface_control = 1 var/interface_control = 1
var/list/obj/structure/particle_accelerator/connected_parts var/list/obj/structure/particle_accelerator/connected_parts
var/assembled = 0 var/assembled = 0
var/construction_state = PA_CONSTRUCTION_UNSECURED var/construction_state = PA_CONSTRUCTION_UNSECURED
var/active = 0 var/active = 0
var/strength = 0 var/strength = 0
var/powered = 0 var/powered = 0
mouse_opacity = 2 mouse_opacity = 2
/obj/machinery/particle_accelerator/control_box/New() /obj/machinery/particle_accelerator/control_box/New()
wires = new /datum/wires/particle_accelerator/control_box(src) wires = new /datum/wires/particle_accelerator/control_box(src)
connected_parts = list() connected_parts = list()
..() ..()
/obj/machinery/particle_accelerator/control_box/Destroy() /obj/machinery/particle_accelerator/control_box/Destroy()
if(active) if(active)
toggle_power() toggle_power()
for(var/CP in connected_parts) for(var/CP in connected_parts)
var/obj/structure/particle_accelerator/part = CP var/obj/structure/particle_accelerator/part = CP
part.master = null part.master = null
connected_parts.Cut() connected_parts.Cut()
qdel(wires) qdel(wires)
wires = null wires = null
return ..() return ..()
/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user) /obj/machinery/particle_accelerator/control_box/attack_hand(mob/user)
if(construction_state == PA_CONSTRUCTION_COMPLETE) if(construction_state == PA_CONSTRUCTION_COMPLETE)
interact(user) interact(user)
else if(construction_state == PA_CONSTRUCTION_PANEL_OPEN) else if(construction_state == PA_CONSTRUCTION_PANEL_OPEN)
wires.interact(user) wires.interact(user)
/obj/machinery/particle_accelerator/control_box/proc/update_state() /obj/machinery/particle_accelerator/control_box/proc/update_state()
if(construction_state < PA_CONSTRUCTION_COMPLETE) if(construction_state < PA_CONSTRUCTION_COMPLETE)
use_power = 0 use_power = 0
assembled = 0 assembled = 0
active = 0 active = 0
for(var/CP in connected_parts) for(var/CP in connected_parts)
var/obj/structure/particle_accelerator/part = CP var/obj/structure/particle_accelerator/part = CP
part.strength = null part.strength = null
part.powered = 0 part.powered = 0
part.update_icon() part.update_icon()
connected_parts.Cut() connected_parts.Cut()
return return
if(!part_scan()) if(!part_scan())
use_power = 1 use_power = 1
active = 0 active = 0
connected_parts.Cut() connected_parts.Cut()
/obj/machinery/particle_accelerator/control_box/update_icon() /obj/machinery/particle_accelerator/control_box/update_icon()
if(active) if(active)
icon_state = "control_boxp1" icon_state = "control_boxp1"
else else
if(use_power) if(use_power)
if(assembled) if(assembled)
icon_state = "control_boxp" icon_state = "control_boxp"
else else
icon_state = "ucontrol_boxp" icon_state = "ucontrol_boxp"
else else
switch(construction_state) switch(construction_state)
if(PA_CONSTRUCTION_UNSECURED, PA_CONSTRUCTION_UNWIRED) if(PA_CONSTRUCTION_UNSECURED, PA_CONSTRUCTION_UNWIRED)
icon_state = "control_box" icon_state = "control_box"
if(PA_CONSTRUCTION_PANEL_OPEN) if(PA_CONSTRUCTION_PANEL_OPEN)
icon_state = "control_boxw" icon_state = "control_boxw"
else else
icon_state = "control_boxc" icon_state = "control_boxc"
/obj/machinery/particle_accelerator/control_box/Topic(href, href_list) /obj/machinery/particle_accelerator/control_box/Topic(href, href_list)
if(..()) if(..())
return return
if(!interface_control) if(!interface_control)
to_chat(usr, "<span class='error'>ERROR: Request timed out. Check wire contacts.</span>") to_chat(usr, "<span class='error'>ERROR: Request timed out. Check wire contacts.</span>")
return return
if(href_list["close"]) if(href_list["close"])
usr << browse(null, "window=pacontrol") usr << browse(null, "window=pacontrol")
usr.unset_machine() usr.unset_machine()
return return
if(href_list["togglep"]) if(href_list["togglep"])
if(!wires.is_cut(WIRE_POWER)) if(!wires.is_cut(WIRE_POWER))
toggle_power() toggle_power()
else if(href_list["scan"]) else if(href_list["scan"])
part_scan() part_scan()
else if(href_list["strengthup"]) else if(href_list["strengthup"])
if(!wires.is_cut(WIRE_STRENGTH)) if(!wires.is_cut(WIRE_STRENGTH))
add_strength() add_strength()
else if(href_list["strengthdown"]) else if(href_list["strengthdown"])
if(!wires.is_cut(WIRE_STRENGTH)) if(!wires.is_cut(WIRE_STRENGTH))
remove_strength() remove_strength()
updateDialog() updateDialog()
update_icon() update_icon()
/obj/machinery/particle_accelerator/control_box/proc/strength_change() /obj/machinery/particle_accelerator/control_box/proc/strength_change()
for(var/CP in connected_parts) for(var/CP in connected_parts)
var/obj/structure/particle_accelerator/part = CP var/obj/structure/particle_accelerator/part = CP
part.strength = strength part.strength = strength
part.update_icon() part.update_icon()
/obj/machinery/particle_accelerator/control_box/proc/add_strength(s) /obj/machinery/particle_accelerator/control_box/proc/add_strength(s)
if(assembled && (strength < strength_upper_limit)) if(assembled && (strength < strength_upper_limit))
strength++ strength++
strength_change() strength_change()
message_admins("PA Control Computer increased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1) message_admins("PA Control Computer increased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1)
log_game("PA Control Computer increased to [strength] by [key_name(usr)] in [COORD(src)]") log_game("PA Control Computer increased to [strength] by [key_name(usr)] in [COORD(src)]")
investigate_log("increased to <font color='red'>[strength]</font> by [key_name(usr)]","singulo") investigate_log("increased to <font color='red'>[strength]</font> by [key_name(usr)]","singulo")
/obj/machinery/particle_accelerator/control_box/proc/remove_strength(s) /obj/machinery/particle_accelerator/control_box/proc/remove_strength(s)
if(assembled && (strength > 0)) if(assembled && (strength > 0))
strength-- strength--
strength_change() strength_change()
message_admins("PA Control Computer decreased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1) message_admins("PA Control Computer decreased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1)
log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in [COORD(src)]") log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in [COORD(src)]")
investigate_log("decreased to <font color='green'>[strength]</font> by [key_name(usr)]","singulo") investigate_log("decreased to <font color='green'>[strength]</font> by [key_name(usr)]","singulo")
/obj/machinery/particle_accelerator/control_box/power_change() /obj/machinery/particle_accelerator/control_box/power_change()
..() ..()
if(stat & NOPOWER) if(stat & NOPOWER)
active = 0 active = 0
use_power = 0 use_power = 0
else if(!stat && construction_state == PA_CONSTRUCTION_COMPLETE) else if(!stat && construction_state == PA_CONSTRUCTION_COMPLETE)
use_power = 1 use_power = 1
/obj/machinery/particle_accelerator/control_box/process() /obj/machinery/particle_accelerator/control_box/process()
if(active) if(active)
//a part is missing! //a part is missing!
if(connected_parts.len < 6) if(connected_parts.len < 6)
investigate_log("lost a connected part; It <font color='red'>powered down</font>.","singulo") investigate_log("lost a connected part; It <font color='red'>powered down</font>.","singulo")
toggle_power() toggle_power()
update_icon() update_icon()
return return
//emit some particles //emit some particles
for(var/obj/structure/particle_accelerator/particle_emitter/PE in connected_parts) for(var/obj/structure/particle_accelerator/particle_emitter/PE in connected_parts)
PE.emit_particle(strength) PE.emit_particle(strength)
/obj/machinery/particle_accelerator/control_box/proc/part_scan() /obj/machinery/particle_accelerator/control_box/proc/part_scan()
var/ldir = turn(dir,-90) var/ldir = turn(dir,-90)
var/rdir = turn(dir,90) var/rdir = turn(dir,90)
var/odir = turn(dir,180) var/odir = turn(dir,180)
var/turf/T = loc var/turf/T = loc
assembled = 0 assembled = 0
critical_machine = FALSE critical_machine = FALSE
var/obj/structure/particle_accelerator/fuel_chamber/F = locate() in orange(1,src) var/obj/structure/particle_accelerator/fuel_chamber/F = locate() in orange(1,src)
if(!F) if(!F)
return 0 return 0
setDir(F.dir) setDir(F.dir)
connected_parts.Cut() connected_parts.Cut()
T = get_step(T,rdir) T = get_step(T,rdir)
if(!check_part(T,/obj/structure/particle_accelerator/fuel_chamber)) if(!check_part(T,/obj/structure/particle_accelerator/fuel_chamber))
return 0 return 0
T = get_step(T,odir) T = get_step(T,odir)
if(!check_part(T,/obj/structure/particle_accelerator/end_cap)) if(!check_part(T,/obj/structure/particle_accelerator/end_cap))
return 0 return 0
T = get_step(T,dir) T = get_step(T,dir)
T = get_step(T,dir) T = get_step(T,dir)
if(!check_part(T,/obj/structure/particle_accelerator/power_box)) if(!check_part(T,/obj/structure/particle_accelerator/power_box))
return 0 return 0
T = get_step(T,dir) T = get_step(T,dir)
if(!check_part(T,/obj/structure/particle_accelerator/particle_emitter/center)) if(!check_part(T,/obj/structure/particle_accelerator/particle_emitter/center))
return 0 return 0
T = get_step(T,ldir) T = get_step(T,ldir)
if(!check_part(T,/obj/structure/particle_accelerator/particle_emitter/left)) if(!check_part(T,/obj/structure/particle_accelerator/particle_emitter/left))
return 0 return 0
T = get_step(T,rdir) T = get_step(T,rdir)
T = get_step(T,rdir) T = get_step(T,rdir)
if(!check_part(T,/obj/structure/particle_accelerator/particle_emitter/right)) if(!check_part(T,/obj/structure/particle_accelerator/particle_emitter/right))
return 0 return 0
assembled = 1 assembled = 1
critical_machine = TRUE //Only counts if the PA is actually assembled. critical_machine = TRUE //Only counts if the PA is actually assembled.
return 1 return 1
/obj/machinery/particle_accelerator/control_box/proc/check_part(turf/T, type) /obj/machinery/particle_accelerator/control_box/proc/check_part(turf/T, type)
var/obj/structure/particle_accelerator/PA = locate(/obj/structure/particle_accelerator) in T var/obj/structure/particle_accelerator/PA = locate(/obj/structure/particle_accelerator) in T
if(istype(PA, type) && (PA.construction_state == PA_CONSTRUCTION_COMPLETE)) if(istype(PA, type) && (PA.construction_state == PA_CONSTRUCTION_COMPLETE))
if(PA.connect_master(src)) if(PA.connect_master(src))
connected_parts.Add(PA) connected_parts.Add(PA)
return 1 return 1
return 0 return 0
/obj/machinery/particle_accelerator/control_box/proc/toggle_power() /obj/machinery/particle_accelerator/control_box/proc/toggle_power()
active = !active active = !active
investigate_log("turned [active?"<font color='green'>ON</font>":"<font color='red'>OFF</font>"] by [usr ? key_name(usr) : "outside forces"]","singulo") investigate_log("turned [active?"<font color='green'>ON</font>":"<font color='red'>OFF</font>"] by [usr ? key_name(usr) : "outside forces"]","singulo")
message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name_admin(usr) : "outside forces"](<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1) message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name_admin(usr) : "outside forces"](<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? "[key_name(usr)]" : "outside forces"] in ([x],[y],[z])") log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? "[key_name(usr)]" : "outside forces"] in ([x],[y],[z])")
if(active) if(active)
use_power = 2 use_power = 2
for(var/CP in connected_parts) for(var/CP in connected_parts)
var/obj/structure/particle_accelerator/part = CP var/obj/structure/particle_accelerator/part = CP
part.strength = strength part.strength = strength
part.powered = 1 part.powered = 1
part.update_icon() part.update_icon()
else else
use_power = 1 use_power = 1
for(var/CP in connected_parts) for(var/CP in connected_parts)
var/obj/structure/particle_accelerator/part = CP var/obj/structure/particle_accelerator/part = CP
part.strength = null part.strength = null
part.powered = 0 part.powered = 0
part.update_icon() part.update_icon()
return 1 return 1
/obj/machinery/particle_accelerator/control_box/interact(mob/user) /obj/machinery/particle_accelerator/control_box/interact(mob/user)
if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER))) if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER)))
if(!issilicon(user)) if(!issilicon(user))
user.unset_machine() user.unset_machine()
user << browse(null, "window=pacontrol") user << browse(null, "window=pacontrol")
return return
user.set_machine(src) user.set_machine(src)
var/dat = "" var/dat = ""
dat += "<A href='?src=\ref[src];close=1'>Close</A><BR><BR>" dat += "<A href='?src=\ref[src];close=1'>Close</A><BR><BR>"
dat += "<h3>Status</h3>" dat += "<h3>Status</h3>"
if(!assembled) if(!assembled)
dat += "Unable to detect all parts!<BR>" dat += "Unable to detect all parts!<BR>"
dat += "<A href='?src=\ref[src];scan=1'>Run Scan</A><BR><BR>" dat += "<A href='?src=\ref[src];scan=1'>Run Scan</A><BR><BR>"
else else
dat += "All parts in place.<BR><BR>" dat += "All parts in place.<BR><BR>"
dat += "Power:" dat += "Power:"
if(active) if(active)
dat += "On<BR>" dat += "On<BR>"
else else
dat += "Off <BR>" dat += "Off <BR>"
dat += "<A href='?src=\ref[src];togglep=1'>Toggle Power</A><BR><BR>" dat += "<A href='?src=\ref[src];togglep=1'>Toggle Power</A><BR><BR>"
dat += "Particle Strength: [strength] " dat += "Particle Strength: [strength] "
dat += "<A href='?src=\ref[src];strengthdown=1'>--</A>|<A href='?src=\ref[src];strengthup=1'>++</A><BR><BR>" dat += "<A href='?src=\ref[src];strengthdown=1'>--</A>|<A href='?src=\ref[src];strengthup=1'>++</A><BR><BR>"
var/datum/browser/popup = new(user, "pacontrol", name, 420, 300) var/datum/browser/popup = new(user, "pacontrol", name, 420, 300)
popup.set_content(dat) popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
popup.open() popup.open()
/obj/machinery/particle_accelerator/control_box/examine(mob/user) /obj/machinery/particle_accelerator/control_box/examine(mob/user)
..() ..()
switch(construction_state) switch(construction_state)
if(PA_CONSTRUCTION_UNSECURED) if(PA_CONSTRUCTION_UNSECURED)
to_chat(user, "Looks like it's not attached to the flooring") to_chat(user, "Looks like it's not attached to the flooring")
if(PA_CONSTRUCTION_UNWIRED) if(PA_CONSTRUCTION_UNWIRED)
to_chat(user, "It is missing some cables") to_chat(user, "It is missing some cables")
if(PA_CONSTRUCTION_PANEL_OPEN) if(PA_CONSTRUCTION_PANEL_OPEN)
to_chat(user, "The panel is open") to_chat(user, "The panel is open")
/obj/machinery/particle_accelerator/control_box/attackby(obj/item/W, mob/user, params) /obj/machinery/particle_accelerator/control_box/attackby(obj/item/W, mob/user, params)
var/did_something = FALSE var/did_something = FALSE
switch(construction_state) switch(construction_state)
if(PA_CONSTRUCTION_UNSECURED) if(PA_CONSTRUCTION_UNSECURED)
if(istype(W, /obj/item/weapon/wrench) && !isinspace()) if(istype(W, /obj/item/weapon/wrench) && !isinspace())
playsound(loc, W.usesound, 75, 1) playsound(loc, W.usesound, 75, 1)
anchored = 1 anchored = 1
user.visible_message("[user.name] secures the [name] to the floor.", \ user.visible_message("[user.name] secures the [name] to the floor.", \
"You secure the external bolts.") "You secure the external bolts.")
construction_state = PA_CONSTRUCTION_UNWIRED construction_state = PA_CONSTRUCTION_UNWIRED
did_something = TRUE did_something = TRUE
if(PA_CONSTRUCTION_UNWIRED) if(PA_CONSTRUCTION_UNWIRED)
if(istype(W, /obj/item/weapon/wrench)) if(istype(W, /obj/item/weapon/wrench))
playsound(loc, W.usesound, 75, 1) playsound(loc, W.usesound, 75, 1)
anchored = 0 anchored = 0
user.visible_message("[user.name] detaches the [name] from the floor.", \ user.visible_message("[user.name] detaches the [name] from the floor.", \
"You remove the external bolts.") "You remove the external bolts.")
construction_state = PA_CONSTRUCTION_UNSECURED construction_state = PA_CONSTRUCTION_UNSECURED
did_something = TRUE did_something = TRUE
else if(istype(W, /obj/item/stack/cable_coil)) else if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CC = W var/obj/item/stack/cable_coil/CC = W
if(CC.use(1)) if(CC.use(1))
user.visible_message("[user.name] adds wires to the [name].", \ user.visible_message("[user.name] adds wires to the [name].", \
"You add some wires.") "You add some wires.")
construction_state = PA_CONSTRUCTION_PANEL_OPEN construction_state = PA_CONSTRUCTION_PANEL_OPEN
did_something = TRUE did_something = TRUE
if(PA_CONSTRUCTION_PANEL_OPEN) if(PA_CONSTRUCTION_PANEL_OPEN)
if(istype(W, /obj/item/weapon/wirecutters))//TODO:Shock user if its on? if(istype(W, /obj/item/weapon/wirecutters))//TODO:Shock user if its on?
user.visible_message("[user.name] removes some wires from the [name].", \ user.visible_message("[user.name] removes some wires from the [name].", \
"You remove some wires.") "You remove some wires.")
construction_state = PA_CONSTRUCTION_UNWIRED construction_state = PA_CONSTRUCTION_UNWIRED
did_something = TRUE did_something = TRUE
else if(istype(W, /obj/item/weapon/screwdriver)) else if(istype(W, /obj/item/weapon/screwdriver))
user.visible_message("[user.name] closes the [name]'s access panel.", \ user.visible_message("[user.name] closes the [name]'s access panel.", \
"You close the access panel.") "You close the access panel.")
construction_state = PA_CONSTRUCTION_COMPLETE construction_state = PA_CONSTRUCTION_COMPLETE
did_something = TRUE did_something = TRUE
if(PA_CONSTRUCTION_COMPLETE) if(PA_CONSTRUCTION_COMPLETE)
if(istype(W, /obj/item/weapon/screwdriver)) if(istype(W, /obj/item/weapon/screwdriver))
user.visible_message("[user.name] opens the [name]'s access panel.", \ user.visible_message("[user.name] opens the [name]'s access panel.", \
"You open the access panel.") "You open the access panel.")
construction_state = PA_CONSTRUCTION_PANEL_OPEN construction_state = PA_CONSTRUCTION_PANEL_OPEN
did_something = TRUE did_something = TRUE
if(did_something) if(did_something)
user.changeNext_move(CLICK_CD_MELEE) user.changeNext_move(CLICK_CD_MELEE)
update_state() update_state()
update_icon() update_icon()
return return
..() ..()
/obj/machinery/particle_accelerator/control_box/blob_act(obj/structure/blob/B) /obj/machinery/particle_accelerator/control_box/blob_act(obj/structure/blob/B)
if(prob(50)) if(prob(50))
qdel(src) qdel(src)
#undef PA_CONSTRUCTION_UNSECURED #undef PA_CONSTRUCTION_UNSECURED
#undef PA_CONSTRUCTION_UNWIRED #undef PA_CONSTRUCTION_UNWIRED
#undef PA_CONSTRUCTION_PANEL_OPEN #undef PA_CONSTRUCTION_PANEL_OPEN
#undef PA_CONSTRUCTION_COMPLETE #undef PA_CONSTRUCTION_COMPLETE

View File

@@ -9,6 +9,7 @@
firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy
/obj/item/ammo_casing/energy/chameleon /obj/item/ammo_casing/energy/chameleon
projectile_type = /obj/item/projectile/energy/chameleon
e_cost = 0 e_cost = 0
var/list/projectile_vars = list() var/list/projectile_vars = list()

View File

@@ -190,7 +190,7 @@
name = "dart" name = "dart"
icon_state = "cbbolt" icon_state = "cbbolt"
damage = 6 damage = 6
var/piercing = FALSE var/piercing = FALSE
/obj/item/projectile/bullet/dart/New() /obj/item/projectile/bullet/dart/New()
..() ..()
@@ -201,15 +201,15 @@
if(iscarbon(target)) if(iscarbon(target))
var/mob/living/carbon/M = target var/mob/living/carbon/M = target
if(blocked != 100) // not completely blocked if(blocked != 100) // not completely blocked
if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body. if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
..() ..()
reagents.reaction(M, INJECT) reagents.reaction(M, INJECT)
reagents.trans_to(M, reagents.total_volume) reagents.trans_to(M, reagents.total_volume)
return TRUE return TRUE
else else
blocked = 100 blocked = 100
target.visible_message("<span class='danger'>\The [src] was deflected!</span>", \ target.visible_message("<span class='danger'>\The [src] was deflected!</span>", \
"<span class='userdanger'>You were protected against \the [src]!</span>") "<span class='userdanger'>You were protected against \the [src]!</span>")
..(target, blocked) ..(target, blocked)
reagents.set_reacting(TRUE) reagents.set_reacting(TRUE)
@@ -240,28 +240,28 @@
nodamage = 1 nodamage = 1
. = ..() // Execute the rest of the code. . = ..() // Execute the rest of the code.
/obj/item/projectile/bullet/dnainjector /obj/item/projectile/bullet/dnainjector
name = "\improper DNA injector" name = "\improper DNA injector"
icon_state = "syringeproj" icon_state = "syringeproj"
var/obj/item/weapon/dnainjector/injector var/obj/item/weapon/dnainjector/injector
/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = 0) /obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = 0)
if(iscarbon(target)) if(iscarbon(target))
var/mob/living/carbon/M = target var/mob/living/carbon/M = target
if(blocked != 100) if(blocked != 100)
if(M.can_inject(null, FALSE, def_zone, FALSE)) if(M.can_inject(null, FALSE, def_zone, FALSE))
if(injector.inject(M, firer)) if(injector.inject(M, firer))
QDEL_NULL(injector) QDEL_NULL(injector)
return TRUE return TRUE
else else
blocked = 100 blocked = 100
target.visible_message("<span class='danger'>\The [src] was deflected!</span>", \ target.visible_message("<span class='danger'>\The [src] was deflected!</span>", \
"<span class='userdanger'>You were protected against \the [src]!</span>") "<span class='userdanger'>You were protected against \the [src]!</span>")
return ..() return ..()
/obj/item/projectile/bullet/dnainjector/Destroy() /obj/item/projectile/bullet/dnainjector/Destroy()
QDEL_NULL(injector) QDEL_NULL(injector)
return ..() return ..()
//// SNIPER BULLETS //// SNIPER BULLETS

View File

@@ -5,6 +5,8 @@
damage_type = BURN damage_type = BURN
flag = "energy" flag = "energy"
/obj/item/projectile/energy/chameleon
nodamage = TRUE
/obj/item/projectile/energy/electrode /obj/item/projectile/energy/electrode
name = "electrode" name = "electrode"

View File

0
code/modules/reagents/reagent_containers/glass.dm Executable file → Normal file
View File

View File

@@ -1,239 +1,239 @@
/obj/item/weapon/reagent_containers/spray /obj/item/weapon/reagent_containers/spray
name = "spray bottle" name = "spray bottle"
desc = "A spray bottle, with an unscrewable top." desc = "A spray bottle, with an unscrewable top."
icon = 'icons/obj/janitor.dmi' icon = 'icons/obj/janitor.dmi'
icon_state = "cleaner" icon_state = "cleaner"
item_state = "cleaner" item_state = "cleaner"
flags = NOBLUDGEON flags = NOBLUDGEON
container_type = OPENCONTAINER container_type = OPENCONTAINER
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
throwforce = 0 throwforce = 0
w_class = WEIGHT_CLASS_SMALL w_class = WEIGHT_CLASS_SMALL
throw_speed = 3 throw_speed = 3
throw_range = 7 throw_range = 7
var/stream_mode = 0 //whether we use the more focused mode var/stream_mode = 0 //whether we use the more focused mode
var/current_range = 3 //the range of tiles the sprayer will reach. var/current_range = 3 //the range of tiles the sprayer will reach.
var/spray_range = 3 //the range of tiles the sprayer will reach when in spray mode. var/spray_range = 3 //the range of tiles the sprayer will reach when in spray mode.
var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode. var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode.
var/stream_amount = 10 //the amount of reagents transfered when in stream mode. var/stream_amount = 10 //the amount of reagents transfered when in stream mode.
amount_per_transfer_from_this = 5 amount_per_transfer_from_this = 5
volume = 250 volume = 250
possible_transfer_amounts = list(5,10,15,20,25,30,50,100) possible_transfer_amounts = list(5,10,15,20,25,30,50,100)
/obj/item/weapon/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user) /obj/item/weapon/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user)
if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics)) if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics))
return return
if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution
if(!A.reagents.total_volume && A.reagents) if(!A.reagents.total_volume && A.reagents)
to_chat(user, "<span class='notice'>\The [A] is empty.</span>") to_chat(user, "<span class='notice'>\The [A] is empty.</span>")
return return
if(reagents.total_volume >= reagents.maximum_volume) if(reagents.total_volume >= reagents.maximum_volume)
to_chat(user, "<span class='notice'>\The [src] is full.</span>") to_chat(user, "<span class='notice'>\The [src] is full.</span>")
return return
var/trans = A.reagents.trans_to(src, 50) //transfer 50u , using the spray's transfer amount would take too long to refill var/trans = A.reagents.trans_to(src, 50) //transfer 50u , using the spray's transfer amount would take too long to refill
to_chat(user, "<span class='notice'>You fill \the [src] with [trans] units of the contents of \the [A].</span>") to_chat(user, "<span class='notice'>You fill \the [src] with [trans] units of the contents of \the [A].</span>")
return return
if(reagents.total_volume < amount_per_transfer_from_this) if(reagents.total_volume < amount_per_transfer_from_this)
to_chat(user, "<span class='warning'>\The [src] is empty!</span>") to_chat(user, "<span class='warning'>\The [src] is empty!</span>")
return return
spray(A) spray(A)
playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6) playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
user.changeNext_move(CLICK_CD_RANGE*2) user.changeNext_move(CLICK_CD_RANGE*2)
user.newtonian_move(get_dir(A, user)) user.newtonian_move(get_dir(A, user))
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
var/area/area = get_area(src) var/area/area = get_area(src)
if(reagents.has_reagent("sacid")) if(reagents.has_reagent("sacid"))
message_admins("[ADMIN_LOOKUPFLW(user)] fired sulphuric acid from \a [src] at [area] [ADMIN_COORDJMP(T)].") message_admins("[ADMIN_LOOKUPFLW(user)] fired sulphuric acid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
log_game("[key_name(user)] fired sulphuric acid from \a [src] at [area] ([T.x], [T.y], [T.z]).") log_game("[key_name(user)] fired sulphuric acid from \a [src] at [area] ([T.x], [T.y], [T.z]).")
if(reagents.has_reagent("facid")) if(reagents.has_reagent("facid"))
message_admins("[ADMIN_LOOKUPFLW(user)] fired Fluacid from \a [src] at [area] [ADMIN_COORDJMP(T)].") message_admins("[ADMIN_LOOKUPFLW(user)] fired Fluacid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
log_game("[key_name(user)] fired Fluacid from \a [src] at [area] [COORD(T)].") log_game("[key_name(user)] fired Fluacid from \a [src] at [area] [COORD(T)].")
if(reagents.has_reagent("lube")) if(reagents.has_reagent("lube"))
message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [area] [ADMIN_COORDJMP(T)].") message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [area] [ADMIN_COORDJMP(T)].")
log_game("[key_name(user)] fired Space lube from \a [src] at [area] [COORD(T)].") log_game("[key_name(user)] fired Space lube from \a [src] at [area] [COORD(T)].")
return return
/obj/item/weapon/reagent_containers/spray/proc/spray(atom/A) /obj/item/weapon/reagent_containers/spray/proc/spray(atom/A)
var/range = max(min(current_range, get_dist(src, A)), 1) var/range = max(min(current_range, get_dist(src, A)), 1)
var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src)) var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
D.create_reagents(amount_per_transfer_from_this) D.create_reagents(amount_per_transfer_from_this)
var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed
if(stream_mode) if(stream_mode)
reagents.trans_to(D, amount_per_transfer_from_this) reagents.trans_to(D, amount_per_transfer_from_this)
puff_reagent_left = 1 puff_reagent_left = 1
else else
reagents.trans_to(D, amount_per_transfer_from_this, 1/range) reagents.trans_to(D, amount_per_transfer_from_this, 1/range)
D.color = mix_color_from_reagents(D.reagents.reagent_list) D.color = mix_color_from_reagents(D.reagents.reagent_list)
var/wait_step = max(round(2+3/range), 2) var/wait_step = max(round(2+3/range), 2)
spawn(0) spawn(0)
var/range_left = range var/range_left = range
for(var/i=0, i<range, i++) for(var/i=0, i<range, i++)
range_left-- range_left--
step_towards(D,A) step_towards(D,A)
sleep(wait_step) sleep(wait_step)
for(var/atom/T in get_turf(D)) for(var/atom/T in get_turf(D))
if(T == D || T.invisibility) //we ignore the puff itself and stuff below the floor if(T == D || T.invisibility) //we ignore the puff itself and stuff below the floor
continue continue
if(puff_reagent_left <= 0) if(puff_reagent_left <= 0)
break break
if(stream_mode) if(stream_mode)
if(ismob(T)) if(ismob(T))
var/mob/M = T var/mob/M = T
if(!M.lying || !range_left) if(!M.lying || !range_left)
D.reagents.reaction(M, VAPOR) D.reagents.reaction(M, VAPOR)
puff_reagent_left -= 1 puff_reagent_left -= 1
else if(!range_left) else if(!range_left)
D.reagents.reaction(T, VAPOR) D.reagents.reaction(T, VAPOR)
else else
D.reagents.reaction(T, VAPOR) D.reagents.reaction(T, VAPOR)
if(ismob(T)) if(ismob(T))
puff_reagent_left -= 1 puff_reagent_left -= 1
if(puff_reagent_left > 0 && (!stream_mode || !range_left)) if(puff_reagent_left > 0 && (!stream_mode || !range_left))
D.reagents.reaction(get_turf(D), VAPOR) D.reagents.reaction(get_turf(D), VAPOR)
puff_reagent_left -= 1 puff_reagent_left -= 1
if(puff_reagent_left <= 0) // we used all the puff so we delete it. if(puff_reagent_left <= 0) // we used all the puff so we delete it.
qdel(D) qdel(D)
return return
qdel(D) qdel(D)
/obj/item/weapon/reagent_containers/spray/attack_self(mob/user) /obj/item/weapon/reagent_containers/spray/attack_self(mob/user)
stream_mode = !stream_mode stream_mode = !stream_mode
if(stream_mode) if(stream_mode)
amount_per_transfer_from_this = stream_amount amount_per_transfer_from_this = stream_amount
current_range = stream_range current_range = stream_range
else else
amount_per_transfer_from_this = initial(amount_per_transfer_from_this) amount_per_transfer_from_this = initial(amount_per_transfer_from_this)
current_range = spray_range current_range = spray_range
to_chat(user, "<span class='notice'>You switch the nozzle setting to [stream_mode ? "\"stream\"":"\"spray\""]. You'll now use [amount_per_transfer_from_this] units per use.</span>") to_chat(user, "<span class='notice'>You switch the nozzle setting to [stream_mode ? "\"stream\"":"\"spray\""]. You'll now use [amount_per_transfer_from_this] units per use.</span>")
/obj/item/weapon/reagent_containers/spray/verb/empty() /obj/item/weapon/reagent_containers/spray/verb/empty()
set name = "Empty Spray Bottle" set name = "Empty Spray Bottle"
set category = "Object" set category = "Object"
set src in usr set src in usr
if(usr.incapacitated()) if(usr.incapacitated())
return return
if (alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes") if (alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes")
return return
if(isturf(usr.loc) && src.loc == usr) if(isturf(usr.loc) && src.loc == usr)
to_chat(usr, "<span class='notice'>You empty \the [src] onto the floor.</span>") to_chat(usr, "<span class='notice'>You empty \the [src] onto the floor.</span>")
reagents.reaction(usr.loc) reagents.reaction(usr.loc)
src.reagents.clear_reagents() src.reagents.clear_reagents()
//space cleaner //space cleaner
/obj/item/weapon/reagent_containers/spray/cleaner /obj/item/weapon/reagent_containers/spray/cleaner
name = "space cleaner" name = "space cleaner"
desc = "BLAM!-brand non-foaming space cleaner!" desc = "BLAM!-brand non-foaming space cleaner!"
list_reagents = list("cleaner" = 250) list_reagents = list("cleaner" = 250)
//spray tan //spray tan
/obj/item/weapon/reagent_containers/spray/spraytan /obj/item/weapon/reagent_containers/spray/spraytan
name = "spray tan" name = "spray tan"
volume = 50 volume = 50
desc = "Gyaro brand spray tan. Do not spray near eyes or other orifices." desc = "Gyaro brand spray tan. Do not spray near eyes or other orifices."
list_reagents = list("spraytan" = 50) list_reagents = list("spraytan" = 50)
/obj/item/weapon/reagent_containers/spray/medical /obj/item/weapon/reagent_containers/spray/medical
name = "medical spray" name = "medical spray"
icon = 'icons/obj/chemical.dmi' icon = 'icons/obj/chemical.dmi'
icon_state = "medspray" icon_state = "medspray"
volume = 100 volume = 100
/obj/item/weapon/reagent_containers/spray/medical/sterilizer /obj/item/weapon/reagent_containers/spray/medical/sterilizer
name = "sterilizer spray" name = "sterilizer spray"
desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery." desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery."
list_reagents = list("sterilizine" = 100) list_reagents = list("sterilizine" = 100)
//pepperspray //pepperspray
/obj/item/weapon/reagent_containers/spray/pepper /obj/item/weapon/reagent_containers/spray/pepper
name = "pepperspray" name = "pepperspray"
desc = "Manufactured by UhangInc, used to blind and down an opponent quickly." desc = "Manufactured by UhangInc, used to blind and down an opponent quickly."
icon = 'icons/obj/weapons.dmi' icon = 'icons/obj/weapons.dmi'
icon_state = "pepperspray" icon_state = "pepperspray"
item_state = "pepperspray" item_state = "pepperspray"
volume = 40 volume = 40
stream_range = 4 stream_range = 4
amount_per_transfer_from_this = 5 amount_per_transfer_from_this = 5
list_reagents = list("condensedcapsaicin" = 40) list_reagents = list("condensedcapsaicin" = 40)
// Fix pepperspraying yourself // Fix pepperspraying yourself
/obj/item/weapon/reagent_containers/spray/pepper/afterattack(atom/A as mob|obj, mob/user) /obj/item/weapon/reagent_containers/spray/pepper/afterattack(atom/A as mob|obj, mob/user)
if (A.loc == user) if (A.loc == user)
return return
..() ..()
//water flower //water flower
/obj/item/weapon/reagent_containers/spray/waterflower /obj/item/weapon/reagent_containers/spray/waterflower
name = "water flower" name = "water flower"
desc = "A seemingly innocent sunflower...with a twist." desc = "A seemingly innocent sunflower...with a twist."
icon = 'icons/obj/hydroponics/harvest.dmi' icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "sunflower" icon_state = "sunflower"
item_state = "sunflower" item_state = "sunflower"
amount_per_transfer_from_this = 1 amount_per_transfer_from_this = 1
volume = 10 volume = 10
list_reagents = list("water" = 10) list_reagents = list("water" = 10)
/obj/item/weapon/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays /obj/item/weapon/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays
return return
//chemsprayer //chemsprayer
/obj/item/weapon/reagent_containers/spray/chemsprayer /obj/item/weapon/reagent_containers/spray/chemsprayer
name = "chem sprayer" name = "chem sprayer"
desc = "A utility used to spray large amounts of reagents in a given area." desc = "A utility used to spray large amounts of reagents in a given area."
icon = 'icons/obj/guns/projectile.dmi' icon = 'icons/obj/guns/projectile.dmi'
icon_state = "chemsprayer" icon_state = "chemsprayer"
item_state = "chemsprayer" item_state = "chemsprayer"
throwforce = 0 throwforce = 0
w_class = WEIGHT_CLASS_NORMAL w_class = WEIGHT_CLASS_NORMAL
stream_mode = 1 stream_mode = 1
current_range = 7 current_range = 7
spray_range = 4 spray_range = 4
stream_range = 7 stream_range = 7
amount_per_transfer_from_this = 10 amount_per_transfer_from_this = 10
volume = 600 volume = 600
origin_tech = "combat=3;materials=3;engineering=3" origin_tech = "combat=3;materials=3;engineering=3"
/obj/item/weapon/reagent_containers/spray/chemsprayer/afterattack(atom/A as mob|obj, mob/user) /obj/item/weapon/reagent_containers/spray/chemsprayer/afterattack(atom/A as mob|obj, mob/user)
// Make it so the bioterror spray doesn't spray yourself when you click your inventory items // Make it so the bioterror spray doesn't spray yourself when you click your inventory items
if (A.loc == user) if (A.loc == user)
return return
..() ..()
/obj/item/weapon/reagent_containers/spray/chemsprayer/spray(atom/A) /obj/item/weapon/reagent_containers/spray/chemsprayer/spray(atom/A)
var/direction = get_dir(src, A) var/direction = get_dir(src, A)
var/turf/T = get_turf(A) var/turf/T = get_turf(A)
var/turf/T1 = get_step(T,turn(direction, 90)) var/turf/T1 = get_step(T,turn(direction, 90))
var/turf/T2 = get_step(T,turn(direction, -90)) var/turf/T2 = get_step(T,turn(direction, -90))
var/list/the_targets = list(T,T1,T2) var/list/the_targets = list(T,T1,T2)
for(var/i=1, i<=3, i++) // intialize sprays for(var/i=1, i<=3, i++) // intialize sprays
if(reagents.total_volume < 1) if(reagents.total_volume < 1)
return return
..(the_targets[i]) ..(the_targets[i])
/obj/item/weapon/reagent_containers/spray/chemsprayer/bioterror /obj/item/weapon/reagent_containers/spray/chemsprayer/bioterror
list_reagents = list("sodium_thiopental" = 100, "coniine" = 100, "venom" = 100, "condensedcapsaicin" = 100, "initropidril" = 100, "polonium" = 100) list_reagents = list("sodium_thiopental" = 100, "coniine" = 100, "venom" = 100, "condensedcapsaicin" = 100, "initropidril" = 100, "polonium" = 100)
// Plant-B-Gone // Plant-B-Gone
/obj/item/weapon/reagent_containers/spray/plantbgone // -- Skie /obj/item/weapon/reagent_containers/spray/plantbgone // -- Skie
name = "Plant-B-Gone" name = "Plant-B-Gone"
desc = "Kills those pesky weeds!" desc = "Kills those pesky weeds!"
icon = 'icons/obj/hydroponics/equipment.dmi' icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "plantbgone" icon_state = "plantbgone"
item_state = "plantbgone" item_state = "plantbgone"
volume = 100 volume = 100
list_reagents = list("plantbgone" = 100) list_reagents = list("plantbgone" = 100)

View File

@@ -1,33 +1,33 @@
/obj/machinery/computer/shuttle/ferry /obj/machinery/computer/shuttle/ferry
name = "transport ferry console" name = "transport ferry console"
circuit = /obj/item/weapon/circuitboard/computer/ferry circuit = /obj/item/weapon/circuitboard/computer/ferry
shuttleId = "ferry" shuttleId = "ferry"
possible_destinations = "ferry_home;ferry_away" possible_destinations = "ferry_home;ferry_away"
req_access = list(GLOB.access_cent_general) req_access = list(GLOB.access_cent_general)
var/aiControlDisabled = 1 var/aiControlDisabled = 1
/obj/machinery/computer/shuttle/ferry/proc/canAIControl(mob/user) /obj/machinery/computer/shuttle/ferry/proc/canAIControl(mob/user)
return ((aiControlDisabled != 1)); return ((aiControlDisabled != 1));
/obj/machinery/computer/shuttle/ferry/attack_ai(mob/user) /obj/machinery/computer/shuttle/ferry/attack_ai(mob/user)
if(!src.canAIControl(user)) if(!src.canAIControl(user))
return return
/obj/machinery/computer/shuttle/ferry/request /obj/machinery/computer/shuttle/ferry/request
name = "ferry console" name = "ferry console"
circuit = /obj/item/weapon/circuitboard/computer/ferry/request circuit = /obj/item/weapon/circuitboard/computer/ferry/request
var/last_request //prevents spamming admins var/last_request //prevents spamming admins
var/cooldown = 600 var/cooldown = 600
possible_destinations = "ferry_home;ferry_away" possible_destinations = "ferry_home;ferry_away"
req_access = list(GLOB.access_cent_general) req_access = list(GLOB.access_cent_general)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/machinery/computer/shuttle/ferry/request/Topic(href, href_list) /obj/machinery/computer/shuttle/ferry/request/Topic(href, href_list)
..() ..()
if(href_list["request"]) if(href_list["request"])
if(last_request && (last_request + cooldown > world.time)) if(last_request && (last_request + cooldown > world.time))
return return
last_request = world.time last_request = world.time
to_chat(usr, "<span class='notice'>Your request has been recieved by Centcom.</span>") to_chat(usr, "<span class='notice'>Your request has been recieved by Centcom.</span>")
to_chat(GLOB.admins, "<b>FERRY: <font color='blue'>[ADMIN_LOOKUPFLW(usr)] (<A HREF='?_src_=holder;secrets=moveferry'>Move Ferry</a>)</b> is requesting to move the transport ferry to Centcom.</font>") to_chat(GLOB.admins, "<b>FERRY: <font color='blue'>[ADMIN_LOOKUPFLW(usr)] (<A HREF='?_src_=holder;secrets=moveferry'>Move Ferry</a>)</b> is requesting to move the transport ferry to Centcom.</font>")

0
icons/emoji.dmi Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -33,6 +33,7 @@
#include "code\__DEFINES\combat.dm" #include "code\__DEFINES\combat.dm"
#include "code\__DEFINES\construction.dm" #include "code\__DEFINES\construction.dm"
#include "code\__DEFINES\contracts.dm" #include "code\__DEFINES\contracts.dm"
#include "code\__DEFINES\cult.dm"
#include "code\__DEFINES\DNA.dm" #include "code\__DEFINES\DNA.dm"
#include "code\__DEFINES\events.dm" #include "code\__DEFINES\events.dm"
#include "code\__DEFINES\flags.dm" #include "code\__DEFINES\flags.dm"
@@ -167,9 +168,6 @@
#include "code\citadel\cit_uniforms.dm" #include "code\citadel\cit_uniforms.dm"
#include "code\citadel\cit_vendors.dm" #include "code\citadel\cit_vendors.dm"
#include "code\citadel\dogborgstuff.dm" #include "code\citadel\dogborgstuff.dm"
#include "code\citadel\custom_loadout\custom_items.dm"
#include "code\citadel\custom_loadout\load_to_mob.dm"
#include "code\citadel\custom_loadout\read_from_file.dm"
#include "code\citadel\organs\breasts.dm" #include "code\citadel\organs\breasts.dm"
#include "code\citadel\organs\eggsack.dm" #include "code\citadel\organs\eggsack.dm"
#include "code\citadel\organs\genitals.dm" #include "code\citadel\organs\genitals.dm"
@@ -199,12 +197,14 @@
#include "code\controllers\subsystem\dbcore.dm" #include "code\controllers\subsystem\dbcore.dm"
#include "code\controllers\subsystem\disease.dm" #include "code\controllers\subsystem\disease.dm"
#include "code\controllers\subsystem\events.dm" #include "code\controllers\subsystem\events.dm"
#include "code\controllers\subsystem\fields.dm"
#include "code\controllers\subsystem\fire_burning.dm" #include "code\controllers\subsystem\fire_burning.dm"
#include "code\controllers\subsystem\garbage.dm" #include "code\controllers\subsystem\garbage.dm"
#include "code\controllers\subsystem\icon_smooth.dm" #include "code\controllers\subsystem\icon_smooth.dm"
#include "code\controllers\subsystem\inbounds.dm" #include "code\controllers\subsystem\inbounds.dm"
#include "code\controllers\subsystem\ipintel.dm" #include "code\controllers\subsystem\ipintel.dm"
#include "code\controllers\subsystem\job.dm" #include "code\controllers\subsystem\job.dm"
#include "code\controllers\subsystem\language.dm"
#include "code\controllers\subsystem\lighting.dm" #include "code\controllers\subsystem\lighting.dm"
#include "code\controllers\subsystem\machines.dm" #include "code\controllers\subsystem\machines.dm"
#include "code\controllers\subsystem\mapping.dm" #include "code\controllers\subsystem\mapping.dm"
@@ -266,6 +266,7 @@
#include "code\datums\antagonists\antag_datum.dm" #include "code\datums\antagonists\antag_datum.dm"
#include "code\datums\antagonists\datum_clockcult.dm" #include "code\datums\antagonists\datum_clockcult.dm"
#include "code\datums\antagonists\datum_cult.dm" #include "code\datums\antagonists\datum_cult.dm"
#include "code\datums\antagonists\ninja.dm"
#include "code\datums\diseases\_disease.dm" #include "code\datums\diseases\_disease.dm"
#include "code\datums\diseases\_MobProcs.dm" #include "code\datums\diseases\_MobProcs.dm"
#include "code\datums\diseases\anxiety.dm" #include "code\datums\diseases\anxiety.dm"
@@ -470,7 +471,9 @@
#include "code\game\gamemodes\cult\cult_items.dm" #include "code\game\gamemodes\cult\cult_items.dm"
#include "code\game\gamemodes\cult\cult_structures.dm" #include "code\game\gamemodes\cult\cult_structures.dm"
#include "code\game\gamemodes\cult\ritual.dm" #include "code\game\gamemodes\cult\ritual.dm"
#include "code\game\gamemodes\cult\rune_spawn_action.dm"
#include "code\game\gamemodes\cult\runes.dm" #include "code\game\gamemodes\cult\runes.dm"
#include "code\game\gamemodes\cult\supply.dm"
#include "code\game\gamemodes\cult\talisman.dm" #include "code\game\gamemodes\cult\talisman.dm"
#include "code\game\gamemodes\devil\devil.dm" #include "code\game\gamemodes\devil\devil.dm"
#include "code\game\gamemodes\devil\devil_game_mode.dm" #include "code\game\gamemodes\devil\devil_game_mode.dm"
@@ -556,6 +559,7 @@
#include "code\game\machinery\hologram.dm" #include "code\game\machinery\hologram.dm"
#include "code\game\machinery\igniter.dm" #include "code\game\machinery\igniter.dm"
#include "code\game\machinery\iv_drip.dm" #include "code\game\machinery\iv_drip.dm"
#include "code\game\machinery\launch_pad.dm"
#include "code\game\machinery\lightswitch.dm" #include "code\game\machinery\lightswitch.dm"
#include "code\game\machinery\limbgrower.dm" #include "code\game\machinery\limbgrower.dm"
#include "code\game\machinery\machinery.dm" #include "code\game\machinery\machinery.dm"
@@ -604,6 +608,7 @@
#include "code\game\machinery\computer\crew.dm" #include "code\game\machinery\computer\crew.dm"
#include "code\game\machinery\computer\dna_console.dm" #include "code\game\machinery\computer\dna_console.dm"
#include "code\game\machinery\computer\gulag_teleporter.dm" #include "code\game\machinery\computer\gulag_teleporter.dm"
#include "code\game\machinery\computer\launchpad_control.dm"
#include "code\game\machinery\computer\law.dm" #include "code\game\machinery\computer\law.dm"
#include "code\game\machinery\computer\medical.dm" #include "code\game\machinery\computer\medical.dm"
#include "code\game\machinery\computer\message.dm" #include "code\game\machinery\computer\message.dm"
@@ -726,6 +731,10 @@
#include "code\game\objects\effects\spawners\structure.dm" #include "code\game\objects\effects\spawners\structure.dm"
#include "code\game\objects\effects\spawners\vaultspawner.dm" #include "code\game\objects\effects\spawners\vaultspawner.dm"
#include "code\game\objects\effects\spawners\xeno_egg_delivery.dm" #include "code\game\objects\effects\spawners\xeno_egg_delivery.dm"
#include "code\game\objects\effects\temporary_visuals\clockcult.dm"
#include "code\game\objects\effects\temporary_visuals\cult.dm"
#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm"
#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm"
#include "code\game\objects\items\apc_frame.dm" #include "code\game\objects\items\apc_frame.dm"
#include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\blueprints.dm"
#include "code\game\objects\items\body_egg.dm" #include "code\game\objects\items\body_egg.dm"
@@ -809,7 +818,6 @@
#include "code\game\objects\items\weapons\defib.dm" #include "code\game\objects\items\weapons\defib.dm"
#include "code\game\objects\items\weapons\dice.dm" #include "code\game\objects\items\weapons\dice.dm"
#include "code\game\objects\items\weapons\dna_injector.dm" #include "code\game\objects\items\weapons\dna_injector.dm"
#include "code\game\objects\items\weapons\explosives.dm"
#include "code\game\objects\items\weapons\extinguisher.dm" #include "code\game\objects\items\weapons\extinguisher.dm"
#include "code\game\objects\items\weapons\flamethrower.dm" #include "code\game\objects\items\weapons\flamethrower.dm"
#include "code\game\objects\items\weapons\gift.dm" #include "code\game\objects\items\weapons\gift.dm"
@@ -1304,6 +1312,9 @@
#include "code\modules\events\wizard\rpgloot.dm" #include "code\modules\events\wizard\rpgloot.dm"
#include "code\modules\events\wizard\shuffle.dm" #include "code\modules\events\wizard\shuffle.dm"
#include "code\modules\events\wizard\summons.dm" #include "code\modules\events\wizard\summons.dm"
#include "code\modules\fields\fields.dm"
#include "code\modules\fields\peaceborg_dampener.dm"
#include "code\modules\fields\turf_objects.dm"
#include "code\modules\flufftext\Dreaming.dm" #include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm" #include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm" #include "code\modules\flufftext\TextFilters.dm"
@@ -1426,12 +1437,15 @@
#include "code\modules\jobs\job_types\security.dm" #include "code\modules\jobs\job_types\security.dm"
#include "code\modules\jobs\job_types\silicon.dm" #include "code\modules\jobs\job_types\silicon.dm"
#include "code\modules\language\common.dm" #include "code\modules\language\common.dm"
#include "code\modules\language\draconic.dm"
#include "code\modules\language\drone.dm" #include "code\modules\language\drone.dm"
#include "code\modules\language\language.dm" #include "code\modules\language\language.dm"
#include "code\modules\language\language_holder.dm"
#include "code\modules\language\language_menu.dm" #include "code\modules\language\language_menu.dm"
#include "code\modules\language\machine.dm" #include "code\modules\language\machine.dm"
#include "code\modules\language\monkey.dm" #include "code\modules\language\monkey.dm"
#include "code\modules\language\ratvar.dm" #include "code\modules\language\narsian.dm"
#include "code\modules\language\ratvarian.dm"
#include "code\modules\language\slime.dm" #include "code\modules\language\slime.dm"
#include "code\modules\language\swarmer.dm" #include "code\modules\language\swarmer.dm"
#include "code\modules\language\xenocommon.dm" #include "code\modules\language\xenocommon.dm"
@@ -1803,7 +1817,6 @@
#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" #include "code\modules\modular_computers\NTNet\NTNet_relay.dm"
#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" #include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm"
#include "code\modules\ninja\__ninjaDefines.dm" #include "code\modules\ninja\__ninjaDefines.dm"
#include "code\modules\ninja\admin_ninja_verbs.dm"
#include "code\modules\ninja\energy_katana.dm" #include "code\modules\ninja\energy_katana.dm"
#include "code\modules\ninja\ninja_event.dm" #include "code\modules\ninja\ninja_event.dm"
#include "code\modules\ninja\Ninja_Readme.dm" #include "code\modules\ninja\Ninja_Readme.dm"

View File

@@ -3,37 +3,37 @@
call config.bat call config.bat
call bin\findbyond.bat call bin\findbyond.bat
echo Welcome to the start server watch dog script, This will start the server and make sure it stays running. To continue, press any key or wait 30 seconds. echo Welcome to the start server watch dog script, This will start the server and make sure it stays running. To continue, press any key or wait 30 seconds.
timeout 30 timeout 30
if not exist gamedata\data\logs\runtimes mkdir gamedata\data\logs\runtimes\ if not exist gamedata\data\logs\runtimes mkdir gamedata\data\logs\runtimes\
@call python bot\nudge.py "WATCHDOG" "Watch Dog online. Starting server" >nul 2>nul @call python bot\nudge.py "WATCHDOG" "Watch Dog online. Starting server" >nul 2>nul
:START :START
call bin\getcurdate.bat call bin\getcurdate.bat
call bin\getunixtime.bat UNIXTIME call bin\getunixtime.bat UNIXTIME
echo %UNIXTIME% echo %UNIXTIME%
set STARTTIME=%UNIXTIME% set STARTTIME=%UNIXTIME%
cls cls
echo Watch Dog. echo Watch Dog.
echo Server Running. Watching for server exits. echo Server Running. Watching for server exits.
start /WAIT /ABOVENORMAL "" dreamdaemon.exe gamefolder\%PROJECTNAME%.dmb -port %PORT% -trusted -close -public -verbose start /WAIT /ABOVENORMAL "" dreamdaemon.exe gamefolder\%PROJECTNAME%.dmb -port %PORT% -trusted -close -public -verbose
cls cls
call bin\getunixtime.bat UNIXTIME call bin\getunixtime.bat UNIXTIME
SET /A Result=%UNIXTIME% - %STARTTIME% SET /A Result=%UNIXTIME% - %STARTTIME%
SET /A Result=180 - (%Result%/3) SET /A Result=180 - (%Result%/3)
if %Result% LSS 0 set /A Result=0 if %Result% LSS 0 set /A Result=0
echo Watch Dog. echo Watch Dog.
echo Server exit detected. Restarting in %Result% seconds. echo Server exit detected. Restarting in %Result% seconds.
@python bot\nudge.py "WATCHDOG" "Server exit detected. Restarting server in %Result% seconds." >nul 2>nul @python bot\nudge.py "WATCHDOG" "Server exit detected. Restarting server in %Result% seconds." >nul 2>nul
timeout %Result% timeout %Result%
goto :START goto :START