mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-29 06:58:30 +01:00
Merge branch 'master' of https://github.com/VOREStation/Polaris into sync-09272018
# Conflicts: # code/__defines/holomap.dm # code/__defines/mobs.dm # code/_helpers/icons.dm # code/_helpers/unsorted.dm # code/_onclick/hud/hud.dm # code/_onclick/item_attack.dm # code/controllers/Processes/supply.dm # code/controllers/subsystems/planets.dm # code/datums/supplypacks/munitions.dm # code/datums/supplypacks/science.dm # code/datums/supplypacks/security.dm # code/datums/supplypacks/supply.dm # code/game/area/Space Station 13 areas.dm # code/game/atoms_movable.dm # code/game/machinery/autolathe.dm # code/game/machinery/doors/door.dm # code/game/machinery/jukebox.dm # code/game/machinery/recharger.dm # code/game/machinery/vending.dm # code/game/mecha/equipment/tools/medical_tools.dm # code/game/mecha/equipment/weapons/weapons.dm # code/game/objects/items/devices/PDA/PDA.dm # code/game/objects/items/devices/megaphone.dm # code/game/objects/items/poi_items.dm # code/game/objects/items/weapons/implants/implantlanguage.dm # code/game/objects/items/weapons/storage/firstaid.dm # code/game/objects/items/weapons/tools/weldingtool.dm # code/game/objects/structures/flora/trees.dm # code/game/objects/structures/plasticflaps.dm # code/game/supplyshuttle.dm # code/game/turfs/simulated/wall_attacks.dm # code/modules/admin/admin_verbs.dm # code/modules/assembly/infrared.dm # code/modules/client/client procs.dm # code/modules/client/preference_setup/loadout/loadout_utility.dm # code/modules/client/preferences.dm # code/modules/clothing/suits/miscellaneous.dm # code/modules/holomap/holomap_datum.dm # code/modules/holomap/station_holomap.dm # code/modules/integrated_electronics/core/printer.dm # code/modules/mining/machine_processing.dm # code/modules/mob/living/carbon/human/human_defense.dm # code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm # code/modules/mob/living/death.dm # code/modules/mob/living/silicon/ai/ai.dm # code/modules/mob/living/silicon/pai/pai.dm # code/modules/mob/living/silicon/robot/robot.dm # code/modules/mob/living/simple_animal/animals/parrot.dm # code/modules/mob/mob_movement.dm # code/modules/organs/organ_external.dm # code/modules/organs/organ_icon.dm # code/modules/organs/subtypes/standard.dm # code/modules/planet/weather.dm # code/modules/power/cable.dm # code/modules/power/fusion/core/core_control.dm # code/modules/power/fusion/fuel_assembly/fuel_control.dm # code/modules/power/fusion/gyrotron/gyrotron_control.dm # code/modules/projectiles/gun.dm # code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm # config/names/first_name_skrell.txt # config/names/last_name_skrell.txt # icons/mob/head.dmi # icons/mob/robots.dmi # icons/mob/species/tajaran/helmet.dmi # icons/obj/ammo.dmi # icons/obj/gun.dmi # icons/obj/mining.dmi # icons/obj/projectiles.dmi # icons/obj/rig_modules.dmi # icons/obj/surgery.dmi # icons/turf/walls.dmi # maps/southern_cross/southern_cross-1.dmm # maps/southern_cross/southern_cross-3.dmm # maps/southern_cross/southern_cross-6.dmm # maps/southern_cross/southern_cross-8.dmm # maps/submaps/surface_submaps/mountains/backup/IceCave1.dmm # maps/submaps/surface_submaps/mountains/backup/IceCave1A.dmm # maps/submaps/surface_submaps/mountains/backup/IceCave1B.dmm # maps/submaps/surface_submaps/mountains/backup/IceCave1C.dmm # maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm # maps/submaps/surface_submaps/mountains/deadspy.dmm # maps/submaps/surface_submaps/mountains/mountains_areas.dm # maps/submaps/surface_submaps/plains/Thiefc.dmm # maps/~map_system/maps.dm # vorestation.dme
This commit is contained in:
@@ -136,7 +136,8 @@ var/list/admin_verbs_fun = list(
|
||||
/datum/admins/proc/call_supply_drop,
|
||||
/datum/admins/proc/call_drop_pod,
|
||||
/client/proc/smite_vr, //VOREStation Add,
|
||||
/client/proc/smite
|
||||
/client/proc/smite,
|
||||
/client/proc/admin_lightning_strike
|
||||
)
|
||||
|
||||
var/list/admin_verbs_spawn = list(
|
||||
|
||||
@@ -641,6 +641,7 @@
|
||||
var/datum/weather/new_weather = input(usr, "What weather do you want to change to?", "Change Weather") as null|anything in planet.weather_holder.allowed_weather_types
|
||||
if(new_weather)
|
||||
planet.weather_holder.change_weather(new_weather)
|
||||
planet.weather_holder.rebuild_forecast()
|
||||
var/log = "[key_name(src)] changed [planet.name]'s weather to [new_weather]."
|
||||
message_admins(log)
|
||||
log_admin(log)
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
/client/proc/admin_lightning_strike()
|
||||
set name = "Lightning Strike"
|
||||
set desc = "Causes lightning to strike on your tile. This will hurt things on or nearby it severely."
|
||||
set category = "Fun"
|
||||
|
||||
if(!check_rights(R_FUN))
|
||||
return
|
||||
|
||||
var/result = alert(src, "Really strike your tile with lightning?", "Confirm Badmin" , "No", "Yes (Cosmetic)", "Yes (Real)")
|
||||
|
||||
if(result == "No")
|
||||
return
|
||||
var/fake_lightning = result == "Yes (Cosmetic)"
|
||||
|
||||
lightning_strike(get_turf(usr), fake_lightning)
|
||||
log_and_message_admins("[key_name(src)] has caused [fake_lightning ? "cosmetic":"harmful"] lightning to strike at their position ([src.mob.x], [src.mob.y], [src.mob.z]). \
|
||||
(<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.mob.x];Y=[src.mob.y];Z=[src.mob.z]'>JMP</a>)")
|
||||
|
||||
#define LIGHTNING_REDIRECT_RANGE 28 // How far in tiles certain things draw lightning from.
|
||||
#define LIGHTNING_ZAP_RANGE 3 // How far the tesla effect zaps, as well as the bad effects from a direct strike.
|
||||
#define LIGHTNING_POWER 20000 // How much 'zap' is in a strike, used for tesla_zap().
|
||||
|
||||
// The real lightning proc.
|
||||
// This is global until I can figure out a better place for it.
|
||||
// T is the turf that is being struck. If cosmetic is true, the lightning won't actually hurt anything.
|
||||
/proc/lightning_strike(turf/T, cosmetic = FALSE)
|
||||
// First, visuals.
|
||||
|
||||
// Do a lightning flash for the whole planet, if the turf belongs to a planet.
|
||||
var/datum/planet/P = null
|
||||
P = SSplanets.z_to_planet[T.z]
|
||||
if(P)
|
||||
var/datum/weather_holder/holder = P.weather_holder
|
||||
flick("lightning_flash", holder.special_visuals)
|
||||
|
||||
// Before we do the other visuals, we need to see if something is going to hijack our intended target.
|
||||
var/obj/machinery/power/grounding_rod/ground = null // Most of the bad effects of lightning will get negated if a grounding rod is nearby.
|
||||
var/obj/machinery/power/tesla_coil/coil = null // However a tesla coil has higher priority and the strike will bounce.
|
||||
|
||||
for(var/obj/machinery/power/thing in range(LIGHTNING_REDIRECT_RANGE, T))
|
||||
if(istype(thing, /obj/machinery/power/tesla_coil))
|
||||
var/turf/simulated/coil_turf = get_turf(thing)
|
||||
if(istype(coil_turf) && thing.anchored && coil_turf.outdoors)
|
||||
coil = thing
|
||||
break
|
||||
|
||||
if(istype(thing, /obj/machinery/power/grounding_rod))
|
||||
var/turf/simulated/rod_turf = get_turf(thing)
|
||||
if(istype(rod_turf) && thing.anchored && rod_turf.outdoors)
|
||||
ground = thing
|
||||
|
||||
if(coil) // Coil gets highest priority.
|
||||
T = coil.loc
|
||||
else if(ground)
|
||||
T = ground.loc
|
||||
|
||||
// Now make the lightning strike sprite. It will fade and delete itself in a second.
|
||||
new /obj/effect/temporary_effect/lightning_strike(T)
|
||||
|
||||
// For those close up.
|
||||
playsound(T, 'sound/effects/lightningbolt.ogg', 100, 1)
|
||||
|
||||
// And for those far away. If the strike happens on a planet, everyone on the planet will hear it.
|
||||
// Otherwise only those on the current z-level will hear it.
|
||||
var/sound = get_sfx("thunder")
|
||||
for(var/mob/M in player_list)
|
||||
if((P && M.z in P.expected_z_levels) || M.z == T.z)
|
||||
M.playsound_local(get_turf(M), soundin = sound, vol = 70, vary = FALSE, is_global = TRUE)
|
||||
|
||||
if(cosmetic) // Everything beyond here involves potentially damaging things. If we don't want to do that, stop now.
|
||||
return
|
||||
|
||||
if(ground) // All is well.
|
||||
ground.tesla_act(LIGHTNING_POWER, FALSE)
|
||||
return
|
||||
|
||||
else if(coil) // Otherwise lets bounce off the tesla coil.
|
||||
coil.tesla_act(LIGHTNING_POWER, TRUE)
|
||||
|
||||
else // Striking the turf directly.
|
||||
tesla_zap(T, zap_range = LIGHTNING_ZAP_RANGE, power = LIGHTNING_POWER, explosive = FALSE, stun_mobs = TRUE)
|
||||
|
||||
// Some extra effects.
|
||||
// Some apply to those within zap range, others if they were a bit farther away.
|
||||
for(var/mob/living/L in view(5, T))
|
||||
if(get_dist(L, T) <= LIGHTNING_ZAP_RANGE) // They probably got zapped.
|
||||
// The actual damage/electrocution is handled by tesla_zap().
|
||||
L.Paralyse(5)
|
||||
L.stuttering += 20
|
||||
L.make_jittery(20)
|
||||
L.emp_act(1)
|
||||
to_chat(L, span("critical", "You've been struck by lightning!"))
|
||||
|
||||
// If a non-player simplemob was struck, inflict huge damage.
|
||||
// If the damage is fatal, the SA is turned to ash.
|
||||
if(istype(L, /mob/living/simple_animal) && !L.key)
|
||||
var/mob/living/simple_animal/SA = L
|
||||
SA.adjustFireLoss(200)
|
||||
SA.updatehealth()
|
||||
if(SA.health <= 0) // Might be best to check/give simple_mobs siemens when this gets ported to new mobs.
|
||||
SA.visible_message(span("critical", "\The [SA] disintegrates into ash!"))
|
||||
SA.ash()
|
||||
continue // No point deafening something that wont exist.
|
||||
|
||||
// Deafen them.
|
||||
if(L.get_ear_protection() < 2)
|
||||
L.AdjustSleeping(-100)
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
C.ear_deaf += 10
|
||||
to_chat(L, span("danger", "Lightning struck nearby, and the thunderclap is deafening!"))
|
||||
|
||||
#undef GROUNDING_ROD_RANGE
|
||||
#undef LIGHTNING_ZAP_RANGE
|
||||
#undef LIGHTNING_POWER
|
||||
@@ -10,13 +10,17 @@
|
||||
return
|
||||
template = map_templates[map]
|
||||
|
||||
var/orientation = text2dir(input(usr, "Choose an orientation for this Map Template.", "Orientation") as null|anything in list("North", "South", "East", "West"))
|
||||
if(!orientation)
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(mob)
|
||||
if(!T)
|
||||
return
|
||||
|
||||
var/list/preview = list()
|
||||
template.preload_size(template.mappath)
|
||||
for(var/S in template.get_affected_turfs(T,centered = TRUE))
|
||||
template.preload_size(template.mappath, orientation)
|
||||
for(var/S in template.get_affected_turfs(T,centered = TRUE, orientation=orientation))
|
||||
preview += image('icons/misc/debug_group.dmi',S ,"red")
|
||||
usr.client.images += preview
|
||||
if(alert(usr,"Confirm location.", "Template Confirm","No","Yes") == "Yes")
|
||||
@@ -25,7 +29,7 @@
|
||||
usr.client.images -= preview
|
||||
return
|
||||
|
||||
if(template.load(T, centered = TRUE))
|
||||
if(template.load(T, centered = TRUE, orientation=orientation))
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has placed a map template ([template.name]).</span>")
|
||||
else
|
||||
to_chat(usr, "Failed to place map")
|
||||
@@ -41,14 +45,18 @@
|
||||
if(!map)
|
||||
return
|
||||
template = map_templates[map]
|
||||
|
||||
if(template.width > world.maxx || template.height > world.maxy)
|
||||
|
||||
var/orientation = text2dir(input(usr, "Choose an orientation for this Map Template.", "Orientation") as null|anything in list("North", "South", "East", "West"))
|
||||
if(!orientation)
|
||||
return
|
||||
|
||||
if(((orientation & (NORTH|SOUTH) && template.width > world.maxx || template.height > world.maxy) || ((orientation & (EAST|WEST)) && template.width > world.maxy || template.height > world.maxx)))
|
||||
if(alert(usr,"This template is larger than the existing z-levels. It will EXPAND ALL Z-LEVELS to match the size of the template. This may cause chaos. Are you sure you want to do this?","DANGER!!!","Cancel","Yes") == "Cancel")
|
||||
to_chat(usr,"Template placement aborted.")
|
||||
return
|
||||
|
||||
|
||||
if(alert(usr,"Confirm map load.", "Template Confirm","No","Yes") == "Yes")
|
||||
if(template.load_new_z())
|
||||
if(template.load_new_z(orientation=orientation))
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has placed a map template ([template.name]) on Z level [world.maxz].</span>")
|
||||
else
|
||||
to_chat(usr, "Failed to place map")
|
||||
|
||||
@@ -84,3 +84,111 @@
|
||||
<option value='?_src_=vars;explode=\ref[src]'>Trigger explosion</option>
|
||||
<option value='?_src_=vars;emp=\ref[src]'>Trigger EM pulse</option>
|
||||
"}
|
||||
|
||||
/datum/proc/get_variables()
|
||||
. = vars - VV_hidden()
|
||||
if(!usr || !check_rights(R_ADMIN|R_DEBUG, FALSE))
|
||||
. -= VV_secluded()
|
||||
|
||||
/datum/proc/get_variable_value(varname)
|
||||
return vars[varname]
|
||||
|
||||
/datum/proc/set_variable_value(varname, value)
|
||||
vars[varname] = value
|
||||
|
||||
/datum/proc/get_initial_variable_value(varname)
|
||||
return initial(vars[varname])
|
||||
|
||||
/datum/proc/make_view_variables_variable_entry(var/varname, var/value, var/hide_watch = 0)
|
||||
return {"
|
||||
(<a href='?_src_=vars;datumedit=\ref[src];varnameedit=[varname]'>E</a>)
|
||||
(<a href='?_src_=vars;datumchange=\ref[src];varnamechange=[varname]'>C</a>)
|
||||
(<a href='?_src_=vars;datummass=\ref[src];varnamemass=[varname]'>M</a>)
|
||||
[hide_watch ? "" : "(<a href='?_src_=vars;datumwatch=\ref[src];varnamewatch=[varname]'>W</a>)"]
|
||||
"}
|
||||
|
||||
// No mass editing of clients
|
||||
/client/make_view_variables_variable_entry(var/varname, var/value, var/hide_watch = 0)
|
||||
return {"
|
||||
(<a href='?_src_=vars;datumedit=\ref[src];varnameedit=[varname]'>E</a>)
|
||||
(<a href='?_src_=vars;datumchange=\ref[src];varnamechange=[varname]'>C</a>)
|
||||
[hide_watch ? "" : "(<a href='?_src_=vars;datumwatch=\ref[src];varnamewatch=[varname]'>W</a>)"]
|
||||
"}
|
||||
|
||||
// These methods are all procs and don't use stored lists to avoid VV exploits
|
||||
|
||||
// The following vars cannot be viewed by anyone
|
||||
/datum/proc/VV_hidden()
|
||||
return list()
|
||||
|
||||
// The following vars can only be viewed by R_ADMIN|R_DEBUG
|
||||
/datum/proc/VV_secluded()
|
||||
return list()
|
||||
|
||||
/datum/configuration/VV_secluded()
|
||||
return vars
|
||||
|
||||
// The following vars cannot be edited by anyone
|
||||
/datum/proc/VV_static()
|
||||
return list("parent_type")
|
||||
|
||||
/atom/VV_static()
|
||||
return ..() + list("bound_x", "bound_y", "bound_height", "bound_width", "bounds", "step_x", "step_y", "step_size")
|
||||
|
||||
/client/VV_static()
|
||||
return ..() + list("holder", "prefs")
|
||||
|
||||
/datum/admins/VV_static()
|
||||
return vars
|
||||
|
||||
// The following vars require R_DEBUG to edit
|
||||
/datum/proc/VV_locked()
|
||||
return list("vars", "virus", "viruses", "cuffed")
|
||||
|
||||
/client/VV_locked()
|
||||
return list("vars", "mob")
|
||||
|
||||
/mob/VV_locked()
|
||||
return ..() + list("client")
|
||||
|
||||
// The following vars require R_FUN|R_DEBUG to edit
|
||||
/datum/proc/VV_icon_edit_lock()
|
||||
return list()
|
||||
|
||||
/atom/VV_icon_edit_lock()
|
||||
return ..() + list("icon", "icon_state", "overlays", "underlays")
|
||||
|
||||
// The following vars require R_SPAWN|R_DEBUG to edit
|
||||
/datum/proc/VV_ckey_edit()
|
||||
return list()
|
||||
|
||||
/mob/VV_ckey_edit()
|
||||
return list("key", "ckey")
|
||||
|
||||
/client/VV_ckey_edit()
|
||||
return list("key", "ckey")
|
||||
|
||||
/datum/proc/may_edit_var(var/user, var/var_to_edit)
|
||||
if(!user)
|
||||
return FALSE
|
||||
if(!(var_to_edit in vars))
|
||||
to_chat(user, "<span class='warning'>\The [src] does not have a var '[var_to_edit]'</span>")
|
||||
return FALSE
|
||||
if(var_to_edit in VV_static())
|
||||
return FALSE
|
||||
if((var_to_edit in VV_secluded()) && !check_rights(R_ADMIN|R_DEBUG, FALSE, C = user))
|
||||
return FALSE
|
||||
if((var_to_edit in VV_locked()) && !check_rights(R_DEBUG, C = user))
|
||||
return FALSE
|
||||
if((var_to_edit in VV_ckey_edit()) && !check_rights(R_SPAWN|R_DEBUG, C = user))
|
||||
return FALSE
|
||||
if((var_to_edit in VV_icon_edit_lock()) && !check_rights(R_FUN|R_DEBUG, C = user))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/proc/forbidden_varedit_object_types()
|
||||
return list(
|
||||
/datum/admins, //Admins editing their own admin-power object? Yup, sounds like a good idea.,
|
||||
/obj/machinery/blackbox_recorder, //Prevents people messing with feedback gathering,
|
||||
/datum/feedback_variable //Prevents people messing with feedback gathering
|
||||
)
|
||||
@@ -474,7 +474,7 @@
|
||||
usr << "This can only be done on mobs with clients"
|
||||
return
|
||||
|
||||
nanomanager.send_resources(H.client)
|
||||
GLOB.nanomanager.send_resources(H.client)
|
||||
|
||||
usr << "Resource files sent"
|
||||
H << "Your NanoUI Resource files have been refreshed"
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
if((!A.secured) && (!secured))
|
||||
attach_assembly(A,user)
|
||||
return
|
||||
if(isscrewdriver(W))
|
||||
if(W.is_screwdriver())
|
||||
if(toggle_secure())
|
||||
to_chat(user, "<span class='notice'>\The [src] is ready!</span>")
|
||||
else
|
||||
|
||||
@@ -144,7 +144,7 @@
|
||||
|
||||
|
||||
/obj/item/device/assembly_holder/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(isscrewdriver(W))
|
||||
if(W.is_screwdriver())
|
||||
if(!a_left || !a_right)
|
||||
to_chat(user, "<span class='warning'> BUG:Assembly part missing, please report this!</span>")
|
||||
return
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
if(holder && istype(holder.loc,/obj/item/weapon/grenade/chem_grenade))
|
||||
var/obj/item/weapon/grenade/chem_grenade/grenade = holder.loc
|
||||
grenade.prime()
|
||||
grenade.detonate()
|
||||
else
|
||||
var/turf/location = get_turf(loc)
|
||||
if(location)
|
||||
|
||||
@@ -254,4 +254,4 @@
|
||||
if(master.first == src)
|
||||
master.first = null
|
||||
if(next && !next.gc_destroyed)
|
||||
qdel_null(next)
|
||||
QDEL_NULL(next)
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
return
|
||||
|
||||
/obj/item/assembly/shock_kit/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/wrench) && !status)
|
||||
if(W.is_wrench() && !status)
|
||||
var/turf/T = loc
|
||||
if(ismob(T))
|
||||
T = T.loc
|
||||
@@ -27,7 +27,7 @@
|
||||
part2 = null
|
||||
qdel(src)
|
||||
return
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
if(W.is_screwdriver())
|
||||
status = !status
|
||||
to_chat(user, "<span class='notice'>[src] is now [status ? "secured" : "unsecured"]!</span>")
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
|
||||
@@ -51,6 +51,15 @@ var/list/blobs = list()
|
||||
return TRUE
|
||||
if(istype(mover) && mover.checkpass(PASSBLOB))
|
||||
return TRUE
|
||||
else if(istype(mover, /mob/living))
|
||||
var/mob/living/L = mover
|
||||
if(L.faction == "blob")
|
||||
return TRUE
|
||||
else if(istype(mover, /obj/item/projectile))
|
||||
var/obj/item/projectile/P = mover
|
||||
if(P.firer && P.firer.faction == "blob")
|
||||
return TRUE
|
||||
return FALSE
|
||||
else
|
||||
return FALSE
|
||||
// return ..()
|
||||
@@ -248,6 +257,9 @@ var/list/blobs = list()
|
||||
if(!P)
|
||||
return
|
||||
|
||||
if(P.firer && P.firer.faction == "blob")
|
||||
return
|
||||
|
||||
var/damage = P.get_structure_damage() // So tasers don't hurt the blob.
|
||||
if(!damage)
|
||||
return
|
||||
|
||||
@@ -38,6 +38,9 @@ var/list/blob_cores = list()
|
||||
/obj/structure/blob/core/grey_goo
|
||||
desired_blob_type = /datum/blob_type/grey_goo
|
||||
|
||||
/obj/structure/blob/core/fabrication_swarm
|
||||
desired_blob_type = /datum/blob_type/fabrication_swarm
|
||||
|
||||
/obj/structure/blob/core/electromagnetic_web
|
||||
desired_blob_type = /datum/blob_type/electromagnetic_web
|
||||
|
||||
@@ -71,6 +74,9 @@ var/list/blob_cores = list()
|
||||
/obj/structure/blob/core/radioactive_ooze
|
||||
desired_blob_type = /datum/blob_type/radioactive_ooze
|
||||
|
||||
/obj/structure/blob/core/volatile_alluvium
|
||||
desired_blob_type = /datum/blob_type/volatile_alluvium
|
||||
|
||||
/obj/structure/blob/core/classic
|
||||
desired_blob_type = /datum/blob_type/classic
|
||||
|
||||
|
||||
@@ -16,8 +16,10 @@
|
||||
|
||||
/obj/structure/blob/factory/Destroy()
|
||||
for(var/mob/living/simple_animal/hostile/blob/spore/spore in spores)
|
||||
if(spore.factory == src)
|
||||
if(istype(spore) && spore.factory == src)
|
||||
spore.factory = null
|
||||
else
|
||||
spore.nest = null
|
||||
spores = null
|
||||
return ..()
|
||||
|
||||
@@ -32,6 +34,21 @@
|
||||
var/mob/living/simple_animal/hostile/blob/spore/S = null
|
||||
if(overmind)
|
||||
S = new overmind.blob_type.spore_type(src.loc, src)
|
||||
S.overmind = overmind
|
||||
S.faction = "blob"
|
||||
if(istype(S))
|
||||
S.overmind = overmind
|
||||
overmind.blob_mobs.Add(S)
|
||||
if(overmind.blob_type.ranged_spores)
|
||||
S.ranged = TRUE
|
||||
S.projectiletype = overmind.blob_type.spore_projectile
|
||||
S.projectilesound = overmind.blob_type.spore_firesound
|
||||
S.shoot_range = overmind.blob_type.spore_range
|
||||
else //Other mobs don't add themselves in New. Ew.
|
||||
S.nest = src
|
||||
spores += S
|
||||
S.update_icons()
|
||||
overmind.blob_mobs.Add(S)
|
||||
|
||||
/obj/structure/blob/factory/sluggish // Capable of producing MORE spores, but quite a bit slower than normal.
|
||||
name = "sluggish factory blob"
|
||||
max_spores = 4
|
||||
spore_cooldown = 16 SECONDS
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
max_integrity = 40
|
||||
point_return = 15
|
||||
var/resource_delay = 0
|
||||
var/resource_cooldown = 4 SECONDS
|
||||
|
||||
/obj/structure/blob/resource/New(var/newloc, var/new_overmind)
|
||||
..(newloc, new_overmind)
|
||||
@@ -25,6 +26,12 @@
|
||||
flick("blob_resource_glow", src)
|
||||
if(overmind)
|
||||
overmind.add_points(1)
|
||||
resource_delay = world.time + 4 SECONDS + (overmind.resource_blobs.len * 2.5) //4 seconds plus a quarter second for each resource blob the overmind has
|
||||
resource_delay = world.time + resource_cooldown + (overmind.resource_blobs.len * 2.5) //4 seconds plus a quarter second for each resource blob the overmind has
|
||||
else
|
||||
resource_delay = world.time + 4 SECONDS
|
||||
resource_delay = world.time + resource_cooldown
|
||||
|
||||
/obj/structure/blob/resource/sluggish // Tankier, but really slow.
|
||||
name = "sluggish resource blob"
|
||||
desc = "A thin spire of occasionally convulsing tendrils."
|
||||
max_integrity = 80
|
||||
resource_cooldown = 8 SECONDS
|
||||
|
||||
@@ -94,4 +94,4 @@ var/list/overminds = list()
|
||||
|
||||
if(blob_points >= 100)
|
||||
if(!auto_factory() && !auto_resource())
|
||||
auto_node()
|
||||
auto_node()
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
create_shield()
|
||||
|
||||
/mob/observer/blob/proc/create_shield(turf/T)
|
||||
createSpecial(15, /obj/structure/blob/shield, 0, 0, T)
|
||||
createSpecial(15, blob_type.shield_type, 0, 0, T)
|
||||
|
||||
/mob/observer/blob/verb/create_resource()
|
||||
set category = "Blob"
|
||||
@@ -55,7 +55,7 @@
|
||||
if(!blob_type.can_build_resources)
|
||||
return FALSE
|
||||
|
||||
createSpecial(40, /obj/structure/blob/resource, 4, 1)
|
||||
createSpecial(40, blob_type.resource_type, 4, 1)
|
||||
|
||||
/mob/observer/blob/verb/auto_resource()
|
||||
set category = "Blob"
|
||||
@@ -85,7 +85,7 @@
|
||||
|
||||
if(B)
|
||||
forceMove(B.loc)
|
||||
return createSpecial(40, /obj/structure/blob/resource, 4, 1, B.loc)
|
||||
return createSpecial(40, blob_type.resource_type, 4, 1, B.loc)
|
||||
|
||||
|
||||
/mob/observer/blob/verb/create_factory()
|
||||
@@ -96,7 +96,7 @@
|
||||
if(!blob_type.can_build_factories)
|
||||
return FALSE
|
||||
|
||||
createSpecial(60, /obj/structure/blob/factory, 7, 1)
|
||||
createSpecial(60, blob_type.factory_type, 7, 1)
|
||||
|
||||
/mob/observer/blob/verb/auto_factory()
|
||||
set category = "Blob"
|
||||
@@ -126,7 +126,7 @@
|
||||
|
||||
if(B)
|
||||
forceMove(B.loc)
|
||||
return createSpecial(60, /obj/structure/blob/factory, 7, 1, B.loc)
|
||||
return createSpecial(60, blob_type.factory_type, 7, 1, B.loc)
|
||||
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
if(!blob_type.can_build_nodes)
|
||||
return FALSE
|
||||
|
||||
createSpecial(100, /obj/structure/blob/node, 5, 0)
|
||||
createSpecial(100, blob_type.node_type, 5, 0)
|
||||
|
||||
/mob/observer/blob/verb/auto_node()
|
||||
set category = "Blob"
|
||||
@@ -166,7 +166,7 @@
|
||||
|
||||
if(B)
|
||||
forceMove(B.loc)
|
||||
return createSpecial(100, /obj/structure/blob/node, 5, 0, B.loc)
|
||||
return createSpecial(100, blob_type.node_type, 5, 0, B.loc)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -33,6 +33,15 @@
|
||||
var/can_build_nodes = TRUE // Ditto, for nodes.
|
||||
|
||||
var/spore_type = /mob/living/simple_animal/hostile/blob/spore
|
||||
var/ranged_spores = FALSE // For proper spores of the type above.
|
||||
var/spore_firesound = 'sound/effects/slime_squish.ogg'
|
||||
var/spore_range = 7 // The range the spore can fire.
|
||||
var/spore_projectile = /obj/item/projectile/energy/blob
|
||||
|
||||
var/factory_type = /obj/structure/blob/factory
|
||||
var/resource_type = /obj/structure/blob/resource
|
||||
var/node_type = /obj/structure/blob/node
|
||||
var/shield_type = /obj/structure/blob/shield
|
||||
|
||||
// Called when a blob receives damage. This needs to return the final damage or blobs will be immortal.
|
||||
/datum/blob_type/proc/on_received_damage(var/obj/structure/blob/B, damage, damage_type)
|
||||
@@ -82,13 +91,49 @@
|
||||
slow_spread_with_size = FALSE
|
||||
ai_aggressiveness = 80
|
||||
can_build_resources = TRUE
|
||||
attack_message = "The tide tries to shallow you"
|
||||
attack_message = "The tide tries to swallow you"
|
||||
attack_message_living = ", and you feel your skin dissolve"
|
||||
attack_message_synth = ", and your external plating dissolves"
|
||||
|
||||
/datum/blob_type/grey_goo/on_emp(obj/structure/blob/B, severity)
|
||||
B.adjust_integrity(-(20 / severity))
|
||||
|
||||
// Slow, tanky blobtype which uses not spores, but hivebots, as its soldiers.
|
||||
/datum/blob_type/fabrication_swarm
|
||||
name = "iron tide"
|
||||
desc = "A swarm of self replicating construction nanites. Incredibly illegal, but only mildly dangerous."
|
||||
effect_desc = "Slow-spreading, but incredibly resiliant. It has a chance to harden itself against attacks automatically for no resource cost, and uses cheaply-constructed hivebots as soldiers."
|
||||
ai_desc = "defensive"
|
||||
difficulty = BLOB_DIFFICULTY_MEDIUM // Emitters are okay, EMP is great.
|
||||
color = "#666666"
|
||||
complementary_color = "#B7410E"
|
||||
spread_modifier = 0.2
|
||||
can_build_factories = TRUE
|
||||
can_build_resources = TRUE
|
||||
attack_message = "The tide tries to shove you away"
|
||||
attack_message_living = ", and your skin itches"
|
||||
attack_message_synth = ", and your external plating dulls"
|
||||
attack_verb = "shoves"
|
||||
armor_pen = 40
|
||||
damage_lower = 10
|
||||
damage_upper = 25
|
||||
brute_multiplier = 0.25
|
||||
burn_multiplier = 0.6
|
||||
ai_aggressiveness = 50 //Really doesn't like you near it.
|
||||
spore_type = /mob/living/simple_animal/hostile/hivebot/swarm
|
||||
|
||||
/datum/blob_type/fabrication_swarm/on_received_damage(var/obj/structure/blob/B, damage, damage_type, mob/living/attacker)
|
||||
if(istype(B, /obj/structure/blob/normal))
|
||||
if(damage > 0)
|
||||
var/reinforce_probability = min(damage, 70)
|
||||
if(prob(reinforce_probability))
|
||||
B.visible_message("<span class='danger'>The [name] quakes, before rapidly hardening!</span>")
|
||||
new/obj/structure/blob/shield(get_turf(B), B.overmind)
|
||||
qdel(B)
|
||||
return ..()
|
||||
|
||||
/datum/blob_type/fabrication_swarm/on_emp(obj/structure/blob/B, severity)
|
||||
B.adjust_integrity(-(30 / severity))
|
||||
|
||||
// A blob meant to be fought like a fire.
|
||||
/datum/blob_type/blazing_oil
|
||||
@@ -218,17 +263,23 @@
|
||||
/datum/blob_type/fulminant_organism/on_expand(var/obj/structure/blob/B, var/obj/structure/blob/new_B, var/turf/T, var/mob/observer/blob/O)
|
||||
if(prob(10)) // 10% chance to make a weak spore when expanding.
|
||||
var/mob/living/simple_animal/hostile/blob/S = new spore_type(T)
|
||||
S.overmind = O
|
||||
if(istype(S))
|
||||
S.overmind = O
|
||||
O.blob_mobs.Add(S)
|
||||
else
|
||||
S.faction = "blob"
|
||||
S.update_icons()
|
||||
O.blob_mobs.Add(S)
|
||||
|
||||
/datum/blob_type/fulminant_organism/on_death(obj/structure/blob/B)
|
||||
if(prob(33)) // 33% chance to make a spore when dying.
|
||||
var/mob/living/simple_animal/hostile/blob/S = new spore_type(get_turf(B))
|
||||
B.visible_message("<span class='danger'>A spore floats free from the [name]!</span>")
|
||||
S.overmind = B.overmind
|
||||
B.visible_message("<span class='danger'>\The [S] floats free from the [name]!</span>")
|
||||
if(istype(S))
|
||||
S.overmind = B.overmind
|
||||
B.overmind.blob_mobs.Add(S)
|
||||
else
|
||||
S.faction = "blob"
|
||||
S.update_icons()
|
||||
B.overmind.blob_mobs.Add(S)
|
||||
|
||||
|
||||
// Auto-retaliates against melee attacks. Weak to projectiles.
|
||||
@@ -542,4 +593,52 @@
|
||||
attack_verb = "splashes"
|
||||
|
||||
/datum/blob_type/radioactive_ooze/on_pulse(var/obj/structure/blob/B)
|
||||
radiation_repository.radiate(B, 200)
|
||||
radiation_repository.radiate(B, 200)
|
||||
|
||||
/datum/blob_type/volatile_alluvium
|
||||
name = "volatile alluvium"
|
||||
desc = "A churning, earthy mass that moves in waves."
|
||||
ai_desc = "earthen"
|
||||
effect_desc = "Moves slowly, producing weak ranged spores to defend itself, and inflicts brute attacks. Attempts to disarm nearby attackers. Weak to water."
|
||||
difficulty = BLOB_DIFFICULTY_HARD //Slow-starting, but can be overwhelming if left alone.
|
||||
color = "#6B481E"
|
||||
complementary_color = "#7F471F"
|
||||
damage_lower = 10
|
||||
damage_upper = 20
|
||||
armor_pen = 40
|
||||
brute_multiplier = 0.7
|
||||
burn_multiplier = 0.5
|
||||
spread_modifier = 0.5
|
||||
ai_aggressiveness = 50
|
||||
attack_message = "The alluvium crashes against you"
|
||||
attack_verb = "crashes against"
|
||||
can_build_factories = TRUE
|
||||
can_build_resources = TRUE
|
||||
spore_type = /mob/living/simple_animal/hostile/blob/spore/weak
|
||||
ranged_spores = TRUE
|
||||
spore_range = 3
|
||||
spore_projectile = /obj/item/projectile/energy/blob/splattering
|
||||
factory_type = /obj/structure/blob/factory/sluggish
|
||||
resource_type = /obj/structure/blob/resource/sluggish
|
||||
|
||||
/datum/blob_type/volatile_alluvium/on_received_damage(var/obj/structure/blob/B, damage, damage_type, mob/living/attacker)
|
||||
if(damage > 0 && attacker && get_dist(B, attacker) <= 2 && prob(min(damage, 70)) && istype(attacker, /mob/living/carbon/human)) // Melee weapons of any type carried by a human will have a high chance of being stolen.
|
||||
var/mob/living/carbon/human/H = attacker
|
||||
var/obj/item/I = H.get_active_hand()
|
||||
H.drop_item()
|
||||
if(I)
|
||||
if((I.sharp || I.edge) && !istype(I, /obj/item/weapon/gun))
|
||||
I.forceMove(get_turf(B)) // Disarmed entirely.
|
||||
B.visible_message("<span class='danger'>The [name] heaves, \the [attacker]'s weapon becoming stuck in the churning mass!</span>")
|
||||
else
|
||||
I.throw_at(B, 2, 4) // Just yoinked.
|
||||
B.visible_message("<span class='danger'>The [name] heaves, pulling \the [attacker]'s weapon from their hands!</span>")
|
||||
B.blob_attack_animation(attacker, B.overmind)
|
||||
return ..()
|
||||
|
||||
/datum/blob_type/volatile_alluvium/on_water(obj/structure/blob/B, amount)
|
||||
spawn(1)
|
||||
var/damage = amount * 2
|
||||
B.adjust_integrity(-(damage))
|
||||
if(B && prob(damage))
|
||||
B.visible_message("<span class='danger'>The [name] begins to crumble!</span>")
|
||||
|
||||
@@ -29,8 +29,7 @@
|
||||
///////////////
|
||||
//SOUND STUFF//
|
||||
///////////////
|
||||
var/ambience_playing= null
|
||||
var/played = 0
|
||||
var/time_last_ambience_played = 0 // world.time when ambience was played to this client, to space out ambience sounds.
|
||||
|
||||
////////////
|
||||
//SECURITY//
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
log_client_to_db()
|
||||
|
||||
send_resources()
|
||||
nanomanager.send_resources(src)
|
||||
GLOB.nanomanager.send_resources(src)
|
||||
|
||||
if(!void)
|
||||
void = new()
|
||||
|
||||
@@ -39,6 +39,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
S["synth_markings"] >> pref.synth_markings
|
||||
pref.preview_icon = null
|
||||
S["bgstate"] >> pref.bgstate
|
||||
S["body_descriptors"] >> pref.body_descriptors
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/save_character(var/savefile/S)
|
||||
S["species"] << pref.species
|
||||
@@ -68,6 +69,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
S["synth_blue"] << pref.b_synth
|
||||
S["synth_markings"] << pref.synth_markings
|
||||
S["bgstate"] << pref.bgstate
|
||||
S["body_descriptors"] << pref.body_descriptors
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S)
|
||||
if(!pref.species || !(pref.species in playable_species))
|
||||
@@ -142,6 +144,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
if(!status)
|
||||
continue
|
||||
var/obj/item/organ/I = character.internal_organs_by_name[name]
|
||||
if(istype(I, /obj/item/organ/internal/brain))
|
||||
var/obj/item/organ/external/E = character.get_organ(I.parent_organ)
|
||||
if(E.robotic < ORGAN_ASSISTED)
|
||||
continue
|
||||
if(I)
|
||||
if(status == "assisted")
|
||||
I.mechassist()
|
||||
@@ -163,6 +169,21 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
if(O)
|
||||
O.markings[M] = list("color" = mark_color, "datum" = mark_datum)
|
||||
|
||||
var/list/last_descriptors = list()
|
||||
if(islist(pref.body_descriptors))
|
||||
last_descriptors = pref.body_descriptors.Copy()
|
||||
pref.body_descriptors = list()
|
||||
|
||||
var/datum/species/mob_species = all_species[pref.species]
|
||||
if(LAZYLEN(mob_species.descriptors))
|
||||
for(var/entry in mob_species.descriptors)
|
||||
var/datum/mob_descriptor/descriptor = mob_species.descriptors[entry]
|
||||
if(istype(descriptor))
|
||||
if(isnull(last_descriptors[entry]))
|
||||
pref.body_descriptors[entry] = descriptor.default_value // Species datums have initial default value.
|
||||
else
|
||||
pref.body_descriptors[entry] = Clamp(last_descriptors[entry], 1, LAZYLEN(descriptor.standalone_value_descriptors))
|
||||
|
||||
return
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/content(var/mob/user)
|
||||
@@ -171,7 +192,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.update_preview_icon()
|
||||
user << browse_rsc(pref.preview_icon, "previewicon.png")
|
||||
|
||||
var/mob_species = all_species[pref.species]
|
||||
var/datum/species/mob_species = all_species[pref.species]
|
||||
. += "<table><tr style='vertical-align:top'><td><b>Body</b> "
|
||||
. += "(<a href='?src=\ref[src];random=1'>®</A>)"
|
||||
. += "<br>"
|
||||
@@ -188,8 +209,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
for(var/name in pref.organ_data)
|
||||
var/status = pref.organ_data[name]
|
||||
var/organ_name = null
|
||||
switch(name)
|
||||
|
||||
switch(name)
|
||||
if(BP_TORSO)
|
||||
organ_name = "torso"
|
||||
if(BP_GROIN)
|
||||
@@ -276,6 +297,13 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
else
|
||||
. += "<br><br>"
|
||||
|
||||
if(LAZYLEN(pref.body_descriptors))
|
||||
. += "<table>"
|
||||
for(var/entry in pref.body_descriptors)
|
||||
var/datum/mob_descriptor/descriptor = mob_species.descriptors[entry]
|
||||
. += "<tr><td><b>[capitalize(descriptor.chargen_label)]:</b></td><td>[descriptor.get_standalone_value_descriptor(pref.body_descriptors[entry])]</td><td><a href='?src=\ref[src];change_descriptor=[entry]'>Change</a><br/></td></tr>"
|
||||
. += "</table><br>"
|
||||
|
||||
. += "</td><td><b>Preview</b><br>"
|
||||
. += "<div class='statusDisplay'><center><img src=previewicon.png width=[pref.preview_icon.Width()] height=[pref.preview_icon.Height()]></center></div>"
|
||||
. += "<br><a href='?src=\ref[src];cycle_bg=1'>Cycle background</a>"
|
||||
@@ -325,6 +353,16 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.randomize_appearance_and_body_for()
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["change_descriptor"])
|
||||
if(mob_species.descriptors)
|
||||
var/desc_id = href_list["change_descriptor"]
|
||||
if(pref.body_descriptors[desc_id])
|
||||
var/datum/mob_descriptor/descriptor = mob_species.descriptors[desc_id]
|
||||
var/choice = input("Please select a descriptor.", "Descriptor") as null|anything in descriptor.chargen_value_descriptors
|
||||
if(choice && mob_species.descriptors[desc_id]) // Check in case they sneakily changed species.
|
||||
pref.body_descriptors[desc_id] = descriptor.chargen_value_descriptors[choice]
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["blood_type"])
|
||||
var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in valid_bloodtypes
|
||||
if(new_b_type && CanUseTopic(user))
|
||||
@@ -585,6 +623,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
choice_options = list("Prosthesis")
|
||||
if("Full Body")
|
||||
limb = BP_TORSO
|
||||
second_limb = BP_HEAD
|
||||
third_limb = BP_GROIN
|
||||
choice_options = list("Normal","Prosthesis")
|
||||
|
||||
@@ -593,12 +632,15 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
|
||||
switch(new_state)
|
||||
if("Normal")
|
||||
pref.organ_data[limb] = null
|
||||
pref.rlimb_data[limb] = null
|
||||
if(limb == BP_TORSO)
|
||||
for(var/other_limb in BP_ALL - BP_TORSO)
|
||||
pref.organ_data[other_limb] = null
|
||||
pref.rlimb_data[other_limb] = null
|
||||
pref.organ_data[limb] = null
|
||||
pref.rlimb_data[limb] = null
|
||||
for(var/internal in O_STANDARD)
|
||||
pref.organ_data[internal] = null
|
||||
pref.rlimb_data[internal] = null
|
||||
if(third_limb)
|
||||
pref.organ_data[third_limb] = null
|
||||
pref.rlimb_data[third_limb] = null
|
||||
|
||||
@@ -126,7 +126,7 @@ var/list/_client_preferences_by_type
|
||||
description ="Mob tooltips"
|
||||
key = "MOB_TOOLTIPS"
|
||||
enabled_description = "Show"
|
||||
disabled_description = "Hide"
|
||||
disabled_description = "Hide"
|
||||
|
||||
/datum/client_preference/attack_icons
|
||||
description ="Attack icons"
|
||||
@@ -207,6 +207,10 @@ var/list/_client_preferences_by_type
|
||||
PH.set_ao(VIS_OBJS, enabled)
|
||||
PH.set_ao(VIS_MOBS, enabled)
|
||||
|
||||
/datum/client_preference/instrument_toggle
|
||||
description ="Hear In-game Instruments"
|
||||
key = "SOUND_INSTRUMENT"
|
||||
|
||||
/********************
|
||||
* Staff Preferences *
|
||||
********************/
|
||||
|
||||
@@ -7,4 +7,8 @@
|
||||
|
||||
/datum/gear/ears/headphones
|
||||
display_name = "headphones"
|
||||
path = /obj/item/clothing/ears/earmuffs/headphones
|
||||
path = /obj/item/clothing/ears/earmuffs/headphones
|
||||
|
||||
/datum/gear/ears/circuitry
|
||||
display_name = "earwear, circuitry (empty)"
|
||||
path = /obj/item/clothing/ears/circuitry
|
||||
@@ -121,3 +121,7 @@
|
||||
/datum/gear/eyes/sun/prescriptionsun
|
||||
display_name = "sunglasses, presciption (Security/Command)"
|
||||
path = /obj/item/clothing/glasses/sunglasses/prescription
|
||||
|
||||
/datum/gear/eyes/circuitry
|
||||
display_name = "goggles, circuitry (empty)"
|
||||
path = /obj/item/clothing/glasses/circuitry
|
||||
@@ -98,4 +98,8 @@
|
||||
ringtype["ring, glass"] = /obj/item/clothing/gloves/ring/material/glass
|
||||
ringtype["ring, wood"] = /obj/item/clothing/gloves/ring/material/wood
|
||||
ringtype["ring, plastic"] = /obj/item/clothing/gloves/ring/material/plastic
|
||||
gear_tweaks += new/datum/gear_tweak/path(ringtype)
|
||||
gear_tweaks += new/datum/gear_tweak/path(ringtype)
|
||||
|
||||
/datum/gear/gloves/circuitry
|
||||
display_name = "gloves, circuitry (empty)"
|
||||
path = /obj/item/clothing/gloves/circuitry
|
||||
@@ -372,3 +372,7 @@
|
||||
/datum/gear/head/surgical/purple
|
||||
display_name = "surgical cap, purple"
|
||||
path = /obj/item/clothing/head/surgery/purple
|
||||
|
||||
/datum/gear/head/circuitry
|
||||
display_name = "headwear, circuitry (empty)"
|
||||
path = /obj/item/clothing/head/circuitry
|
||||
@@ -227,3 +227,7 @@
|
||||
display_name = "hydroponics winter boots"
|
||||
path = /obj/item/clothing/shoes/boots/winter/hydro
|
||||
allowed_roles = list("Botanist", "Xenobiologist")
|
||||
|
||||
/datum/gear/shoes/circuitry
|
||||
display_name = "boots, circuitry (empty)"
|
||||
path = /obj/item/clothing/shoes/circuitry
|
||||
|
||||
@@ -456,4 +456,8 @@
|
||||
|
||||
/datum/gear/uniform/westernbustle
|
||||
display_name = "western bustle"
|
||||
path = /obj/item/clothing/under/dress/westernbustle
|
||||
path = /obj/item/clothing/under/dress/westernbustle
|
||||
|
||||
/datum/gear/uniform/circuitry
|
||||
display_name = "jumpsuit, circuitry (empty)"
|
||||
path = /obj/item/clothing/under/circuitry
|
||||
@@ -107,29 +107,29 @@
|
||||
|
||||
/datum/gear/uniform/undercoat
|
||||
display_name = "undercoat selection (Teshari)"
|
||||
path = /obj/item/clothing/under/seromi/undercoat
|
||||
path = /obj/item/clothing/under/seromi/undercoat/standard
|
||||
whitelisted = SPECIES_TESHARI
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/uniform/undercoat/New()
|
||||
..()
|
||||
var/list/undercoats = list()
|
||||
for(var/undercoat in typesof(/obj/item/clothing/under/seromi/undercoat))
|
||||
var/obj/item/clothing/under/seromi/undercoat/undercoat_type = undercoat
|
||||
for(var/undercoat in typesof(/obj/item/clothing/under/seromi/undercoat/standard))
|
||||
var/obj/item/clothing/under/seromi/undercoat/standard/undercoat_type = undercoat
|
||||
undercoats[initial(undercoat_type.name)] = undercoat_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(undercoats))
|
||||
|
||||
/datum/gear/suit/cloak
|
||||
display_name = "cloak selection (Teshari)"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/standard
|
||||
whitelisted = SPECIES_TESHARI
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/suit/cloak/New()
|
||||
..()
|
||||
var/list/cloaks = list()
|
||||
for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak))
|
||||
var/obj/item/clothing/suit/storage/seromi/cloak/cloak_type = cloak
|
||||
for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/standard))
|
||||
var/obj/item/clothing/suit/storage/seromi/cloak/standard/cloak_type = cloak
|
||||
cloaks[initial(cloak_type.name)] = cloak_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks))
|
||||
|
||||
@@ -160,4 +160,203 @@
|
||||
for(var/cohesionsuit in (typesof(/obj/item/clothing/under/cohesion)))
|
||||
var/obj/item/clothing/under/cohesion/cohesion_type = cohesionsuit
|
||||
cohesionsuits[initial(cohesion_type.name)] = cohesion_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cohesionsuits))
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cohesionsuits))
|
||||
|
||||
/datum/gear/uniform/dept
|
||||
whitelisted = SPECIES_TESHARI
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/ce
|
||||
display_name = "Teshari Chief Engineer Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/ce
|
||||
allowed_roles = list("Chief Engineer")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/ce_w
|
||||
display_name = "Teshari Chief Engineer Undercoat (White)"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/ce_w
|
||||
allowed_roles = list("Chief Engineer")
|
||||
/*
|
||||
/datum/gear/uniform/undercoat/rd
|
||||
display_name = "cloak, research director"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/rd
|
||||
allowed_roles = list("Research Director")
|
||||
*/
|
||||
/datum/gear/uniform/dept/undercoat/qm
|
||||
display_name = "Teshari Quarter Master Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/qm
|
||||
allowed_roles = list("Quartermaster")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/command
|
||||
display_name = "Teshari Command Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/command
|
||||
allowed_roles = list("Colony Director","Head of Personnel","Head of Security","Chief Engineer","Chief Medical Officer")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/command_g
|
||||
display_name = "Teshari Command Undercoat (gold buttons)"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/command_g
|
||||
allowed_roles = list("Colony Director","Head of Personnel","Head of Security","Chief Engineer","Chief Medical Officer")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/cmo
|
||||
display_name = "Teshari Chief Medical Officer Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/cmo
|
||||
allowed_roles = list("Chief Medical Officer")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/cargo
|
||||
display_name = "Teshari Cargo Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/cargo
|
||||
allowed_roles = list("Cargo Technician","Quartermaster","Shaft Miner")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/mining
|
||||
display_name = "Teshari Mining Undercoat"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/mining
|
||||
allowed_roles = list("Quartermaster","Shaft Miner")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/security
|
||||
display_name = "Teshari Security Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/sec
|
||||
allowed_roles = list("Head of Security","Detective","Warden","Security Officer",)
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/service
|
||||
display_name = "Teshari Service Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/service
|
||||
allowed_roles = list("Head of Personnel","Bartender","Botanist","Janitor","Chef","Librarian")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/engineer
|
||||
display_name = "Teshari Engineer Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/engineer
|
||||
allowed_roles = list("Chief Engineer","Station Engineer")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/atmos
|
||||
display_name = "Teshari Atmos Tech Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/atmos
|
||||
allowed_roles = list("Chief Engineer","Atmospheric Technician")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/research
|
||||
display_name = "Teshari Science Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/sci
|
||||
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/robo
|
||||
display_name = "Teshari Roboticist Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/robo
|
||||
allowed_roles = list("Roboticist")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/medical
|
||||
display_name = "Teshari Medical Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/medical
|
||||
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/chemistry
|
||||
display_name = "Teshari Chemistry Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/chemistry
|
||||
allowed_roles = list("Chemist")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/virology
|
||||
display_name = "Teshari Medical Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/viro
|
||||
allowed_roles = list("Medical Doctor")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/paramedic
|
||||
display_name = "Teshari Paramedic Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/para
|
||||
allowed_roles = list("Paramedic")
|
||||
|
||||
/datum/gear/uniform/dept/undercoat/iaa
|
||||
display_name = "Teshari IAA Undercoat"
|
||||
path = /obj/item/clothing/under/seromi/undercoat/jobs/iaa
|
||||
allowed_roles = list("Internal Affairs Agent")
|
||||
|
||||
/datum/gear/suit/dept/cloak/
|
||||
whitelisted = SPECIES_TESHARI
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/suit/cloak/dept/ce
|
||||
display_name = "Teshari Chief Engineer Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/ce
|
||||
allowed_roles = list("Chief Engineer")
|
||||
/*
|
||||
/datum/gear/suit/cloak/rd
|
||||
display_name = "cloak, research director"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/rd
|
||||
allowed_roles = list("Research Director")
|
||||
*/
|
||||
|
||||
/datum/gear/suit/dept/cloak/qm
|
||||
display_name = "Teshari Quarter Master Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/qm
|
||||
allowed_roles = list("Quartermaster")
|
||||
|
||||
/datum/gear/suit/dept/cloak/command
|
||||
display_name = "Teshari Command Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/command
|
||||
allowed_roles = list("Colony Director","Head of Personnel","Head of Security","Chief Engineer","Chief Medical Officer")
|
||||
|
||||
/datum/gear/suit/dept/cloak/cmo
|
||||
display_name = "Teshari Chief Medical Officer Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/cmo
|
||||
allowed_roles = list("Chief Medical Officer")
|
||||
|
||||
/datum/gear/suit/dept/cloak/cargo
|
||||
display_name = "Teshari Cargo Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/cargo
|
||||
allowed_roles = list("Cargo Technician","Quartermaster","Shaft Miner")
|
||||
|
||||
/datum/gear/suit/dept/cloak/mining
|
||||
display_name = "Teshari Mining Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/mining
|
||||
allowed_roles = list("Quartermaster","Shaft Miner")
|
||||
|
||||
/datum/gear/suit/dept/cloak/security
|
||||
display_name = "Teshari Security Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/sec
|
||||
allowed_roles = list("Head of Security","Detective","Warden","Security Officer",)
|
||||
|
||||
/datum/gear/suit/dept/cloak/service
|
||||
display_name = "Teshari Service Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/service
|
||||
allowed_roles = list("Head of Personnel","Bartender","Botanist","Janitor","Chef","Librarian")
|
||||
|
||||
/datum/gear/suit/dept/cloak/engineer
|
||||
display_name = "Teshari Engineer Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/eningeer
|
||||
allowed_roles = list("Chief Engineer","Station Engineer")
|
||||
|
||||
/datum/gear/suit/dept/cloak/atmos
|
||||
display_name = "Teshari Atmos Tech Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/atmos
|
||||
allowed_roles = list("Chief Engineer","Atmospheric Technician")
|
||||
|
||||
/datum/gear/suit/dept/cloak/research
|
||||
display_name = "Teshari Science Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/sci
|
||||
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist")
|
||||
|
||||
/datum/gear/suit/dept/cloak/robo
|
||||
display_name = "Teshari Roboticist Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/robo
|
||||
allowed_roles = list("Roboticist")
|
||||
|
||||
/datum/gear/suit/dept/cloak/medical
|
||||
display_name = "Teshari Medical Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/medical
|
||||
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
|
||||
|
||||
/datum/gear/suit/dept/cloak/chemistry
|
||||
display_name = "Teshari Chemistry Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/chemistry
|
||||
allowed_roles = list("Chemist")
|
||||
|
||||
/datum/gear/suit/dept/cloak/virology
|
||||
display_name = "Teshari Medical Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/viro
|
||||
allowed_roles = list("Medical Doctor")
|
||||
|
||||
/datum/gear/suit/dept/cloak/paramedic
|
||||
display_name = "Teshari Paramedic Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/para
|
||||
allowed_roles = list("Paramedic")
|
||||
|
||||
/datum/gear/suit/dept/cloak/iaa
|
||||
display_name = "Teshari IAA Cloak"
|
||||
path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/iaa
|
||||
allowed_roles = list("Internal Affairs Agent")
|
||||
|
||||
@@ -92,6 +92,30 @@
|
||||
modifier_type = /datum/modifier/trait/larger
|
||||
mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/small, /datum/trait/modifier/physical/large)
|
||||
|
||||
/datum/trait/modifier/physical/colorblind_protanopia
|
||||
name = "Protanopia"
|
||||
desc = "You have a form of red-green colorblindness. You cannot see reds, and have trouble distinguishing them from yellows and greens."
|
||||
modifier_type = /datum/modifier/trait/colorblind_protanopia
|
||||
mutually_exclusive = list(/datum/trait/modifier/physical/colorblind_deuteranopia, /datum/trait/modifier/physical/colorblind_tritanopia, /datum/trait/modifier/physical/colorblind_monochrome)
|
||||
|
||||
/datum/trait/modifier/physical/colorblind_deuteranopia
|
||||
name = "Deuteranopia"
|
||||
desc = "You have a form of red-green colorblindness. You cannot see greens, and have trouble distinguishing them from yellows and reds."
|
||||
modifier_type = /datum/modifier/trait/colorblind_deuteranopia
|
||||
mutually_exclusive = list(/datum/trait/modifier/physical/colorblind_protanopia, /datum/trait/modifier/physical/colorblind_tritanopia, /datum/trait/modifier/physical/colorblind_monochrome)
|
||||
|
||||
/datum/trait/modifier/physical/colorblind_tritanopia
|
||||
name = "Tritanopia"
|
||||
desc = "You have a form of blue-yellow colorblindness. You have trouble distinguishing between blues, greens, and yellows, and see blues and violets as dim."
|
||||
modifier_type = /datum/modifier/trait/colorblind_tritanopia
|
||||
mutually_exclusive = list(/datum/trait/modifier/physical/colorblind_protanopia, /datum/trait/modifier/physical/colorblind_deuteranopia, /datum/trait/modifier/physical/colorblind_monochrome)
|
||||
|
||||
/datum/trait/modifier/physical/colorblind_monochrome
|
||||
name = "Monochromacy"
|
||||
desc = "You are fully colorblind. Your condition is rare, but you can see no colors at all."
|
||||
modifier_type = /datum/modifier/trait/colorblind_monochrome
|
||||
mutually_exclusive = list(/datum/trait/modifier/physical/colorblind_protanopia, /datum/trait/modifier/physical/colorblind_deuteranopia, /datum/trait/modifier/physical/colorblind_tritanopia)
|
||||
|
||||
// These two traits might be borderline, feel free to remove if they get abused.
|
||||
/datum/trait/modifier/physical/high_metabolism
|
||||
name = "High Metabolism"
|
||||
|
||||
@@ -60,7 +60,7 @@ datum/preferences
|
||||
var/r_synth //Used with synth_color to color synth parts that normaly can't be colored.
|
||||
var/g_synth //Same as above
|
||||
var/b_synth //Same as above
|
||||
var/synth_markings = 1 //VOREStation edit. Enable/disable markings on synth parts.
|
||||
var/synth_markings = 1 //Enable/disable markings on synth parts. //VOREStation Edit - 1 by default
|
||||
|
||||
//Some faction information.
|
||||
var/home_system = "Unset" //System of birth.
|
||||
@@ -104,6 +104,8 @@ datum/preferences
|
||||
var/list/flavor_texts = list()
|
||||
var/list/flavour_texts_robot = list()
|
||||
|
||||
var/list/body_descriptors = list()
|
||||
|
||||
var/med_record = ""
|
||||
var/sec_record = ""
|
||||
var/gen_record = ""
|
||||
@@ -300,6 +302,10 @@ datum/preferences
|
||||
character.update_underwear()
|
||||
character.update_hair()
|
||||
|
||||
if(LAZYLEN(character.descriptors))
|
||||
for(var/entry in body_descriptors)
|
||||
character.descriptors[entry] = body_descriptors[entry]
|
||||
|
||||
/datum/preferences/proc/open_load_dialog(mob/user)
|
||||
var/dat = "<body>"
|
||||
dat += "<tt><center>"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear all mob speech as a ghost."
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear all mob speech as a ghost.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] see all emotes as a ghost."
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] see all emotes as a ghost.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear all radios as a ghost."
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear all radios as a ghost.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear dead chat as a ghost."
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear dead chat as a ghost.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
src << "You will [ (is_preference_enabled(/datum/client_preference/show_ooc)) ? "now" : "no longer"] hear global out of character chat."
|
||||
to_chat(src,"You will [ (is_preference_enabled(/datum/client_preference/show_ooc)) ? "now" : "no longer"] hear global out of character chat.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear local out of character chat."
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear local out of character chat.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] have the speech indicator."
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] have the speech indicator.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] receive noise from admin messages."
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] receive noise from admin messages.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear music in the lobby."
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear music in the lobby.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : " no longer"] hear MIDIs from admins."
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : " no longer"] hear MIDIs from admins.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : " no longer"] hear ambient noise."
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : " no longer"] hear ambient noise.")
|
||||
|
||||
prefs.save_preferences()
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
prefs.be_special ^= role_flag
|
||||
prefs.save_preferences()
|
||||
|
||||
src << "You will [(prefs.be_special & role_flag) ? "now" : "no longer"] be considered for [role] events (where possible)."
|
||||
to_chat(src,"You will [(prefs.be_special & role_flag) ? "now" : "no longer"] be considered for [role] events (where possible).")
|
||||
|
||||
feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -203,7 +203,7 @@
|
||||
toggle_preference(pref_path)
|
||||
prefs.save_preferences()
|
||||
|
||||
src << "You will now use [(is_preference_enabled(/datum/client_preference/safefiring)) ? "safe" : "dangerous"] firearms firing."
|
||||
to_chat(src,"You will now use [(is_preference_enabled(/datum/client_preference/safefiring)) ? "safe" : "dangerous"] firearms firing.")
|
||||
|
||||
feedback_add_details("admin_verb","TFiringMode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -216,10 +216,23 @@
|
||||
toggle_preference(pref_path)
|
||||
prefs.save_preferences()
|
||||
|
||||
src << "You will now [(is_preference_enabled(/datum/client_preference/mob_tooltips)) ? "see" : "not see"] mob tooltips."
|
||||
to_chat(src,"You will now [(is_preference_enabled(/datum/client_preference/mob_tooltips)) ? "see" : "not see"] mob tooltips.")
|
||||
|
||||
feedback_add_details("admin_verb","TMobTooltips") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggle_hear_instruments()
|
||||
set name = "Toggle Hear/Ignore Instruments"
|
||||
set category = "Preferences"
|
||||
set desc = "Hear In-game Instruments"
|
||||
|
||||
var/pref_path = /datum/client_preference/instrument_toggle
|
||||
toggle_preference(pref_path)
|
||||
prefs.save_preferences()
|
||||
|
||||
to_chat(src, "You will now [(is_preference_enabled(/datum/client_preference/instrument_toggle)) ? "hear" : "not hear"] instruments being played.")
|
||||
|
||||
feedback_add_details("admin_verb","THInstm") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
//Toggles for Staff
|
||||
//Developers
|
||||
|
||||
@@ -232,7 +245,7 @@
|
||||
|
||||
if(check_rights(R_ADMIN|R_DEBUG))
|
||||
toggle_preference(pref_path)
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] receive debug logs."
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] receive debug logs.")
|
||||
prefs.save_preferences()
|
||||
|
||||
feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -247,7 +260,7 @@
|
||||
|
||||
if(check_rights(R_ADMIN|R_MOD))
|
||||
toggle_preference(pref_path)
|
||||
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] receive attack logs."
|
||||
to_chat(src,"You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] receive attack logs.")
|
||||
prefs.save_preferences()
|
||||
|
||||
feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -231,7 +231,7 @@
|
||||
return 0 // return 1 to cancel attack_hand()
|
||||
|
||||
/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user)
|
||||
if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel))
|
||||
if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel))
|
||||
if (clipped)
|
||||
user << "<span class='notice'>The [src] have already been clipped!</span>"
|
||||
update_icon()
|
||||
|
||||
@@ -60,6 +60,7 @@ BLIND // can't see anything
|
||||
to_chat(usr, "You activate the optical matrix on the [src].")
|
||||
user.update_action_buttons()
|
||||
user.recalculate_vis()
|
||||
..()
|
||||
|
||||
/obj/item/clothing/glasses/meson
|
||||
name = "optical meson scanner"
|
||||
@@ -145,7 +146,7 @@ BLIND // can't see anything
|
||||
/obj/item/clothing/glasses/night/vox
|
||||
name = "Alien Optics"
|
||||
species_restricted = list("Vox")
|
||||
phoronproof = 1
|
||||
flags = PHORONGUARD
|
||||
|
||||
/obj/item/clothing/glasses/night/New()
|
||||
..()
|
||||
|
||||
@@ -18,12 +18,12 @@
|
||||
arscreen = new arscreen_path(src)
|
||||
|
||||
/obj/item/clothing/glasses/omnihud/Destroy()
|
||||
qdel_null(arscreen)
|
||||
QDEL_NULL(arscreen)
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/glasses/omnihud/dropped()
|
||||
if(arscreen)
|
||||
nanomanager.close_uis(src)
|
||||
GLOB.nanomanager.close_uis(src)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/glasses/omnihud/emp_act(var/severity)
|
||||
|
||||
@@ -4,11 +4,13 @@
|
||||
icon_state = "boxing"
|
||||
item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red")
|
||||
|
||||
/*
|
||||
/obj/item/clothing/gloves/boxing/attackby(obj/item/weapon/W, mob/user)
|
||||
if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/surgical/scalpel))
|
||||
if(W.is_wirecutter() || istype(W, /obj/item/weapon/surgical/scalpel))
|
||||
user << "<span class='notice'>That won't work.</span>" //Nope
|
||||
return
|
||||
..()
|
||||
*/
|
||||
|
||||
/obj/item/clothing/gloves/boxing/green
|
||||
icon_state = "boxinggreen"
|
||||
|
||||
@@ -105,9 +105,8 @@
|
||||
name = "insulated gauntlets"
|
||||
icon_state = "gloves-vox"
|
||||
item_state = "gloves-vox"
|
||||
item_flags = PHORONGUARD
|
||||
flags = PHORONGUARD
|
||||
siemens_coefficient = 0
|
||||
phoronproof = 1
|
||||
permeability_coefficient = 0.05
|
||||
species_restricted = list("Vox")
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
restricted_accessory_slots = (ACCESSORY_SLOT_HELM_C)
|
||||
flags = THICKMATERIAL
|
||||
armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS|HIDEEYES
|
||||
flags_inv = HIDEEARS|BLOCKHEADHAIR
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = HELMET_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
heat_protection = HEAD
|
||||
@@ -62,7 +62,6 @@
|
||||
icon_state = "riot"
|
||||
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
|
||||
armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS
|
||||
siemens_coefficient = 0.7
|
||||
valid_accessory_slots = null
|
||||
action_button_name = "Toggle Visor"
|
||||
@@ -82,7 +81,6 @@
|
||||
icon_state = "helmet_reflec"
|
||||
item_state_slots = list(slot_r_hand_str = "helmet", slot_l_hand_str = "helmet")
|
||||
armor = list(melee = 10, bullet = 10, laser = 80 ,energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS
|
||||
siemens_coefficient = 0.1
|
||||
valid_accessory_slots = null
|
||||
|
||||
@@ -92,7 +90,6 @@
|
||||
icon_state = "helmet_bulletproof"
|
||||
item_state_slots = list(slot_r_hand_str = "helmet", slot_l_hand_str = "helmet")
|
||||
armor = list(melee = 10, bullet = 80, laser = 10 ,energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS
|
||||
siemens_coefficient = 0.7
|
||||
valid_accessory_slots = null
|
||||
|
||||
@@ -102,7 +99,7 @@
|
||||
icon_state = "helmet_combat"
|
||||
item_state_slots = list(slot_r_hand_str = "helmet", slot_l_hand_str = "helmet")
|
||||
armor = list(melee = 50, bullet = 50, laser = 50 ,energy = 30, bomb = 30, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS
|
||||
flags_inv = HIDEEARS|HIDEEYES|BLOCKHEADHAIR
|
||||
siemens_coefficient = 0.6
|
||||
valid_accessory_slots = null
|
||||
|
||||
@@ -111,7 +108,7 @@
|
||||
desc = "They're often used by highly trained SWAT Officers."
|
||||
icon_state = "swat"
|
||||
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
|
||||
flags_inv = HIDEEARS|HIDEEYES
|
||||
flags_inv = HIDEEARS|HIDEEYES|BLOCKHEADHAIR
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
siemens_coefficient = 0.5
|
||||
@@ -142,8 +139,7 @@
|
||||
desc = "Ave, Imperator, morituri te salutant."
|
||||
icon_state = "gladiator"
|
||||
item_state_slots = list(slot_r_hand_str = "vhelmet", slot_l_hand_str = "vhelmet")
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|BLOCKHAIR
|
||||
siemens_coefficient = 1
|
||||
valid_accessory_slots = null
|
||||
|
||||
@@ -158,7 +154,7 @@
|
||||
)
|
||||
|
||||
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS
|
||||
flags_inv = HIDEEARS|BLOCKHAIR
|
||||
siemens_coefficient = 0.7
|
||||
valid_accessory_slots = null
|
||||
|
||||
@@ -168,7 +164,7 @@
|
||||
icon_state = "v62"
|
||||
item_state_slots = list(slot_r_hand_str = "head_m", slot_l_hand_str = "head_m")
|
||||
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
|
||||
flags_inv = HIDEEARS|HIDEEYES
|
||||
flags_inv = HIDEEARS|HIDEEYES|BLOCKHEADHAIR
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
siemens_coefficient = 0.5
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
/obj/item/clothing/head/hood
|
||||
name = "hood"
|
||||
desc = "A generic hood."
|
||||
icon_state = "generic_hood"
|
||||
body_parts_covered = HEAD
|
||||
cold_protection = HEAD
|
||||
flags_inv = HIDEEARS | BLOCKHAIR
|
||||
|
||||
// Winter coats
|
||||
/obj/item/clothing/head/hood/winter
|
||||
name = "winter hood"
|
||||
desc = "A hood attached to a heavy winter jacket."
|
||||
icon_state = "generic_hood"
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
|
||||
/obj/item/clothing/head/hood/winter/captain
|
||||
name = "colony director's winter hood"
|
||||
armor = list(melee = 20, bullet = 15, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/head/hood/winter/security
|
||||
name = "security winter hood"
|
||||
armor = list(melee = 25, bullet = 20, laser = 20, energy = 15, bomb = 20, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/head/hood/winter/medical
|
||||
name = "medical winter hood"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0)
|
||||
|
||||
/obj/item/clothing/head/hood/winter/science
|
||||
name = "science winter hood"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/head/hood/winter/engineering
|
||||
name = "engineering winter hood"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20)
|
||||
|
||||
/obj/item/clothing/head/hood/winter/engineering/atmos
|
||||
name = "atmospherics winter hood"
|
||||
|
||||
/obj/item/clothing/head/hood/winter/hydro
|
||||
name = "hydroponics winter hood"
|
||||
|
||||
/obj/item/clothing/head/hood/winter/cargo
|
||||
name = "cargo winter hood"
|
||||
|
||||
/obj/item/clothing/head/hood/winter/miner
|
||||
name = "mining winter hood"
|
||||
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
// Explorer gear
|
||||
/obj/item/clothing/head/hood/explorer
|
||||
name = "explorer hood"
|
||||
desc = "An armoured hood for exploring harsh environments."
|
||||
icon_state = "explorer"
|
||||
flags = THICKMATERIAL
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
siemens_coefficient = 0.9
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35)
|
||||
|
||||
// Costumes
|
||||
/obj/item/clothing/head/hood/carp_hood
|
||||
name = "carp hood"
|
||||
desc = "A hood attached to a carp costume."
|
||||
icon_state = "carp_casual"
|
||||
item_state_slots = list(slot_r_hand_str = "carp_casual", slot_l_hand_str = "carp_casual") //Does not exist -S2-
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE //Space carp like space, so you should too
|
||||
|
||||
/obj/item/clothing/head/hood/ian_hood
|
||||
name = "corgi hood"
|
||||
desc = "A hood that looks just like a corgi's head, it won't guarantee dog biscuits."
|
||||
icon_state = "ian"
|
||||
item_state_slots = list(slot_r_hand_str = "ian", slot_l_hand_str = "ian") //Does not exist -S2-
|
||||
@@ -59,14 +59,31 @@
|
||||
siemens_coefficient = 0.7
|
||||
body_parts_covered = FACE|EYES
|
||||
|
||||
// Vox mask, has special code for eating
|
||||
/obj/item/clothing/mask/gas/swat/vox
|
||||
name = "\improper alien mask"
|
||||
desc = "Clearly not designed for a human face."
|
||||
body_parts_covered = 0 //Hack to allow vox to eat while wearing this mask.
|
||||
item_flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | PHORONGUARD
|
||||
phoronproof = 1
|
||||
flags = PHORONGUARD
|
||||
item_flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
filtered_gases = list("oxygen", "sleeping_agent")
|
||||
var/mask_open = FALSE // Controls if the Vox can eat through this mask
|
||||
action_button_name = "Toggle Feeding Port"
|
||||
|
||||
/obj/item/clothing/mask/gas/swat/vox/proc/feeding_port(mob/user)
|
||||
if(user.canmove && !user.stat)
|
||||
mask_open = !mask_open
|
||||
if(mask_open)
|
||||
body_parts_covered = EYES
|
||||
to_chat(user, "Your mask moves to allow you to eat.")
|
||||
else
|
||||
body_parts_covered = FACE|EYES
|
||||
to_chat(user, "Your mask moves to cover your mouth.")
|
||||
return
|
||||
|
||||
/obj/item/clothing/mask/gas/swat/vox/attack_self(mob/user)
|
||||
feeding_port(user)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/mask/gas/syndicate
|
||||
name = "tactical mask"
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
/obj/item/clothing/gloves/ring/reagent/sleepy/New()
|
||||
..()
|
||||
reagents.add_reagent(/datum/reagent/chloralhydrate, 15) // Less than a sleepy-pen, but still enough to knock someone out
|
||||
reagents.add_reagent("chloralhydrate", 15) // Less than a sleepy-pen, but still enough to knock someone out
|
||||
|
||||
/////////////////////////////////////////
|
||||
//Seals and Signet Rings
|
||||
|
||||
@@ -86,8 +86,7 @@
|
||||
name = "vox magclaws"
|
||||
item_state = "boots-vox"
|
||||
icon_state = "boots-vox"
|
||||
item_flags = PHORONGUARD
|
||||
phoronproof = 1
|
||||
flags = PHORONGUARD
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
|
||||
action_button_name = "Toggle the magclaws"
|
||||
|
||||
@@ -31,10 +31,9 @@
|
||||
// Can't be equipped by any other species due to bone structure and vox cybernetics.
|
||||
/obj/item/clothing/suit/space/vox
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | PHORONGUARD
|
||||
flags = PHORONGUARD
|
||||
item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank)
|
||||
phoronproof = 1
|
||||
slowdown = 0.5
|
||||
armor = list(melee = 60, bullet = 50, laser = 40,energy = 15, bomb = 30, bio = 100, rad = 50)
|
||||
siemens_coefficient = 0.2
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
@@ -44,9 +43,9 @@
|
||||
/obj/item/clothing/head/helmet/space/vox
|
||||
armor = list(melee = 60, bullet = 50, laser = 40, energy = 15, bomb = 30, bio = 100, rad = 50)
|
||||
siemens_coefficient = 0.2
|
||||
item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT | PHORONGUARD
|
||||
flags = PHORONGUARD
|
||||
item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT
|
||||
flags_inv = 0
|
||||
phoronproof = 1
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/vox/pressure
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
var/mob/living/carbon/human/H = holder.wearer
|
||||
to_chat(H,"<span class='notice'>You activate the P.A.T. module.</span>")
|
||||
moved_event.register(H, src, /obj/item/rig_module/pat_module/proc/boop)
|
||||
GLOB.moved_event.register(H, src, /obj/item/rig_module/pat_module/proc/boop)
|
||||
|
||||
/obj/item/rig_module/pat_module/deactivate()
|
||||
if(!..())
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
var/mob/living/carbon/human/H = holder.wearer
|
||||
to_chat(H,"<span class='notice'>Your disable the P.A.T. module.</span>")
|
||||
moved_event.unregister(H, src)
|
||||
GLOB.moved_event.unregister(H, src)
|
||||
|
||||
/obj/item/rig_module/pat_module/proc/boop(var/mob/living/carbon/human/user,var/turf/To,var/turf/Tn)
|
||||
if(!istype(user) || !istype(To) || !istype(Tn))
|
||||
|
||||
@@ -590,7 +590,7 @@
|
||||
if(module_list.len)
|
||||
data["modules"] = module_list
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, ((src.loc != user) ? ai_interface_path : interface_path), interface_title, 480, 550, state = nano_state)
|
||||
ui.set_initial_data(data)
|
||||
@@ -988,15 +988,10 @@
|
||||
// AIs are a bit slower than regular and ignore move intent.
|
||||
wearer_move_delay = world.time + ai_controlled_move_delay
|
||||
|
||||
var/tickcomp = 0
|
||||
if(config.Tickcomp)
|
||||
tickcomp = ((1/(world.tick_lag))*1.3) - 1.3
|
||||
wearer_move_delay += tickcomp
|
||||
|
||||
if(istype(wearer.buckled, /obj/vehicle))
|
||||
//manually set move_delay for vehicles so we don't inherit any mob movement penalties
|
||||
//specific vehicle move delays are set in code\modules\vehicles\vehicle.dm
|
||||
wearer_move_delay = world.time + tickcomp
|
||||
wearer_move_delay = world.time
|
||||
return wearer.buckled.relaymove(wearer, direction)
|
||||
|
||||
if(istype(wearer.machine, /obj/machinery))
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/weapon/rig/attackby(obj/item/W as obj, mob/living/user as mob)
|
||||
|
||||
if(!istype(user)) return 0
|
||||
if(!istype(user))
|
||||
return 0
|
||||
|
||||
if(electrified != 0)
|
||||
if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here.
|
||||
@@ -14,78 +14,79 @@
|
||||
if(W.GetID())
|
||||
if(subverted)
|
||||
locked = 0
|
||||
user << "<span class='danger'>It looks like the locking system has been shorted out.</span>"
|
||||
to_chat(user, "<span class='danger'>It looks like the locking system has been shorted out.</span>")
|
||||
return
|
||||
|
||||
if((!req_access || !req_access.len) && (!req_one_access || !req_one_access.len))
|
||||
locked = 0
|
||||
user << "<span class='danger'>\The [src] doesn't seem to have a locking mechanism.</span>"
|
||||
to_chat(user, "<span class='danger'>\The [src] doesn't seem to have a locking mechanism.</span>")
|
||||
return
|
||||
|
||||
if(security_check_enabled && !src.allowed(user))
|
||||
user << "<span class='danger'>Access denied.</span>"
|
||||
to_chat(user, "<span class='danger'>Access denied.</span>")
|
||||
return
|
||||
|
||||
locked = !locked
|
||||
user << "You [locked ? "lock" : "unlock"] \the [src] access panel."
|
||||
to_chat(user, "You [locked ? "lock" : "unlock"] \the [src] access panel.")
|
||||
return
|
||||
|
||||
else if(istype(W,/obj/item/weapon/crowbar))
|
||||
|
||||
else if(W.is_crowbar())
|
||||
if(!open && locked)
|
||||
user << "The access panel is locked shut."
|
||||
to_chat(user, "The access panel is locked shut.")
|
||||
return
|
||||
|
||||
open = !open
|
||||
user << "You [open ? "open" : "close"] the access panel."
|
||||
to_chat(user, "You [open ? "open" : "close"] the access panel.")
|
||||
return
|
||||
|
||||
if(open)
|
||||
|
||||
// Hacking.
|
||||
if(istype(W,/obj/item/weapon/wirecutters) || istype(W,/obj/item/device/multitool))
|
||||
if(W.is_wirecutter() || istype(W, /obj/item/device/multitool))
|
||||
if(open)
|
||||
wires.Interact(user)
|
||||
else
|
||||
user << "You can't reach the wiring."
|
||||
to_chat(user, "You can't reach the wiring.")
|
||||
return
|
||||
// Air tank.
|
||||
if(istype(W,/obj/item/weapon/tank)) //Todo, some kind of check for suits without integrated air supplies.
|
||||
|
||||
if(air_supply)
|
||||
user << "\The [src] already has a tank installed."
|
||||
to_chat(user, "\The [src] already has a tank installed.")
|
||||
return
|
||||
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
|
||||
if(!user.unEquip(W)) return
|
||||
air_supply = W
|
||||
W.forceMove(src)
|
||||
user << "You slot [W] into [src] and tighten the connecting valve."
|
||||
to_chat(user, "You slot [W] into [src] and tighten the connecting valve.")
|
||||
return
|
||||
|
||||
// Check if this is a hardsuit upgrade or a modification.
|
||||
else if(istype(W,/obj/item/rig_module))
|
||||
|
||||
if(istype(src.loc,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src.loc
|
||||
if(H.back == src)
|
||||
user << "<span class='danger'>You can't install a hardsuit module while the suit is being worn.</span>"
|
||||
to_chat(user, "<span class='danger'>You can't install a hardsuit module while the suit is being worn.</span>")
|
||||
return 1
|
||||
|
||||
if(!installed_modules) installed_modules = list()
|
||||
if(!installed_modules)
|
||||
installed_modules = list()
|
||||
if(installed_modules.len)
|
||||
for(var/obj/item/rig_module/installed_mod in installed_modules)
|
||||
if(!installed_mod.redundant && istype(installed_mod,W))
|
||||
user << "The hardsuit already has a module of that class installed."
|
||||
to_chat(user, "The hardsuit already has a module of that class installed.")
|
||||
return 1
|
||||
|
||||
var/obj/item/rig_module/mod = W
|
||||
user << "You begin installing \the [mod] into \the [src]."
|
||||
to_chat(user, "You begin installing \the [mod] into \the [src].")
|
||||
if(!do_after(user,40))
|
||||
return
|
||||
if(!user || !W)
|
||||
return
|
||||
if(!user.unEquip(mod)) return
|
||||
user << "You install \the [mod] into \the [src]."
|
||||
if(!user.unEquip(mod))
|
||||
return
|
||||
to_chat(user, "You install \the [mod] into \the [src].")
|
||||
installed_modules |= mod
|
||||
mod.forceMove(src)
|
||||
mod.installed(src)
|
||||
@@ -94,27 +95,28 @@
|
||||
|
||||
else if(!cell && istype(W,/obj/item/weapon/cell))
|
||||
|
||||
if(!user.unEquip(W)) return
|
||||
user << "You jack \the [W] into \the [src]'s battery mount."
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
to_chat(user, "You jack \the [W] into \the [src]'s battery mount.")
|
||||
W.forceMove(src)
|
||||
src.cell = W
|
||||
return
|
||||
|
||||
else if(istype(W,/obj/item/weapon/wrench))
|
||||
else if(W.is_wrench())
|
||||
|
||||
if(!air_supply)
|
||||
user << "There is not tank to remove."
|
||||
to_chat(user, "There is not tank to remove.")
|
||||
return
|
||||
|
||||
if(user.r_hand && user.l_hand)
|
||||
air_supply.forceMove(get_turf(user))
|
||||
else
|
||||
user.put_in_hands(air_supply)
|
||||
user << "You detach and remove \the [air_supply]."
|
||||
to_chat(user, "You detach and remove \the [air_supply].")
|
||||
air_supply = null
|
||||
return
|
||||
|
||||
else if(istype(W,/obj/item/weapon/screwdriver))
|
||||
else if(W.is_screwdriver())
|
||||
|
||||
var/list/current_mounts = list()
|
||||
if(cell) current_mounts += "cell"
|
||||
@@ -127,7 +129,7 @@
|
||||
if(istype(src.loc,/mob/living/carbon/human) && to_remove != "cell")
|
||||
var/mob/living/carbon/human/H = src.loc
|
||||
if(H.back == src)
|
||||
user << "You can't remove an installed device while the hardsuit is being worn."
|
||||
to_chat(user, "You can't remove an installed device while the hardsuit is being worn.")
|
||||
return
|
||||
|
||||
switch(to_remove)
|
||||
@@ -135,7 +137,7 @@
|
||||
if("cell")
|
||||
|
||||
if(cell)
|
||||
user << "You detatch \the [cell] from \the [src]'s battery mount."
|
||||
to_chat(user, "You detatch \the [cell] from \the [src]'s battery mount.")
|
||||
for(var/obj/item/rig_module/module in installed_modules)
|
||||
module.deactivate()
|
||||
if(user.r_hand && user.l_hand)
|
||||
@@ -144,7 +146,7 @@
|
||||
cell.forceMove(user.put_in_hands(cell))
|
||||
cell = null
|
||||
else
|
||||
user << "There is nothing loaded in that mount."
|
||||
to_chat(user, "There is nothing loaded in that mount.")
|
||||
|
||||
if("system module")
|
||||
|
||||
@@ -155,7 +157,7 @@
|
||||
possible_removals[module.name] = module
|
||||
|
||||
if(!possible_removals.len)
|
||||
user << "There are no installed modules to remove."
|
||||
to_chat(user, "There are no installed modules to remove.")
|
||||
return
|
||||
|
||||
var/removal_choice = input("Which module would you like to remove?") as null|anything in possible_removals
|
||||
@@ -163,7 +165,7 @@
|
||||
return
|
||||
|
||||
var/obj/item/rig_module/removed = possible_removals[removal_choice]
|
||||
user << "You detatch \the [removed] from \the [src]."
|
||||
to_chat(user, "You detatch \the [removed] from \the [src].")
|
||||
removed.forceMove(get_turf(src))
|
||||
removed.removed()
|
||||
installed_modules -= removed
|
||||
@@ -192,5 +194,5 @@
|
||||
req_one_access.Cut()
|
||||
locked = 0
|
||||
subverted = 1
|
||||
user << "<span class='danger'>You short out the access protocol for the suit.</span>"
|
||||
to_chat(user, "<span class='danger'>You short out the access protocol for the suit.</span>")
|
||||
return 1
|
||||
|
||||
@@ -32,11 +32,3 @@
|
||||
SPECIES_VOX = 'icons/mob/species/vox/suit.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/rig
|
||||
phoronproof = 1
|
||||
/obj/item/clothing/gloves/gauntlets/rig
|
||||
phoronproof = 1
|
||||
/obj/item/clothing/shoes/magboots/rig
|
||||
phoronproof = 1
|
||||
/obj/item/clothing/suit/space/rig
|
||||
phoronproof = 1
|
||||
|
||||
@@ -47,11 +47,9 @@
|
||||
suit_type = "alien"
|
||||
icon_state = "vox_rig"
|
||||
armor = list(melee = 60, bullet = 50, laser = 40, energy = 15, bomb = 30, bio = 100, rad = 50)
|
||||
item_flags = THICKMATERIAL
|
||||
item_flags = THICKMATERIAL|PHORONGUARD
|
||||
siemens_coefficient = 0.2
|
||||
phoronproof = 1
|
||||
offline_slowdown = 5
|
||||
slowdown = 2
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
|
||||
|
||||
air_type = /obj/item/weapon/tank/vox
|
||||
@@ -64,7 +62,6 @@
|
||||
/obj/item/clothing/head/helmet/space/rig/vox
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
phoronproof = 1
|
||||
|
||||
/obj/item/clothing/shoes/magboots/rig/vox
|
||||
name = "talons"
|
||||
@@ -72,11 +69,9 @@
|
||||
sprite_sheets = list(
|
||||
SPECIES_VOX = 'icons/mob/species/vox/shoes.dmi'
|
||||
)
|
||||
phoronproof = 1
|
||||
|
||||
/obj/item/clothing/suit/space/rig/vox
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
phoronproof = 1
|
||||
|
||||
/obj/item/clothing/gloves/gauntlets/rig/vox
|
||||
siemens_coefficient = 0
|
||||
@@ -84,14 +79,12 @@
|
||||
sprite_sheets = list(
|
||||
SPECIES_VOX = 'icons/mob/species/vox/gloves.dmi'
|
||||
)
|
||||
phoronproof = 1
|
||||
|
||||
/obj/item/weapon/rig/vox/carapace
|
||||
name = "dense alien control module"
|
||||
suit_type = "dense alien"
|
||||
armor = list(melee = 60, bullet = 50, laser = 40, energy = 15, bomb = 30, bio = 100, rad = 50)
|
||||
emp_protection = 40 //change this to 30 if too high.
|
||||
phoronproof = 1
|
||||
|
||||
req_access = list(access_syndicate)
|
||||
|
||||
@@ -112,7 +105,6 @@
|
||||
icon_state = "voxstealth_rig"
|
||||
armor = list(melee = 40, bullet = 30, laser = 30, energy = 15, bomb = 30, bio = 100, rad = 50)
|
||||
emp_protection = 40 //change this to 30 if too high.
|
||||
phoronproof = 1
|
||||
|
||||
req_access = list(access_syndicate)
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
|
||||
/obj/item/weapon/rig/combat/equipped
|
||||
|
||||
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/mounted,
|
||||
/obj/item/rig_module/vision/thermal,
|
||||
@@ -26,4 +25,59 @@
|
||||
/obj/item/rig_module/power_sink,
|
||||
/obj/item/rig_module/electrowarfare_suite,
|
||||
/obj/item/rig_module/chem_dispenser/combat
|
||||
)
|
||||
)
|
||||
|
||||
/obj/item/weapon/rig/combat/empty
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/electrowarfare_suite,
|
||||
)
|
||||
|
||||
/obj/item/weapon/rig/military
|
||||
name = "military hardsuit control module"
|
||||
desc = "An austere hardsuit used by paramilitary groups and real soldiers alike."
|
||||
icon_state = "military_rig"
|
||||
suit_type = "military hardsuit"
|
||||
armor = list(melee = 80, bullet = 70, laser = 55, energy = 15, bomb = 80, bio = 100, rad = 30)
|
||||
slowdown = 1
|
||||
offline_slowdown = 3
|
||||
offline_vision_restriction = 1
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/handcuffs, \
|
||||
/obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/weldingtool, /obj/item/weapon/tool, /obj/item/device/multitool, \
|
||||
/obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \
|
||||
/obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller, /obj/item/device/suit_cooling_unit)
|
||||
|
||||
chest_type = /obj/item/clothing/suit/space/rig/military
|
||||
helm_type = /obj/item/clothing/head/helmet/space/rig/military
|
||||
boot_type = /obj/item/clothing/shoes/magboots/rig/military
|
||||
glove_type = /obj/item/clothing/gloves/gauntlets/rig/military
|
||||
|
||||
/obj/item/clothing/head/helmet/space/rig/military
|
||||
light_overlay = "helmet_light_dual_green"
|
||||
species_restricted = list(SPECIES_HUMAN,SPECIES_PROMETHEAN)
|
||||
|
||||
/obj/item/clothing/suit/space/rig/military
|
||||
species_restricted = list(SPECIES_HUMAN,SPECIES_PROMETHEAN)
|
||||
|
||||
/obj/item/clothing/shoes/magboots/rig/military
|
||||
species_restricted = list(SPECIES_HUMAN,SPECIES_PROMETHEAN)
|
||||
|
||||
/obj/item/clothing/gloves/gauntlets/rig/military
|
||||
species_restricted = list(SPECIES_HUMAN,SPECIES_PROMETHEAN)
|
||||
|
||||
/obj/item/weapon/rig/military/equipped
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/mounted/egun,
|
||||
/obj/item/rig_module/vision/multi,
|
||||
/obj/item/rig_module/grenade_launcher,
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/power_sink,
|
||||
/obj/item/rig_module/electrowarfare_suite,
|
||||
/obj/item/rig_module/chem_dispenser/combat,
|
||||
)
|
||||
|
||||
/obj/item/weapon/rig/military/empty
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/electrowarfare_suite,
|
||||
)
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
siemens_coefficient= 0.5
|
||||
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \
|
||||
/obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/tool/crowbar, \
|
||||
/obj/item/weapon/tool/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/tool/wirecutters, /obj/item/weapon/tool/wrench, /obj/item/device/multitool, \
|
||||
/obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \
|
||||
/obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller)
|
||||
|
||||
|
||||
@@ -39,12 +39,12 @@
|
||||
|
||||
req_access = list(access_syndicate)
|
||||
|
||||
airtight = 0
|
||||
seal_delay = 5 //not being vaccum-proof has an upside I guess
|
||||
airtight = 1
|
||||
seal_delay = 5 //Being straight out of a cyberpunk space movie has its perks.
|
||||
|
||||
helm_type = /obj/item/clothing/head/lightrig/hacker
|
||||
chest_type = /obj/item/clothing/suit/lightrig/hacker
|
||||
glove_type = /obj/item/clothing/gloves/gauntlets/lightrig/hacker
|
||||
helm_type = /obj/item/clothing/head/helmet/space/rig/light/hacker
|
||||
chest_type = /obj/item/clothing/suit/space/rig/light/hacker
|
||||
glove_type = /obj/item/clothing/gloves/gauntlets/rig/light/hacker
|
||||
boot_type = /obj/item/clothing/shoes/lightrig/hacker
|
||||
|
||||
initial_modules = list(
|
||||
@@ -57,19 +57,20 @@
|
||||
)
|
||||
|
||||
//The cybersuit is not space-proof. It does however, have good siemens_coefficient values
|
||||
/obj/item/clothing/head/lightrig/hacker
|
||||
name = "HUD"
|
||||
/obj/item/clothing/head/helmet/space/rig/light/hacker
|
||||
name = "headgear"
|
||||
siemens_coefficient = 0.4
|
||||
flags = 0
|
||||
flags_inv = HIDEEARS
|
||||
|
||||
/obj/item/clothing/suit/lightrig/hacker
|
||||
/obj/item/clothing/suit/space/rig/light/hacker
|
||||
siemens_coefficient = 0.4
|
||||
|
||||
/obj/item/clothing/shoes/lightrig/hacker
|
||||
siemens_coefficient = 0.4
|
||||
flags = NOSLIP //All the other rigs have magboots anyways, hopefully gives the hacker suit something more going for it.
|
||||
step_volume_mod = 0.3 //Special sneaky cyber-soles, for infiltration.
|
||||
flags = NOSLIP //They're not magboots, so they're not super good for exterior hull walking, BUT for interior infiltration they'll do swell.
|
||||
|
||||
/obj/item/clothing/gloves/gauntlets/lightrig/hacker
|
||||
/obj/item/clothing/gloves/gauntlets/rig/light/hacker
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/weapon/rig/light/ninja
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
/obj/item/clothing/head/helmet/space/rig/pmc
|
||||
light_overlay = "helmet_light_dual"
|
||||
|
||||
/obj/item/weapon/rig/pmc
|
||||
name = "PMC hardsuit control module"
|
||||
desc = "A suit worn by private military contractors. Armoured and space ready."
|
||||
suit_type = "PMC"
|
||||
icon_state = "pmc_commandergrey_rig"
|
||||
|
||||
helm_type = /obj/item/clothing/head/helmet/space/rig/pmc
|
||||
|
||||
req_access = list(access_cent_specops)
|
||||
|
||||
armor = list(melee = 60, bullet = 50, laser = 35,energy = 15, bomb = 30, bio = 100, rad = 95)
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/tool/crowbar, \
|
||||
/obj/item/weapon/tool/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/tool/wirecutters, /obj/item/weapon/tool/wrench, /obj/item/device/multitool, \
|
||||
/obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \
|
||||
/obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller)
|
||||
|
||||
/obj/item/weapon/rig/pmc/commander
|
||||
name = "PMC-C hardsuit control module"
|
||||
desc = "A suit worn by private military contractors. Armoured and space ready."
|
||||
suit_type = "PMC commander"
|
||||
icon_state = "pmc_commandergrey_rig"
|
||||
|
||||
/obj/item/weapon/rig/pmc/commander/grey/equipped
|
||||
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/maneuvering_jets,
|
||||
/obj/item/rig_module/datajack,
|
||||
)
|
||||
|
||||
/obj/item/weapon/rig/pmc/commander/green
|
||||
icon_state = "pmc_commandergreen_rig"
|
||||
|
||||
/obj/item/weapon/rig/pmc/commander/green/equipped
|
||||
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/maneuvering_jets,
|
||||
/obj/item/rig_module/datajack,
|
||||
)
|
||||
|
||||
/obj/item/weapon/rig/pmc/engineer
|
||||
name = "PMC-E suit control module"
|
||||
desc = "A suit worn by private military contractors. This one is setup for engineering. Armoured and space ready."
|
||||
suit_type = "PMC engineer"
|
||||
icon_state = "pmc_engineergrey_rig"
|
||||
armor = list(melee = 60, bullet = 50, laser = 35,energy = 15, bomb = 30, bio = 100, rad = 100)
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/weapon/rig/pmc/engineer/grey/equipped
|
||||
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/maneuvering_jets,
|
||||
/obj/item/rig_module/device/plasmacutter,
|
||||
/obj/item/rig_module/device/rcd
|
||||
)
|
||||
|
||||
/obj/item/weapon/rig/pmc/engineer/green
|
||||
icon_state = "pmc_engineergreen_rig"
|
||||
|
||||
/obj/item/weapon/rig/pmc/engineer/green/equipped
|
||||
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/maneuvering_jets,
|
||||
/obj/item/rig_module/device/plasmacutter,
|
||||
/obj/item/rig_module/device/rcd
|
||||
)
|
||||
|
||||
/obj/item/weapon/rig/pmc/medical
|
||||
name = "PMC-M suit control module"
|
||||
desc = "A suit worn by private military contractors. This one is setup for medical. Armoured and space ready."
|
||||
suit_type = "PMC medic"
|
||||
icon_state = "pmc_medicalgrey_rig"
|
||||
|
||||
/obj/item/weapon/rig/pmc/medical/grey/equipped
|
||||
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/maneuvering_jets,
|
||||
/obj/item/rig_module/device/healthscanner,
|
||||
/obj/item/rig_module/chem_dispenser/injector/advanced
|
||||
)
|
||||
|
||||
/obj/item/weapon/rig/pmc/medical/green
|
||||
icon_state = "pmc_medicalgreen_rig"
|
||||
|
||||
/obj/item/weapon/rig/pmc/medical/green/equipped
|
||||
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/maneuvering_jets,
|
||||
/obj/item/rig_module/device/healthscanner,
|
||||
/obj/item/rig_module/chem_dispenser/injector/advanced
|
||||
)
|
||||
|
||||
/obj/item/weapon/rig/pmc/security
|
||||
name = "ERT-S suit control module"
|
||||
desc = "A suit worn by private military contractors. This one is setup for security. Armoured and space ready."
|
||||
suit_type = "PMC security"
|
||||
icon_state = "pmc_securitygrey_rig"
|
||||
|
||||
/obj/item/weapon/rig/pmc/security/grey/equipped
|
||||
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/maneuvering_jets,
|
||||
/obj/item/rig_module/mounted/egun,
|
||||
)
|
||||
|
||||
/obj/item/weapon/rig/pmc/security/green
|
||||
icon_state = "pmc_securitygreen_rig"
|
||||
|
||||
/obj/item/weapon/rig/pmc/security/green/equipped
|
||||
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/maneuvering_jets,
|
||||
/obj/item/rig_module/mounted/egun,
|
||||
)
|
||||
@@ -30,8 +30,8 @@
|
||||
/obj/item/weapon/rig/combat
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/storage/backpack)
|
||||
/obj/item/weapon/rig/ert
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \
|
||||
/obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/tool/crowbar, \
|
||||
/obj/item/weapon/tool/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/tool/wirecutters, /obj/item/weapon/tool/wrench, /obj/item/device/multitool, \
|
||||
/obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \
|
||||
/obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller, /obj/item/weapon/storage/backpack)
|
||||
/obj/item/weapon/rig/light/ninja
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
name = "Space helmet"
|
||||
icon_state = "space"
|
||||
desc = "A special helmet designed for work in a hazardous, low-pressure environment."
|
||||
flags = PHORONGUARD
|
||||
item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT
|
||||
permeability_coefficient = 0.01
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
|
||||
@@ -16,7 +17,6 @@
|
||||
siemens_coefficient = 0.9
|
||||
species_restricted = list("exclude",SPECIES_DIONA)
|
||||
preserve_item = 1
|
||||
phoronproof = 1
|
||||
flash_protection = FLASH_PROTECTION_MAJOR
|
||||
valid_accessory_slots = null
|
||||
|
||||
@@ -55,7 +55,8 @@
|
||||
w_class = ITEMSIZE_HUGE // So you can't fit this in your bag and be prepared at all times.
|
||||
gas_transfer_coefficient = 0.01
|
||||
permeability_coefficient = 0.02
|
||||
item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL
|
||||
flags = PHORONGUARD
|
||||
item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | PHORONGUARD
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen,/obj/item/device/suit_cooling_unit)
|
||||
slowdown = 3
|
||||
@@ -66,7 +67,6 @@
|
||||
siemens_coefficient = 0.9
|
||||
species_restricted = list("exclude",SPECIES_DIONA)
|
||||
preserve_item = 1
|
||||
phoronproof = 1
|
||||
|
||||
var/list/supporting_limbs //If not-null, automatically splints breaks. Checked when removing the suit.
|
||||
|
||||
|
||||
@@ -244,3 +244,62 @@
|
||||
name = "heavy duty atmos voidsuit"
|
||||
armor = list(melee = 20, bullet = 5, laser = 20,energy = 15, bomb = 45, bio = 100, rad = 50)
|
||||
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
|
||||
//Exploration
|
||||
/obj/item/clothing/head/helmet/space/void/exploration
|
||||
name = "exploration voidsuit helmet"
|
||||
desc = "A radiation-resistant helmet made especially for exploring unknown planetary environments."
|
||||
icon_state = "helm_explorer"
|
||||
item_state = "helm_explorer"
|
||||
item_state_slots = list(slot_r_hand_str = "syndicate-helm-black", slot_l_hand_str = "syndicate-helm-black")
|
||||
armor = list(melee = 40, bullet = 15, laser = 25,energy = 35, bomb = 30, bio = 100, rad = 70)
|
||||
light_overlay = "helmet_light_dual" //explorer_light
|
||||
|
||||
/obj/item/clothing/suit/space/void/exploration
|
||||
name = "exploration voidsuit"
|
||||
desc = "A lightweight, radiation-resistant voidsuit, featuring the Explorer emblem on its chest plate. Designed for exploring unknown planetary environments."
|
||||
icon_state = "void_explorer"
|
||||
item_state_slots = list(slot_r_hand_str = "skrell_suit_black", slot_l_hand_str = "skrell_suit_black")
|
||||
armor = list(melee = 40, bullet = 15, laser = 25,energy = 35, bomb = 30, bio = 100, rad = 70)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/device/healthanalyzer,/obj/item/device/gps,/obj/item/device/radio/beacon, \
|
||||
/obj/item/weapon/shovel,/obj/item/ammo_magazine,/obj/item/weapon/gun)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/exploration/alt
|
||||
desc = "A radiation-resistant helmet retrofitted for exploring unknown planetary environments."
|
||||
icon_state = "helm_explorer2"
|
||||
item_state = "helm_explorer2"
|
||||
item_state_slots = list(slot_r_hand_str = "mining_helm", slot_l_hand_str = "mining_helm")
|
||||
|
||||
/obj/item/clothing/suit/space/void/exploration/alt
|
||||
desc = "A lightweight, radiation-resistant voidsuit. Retrofitted for exploring unknown planetary environments."
|
||||
icon_state = "void_explorer2"
|
||||
item_state_slots = list(slot_r_hand_str = "skrell_suit_white", slot_l_hand_str = "skrell_suit_white")
|
||||
|
||||
//Pilot
|
||||
/obj/item/clothing/head/helmet/space/void/pilot
|
||||
desc = "An atmos resistant helmet for space and planet exploration."
|
||||
name = "pilot voidsuit helmet"
|
||||
icon_state = "rig0_pilot"
|
||||
item_state = "pilot_helm"
|
||||
item_state_slots = list(slot_r_hand_str = "atmos_helm", slot_l_hand_str = "atmos_helm")
|
||||
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 15, bio = 100, rad = 50)
|
||||
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
light_overlay = "helmet_light_dual"
|
||||
|
||||
/obj/item/clothing/suit/space/void/pilot
|
||||
desc = "An atmos resistant voidsuit for space and planet exploration."
|
||||
icon_state = "rig-pilot"
|
||||
item_state_slots = list(slot_r_hand_str = "atmos_voidsuit", slot_l_hand_str = "atmos_voidsuit")
|
||||
name = "pilot voidsuit"
|
||||
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 15, bio = 100, rad = 50)
|
||||
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/toolbox,/obj/item/weapon/storage/briefcase/inflatable)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/pilot/alt
|
||||
icon_state = "rig0_pilot2"
|
||||
item_state = "pilot_helm2"
|
||||
|
||||
/obj/item/clothing/suit/space/void/pilot/alt
|
||||
desc = "An atmos resistant voidsuit for space."
|
||||
icon_state = "rig-pilot2"
|
||||
item_state = "rig-pilot2"
|
||||
@@ -68,9 +68,9 @@
|
||||
var/list/part_list = new
|
||||
for(var/obj/item/I in list(helmet,boots,tank,cooler))
|
||||
part_list += "\a [I]"
|
||||
user << "\The [src] has [english_list(part_list)] installed."
|
||||
to_chat(user, "\The [src] has [english_list(part_list)] installed.")
|
||||
if(tank && in_range(src,user))
|
||||
user << "<span class='notice'>The wrist-mounted pressure gauge reads [max(round(tank.air_contents.return_pressure()),0)] kPa remaining in \the [tank].</span>"
|
||||
to_chat(user, "<span class='notice'>The wrist-mounted pressure gauge reads [max(round(tank.air_contents.return_pressure()),0)] kPa remaining in \the [tank].</span>")
|
||||
|
||||
/obj/item/clothing/suit/space/void/refit_for_species(var/target_species)
|
||||
..()
|
||||
@@ -95,23 +95,23 @@
|
||||
|
||||
if(helmet)
|
||||
if(H.head)
|
||||
M << "You are unable to deploy your suit's helmet as \the [H.head] is in the way."
|
||||
to_chat(M, "You are unable to deploy your suit's helmet as \the [H.head] is in the way.")
|
||||
else if (H.equip_to_slot_if_possible(helmet, slot_head))
|
||||
M << "Your suit's helmet deploys with a hiss."
|
||||
to_chat(M, "Your suit's helmet deploys with a hiss.")
|
||||
helmet.canremove = 0
|
||||
|
||||
if(tank)
|
||||
if(H.s_store) //In case someone finds a way.
|
||||
M << "Alarmingly, the valve on your suit's installed tank fails to engage."
|
||||
to_chat(M, "Alarmingly, the valve on your suit's installed tank fails to engage.")
|
||||
else if (H.equip_to_slot_if_possible(tank, slot_s_store))
|
||||
M << "The valve on your suit's installed tank safely engages."
|
||||
to_chat(M, "The valve on your suit's installed tank safely engages.")
|
||||
tank.canremove = 0
|
||||
|
||||
if(cooler)
|
||||
if(H.s_store) //Ditto
|
||||
M << "Alarmingly, the cooling unit installed into your suit fails to deploy."
|
||||
to_chat(M, "Alarmingly, the cooling unit installed into your suit fails to deploy.")
|
||||
else if (H.equip_to_slot_if_possible(cooler, slot_s_store))
|
||||
M << "Your suit's cooling unit deploys."
|
||||
to_chat(M, "Your suit's cooling unit deploys.")
|
||||
cooler.canremove = 0
|
||||
|
||||
|
||||
@@ -153,28 +153,31 @@
|
||||
if(!istype(src.loc,/mob/living)) return
|
||||
|
||||
if(!helmet)
|
||||
usr << "There is no helmet installed."
|
||||
to_chat(usr, "There is no helmet installed.")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = usr
|
||||
|
||||
if(!istype(H)) return
|
||||
if(H.stat) return
|
||||
if(H.wear_suit != src) return
|
||||
if(!istype(H))
|
||||
return
|
||||
if(H.stat)
|
||||
return
|
||||
if(H.wear_suit != src)
|
||||
return
|
||||
|
||||
if(H.head == helmet)
|
||||
H << "<span class='notice'>You retract your suit helmet.</span>"
|
||||
to_chat(H, "<span class='notice'>You retract your suit helmet.</span>")
|
||||
helmet.canremove = 1
|
||||
H.drop_from_inventory(helmet)
|
||||
helmet.forceMove(src)
|
||||
else
|
||||
if(H.head)
|
||||
H << "<span class='danger'>You cannot deploy your helmet while wearing \the [H.head].</span>"
|
||||
to_chat(H, "<span class='danger'>You cannot deploy your helmet while wearing \the [H.head].</span>")
|
||||
return
|
||||
if(H.equip_to_slot_if_possible(helmet, slot_head))
|
||||
helmet.pickup(H)
|
||||
helmet.canremove = 0
|
||||
H << "<span class='info'>You deploy your suit helmet, sealing you off from the world.</span>"
|
||||
to_chat(H, "<span class='info'>You deploy your suit helmet, sealing you off from the world.</span>")
|
||||
helmet.update_light(H)
|
||||
|
||||
/obj/item/clothing/suit/space/void/verb/eject_tank()
|
||||
@@ -186,7 +189,7 @@
|
||||
if(!istype(src.loc,/mob/living)) return
|
||||
|
||||
if(!tank && !cooler)
|
||||
usr << "There is no tank or cooling unit inserted."
|
||||
to_chat(usr, "There is no tank or cooling unit inserted.")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = usr
|
||||
@@ -202,7 +205,7 @@
|
||||
else
|
||||
removing = cooler
|
||||
cooler = null
|
||||
H << "<span class='info'>You press the emergency release, ejecting \the [removing] from your suit.</span>"
|
||||
to_chat(H, "<span class='info'>You press the emergency release, ejecting \the [removing] from your suit.</span>")
|
||||
removing.canremove = 1
|
||||
H.drop_from_inventory(removing)
|
||||
|
||||
@@ -214,75 +217,75 @@
|
||||
return ..()
|
||||
|
||||
if(istype(src.loc,/mob/living))
|
||||
user << "<span class='warning'>You cannot modify \the [src] while it is being worn.</span>"
|
||||
to_chat(user, "<span class='warning'>You cannot modify \the [src] while it is being worn.</span>")
|
||||
return
|
||||
|
||||
if(istype(W,/obj/item/weapon/screwdriver))
|
||||
if(W.is_screwdriver())
|
||||
if(helmet || boots || tank)
|
||||
var/choice = input("What component would you like to remove?") as null|anything in list(helmet,boots,tank,cooler)
|
||||
if(!choice) return
|
||||
|
||||
if(choice == tank) //No, a switch doesn't work here. Sorry. ~Techhead
|
||||
user << "You pop \the [tank] out of \the [src]'s storage compartment."
|
||||
to_chat(user, "You pop \the [tank] out of \the [src]'s storage compartment.")
|
||||
tank.forceMove(get_turf(src))
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
src.tank = null
|
||||
else if(choice == cooler)
|
||||
user << "You pop \the [cooler] out of \the [src]'s storage compartment."
|
||||
to_chat(user, "You pop \the [cooler] out of \the [src]'s storage compartment.")
|
||||
cooler.forceMove(get_turf(src))
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
src.cooler = null
|
||||
else if(choice == helmet)
|
||||
user << "You detatch \the [helmet] from \the [src]'s helmet mount."
|
||||
to_chat(user, "You detatch \the [helmet] from \the [src]'s helmet mount.")
|
||||
helmet.forceMove(get_turf(src))
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
src.helmet = null
|
||||
else if(choice == boots)
|
||||
user << "You detatch \the [boots] from \the [src]'s boot mounts."
|
||||
to_chat(user, "You detatch \the [boots] from \the [src]'s boot mounts.")
|
||||
boots.forceMove(get_turf(src))
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
src.boots = null
|
||||
else
|
||||
user << "\The [src] does not have anything installed."
|
||||
to_chat(user, "\The [src] does not have anything installed.")
|
||||
return
|
||||
else if(istype(W,/obj/item/clothing/head/helmet/space))
|
||||
if(helmet)
|
||||
user << "\The [src] already has a helmet installed."
|
||||
to_chat(user, "\The [src] already has a helmet installed.")
|
||||
else
|
||||
user << "You attach \the [W] to \the [src]'s helmet mount."
|
||||
to_chat(user, "You attach \the [W] to \the [src]'s helmet mount.")
|
||||
user.drop_item()
|
||||
W.forceMove(src)
|
||||
src.helmet = W
|
||||
return
|
||||
else if(istype(W,/obj/item/clothing/shoes/magboots))
|
||||
if(boots)
|
||||
user << "\The [src] already has magboots installed."
|
||||
to_chat(user, "\The [src] already has magboots installed.")
|
||||
else
|
||||
user << "You attach \the [W] to \the [src]'s boot mounts."
|
||||
to_chat(user, "You attach \the [W] to \the [src]'s boot mounts.")
|
||||
user.drop_item()
|
||||
W.forceMove(src)
|
||||
boots = W
|
||||
return
|
||||
else if(istype(W,/obj/item/weapon/tank))
|
||||
if(tank)
|
||||
user << "\The [src] already has an airtank installed."
|
||||
to_chat(user, "\The [src] already has an airtank installed.")
|
||||
else if(cooler)
|
||||
user << "\The [src]'s suit cooling unit is in the way. Remove it first."
|
||||
to_chat(user, "\The [src]'s suit cooling unit is in the way. Remove it first.")
|
||||
else if(istype(W,/obj/item/weapon/tank/phoron))
|
||||
user << "\The [W] cannot be inserted into \the [src]'s storage compartment."
|
||||
to_chat(user, "\The [W] cannot be inserted into \the [src]'s storage compartment.")
|
||||
else
|
||||
user << "You insert \the [W] into \the [src]'s storage compartment."
|
||||
to_chat(user, "You insert \the [W] into \the [src]'s storage compartment.")
|
||||
user.drop_item()
|
||||
W.forceMove(src)
|
||||
tank = W
|
||||
return
|
||||
else if(istype(W,/obj/item/device/suit_cooling_unit))
|
||||
if(cooler)
|
||||
user << "\The [src] already has a suit cooling unit installed."
|
||||
to_chat(user, "\The [src] already has a suit cooling unit installed.")
|
||||
else if(tank)
|
||||
user << "\The [src]'s airtank is in the way. Remove it first."
|
||||
to_chat(user, "\The [src]'s airtank is in the way. Remove it first.")
|
||||
else
|
||||
user << "You insert \the [W] into \the [src]'s storage compartment."
|
||||
to_chat(user, "You insert \the [W] into \the [src]'s storage compartment.")
|
||||
user.drop_item()
|
||||
W.forceMove(src)
|
||||
cooler = W
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/obj/item/clothing/suit/storage/seromi/cloak
|
||||
name = "black and orange cloak "
|
||||
name = "broken cloak"
|
||||
desc = "It drapes over a Teshari's shoulders and closes at the neck with pockets convienently placed inside."
|
||||
icon = 'icons/mob/species/seromi/teshari_cloak.dmi'
|
||||
icon_override = 'icons/mob/species/seromi/teshari_cloak.dmi'
|
||||
@@ -8,127 +8,232 @@
|
||||
species_restricted = list(SPECIES_TESHARI)
|
||||
body_parts_covered = UPPER_TORSO|ARMS
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_orange
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_orange
|
||||
name = "black and orange cloak"
|
||||
icon_state = "tesh_cloak_bo"
|
||||
item_state = "tesh_cloak_bo"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_grey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_grey
|
||||
name = "black and grey cloak"
|
||||
icon_state = "tesh_cloak_bg"
|
||||
item_state = "tesh_cloak_bg"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_midgrey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_midgrey
|
||||
name = "black and medium grey cloak"
|
||||
icon_state = "tesh_cloak_bmg"
|
||||
item_state = "tesh_cloak_bmg"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_lightgrey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_lightgrey
|
||||
name = "black and light grey cloak"
|
||||
icon_state = "tesh_cloak_blg"
|
||||
item_state = "tesh_cloak_blg"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_white
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_white
|
||||
name = "black and white cloak"
|
||||
icon_state = "tesh_cloak_bw"
|
||||
item_state = "tesh_cloak_bw"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_red
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_red
|
||||
name = "black and red cloak"
|
||||
icon_state = "tesh_cloak_br"
|
||||
item_state = "tesh_cloak_br"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black
|
||||
name = "black cloak"
|
||||
icon_state = "tesh_cloak_bn"
|
||||
item_state = "tesh_cloak_bn"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_yellow
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_yellow
|
||||
name = "black and yellow cloak"
|
||||
icon_state = "tesh_cloak_by"
|
||||
item_state = "tesh_cloak_by"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_green
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_green
|
||||
name = "black and green cloak"
|
||||
icon_state = "tesh_cloak_bgr"
|
||||
item_state = "tesh_cloak_bgr"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_blue
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_blue
|
||||
name = "black and blue cloak"
|
||||
icon_state = "tesh_cloak_bbl"
|
||||
item_state = "tesh_cloak_bbl"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_purple
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_purple
|
||||
name = "black and purple cloak"
|
||||
icon_state = "tesh_cloak_bp"
|
||||
item_state = "tesh_cloak_bp"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_pink
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_pink
|
||||
name = "black and pink cloak"
|
||||
icon_state = "tesh_cloak_bpi"
|
||||
item_state = "tesh_cloak_bpi"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/black_brown
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_brown
|
||||
name = "black and brown cloak"
|
||||
icon_state = "tesh_cloak_bbr"
|
||||
item_state = "tesh_cloak_bbr"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/orange_grey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/orange_grey
|
||||
name = "orange and grey cloak"
|
||||
icon_state = "tesh_cloak_og"
|
||||
item_state = "tesh_cloak_og"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/rainbow
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/rainbow
|
||||
name = "rainbow cloak"
|
||||
icon_state = "tesh_cloak_rainbow"
|
||||
item_state = "tesh_cloak_rainbow"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/lightgrey_grey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/lightgrey_grey
|
||||
name = "light grey and grey cloak"
|
||||
icon_state = "tesh_cloak_lgg"
|
||||
item_state = "tesh_cloak_lgg"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/white_grey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey
|
||||
name = "white and grey cloak"
|
||||
icon_state = "tesh_cloak_wg"
|
||||
item_state = "tesh_cloak_wg"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/red_grey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/red_grey
|
||||
name = "red and grey cloak"
|
||||
icon_state = "tesh_cloak_rg"
|
||||
item_state = "tesh_cloak_rg"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/orange
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/orange
|
||||
name = "orange cloak"
|
||||
icon_state = "tesh_cloak_on"
|
||||
item_state = "tesh_cloak_on"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/yellow_grey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/yellow_grey
|
||||
name = "yellow and grey cloak"
|
||||
icon_state = "tesh_cloak_yg"
|
||||
item_state = "tesh_cloak_yg"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/green_grey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/green_grey
|
||||
name = "green and grey cloak"
|
||||
icon_state = "tesh_cloak_gg"
|
||||
item_state = "tesh_cloak_gg"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/blue_grey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/blue_grey
|
||||
name = "blue and grey cloak"
|
||||
icon_state = "tesh_cloak_blug"
|
||||
item_state = "tesh_cloak_blug"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/purple_grey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/purple_grey
|
||||
name = "purple and grey cloak"
|
||||
icon_state = "tesh_cloak_pg"
|
||||
item_state = "tesh_cloak_pg"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/pink_grey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/pink_grey
|
||||
name = "pink and grey cloak"
|
||||
icon_state = "tesh_cloak_pig"
|
||||
item_state = "tesh_cloak_pig"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/brown_grey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/brown_grey
|
||||
name = "brown and grey cloak"
|
||||
icon_state = "tesh_cloak_brg"
|
||||
item_state = "tesh_cloak_brg"
|
||||
item_state = "tesh_cloak_brg"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs
|
||||
icon_override = 'icons/mob/species/seromi/deptcloak.dmi'
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/cargo
|
||||
name = "Cargo cloak"
|
||||
desc = "A soft Teshari cloak made for the Cargo department"
|
||||
icon_state = "tesh_cloak_car"
|
||||
item_state = "tesh_cloak_car"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/mining
|
||||
name = "Mining cloak"
|
||||
desc = "A soft Teshari cloak made for Mining"
|
||||
icon_state = "tesh_cloak_mine"
|
||||
item_state = "tesh_cloak_mine"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/command
|
||||
name = "Command cloak"
|
||||
desc = "A soft Teshari cloak made for the Command department"
|
||||
icon_state = "tesh_cloak_comm"
|
||||
item_state = "tesh_cloak_comm"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/ce
|
||||
name = "Cheif Engineer's cloak"
|
||||
desc = "A soft Teshari cloak made the Chief Engineer"
|
||||
icon_state = "tesh_cloak_ce"
|
||||
item_state = "tesh_cloak_ce"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/eningeer
|
||||
name = "Engineering cloak"
|
||||
desc = "A soft Teshari cloak made for the Engineering department"
|
||||
icon_state = "tesh_cloak_engie"
|
||||
item_state = "tesh_cloak_engie"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/atmos
|
||||
name = "Atmos Tech cloak"
|
||||
desc = "A soft Teshari cloak made for the Atmos Tech"
|
||||
icon_state = "tesh_cloak_atmos"
|
||||
item_state = "tesh_cloak_atmos"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/cmo
|
||||
name = "Chief Medical Officer cloak"
|
||||
desc = "A soft Teshari cloak made the Cheif Medical Officer"
|
||||
icon_state = "tesh_cloak_cmo"
|
||||
item_state = "tesh_cloak_cmo"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/medical
|
||||
name = "Medical cloak"
|
||||
desc = "A soft Teshari cloak made for the Medical department"
|
||||
icon_state = "tesh_cloak_doc"
|
||||
item_state = "tesh_cloak_doc"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/chemistry
|
||||
name = "Chemistry cloak"
|
||||
desc = "A soft Teshari cloak made for the Chemist"
|
||||
icon_state = "tesh_cloak_chem"
|
||||
item_state = "tesh_cloak_chem"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/viro
|
||||
name = "Virologist cloak"
|
||||
desc = "A soft Teshari cloak made for the Virologist"
|
||||
icon_state = "tesh_cloak_viro"
|
||||
item_state = "tesh_cloak_viro"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/para
|
||||
name = "Paramedic cloak"
|
||||
desc = "A soft Teshari cloak made for the Paramedic"
|
||||
icon_state = "tesh_cloak_para"
|
||||
item_state = "tesh_cloak_para"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/sci
|
||||
name = "Scientist cloak"
|
||||
desc = "A soft Teshari cloak made for the Science department"
|
||||
icon_state = "tesh_cloak_sci"
|
||||
item_state = "tesh_cloak_sci"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/robo
|
||||
name = "Roboticist cloak"
|
||||
desc = "A soft Teshari cloak made for the Roboticist"
|
||||
icon_state = "tesh_cloak_robo"
|
||||
item_state = "tesh_cloak_robo"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/sec
|
||||
name = "Security cloak"
|
||||
desc = "A soft Teshari cloak made for the Security department"
|
||||
icon_state = "tesh_cloak_sec"
|
||||
item_state = "tesh_cloak_sec"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/qm
|
||||
name = "Quarter master's cloak"
|
||||
desc = "A soft Teshari cloak made for the Quarter Master (Who is a real head btw)"
|
||||
icon_state = "tesh_cloak_qm"
|
||||
item_state = "tesh_cloak_qm"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/service
|
||||
name = "Service cloak"
|
||||
desc = "A soft Teshari cloak made for the Service department"
|
||||
icon_state = "tesh_uniform_serv"
|
||||
item_state = "tesh_uniform_serv"
|
||||
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/jobs/iaa
|
||||
name = "Iaa cloak"
|
||||
desc = "A soft Teshari cloak made for the Internal Affairs Agent"
|
||||
icon_state = "tesh_uniform_iaa"
|
||||
item_state = "tesh_uniform_iaa"
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "rusted metal armor"
|
||||
desc = "A hodgepodge of various pieces of metal scrapped together into a rudimentary vox-shaped piece of armor."
|
||||
allowed = list(/obj/item/weapon/gun, /obj/item/weapon/tank)
|
||||
armor = list(melee = 70, bullet = 30, laser = 20,energy = 5, bomb = 40, bio = 0, rad = 0) //Higher melee armor versus lower everything else.
|
||||
armor = list(melee = 60, bullet = 30, laser = 30,energy = 5, bomb = 40, bio = 0, rad = 0) //Higher melee armor versus lower everything else.
|
||||
icon_state = "vox-scrap"
|
||||
icon_state = "vox-scrap"
|
||||
body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS
|
||||
|
||||
@@ -8,8 +8,7 @@
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|BLOCKHAIR
|
||||
body_parts_covered = HEAD|FACE|EYES
|
||||
siemens_coefficient = 0.9
|
||||
item_flags = THICKMATERIAL
|
||||
phoronproof = 1
|
||||
item_flags = THICKMATERIAL | PHORONGUARD
|
||||
|
||||
/obj/item/clothing/suit/bio_suit
|
||||
name = "bio suit"
|
||||
@@ -24,8 +23,7 @@
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
|
||||
siemens_coefficient = 0.9
|
||||
item_flags = THICKMATERIAL
|
||||
phoronproof = 1
|
||||
item_flags = THICKMATERIAL | PHORONGUARD
|
||||
|
||||
//Standard biosuit, orange stripe
|
||||
/obj/item/clothing/head/bio_hood/general
|
||||
|
||||
@@ -0,0 +1,182 @@
|
||||
// Hooded suits
|
||||
|
||||
//Hoods for winter coats and chaplain hoodie etc
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded
|
||||
var/obj/item/clothing/head/hood
|
||||
var/hoodtype = null //so the chaplain hoodie or other hoodies can override this
|
||||
var/hood_up = FALSE
|
||||
var/toggleicon
|
||||
action_button_name = "Toggle Hood"
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/New()
|
||||
toggleicon = "[initial(icon_state)]"
|
||||
MakeHood()
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/Destroy()
|
||||
qdel(hood)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/proc/MakeHood()
|
||||
if(!hood)
|
||||
var/obj/item/clothing/head/hood/H = new hoodtype(src)
|
||||
hood = H
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/ui_action_click()
|
||||
ToggleHood()
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/equipped(mob/user, slot)
|
||||
if(slot != slot_wear_suit)
|
||||
RemoveHood()
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/proc/RemoveHood()
|
||||
icon_state = toggleicon
|
||||
hood_up = FALSE
|
||||
hood.canremove = TRUE // This shouldn't matter anyways but just incase.
|
||||
if(ishuman(hood.loc))
|
||||
var/mob/living/carbon/H = hood.loc
|
||||
H.unEquip(hood, 1)
|
||||
H.update_inv_wear_suit()
|
||||
hood.forceMove(src)
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/dropped()
|
||||
RemoveHood()
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/proc/ToggleHood()
|
||||
if(!hood_up)
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = src.loc
|
||||
if(H.wear_suit != src)
|
||||
to_chat(H, "<span class='warning'>You must be wearing [src] to put up the hood!</span>")
|
||||
return
|
||||
if(H.head)
|
||||
to_chat(H, "<span class='warning'>You're already wearing something on your head!</span>")
|
||||
return
|
||||
else
|
||||
H.equip_to_slot_if_possible(hood,slot_head,0,0,1)
|
||||
hood_up = TRUE
|
||||
hood.canremove = FALSE
|
||||
icon_state = "[toggleicon]_t"
|
||||
H.update_inv_wear_suit()
|
||||
else
|
||||
RemoveHood()
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/carp_costume
|
||||
name = "carp costume"
|
||||
desc = "A costume made from 'synthetic' carp scales, it smells."
|
||||
icon_state = "carp_casual"
|
||||
item_state_slots = list(slot_r_hand_str = "carp_casual", slot_l_hand_str = "carp_casual") //Does not exist -S2-
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE //Space carp like space, so you should too
|
||||
action_button_name = "Toggle Carp Hood"
|
||||
hoodtype = /obj/item/clothing/head/hood/carp_hood
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/ian_costume //It's Ian, rub his bell- oh god what happened to his inside parts?
|
||||
name = "corgi costume"
|
||||
desc = "A costume that looks like someone made a human-like corgi, it won't guarantee belly rubs."
|
||||
icon_state = "ian"
|
||||
item_state_slots = list(slot_r_hand_str = "ian", slot_l_hand_str = "ian") //Does not exist -S2-
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
|
||||
action_button_name = "Toggle Ian Hood"
|
||||
hoodtype = /obj/item/clothing/head/hood/ian_hood
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat
|
||||
name = "winter coat"
|
||||
desc = "A heavy jacket made from 'synthetic' animal furs."
|
||||
icon_state = "coatwinter"
|
||||
item_state_slots = list(slot_r_hand_str = "coatwinter", slot_l_hand_str = "coatwinter")
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
|
||||
flags_inv = HIDEHOLSTER
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
|
||||
hoodtype = /obj/item/clothing/head/hood/winter
|
||||
allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask)
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/captain
|
||||
name = "colony director's winter coat"
|
||||
icon_state = "coatcaptain"
|
||||
item_state_slots = list(slot_r_hand_str = "coatcaptain", slot_l_hand_str = "coatcaptain")
|
||||
armor = list(melee = 20, bullet = 15, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0)
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/captain
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/security
|
||||
name = "security winter coat"
|
||||
icon_state = "coatsecurity"
|
||||
item_state_slots = list(slot_r_hand_str = "coatsecurity", slot_l_hand_str = "coatsecurity")
|
||||
armor = list(melee = 25, bullet = 20, laser = 20, energy = 15, bomb = 20, bio = 0, rad = 0)
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/security
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/medical
|
||||
name = "medical winter coat"
|
||||
icon_state = "coatmedical"
|
||||
item_state_slots = list(slot_r_hand_str = "coatmedical", slot_l_hand_str = "coatmedical")
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0)
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/medical
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/science
|
||||
name = "science winter coat"
|
||||
icon_state = "coatscience"
|
||||
item_state_slots = list(slot_r_hand_str = "coatscience", slot_l_hand_str = "coatscience")
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/science
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering
|
||||
name = "engineering winter coat"
|
||||
icon_state = "coatengineer"
|
||||
item_state_slots = list(slot_r_hand_str = "coatengineer", slot_l_hand_str = "coatengineer")
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20)
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/engineering
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos
|
||||
name = "atmospherics winter coat"
|
||||
icon_state = "coatatmos"
|
||||
item_state_slots = list(slot_r_hand_str = "coatatmos", slot_l_hand_str = "coatatmos")
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/engineering/atmos
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/hydro
|
||||
name = "hydroponics winter coat"
|
||||
icon_state = "coathydro"
|
||||
item_state_slots = list(slot_r_hand_str = "coathydro", slot_l_hand_str = "coathydro")
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/hydro
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/cargo
|
||||
name = "cargo winter coat"
|
||||
icon_state = "coatcargo"
|
||||
item_state_slots = list(slot_r_hand_str = "coatcargo", slot_l_hand_str = "coatcargo")
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/cargo
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/miner
|
||||
name = "mining winter coat"
|
||||
icon_state = "coatminer"
|
||||
item_state_slots = list(slot_r_hand_str = "coatminer", slot_l_hand_str = "coatminer")
|
||||
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/miner
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/explorer
|
||||
name = "explorer suit"
|
||||
desc = "An armoured suit for exploring harsh environments."
|
||||
icon_state = "explorer"
|
||||
item_state = "explorer"
|
||||
flags = THICKMATERIAL
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
hoodtype = /obj/item/clothing/head/hood/explorer
|
||||
siemens_coefficient = 0.9
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35) // Inferior to sec vests in bullet/laser but better for environmental protection.
|
||||
allowed = list(
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/gun,
|
||||
/obj/item/ammo_magazine,
|
||||
/obj/item/weapon/melee,
|
||||
/obj/item/weapon/material/knife,
|
||||
/obj/item/weapon/tank,
|
||||
/obj/item/device/radio,
|
||||
/obj/item/weapon/pickaxe
|
||||
)
|
||||
@@ -160,7 +160,7 @@
|
||||
icon_state = "hazard"
|
||||
blood_overlay_type = "armor"
|
||||
allowed = list (/obj/item/device/analyzer, /obj/item/device/flashlight, /obj/item/device/multitool, /obj/item/device/pipe_painter, /obj/item/device/radio, /obj/item/device/t_scanner,
|
||||
/obj/item/weapon/crowbar, /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/weapon/tank/emergency/oxygen,
|
||||
/obj/item/weapon/tool/crowbar, /obj/item/weapon/tool/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/tool/wirecutters, /obj/item/weapon/tool/wrench, /obj/item/weapon/tank/emergency/oxygen,
|
||||
/obj/item/clothing/mask/gas, /obj/item/taperoll/engineering)
|
||||
body_parts_covered = UPPER_TORSO
|
||||
|
||||
|
||||
@@ -86,40 +86,6 @@
|
||||
allowed = list(/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/spacecash)
|
||||
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
|
||||
|
||||
/*/obj/item/clothing/suit/wcoat
|
||||
name = "waistcoat"
|
||||
desc = "For some classy, murderous fun."
|
||||
icon_state = "vest"
|
||||
item_state_slots = list(slot_r_hand_str = "wcoat", slot_l_hand_str = "wcoat")
|
||||
blood_overlay_type = "armor"
|
||||
allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask)
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
|
||||
/obj/item/clothing/suit/wcoat/red
|
||||
name = "red waistcoat"
|
||||
icon_state = "red_waistcoat"
|
||||
|
||||
/obj/item/clothing/suit/wcoat/grey
|
||||
name = "grey waistcoat"
|
||||
icon_state = "grey_waistcoat"
|
||||
|
||||
/obj/item/clothing/suit/wcoat/brown
|
||||
name = "brown waistcoat"
|
||||
icon_state = "brown_waistcoat"
|
||||
|
||||
/obj/item/clothing/suit/wcoat/swvest
|
||||
name = "black sweatervest"
|
||||
desc = "A sleeveless sweater. Wear this if you don't want your arms to be warm, or if you're a nerd."
|
||||
icon_state = "sweatervest"
|
||||
|
||||
/obj/item/clothing/suit/wcoat/swvest/blue
|
||||
name = "blue sweatervest"
|
||||
icon_state = "sweatervest_blue"
|
||||
|
||||
/obj/item/clothing/suit/wcoat/swvest/red
|
||||
name = "red sweatervest"
|
||||
icon_state = "sweatervest_red"
|
||||
*/
|
||||
/obj/item/clothing/suit/storage/apron/overalls
|
||||
name = "coveralls"
|
||||
desc = "A set of denim overalls."
|
||||
@@ -628,203 +594,6 @@ obj/item/clothing/suit/storage/toggle/peacoat
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
|
||||
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/carp_costume
|
||||
name = "carp costume"
|
||||
desc = "A costume made from 'synthetic' carp scales, it smells."
|
||||
icon_state = "carp_casual"
|
||||
item_state_slots = list(slot_r_hand_str = "carp_casual", slot_l_hand_str = "carp_casual") //Does not exist -S2-
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE //Space carp like space, so you should too
|
||||
hooded = 1
|
||||
action_button_name = "Toggle Carp Hood"
|
||||
hoodtype = /obj/item/clothing/head/carp_hood
|
||||
|
||||
/obj/item/clothing/head/carp_hood
|
||||
name = "carp hood"
|
||||
desc = "A hood attached to a carp costume."
|
||||
icon_state = "carp_casual"
|
||||
item_state_slots = list(slot_r_hand_str = "carp_casual", slot_l_hand_str = "carp_casual") //Does not exist -S2-
|
||||
body_parts_covered = HEAD
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/ian_costume //It's Ian, rub his bell- oh god what happened to his inside parts?
|
||||
name = "corgi costume"
|
||||
desc = "A costume that looks like someone made a human-like corgi, it won't guarantee belly rubs."
|
||||
icon_state = "ian"
|
||||
item_state_slots = list(slot_r_hand_str = "ian", slot_l_hand_str = "ian") //Does not exist -S2-
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
|
||||
//cold_protection = CHEST|GROIN|ARMS
|
||||
//min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
hooded = 1
|
||||
action_button_name = "Toggle Ian Hood"
|
||||
hoodtype = /obj/item/clothing/head/ian_hood
|
||||
|
||||
/obj/item/clothing/head/ian_hood
|
||||
name = "corgi hood"
|
||||
desc = "A hood that looks just like a corgi's head, it won't guarantee dog biscuits."
|
||||
icon_state = "ian"
|
||||
item_state_slots = list(slot_r_hand_str = "ian", slot_l_hand_str = "ian") //Does not exist -S2-
|
||||
body_parts_covered = HEAD
|
||||
//cold_protection = HEAD
|
||||
//min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat
|
||||
name = "winter coat"
|
||||
desc = "A heavy jacket made from 'synthetic' animal furs."
|
||||
icon_state = "coatwinter"
|
||||
item_state_slots = list(slot_r_hand_str = "coatwinter", slot_l_hand_str = "coatwinter")
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
|
||||
flags_inv = HIDEHOLSTER
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
|
||||
hooded = 1
|
||||
hoodtype = /obj/item/clothing/head/hood/winter
|
||||
allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask)
|
||||
|
||||
/obj/item/clothing/head/hood/winter
|
||||
name = "winter hood"
|
||||
desc = "A hood attached to a heavy winter jacket."
|
||||
icon_state = "generic_hood"
|
||||
body_parts_covered = HEAD
|
||||
cold_protection = HEAD
|
||||
flags_inv = HIDEEARS | BLOCKHAIR
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/captain
|
||||
name = "colony director's winter coat"
|
||||
icon_state = "coatcaptain"
|
||||
item_state_slots = list(slot_r_hand_str = "coatcaptain", slot_l_hand_str = "coatcaptain")
|
||||
armor = list(melee = 20, bullet = 15, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0)
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/captain
|
||||
|
||||
/obj/item/clothing/head/hood/winter/captain
|
||||
name = "colony director's winter hood"
|
||||
armor = list(melee = 20, bullet = 15, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/security
|
||||
name = "security winter coat"
|
||||
icon_state = "coatsecurity"
|
||||
item_state_slots = list(slot_r_hand_str = "coatsecurity", slot_l_hand_str = "coatsecurity")
|
||||
armor = list(melee = 25, bullet = 20, laser = 20, energy = 15, bomb = 20, bio = 0, rad = 0)
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/security
|
||||
|
||||
/obj/item/clothing/head/hood/winter/security
|
||||
name = "security winter hood"
|
||||
armor = list(melee = 25, bullet = 20, laser = 20, energy = 15, bomb = 20, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/medical
|
||||
name = "medical winter coat"
|
||||
icon_state = "coatmedical"
|
||||
item_state_slots = list(slot_r_hand_str = "coatmedical", slot_l_hand_str = "coatmedical")
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0)
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/medical
|
||||
|
||||
/obj/item/clothing/head/hood/winter/medical
|
||||
name = "medical winter hood"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0)
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/science
|
||||
name = "science winter coat"
|
||||
icon_state = "coatscience"
|
||||
item_state_slots = list(slot_r_hand_str = "coatscience", slot_l_hand_str = "coatscience")
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/science
|
||||
|
||||
/obj/item/clothing/head/hood/winter/science
|
||||
name = "science winter hood"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering
|
||||
name = "engineering winter coat"
|
||||
icon_state = "coatengineer"
|
||||
item_state_slots = list(slot_r_hand_str = "coatengineer", slot_l_hand_str = "coatengineer")
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20)
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/engineering
|
||||
|
||||
/obj/item/clothing/head/hood/winter/engineering
|
||||
name = "engineering winter hood"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20)
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos
|
||||
name = "atmospherics winter coat"
|
||||
icon_state = "coatatmos"
|
||||
item_state_slots = list(slot_r_hand_str = "coatatmos", slot_l_hand_str = "coatatmos")
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/engineering/atmos
|
||||
|
||||
/obj/item/clothing/head/hood/winter/engineering/atmos
|
||||
name = "atmospherics winter hood"
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/hydro
|
||||
name = "hydroponics winter coat"
|
||||
icon_state = "coathydro"
|
||||
item_state_slots = list(slot_r_hand_str = "coathydro", slot_l_hand_str = "coathydro")
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/hydro
|
||||
|
||||
/obj/item/clothing/head/hood/winter/hydro
|
||||
name = "hydroponics winter hood"
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/cargo
|
||||
name = "cargo winter coat"
|
||||
icon_state = "coatcargo"
|
||||
item_state_slots = list(slot_r_hand_str = "coatcargo", slot_l_hand_str = "coatcargo")
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/cargo
|
||||
|
||||
/obj/item/clothing/head/hood/winter/cargo
|
||||
name = "cargo winter hood"
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/miner
|
||||
name = "mining winter coat"
|
||||
icon_state = "coatminer"
|
||||
item_state_slots = list(slot_r_hand_str = "coatminer", slot_l_hand_str = "coatminer")
|
||||
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
hoodtype = /obj/item/clothing/head/hood/winter/miner
|
||||
|
||||
/obj/item/clothing/head/hood/winter/miner
|
||||
name = "mining winter hood"
|
||||
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/explorer
|
||||
name = "explorer suit"
|
||||
desc = "An armoured suit for exploring harsh environments."
|
||||
icon_state = "explorer"
|
||||
item_state = "explorer"
|
||||
flags = THICKMATERIAL
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
hooded = TRUE
|
||||
hoodtype = /obj/item/clothing/head/hood/explorer
|
||||
siemens_coefficient = 0.9
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35) // Inferior to sec vests in bullet/laser but better for environmental protection.
|
||||
allowed = list(
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/gun,
|
||||
/obj/item/ammo_magazine,
|
||||
/obj/item/weapon/melee,
|
||||
/obj/item/weapon/material/knife,
|
||||
/obj/item/weapon/tank,
|
||||
/obj/item/device/radio,
|
||||
/obj/item/weapon/pickaxe
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/hood/explorer
|
||||
name = "explorer hood"
|
||||
desc = "An armoured hood for exploring harsh environments."
|
||||
icon_state = "explorer"
|
||||
brightness_on = 3 // VOREStation Edit - Keep hood light for now - TODO Drain power
|
||||
body_parts_covered = HEAD
|
||||
cold_protection = HEAD
|
||||
flags = THICKMATERIAL
|
||||
flags_inv = HIDEEARS | BLOCKHAIR
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
siemens_coefficient = 0.9
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35)
|
||||
|
||||
/obj/item/clothing/suit/varsity
|
||||
name = "black varsity jacket"
|
||||
desc = "A favorite of jocks everywhere from Sol to Nyx."
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
pockets.max_storage_space = ITEMSIZE_COST_SMALL * 2
|
||||
|
||||
/obj/item/clothing/suit/storage/Destroy()
|
||||
qdel_null(pockets)
|
||||
QDEL_NULL(pockets)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/suit/storage/attack_hand(mob/user as mob)
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
//Hoods for winter coats and chaplain hoodie etc
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded
|
||||
var/obj/item/clothing/head/hood
|
||||
var/hoodtype = null //so the chaplain hoodie or other hoodies can override this
|
||||
var/suittoggled = 0
|
||||
var/hooded = 0
|
||||
var/toggleicon
|
||||
action_button_name = "Toggle Hood"
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/New()
|
||||
toggleicon = "[initial(icon_state)]"
|
||||
MakeHood()
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/Destroy()
|
||||
qdel(hood)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/proc/MakeHood()
|
||||
if(!hood)
|
||||
var/obj/item/clothing/head/hood/winter/W = new hoodtype(src)
|
||||
hood = W
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/ui_action_click()
|
||||
ToggleHood()
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/equipped(mob/user, slot)
|
||||
if(slot != slot_wear_suit)
|
||||
RemoveHood()
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/proc/RemoveHood()
|
||||
icon_state = toggleicon
|
||||
suittoggled = 0
|
||||
hood.canremove = TRUE // This shouldn't matter anyways but just incase.
|
||||
if(ishuman(hood.loc))
|
||||
var/mob/living/carbon/H = hood.loc
|
||||
H.unEquip(hood, 1)
|
||||
H.update_inv_wear_suit()
|
||||
hood.forceMove(src)
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/dropped()
|
||||
RemoveHood()
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/proc/ToggleHood()
|
||||
if(!suittoggled)
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = src.loc
|
||||
if(H.wear_suit != src)
|
||||
to_chat(H, "<span class='warning'>You must be wearing [src] to put up the hood!</span>")
|
||||
return
|
||||
if(H.head)
|
||||
to_chat(H, "<span class='warning'>You're already wearing something on your head!</span>")
|
||||
return
|
||||
else
|
||||
H.equip_to_slot_if_possible(hood,slot_head,0,0,1)
|
||||
suittoggled = 1
|
||||
hood.canremove = FALSE
|
||||
icon_state = "[toggleicon]_t"
|
||||
H.update_inv_wear_suit()
|
||||
else
|
||||
RemoveHood()
|
||||
@@ -34,6 +34,7 @@
|
||||
icon_state = "seromi_rainbow"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat
|
||||
name = "Undercoat"
|
||||
desc = "A Teshari traditional garb, with a modern twist! Made of micro and nanofibres to make it light and billowy, perfect for going fast and stylishly!"
|
||||
icon = 'icons/mob/species/seromi/teshari_uniform.dmi'
|
||||
icon_override = 'icons/mob/species/seromi/teshari_uniform.dmi'
|
||||
@@ -41,127 +42,244 @@
|
||||
item_state = "tesh_uniform_bo"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black_orange
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_orange
|
||||
name = "black and orange undercoat"
|
||||
icon_state = "tesh_uniform_bo"
|
||||
item_state = "tesh_uniform_bo"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black_grey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_grey
|
||||
name = "black and grey undercoat"
|
||||
icon_state = "tesh_uniform_bg"
|
||||
item_state = "tesh_uniform_bg"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black_midgrey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_midgrey
|
||||
name = "black and medium grey undercoat"
|
||||
icon_state = "tesh_uniform_bmg"
|
||||
item_state = "tesh_uniform_bmg"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black_lightgrey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_lightgrey
|
||||
name = "black and light grey undercoat"
|
||||
icon_state = "tesh_uniform_blg"
|
||||
item_state = "tesh_uniform_blg"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black_white
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_white
|
||||
name = "black and white undercoat"
|
||||
icon_state = "tesh_uniform_bw"
|
||||
item_state = "tesh_uniform_bw"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black_red
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_red
|
||||
name = "black and red undercoat"
|
||||
icon_state = "tesh_uniform_br"
|
||||
item_state = "tesh_uniform_br"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black
|
||||
name = "black undercoat"
|
||||
icon_state = "tesh_uniform_bn"
|
||||
item_state = "tesh_uniform_bn"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black_yellow
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_yellow
|
||||
name = "black and yellow undercoat"
|
||||
icon_state = "tesh_uniform_by"
|
||||
item_state = "tesh_uniform_by"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black_green
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_green
|
||||
name = "black and green undercoat"
|
||||
icon_state = "tesh_uniform_bgr"
|
||||
item_state = "tesh_uniform_bgr"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black_blue
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_blue
|
||||
name = "black and blue undercoat"
|
||||
icon_state = "tesh_uniform_bbl"
|
||||
item_state = "tesh_uniform_bbl"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black_purple
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_purple
|
||||
name = "black and purple undercoat"
|
||||
icon_state = "tesh_uniform_bp"
|
||||
item_state = "tesh_uniform_bp"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black_pink
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_pink
|
||||
name = "black and pink undercoat"
|
||||
icon_state = "tesh_uniform_bpi"
|
||||
item_state = "tesh_uniform_bpi"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/black_brown
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_brown
|
||||
name = "black and brown undercoat"
|
||||
icon_state = "tesh_uniform_bbr"
|
||||
item_state = "tesh_uniform_bbr"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/orange_grey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/orange_grey
|
||||
name = "orange and grey undercoat"
|
||||
icon_state = "tesh_uniform_og"
|
||||
item_state = "tesh_uniform_og"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/rainbow
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/rainbow
|
||||
name = "rainbow undercoat"
|
||||
icon_state = "tesh_uniform_rainbow"
|
||||
item_state = "tesh_uniform_rainbow"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/lightgrey_grey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/lightgrey_grey
|
||||
name = "light grey and grey undercoat"
|
||||
icon_state = "tesh_uniform_lgg"
|
||||
item_state = "tesh_uniform_lgg"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/white_grey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/white_grey
|
||||
name = "white and grey undercoat"
|
||||
icon_state = "tesh_uniform_wg"
|
||||
item_state = "tesh_uniform_wg"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/red_grey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/red_grey
|
||||
name = "red and grey undercoat"
|
||||
icon_state = "tesh_uniform_rg"
|
||||
item_state = "tesh_uniform_rg"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/orange
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/orange
|
||||
name = "orange undercoat"
|
||||
icon_state = "tesh_uniform_on"
|
||||
item_state = "tesh_uniform_on"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/yellow_grey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/yellow_grey
|
||||
name = "yellow and grey undercoat"
|
||||
icon_state = "tesh_uniform_yg"
|
||||
item_state = "tesh_uniform_yg"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/green_grey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/green_grey
|
||||
name = "green and grey undercoat"
|
||||
icon_state = "tesh_uniform_gg"
|
||||
item_state = "tesh_uniform_gg"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/blue_grey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/blue_grey
|
||||
name = "blue and grey undercoat"
|
||||
icon_state = "tesh_uniform_blug"
|
||||
item_state = "tesh_uniform_blug"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/purple_grey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/purple_grey
|
||||
name = "purple and grey undercoat"
|
||||
icon_state = "tesh_uniform_pg"
|
||||
item_state = "tesh_uniform_pg"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/pink_grey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/pink_grey
|
||||
name = "pink and grey undercoat"
|
||||
icon_state = "tesh_uniform_pig"
|
||||
item_state = "tesh_uniform_pig"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/brown_grey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/brown_grey
|
||||
name = "brown and grey undercoat"
|
||||
icon_state = "tesh_uniform_brg"
|
||||
item_state = "tesh_uniform_brg"
|
||||
item_state = "tesh_uniform_brg"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs
|
||||
icon_override = 'icons/mob/species/seromi/deptjacket.dmi'
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/cargo
|
||||
name = "Cargo undercoat"
|
||||
desc = "A traditional Teshari garb made for the Cargo department"
|
||||
icon_state = "tesh_uniform_car"
|
||||
item_state = "tesh_uniform_car"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/mining
|
||||
name = "Mining undercoat"
|
||||
desc = "A traditional Teshari garb made for Mining"
|
||||
icon_state = "tesh_uniform_mine"
|
||||
item_state = "tesh_uniform_mine"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/command
|
||||
name = "Command undercoat"
|
||||
desc = "A traditional Teshari garb made for the Command department"
|
||||
icon_state = "tesh_uniform_comm"
|
||||
item_state = "tesh_uniform_comm"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/command_g
|
||||
name = "Command undercoat (gold buttons)"
|
||||
desc = "A traditional Teshari garb made for the Command department"
|
||||
icon_state = "tesh_uniform_comm_g"
|
||||
item_state = "tesh_uniform_comm_g"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/ce
|
||||
name = "Cheif Engineer's undercoat"
|
||||
desc = "A traditional Teshari garb made for the Chief Engineer"
|
||||
icon_state = "tesh_uniform_ce"
|
||||
item_state = "tesh_uniform_ce"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/ce_w
|
||||
name = "Cheif Engineer's undercoat (white)"
|
||||
desc = "A traditional Teshari garb made for the department"
|
||||
icon_state = "tesh_uniform_ce_w"
|
||||
item_state = "tesh_uniform_ce_w"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/engineer
|
||||
name = "Engineering undercoat"
|
||||
desc = "A traditional Teshari garb made for the Engineering department"
|
||||
icon_state = "tesh_uniform_engie"
|
||||
item_state = "tesh_uniform_engie"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/atmos
|
||||
name = "Atmos Tech undercoat"
|
||||
desc = "A traditional Teshari garb made for the Atmos Tech"
|
||||
icon_state = "tesh_uniform_atmos"
|
||||
item_state = "tesh_uniform_atmos"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/cmo
|
||||
name = "Chief Medical Officer undercoat"
|
||||
desc = "A traditional Teshari garb made for the Cheif Medical Officer"
|
||||
icon_state = "tesh_uniform_cmo"
|
||||
item_state = "tesh_uniform_cmo"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/medical
|
||||
name = "Medical undercoat"
|
||||
desc = "A traditional Teshari garb made for the Medical department"
|
||||
icon_state = "tesh_uniform_doc"
|
||||
item_state = "tesh_uniform_doc"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/chemistry
|
||||
name = "Chemistry undercoat"
|
||||
desc = "A traditional Teshari garb made for the Chemist"
|
||||
icon_state = "tesh_uniform_chem"
|
||||
item_state = "tesh_uniform_chem"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/viro
|
||||
name = "Virologist undercoat"
|
||||
desc = "A traditional Teshari garb made for the Virologist"
|
||||
icon_state = "tesh_uniform_viro"
|
||||
item_state = "tesh_uniform_viro"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/para
|
||||
name = "Paramedic undercoat"
|
||||
desc = "A traditional Teshari garb made for the Paramedic"
|
||||
icon_state = "tesh_uniform_para"
|
||||
item_state = "tesh_uniform_para"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/sci
|
||||
name = "Scientist undercoat"
|
||||
desc = "A traditional Teshari garb made for the Science department"
|
||||
icon_state = "tesh_uniform_sci"
|
||||
item_state = "tesh_uniform_sci"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/robo
|
||||
name = "Roboticist undercoat"
|
||||
desc = "A traditional Teshari garb made for the Roboticist"
|
||||
icon_state = "tesh_uniform_robo"
|
||||
item_state = "tesh_uniform_robo"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/sec
|
||||
name = "Security undercoat"
|
||||
desc = "A traditional Teshari garb made for the Security department"
|
||||
icon_state = "tesh_uniform_sec"
|
||||
item_state = "tesh_uniform_sec"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/qm
|
||||
name = "Quarter master's undercoat"
|
||||
desc = "A traditional Teshari garb made for the Quarter Master (Who is a real head btw)"
|
||||
icon_state = "tesh_uniform_qm"
|
||||
item_state = "tesh_uniform_qm"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/service
|
||||
name = "Service undercoat"
|
||||
desc = "A traditional Teshari garb made for the Service department"
|
||||
icon_state = "tesh_uniform_serv"
|
||||
item_state = "tesh_uniform_serv"
|
||||
|
||||
/obj/item/clothing/under/seromi/undercoat/jobs/iaa
|
||||
name = "IAA undercoat"
|
||||
desc = "A traditional Teshari garb made for the Internal Affairs Agent"
|
||||
icon_state = "tesh_uniform_iaa"
|
||||
item_state = "tesh_uniform_iaa"
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
/obj/item/clothing/under/vox
|
||||
has_sensor = 0
|
||||
species_restricted = list(SPECIES_VOX)
|
||||
valid_accessory_slots = "vox"
|
||||
restricted_accessory_slots = "vox"
|
||||
phoronproof = 1
|
||||
starting_accessories = list(/obj/item/clothing/accessory/storage/vox) // Dont' start with a backback, so free webbing
|
||||
flags = PHORONGUARD
|
||||
|
||||
/obj/item/clothing/under/vox/vox_casual
|
||||
name = "alien clothing"
|
||||
@@ -23,7 +22,8 @@
|
||||
name = "alien mesh"
|
||||
desc = "An alien mesh. Seems to be made up mostly of pockets and writhing flesh."
|
||||
icon_state = "webbing-vox"
|
||||
slot = "vox"
|
||||
|
||||
flags = PHORONGUARD
|
||||
|
||||
slots = 3
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
data["bloodsamp_desc"] = (bloodsamp ? (bloodsamp.desc ? bloodsamp.desc : "No information on record.") : "")
|
||||
data["lidstate"] = closed
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
|
||||
ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "dnaforensics.tmpl", "QuikScan DNA Analyzer", 540, 326)
|
||||
ui.set_initial_data(data)
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
O.loc = src
|
||||
held_card = O
|
||||
|
||||
nanomanager.update_uis(src)
|
||||
GLOB.nanomanager.update_uis(src)
|
||||
|
||||
attack_hand(user)
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
if (accounts.len > 0)
|
||||
data["accounts"] = accounts
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "accounts_terminal.tmpl", src.name, 400, 640)
|
||||
ui.set_initial_data(data)
|
||||
@@ -117,7 +117,7 @@
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
var/datum/nanoui/ui = nanomanager.get_open_ui(usr, src, "main")
|
||||
var/datum/nanoui/ui = GLOB.nanomanager.get_open_ui(usr, src, "main")
|
||||
|
||||
if(href_list["choice"])
|
||||
switch(href_list["choice"])
|
||||
|
||||
@@ -166,7 +166,7 @@
|
||||
|
||||
|
||||
|
||||
/obj/machinery/cash_register/attackby(obj/O as obj, user as mob)
|
||||
/obj/machinery/cash_register/attackby(obj/item/O as obj, user as mob)
|
||||
// Check for a method of paying (ID, PDA, e-wallet, cash, ect.)
|
||||
var/obj/item/weapon/card/id/I = O.GetID()
|
||||
if(I)
|
||||
@@ -188,8 +188,8 @@
|
||||
scan_cash(SC)
|
||||
else if(istype(O, /obj/item/weapon/card/emag))
|
||||
return ..()
|
||||
else if(istype(O, /obj/item/weapon/wrench))
|
||||
var/obj/item/weapon/wrench/W = O
|
||||
else if(O.is_wrench())
|
||||
var/obj/item/weapon/tool/wrench/W = O
|
||||
toggle_anchors(W, user)
|
||||
// Not paying: Look up price and add it to transaction_amount
|
||||
else
|
||||
@@ -479,7 +479,7 @@
|
||||
usr << "<span class='warning'>The cash box is locked.</span>"
|
||||
|
||||
|
||||
/obj/machinery/cash_register/proc/toggle_anchors(obj/item/weapon/wrench/W, mob/user)
|
||||
/obj/machinery/cash_register/proc/toggle_anchors(obj/item/weapon/tool/wrench/W, mob/user)
|
||||
if(manipulating) return
|
||||
manipulating = 1
|
||||
if(!anchored)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/datum/event/shipping_error/start()
|
||||
var/datum/supply_order/O = new /datum/supply_order()
|
||||
O.ordernum = supply_controller.ordernum
|
||||
O.object = supply_controller.supply_packs[pick(supply_controller.supply_packs)]
|
||||
O.orderedby = random_name(pick(MALE,FEMALE), species = SPECIES_HUMAN)
|
||||
O.object = supply_controller.supply_pack[pick(supply_controller.supply_pack)]
|
||||
O.ordered_by = random_name(pick(MALE,FEMALE), species = SPECIES_HUMAN)
|
||||
supply_controller.shoppinglist += O
|
||||
@@ -349,19 +349,22 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
|
||||
/obj/item/clothing/suit/space/void, /obj/item/weapon/tank)
|
||||
|
||||
/proc/fake_attack(var/mob/living/target)
|
||||
// var/list/possible_clones = new/list()
|
||||
var/list/possible_clones = new/list()
|
||||
var/mob/living/carbon/human/clone = null
|
||||
var/clone_weapon = null
|
||||
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
if(H.stat || H.lying) continue
|
||||
// possible_clones += H
|
||||
clone = H
|
||||
break //changed the code a bit. Less randomised, but less work to do. Should be ok, world.contents aren't stored in any particular order.
|
||||
if(H.stat || H.lying)
|
||||
continue
|
||||
possible_clones += H
|
||||
// clone = H
|
||||
// break //changed the code a bit. Less randomised, but less work to do. Should be ok, world.contents aren't stored in any particular order.
|
||||
|
||||
// if(!possible_clones.len) return
|
||||
// clone = pick(possible_clones)
|
||||
if(!clone) return
|
||||
if(!possible_clones.len)
|
||||
return
|
||||
clone = pick(possible_clones)
|
||||
if(!clone)
|
||||
return
|
||||
|
||||
//var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(outside_range(target))
|
||||
var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(target.loc)
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
// Implements a verb to make your character look upward, mostly intended for the surface.
|
||||
|
||||
/mob/living/verb/look_up()
|
||||
set name = "Look Up"
|
||||
set category = "IC"
|
||||
set desc = "Look above you, and hope there's no ceiling spiders."
|
||||
|
||||
to_chat(usr, "You look upwards...")
|
||||
|
||||
var/turf/T = get_turf(usr)
|
||||
if(!T) // In null space.
|
||||
to_chat(usr, span("warning", "You appear to be in a place without any sort of concept of direction. You have bigger problems to worry about."))
|
||||
return
|
||||
|
||||
if(!T.outdoors) // They're inside.
|
||||
to_chat(usr, "You see nothing interesting.")
|
||||
return
|
||||
|
||||
else // They're outside and hopefully on a planet.
|
||||
var/datum/planet/P = SSplanets.z_to_planet[T.z]
|
||||
if(!P)
|
||||
to_chat(usr, span("warning", "You appear to be outside, but not on a planet... Something is wrong."))
|
||||
return
|
||||
|
||||
var/datum/weather_holder/WH = P.weather_holder
|
||||
|
||||
// Describe the current weather.
|
||||
if(WH.current_weather.observed_message)
|
||||
to_chat(usr, WH.current_weather.observed_message)
|
||||
|
||||
// If we can see the sky, we'll see things like sun position, phase of the moon, etc.
|
||||
if(!WH.current_weather.sky_visible)
|
||||
to_chat(usr, "You can't see the sky clearly due to the [WH.current_weather.name].")
|
||||
else
|
||||
// Sun-related output.
|
||||
if(P.sun_name)
|
||||
var/afternoon = P.current_time.seconds_stored > (P.current_time.seconds_in_day / 2)
|
||||
|
||||
var/sun_message = null
|
||||
switch(P.sun_position)
|
||||
if(0 to 0.4) // Night
|
||||
sun_message = "It is night time, [P.sun_name] is not visible."
|
||||
if(0.4 to 0.5) // Twilight
|
||||
sun_message = "The sky is in twilight, however [P.sun_name] is not visible."
|
||||
if(0.5 to 0.7) // Sunrise/set.
|
||||
sun_message = "[P.sun_name] is slowly [!afternoon ? "rising from" : "setting on"] the horizon."
|
||||
if(0.7 to 0.9) // Morning/evening
|
||||
sun_message = "[P.sun_name]'s position implies it is currently [!afternoon ? "early" : "late"] in the day."
|
||||
if(0.9 to 1.0) // Noon
|
||||
sun_message = "It's high noon. [P.sun_name] hangs directly above you."
|
||||
|
||||
to_chat(usr, sun_message)
|
||||
|
||||
// Now for the moon.
|
||||
if(P.moon_name)
|
||||
if(P.moon_phase == MOON_PHASE_NEW_MOON)
|
||||
to_chat(usr, "[P.moon_name] is not visible. It must be a new moon.")
|
||||
else
|
||||
to_chat(usr, "[P.moon_name] appears to currently be a [P.moon_phase].")
|
||||
|
||||
@@ -12,6 +12,6 @@
|
||||
..()
|
||||
var/datum/supply_order/O = new /datum/supply_order()
|
||||
O.ordernum = supply_controller.ordernum
|
||||
O.object = supply_controller.supply_packs[pick(supply_controller.supply_packs)]
|
||||
O.orderedby = random_name(pick(MALE,FEMALE), species = "Human")
|
||||
O.object = supply_controller.supply_pack[pick(supply_controller.supply_pack)]
|
||||
O.ordered_by = random_name(pick(MALE,FEMALE), species = "Human")
|
||||
supply_controller.shoppinglist += O
|
||||
@@ -112,7 +112,7 @@
|
||||
else
|
||||
data["gravity"] = null
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "holodeck.tmpl", src.name, 400, 550)
|
||||
ui.set_initial_data(data)
|
||||
@@ -152,7 +152,7 @@
|
||||
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
nanomanager.update_uis(src)
|
||||
GLOB.nanomanager.update_uis(src)
|
||||
|
||||
/obj/machinery/computer/HolodeckControl/emag_act(var/remaining_charges, var/mob/user as mob)
|
||||
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
|
||||
|
||||
@@ -128,7 +128,8 @@
|
||||
item_state = "boxing"
|
||||
|
||||
/obj/structure/window/reinforced/holowindow/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(!istype(W)) return//I really wish I did not need this
|
||||
if(!istype(W))
|
||||
return//I really wish I did not need this
|
||||
if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
|
||||
var/obj/item/weapon/grab/G = W
|
||||
if(istype(G.affecting,/mob/living))
|
||||
@@ -155,12 +156,12 @@
|
||||
|
||||
if(W.flags & NOBLUDGEON) return
|
||||
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
user << ("<span class='notice'>It's a holowindow, you can't unfasten it!</span>")
|
||||
else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <= 1)
|
||||
user << ("<span class='notice'>It's a holowindow, you can't pry it!</span>")
|
||||
else if(istype(W, /obj/item/weapon/wrench) && !anchored && (!state || !reinf))
|
||||
user << ("<span class='notice'>It's a holowindow, you can't dismantle it!</span>")
|
||||
if(W.is_screwdriver())
|
||||
to_chat(user, "<span class='notice'>It's a holowindow, you can't unfasten it!</span>")
|
||||
else if(W.is_crowbar() && reinf && state <= 1)
|
||||
to_chat(user, "<span class='notice'>It's a holowindow, you can't pry it!</span>")
|
||||
else if(W.is_wrench() && !anchored && (!state || !reinf))
|
||||
to_chat(user, "<span class='notice'>It's a holowindow, you can't dismantle it!</span>")
|
||||
else
|
||||
if(W.damtype == BRUTE || W.damtype == BURN)
|
||||
hit(W.force)
|
||||
@@ -216,12 +217,12 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/bed/chair/holochair/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/wrench))
|
||||
user << ("<span class='notice'>It's a holochair, you can't dismantle it!</span>")
|
||||
if(W.is_wrench())
|
||||
to_chat(user, "<span class='notice'>It's a holochair, you can't dismantle it!</span>")
|
||||
return
|
||||
//VOREStation Add
|
||||
/obj/structure/bed/holobed/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/wrench))
|
||||
if(W.is_wrench())
|
||||
user << ("<span class='notice'>It's a holochair, you can't dismantle it!</span>")
|
||||
return
|
||||
//VOREStation Add End
|
||||
@@ -274,13 +275,13 @@
|
||||
icon_state = "sword[item_color]"
|
||||
w_class = ITEMSIZE_LARGE
|
||||
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
|
||||
user << "<span class='notice'>[src] is now active.</span>"
|
||||
to_chat(user, "<span class='notice'>[src] is now active.</span>")
|
||||
else
|
||||
force = 3
|
||||
icon_state = "sword0"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
|
||||
user << "<span class='notice'>[src] can now be concealed.</span>"
|
||||
to_chat(user, "<span class='notice'>[src] can now be concealed.</span>")
|
||||
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
@@ -312,7 +313,7 @@
|
||||
if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
|
||||
var/obj/item/weapon/grab/G = W
|
||||
if(G.state<2)
|
||||
user << "<span class='warning'>You need a better grip to do that!</span>"
|
||||
to_chat(user, "<span class='warning'>You need a better grip to do that!</span>")
|
||||
return
|
||||
G.affecting.loc = src.loc
|
||||
G.affecting.Weaken(5)
|
||||
@@ -355,7 +356,7 @@
|
||||
power_channel = ENVIRON
|
||||
|
||||
/obj/machinery/readybutton/attack_ai(mob/user as mob)
|
||||
user << "The station AI is not to interact with these devices!"
|
||||
to_chat(user, "The station AI is not to interact with these devices!")
|
||||
return
|
||||
|
||||
/obj/machinery/readybutton/New()
|
||||
@@ -363,12 +364,12 @@
|
||||
|
||||
|
||||
/obj/machinery/readybutton/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
user << "The device is a solid button, there's nothing you can do with it!"
|
||||
to_chat(user, "The device is a solid button, there's nothing you can do with it!")
|
||||
|
||||
/obj/machinery/readybutton/attack_hand(mob/user as mob)
|
||||
|
||||
if(user.stat || stat & (NOPOWER|BROKEN))
|
||||
user << "This device is not powered."
|
||||
to_chat(user, "This device is not powered.")
|
||||
return
|
||||
|
||||
if(!user.IsAdvancedToolUser())
|
||||
@@ -379,7 +380,7 @@
|
||||
qdel(src)
|
||||
|
||||
if(eventstarted)
|
||||
usr << "The event has already begun!"
|
||||
to_chat(usr, "The event has already begun!")
|
||||
return
|
||||
|
||||
ready = !ready
|
||||
@@ -410,7 +411,7 @@
|
||||
qdel(W)
|
||||
|
||||
for(var/mob/M in currentarea)
|
||||
M << "FIGHT!"
|
||||
to_chat(M, "FIGHT!")
|
||||
|
||||
// A window that disappears when the ready button is pressed
|
||||
/obj/structure/window/reinforced/holowindow/disappearing
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
if(!station_map || reinit)
|
||||
station_map = image(SSholomaps.extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAP]_[T.z]"])
|
||||
if(!cursor || reinit)
|
||||
cursor = image('icons/holomap_markers_vr.dmi', "you")
|
||||
cursor = image('icons/holomap_markers.dmi', "you")
|
||||
if(!legend || reinit)
|
||||
legend = image('icons/effects/64x64_vr.dmi', "legend")
|
||||
legend = image('icons/effects/64x64.dmi', "legend_sc")
|
||||
|
||||
if(isAI)
|
||||
T = get_turf(user.client.eye)
|
||||
@@ -24,8 +24,8 @@
|
||||
station_map.overlays |= legend
|
||||
|
||||
/datum/station_holomap/proc/initialize_holomap_bogus()
|
||||
station_map = image('icons/480x480_vr.dmi', "stationmap")
|
||||
legend = image('icons/effects/64x64_vr.dmi', "notfound")
|
||||
station_map = image('icons/480x480.dmi', "stationmap")
|
||||
legend = image('icons/effects/64x64.dmi', "notfound")
|
||||
legend.pixel_x = 7 * WORLD_ICON_SIZE
|
||||
legend.pixel_y = 7 * WORLD_ICON_SIZE
|
||||
station_map.overlays |= legend
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
/obj/machinery/station_map
|
||||
name = "station holomap"
|
||||
desc = "A virtual map of the surrounding station."
|
||||
icon = 'icons/obj/machines/stationmap_vr.dmi'
|
||||
icon = 'icons/obj/machines/stationmap.dmi'
|
||||
icon_state = "station_map"
|
||||
anchored = 1
|
||||
density = 0
|
||||
@@ -67,7 +67,7 @@
|
||||
// small_station_map.plane = LIGHTING_PLANE // Not until we do planes ~Leshana
|
||||
// small_station_map.layer = LIGHTING_LAYER+1 // Weird things will happen!
|
||||
|
||||
floor_markings = image('icons/obj/machines/stationmap_vr.dmi', "decal_station_map")
|
||||
floor_markings = image('icons/obj/machines/stationmap.dmi', "decal_station_map")
|
||||
floor_markings.dir = src.dir
|
||||
// floor_markings.plane = ABOVE_TURF_PLANE // Not until we do planes ~Leshana
|
||||
// floor_markings.layer = DECAL_LAYER
|
||||
@@ -123,8 +123,8 @@
|
||||
user.client.images |= holomap_datum.station_map
|
||||
|
||||
watching_mob = user
|
||||
moved_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition)
|
||||
dir_set_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition)
|
||||
GLOB.moved_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition)
|
||||
GLOB.dir_set_event.register(watching_mob, src, /obj/machinery/station_map/proc/checkPosition)
|
||||
destroyed_event.register(watching_mob, src, /obj/machinery/station_map/proc/stopWatching)
|
||||
update_use_power(2)
|
||||
|
||||
@@ -152,8 +152,8 @@
|
||||
var/mob/M = watching_mob
|
||||
spawn(5) //we give it time to fade out
|
||||
M.client.images -= holomap_datum.station_map
|
||||
moved_event.unregister(watching_mob, src)
|
||||
dir_set_event.unregister(watching_mob, src)
|
||||
GLOB.moved_event.unregister(watching_mob, src)
|
||||
GLOB.dir_set_event.unregister(watching_mob, src)
|
||||
destroyed_event.unregister(watching_mob, src)
|
||||
watching_mob = null
|
||||
update_use_power(1)
|
||||
@@ -228,7 +228,7 @@
|
||||
x_offset = WORLD_ICON_SIZE
|
||||
y_offset = WORLD_ICON_SIZE
|
||||
circuit = /obj/item/weapon/circuitboard/station_map
|
||||
icon_override = 'icons/obj/machines/stationmap_vr.dmi'
|
||||
icon_override = 'icons/obj/machines/stationmap.dmi'
|
||||
|
||||
/datum/frame/frame_types/station_map/get_icon_state(var/state)
|
||||
return "station_map_frame_[state]"
|
||||
|
||||
@@ -33,22 +33,22 @@
|
||||
/obj/machinery/beehive/examine(var/mob/user)
|
||||
..()
|
||||
if(!closed)
|
||||
user << "The lid is open."
|
||||
to_chat(user, "The lid is open.")
|
||||
|
||||
/obj/machinery/beehive/attackby(var/obj/item/I, var/mob/user)
|
||||
if(istype(I, /obj/item/weapon/crowbar))
|
||||
if(I.is_crowbar())
|
||||
closed = !closed
|
||||
user.visible_message("<span class='notice'>[user] [closed ? "closes" : "opens"] \the [src].</span>", "<span class='notice'>You [closed ? "close" : "open"] \the [src].</span>")
|
||||
update_icon()
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/wrench))
|
||||
else if(I.is_wrench())
|
||||
anchored = !anchored
|
||||
playsound(loc, I.usesound, 50, 1)
|
||||
user.visible_message("<span class='notice'>[user] [anchored ? "wrenches" : "unwrenches"] \the [src].</span>", "<span class='notice'>You [anchored ? "wrench" : "unwrench"] \the [src].</span>")
|
||||
return
|
||||
else if(istype(I, /obj/item/bee_smoker))
|
||||
if(closed)
|
||||
user << "<span class='notice'>You need to open \the [src] with a crowbar before smoking the bees.</span>"
|
||||
to_chat(user, "<span class='notice'>You need to open \the [src] with a crowbar before smoking the bees.</span>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] smokes the bees in \the [src].</span>", "<span class='notice'>You smoke the bees in \the [src].</span>")
|
||||
smoked = 30
|
||||
@@ -56,14 +56,14 @@
|
||||
return
|
||||
else if(istype(I, /obj/item/honey_frame))
|
||||
if(closed)
|
||||
user << "<span class='notice'>You need to open \the [src] with a crowbar before inserting \the [I].</span>"
|
||||
to_chat(user, "<span class='notice'>You need to open \the [src] with a crowbar before inserting \the [I].</span>")
|
||||
return
|
||||
if(frames >= maxFrames)
|
||||
user << "<span class='notice'>There is no place for an another frame.</span>"
|
||||
to_chat(user, "<span class='notice'>There is no place for an another frame.</span>")
|
||||
return
|
||||
var/obj/item/honey_frame/H = I
|
||||
if(H.honey)
|
||||
user << "<span class='notice'>\The [I] is full with beeswax and honey, empty it in the extractor first.</span>"
|
||||
to_chat(user, "<span class='notice'>\The [I] is full with beeswax and honey, empty it in the extractor first.</span>")
|
||||
return
|
||||
++frames
|
||||
user.visible_message("<span class='notice'>[user] loads \the [I] into \the [src].</span>", "<span class='notice'>You load \the [I] into \the [src].</span>")
|
||||
@@ -74,16 +74,16 @@
|
||||
else if(istype(I, /obj/item/bee_pack))
|
||||
var/obj/item/bee_pack/B = I
|
||||
if(B.full && bee_count)
|
||||
user << "<span class='notice'>\The [src] already has bees inside.</span>"
|
||||
to_chat(user, "<span class='notice'>\The [src] already has bees inside.</span>")
|
||||
return
|
||||
if(!B.full && bee_count < 90)
|
||||
user << "<span class='notice'>\The [src] is not ready to split.</span>"
|
||||
to_chat(user, "<span class='notice'>\The [src] is not ready to split.</span>")
|
||||
return
|
||||
if(!B.full && !smoked)
|
||||
user << "<span class='notice'>Smoke \the [src] first!</span>"
|
||||
to_chat(user, "<span class='notice'>Smoke \the [src] first!</span>")
|
||||
return
|
||||
if(closed)
|
||||
user << "<span class='notice'>You need to open \the [src] with a crowbar before moving the bees.</span>"
|
||||
to_chat(user, "<span class='notice'>You need to open \the [src] with a crowbar before moving the bees.</span>")
|
||||
return
|
||||
if(B.full)
|
||||
user.visible_message("<span class='notice'>[user] puts the queen and the bees from \the [I] into \the [src].</span>", "<span class='notice'>You put the queen and the bees from \the [I] into \the [src].</span>")
|
||||
@@ -96,22 +96,22 @@
|
||||
update_icon()
|
||||
return
|
||||
else if(istype(I, /obj/item/device/analyzer/plant_analyzer))
|
||||
user << "<span class='notice'>Scan result of \the [src]...</span>"
|
||||
user << "Beehive is [bee_count ? "[round(bee_count)]% full" : "empty"].[bee_count > 90 ? " Colony is ready to split." : ""]"
|
||||
to_chat(user, "<span class='notice'>Scan result of \the [src]...</span>")
|
||||
to_chat(user, "Beehive is [bee_count ? "[round(bee_count)]% full" : "empty"].[bee_count > 90 ? " Colony is ready to split." : ""]")
|
||||
if(frames)
|
||||
user << "[frames] frames installed, [round(honeycombs / 100)] filled."
|
||||
to_chat(user, "[frames] frames installed, [round(honeycombs / 100)] filled.")
|
||||
if(honeycombs < frames * 100)
|
||||
user << "Next frame is [round(honeycombs % 100)]% full."
|
||||
to_chat(user, "Next frame is [round(honeycombs % 100)]% full.")
|
||||
else
|
||||
user << "No frames installed."
|
||||
to_chat(user, "No frames installed.")
|
||||
if(smoked)
|
||||
user << "The hive is smoked."
|
||||
to_chat(user, "The hive is smoked.")
|
||||
return 1
|
||||
else if(istype(I, /obj/item/weapon/screwdriver))
|
||||
else if(I.is_screwdriver())
|
||||
if(bee_count)
|
||||
user << "<span class='notice'>You can't dismantle \the [src] with these bees inside.</span>"
|
||||
to_chat(user, "<span class='notice'>You can't dismantle \the [src] with these bees inside.</span>")
|
||||
return
|
||||
user << "<span class='notice'>You start dismantling \the [src]...</span>"
|
||||
to_chat(user, "<span class='notice'>You start dismantling \the [src]...</span>")
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
if(do_after(user, 30))
|
||||
user.visible_message("<span class='notice'>[user] dismantles \the [src].</span>", "<span class='notice'>You dismantle \the [src].</span>")
|
||||
@@ -122,10 +122,10 @@
|
||||
/obj/machinery/beehive/attack_hand(var/mob/user)
|
||||
if(!closed)
|
||||
if(honeycombs < 100)
|
||||
user << "<span class='notice'>There are no filled honeycombs.</span>"
|
||||
to_chat(user, "<span class='notice'>There are no filled honeycombs.</span>")
|
||||
return
|
||||
if(!smoked && bee_count)
|
||||
user << "<span class='notice'>The bees won't let you take the honeycombs out like this, smoke them first.</span>"
|
||||
to_chat(user, "<span class='notice'>The bees won't let you take the honeycombs out like this, smoke them first.</span>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] starts taking the honeycombs out of \the [src].</span>", "<span class='notice'>You start taking the honeycombs out of \the [src]...</span>")
|
||||
while(honeycombs >= 100 && do_after(user, 30))
|
||||
@@ -134,7 +134,7 @@
|
||||
--frames
|
||||
update_icon()
|
||||
if(honeycombs < 100)
|
||||
user << "<span class='notice'>You take all filled honeycombs out.</span>"
|
||||
to_chat(user, "<span class='notice'>You take all filled honeycombs out.</span>")
|
||||
return
|
||||
|
||||
/obj/machinery/beehive/process()
|
||||
@@ -166,12 +166,12 @@
|
||||
|
||||
/obj/machinery/honey_extractor/attackby(var/obj/item/I, var/mob/user)
|
||||
if(processing)
|
||||
user << "<span class='notice'>\The [src] is currently spinning, wait until it's finished.</span>"
|
||||
to_chat(user, "<span class='notice'>\The [src] is currently spinning, wait until it's finished.</span>")
|
||||
return
|
||||
else if(istype(I, /obj/item/honey_frame))
|
||||
var/obj/item/honey_frame/H = I
|
||||
if(!H.honey)
|
||||
user << "<span class='notice'>\The [H] is empty, put it into a beehive.</span>"
|
||||
to_chat(user, "<span class='notice'>\The [H] is empty, put it into a beehive.</span>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] loads \the [H] into \the [src] and turns it on.</span>", "<span class='notice'>You load \the [H] into \the [src] and turn it on.</span>")
|
||||
processing = H.honey
|
||||
@@ -185,7 +185,7 @@
|
||||
icon_state = "centrifuge"
|
||||
else if(istype(I, /obj/item/weapon/reagent_containers/glass))
|
||||
if(!honey)
|
||||
user << "<span class='notice'>There is no honey in \the [src].</span>"
|
||||
to_chat(user, "<span class='notice'>There is no honey in \the [src].</span>")
|
||||
return
|
||||
var/obj/item/weapon/reagent_containers/glass/G = I
|
||||
var/transferred = min(G.reagents.maximum_volume - G.reagents.total_volume, honey)
|
||||
@@ -226,7 +226,7 @@
|
||||
icon_state = "apiary"
|
||||
|
||||
/obj/item/beehive_assembly/attack_self(var/mob/user)
|
||||
user << "<span class='notice'>You start assembling \the [src]...</span>"
|
||||
to_chat(user, "<span class='notice'>You start assembling \the [src]...</span>")
|
||||
if(do_after(user, 30))
|
||||
user.visible_message("<span class='notice'>[user] constructs a beehive.</span>", "<span class='notice'>You construct a beehive.</span>")
|
||||
new /obj/machinery/beehive(get_turf(user))
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
if(genes.len)
|
||||
var/choice = alert(user, "Are you sure you want to wipe the disk?", "Xenobotany Data", "No", "Yes")
|
||||
if(src && user && genes && choice && choice == "Yes" && user.Adjacent(get_turf(src)))
|
||||
user << "You wipe the disk data."
|
||||
to_chat(user, "You wipe the disk data.")
|
||||
name = initial(name)
|
||||
desc = initial(name)
|
||||
genes = list()
|
||||
@@ -82,16 +82,16 @@
|
||||
/obj/machinery/botany/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/seeds))
|
||||
if(seed)
|
||||
user << "There is already a seed loaded."
|
||||
to_chat(user, "There is already a seed loaded.")
|
||||
return
|
||||
var/obj/item/seeds/S =W
|
||||
if(S.seed && S.seed.get_trait(TRAIT_IMMUTABLE) > 0)
|
||||
user << "That seed is not compatible with our genetics technology."
|
||||
to_chat(user, "That seed is not compatible with our genetics technology.")
|
||||
else
|
||||
user.drop_from_inventory(W)
|
||||
W.loc = src
|
||||
seed = W
|
||||
user << "You load [W] into [src]."
|
||||
to_chat(user, "You load [W] into [src].")
|
||||
return
|
||||
|
||||
if(default_deconstruction_screwdriver(user, W))
|
||||
@@ -100,24 +100,24 @@
|
||||
return
|
||||
if(istype(W,/obj/item/weapon/disk/botany))
|
||||
if(loaded_disk)
|
||||
user << "There is already a data disk loaded."
|
||||
to_chat(user, "There is already a data disk loaded.")
|
||||
return
|
||||
else
|
||||
var/obj/item/weapon/disk/botany/B = W
|
||||
|
||||
if(B.genes && B.genes.len)
|
||||
if(!disk_needs_genes)
|
||||
user << "That disk already has gene data loaded."
|
||||
to_chat(user, "That disk already has gene data loaded.")
|
||||
return
|
||||
else
|
||||
if(disk_needs_genes)
|
||||
user << "That disk does not have any gene data loaded."
|
||||
to_chat(user, "That disk does not have any gene data loaded.")
|
||||
return
|
||||
|
||||
user.drop_from_inventory(W)
|
||||
W.loc = src
|
||||
loaded_disk = W
|
||||
user << "You load [W] into [src]."
|
||||
to_chat(user, "You load [W] into [src].")
|
||||
|
||||
return
|
||||
..()
|
||||
@@ -162,7 +162,7 @@
|
||||
data["hasGenetics"] = 0
|
||||
data["sourceName"] = 0
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "botany_isolator.tmpl", "Lysis-isolation Centrifuge UI", 470, 450)
|
||||
ui.set_initial_data(data)
|
||||
@@ -292,7 +292,7 @@
|
||||
else
|
||||
data["loaded"] = 0
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
ui = GLOB.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "botany_editor.tmpl", "Bioballistic Delivery UI", 470, 450)
|
||||
ui.set_initial_data(data)
|
||||
|
||||
@@ -482,20 +482,20 @@
|
||||
if (loaded)
|
||||
user.visible_message("[user] puts the seeds from \the [O.name] into \the [src].", "You put the seeds from \the [O.name] into \the [src].")
|
||||
else
|
||||
user << "<span class='notice'>There are no seeds in \the [O.name].</span>"
|
||||
to_chat(user, "<span class='notice'>There are no seeds in \the [O.name].</span>")
|
||||
return
|
||||
else if(istype(O, /obj/item/weapon/wrench))
|
||||
else if(O.is_wrench())
|
||||
playsound(loc, O.usesound, 50, 1)
|
||||
anchored = !anchored
|
||||
user << "You [anchored ? "wrench" : "unwrench"] \the [src]."
|
||||
else if(istype(O, /obj/item/weapon/screwdriver))
|
||||
to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
|
||||
else if(O.is_screwdriver())
|
||||
panel_open = !panel_open
|
||||
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
|
||||
playsound(src, O.usesound, 50, 1)
|
||||
overlays.Cut()
|
||||
if(panel_open)
|
||||
overlays += image(icon, "[initial(icon_state)]-panel")
|
||||
else if((istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/device/multitool)) && panel_open)
|
||||
else if((O.is_wirecutter() || istype(O, /obj/item/device/multitool)) && panel_open)
|
||||
wires.Interact(user)
|
||||
|
||||
/obj/machinery/seed_storage/emag_act(var/remaining_charges, var/mob/user)
|
||||
|
||||
@@ -240,7 +240,7 @@
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
plant_controller.add_plant(src)
|
||||
|
||||
if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/surgical/scalpel))
|
||||
if(W.is_wirecutter() || istype(W, /obj/item/weapon/surgical/scalpel))
|
||||
if(sampled)
|
||||
user << "<span class='warning'>\The [src] has already been sampled recently.</span>"
|
||||
return
|
||||
|
||||
@@ -453,7 +453,7 @@
|
||||
if(O.is_open_container())
|
||||
return 0
|
||||
|
||||
if(istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/weapon/surgical/scalpel))
|
||||
if(O.is_wirecutter() || istype(O, /obj/item/weapon/surgical/scalpel))
|
||||
|
||||
if(!seed)
|
||||
user << "There is nothing to take a sample from in \the [src]."
|
||||
@@ -548,7 +548,7 @@
|
||||
qdel(O)
|
||||
check_health()
|
||||
|
||||
else if(mechanical && istype(O, /obj/item/weapon/wrench))
|
||||
else if(mechanical && O.is_wrench())
|
||||
|
||||
//If there's a connector here, the portable_atmospherics setup can handle it.
|
||||
if(locate(/obj/machinery/atmospherics/portables_connector/) in loc)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//Analyzer, pestkillers, weedkillers, nutrients, hatchets, cutters.
|
||||
|
||||
/obj/item/weapon/wirecutters/clippers
|
||||
/obj/item/weapon/tool/wirecutters/clippers
|
||||
name = "plant clippers"
|
||||
desc = "A tool used to take samples from plants."
|
||||
|
||||
|
||||
@@ -6,10 +6,6 @@
|
||||
#define DATA_CHANNEL "data channel"
|
||||
#define PULSE_CHANNEL "pulse channel"
|
||||
|
||||
// Methods of obtaining a circuit.
|
||||
#define IC_SPAWN_DEFAULT 1 // If the circuit comes in the default circuit box and able to be printed in the IC printer.
|
||||
#define IC_SPAWN_RESEARCH 2 // If the circuit design will be available in the IC printer after upgrading it.
|
||||
|
||||
// Displayed along with the pin name to show what type of pin it is.
|
||||
#define IC_FORMAT_ANY "\<ANY\>"
|
||||
#define IC_FORMAT_STRING "\<TEXT\>"
|
||||
@@ -49,7 +45,7 @@ var/list/all_integrated_circuits = list()
|
||||
/obj/item/integrated_circuit
|
||||
name = "integrated circuit"
|
||||
desc = "It's a tiny chip! This one doesn't seem to do much, however."
|
||||
icon = 'icons/obj/electronic_assemblies.dmi'
|
||||
icon = 'icons/obj/integrated_electronics/electronic_components.dmi'
|
||||
icon_state = "template"
|
||||
w_class = ITEMSIZE_TINY
|
||||
var/obj/item/device/electronic_assembly/assembly = null // Reference to the assembly holding this circuit, if any.
|
||||
|
||||
@@ -1,56 +1,29 @@
|
||||
#define IC_COMPONENTS_BASE 20
|
||||
#define IC_COMPLEXITY_BASE 60
|
||||
|
||||
// Here is where the base definition lives.
|
||||
// Specific subtypes are in their own folder.
|
||||
|
||||
/obj/item/device/electronic_assembly
|
||||
name = "electronic assembly"
|
||||
desc = "It's a case, for building small electronics with."
|
||||
w_class = ITEMSIZE_SMALL
|
||||
icon = 'icons/obj/electronic_assemblies.dmi'
|
||||
icon = 'icons/obj/integrated_electronics/electronic_setups.dmi'
|
||||
icon_state = "setup_small"
|
||||
show_messages = TRUE
|
||||
var/max_components = IC_COMPONENTS_BASE
|
||||
var/max_complexity = IC_COMPLEXITY_BASE
|
||||
var/opened = 0
|
||||
var/opened = FALSE
|
||||
var/can_anchor = FALSE // If true, wrenching it will anchor it.
|
||||
var/obj/item/weapon/cell/device/battery = null // Internal cell which most circuits need to work.
|
||||
var/net_power = 0 // Set every tick, to display how much power is being drawn in total.
|
||||
var/detail_color = COLOR_ASSEMBLY_BLACK
|
||||
|
||||
|
||||
/obj/item/device/electronic_assembly/medium
|
||||
name = "electronic mechanism"
|
||||
icon_state = "setup_medium"
|
||||
desc = "It's a case, for building medium-sized electronics with."
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
max_components = IC_COMPONENTS_BASE * 2
|
||||
max_complexity = IC_COMPLEXITY_BASE * 2
|
||||
|
||||
/obj/item/device/electronic_assembly/large
|
||||
name = "electronic machine"
|
||||
icon_state = "setup_large"
|
||||
desc = "It's a case, for building large electronics with."
|
||||
w_class = ITEMSIZE_LARGE
|
||||
max_components = IC_COMPONENTS_BASE * 4
|
||||
max_complexity = IC_COMPLEXITY_BASE * 4
|
||||
|
||||
/obj/item/device/electronic_assembly/drone
|
||||
name = "electronic drone"
|
||||
icon_state = "setup_drone"
|
||||
desc = "It's a case, for building mobile electronics with."
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
max_components = IC_COMPONENTS_BASE * 1.5
|
||||
max_complexity = IC_COMPLEXITY_BASE * 1.5
|
||||
|
||||
/obj/item/device/electronic_assembly/implant
|
||||
name = "electronic implant"
|
||||
icon_state = "setup_implant"
|
||||
desc = "It's a case, for building very tiny electronics with."
|
||||
w_class = ITEMSIZE_TINY
|
||||
max_components = IC_COMPONENTS_BASE / 2
|
||||
max_complexity = IC_COMPLEXITY_BASE / 2
|
||||
var/obj/item/weapon/implant/integrated_circuit/implant = null
|
||||
|
||||
/obj/item/device/electronic_assembly/New()
|
||||
..()
|
||||
/obj/item/device/electronic_assembly/initialize()
|
||||
battery = new(src)
|
||||
processing_objects |= src
|
||||
return ..()
|
||||
|
||||
/obj/item/device/electronic_assembly/Destroy()
|
||||
battery = null // It will be qdel'd by ..() if still in our contents
|
||||
@@ -61,35 +34,32 @@
|
||||
handle_idle_power()
|
||||
|
||||
/obj/item/device/electronic_assembly/proc/handle_idle_power()
|
||||
// First we generate power.
|
||||
for(var/obj/item/integrated_circuit/passive/power/P in contents)
|
||||
P.make_energy()
|
||||
net_power = 0 // Reset this. This gets increased/decreased with [give/draw]_power() outside of this loop.
|
||||
|
||||
// Now spend it.
|
||||
// First we handle passive sources. Most of these make power so they go first.
|
||||
for(var/obj/item/integrated_circuit/passive/power/P in contents)
|
||||
P.handle_passive_energy()
|
||||
|
||||
// Now we handle idle power draw.
|
||||
for(var/obj/item/integrated_circuit/IC in contents)
|
||||
if(IC.power_draw_idle)
|
||||
if(!draw_power(IC.power_draw_idle))
|
||||
IC.power_fail()
|
||||
|
||||
/obj/item/device/electronic_assembly/implant/update_icon()
|
||||
..()
|
||||
implant.icon_state = icon_state
|
||||
|
||||
|
||||
/obj/item/device/electronic_assembly/implant/nano_host()
|
||||
return implant
|
||||
|
||||
/obj/item/device/electronic_assembly/proc/resolve_nano_host()
|
||||
return src
|
||||
|
||||
/obj/item/device/electronic_assembly/implant/resolve_nano_host()
|
||||
return implant
|
||||
|
||||
/obj/item/device/electronic_assembly/proc/check_interactivity(mob/user)
|
||||
if(!CanInteract(user, physical_state))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/item/device/electronic_assembly/get_cell()
|
||||
return battery
|
||||
|
||||
/obj/item/device/electronic_assembly/interact(mob/user)
|
||||
if(!check_interactivity(user))
|
||||
return
|
||||
@@ -107,7 +77,8 @@
|
||||
HTML += "[total_parts]/[max_components] ([round((total_parts / max_components) * 100, 0.1)]%) space taken up in the assembly.<br>"
|
||||
HTML += "[total_complexity]/[max_complexity] ([round((total_complexity / max_complexity) * 100, 0.1)]%) maximum complexity.<br>"
|
||||
if(battery)
|
||||
HTML += "[round(battery.charge, 0.1)]/[battery.maxcharge] ([round(battery.percent(), 0.1)]%) cell charge. <a href='?src=\ref[src];remove_cell=1'>\[Remove\]</a>"
|
||||
HTML += "[round(battery.charge, 0.1)]/[battery.maxcharge] ([round(battery.percent(), 0.1)]%) cell charge. <a href='?src=\ref[src];remove_cell=1'>\[Remove\]</a><br>"
|
||||
HTML += "Net energy: [format_SI(net_power / CELLRATE, "W")]."
|
||||
else
|
||||
HTML += "<span class='danger'>No powercell detected!</span>"
|
||||
HTML += "<br><br>"
|
||||
@@ -175,14 +146,18 @@
|
||||
/obj/item/device/electronic_assembly/proc/can_move()
|
||||
return FALSE
|
||||
|
||||
/obj/item/device/electronic_assembly/drone/can_move()
|
||||
return TRUE
|
||||
|
||||
/obj/item/device/electronic_assembly/update_icon()
|
||||
if(opened)
|
||||
icon_state = initial(icon_state) + "-open"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
cut_overlays()
|
||||
if(detail_color == COLOR_ASSEMBLY_BLACK) //Black colored overlay looks almost but not exactly like the base sprite, so just cut the overlay and avoid it looking kinda off.
|
||||
return
|
||||
var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/integrated_electronics/electronic_setups.dmi', "[icon_state]-color")
|
||||
detail_overlay.color = detail_color
|
||||
add_overlay(detail_overlay)
|
||||
|
||||
|
||||
/obj/item/device/electronic_assembly/GetAccess()
|
||||
. = list()
|
||||
@@ -244,6 +219,11 @@
|
||||
|
||||
return TRUE
|
||||
|
||||
// Non-interactive version of above that always succeeds, intended for build-in circuits that get added on assembly initialization.
|
||||
/obj/item/device/electronic_assembly/proc/force_add_circuit(var/obj/item/integrated_circuit/IC)
|
||||
IC.forceMove(src)
|
||||
IC.assembly = src
|
||||
|
||||
/obj/item/device/electronic_assembly/afterattack(atom/target, mob/user, proximity)
|
||||
if(proximity)
|
||||
var/scanned = FALSE
|
||||
@@ -256,7 +236,17 @@
|
||||
visible_message("<span class='notice'>\The [user] waves \the [src] around [target].</span>")
|
||||
|
||||
/obj/item/device/electronic_assembly/attackby(var/obj/item/I, var/mob/user)
|
||||
if(istype(I, /obj/item/integrated_circuit))
|
||||
if(can_anchor && I.is_wrench())
|
||||
anchored = !anchored
|
||||
to_chat(user, span("notice", "You've [anchored ? "" : "un"]secured \the [src] to \the [get_turf(src)]."))
|
||||
if(anchored)
|
||||
on_anchored()
|
||||
else
|
||||
on_unanchored()
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
return TRUE
|
||||
|
||||
else if(istype(I, /obj/item/integrated_circuit))
|
||||
if(!user.unEquip(I))
|
||||
return FALSE
|
||||
if(add_circuit(I, user))
|
||||
@@ -264,18 +254,26 @@
|
||||
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
interact(user)
|
||||
return TRUE
|
||||
else if(istype(I, /obj/item/weapon/crowbar))
|
||||
|
||||
else if(I.is_crowbar())
|
||||
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
|
||||
opened = !opened
|
||||
to_chat(user, "<span class='notice'>You [opened ? "opened" : "closed"] \the [src].</span>")
|
||||
update_icon()
|
||||
return TRUE
|
||||
else if(istype(I, /obj/item/device/integrated_electronics/wirer) || istype(I, /obj/item/device/integrated_electronics/debugger) || istype(I, /obj/item/weapon/screwdriver))
|
||||
|
||||
else if(istype(I, /obj/item/device/integrated_electronics/wirer) || istype(I, /obj/item/device/integrated_electronics/debugger) || I.is_screwdriver())
|
||||
if(opened)
|
||||
interact(user)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>\The [src] isn't opened, so you can't fiddle with the internal components. \
|
||||
Try using a crowbar.</span>")
|
||||
|
||||
else if(istype(I, /obj/item/device/integrated_electronics/detailer))
|
||||
var/obj/item/device/integrated_electronics/detailer/D = I
|
||||
detail_color = D.detail_color
|
||||
update_icon()
|
||||
|
||||
else if(istype(I, /obj/item/weapon/cell/device))
|
||||
if(!opened)
|
||||
to_chat(user, "<span class='warning'>\The [src] isn't opened, so you can't put anything inside. Try using a crowbar.</span>")
|
||||
@@ -291,6 +289,7 @@
|
||||
to_chat(user, "<span class='notice'>You slot \the [cell] inside \the [src]'s power supplier.</span>")
|
||||
interact(user)
|
||||
return TRUE
|
||||
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -331,13 +330,32 @@
|
||||
|
||||
// Returns true if power was successfully drawn.
|
||||
/obj/item/device/electronic_assembly/proc/draw_power(amount)
|
||||
if(battery && battery.checked_use(amount * CELLRATE))
|
||||
if(battery)
|
||||
var/lost = battery.use(amount * CELLRATE)
|
||||
net_power -= lost
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
// Ditto for giving.
|
||||
/obj/item/device/electronic_assembly/proc/give_power(amount)
|
||||
if(battery && battery.give(amount * CELLRATE))
|
||||
if(battery)
|
||||
var/gained = battery.give(amount * CELLRATE)
|
||||
net_power += gained
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/device/electronic_assembly/on_loc_moved(oldloc)
|
||||
for(var/obj/O in contents)
|
||||
O.on_loc_moved(oldloc)
|
||||
|
||||
/obj/item/device/electronic_assembly/Moved(var/oldloc)
|
||||
for(var/obj/O in contents)
|
||||
O.on_loc_moved(oldloc)
|
||||
|
||||
/obj/item/device/electronic_assembly/proc/on_anchored()
|
||||
for(var/obj/item/integrated_circuit/IC in contents)
|
||||
IC.on_anchored()
|
||||
|
||||
/obj/item/device/electronic_assembly/proc/on_unanchored()
|
||||
for(var/obj/item/integrated_circuit/IC in contents)
|
||||
IC.on_unanchored()
|
||||
|
||||
@@ -0,0 +1,187 @@
|
||||
|
||||
// The base subtype for assemblies that can be worn. Certain pieces will have more or less capabilities
|
||||
// E.g. Glasses have less room than something worn over the chest.
|
||||
// Note that the electronic assembly is INSIDE the object that actually gets worn, in a similar way to implants.
|
||||
|
||||
/obj/item/device/electronic_assembly/clothing
|
||||
name = "electronic clothing"
|
||||
icon_state = "circuitry" // Needs to match the clothing's base icon_state.
|
||||
desc = "It's a case, for building machines attached to clothing."
|
||||
w_class = ITEMSIZE_SMALL
|
||||
max_components = IC_COMPONENTS_BASE
|
||||
max_complexity = IC_COMPLEXITY_BASE
|
||||
var/obj/item/clothing/clothing = null
|
||||
|
||||
/obj/item/device/electronic_assembly/clothing/nano_host()
|
||||
return clothing
|
||||
|
||||
/obj/item/device/electronic_assembly/clothing/resolve_nano_host()
|
||||
return clothing
|
||||
|
||||
/obj/item/device/electronic_assembly/clothing/update_icon()
|
||||
..()
|
||||
clothing.icon_state = icon_state
|
||||
// We don't need to update the mob sprite since it won't (and shouldn't) actually get changed.
|
||||
|
||||
// This is 'small' relative to the size of regular clothing assemblies.
|
||||
/obj/item/device/electronic_assembly/clothing/small
|
||||
max_components = IC_COMPONENTS_BASE / 2
|
||||
max_complexity = IC_COMPLEXITY_BASE / 2
|
||||
w_class = ITEMSIZE_TINY
|
||||
|
||||
// Ditto.
|
||||
/obj/item/device/electronic_assembly/clothing/large
|
||||
max_components = IC_COMPONENTS_BASE * 2
|
||||
max_complexity = IC_COMPLEXITY_BASE * 2
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
|
||||
|
||||
// This is defined higher up, in /clothing to avoid lots of copypasta.
|
||||
/obj/item/clothing
|
||||
var/obj/item/device/electronic_assembly/clothing/IC = null
|
||||
var/obj/item/integrated_circuit/built_in/action_button/action_circuit = null // This gets pulsed when someone clicks the button on the hud.
|
||||
|
||||
/obj/item/clothing/emp_act(severity)
|
||||
if(IC)
|
||||
IC.emp_act(severity)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/examine(mob/user)
|
||||
if(IC)
|
||||
IC.examine(user)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/attackby(obj/item/I, mob/user)
|
||||
if(IC)
|
||||
// This needs to be done in a better way...
|
||||
if(I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/integrated_circuit) || istype(I, /obj/item/weapon/cell/device) || istype(I, /obj/item/device/integrated_electronics) )
|
||||
IC.attackby(I, user)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/clothing/attack_self(mob/user)
|
||||
if(IC)
|
||||
if(IC.opened)
|
||||
IC.attack_self(user)
|
||||
else
|
||||
action_circuit.do_work()
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/clothing/Moved(oldloc)
|
||||
if(IC)
|
||||
IC.on_loc_moved(oldloc)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/clothing/on_loc_moved(oldloc)
|
||||
if(IC)
|
||||
IC.on_loc_moved(oldloc)
|
||||
else
|
||||
..()
|
||||
|
||||
// Does most of the repeatative setup.
|
||||
/obj/item/clothing/proc/setup_integrated_circuit(new_type)
|
||||
// Set up the internal circuit holder.
|
||||
IC = new new_type(src)
|
||||
IC.clothing = src
|
||||
IC.name = name
|
||||
|
||||
// Clothing assemblies can be triggered by clicking on the HUD. This allows that to occur.
|
||||
action_circuit = new(src.IC)
|
||||
IC.force_add_circuit(action_circuit)
|
||||
action_button_name = "Activate [name]"
|
||||
|
||||
/obj/item/clothing/Destroy()
|
||||
if(IC)
|
||||
IC.clothing = null
|
||||
action_circuit = null // Will get deleted by qdel-ing the IC assembly.
|
||||
qdel(IC)
|
||||
return ..()
|
||||
|
||||
// Specific subtypes.
|
||||
|
||||
// Jumpsuit.
|
||||
/obj/item/clothing/under/circuitry
|
||||
name = "electronic jumpsuit"
|
||||
desc = "It's a wearable case for electronics. This on is a black jumpsuit with wiring weaved into the fabric."
|
||||
icon_state = "circuitry"
|
||||
worn_state = "circuitry"
|
||||
|
||||
/obj/item/clothing/under/circuitry/initialize()
|
||||
setup_integrated_circuit(/obj/item/device/electronic_assembly/clothing)
|
||||
return ..()
|
||||
|
||||
|
||||
// Gloves.
|
||||
/obj/item/clothing/gloves/circuitry
|
||||
name = "electronic gloves"
|
||||
desc = "It's a wearable case for electronics. This one is a pair of black gloves, with wires woven into them. A small \
|
||||
device with a screen is attached to the left glove."
|
||||
icon_state = "circuitry"
|
||||
item_state = "circuitry"
|
||||
|
||||
/obj/item/clothing/gloves/circuitry/initialize()
|
||||
setup_integrated_circuit(/obj/item/device/electronic_assembly/clothing/small)
|
||||
return ..()
|
||||
|
||||
|
||||
// Glasses.
|
||||
/obj/item/clothing/glasses/circuitry
|
||||
name = "electronic goggles"
|
||||
desc = "It's a wearable case for electronics. This one is a pair of goggles, with wiring sticking out. \
|
||||
Could this augment your vision?" // Sadly it won't, or at least not yet.
|
||||
icon_state = "circuitry"
|
||||
item_state = "night" // The on-mob sprite would be identical anyways.
|
||||
|
||||
/obj/item/clothing/glasses/circuitry/initialize()
|
||||
setup_integrated_circuit(/obj/item/device/electronic_assembly/clothing/small)
|
||||
return ..()
|
||||
|
||||
// Shoes
|
||||
/obj/item/clothing/shoes/circuitry
|
||||
name = "electronic boots"
|
||||
desc = "It's a wearable case for electronics. This one is a pair of boots, with wires attached to a small \
|
||||
cover."
|
||||
icon_state = "circuitry"
|
||||
item_state = "circuitry"
|
||||
|
||||
/obj/item/clothing/shoes/circuitry/initialize()
|
||||
setup_integrated_circuit(/obj/item/device/electronic_assembly/clothing/small)
|
||||
return ..()
|
||||
|
||||
// Head
|
||||
/obj/item/clothing/head/circuitry
|
||||
name = "electronic headwear"
|
||||
desc = "It's a wearable case for electronics. This one appears to be a very technical-looking piece that \
|
||||
goes around the collar, with a heads-up-display attached on the right."
|
||||
icon_state = "circuitry"
|
||||
item_state = "circuitry"
|
||||
|
||||
/obj/item/clothing/head/circuitry/initialize()
|
||||
setup_integrated_circuit(/obj/item/device/electronic_assembly/clothing/small)
|
||||
return ..()
|
||||
|
||||
// Ear
|
||||
/obj/item/clothing/ears/circuitry
|
||||
name = "electronic earwear"
|
||||
desc = "It's a wearable case for electronics. This one appears to be a technical-looking headset."
|
||||
icon = 'icons/obj/clothing/ears.dmi'
|
||||
icon_state = "circuitry"
|
||||
item_state = "circuitry"
|
||||
|
||||
/obj/item/clothing/ears/circuitry/initialize()
|
||||
setup_integrated_circuit(/obj/item/device/electronic_assembly/clothing/small)
|
||||
return ..()
|
||||
|
||||
// Exo-slot
|
||||
/obj/item/clothing/suit/circuitry
|
||||
name = "electronic chestpiece"
|
||||
desc = "It's a wearable case for electronics. This one appears to be a very technical-looking vest, that \
|
||||
almost looks professionally made, however the wiring popping out betrays that idea."
|
||||
icon_state = "circuitry"
|
||||
item_state = "circuitry"
|
||||
|
||||
/obj/item/clothing/suit/circuitry/initialize()
|
||||
setup_integrated_circuit(/obj/item/device/electronic_assembly/clothing/large)
|
||||
return ..()
|
||||
+84
-87
@@ -1,87 +1,84 @@
|
||||
/obj/item/device/assembly/electronic_assembly
|
||||
name = "electronic device"
|
||||
desc = "It's a case for building electronics with. It can be attached to other small devices."
|
||||
icon_state = "setup_device"
|
||||
var/opened = 0
|
||||
|
||||
var/obj/item/device/electronic_assembly/device/EA
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/New()
|
||||
EA = new(src)
|
||||
EA.holder = src
|
||||
..()
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if (iscrowbar(I) )
|
||||
toggle_open(user)
|
||||
else if (opened)
|
||||
EA.attackby(I, user)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/device/electronic_assembly/get_cell()
|
||||
return battery
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/proc/toggle_open(mob/user)
|
||||
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
|
||||
opened = !opened
|
||||
EA.opened = opened
|
||||
to_chat(user, "<span class='notice'>You [opened ? "opened" : "closed"] \the [src].</span>")
|
||||
secured = 1
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/update_icon()
|
||||
if(EA)
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
icon_state = initial(icon_state)+"0"
|
||||
if(opened)
|
||||
icon_state = icon_state + "-open"
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/attack_self(mob/user as mob)
|
||||
if(EA)
|
||||
EA.attack_self(user)
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/pulsed(var/radio = 0) //Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs
|
||||
if(EA)
|
||||
for(var/obj/item/integrated_circuit/built_in/device_input/I in EA.contents)
|
||||
I.do_work()
|
||||
return
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/examine(mob/user)
|
||||
.=..(user, 1)
|
||||
if(EA)
|
||||
for(var/obj/item/integrated_circuit/IC in EA.contents)
|
||||
IC.external_examine(user)
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/verb/toggle()
|
||||
set src in usr
|
||||
set category = "Object"
|
||||
set name = "Open/Close Device Assembly"
|
||||
set desc = "Open or close device assembly!"
|
||||
|
||||
toggle_open(usr)
|
||||
|
||||
|
||||
/obj/item/device/electronic_assembly/device
|
||||
name = "electronic device"
|
||||
icon_state = "setup_device"
|
||||
desc = "It's a tiny electronic device with specific use for attaching to other devices."
|
||||
var/obj/item/device/assembly/electronic_assembly/holder
|
||||
w_class = ITEMSIZE_TINY
|
||||
max_components = IC_COMPONENTS_BASE * 3/4
|
||||
max_complexity = IC_COMPLEXITY_BASE * 3/4
|
||||
|
||||
|
||||
/obj/item/device/electronic_assembly/device/New()
|
||||
..()
|
||||
var/obj/item/integrated_circuit/built_in/device_input/input = new(src)
|
||||
var/obj/item/integrated_circuit/built_in/device_output/output = new(src)
|
||||
input.assembly = src
|
||||
output.assembly = src
|
||||
|
||||
/obj/item/device/electronic_assembly/device/check_interactivity(mob/user)
|
||||
if(!CanInteract(user, state = deep_inventory_state))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly
|
||||
name = "electronic device"
|
||||
desc = "It's a case for building electronics with. It can be attached to other small devices."
|
||||
icon_state = "setup_device"
|
||||
var/opened = 0
|
||||
|
||||
var/obj/item/device/electronic_assembly/device/EA
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/New()
|
||||
EA = new(src)
|
||||
EA.holder = src
|
||||
..()
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if (I.is_crowbar())
|
||||
toggle_open(user)
|
||||
else if (opened)
|
||||
EA.attackby(I, user)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/proc/toggle_open(mob/user)
|
||||
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
|
||||
opened = !opened
|
||||
EA.opened = opened
|
||||
to_chat(user, "<span class='notice'>You [opened ? "opened" : "closed"] \the [src].</span>")
|
||||
secured = 1
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/update_icon()
|
||||
if(EA)
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
icon_state = initial(icon_state)+"0"
|
||||
if(opened)
|
||||
icon_state = icon_state + "-open"
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/attack_self(mob/user as mob)
|
||||
if(EA)
|
||||
EA.attack_self(user)
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/pulsed(var/radio = 0) //Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs
|
||||
if(EA)
|
||||
for(var/obj/item/integrated_circuit/built_in/device_input/I in EA.contents)
|
||||
I.do_work()
|
||||
return
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/examine(mob/user)
|
||||
.=..(user, 1)
|
||||
if(EA)
|
||||
for(var/obj/item/integrated_circuit/IC in EA.contents)
|
||||
IC.external_examine(user)
|
||||
|
||||
/obj/item/device/assembly/electronic_assembly/verb/toggle()
|
||||
set src in usr
|
||||
set category = "Object"
|
||||
set name = "Open/Close Device Assembly"
|
||||
set desc = "Open or close device assembly!"
|
||||
|
||||
toggle_open(usr)
|
||||
|
||||
|
||||
/obj/item/device/electronic_assembly/device
|
||||
name = "electronic device"
|
||||
icon_state = "setup_device"
|
||||
desc = "It's a tiny electronic device with specific use for attaching to other devices."
|
||||
var/obj/item/device/assembly/electronic_assembly/holder
|
||||
w_class = ITEMSIZE_TINY
|
||||
max_components = IC_COMPONENTS_BASE * 3/4
|
||||
max_complexity = IC_COMPLEXITY_BASE * 3/4
|
||||
|
||||
|
||||
/obj/item/device/electronic_assembly/device/New()
|
||||
..()
|
||||
var/obj/item/integrated_circuit/built_in/device_input/input = new(src)
|
||||
var/obj/item/integrated_circuit/built_in/device_output/output = new(src)
|
||||
input.assembly = src
|
||||
output.assembly = src
|
||||
|
||||
/obj/item/device/electronic_assembly/device/check_interactivity(mob/user)
|
||||
if(!CanInteract(user, state = deep_inventory_state))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -0,0 +1,261 @@
|
||||
// Generic subtypes without a lot of special code.
|
||||
|
||||
// Small assemblies.
|
||||
|
||||
/obj/item/device/electronic_assembly/default
|
||||
name = "type-a electronic assembly"
|
||||
|
||||
/obj/item/device/electronic_assembly/calc
|
||||
name = "type-b electronic assembly"
|
||||
icon_state = "setup_small_calc"
|
||||
desc = "It's a case, for building small electronics with. This one resembles a pocket calculator."
|
||||
|
||||
/obj/item/device/electronic_assembly/clam
|
||||
name = "type-c electronic assembly"
|
||||
icon_state = "setup_small_clam"
|
||||
desc = "It's a case, for building small electronics with. This one has a clamshell design."
|
||||
|
||||
/obj/item/device/electronic_assembly/simple
|
||||
name = "type-d electronic assembly"
|
||||
icon_state = "setup_small_simple"
|
||||
desc = "It's a case, for building small electronics with. This one has a simple design."
|
||||
|
||||
/obj/item/device/electronic_assembly/hook
|
||||
name = "type-e electronic assembly"
|
||||
icon_state = "setup_small_hook"
|
||||
desc = "It's a case, for building small electronics with. This one looks like it has a belt clip, but it's purely decorative."
|
||||
|
||||
/obj/item/device/electronic_assembly/pda
|
||||
name = "type-f electronic assembly"
|
||||
icon_state = "setup_small_pda"
|
||||
desc = "It's a case, for building small electronics with. This one resembles a PDA."
|
||||
|
||||
// Tiny assemblies.
|
||||
|
||||
/obj/item/device/electronic_assembly/tiny
|
||||
name = "electronic device"
|
||||
icon_state = "setup_device"
|
||||
desc = "It's a case, for building tiny-sized electronics with."
|
||||
w_class = ITEMSIZE_TINY
|
||||
max_components = IC_COMPONENTS_BASE / 2
|
||||
max_complexity = IC_COMPLEXITY_BASE / 2
|
||||
|
||||
/obj/item/device/electronic_assembly/tiny/default
|
||||
name = "type-a electronic device"
|
||||
|
||||
/obj/item/device/electronic_assembly/tiny/cylinder
|
||||
name = "type-b electronic device"
|
||||
icon_state = "setup_device_cylinder"
|
||||
desc = "It's a case, for building tiny-sized electronics with. This one has a cylindrical design."
|
||||
|
||||
/obj/item/device/electronic_assembly/tiny/scanner
|
||||
name = "type-c electronic device"
|
||||
icon_state = "setup_device_scanner"
|
||||
desc = "It's a case, for building tiny-sized electronics with. This one has a scanner-like design."
|
||||
|
||||
/obj/item/device/electronic_assembly/tiny/hook
|
||||
name = "type-d electronic device"
|
||||
icon_state = "setup_device_hook"
|
||||
desc = "It's a case, for building tiny-sized electronics with. This one looks like it has a belt clip, but it's purely decorative."
|
||||
|
||||
/obj/item/device/electronic_assembly/tiny/box
|
||||
name = "type-e electronic device"
|
||||
icon_state = "setup_device_box"
|
||||
desc = "It's a case, for building tiny-sized electronics with. This one has a boxy design."
|
||||
|
||||
// Medium assemblies.
|
||||
|
||||
/obj/item/device/electronic_assembly/medium
|
||||
name = "electronic mechanism"
|
||||
icon_state = "setup_medium"
|
||||
desc = "It's a case, for building medium-sized electronics with."
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
max_components = IC_COMPONENTS_BASE * 2
|
||||
max_complexity = IC_COMPLEXITY_BASE * 2
|
||||
|
||||
/obj/item/device/electronic_assembly/medium/default
|
||||
name = "type-a electronic mechanism"
|
||||
|
||||
/obj/item/device/electronic_assembly/medium/box
|
||||
name = "type-b electronic mechanism"
|
||||
icon_state = "setup_medium_box"
|
||||
desc = "It's a case, for building medium-sized electronics with. This one has a boxy design."
|
||||
|
||||
/obj/item/device/electronic_assembly/medium/clam
|
||||
name = "type-c electronic mechanism"
|
||||
icon_state = "setup_medium_clam"
|
||||
desc = "It's a case, for building medium-sized electronics with. This one has a clamshell design."
|
||||
|
||||
/obj/item/device/electronic_assembly/medium/medical
|
||||
name = "type-d electronic mechanism"
|
||||
icon_state = "setup_medium_med"
|
||||
desc = "It's a case, for building medium-sized electronics with. This one resembles some type of medical apparatus."
|
||||
|
||||
/obj/item/device/electronic_assembly/medium/gun
|
||||
name = "type-e electronic mechanism"
|
||||
icon_state = "setup_medium_gun"
|
||||
item_state = "circuitgun"
|
||||
desc = "It's a case, for building medium-sized electronics with. This one resembles a gun, or some type of tool, \
|
||||
if you're feeling optimistic."
|
||||
// can_fire_equipped = TRUE
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/lefthand_guns.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_guns.dmi',
|
||||
)
|
||||
|
||||
/obj/item/device/electronic_assembly/medium/radio
|
||||
name = "type-f electronic mechanism"
|
||||
icon_state = "setup_medium_radio"
|
||||
desc = "It's a case, for building medium-sized electronics with. This one resembles an old radio."
|
||||
|
||||
// Large assemblies.
|
||||
|
||||
/obj/item/device/electronic_assembly/large
|
||||
name = "electronic machine"
|
||||
icon_state = "setup_large"
|
||||
desc = "It's a case, for building large electronics with."
|
||||
w_class = ITEMSIZE_LARGE
|
||||
max_components = IC_COMPONENTS_BASE * 4
|
||||
max_complexity = IC_COMPLEXITY_BASE * 4
|
||||
can_anchor = TRUE
|
||||
|
||||
/obj/item/device/electronic_assembly/large/default
|
||||
name = "type-a electronic machine"
|
||||
|
||||
/obj/item/device/electronic_assembly/large/scope
|
||||
name = "type-b electronic machine"
|
||||
icon_state = "setup_large_scope"
|
||||
desc = "It's a case, for building large electronics with. This one resembles an oscilloscope."
|
||||
|
||||
/obj/item/device/electronic_assembly/large/terminal
|
||||
name = "type-c electronic machine"
|
||||
icon_state = "setup_large_terminal"
|
||||
desc = "It's a case, for building large electronics with. This one resembles a computer terminal."
|
||||
|
||||
/obj/item/device/electronic_assembly/large/arm
|
||||
name = "type-d electronic machine"
|
||||
icon_state = "setup_large_arm"
|
||||
desc = "It's a case, for building large electronics with. This one resembles a robotic arm."
|
||||
|
||||
/obj/item/device/electronic_assembly/large/tall
|
||||
name = "type-e electronic machine"
|
||||
icon_state = "setup_large_tall"
|
||||
desc = "It's a case, for building large electronics with. This one has a tall design."
|
||||
|
||||
/obj/item/device/electronic_assembly/large/industrial
|
||||
name = "type-f electronic machine"
|
||||
icon_state = "setup_large_industrial"
|
||||
desc = "It's a case, for building large electronics with. This one resembles some kind of industrial machinery."
|
||||
|
||||
// Drone assemblies, which can move with the locomotion circuit.
|
||||
|
||||
/obj/item/device/electronic_assembly/drone
|
||||
name = "electronic drone"
|
||||
icon_state = "setup_drone"
|
||||
desc = "It's a case, for building mobile electronics with."
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
max_components = IC_COMPONENTS_BASE * 1.5
|
||||
max_complexity = IC_COMPLEXITY_BASE * 1.5
|
||||
can_anchor = FALSE
|
||||
|
||||
/obj/item/device/electronic_assembly/drone/can_move()
|
||||
return TRUE
|
||||
|
||||
/obj/item/device/electronic_assembly/drone/default
|
||||
name = "type-a electronic drone"
|
||||
|
||||
/obj/item/device/electronic_assembly/drone/arms
|
||||
name = "type-b electronic drone"
|
||||
icon_state = "setup_drone_arms"
|
||||
desc = "It's a case, for building mobile electronics with. This one is armed and dangerous."
|
||||
|
||||
/obj/item/device/electronic_assembly/drone/secbot
|
||||
name = "type-c electronic drone"
|
||||
icon_state = "setup_drone_secbot"
|
||||
desc = "It's a case, for building mobile electronics with. This one resembles a Securitron."
|
||||
|
||||
/obj/item/device/electronic_assembly/drone/medbot
|
||||
name = "type-d electronic drone"
|
||||
icon_state = "setup_drone_medbot"
|
||||
desc = "It's a case, for building mobile electronics with. This one resembles a Medibot."
|
||||
|
||||
/obj/item/device/electronic_assembly/drone/genbot
|
||||
name = "type-e electronic drone"
|
||||
icon_state = "setup_drone_genbot"
|
||||
desc = "It's a case, for building mobile electronics with. This one has a generic bot design."
|
||||
|
||||
/obj/item/device/electronic_assembly/drone/android
|
||||
name = "type-f electronic drone"
|
||||
icon_state = "setup_drone_android"
|
||||
desc = "It's a case, for building mobile electronics with. This one has a hominoid design."
|
||||
|
||||
// Wall mounted assemblies.
|
||||
|
||||
/obj/item/device/electronic_assembly/wallmount
|
||||
name = "wall-mounted electronic assembly"
|
||||
icon_state = "setup_wallmount_medium"
|
||||
desc = "It's a case, for building medium-sized electronics with. It has a magnetized \
|
||||
backing to allow it to stick to walls."
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
max_components = IC_COMPONENTS_BASE * 2
|
||||
max_complexity = IC_COMPLEXITY_BASE * 2
|
||||
can_anchor = TRUE
|
||||
|
||||
/obj/item/device/electronic_assembly/wallmount/proc/mount_assembly(turf/on_wall, mob/user)
|
||||
if(get_dist(on_wall,user) > 1)
|
||||
return
|
||||
var/ndir = get_dir(on_wall, user)
|
||||
if(!(ndir in cardinal))
|
||||
return
|
||||
var/turf/T = get_turf(user)
|
||||
if(!istype(T, /turf/simulated/floor))
|
||||
to_chat(user, "<span class='warning'>You cannot place \the [src] on this spot!</span>")
|
||||
return
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 75, 1)
|
||||
user.visible_message("\The [user] attaches \the [src] to the wall.",
|
||||
"<span class='notice'>You attach \the [src] to the wall.</span>",
|
||||
"<span class='italics'>You hear clicking.</span>")
|
||||
user.drop_item(T)
|
||||
anchored = TRUE
|
||||
on_anchored()
|
||||
switch(ndir)
|
||||
if(NORTH)
|
||||
pixel_y = -31
|
||||
if(SOUTH)
|
||||
pixel_y = 31
|
||||
if(EAST)
|
||||
pixel_x = -31
|
||||
if(WEST)
|
||||
pixel_x = 31
|
||||
|
||||
/obj/item/device/electronic_assembly/wallmount/on_unanchored()
|
||||
pixel_x = 0
|
||||
pixel_y = 0
|
||||
..()
|
||||
|
||||
/obj/item/device/electronic_assembly/wallmount/heavy
|
||||
name = "heavy wall-mounted electronic assembly"
|
||||
icon_state = "setup_wallmount_large"
|
||||
desc = "It's a case, for building large electronics with. It has a magnetized backing \
|
||||
to allow it to stick to walls."
|
||||
w_class = ITEMSIZE_LARGE
|
||||
max_components = IC_COMPONENTS_BASE * 4
|
||||
max_complexity = IC_COMPLEXITY_BASE * 4
|
||||
|
||||
/obj/item/device/electronic_assembly/wallmount/light
|
||||
name = "light wall-mounted electronic assembly"
|
||||
icon_state = "setup_wallmount_small"
|
||||
desc = "It's a case, for building small electronics with. It has a magnetized backing \
|
||||
to allow it to stick to walls."
|
||||
w_class = ITEMSIZE_SMALL
|
||||
max_components = IC_COMPONENTS_BASE
|
||||
max_complexity = IC_COMPLEXITY_BASE
|
||||
|
||||
/obj/item/device/electronic_assembly/wallmount/tiny
|
||||
name = "tiny wall-mounted electronic assembly"
|
||||
icon_state = "setup_wallmount_tiny"
|
||||
desc = "It's a case, for building tiny electronics with. It has a magnetized backing \
|
||||
to allow it to stick to walls."
|
||||
w_class = ITEMSIZE_TINY
|
||||
max_components = IC_COMPONENTS_BASE / 2
|
||||
max_complexity = IC_COMPLEXITY_BASE / 2
|
||||
@@ -0,0 +1,21 @@
|
||||
// Note that this is contained inside an actual implant subtype.
|
||||
// See code/game/objects/items/weapons/implants/implantcircuits.dm for where this gets held.
|
||||
|
||||
/obj/item/device/electronic_assembly/implant
|
||||
name = "electronic implant"
|
||||
icon_state = "setup_implant"
|
||||
desc = "It's a case, for building very tiny electronics with."
|
||||
w_class = ITEMSIZE_TINY
|
||||
max_components = IC_COMPONENTS_BASE / 2
|
||||
max_complexity = IC_COMPLEXITY_BASE / 2
|
||||
var/obj/item/weapon/implant/integrated_circuit/implant = null
|
||||
|
||||
/obj/item/device/electronic_assembly/implant/nano_host()
|
||||
return implant
|
||||
|
||||
/obj/item/device/electronic_assembly/implant/resolve_nano_host()
|
||||
return implant
|
||||
|
||||
/obj/item/device/electronic_assembly/implant/update_icon()
|
||||
..()
|
||||
implant.icon_state = icon_state
|
||||
@@ -0,0 +1,45 @@
|
||||
/obj/item/device/integrated_electronics/detailer
|
||||
name = "assembly detailer"
|
||||
desc = "A combination autopainter and flash anodizer designed to give electronic assemblies a colorful, wear-resistant finish."
|
||||
icon = 'icons/obj/integrated_electronics/electronic_tools.dmi'
|
||||
icon_state = "detailer"
|
||||
item_flags = NOBLUDGEON
|
||||
w_class = ITEMSIZE_SMALL
|
||||
var/detail_color = COLOR_ASSEMBLY_WHITE
|
||||
var/list/color_list = list(
|
||||
"black" = COLOR_ASSEMBLY_BLACK,
|
||||
"machine gray" = COLOR_ASSEMBLY_BGRAY,
|
||||
"white" = COLOR_ASSEMBLY_WHITE,
|
||||
"red" = COLOR_ASSEMBLY_RED,
|
||||
"orange" = COLOR_ASSEMBLY_ORANGE,
|
||||
"beige" = COLOR_ASSEMBLY_BEIGE,
|
||||
"brown" = COLOR_ASSEMBLY_BROWN,
|
||||
"gold" = COLOR_ASSEMBLY_GOLD,
|
||||
"yellow" = COLOR_ASSEMBLY_YELLOW,
|
||||
"gurkha" = COLOR_ASSEMBLY_GURKHA,
|
||||
"light green" = COLOR_ASSEMBLY_LGREEN,
|
||||
"green" = COLOR_ASSEMBLY_GREEN,
|
||||
"light blue" = COLOR_ASSEMBLY_LBLUE,
|
||||
"blue" = COLOR_ASSEMBLY_BLUE,
|
||||
"purple" = COLOR_ASSEMBLY_PURPLE,
|
||||
"hot pink" = COLOR_ASSEMBLY_HOT_PINK
|
||||
)
|
||||
|
||||
/obj/item/device/integrated_electronics/detailer/initialize()
|
||||
update_icon()
|
||||
return ..()
|
||||
|
||||
/obj/item/device/integrated_electronics/detailer/update_icon()
|
||||
cut_overlays()
|
||||
var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/integrated_electronics/electronic_tools.dmi', "detailer-color")
|
||||
detail_overlay.color = detail_color
|
||||
add_overlay(detail_overlay)
|
||||
|
||||
/obj/item/device/integrated_electronics/detailer/attack_self(mob/user)
|
||||
var/color_choice = input(user, "Select color.", "Assembly Detailer", detail_color) as null|anything in color_list
|
||||
if(!color_list[color_choice])
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
detail_color = color_list[color_choice]
|
||||
update_icon()
|
||||
@@ -1,7 +1,8 @@
|
||||
/obj/item/integrated_circuit/proc/setup_io(var/list/io_list, var/io_type, var/list/io_default_list)
|
||||
var/list/io_list_copy = io_list.Copy()
|
||||
io_list.Cut()
|
||||
var/i = 0
|
||||
var/i = 1
|
||||
|
||||
for(var/io_entry in io_list_copy)
|
||||
var/default_data = null
|
||||
var/io_type_override = null
|
||||
@@ -13,10 +14,10 @@
|
||||
io_type_override = io_list_copy[io_entry]
|
||||
|
||||
if(io_type_override)
|
||||
// world << "io_type_override is now [io_type_override] on [src]."
|
||||
io_list.Add(new io_type_override(src, io_entry, default_data))
|
||||
else
|
||||
io_list.Add(new io_type(src, io_entry, default_data))
|
||||
i++
|
||||
|
||||
/obj/item/integrated_circuit/proc/set_pin_data(var/pin_type, var/pin_number, datum/new_data)
|
||||
if (istype(new_data) && !isweakref(new_data))
|
||||
|
||||
@@ -330,6 +330,7 @@ a creative player the means to solve many problems. Circuits are held inside an
|
||||
to_chat(usr, "<span class='warning'>\The [src] seems to be permanently attached to the case.</span>")
|
||||
return
|
||||
var/obj/item/device/electronic_assembly/ea = loc
|
||||
power_fail()
|
||||
disconnect_all()
|
||||
var/turf/T = get_turf(src)
|
||||
forceMove(T)
|
||||
@@ -394,3 +395,9 @@ a creative player the means to solve many problems. Circuits are held inside an
|
||||
O.disconnect()
|
||||
for(var/datum/integrated_io/activate/A in activators)
|
||||
A.disconnect()
|
||||
|
||||
/obj/item/integrated_circuit/proc/on_anchored()
|
||||
return
|
||||
|
||||
/obj/item/integrated_circuit/proc/on_unanchored()
|
||||
return
|
||||
@@ -28,7 +28,7 @@ D [1]/ ||
|
||||
/datum/integrated_io/New(var/newloc, var/name, var/new_data)
|
||||
..()
|
||||
src.name = name
|
||||
if(new_data)
|
||||
if(!isnull(new_data))
|
||||
src.data = new_data
|
||||
holder = newloc
|
||||
if(!istype(holder))
|
||||
|
||||
@@ -2,16 +2,17 @@
|
||||
/obj/item/device/integrated_circuit_printer
|
||||
name = "integrated circuit printer"
|
||||
desc = "A portable(ish) machine made to print tiny modular circuitry out of metal."
|
||||
icon = 'icons/obj/electronic_assemblies.dmi'
|
||||
icon = 'icons/obj/integrated_electronics/electronic_tools.dmi'
|
||||
icon_state = "circuit_printer"
|
||||
w_class = ITEMSIZE_LARGE
|
||||
var/metal = 0
|
||||
var/max_metal = 100
|
||||
var/metal_per_sheet = 10 // One sheet equals this much metal.
|
||||
var/debug = FALSE // If true, metal is infinite.
|
||||
|
||||
var/upgraded = FALSE // When hit with an upgrade disk, will turn true, allowing it to print the higher tier circuits.
|
||||
var/can_clone = FALSE // Same for above, but will allow the printer to duplicate a specific assembly.
|
||||
var/static/list/recipe_list = list()
|
||||
var/can_clone = FALSE // Same for above, but will allow the printer to duplicate a specific assembly. (Not implemented)
|
||||
// var/static/list/recipe_list = list()
|
||||
var/current_category = null
|
||||
var/obj/item/device/electronic_assembly/assembly_to_clone = null
|
||||
|
||||
@@ -19,67 +20,32 @@
|
||||
upgraded = TRUE
|
||||
can_clone = TRUE
|
||||
|
||||
/obj/item/device/integrated_circuit_printer/initialize()
|
||||
. = ..()
|
||||
if(!recipe_list.len)
|
||||
// Unfortunately this needed a lot of loops, but it should only be run once at init.
|
||||
|
||||
// First loop is to seperate the actual circuits from base circuits.
|
||||
var/list/circuits_to_use = list()
|
||||
for(var/obj/item/integrated_circuit/IC in all_integrated_circuits)
|
||||
if((IC.spawn_flags & IC_SPAWN_DEFAULT) || (IC.spawn_flags & IC_SPAWN_RESEARCH))
|
||||
circuits_to_use.Add(IC)
|
||||
|
||||
// Second loop is to find all categories.
|
||||
var/list/found_categories = list()
|
||||
for(var/obj/item/integrated_circuit/IC in circuits_to_use)
|
||||
if(!(IC.category_text in found_categories))
|
||||
found_categories.Add(IC.category_text)
|
||||
|
||||
// Third loop is to initialize lists by category names, then put circuits matching the category inside.
|
||||
for(var/category in found_categories)
|
||||
recipe_list[category] = list()
|
||||
var/list/current_list = recipe_list[category]
|
||||
for(var/obj/item/integrated_circuit/IC in circuits_to_use)
|
||||
if(IC.category_text == category)
|
||||
current_list.Add(IC)
|
||||
|
||||
// Now for non-circuit things.
|
||||
var/list/assembly_list = list()
|
||||
assembly_list.Add(
|
||||
new /obj/item/device/electronic_assembly(null),
|
||||
new /obj/item/device/electronic_assembly/medium(null),
|
||||
new /obj/item/device/electronic_assembly/large(null),
|
||||
new /obj/item/device/electronic_assembly/drone(null),
|
||||
new /obj/item/weapon/implant/integrated_circuit(null),
|
||||
new /obj/item/device/assembly/electronic_assembly(null)
|
||||
)
|
||||
recipe_list["Assemblies"] = assembly_list
|
||||
|
||||
var/list/tools_list = list()
|
||||
tools_list.Add(
|
||||
new /obj/item/device/integrated_electronics/wirer(null),
|
||||
new /obj/item/device/integrated_electronics/debugger(null)
|
||||
)
|
||||
recipe_list["Tools"] = tools_list
|
||||
|
||||
/obj/item/device/integrated_circuit_printer/debug
|
||||
name = "fractal integrated circuit printer"
|
||||
desc = "A portable(ish) machine that makes modular circuitry seemingly out of thin air."
|
||||
upgraded = TRUE
|
||||
can_clone = TRUE
|
||||
debug = TRUE
|
||||
|
||||
/obj/item/device/integrated_circuit_printer/attackby(var/obj/item/O, var/mob/user)
|
||||
if(istype(O,/obj/item/stack/material))
|
||||
var/obj/item/stack/material/stack = O
|
||||
if(stack.material.name == DEFAULT_WALL_MATERIAL)
|
||||
if(debug)
|
||||
to_chat(user, span("warning", "\The [src] does not need any material."))
|
||||
return
|
||||
var/num = min((max_metal - metal) / metal_per_sheet, stack.amount)
|
||||
if(num < 1)
|
||||
to_chat(user, "<span class='warning'>\The [src] is too full to add more metal.</span>")
|
||||
to_chat(user, span("warning", "\The [src] is too full to add more metal."))
|
||||
return
|
||||
if(stack.use(num))
|
||||
to_chat(user, "<span class='notice'>You add [num] sheet\s to \the [src].</span>")
|
||||
to_chat(user, span("notice", "You add [num] sheet\s to \the [src]."))
|
||||
metal += num * metal_per_sheet
|
||||
interact(user)
|
||||
return TRUE
|
||||
|
||||
if(istype(O,/obj/item/integrated_circuit))
|
||||
to_chat(user, "<span class='notice'>You insert the circuit into \the [src]. </span>")
|
||||
to_chat(user, span("notice", "You insert the circuit into \the [src]."))
|
||||
user.unEquip(O)
|
||||
metal = min(metal + O.w_class, max_metal)
|
||||
qdel(O)
|
||||
@@ -88,18 +54,18 @@
|
||||
|
||||
if(istype(O,/obj/item/weapon/disk/integrated_circuit/upgrade/advanced))
|
||||
if(upgraded)
|
||||
to_chat(user, "<span class='warning'>\The [src] already has this upgrade. </span>")
|
||||
to_chat(user, span("warning", "\The [src] already has this upgrade."))
|
||||
return TRUE
|
||||
to_chat(user, "<span class='notice'>You install \the [O] into \the [src]. </span>")
|
||||
to_chat(user, span("notice", "You install \the [O] into \the [src]."))
|
||||
upgraded = TRUE
|
||||
interact(user)
|
||||
return TRUE
|
||||
|
||||
if(istype(O,/obj/item/weapon/disk/integrated_circuit/upgrade/clone))
|
||||
if(can_clone)
|
||||
to_chat(user, "<span class='warning'>\The [src] already has this upgrade. </span>")
|
||||
to_chat(user, span("warning", "\The [src] already has this upgrade."))
|
||||
return TRUE
|
||||
to_chat(user, "<span class='notice'>You install \the [O] into \the [src]. </span>")
|
||||
to_chat(user, span("notice", "You install \the [O] into \the [src]."))
|
||||
can_clone = TRUE
|
||||
interact(user)
|
||||
return TRUE
|
||||
@@ -114,18 +80,21 @@
|
||||
var/window_width = 500
|
||||
|
||||
if(isnull(current_category))
|
||||
current_category = recipe_list[1]
|
||||
current_category = SScircuit.circuit_fabricator_recipe_list[1]
|
||||
|
||||
var/HTML = "<center><h2>Integrated Circuit Printer</h2></center><br>"
|
||||
HTML += "Metal: [metal/metal_per_sheet]/[max_metal/metal_per_sheet] sheets.<br>"
|
||||
HTML += "Circuits available: [upgraded ? "Regular":"Advanced"]."
|
||||
HTML += "Assembly Cloning: [can_clone ? "Available": "Unavailable"]."
|
||||
if(!debug)
|
||||
HTML += "Metal: [metal/metal_per_sheet]/[max_metal/metal_per_sheet] sheets.<br>"
|
||||
else
|
||||
HTML += "Metal: INFINITY.<br>"
|
||||
HTML += "Circuits available: [upgraded ? "Advanced":"Regular"].<br>"
|
||||
HTML += "Assembly Cloning: [can_clone ? "Available": "Unavailable"].<br>"
|
||||
if(assembly_to_clone)
|
||||
HTML += "Assembly '[assembly_to_clone.name]' loaded."
|
||||
HTML += "Assembly '[assembly_to_clone.name]' loaded.<br>"
|
||||
HTML += "Crossed out circuits mean that the printer is not sufficentally upgraded to create that circuit.<br>"
|
||||
HTML += "<hr>"
|
||||
HTML += "Categories:"
|
||||
for(var/category in recipe_list)
|
||||
for(var/category in SScircuit.circuit_fabricator_recipe_list)
|
||||
if(category != current_category)
|
||||
HTML += " <a href='?src=\ref[src];category=[category]'>\[[category]\]</a> "
|
||||
else // Bold the button if it's already selected.
|
||||
@@ -133,20 +102,22 @@
|
||||
HTML += "<hr>"
|
||||
HTML += "<center><h4>[current_category]</h4></center>"
|
||||
|
||||
var/list/current_list = recipe_list[current_category]
|
||||
for(var/obj/O in current_list)
|
||||
var/list/current_list = SScircuit.circuit_fabricator_recipe_list[current_category]
|
||||
for(var/path in current_list)
|
||||
var/obj/O = path
|
||||
var/can_build = TRUE
|
||||
if(istype(O, /obj/item/integrated_circuit))
|
||||
var/obj/item/integrated_circuit/IC = O
|
||||
if((IC.spawn_flags & IC_SPAWN_RESEARCH) && (!(IC.spawn_flags & IC_SPAWN_DEFAULT)) && !upgraded)
|
||||
if(ispath(path, /obj/item/integrated_circuit))
|
||||
var/obj/item/integrated_circuit/IC = path
|
||||
if((initial(IC.spawn_flags) & IC_SPAWN_RESEARCH) && (!(initial(IC.spawn_flags) & IC_SPAWN_DEFAULT)) && !upgraded)
|
||||
can_build = FALSE
|
||||
if(can_build)
|
||||
HTML += "<A href='?src=\ref[src];build=[O.type]'>\[[O.name]\]</A>: [O.desc]<br>"
|
||||
HTML += "<A href='?src=\ref[src];build=[path]'>\[[initial(O.name)]\]</A>: [initial(O.desc)]<br>"
|
||||
else
|
||||
HTML += "<s>\[[O.name]\]: [O.desc]</s><br>"
|
||||
HTML += "<s>\[[initial(O.name)]\]</s>: [initial(O.desc)]<br>"
|
||||
|
||||
user << browse(jointext(HTML, null), "window=integrated_printer;size=[window_width]x[window_height];border=1;can_resize=1;can_close=1;can_minimize=1")
|
||||
|
||||
|
||||
/obj/item/device/integrated_circuit_printer/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
@@ -162,31 +133,36 @@
|
||||
return 1
|
||||
|
||||
var/cost = 1
|
||||
|
||||
|
||||
if(isnull(current_category))
|
||||
current_category = recipe_list[1]
|
||||
current_category = SScircuit.circuit_fabricator_recipe_list[1]
|
||||
if(ispath(build_type, /obj/item/device/electronic_assembly))
|
||||
var/obj/item/device/electronic_assembly/E = build_type
|
||||
cost = round( (initial(E.max_complexity) + initial(E.max_components) ) / 4)
|
||||
else
|
||||
var/obj/item/I = build_type
|
||||
cost = initial(I.w_class)
|
||||
if(!(locate(build_type) in recipe_list[current_category]))
|
||||
if(!build_type in SScircuit.circuit_fabricator_recipe_list[current_category])
|
||||
return
|
||||
|
||||
if(metal - cost < 0)
|
||||
to_chat(usr, "<span class='warning'>You need [cost] metal to build that!.</span>")
|
||||
return 1
|
||||
metal -= cost
|
||||
new build_type(get_turf(loc))
|
||||
if(!debug)
|
||||
if(metal - cost < 0)
|
||||
to_chat(usr, "<span class='warning'>You need [cost] metal to build that!.</span>")
|
||||
return 1
|
||||
metal -= cost
|
||||
var/obj/item/built = new build_type(get_turf(loc))
|
||||
usr.put_in_hands(built)
|
||||
to_chat(usr, "<span class='notice'>[capitalize(built.name)] printed.</span>")
|
||||
playsound(src, 'sound/items/jaws_pry.ogg', 50, TRUE)
|
||||
|
||||
interact(usr)
|
||||
|
||||
|
||||
// FUKKEN UPGRADE DISKS
|
||||
/obj/item/weapon/disk/integrated_circuit/upgrade
|
||||
name = "integrated circuit printer upgrade disk"
|
||||
desc = "Install this into your integrated circuit printer to enhance it."
|
||||
icon = 'icons/obj/electronic_assemblies.dmi'
|
||||
icon = 'icons/obj/integrated_electronics/electronic_tools.dmi'
|
||||
icon_state = "upgrade_disk"
|
||||
item_state = "card-id"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
name = "color pin"
|
||||
|
||||
/datum/integrated_io/color/ask_for_pin_data(mob/user)
|
||||
var/new_data = input("Please select a color.","[src] color writing") as null|color
|
||||
var/new_data = input("Please select a color.","[src] color writing", data ? data : "#000000") as null|color
|
||||
if(holder.check_interactivity(user) )
|
||||
to_chat(user, "<span class='notice'>You input a <font color='[new_data]'>new color</font> into the pin.</span>")
|
||||
write_data_to_pin(new_data)
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
desc = "It's a small wiring tool, with a wire roll, electric soldering iron, wire cutter, and more in one package. \
|
||||
The wires used are generally useful for small electronics, such as circuitboards and breadboards, as opposed to larger wires \
|
||||
used for power or data transmission."
|
||||
icon = 'icons/obj/electronic_assemblies.dmi'
|
||||
icon = 'icons/obj/integrated_electronics/electronic_tools.dmi'
|
||||
icon_state = "wirer-wire"
|
||||
item_state = "wirer"
|
||||
flags = CONDUCT
|
||||
w_class = 2
|
||||
w_class = ITEMSIZE_SMALL
|
||||
var/datum/integrated_io/selected_io = null
|
||||
var/mode = WIRE
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
name = "circuit debugger"
|
||||
desc = "This small tool allows one working with custom machinery to directly set data to a specific pin, useful for writing \
|
||||
settings to specific circuits, or for debugging purposes. It can also pulse activation pins."
|
||||
icon = 'icons/obj/electronic_assemblies.dmi'
|
||||
icon = 'icons/obj/integrated_electronics/electronic_tools.dmi'
|
||||
icon_state = "debugger"
|
||||
flags = CONDUCT
|
||||
w_class = 2
|
||||
@@ -252,7 +252,7 @@
|
||||
/obj/item/weapon/storage/bag/circuits
|
||||
name = "circuit kit"
|
||||
desc = "This kit's essential for any circuitry projects."
|
||||
icon = 'icons/obj/electronic_assemblies.dmi'
|
||||
icon = 'icons/obj/integrated_electronics/electronic_misc.dmi'
|
||||
icon_state = "circuit_kit"
|
||||
w_class = 3
|
||||
display_contents_with_number = 0
|
||||
@@ -261,11 +261,11 @@
|
||||
/obj/item/weapon/storage/bag/circuits/mini,
|
||||
/obj/item/device/electronic_assembly,
|
||||
/obj/item/device/integrated_electronics,
|
||||
/obj/item/weapon/crowbar,
|
||||
/obj/item/weapon/screwdriver,
|
||||
/obj/item/weapon/tool/crowbar,
|
||||
/obj/item/weapon/tool/screwdriver,
|
||||
/obj/item/device/multitool
|
||||
)
|
||||
cant_hold = list(/obj/item/weapon/screwdriver/power)
|
||||
cant_hold = list(/obj/item/weapon/tool/screwdriver/power)
|
||||
|
||||
/obj/item/weapon/storage/bag/circuits/basic/New()
|
||||
..()
|
||||
@@ -290,8 +290,8 @@
|
||||
new /obj/item/device/assembly/electronic_assembly(src)
|
||||
new /obj/item/device/assembly/electronic_assembly(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/weapon/screwdriver(src)
|
||||
new /obj/item/weapon/crowbar(src)
|
||||
new /obj/item/weapon/tool/screwdriver(src)
|
||||
new /obj/item/weapon/tool/crowbar(src)
|
||||
make_exact_fit()
|
||||
|
||||
/obj/item/weapon/storage/bag/circuits/all/New()
|
||||
@@ -317,7 +317,7 @@
|
||||
new /obj/item/device/electronic_assembly/drone(src)
|
||||
new /obj/item/device/integrated_electronics/wirer(src)
|
||||
new /obj/item/device/integrated_electronics/debugger(src)
|
||||
new /obj/item/weapon/crowbar(src)
|
||||
new /obj/item/weapon/tool/crowbar(src)
|
||||
make_exact_fit()
|
||||
|
||||
/obj/item/weapon/storage/bag/circuits/mini/
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_DATA = 2)
|
||||
category_text = "Power - Passive"
|
||||
|
||||
/obj/item/integrated_circuit/passive/power/proc/make_energy()
|
||||
/obj/item/integrated_circuit/passive/power/proc/handle_passive_energy()
|
||||
return
|
||||
|
||||
// For calculators.
|
||||
@@ -20,7 +20,7 @@
|
||||
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
|
||||
var/max_power = 1
|
||||
|
||||
/obj/item/integrated_circuit/passive/power/solar_cell/make_energy()
|
||||
/obj/item/integrated_circuit/passive/power/solar_cell/handle_passive_energy()
|
||||
var/turf/T = get_turf(src)
|
||||
var/light_amount = T ? T.get_lumcount() : 0
|
||||
var/adjusted_power = max(max_power * light_amount, 0)
|
||||
@@ -39,7 +39,7 @@
|
||||
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
|
||||
var/is_charge=0
|
||||
|
||||
/obj/item/integrated_circuit/passive/power/starter/make_energy()
|
||||
/obj/item/integrated_circuit/passive/power/starter/handle_passive_energy()
|
||||
if(assembly.battery)
|
||||
if(assembly.battery.charge)
|
||||
if(!is_charge)
|
||||
@@ -67,7 +67,7 @@
|
||||
return FALSE // Robots and dead people don't have a metabolism.
|
||||
return TRUE
|
||||
|
||||
/obj/item/integrated_circuit/passive/power/metabolic_siphon/make_energy()
|
||||
/obj/item/integrated_circuit/passive/power/metabolic_siphon/handle_passive_energy()
|
||||
var/mob/living/carbon/human/host = null
|
||||
if(assembly && istype(assembly, /obj/item/device/electronic_assembly/implant))
|
||||
var/obj/item/device/electronic_assembly/implant/implant_assembly = assembly
|
||||
@@ -135,7 +135,7 @@
|
||||
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
|
||||
push_data()
|
||||
|
||||
/obj/item/integrated_circuit/passive/power/chemical_cell/make_energy()
|
||||
/obj/item/integrated_circuit/passive/power/chemical_cell/handle_passive_energy()
|
||||
if(assembly)
|
||||
for(var/I in fuel)
|
||||
if((assembly.battery.maxcharge-assembly.battery.charge) / CELLRATE > fuel[I])
|
||||
@@ -156,7 +156,7 @@
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
power_amount = 2000
|
||||
|
||||
/obj/item/integrated_circuit/passive/power/relay/make_energy()
|
||||
/obj/item/integrated_circuit/passive/power/relay/handle_passive_energy()
|
||||
if(!assembly)
|
||||
return
|
||||
var/area/A = get_area(src)
|
||||
@@ -164,3 +164,78 @@
|
||||
if(A.powered(EQUIP) && assembly.give_power(power_amount))
|
||||
A.use_power(power_amount, EQUIP)
|
||||
// give_power() handles CELLRATE on its own.
|
||||
|
||||
// Interacts with the powernet.
|
||||
// Now you can make your own power generation (or poor man's powersink).
|
||||
|
||||
/obj/item/integrated_circuit/passive/power/powernet
|
||||
name = "power network interface"
|
||||
desc = "Gives or takes power from a wire underneath the machine."
|
||||
icon_state = "powernet"
|
||||
extended_desc = "The assembly must be anchored, with a wrench, and a wire node must be avaiable directly underneath.<br>\
|
||||
The first pin determines if power is moved at all. The second pin, if true, will draw from the powernet to charge the assembly's \
|
||||
cell, otherwise it will give power from the cell to the powernet."
|
||||
complexity = 20
|
||||
inputs = list(
|
||||
"active" = IC_PINTYPE_BOOLEAN,
|
||||
"draw power" = IC_PINTYPE_BOOLEAN
|
||||
)
|
||||
outputs = list(
|
||||
"power in grid" = IC_PINTYPE_NUMBER,
|
||||
"surplus power" = IC_PINTYPE_NUMBER,
|
||||
"load" = IC_PINTYPE_NUMBER
|
||||
)
|
||||
activators = list()
|
||||
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
|
||||
origin_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 2)
|
||||
var/obj/machinery/power/circuit_io/IO = null // Dummy power machine to move energy in/out without a bunch of code duplication.
|
||||
var/throughput = 10000 // Give/take up to 10kW.
|
||||
|
||||
/obj/item/integrated_circuit/passive/power/powernet/initialize()
|
||||
IO = new(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/passive/power/powernet/Destroy()
|
||||
qdel(IO)
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/passive/power/powernet/on_anchored()
|
||||
IO.connect_to_network()
|
||||
|
||||
/obj/item/integrated_circuit/passive/power/powernet/on_unanchored()
|
||||
IO.disconnect_from_network()
|
||||
|
||||
/obj/item/integrated_circuit/passive/power/powernet/handle_passive_energy()
|
||||
if(assembly && assembly.anchored && assembly.battery)
|
||||
var/should_act = get_pin_data(IC_INPUT, 1) // Even if this is false, we still need to update the output pins with powernet information.
|
||||
var/drawing = get_pin_data(IC_INPUT, 2)
|
||||
|
||||
if(should_act) // We're gonna give or take from the net.
|
||||
if(drawing)
|
||||
var/to_transfer = min(throughput, assembly.battery.amount_missing() / CELLRATE) // So we don't need to draw 10kW if the cell needs much less.
|
||||
var/amount = IO.draw_power(to_transfer)
|
||||
assembly.give_power(amount)
|
||||
else
|
||||
var/amount = assembly.draw_power(throughput)
|
||||
IO.add_avail(amount)
|
||||
|
||||
set_pin_data(IC_OUTPUT, 1, IO.avail())
|
||||
set_pin_data(IC_OUTPUT, 2, IO.surplus())
|
||||
set_pin_data(IC_OUTPUT, 3, IO.viewload())
|
||||
|
||||
// Internal power machine for interacting with the powernet.
|
||||
// It needs a bit of special code since base /machinery/power assumes loc will be a tile.
|
||||
/obj/machinery/power/circuit_io
|
||||
name = "embedded electrical I/O"
|
||||
|
||||
/obj/machinery/power/circuit_io/connect_to_network()
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T || !istype(T))
|
||||
return FALSE
|
||||
|
||||
var/obj/structure/cable/C = T.get_cable_node()
|
||||
if(!C || !C.powernet)
|
||||
return FALSE
|
||||
|
||||
C.powernet.add_machine(src)
|
||||
return TRUE
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/integrated_circuit/built_in
|
||||
name = "integrated circuit"
|
||||
desc = "It's a tiny chip! This one doesn't seem to do much, however."
|
||||
icon = 'icons/obj/electronic_assemblies.dmi'
|
||||
icon = 'icons/obj/integrated_electronics/electronic_setups.dmi'
|
||||
icon_state = "template"
|
||||
size = -1
|
||||
w_class = ITEMSIZE_TINY
|
||||
@@ -25,4 +25,15 @@
|
||||
/obj/item/integrated_circuit/built_in/device_output/do_work()
|
||||
if(istype(assembly, /obj/item/device/electronic_assembly/device))
|
||||
var/obj/item/device/electronic_assembly/device/device = assembly
|
||||
device.holder.pulse()
|
||||
device.holder.pulse()
|
||||
|
||||
// Triggered when clothing assembly's hud button is clicked (or used inhand).
|
||||
/obj/item/integrated_circuit/built_in/action_button
|
||||
name = "external trigger circuit"
|
||||
desc = "A built in chip that outputs a pulse when an external control event occurs."
|
||||
extended_desc = "This outputs a pulse if the assembly's HUD button is clicked while the assembly is closed."
|
||||
complexity = 0
|
||||
activators = list("on activation" = IC_PINTYPE_PULSE_OUT)
|
||||
|
||||
/obj/item/integrated_circuit/built_in/action_button/do_work()
|
||||
activate_pin(1)
|
||||
@@ -318,5 +318,77 @@
|
||||
set_pin_data(IC_OUTPUT, 1, x1 - x2)
|
||||
set_pin_data(IC_OUTPUT, 2, y1 - y2)
|
||||
|
||||
push_data()
|
||||
activate_pin(2)
|
||||
|
||||
/obj/item/integrated_circuit/converter/stringlength
|
||||
name = "len circuit"
|
||||
desc = "This circuit will return the number of characters in a string."
|
||||
complexity = 1
|
||||
inputs = list(
|
||||
"string" = IC_PINTYPE_STRING
|
||||
)
|
||||
outputs = list(
|
||||
"length" = IC_PINTYPE_NUMBER
|
||||
)
|
||||
activators = list("get length" = IC_PINTYPE_PULSE_IN, "on acquisition" = IC_PINTYPE_PULSE_OUT)
|
||||
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
|
||||
|
||||
/obj/item/integrated_circuit/converter/stringlength/do_work()
|
||||
set_pin_data(IC_OUTPUT, 1, length(get_pin_data(IC_INPUT, 1)))
|
||||
push_data()
|
||||
|
||||
activate_pin(2)
|
||||
|
||||
/obj/item/integrated_circuit/converter/hsv2hex
|
||||
name = "hsv to hexadecimal converter"
|
||||
desc = "This circuit can convert a HSV (Hue, Saturation, and Value) color to a Hexadecimal RGB color."
|
||||
extended_desc = "The first pin controls tint (0-359), the second pin controls how intense the tint is (0-255), \
|
||||
and the third controls how bright the tint is (0 for black, 127 for normal, 255 for white)."
|
||||
icon_state = "hsv-hex"
|
||||
inputs = list(
|
||||
"hue" = IC_PINTYPE_NUMBER,
|
||||
"saturation" = IC_PINTYPE_NUMBER,
|
||||
"value" = IC_PINTYPE_NUMBER
|
||||
)
|
||||
outputs = list("hexadecimal rgb" = IC_PINTYPE_COLOR)
|
||||
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
|
||||
|
||||
/obj/item/integrated_circuit/converter/hsv2hex/do_work()
|
||||
var/result = null
|
||||
pull_data()
|
||||
var/hue = get_pin_data(IC_INPUT, 1)
|
||||
var/saturation = get_pin_data(IC_INPUT, 2)
|
||||
var/value = get_pin_data(IC_INPUT, 3)
|
||||
if(isnum(hue) && isnum(saturation) && isnum(value))
|
||||
result = HSVtoRGB(hsv(AngleToHue(hue),saturation,value))
|
||||
|
||||
set_pin_data(IC_OUTPUT, 1, result)
|
||||
push_data()
|
||||
activate_pin(2)
|
||||
|
||||
/obj/item/integrated_circuit/converter/rgb2hex
|
||||
name = "rgb to hexadecimal converter"
|
||||
desc = "This circuit can convert a RGB (Red, Green, Blue) color to a Hexadecimal RGB color."
|
||||
extended_desc = "The first pin controls red amount, the second pin controls green amount, and the third controls blue amount. They all go from 0-255."
|
||||
icon_state = "rgb-hex"
|
||||
inputs = list(
|
||||
"red" = IC_PINTYPE_NUMBER,
|
||||
"green" = IC_PINTYPE_NUMBER,
|
||||
"blue" = IC_PINTYPE_NUMBER
|
||||
)
|
||||
outputs = list("hexadecimal rgb" = IC_PINTYPE_COLOR)
|
||||
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
|
||||
|
||||
/obj/item/integrated_circuit/converter/rgb2hex/do_work()
|
||||
var/result = null
|
||||
pull_data()
|
||||
var/red = get_pin_data(IC_INPUT, 1)
|
||||
var/green = get_pin_data(IC_INPUT, 2)
|
||||
var/blue = get_pin_data(IC_INPUT, 3)
|
||||
if(isnum(red) && isnum(green) && isnum(blue))
|
||||
result = rgb(red, green, blue)
|
||||
|
||||
set_pin_data(IC_OUTPUT, 1, result)
|
||||
push_data()
|
||||
activate_pin(2)
|
||||
@@ -53,7 +53,7 @@
|
||||
power_draw_per_use = 4
|
||||
|
||||
/obj/item/integrated_circuit/input/numberpad/ask_for_input(mob/user)
|
||||
var/new_input = input(user, "Enter a number, please.","Number pad") as null|num
|
||||
var/new_input = input(user, "Enter a number, please.","Number pad", get_pin_data(IC_OUTPUT, 1)) as null|num
|
||||
if(isnum(new_input) && CanInteract(user, physical_state))
|
||||
set_pin_data(IC_OUTPUT, 1, new_input)
|
||||
push_data()
|
||||
@@ -72,18 +72,37 @@
|
||||
power_draw_per_use = 4
|
||||
|
||||
/obj/item/integrated_circuit/input/textpad/ask_for_input(mob/user)
|
||||
var/new_input = input(user, "Enter some words, please.","Number pad") as null|text
|
||||
var/new_input = input(user, "Enter some words, please.","Number pad", get_pin_data(IC_OUTPUT, 1)) as null|text
|
||||
if(istext(new_input) && CanInteract(user, physical_state))
|
||||
set_pin_data(IC_OUTPUT, 1, new_input)
|
||||
push_data()
|
||||
activate_pin(1)
|
||||
|
||||
/obj/item/integrated_circuit/input/colorpad
|
||||
name = "color pad"
|
||||
desc = "This small color pad allows someone to input a hexadecimal color into the system."
|
||||
icon_state = "colorpad"
|
||||
complexity = 2
|
||||
can_be_asked_input = 1
|
||||
inputs = list()
|
||||
outputs = list("color entered" = IC_PINTYPE_COLOR)
|
||||
activators = list("on entered" = IC_PINTYPE_PULSE_IN)
|
||||
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
|
||||
power_draw_per_use = 4
|
||||
|
||||
/obj/item/integrated_circuit/input/colorpad/ask_for_input(mob/user)
|
||||
var/new_color = input(user, "Enter a color, please.", "Color pad", get_pin_data(IC_OUTPUT, 1)) as color|null
|
||||
if(new_color && CanInteract(user, physical_state))
|
||||
set_pin_data(IC_OUTPUT, 1, new_color)
|
||||
push_data()
|
||||
activate_pin(1)
|
||||
|
||||
/obj/item/integrated_circuit/input/med_scanner
|
||||
name = "integrated medical analyser"
|
||||
desc = "A very small version of the common medical analyser. This allows the machine to know how healthy someone is."
|
||||
icon_state = "medscan"
|
||||
complexity = 4
|
||||
inputs = list("\<REF\> target")
|
||||
inputs = list("target" = IC_PINTYPE_REF)
|
||||
outputs = list(
|
||||
"total health %" = IC_PINTYPE_NUMBER,
|
||||
"total missing health" = IC_PINTYPE_NUMBER
|
||||
@@ -117,7 +136,7 @@
|
||||
This type is much more precise, allowing the machine to know much more about the target than a normal analyzer."
|
||||
icon_state = "medscan_adv"
|
||||
complexity = 12
|
||||
inputs = list("\<REF\> target")
|
||||
inputs = list("target" = IC_PINTYPE_REF)
|
||||
outputs = list(
|
||||
"total health %" = IC_PINTYPE_NUMBER,
|
||||
"total missing health" = IC_PINTYPE_NUMBER,
|
||||
@@ -159,7 +178,7 @@
|
||||
relative coordinates, total amount of reagents, and maximum amount of reagents of the referenced object."
|
||||
icon_state = "video_camera"
|
||||
complexity = 6
|
||||
inputs = list("\<REF\> target" = IC_PINTYPE_REF)
|
||||
inputs = list("target" = IC_PINTYPE_REF)
|
||||
outputs = list(
|
||||
"name" = IC_PINTYPE_STRING,
|
||||
"description" = IC_PINTYPE_STRING,
|
||||
@@ -262,7 +281,7 @@
|
||||
complexity = 6
|
||||
name = "advanced locator"
|
||||
desc = "This is needed for certain devices that demand a reference for a target to act upon. This type locates something \
|
||||
that is standing in given radius of up to 8 meters"
|
||||
that is standing in given radius of up to 7 meters"
|
||||
extended_desc = "The first pin requires a ref to a kind of object that you want the locator to acquire. This means that it will \
|
||||
give refs to nearby objects that are similar to given sample. If this pin is a string, the locator will search for\
|
||||
item by matching desired text in name + description. If more than one valid object is found nearby, it will choose one of them at \
|
||||
@@ -277,7 +296,7 @@
|
||||
/obj/item/integrated_circuit/input/advanced_locator/on_data_written()
|
||||
var/rad = get_pin_data(IC_INPUT, 2)
|
||||
if(isnum(rad))
|
||||
rad = Clamp(rad, 0, 8)
|
||||
rad = Clamp(rad, 0, 7)
|
||||
radius = rad
|
||||
|
||||
/obj/item/integrated_circuit/input/advanced_locator/do_work()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user