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:
Arokha Sieyes
2018-09-27 18:01:09 -04:00
1318 changed files with 19791 additions and 86128 deletions
+2 -1
View File
@@ -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(
+1
View File
@@ -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
)
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -254,4 +254,4 @@
if(master.first == src)
master.first = null
if(next && !next.gc_destroyed)
qdel_null(next)
QDEL_NULL(next)
+2 -2
View File
@@ -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)
+12
View File
@@ -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
+6
View File
@@ -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
+20 -3
View File
@@ -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
+9 -2
View File
@@ -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
+1 -1
View File
@@ -94,4 +94,4 @@ var/list/overminds = list()
if(blob_points >= 100)
if(!auto_factory() && !auto_resource())
auto_node()
auto_node()
+7 -7
View File
@@ -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)
+106 -7
View File
@@ -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>")
+1 -2
View File
@@ -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//
+1 -1
View File
@@ -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'>&reg;</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"
+7 -1
View File
@@ -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>"
+29 -16
View File
@@ -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!
+1 -1
View File
@@ -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()
+2 -1
View File
@@ -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()
..()
+2 -2
View File
@@ -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)
+3 -1
View File
@@ -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 -10
View File
@@ -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
+71
View File
@@ -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-
+20 -3
View File
@@ -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"
+1 -1
View File
@@ -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
+1 -2
View File
@@ -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"
+4 -5
View File
@@ -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))
+2 -7
View File
@@ -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"
+38 -35
View File
@@ -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
+132 -27
View File
@@ -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"
+1 -1
View File
@@ -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
+2 -4
View File
@@ -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
+182
View File
@@ -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
)
+1 -1
View File
@@ -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."
+1 -1
View File
@@ -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)
-63
View File
@@ -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()
+144 -26
View File
@@ -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"
+4 -4
View File
@@ -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)
+3 -3
View File
@@ -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"])
+4 -4
View File
@@ -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)
+2 -2
View File
@@ -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
+11 -8
View File
@@ -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)
+60
View File
@@ -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
+2 -2
View File
@@ -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)
+19 -18
View File
@@ -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
+4 -4
View File
@@ -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
+7 -7
View File
@@ -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]"
+27 -27
View File
@@ -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))
+10 -10
View File
@@ -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)
+5 -5
View File
@@ -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
+2 -2
View File
@@ -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 -1
View File
@@ -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 ..()
@@ -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