mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-25 01:22:13 +00:00
Crystal Agitators (#8609)
This commit is contained in:
@@ -376,6 +376,16 @@
|
||||
#define AURA_TYPE_THROWN "Thrown"
|
||||
#define AURA_TYPE_LIFE "Life"
|
||||
|
||||
// Remote Control defines
|
||||
#define REMOTE_GENERIC_MECH "remotemechs"
|
||||
#define REMOTE_AI_MECH "aimechs"
|
||||
#define REMOTE_PRISON_MECH "prisonmechs"
|
||||
|
||||
#define REMOTE_GENERIC_ROBOT "remoterobots"
|
||||
#define REMOTE_BUNKER_ROBOT "bunkerrobots"
|
||||
#define REMOTE_PRISON_ROBOT "prisonrobots"
|
||||
#define REMOTE_WARDEN_ROBOT "wardenrobots"
|
||||
|
||||
// Robot Overlay Defines
|
||||
#define ROBOT_PANEL_EXPOSED "exposed"
|
||||
#define ROBOT_PANEL_CELL "cell"
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
// department channels
|
||||
var/const/PUB_FREQ = 1459
|
||||
var/const/PEN_FREQ = 1451
|
||||
var/const/SEC_FREQ = 1359
|
||||
var/const/ENG_FREQ = 1357
|
||||
var/const/MED_FREQ = 1355
|
||||
@@ -34,6 +35,7 @@ var/list/radiochannels = list(
|
||||
"Medical" = MED_FREQ,
|
||||
"Engineering" = ENG_FREQ,
|
||||
"Security" = SEC_FREQ,
|
||||
"Penal" = PEN_FREQ,
|
||||
"Response Team" = ERT_FREQ,
|
||||
"Special Ops" = DTH_FREQ,
|
||||
"Mercenary" = SYND_FREQ,
|
||||
|
||||
@@ -173,6 +173,8 @@ var/datum/controller/subsystem/radio/SSradio
|
||||
. = "airadio"
|
||||
if (SEC_FREQ,SEC_I_FREQ)
|
||||
. = "secradio"
|
||||
if (PEN_FREQ)
|
||||
. = "penradio"
|
||||
if (ENG_FREQ)
|
||||
. = "engradio"
|
||||
if (SCI_FREQ)
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
flags = SS_NO_FIRE
|
||||
|
||||
// MECHA
|
||||
var/list/mechnetworks = list("remotemechs", "aimechs", "prisonmechs") // A list of all the networks a mech can possibly connect to
|
||||
var/list/mechnetworks = list(REMOTE_GENERIC_MECH, REMOTE_AI_MECH, REMOTE_PRISON_MECH) // A list of all the networks a mech can possibly connect to
|
||||
var/list/list/mechs = list() // A list of lists, containing the mechs and their networks
|
||||
|
||||
// IPC BODIES
|
||||
var/list/robotnetworks = list("remoterobots", "bunkerrobots", "prisonrobots")
|
||||
var/list/robotnetworks = list(REMOTE_GENERIC_ROBOT, REMOTE_BUNKER_ROBOT, REMOTE_PRISON_ROBOT, REMOTE_WARDEN_ROBOT)
|
||||
var/list/list/robots = list()
|
||||
|
||||
/datum/controller/subsystem/virtualreality/New()
|
||||
@@ -125,7 +125,6 @@
|
||||
|
||||
/datum/controller/subsystem/virtualreality/proc/mech_selection(var/user, var/network)
|
||||
var/list/mech = list()
|
||||
mech["Return"] = null
|
||||
|
||||
for(var/mob/living/heavy_vehicle/R in mechs[network])
|
||||
var/turf/T = get_turf(R)
|
||||
@@ -144,23 +143,20 @@
|
||||
continue
|
||||
mech[R.name] = R
|
||||
|
||||
if(mech.len == 1)
|
||||
if(!length(mech))
|
||||
to_chat(user, SPAN_WARNING("No active remote mechs are available."))
|
||||
return
|
||||
|
||||
var/desc = input("Please select a remote control compatible mech to take over.", "Remote Mech Selection") in mech|null
|
||||
if(!desc)
|
||||
var/choice = input("Please select a remote control compatible mech to take over.", "Remote Mech Selection") as null|anything in mech
|
||||
if(!choice)
|
||||
return
|
||||
|
||||
var/mob/living/heavy_vehicle/chosen_mech = mech[desc]
|
||||
var/mob/living/heavy_vehicle/chosen_mech = mech[choice]
|
||||
var/mob/living/remote_pilot = chosen_mech.pilots[1] // the first pilot
|
||||
mind_transfer(user, remote_pilot)
|
||||
|
||||
return
|
||||
|
||||
/datum/controller/subsystem/virtualreality/proc/robot_selection(var/user, var/network)
|
||||
var/list/robot = list()
|
||||
robot["Return"] = null
|
||||
|
||||
for(var/mob/living/R in robots[network])
|
||||
var/turf/T = get_turf(R)
|
||||
@@ -174,14 +170,12 @@
|
||||
continue
|
||||
robot[R.name] = R
|
||||
|
||||
if(robot.len == 1)
|
||||
if(!length(robot))
|
||||
to_chat(user, SPAN_WARNING("No active remote robots are available."))
|
||||
return
|
||||
|
||||
var/desc = input("Please select a remote control robot to take over.", "Remote Robot Selection") in robot|null
|
||||
if(!desc)
|
||||
var/choice = input("Please select a remote control robot to take over.", "Remote Robot Selection") as null|anything in robot
|
||||
if(!choice)
|
||||
return
|
||||
|
||||
mind_transfer(user, robot[desc])
|
||||
|
||||
return
|
||||
mind_transfer(user, robot[choice])
|
||||
@@ -88,7 +88,7 @@
|
||||
|
||||
uniform = /obj/item/clothing/under/rank/warden
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
l_ear = /obj/item/device/radio/headset/headset_sec
|
||||
l_ear = /obj/item/device/radio/headset/headset_warden
|
||||
pda = /obj/item/device/pda/warden
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/sechud/head
|
||||
l_pocket = /obj/item/device/flash
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
to_chat(user, SPAN_NOTICE("You paint the target at [target]."))
|
||||
|
||||
var/obj/item/device/radio/intercom/announcer = new /obj/item/device/radio/intercom(null)
|
||||
announcer.config(list("Common" = FALSE, "Entertainment" = FALSE, "Response Team" = FALSE, "Science" = FALSE, "Command" = FALSE, "Medical" = FALSE, "Engineering" = FALSE, "Security" = FALSE, "Supply" = FALSE, "Service" = FALSE, "Mercenary" = FALSE, "Raider" = FALSE, "Ninja" = FALSE, "AI Private" = FALSE))
|
||||
announcer.config(list("Common" = FALSE, "Entertainment" = FALSE, "Response Team" = FALSE, "Science" = FALSE, "Command" = FALSE, "Medical" = FALSE, "Engineering" = FALSE, "Security" = FALSE, "Penal" = FALSE, "Supply" = FALSE, "Service" = FALSE, "Mercenary" = FALSE, "Raider" = FALSE, "Ninja" = FALSE, "AI Private" = FALSE))
|
||||
if(announcer)
|
||||
if(!emagged)
|
||||
announcer.autosay(drop_message, announcer_name, announcer_channel)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#define CHANNEL_SUPPLY "Supply"
|
||||
#define CHANNEL_SERVICE "Service"
|
||||
#define CHANNEL_AI_PRIVATE "AI Private"
|
||||
#define CHANNEL_PENAL "Penal"
|
||||
|
||||
#define CHANNEL_RESPONSE_TEAM "Response Team"
|
||||
|
||||
|
||||
@@ -57,6 +57,16 @@
|
||||
icon_state = "sec_cypherkey"
|
||||
channels = list(CHANNEL_SECURITY = TRUE)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_warden
|
||||
name = "warden radio encryption key"
|
||||
icon_state = "sec_cypherkey"
|
||||
channels = list(CHANNEL_SECURITY = TRUE, CHANNEL_PENAL = TRUE)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_penal
|
||||
name = "penal radio encryption key"
|
||||
icon_state = "cargo_cypherkey"
|
||||
channels = list(CHANNEL_PENAL = TRUE)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_eng
|
||||
name = "engineering radio encryption key"
|
||||
icon_state = "eng_cypherkey"
|
||||
@@ -90,13 +100,13 @@
|
||||
/obj/item/device/encryptionkey/heads/captain
|
||||
name = "captain's encryption key"
|
||||
icon_state = "cap_cypherkey"
|
||||
channels = list(CHANNEL_COMMAND = TRUE, CHANNEL_SECURITY = TRUE, CHANNEL_ENGINEERING = FALSE, CHANNEL_SCIENCE = FALSE, CHANNEL_MEDICAL = FALSE, CHANNEL_SUPPLY = FALSE, CHANNEL_SERVICE = FALSE)
|
||||
channels = list(CHANNEL_COMMAND = TRUE, CHANNEL_SECURITY = TRUE, CHANNEL_PENAL = TRUE, CHANNEL_ENGINEERING = FALSE, CHANNEL_SCIENCE = FALSE, CHANNEL_MEDICAL = FALSE, CHANNEL_SUPPLY = FALSE, CHANNEL_SERVICE = FALSE)
|
||||
|
||||
/obj/item/device/encryptionkey/heads/ai_integrated
|
||||
name = "ai integrated encryption key"
|
||||
desc = "Integrated encryption key"
|
||||
icon_state = "cap_cypherkey"
|
||||
channels = list(CHANNEL_COMMAND = TRUE, CHANNEL_SECURITY = TRUE, CHANNEL_ENGINEERING = TRUE, CHANNEL_SCIENCE = TRUE, CHANNEL_MEDICAL = TRUE, CHANNEL_SUPPLY = TRUE, CHANNEL_SERVICE = TRUE, CHANNEL_AI_PRIVATE = TRUE)
|
||||
channels = list(CHANNEL_COMMAND = TRUE, CHANNEL_SECURITY = TRUE, CHANNEL_PENAL = TRUE, CHANNEL_ENGINEERING = TRUE, CHANNEL_SCIENCE = TRUE, CHANNEL_MEDICAL = TRUE, CHANNEL_SUPPLY = TRUE, CHANNEL_SERVICE = TRUE, CHANNEL_AI_PRIVATE = TRUE)
|
||||
|
||||
/obj/item/device/encryptionkey/heads/rd
|
||||
name = "research director's encryption key"
|
||||
@@ -106,7 +116,7 @@
|
||||
/obj/item/device/encryptionkey/heads/hos
|
||||
name = "head of security's encryption key"
|
||||
icon_state = "hos_cypherkey"
|
||||
channels = list(CHANNEL_SECURITY = TRUE, CHANNEL_COMMAND = TRUE)
|
||||
channels = list(CHANNEL_SECURITY = TRUE, CHANNEL_COMMAND = TRUE, CHANNEL_PENAL = TRUE)
|
||||
|
||||
/obj/item/device/encryptionkey/heads/ce
|
||||
name = "chief engineer's encryption key"
|
||||
@@ -121,7 +131,7 @@
|
||||
/obj/item/device/encryptionkey/heads/hop
|
||||
name = "head of personnel's encryption key"
|
||||
icon_state = "hop_cypherkey"
|
||||
channels = list(CHANNEL_SUPPLY = TRUE, CHANNEL_SERVICE = TRUE, CHANNEL_COMMAND = TRUE, CHANNEL_SECURITY = FALSE)
|
||||
channels = list(CHANNEL_SUPPLY = TRUE, CHANNEL_SERVICE = TRUE, CHANNEL_COMMAND = TRUE, CHANNEL_SECURITY = FALSE, CHANNEL_PENAL = FALSE)
|
||||
|
||||
/obj/item/device/encryptionkey/headset_cargo
|
||||
name = "supply radio encryption key"
|
||||
|
||||
@@ -315,6 +315,23 @@
|
||||
icon_state = "sec_headset_alt"
|
||||
item_state = "headset_alt"
|
||||
|
||||
/obj/item/device/radio/headset/headset_warden
|
||||
name = "warden radio headset"
|
||||
desc = "This is used by your all-powerful overseer."
|
||||
icon_state = "sec_headset"
|
||||
ks2type = /obj/item/device/encryptionkey/headset_warden
|
||||
|
||||
/obj/item/device/radio/headset/headset_warden/alt
|
||||
name = "warden bowman headset"
|
||||
icon_state = "sec_headset_alt"
|
||||
item_state = "headset_alt"
|
||||
|
||||
/obj/item/device/radio/headset/headset_penal
|
||||
name = "penal radio headset"
|
||||
desc = "A headset used by people who have chosen or been chosen to work the fields."
|
||||
icon_state = "mine_headset"
|
||||
ks2type = /obj/item/device/encryptionkey/headset_penal
|
||||
|
||||
/obj/item/device/radio/headset/heads/hos
|
||||
name = "head of security's headset"
|
||||
desc = "The headset of the man who protects your worthless lifes."
|
||||
|
||||
@@ -10,6 +10,7 @@ var/global/list/default_internal_channels = list(
|
||||
num2text(MED_I_FREQ)=list(access_medical_equip),
|
||||
num2text(SEC_FREQ) = list(access_security),
|
||||
num2text(SEC_I_FREQ)=list(access_security),
|
||||
num2text(PEN_FREQ) = list(access_armory),
|
||||
num2text(SCI_FREQ) = list(access_tox,access_robotics,access_xenobiology),
|
||||
num2text(SUP_FREQ) = list(access_cargo),
|
||||
num2text(SRV_FREQ) = list(access_janitor, access_hydroponics)
|
||||
|
||||
@@ -219,8 +219,8 @@
|
||||
new /obj/item/clothing/gloves/black_leather(src)
|
||||
//Tools
|
||||
new /obj/item/cartridge/security(src)
|
||||
new /obj/item/device/radio/headset/headset_sec(src)
|
||||
new /obj/item/device/radio/headset/headset_sec/alt(src)
|
||||
new /obj/item/device/radio/headset/headset_warden(src)
|
||||
new /obj/item/device/radio/headset/headset_warden/alt(src)
|
||||
new /obj/item/clothing/glasses/sunglasses/sechud/aviator(src)
|
||||
new /obj/item/clothing/glasses/sunglasses/sechud(src)
|
||||
new /obj/item/taperoll/police(src)
|
||||
|
||||
176
code/game/objects/structures/crystals.dm
Normal file
176
code/game/objects/structures/crystals.dm
Normal file
@@ -0,0 +1,176 @@
|
||||
/obj/structure/reagent_crystal
|
||||
name = "chemical crystal cluster"
|
||||
desc = "A cluster of hardened chemical crystals."
|
||||
icon = 'icons/obj/crystals.dmi'
|
||||
icon_state = "scattered"
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
layer = ABOVE_CABLE_LAYER
|
||||
var/datum/reagent/reagent_id
|
||||
var/state = 0
|
||||
var/health = 100
|
||||
var/mine_rate = 1 // how fast you can mine it
|
||||
|
||||
var/obj/machinery/power/crystal_agitator/creator // used to re-add dense turfs to agitation list when destroyed
|
||||
|
||||
/obj/structure/reagent_crystal/Initialize(mapload, var/reagent_i = null, var/our_creator = null)
|
||||
. = ..()
|
||||
if(!reagent_i)
|
||||
var/list/chems = list(/datum/reagent/acetone, /datum/reagent/aluminum, /datum/reagent/ammonia, /datum/reagent/carbon, /datum/reagent/copper, /datum/reagent/iron, /datum/reagent/lithium, /datum/reagent/mercury, /datum/reagent/potassium, /datum/reagent/radium, /datum/reagent/sodium)
|
||||
reagent_i = pick(chems)
|
||||
reagent_id = reagent_i
|
||||
name = replacetext(name, "chemical", lowertext(initial(reagent_id.name)))
|
||||
desc = replacetext(desc, "chemical", lowertext(initial(reagent_id.name)))
|
||||
var/mutable_appearance/crystal_overlay = mutable_appearance(icon, "[initial(icon_state)]-overlay")
|
||||
crystal_overlay.color = initial(reagent_id.color)
|
||||
add_overlay(crystal_overlay)
|
||||
if(our_creator)
|
||||
creator = our_creator
|
||||
|
||||
/obj/structure/reagent_crystal/examine(mob/user)
|
||||
. = ..()
|
||||
var/state
|
||||
var/current_damage = health / initial(health)
|
||||
switch(current_damage)
|
||||
if(0 to 0.2)
|
||||
state = SPAN_DANGER("The crystal is barely holding together!")
|
||||
if(0.2 to 0.4)
|
||||
state = SPAN_WARNING("The crystal has various cracks visible!")
|
||||
if(0.4 to 0.8)
|
||||
state = SPAN_WARNING("The crystal has scratches and deeper grooves on its surface.")
|
||||
if(0.8 to 1)
|
||||
state = SPAN_NOTICE("The crystal looks structurally sound.")
|
||||
to_chat(user, state)
|
||||
|
||||
/obj/structure/reagent_crystal/proc/take_damage(var/damage)
|
||||
health -= damage
|
||||
if(health <= 0)
|
||||
visible_message(SPAN_WARNING("\The [src] collapses into smaller crystals!"))
|
||||
harvest()
|
||||
|
||||
/obj/structure/reagent_crystal/attack_hand(mob/user)
|
||||
if(HULK in user.mutations)
|
||||
user.visible_message(SPAN_WARNING("\The [user] smashes \the [src] apart!"), SPAN_WARNING("You smash \the [src] apart!"))
|
||||
harvest()
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/structure/reagent_crystal/attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/gun/energy/plasmacutter))
|
||||
mine_crystal(user, 30 / W.toolspeed, W.usesound)
|
||||
|
||||
else if(istype(W, /obj/item/melee/energy))
|
||||
var/obj/item/melee/energy/WT = W
|
||||
if(WT.active)
|
||||
mine_crystal(user, 30 / W.toolspeed, W.usesound)
|
||||
else
|
||||
to_chat(user, SPAN_NOTICE("You need to activate \the [W] to do that!"))
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/melee/energy/blade))
|
||||
mine_crystal(user, 30 / W.toolspeed, W.usesound)
|
||||
|
||||
else if(istype(W, /obj/item/pickaxe))
|
||||
var/obj/item/pickaxe/P = W
|
||||
mine_crystal(user, P.digspeed, W.usesound)
|
||||
|
||||
else if(W.force > 5)
|
||||
user.do_attack_animation(src)
|
||||
playsound(get_turf(src), 'sound/weapons/smash.ogg', 50)
|
||||
visible_message(SPAN_WARNING("\The [user] smashes \the [W] into \the [src]."))
|
||||
take_damage(W.force * 4)
|
||||
|
||||
/obj/structure/reagent_crystal/proc/mine_crystal(var/mob/user, var/time_to_dig, var/use_sound)
|
||||
if(!user)
|
||||
return
|
||||
if(!time_to_dig)
|
||||
time_to_dig = 50
|
||||
|
||||
if(do_after(user, time_to_dig * mine_rate, act_target = src))
|
||||
if(!src)
|
||||
return
|
||||
harvest()
|
||||
if(use_sound)
|
||||
playsound(get_turf(src), use_sound, 30, TRUE)
|
||||
|
||||
/obj/structure/reagent_crystal/proc/harvest()
|
||||
new /obj/item/reagent_crystal(get_turf(src), reagent_id, 5)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/reagent_crystal/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if(prob(30))
|
||||
harvest()
|
||||
return
|
||||
else
|
||||
health -= rand(60,180)
|
||||
if(3.0)
|
||||
if(prob(5))
|
||||
harvest()
|
||||
return
|
||||
else
|
||||
health -= rand(40,80)
|
||||
else
|
||||
if(health <= 0)
|
||||
harvest()
|
||||
return
|
||||
|
||||
/obj/structure/reagent_crystal/attack_generic(var/mob/user, var/damage, var/attack_message = "smashes apart", var/wallbreaker)
|
||||
if(!damage || !wallbreaker)
|
||||
return FALSE
|
||||
user.do_attack_animation(src)
|
||||
visible_message(SPAN_WARNING("\The [user] [attack_message] \the [src]!"))
|
||||
harvest()
|
||||
return TRUE
|
||||
|
||||
/obj/structure/reagent_crystal/proc/become_dense()
|
||||
var/health_mod = health / initial(health)
|
||||
var/obj/structure/reagent_crystal/dense/P = new /obj/structure/reagent_crystal/dense(get_turf(src), reagent_id, creator)
|
||||
P.health *= health_mod
|
||||
if(creator)
|
||||
creator.agitation_turfs -= get_turf(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/reagent_crystal/dense
|
||||
name = "dense chemical crystal cluster"
|
||||
desc = "A dense cluster of hardened chemical crystals."
|
||||
icon_state = "dense"
|
||||
health = 200
|
||||
mine_rate = 2
|
||||
|
||||
/obj/structure/reagent_crystal/dense/harvest()
|
||||
var/turf/our_turf = get_turf(src)
|
||||
for(var/i = 0 to 2)
|
||||
new /obj/item/reagent_crystal(our_turf, reagent_id, 5)
|
||||
if(creator)
|
||||
creator.agitation_turfs += our_turf
|
||||
qdel(src)
|
||||
|
||||
/obj/item/reagent_crystal
|
||||
name = "crystal"
|
||||
desc = "A clear, pointy crystal. It looks rough, unprocessed."
|
||||
icon = 'icons/obj/crystals.dmi'
|
||||
icon_state = "crystal"
|
||||
|
||||
/obj/item/reagent_crystal/Initialize(mapload, reagent_i, amount)
|
||||
. = ..()
|
||||
create_reagents(5)
|
||||
reagents.add_reagent(reagent_i, amount)
|
||||
var/datum/reagent/R = new reagent_i
|
||||
name = "[lowertext(R.name)] crystal"
|
||||
desc = "A [lowertext(R.name)] crystal. It looks rough, unprocessed."
|
||||
desc_info = "This crystal can be grinded to obtain the chemical material locked within."
|
||||
color = reagents.get_color()
|
||||
|
||||
/obj/item/storage/bag/crystal
|
||||
name = "crystal satchel"
|
||||
desc = "This big boy can store a vast amount of crystals."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "satchel"
|
||||
slot_flags = SLOT_BELT | SLOT_POCKET
|
||||
max_storage_space = 100
|
||||
can_hold = list(/obj/item/reagent_crystal)
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/structure/bed/chair/remote/mech
|
||||
name = "mech control centre"
|
||||
desc = "A comfortable chair with full audio-visual transposition centres. This one gives you access to exosuits attached to the remote network."
|
||||
remote_network = "remotemechs"
|
||||
remote_network = REMOTE_GENERIC_MECH
|
||||
|
||||
/obj/structure/bed/chair/remote/mech/user_buckle_mob(mob/user)
|
||||
..()
|
||||
@@ -15,7 +15,7 @@
|
||||
/obj/structure/bed/chair/remote/mech/prison
|
||||
name = "brig mech control centre"
|
||||
desc = "A comfortable chair with full audio-visual transposition centres. This one gives you access to exosuits attached to the brig network."
|
||||
remote_network = "prisonmechs"
|
||||
remote_network = REMOTE_PRISON_MECH
|
||||
|
||||
/obj/structure/bed/chair/remote/mech/prison/portable
|
||||
portable_type = /obj/item/deployable_kit/remote_mech/brig
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/structure/bed/chair/remote/robot
|
||||
name = "robot control centre"
|
||||
desc = "A comfortable chair with full audio-visual transposition centres. This one gives you access to robots attached to the remote network."
|
||||
remote_network = "remoterobots"
|
||||
remote_network = REMOTE_GENERIC_ROBOT
|
||||
|
||||
/obj/structure/bed/chair/remote/robot/user_buckle_mob(mob/user)
|
||||
..()
|
||||
@@ -12,4 +12,14 @@
|
||||
/obj/structure/bed/chair/remote/robot/bunker
|
||||
name = "bunker robot control centre"
|
||||
desc = "A comfortable chair with full audio-visual transposition centres. This one gives you access to robots attached to the bunker network."
|
||||
remote_network = "bunkerrobots"
|
||||
remote_network = REMOTE_BUNKER_ROBOT
|
||||
|
||||
/obj/structure/bed/chair/remote/robot/prison
|
||||
name = "penal robot control centre"
|
||||
desc = "A comfortable chair with full audio-visual transposition centres. This one gives you access to robots attached to the penal network."
|
||||
remote_network = REMOTE_PRISON_ROBOT
|
||||
|
||||
/obj/structure/bed/chair/remote/robot/warden
|
||||
name = "warden robot control centre"
|
||||
desc = "A comfortable chair with full audio-visual transposition centres. This one gives you access to robots attached to the warden's network."
|
||||
remote_network = REMOTE_WARDEN_ROBOT
|
||||
@@ -5,7 +5,7 @@
|
||||
icon_state = "aislot"
|
||||
origin_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 4, TECH_DATA = 4)
|
||||
w_class = ITEMSIZE_SMALL
|
||||
var/mech_remote_network = "remotemechs"
|
||||
var/mech_remote_network = REMOTE_GENERIC_MECH
|
||||
var/hardpoint_lock = FALSE // Whether mechs that receive this upgrade gets locked
|
||||
var/dummy_path = /mob/living/simple_animal/spiderbot
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
/obj/item/remote_mecha/penal
|
||||
name = "penal exosuit remote upgrade"
|
||||
desc = "A device that, when inserted into an exosuit, allows it to be remotely piloted. Intended for prison networks."
|
||||
mech_remote_network = "prisonmechs"
|
||||
mech_remote_network = REMOTE_PRISON_MECH
|
||||
hardpoint_lock = TRUE
|
||||
|
||||
/obj/item/remote_mecha/penal/examine(mob/user)
|
||||
@@ -30,5 +30,5 @@
|
||||
/obj/item/remote_mecha/ai
|
||||
name = "AI exosuit remote upgrade"
|
||||
desc = "A device that, when inserted into an exosuit, allows it to be remotely piloted by the artificial intelligence."
|
||||
mech_remote_network = "aimechs"
|
||||
mech_remote_network = REMOTE_AI_MECH
|
||||
dummy_path = /mob/living/simple_animal/spiderbot/ai
|
||||
@@ -254,7 +254,7 @@
|
||||
remote = TRUE
|
||||
name = name + " \"[pick("Jaeger", "Reaver", "Templar", "Juggernaut", "Basilisk")]-[rand(0, 999)]\""
|
||||
if(!remote_network)
|
||||
remote_network = "remotemechs"
|
||||
remote_network = REMOTE_GENERIC_MECH
|
||||
SSvirtualreality.add_mech(src, remote_network)
|
||||
|
||||
if(hatch_closed)
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
/mob/living/heavy_vehicle/premade/miner/remote
|
||||
name = "remote mining mecha"
|
||||
dummy_colour = "#ffc44f"
|
||||
remote_network = "remotemechs"
|
||||
remote_network = REMOTE_GENERIC_MECH
|
||||
does_hardpoint_lock = FALSE
|
||||
|
||||
/mob/living/heavy_vehicle/premade/miner/remote_prison
|
||||
name = "penal mining mecha"
|
||||
dummy_colour = "#302e2b"
|
||||
remote_network = "prisonmechs"
|
||||
remote_network = REMOTE_PRISON_MECH
|
||||
@@ -151,20 +151,20 @@
|
||||
/mob/living/heavy_vehicle/premade/ripley/remote
|
||||
name = "remote power loader"
|
||||
dummy_colour = "#ffc44f"
|
||||
remote_network = "remotemechs"
|
||||
remote_network = REMOTE_GENERIC_MECH
|
||||
does_hardpoint_lock = FALSE
|
||||
|
||||
/mob/living/heavy_vehicle/premade/ripley/remote_prison
|
||||
name = "penal power loader"
|
||||
dummy_colour = "#302e2b"
|
||||
remote_network = "prisonmechs"
|
||||
remote_network = REMOTE_PRISON_MECH
|
||||
|
||||
/mob/living/heavy_vehicle/premade/ripley/remote_ai
|
||||
name = "stationbound power loader"
|
||||
e_color = COLOR_GREEN_GRAY
|
||||
dummy_colour = COLOR_GREEN_GRAY
|
||||
dummy_type = /mob/living/simple_animal/spiderbot/ai
|
||||
remote_network = "aimechs"
|
||||
remote_network = REMOTE_AI_MECH
|
||||
does_hardpoint_lock = FALSE
|
||||
|
||||
h_l_hand = /obj/item/mecha_equipment/toolset
|
||||
@@ -161,7 +161,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy/mannequin)
|
||||
mind.name = real_name
|
||||
status_flags |= NO_ANTAG
|
||||
|
||||
remote_network = "remoterobots"
|
||||
remote_network = REMOTE_GENERIC_ROBOT
|
||||
SSvirtualreality.add_robot(src, remote_network)
|
||||
|
||||
/mob/living/carbon/human/industrial_xion_remote/Stat()
|
||||
@@ -200,7 +200,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy/mannequin)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_com(src), slot_l_ear)
|
||||
|
||||
remote_network = "bunkerrobots"
|
||||
remote_network = REMOTE_BUNKER_ROBOT
|
||||
SSvirtualreality.add_robot(src, remote_network)
|
||||
|
||||
/mob/living/carbon/human/industrial_xion_remote_bunker/Stat()
|
||||
@@ -209,6 +209,55 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy/mannequin)
|
||||
if(client?.statpanel == "Status")
|
||||
stat("Battery Charge: ", "[nutrition]/[max_nutrition]")
|
||||
|
||||
/mob/living/carbon/human/industrial_xion_remote_penal/Initialize(mapload)
|
||||
. = ..(mapload, "Remote Xion Industrial Frame")
|
||||
|
||||
real_name = "Remote Robot [pick("Jim", "Slart", "Whacker")]-[rand(0, 999)]"
|
||||
name = real_name
|
||||
dna.real_name = real_name
|
||||
if(mind)
|
||||
mind.name = real_name
|
||||
status_flags |= NO_ANTAG
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_penal(src), slot_l_ear)
|
||||
|
||||
remote_network = REMOTE_PRISON_ROBOT
|
||||
SSvirtualreality.add_robot(src, remote_network)
|
||||
|
||||
/mob/living/carbon/human/industrial_xion_remote_penal/Stat()
|
||||
..()
|
||||
|
||||
if(client?.statpanel == "Status")
|
||||
stat(null, "Battery Charge: [nutrition]/[max_nutrition]")
|
||||
|
||||
/mob/living/carbon/human/industrial_xion_remote_warden/Initialize(mapload)
|
||||
. = ..(mapload, "Remote Xion Industrial Frame")
|
||||
|
||||
real_name = "Remote Robot Overseer-[rand(0, 999)]"
|
||||
name = real_name
|
||||
dna.real_name = real_name
|
||||
if(mind)
|
||||
mind.name = real_name
|
||||
status_flags |= NO_ANTAG
|
||||
|
||||
var/obj/item/card/id/ID = new /obj/item/card/id(get_turf(src))
|
||||
ID.assignment = "Overseer"
|
||||
src.set_id_info(ID)
|
||||
ID.access = list(access_armory)
|
||||
equip_to_slot_or_del(ID, slot_wear_id)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/rank/warden(src), slot_w_uniform)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_warden(src), slot_l_ear)
|
||||
|
||||
remote_network = REMOTE_WARDEN_ROBOT
|
||||
SSvirtualreality.add_robot(src, remote_network)
|
||||
|
||||
/mob/living/carbon/human/industrial_xion_remote_warden/Stat()
|
||||
..()
|
||||
|
||||
if(client?.statpanel == "Status")
|
||||
stat(null, "Battery Charge: [nutrition]/[max_nutrition]")
|
||||
|
||||
/mob/living/carbon/human/industrial_zenghu/Initialize(mapload)
|
||||
. = ..(mapload, SPECIES_IPC_ZENGHU)
|
||||
|
||||
@@ -246,7 +295,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy/mannequin)
|
||||
mind.name = real_name
|
||||
status_flags |= NO_ANTAG
|
||||
|
||||
remote_network = "remoterobots"
|
||||
remote_network = REMOTE_GENERIC_ROBOT
|
||||
SSvirtualreality.add_robot(src, remote_network)
|
||||
|
||||
/mob/living/carbon/human/unbranded_frame_remote/Stat()
|
||||
@@ -269,7 +318,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy/mannequin)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_com(src), slot_l_ear)
|
||||
|
||||
remote_network = "bunkerrobots"
|
||||
remote_network = REMOTE_BUNKER_ROBOT
|
||||
SSvirtualreality.add_robot(src, remote_network)
|
||||
|
||||
/mob/living/carbon/human/unbranded_frame_remote_bunker/Stat()
|
||||
|
||||
@@ -10,6 +10,7 @@ var/list/department_radio_keys = list(
|
||||
":m" = "Medical", ".m" = "Medical",
|
||||
":e" = "Engineering", ".e" = "Engineering",
|
||||
":s" = "Security", ".s" = "Security",
|
||||
":q" = "Penal", ".q" = "Penal",
|
||||
":w" = "whisper", ".w" = "whisper",
|
||||
":t" = "Mercenary", ".t" = "Mercenary",
|
||||
":x" = "Raider", ".x" = "Raider",
|
||||
@@ -30,6 +31,7 @@ var/list/department_radio_keys = list(
|
||||
":M" = "Medical", ".M" = "Medical",
|
||||
":E" = "Engineering", ".E" = "Engineering",
|
||||
":S" = "Security", ".S" = "Security",
|
||||
":Q" = "Penal", ".Q" = "Penal",
|
||||
":W" = "whisper", ".W" = "whisper",
|
||||
":T" = "Mercenary", ".T" = "Mercenary",
|
||||
":X" = "Raider", ".X" = "Raider",
|
||||
|
||||
@@ -780,7 +780,7 @@ var/list/ai_verbs_default = list(
|
||||
set name = "Remote Control Mech"
|
||||
set category = "AI Commands"
|
||||
set desc = "Remotely control any active mechs on your AI mech network."
|
||||
SSvirtualreality.mech_selection(src, "aimechs")
|
||||
SSvirtualreality.mech_selection(src, REMOTE_AI_MECH)
|
||||
|
||||
/mob/living/silicon/ai/proc/toggle_hologram_movement()
|
||||
set name = "Toggle Hologram Movement"
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
var/list/robots = list()
|
||||
|
||||
if(signal.data["done"])
|
||||
for(var/mech in SSvirtualreality.mechs["prisonmechs"])
|
||||
for(var/mech in SSvirtualreality.mechs[REMOTE_PRISON_MECH])
|
||||
var/mob/living/heavy_vehicle/M = mech
|
||||
|
||||
if(!ismech(M))
|
||||
@@ -61,7 +61,7 @@
|
||||
mechData["lockdown"] = M.lockdown
|
||||
mechs[++mechs.len] = mechData
|
||||
|
||||
for(var/robot in SSvirtualreality.robots["prisonrobots"])
|
||||
for(var/robot in SSvirtualreality.robots[REMOTE_PRISON_ROBOT])
|
||||
var/mob/living/R = robot
|
||||
|
||||
if(!ismob(R))
|
||||
|
||||
120
code/modules/power/crystal_agitator.dm
Normal file
120
code/modules/power/crystal_agitator.dm
Normal file
@@ -0,0 +1,120 @@
|
||||
/obj/machinery/power/crystal_agitator
|
||||
name = "crystal agitator"
|
||||
desc = "A device of incredibly niche design. This agitator disturbs the ashy turf around it, causing chemical crystals to form."
|
||||
icon = 'icons/obj/crystal_agitator.dmi'
|
||||
icon_state = "agitator"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
|
||||
use_power = 0
|
||||
active_power_usage = 3000
|
||||
|
||||
var/agitation_range = 4
|
||||
var/agitation_rate = 80
|
||||
var/last_agitation = 0
|
||||
var/active = FALSE
|
||||
|
||||
var/last_turf_check = 0
|
||||
var/turf_check_rate = 3 MINUTES
|
||||
var/list/agitation_turfs = list()
|
||||
|
||||
component_types = list(
|
||||
/obj/item/stack/cable_coil{amount = 5},
|
||||
/obj/item/stock_parts/capacitor,
|
||||
/obj/item/stock_parts/manipulator,
|
||||
/obj/item/bluespace_crystal,
|
||||
/obj/item/circuitboard/crystal_agitator
|
||||
)
|
||||
|
||||
/obj/machinery/power/crystal_agitator/Initialize()
|
||||
. = ..()
|
||||
connect_to_network()
|
||||
|
||||
/obj/machinery/power/crystal_agitator/attack_hand(mob/user)
|
||||
toggle_active()
|
||||
visible_message("<b>[user]</b> turns \the [src] [active ? "on" : "off"].", SPAN_NOTICE("You turn \the [src] [active ? "on" : "off"]."))
|
||||
|
||||
/obj/machinery/power/crystal_agitator/proc/toggle_active()
|
||||
active = !active
|
||||
icon_state = "[initial(icon_state)][active ? "-active": ""]"
|
||||
if(active)
|
||||
check_turfs()
|
||||
|
||||
/obj/machinery/power/crystal_agitator/proc/check_turfs()
|
||||
var/turf/our_turf = get_turf(src)
|
||||
var/list/grow_turfs = list()
|
||||
for(var/thing in RANGE_TURFS(agitation_range, our_turf))
|
||||
var/turf/T = thing
|
||||
if(our_turf == T)
|
||||
continue
|
||||
if(!istype(T, /turf/unsimulated/floor/asteroid))
|
||||
continue
|
||||
if(locate(/obj/structure/reagent_crystal/dense) in T)
|
||||
continue
|
||||
grow_turfs += T
|
||||
agitation_turfs = grow_turfs
|
||||
last_turf_check = world.time + turf_check_rate
|
||||
|
||||
/obj/machinery/power/crystal_agitator/machinery_process()
|
||||
if(!active)
|
||||
return
|
||||
if(stat & (BROKEN) || !powernet)
|
||||
return
|
||||
if(last_agitation + agitation_rate > world.time)
|
||||
return
|
||||
if(!length(agitation_turfs))
|
||||
toggle_active()
|
||||
return
|
||||
|
||||
var/actual_load = draw_power(active_power_usage)
|
||||
if(actual_load < active_power_usage)
|
||||
toggle_active()
|
||||
return
|
||||
|
||||
// recheck the agitation turfs every few minutes to make sure we're not getting stuck
|
||||
if(last_turf_check < world.time)
|
||||
check_turfs()
|
||||
|
||||
var/turf/selected_turf = pick(agitation_turfs)
|
||||
var/obj/structure/reagent_crystal/P = locate() in selected_turf
|
||||
if(P)
|
||||
P.become_dense()
|
||||
return
|
||||
if(prob(1) && prob(1))
|
||||
new /mob/living/simple_animal/hostile/phoron_worm/small(selected_turf)
|
||||
else
|
||||
new /obj/structure/reagent_crystal(selected_turf, null, src)
|
||||
last_agitation = world.time
|
||||
|
||||
/obj/machinery/power/crystal_agitator/RefreshParts()
|
||||
for(var/obj/item/stock_parts/SP in component_parts)
|
||||
if(ismanipulator(SP))
|
||||
agitation_rate = initial(agitation_rate) - (SP.rating * 5)
|
||||
if(iscapacitor(SP))
|
||||
active_power_usage = initial(active_power_usage) - (SP.rating * 500)
|
||||
|
||||
/obj/machinery/power/crystal_agitator/attackby(obj/item/I, mob/user, params)
|
||||
if(default_part_replacement(user, I))
|
||||
return
|
||||
else if(default_deconstruction_screwdriver(user, I))
|
||||
return
|
||||
else if(default_deconstruction_crowbar(user, I))
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/circuitboard/crystal_agitator
|
||||
name = T_BOARD("Crystal Agitator")
|
||||
build_path = /obj/machinery/power/crystal_agitator
|
||||
board_type = "machine"
|
||||
origin_tech = list(
|
||||
TECH_ENGINEERING = 3,
|
||||
TECH_DATA = 2,
|
||||
TECH_MATERIAL = 4,
|
||||
TECH_POWER = 3
|
||||
)
|
||||
req_components = list(
|
||||
"/obj/item/stack/cable_coil" = 5,
|
||||
"/obj/item/stock_parts/capacitor" = 1,
|
||||
"/obj/item/stock_parts/manipulator" = 1,
|
||||
"/obj/item/bluespace_crystal" = 1
|
||||
)
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
/datum/reagent/carbon
|
||||
name = "Carbon"
|
||||
description = "A chemical element, the builing block of life."
|
||||
description = "A chemical element, the building block of life."
|
||||
reagent_state = SOLID
|
||||
color = "#1C1300"
|
||||
ingest_met = REM * 5
|
||||
|
||||
@@ -24,13 +24,20 @@
|
||||
var/flush_every_ticks = 30 //Every 30 ticks it will look whether it is ready to flush
|
||||
var/flush_count = 0 //this var adds 1 once per tick. When it reaches flush_every_ticks it resets and tries to flush.
|
||||
var/last_sound = 0
|
||||
var/uses_air = TRUE
|
||||
active_power_usage = 2200 //the pneumatic pump power. 3 HP ~ 2200W
|
||||
idle_power_usage = 100
|
||||
|
||||
/obj/machinery/disposal/airless
|
||||
uses_air = FALSE
|
||||
|
||||
/obj/machinery/disposal/small
|
||||
desc = "A compact pneumatic waste disposal unit."
|
||||
icon_state = "disposal_small"
|
||||
density = 0
|
||||
density = FALSE
|
||||
|
||||
/obj/machinery/disposal/small/airless
|
||||
uses_air = FALSE
|
||||
|
||||
/obj/machinery/disposal/small/Initialize()
|
||||
. = ..()
|
||||
@@ -38,21 +45,21 @@
|
||||
return
|
||||
else
|
||||
switch(dir)
|
||||
if(1)
|
||||
if(NORTH)
|
||||
pixel_y = -13
|
||||
layer = MOB_LAYER + 0.1
|
||||
if(2)
|
||||
if(SOUTH)
|
||||
pixel_y = 20
|
||||
layer = OBJ_LAYER + 0.3
|
||||
if(4)
|
||||
if(EAST)
|
||||
pixel_x = -12
|
||||
if(8)
|
||||
if(WEST)
|
||||
pixel_x = 11
|
||||
|
||||
/obj/machinery/disposal/small/check_mob_size(mob/target)
|
||||
if(target.mob_size > MOB_SMALL)
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
// create a new disposal
|
||||
// find the attached trunk (if present) and init gas resvr.
|
||||
@@ -129,12 +136,12 @@
|
||||
to_chat(user, "You can't place that item inside the disposal unit.")
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/storage/bag/trash))
|
||||
var/obj/item/storage/bag/trash/T = I
|
||||
to_chat(user, "<span class='notice'>You empty the bag.</span>")
|
||||
for(var/obj/item/O in T.contents)
|
||||
T.remove_from_storage(O,src)
|
||||
T.update_icon()
|
||||
if(istype(I, /obj/item/storage) && user.a_intent != I_HURT)
|
||||
var/obj/item/storage/S = I
|
||||
user.visible_message("<b>[user]</b> empties \the [S] into \the [src].", SPAN_NOTICE("You empty \the [S] into \the [src]."), range = 3)
|
||||
for(var/obj/item/O in S.contents)
|
||||
S.remove_from_storage(O, src)
|
||||
S.update_icon()
|
||||
update()
|
||||
return
|
||||
|
||||
@@ -182,12 +189,7 @@
|
||||
|
||||
user.drop_from_inventory(I,src)
|
||||
|
||||
to_chat(user, "You place \the [I] into the [src].")
|
||||
for(var/mob/M in viewers(src))
|
||||
if(M == user)
|
||||
continue
|
||||
M.show_message("[user.name] places \the [I] into the [src].", 3)
|
||||
|
||||
user.visible_message("<b>[user]</b> places \the [I] into \the [src].", SPAN_NOTICE("You place \the [I] into the [src]."), range = 3)
|
||||
update()
|
||||
|
||||
// mouse drop another mob or self
|
||||
@@ -307,14 +309,19 @@
|
||||
|
||||
dat += "<BR><HR><A href='?src=\ref[src];eject=1'>Eject contents</A><HR>"
|
||||
|
||||
if(mode <= 0)
|
||||
dat += "Pump: <B>Off</B> <A href='?src=\ref[src];pump=1'>On</A><BR>"
|
||||
else if(mode == 1)
|
||||
dat += "Pump: <A href='?src=\ref[src];pump=0'>Off</A> <B>On</B> (pressurizing)<BR>"
|
||||
if(uses_air)
|
||||
if(mode <= 0)
|
||||
dat += "Pump: <B>Off</B> <A href='?src=\ref[src];pump=1'>On</A><BR>"
|
||||
else if(mode == 1)
|
||||
dat += "Pump: <A href='?src=\ref[src];pump=0'>Off</A> <B>On</B> (pressurizing)<BR>"
|
||||
else
|
||||
dat += "Pump: <A href='?src=\ref[src];pump=0'>Off</A> <B>On</B> (idle)<BR>"
|
||||
else
|
||||
dat += "Pump: <A href='?src=\ref[src];pump=0'>Off</A> <B>On</B> (idle)<BR>"
|
||||
|
||||
var/per = 100* air_contents.return_pressure() / (SEND_PRESSURE)
|
||||
if(!uses_air)
|
||||
per = 100
|
||||
|
||||
dat += "Pressure: [round(per, 1)]%<BR></body>"
|
||||
|
||||
@@ -421,12 +428,12 @@
|
||||
|
||||
src.updateDialog()
|
||||
|
||||
if(flush && air_contents.return_pressure() >= SEND_PRESSURE ) // flush can happen even without power
|
||||
if(flush && (air_contents.return_pressure() >= SEND_PRESSURE || !uses_air)) // flush can happen even without power
|
||||
flush()
|
||||
|
||||
if(mode != 1) //if off or ready, no need to charge
|
||||
update_use_power(1)
|
||||
else if(air_contents.return_pressure() >= SEND_PRESSURE)
|
||||
else if((air_contents.return_pressure() >= SEND_PRESSURE || !uses_air))
|
||||
mode = 2 //if full enough, switch to ready mode
|
||||
update()
|
||||
else
|
||||
|
||||
@@ -52,6 +52,7 @@ em {font-style: normal;font-weight: bold;}
|
||||
.entradio {color: #bd893c;}
|
||||
|
||||
.secradio {color: #A30000;}
|
||||
.penradio {color: #DB1270;}
|
||||
.engradio {color: #A66300;}
|
||||
.medradio {color: #0a5c47;}
|
||||
.sciradio {color: #993399;}
|
||||
|
||||
Reference in New Issue
Block a user