diff --git a/aurora.dme b/aurora.dme
index f83ade1b..a9d6ac64 100644
--- a/aurora.dme
+++ b/aurora.dme
@@ -476,9 +476,7 @@
#include "code\game\mecha\equipment\tools\medical_tools.dm"
#include "code\game\mecha\equipment\tools\tools.dm"
#include "code\game\mecha\equipment\weapons\weapons.dm"
-#include "code\game\mecha\exo\exo.dm"
-#include "code\game\mecha\exo\exobase.dm"
-#include "code\game\mecha\exo\exoert.dm"
+#include "code\game\mecha\exo\exoskeleton.dm"
#include "code\game\mecha\medical\medical.dm"
#include "code\game\mecha\medical\odysseus.dm"
#include "code\game\mecha\working\ripley.dm"
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index d01ec166..d617c12c 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -67,7 +67,7 @@
var/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access.
var/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds...
- var/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active.
+ var/cult_ghostwriter_req_cultists = 3 //...so long as this many cultists are active.
var/disable_player_mice = 0
var/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 8774753c..3cbdf043 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -11,10 +11,13 @@
var/fire_volume = 50 //How loud it is played.
var/auto_rearm = 0 //Does the weapon reload itself after each shot?
-/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(var/obj/mecha/combat/M as obj)
- if(!istype(M))
+/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(var/obj/mecha/combat/M)
+
+ if(istype(M))
+ return ..()
+ else
return 0
- return ..()
+
/obj/item/mecha_parts/mecha_equipment/weapon/action_checks(atom/target)
if(projectiles <= 0)
@@ -324,10 +327,116 @@
projectile = /obj/item/projectile/energy/electrode
fire_sound = 'sound/weapons/Taser.ogg'
+ can_attach(var/obj/mecha/combat/exoskeleton/M as obj)
+ if(!istype(M))
+ return 0
+ else
+ return ..()
+
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laserexo
equip_cooldown = 8
name = "Exoskeleton Immolater Weapon"
icon_state = "mecha_laser"
energy_drain = 30
projectile = /obj/item/projectile/beam
- fire_sound = 'sound/weapons/Laser.ogg'
\ No newline at end of file
+ fire_sound = 'sound/weapons/Laser.ogg'
+
+ can_attach(var/obj/mecha/combat/exoskeleton/M as obj)
+ if(!istype(M))
+ return 0
+ else
+ return ..()
+
+/obj/item/mecha_parts/mecha_equipment/handcuffs
+ name = "handcuffs"
+ desc = "Use this to keep prisoners in line."
+ gender = PLURAL
+ icon = 'icons/obj/items.dmi'
+ icon_state = "handcuff"
+ flags = FPRINT | TABLEPASS | CONDUCT
+ slot_flags = SLOT_BELT
+ throwforce = 5
+ w_class = 2.0
+ throw_speed = 2
+ throw_range = 5
+ m_amt = 500
+ origin_tech = "materials=1"
+ var/dispenser = 0
+ var/breakouttime = 1200 //Deciseconds = 120s = 2 minutes
+
+/obj/item/weapon/handcuffs/attack(mob/living/carbon/C as mob, mob/user as mob)
+ if(istype(src, /obj/item/weapon/handcuffs/cyborg) && isrobot(user))
+ if(!C.handcuffed)
+ var/turf/p_loc = user.loc
+ var/turf/p_loc_m = C.loc
+ playsound(src.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2)
+ for(var/mob/O in viewers(user, null))
+ O.show_message("\red [user] is trying to put handcuffs on [C]!", 1)
+ spawn(30)
+ if(!C) return
+ if(p_loc == user.loc && p_loc_m == C.loc)
+ C.handcuffed = new /obj/item/weapon/handcuffs(C)
+ C.update_inv_handcuffed()
+
+ else
+ if ((CLUMSY in usr.mutations) && prob(50))
+ usr << "\red Uh ... how do those things work?!"
+ if (istype(C, /mob/living/carbon/human))
+ if(!C.handcuffed)
+ var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
+ O.source = user
+ O.target = user
+ O.item = user.get_active_hand()
+ O.s_loc = user.loc
+ O.t_loc = user.loc
+ O.place = "handcuff"
+ C.requests += O
+ spawn( 0 )
+ O.process()
+ return
+ return
+ if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ usr << "\red You don't have the dexterity to do this!"
+ return
+ if (istype(C, /mob/living/carbon/human))
+ if(!C.handcuffed)
+
+ C.attack_log += text("\[[time_stamp()]\] Has been handcuffed (attempt) by [user.name] ([user.ckey])")
+ user.attack_log += text("\[[time_stamp()]\] Attempted to handcuff [C.name] ([C.ckey])")
+ log_attack("[user.name] ([user.ckey]) Attempted to handcuff [C.name] ([C.ckey])")
+
+ var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
+ O.source = user
+ O.target = C
+ O.item = user.get_active_hand()
+ O.s_loc = user.loc
+ O.t_loc = C.loc
+ O.place = "handcuff"
+ C.requests += O
+ spawn( 0 )
+ if(istype(src, /obj/item/weapon/handcuffs/cable))
+ feedback_add_details("handcuffs","C")
+ playsound(src.loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
+ else
+ feedback_add_details("handcuffs","H")
+ playsound(src.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2)
+ O.process()
+ return
+ else
+ if(!C.handcuffed)
+ var/obj/effect/equip_e/monkey/O = new /obj/effect/equip_e/monkey( )
+ O.source = user
+ O.target = C
+ O.item = user.get_active_hand()
+ O.s_loc = user.loc
+ O.t_loc = C.loc
+ O.place = "handcuff"
+ C.requests += O
+ spawn( 0 )
+ if(istype(src, /obj/item/weapon/handcuffs/cable))
+ playsound(src.loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
+ else
+ playsound(src.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2)
+ O.process()
+ return
+ return
\ No newline at end of file
diff --git a/code/game/mecha/exo/exo.dm b/code/game/mecha/exo/exo.dm
deleted file mode 100644
index 7560ecea..00000000
--- a/code/game/mecha/exo/exo.dm
+++ /dev/null
@@ -1,100 +0,0 @@
-/obj/mecha/exoskeleton/exoskeletonother
- name = "Exoskeleton Mk. I"
- desc = "A prototype currently in development for special response and other purposes."
- icon_state = "exosuit" // need this
- initial_icon = "exosuit" // need this
- step_in = 2
- max_temperature = 20000 // DON'T FORGET TO TEST THIS
- health = 300
- wreckage = /obj/effect/decal/mecha_wreckage/ripley
- internal_damage_threshold = 25
- deflect_chance = 50
- step_energy_drain = 8
- var/obj/item/clothing/glasses/hud/security/mech/hud
-
- New()
- ..()
- hud = new /obj/item/clothing/glasses/hud/security/mech(src)
- return
-
- moved_inside(var/mob/living/carbon/human/H as mob)
- if(..())
- if(H.glasses)
- occupant_message("[H.glasses] prevent you from using [src] [hud]")
- else
- H.glasses = hud
- return 1
- else
- return 0
-
- go_out()
- if(ishuman(occupant))
- var/mob/living/carbon/human/H = occupant
- if(H.glasses == hud)
- H.glasses = null
- ..()
- return
-
-/obj/item/clothing/glasses/hud/security/mech
- name = "Integrated Security Hud"
-
-/obj/item/clothing/glasses/hud/security/mech/process_hud(var/mob/M)
- if(!M) return
- if(!M.client) return
- var/client/C = M.client
- var/image/holder
- for(var/mob/living/carbon/human/perp in view(get_turf(M)))
- if(M.see_invisible < perp.invisibility)
- continue
- if(!C) continue
- var/perpname = perp.name
- holder = perp.hud_list[ID_HUD]
- if(perp.wear_id)
- var/obj/item/weapon/card/id/I = perp.wear_id.GetID()
- if(I)
- perpname = I.registered_name
- holder.icon_state = "hud[ckey(I.GetJobName())]"
- C.images += holder
- else
- perpname = perp.name
- holder.icon_state = "hudunknown"
- C.images += holder
- else
- perpname = perp.name
- holder.icon_state = "hudunknown"
- C.images += holder
-
- for(var/datum/data/record/E in data_core.general)
- if(E.fields["name"] == perpname)
- holder = perp.hud_list[WANTED_HUD]
- for (var/datum/data/record/R in data_core.security)
- if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*"))
- holder.icon_state = "hudwanted"
- C.images += holder
- break
- else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Incarcerated"))
- holder.icon_state = "hudprisoner"
- C.images += holder
- break
- else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Parolled"))
- holder.icon_state = "hudparolled"
- C.images += holder
- break
- else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Released"))
- holder.icon_state = "hudreleased"
- C.images += holder
- break
- for(var/obj/item/weapon/implant/I in perp)
- if(I.implanted)
- if(istype(I,/obj/item/weapon/implant/tracking))
- holder = perp.hud_list[IMPTRACK_HUD]
- holder.icon_state = "hud_imp_tracking"
- C.images += holder
- if(istype(I,/obj/item/weapon/implant/loyalty))
- holder = perp.hud_list[IMPLOYAL_HUD]
- holder.icon_state = "hud_imp_loyal"
- C.images += holder
- if(istype(I,/obj/item/weapon/implant/chem))
- holder = perp.hud_list[IMPCHEM_HUD]
- holder.icon_state = "hud_imp_chem"
- C.images += holder
\ No newline at end of file
diff --git a/code/game/mecha/exo/exoert.dm b/code/game/mecha/exo/exoert.dm
deleted file mode 100644
index 4cb8388c..00000000
--- a/code/game/mecha/exo/exoert.dm
+++ /dev/null
@@ -1,100 +0,0 @@
-/obj/mecha/exoskeleton/exoskeletonert
- name = ""
- desc = ""
- icon_state = "" // need this
- initial_icon = "" // need this
- step_in = 2
- max_temperature = 20000 // DON'T FORGET TO TEST THIS
- health = 300
-// wreckage = // need icon
- internal_damage_threshold = 25
- deflect_chance = 50
- step_energy_drain = 8
- var/obj/item/clothing/glasses/hud/security/mech/hud
-
- New()
- ..()
- hud = new /obj/item/clothing/glasses/hud/security/mech(src)
- return
-
- moved_inside(var/mob/living/carbon/human/H as mob)
- if(..())
- if(H.glasses)
- occupant_message("[H.glasses] prevent you from using [src] [hud]")
- else
- H.glasses = hud
- return 1
- else
- return 0
-
- go_out()
- if(ishuman(occupant))
- var/mob/living/carbon/human/H = occupant
- if(H.glasses == hud)
- H.glasses = null
- ..()
- return
-
-/obj/item/clothing/glasses/hud/security/mech
- name = "Integrated Security Hud"
-
-/obj/item/clothing/glasses/hud/security/mech/process_hud(var/mob/M)
- if(!M) return
- if(!M.client) return
- var/client/C = M.client
- var/image/holder
- for(var/mob/living/carbon/human/perp in view(get_turf(M)))
- if(M.see_invisible < perp.invisibility)
- continue
- if(!C) continue
- var/perpname = perp.name
- holder = perp.hud_list[ID_HUD]
- if(perp.wear_id)
- var/obj/item/weapon/card/id/I = perp.wear_id.GetID()
- if(I)
- perpname = I.registered_name
- holder.icon_state = "hud[ckey(I.GetJobName())]"
- C.images += holder
- else
- perpname = perp.name
- holder.icon_state = "hudunknown"
- C.images += holder
- else
- perpname = perp.name
- holder.icon_state = "hudunknown"
- C.images += holder
-
- for(var/datum/data/record/E in data_core.general)
- if(E.fields["name"] == perpname)
- holder = perp.hud_list[WANTED_HUD]
- for (var/datum/data/record/R in data_core.security)
- if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*"))
- holder.icon_state = "hudwanted"
- C.images += holder
- break
- else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Incarcerated"))
- holder.icon_state = "hudprisoner"
- C.images += holder
- break
- else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Parolled"))
- holder.icon_state = "hudparolled"
- C.images += holder
- break
- else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Released"))
- holder.icon_state = "hudreleased"
- C.images += holder
- break
- for(var/obj/item/weapon/implant/I in perp)
- if(I.implanted)
- if(istype(I,/obj/item/weapon/implant/tracking))
- holder = perp.hud_list[IMPTRACK_HUD]
- holder.icon_state = "hud_imp_tracking"
- C.images += holder
- if(istype(I,/obj/item/weapon/implant/loyalty))
- holder = perp.hud_list[IMPLOYAL_HUD]
- holder.icon_state = "hud_imp_loyal"
- C.images += holder
- if(istype(I,/obj/item/weapon/implant/chem))
- holder = perp.hud_list[IMPCHEM_HUD]
- holder.icon_state = "hud_imp_chem"
- C.images += holder
\ No newline at end of file
diff --git a/code/game/mecha/exo/exosec.dm b/code/game/mecha/exo/exoskeleton.dm
similarity index 93%
rename from code/game/mecha/exo/exosec.dm
rename to code/game/mecha/exo/exoskeleton.dm
index 29930193..3de2c6ee 100644
--- a/code/game/mecha/exo/exosec.dm
+++ b/code/game/mecha/exo/exoskeleton.dm
@@ -1,16 +1,17 @@
-/obj/mecha/exoskeleton/exoskeleton
- name = "exoskeleton"
- desc = ""
- icon_state = "ripley" // need this
- initial_icon = "ripley" // need this
+/obj/mecha/combat/exoskeleton
+ name = "Exoskeleton Mk. I"
+ desc = "A prototype currently in development for special response and other purposes."
+ icon_state = "exosuit" // need this
+ initial_icon = "exosuit" // need this
step_in = 2
max_temperature = 7000 // DON'T FORGET TO TEST THIS
health = 200
- wreckage = /obj/effect/decal/mecha_wreckage/ripley
+ wreckage = /obj/effect/decal/mecha_wreckage/exoskeleton
internal_damage_threshold = 35
deflect_chance = 25
step_energy_drain = 4
var/obj/item/clothing/glasses/hud/security/mech/hud
+ max_equip = 3
New()
..()
@@ -99,7 +100,7 @@
holder.icon_state = "hud_imp_chem"
C.images += holder
-/obj/mecha/exoskeleton/exoskeleton/melee_action(target as obj|mob|turf)
+/*/obj/mecha/exoskeleton/exoskeleton/melee_action(target as obj|mob|turf)
force = 30
var/melee_cooldown2 = 10
var/melee_can_hit2 = 1
@@ -179,12 +180,12 @@
melee_can_hit2 = 1
return
- else
+/* else
if(damtype == "brute")
for(var/target_type in src.destroyable_obj)
if(istype(target, target_type) && hascall(target, "attackby"))
src.occupant_message("You hit [target].")
- src.visible_message("[src.name] hits [target]")
+ src.visible_message("[src.name] hits [target] for no damage.")
if(!istype(target, /turf/simulated/wall))
target:attackby(src,src.occupant)
/* else if(prob(5))
@@ -196,4 +197,4 @@
if(do_after(melee_cooldown2))
melee_can_hit2 = 1
break
- return
\ No newline at end of file
+ return */ */
\ No newline at end of file
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 2b3ab275..4a27f4e4 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -93,6 +93,7 @@
"Exoskeleton"=list(
/obj/item/mecha_parts/chassis/exoskeleton,
+ /obj/item/mecha_parts/part/exoskeletonarmor,
/obj/item/mecha_parts/part/hydraulicspack,
/obj/item/mecha_parts/part/electricalpack
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index c011a58f..6fa5b217 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -586,7 +586,7 @@
const_holder.density = 1
spawn()
del src
- return
+ return 0
/datum/construction/reversible/mecha/firefighter
@@ -888,7 +888,7 @@
const_holder.density = 1
spawn()
del src
- return
+ return 0
/datum/construction/reversible/mecha/durand
result = "/obj/mecha/combat/durand"
@@ -1391,9 +1391,9 @@
spawn_result()
var/obj/item/mecha_parts/chassis/const_holder = holder
- const_holder.construct = new /datum/construction/reversible/mecha/odysseus(const_holder)
+ const_holder.construct = new /datum/construction/reversible/mecha/exoskeleton(const_holder)
const_holder.icon = 'icons/mecha/mech_construction.dmi'
- const_holder.icon_state = "odysseus0"
+ const_holder.icon_state = "exoskeleton0"
const_holder.density = 1
spawn()
del src
@@ -1401,7 +1401,7 @@
/datum/construction/reversible/mecha/exoskeleton
- result = "/obj/mecha/working/exoskeleton"
+ result = "/obj/mecha/combat/exoskeleton"
steps = list(
//1
list("key"=/obj/item/weapon/weldingtool,
@@ -1412,52 +1412,41 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="External armor is installed."),
//3
- list("key"=/obj/item/mecha_parts/part/exoskeletonarmor,
- "backkey"=/obj/item/weapon/weldingtool,
- "desc"="Internal armor is welded."),
- //4
list("key"=/obj/item/weapon/weldingtool,
"backkey"=/obj/item/weapon/wrench,
"desc"="Internal armor is wrenched"),
- //5
+ //4
list("key"=/obj/item/weapon/wrench,
"backkey"=/obj/item/weapon/crowbar,
"desc"="Internal armor is installed"),
- //6
+ //5
list("key"=/obj/item/stack/sheet/metal,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Central control module is secured"),
- //7
+ //6
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/crowbar,
"desc"="Central control module is installed"),
- //8
+ //7
list("key"=/obj/item/weapon/circuitboard/mecha/exoskeleton/main,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="The wiring is adjusted"),
- //9
- list("key"=/obj/item/mecha_parts/part/electricalpack,
- "backkey"=/obj/item/weapon/screwdriver,
- "desc"="Electrical Pack"),
- //10
+ //8
list("key"=/obj/item/weapon/wirecutters,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="The wiring is added"),
- //11
+ //9
list("key"=/obj/item/weapon/cable_coil,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="The hydraulic systems are active."),
- //12
+ //11
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/wrench,
"desc"="The hydraulic systems are connected."),
- //13
+ //12
list("key"=/obj/item/weapon/wrench,
"backkey"=/obj/item/weapon/screwdriver,
- "desc"="The hydraulic systems are disconnected."),
- //14
- list("key"=/obj/item/mecha_parts/part/hydraulicspack,
- "desc"="Hydraulic pack disconnected."),
+ "desc"="The hydraulic systems are disconnected.")
)
action(atom/used_atom,mob/user as mob)
@@ -1469,106 +1458,93 @@
//TODO: better messages.
switch(index)
- if(14)
- user.visible_message("[user] installs [holder] hydraulics pack", "You install [holder] hydraulics pack.")
- if(13)
- if(diff==FORWARD)
- user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
- holder.icon_state = ""
- else
- user.visible_message("[user] removes [holder] hydraulics pack", "You remove [holder] hydraulics pack.")
- holder.icon_state = ""
if(12)
- if(diff==FORWARD)
- user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
- holder.icon_state = ""
- else
- user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
- holder.icon_state = ""
+ user.visible_message("[user] installs [holder] hydraulics pack", "You install [holder] hydraulics pack.")
+ holder.icon_state = "exoskeleton1"
if(11)
if(diff==FORWARD)
- user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
- holder.icon_state = ""
+ user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
+ holder.icon_state = "exoskeleton2"
else
- user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
- holder.icon_state = ""
+ user.visible_message("[user] removes [holder] hydraulics pack", "You remove [holder] hydraulics pack.")
+ holder.icon_state = "exoskeleton0"
if(10)
+ if(diff==FORWARD)
+ user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
+ holder.icon_state = "exoskeleton3"
+ else
+ user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
+ holder.icon_state = "exoskeleton1"
+ if(9)
+ if(diff==FORWARD)
+ user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
+ holder.icon_state = "exoskeleton4"
+ else
+ user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
+ holder.icon_state = "exoskeleton2"
+ if(8)
if(diff==FORWARD)
user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
- holder.icon_state = ""
+ holder.icon_state = "exoskeleton5"
else
user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil(get_turf(holder))
coil.amount = 4
- holder.icon_state = ""
- if(9)
- if(diff==FORWARD)
- user.visible_message("[user] install [holder] electrical systems", "You install [holder] electrical systems.")
- holder.icon_state = ""
- else
- user.visible_message("[user] unfastens [holder] wiring", "You unfasten [holder] wiring systems.")
- holder.icon_state = ""
- if(8)
+ holder.icon_state = "exoskeleton3"
+ if(7)
if(diff==FORWARD)
user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
del used_atom
- holder.icon_state = ""
+ holder.icon_state = "exoskeleton7"
else
user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
- holder.icon_state = ""
- if(7)
+ holder.icon_state = "exoskeleton5"
+ if(6)
if(diff==FORWARD)
user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
- holder.icon_state = ""
+ holder.icon_state = "exoskeleton8"
else
user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
new /obj/item/weapon/circuitboard/mecha/ripley/main(get_turf(holder))
- holder.icon_state = ""
- if(6)
- if(diff==FORWARD)
- user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
- holder.icon_state = ""
- else
- user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
- holder.icon_state = ""
+ holder.icon_state = "exoskeleton6"
if(5)
if(diff==FORWARD)
user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
- holder.icon_state = ""
+ holder.icon_state = "exoskeleton10"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder))
MS.amount = 5
- holder.icon_state = ""
+ holder.icon_state = "exoskeleton8"
if(4)
if(diff==FORWARD)
user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
- holder.icon_state = ""
+ holder.icon_state = "exoskeleton11"
else
user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
- holder.icon_state = ""
+ holder.icon_state = "exoskeleton9"
if(3)
if(diff==FORWARD)
user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].")
- holder.icon_state = ""
+ holder.icon_state = "exoskeleton12"
else
user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
- holder.icon_state = ""
+ holder.icon_state = "exoskeleton10"
if(2)
if(diff==FORWARD)
user.visible_message("[user] secures armor layer.", "You secure the reinforced armor layer.")
- holder.icon_state = ""
+ holder.icon_state = "exoskeleton13"
else
user.visible_message("[user] pries the armor layer from [holder].", "You prie the armor layer from [holder].")
var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder))
MS.amount = 5
- holder.icon_state = ""
+ holder.icon_state = "exoskeleton11"
if(1)
if(diff==FORWARD)
user.visible_message("[user] welds the armor layer to [holder].", "You weld the armor layer to [holder].")
else
user.visible_message("[user] unfastens the armor layer.", "You unfasten the armor layer.")
- holder.icon_state = ""
+ holder.icon_state = "exoskeleton12"
return 1
spawn_result()
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index 101347a5..e3eb1a5a 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -397,9 +397,10 @@
///////// Exoskeleton
-
/obj/item/mecha_parts/chassis/exoskeleton
name = "Exoskeleton Chassis"
+ icon = 'icons/mecha/mech_construction.dmi'
+ icon_state = "exoskeleton0"
New()
..()
@@ -407,14 +408,16 @@
/obj/item/mecha_parts/part/exoskeletonarmor
name="Exoskeleton Armor"
- icon_state = ""
+ icon = 'icons/obj/clothing/suits.dmi'
+ icon_state = "riot"
construction_time = 120
construction_cost = list("metal"=30000)
origin_tech = "programming=3;materials=2"
/obj/item/mecha_parts/part/hydraulicspack
name="Exoskeleton Hydraulics Pack"
- icon_state = ""
+ icon = 'icons/obj/device.dmi'
+ icon_state = "modkit"
construction_time = 90
construction_cost = list("metal"=20000,"glass"=6000)
origin_tech = "programming=3;materials=2;engineering=2"
@@ -422,7 +425,8 @@
/obj/item/mecha_parts/part/electricalpack
name="Exoskeleton Power Generator Pack"
desc="Contains power unit and processing core for modifications."
- icon_state = ""
+ icon = 'icons/obj/device.dmi'
+ icon_state = "modkit"
origin_tech = "programming=3;materials=2;engineering=2"
construction_time = 90
construction_cost = list("metal"=25000)
@@ -448,7 +452,7 @@
exoskeleton/main
name = "Exoskeleton Circuit Board"
- icon_state = "" // put something here.
+ icon_state = "mainboard" // put something here.
ripley
origin_tech = "programming=3"
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index ae039b4d..fe0caee1 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -217,4 +217,8 @@
var/part = pick(parts)
welder_salvage += part
parts -= part
- return
\ No newline at end of file
+ return
+
+/obj/effect/decal/mecha_wreckage/exoskeleton
+ name = "Useless Exoskeleton"
+ icon_state = "exosuit-broken"
\ No newline at end of file
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 8612e530..1c23f9b9 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -115,6 +115,9 @@ var/global/normal_ooc_colour = "#002eb8"
/* if(!ooc_allowed)
src << "\red OOC is globally muted"
return */
+ if(!looc_allowed)
+ src << "\red LOOC is muted."
+ return
if(!dooc_allowed && (mob.stat == DEAD))
usr << "\red OOC for dead mobs has been turned off."
return
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index 09dc02eb..cad74466 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -48,11 +48,14 @@
var/msg = ""
var/modmsg = ""
+ var/custommsg = ""
var/num_mods_online = 0
var/num_admins_online = 0
+ var/num_custom_online = 0
+
if(holder)
for(var/client/C in admins)
- if(R_ADMIN & C.holder.rights || !(R_MOD & C.holder.rights))
+ if(R_ADMIN & C.holder.rights)
msg += "\t[C] is a [C.holder.rank]"
if(C.holder.fakekey)
@@ -70,7 +73,7 @@
msg += "\n"
num_admins_online++
- else
+ else if(R_MOD & C.holder.rights)
modmsg += "\t[C] is a [C.holder.rank]"
if(isobserver(C.mob))
@@ -85,15 +88,33 @@
modmsg += "\n"
num_mods_online++
+ else
+ custommsg += "\t[C] is a [C.holder.rank]"
+
+ if(isobserver(C.mob))
+ custommsg += " - Observing"
+ else if(istype(C.mob,/mob/new_player))
+ custommsg += " - Lobby"
+ else
+ custommsg += " - Playing"
+
+ if(C.is_afk())
+ custommsg += " (AFK)"
+ custommsg += "\n"
+ num_custom_online++
+
else
for(var/client/C in admins)
- if(R_ADMIN & C.holder.rights || !(R_MOD & C.holder.rights))
+ if(R_ADMIN & C.holder.rights)
if(!C.holder.fakekey)
msg += "\t[C] is a [C.holder.rank]\n"
num_admins_online++
- else
+ else if(R_MOD & C.holder.rights)
modmsg += "\t[C] is a [C.holder.rank]\n"
num_mods_online++
+ else
+ custommsg += "\t[C] is a [C.holder.rank]\n"
+ num_custom_online++
- msg = "Current Admins ([num_admins_online]):\n" + msg + "\n Current Moderators([num_mods_online]):\n" + modmsg
+ msg = "Current Admins ([num_admins_online]):\n" + msg + "\n Current Moderators([num_mods_online]):\n" + modmsg + "\n Current Custom Ranks([num_custom_online]):\n" + custommsg
src << msg
\ No newline at end of file
diff --git a/code/global.dm b/code/global.dm
index b3d3739f..1bb18ada 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -92,6 +92,7 @@ var/datum/engine_eject/engine_eject_control = null
var/host = null
var/aliens_allowed = 0
var/ooc_allowed = 1
+var/looc_allowed = 1
var/dsay_allowed = 1
var/dooc_allowed = 1
var/traitor_scaling = 1
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 86fa0f52..8dbaf20b 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -726,6 +726,21 @@ var/global/floorIsLava = 0
message_admins("[key_name_admin(usr)] toggled OOC.", 1)
feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/admins/proc/togglelooc()
+ set category = "Server"
+ set desc="Globally Toggles LOOC"
+ set name="Toggle LOOC"
+ looc_allowed = !( looc_allowed )
+ if (looc_allowed)
+ world << "The LOOC channel has been globally enabled!"
+ else
+ world << "The LOOC channel has been globally disabled!"
+ log_admin("[key_name(usr)] toggled LOOC.")
+ message_admins("[key_name_admin(usr)] toggled LOOC.", 1)
+ feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+
+
/datum/admins/proc/toggledsay()
set category = "Server"
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index abf68982..2247d315 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -55,6 +55,7 @@ var/list/admin_verbs_admin = list(
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
/client/proc/secrets,
/datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/
+ /datum/admins/proc/togglelooc,
/datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/
/datum/admins/proc/toggledsay, /*toggles dsay on/off for everyone*/
/client/proc/game_panel, /*game panel, allows to change game-mode etc*/
@@ -104,6 +105,7 @@ var/list/admin_verbs_fun = list(
/client/proc/editappear
)
var/list/admin_verbs_dev = list(
+ /client/proc/togglebuildmodeself,
/datum/admins/proc/restart,
/datum/admins/proc/delay,
/client/proc/giveruntimelog,
@@ -260,6 +262,8 @@ var/list/admin_verbs_hideable = list(
/proc/release
)
var/list/admin_verbs_mod = list(
+ /client/proc/cmd_admin_wind,
+ /client/proc/cmd_admin_unwind,
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game.*/
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index e2a32d51..daa49123 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -718,6 +718,15 @@ datum/design/honker_targ
materials = list("$glass" = 2000, "sacid" = 20)
build_path = "/obj/item/weapon/circuitboard/mecha/honker/targeting"
+datum/design/exoskeleton
+ name = "Circuit Design (\"Exoskeleton\" Control Module)"
+ desc = "Allows for the construction of a \"Exoskeleton\" Control Module."
+ id = "exoskeleton"
+ req_tech = list("programming" = 4, "combat" = 2)
+ build_type = IMPRINTER
+ materials = list("$glass" = 2000, "sacid" = 20)
+ build_path = "/obj/item/weapon/circuitboard/mecha/exoskeleton/main"
+
////////////////////////////////////////
/////////// Mecha Equpment /////////////
////////////////////////////////////////
diff --git a/icons/mecha/mech_construction.dmi b/icons/mecha/mech_construction.dmi
index 9d86f97b..5c817a9e 100644
Binary files a/icons/mecha/mech_construction.dmi and b/icons/mecha/mech_construction.dmi differ
diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi
index 26f17751..13445166 100644
Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ