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