mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-10 17:52:36 +00:00
* Adds a standalone Civilian Modsuit model, available from robotics (#84806) ## About The Pull Request I talked with Fikou on discord about #84801, and he said that it would be fine to make a standalone suit that is slowdown-free but also not spaceproof. So yeah, that's what this is. The civilian skin for the standard modsuit has been turned into a standalone model. It is similar to the loader modsuit that cargo has, in that it has no slowdown while active but doesn't protect you from space. It also has only a complexity limit of 12 instead of the usual 15, and it has abysmal armor values. It also doesn't protect you from pepper spray and the helmet doesn't allow you to use internals or block you from eating. I tweaked the sprites for it as well, removing the visor from the inhand and mob overlay sprites, to better reflect it's lack of spaceproofing. I also whipped up a quick sprite for the civilian mod plating, based off of the medical mod plating since they have similar color schemes. ## Why It's Good For The Game I'm going to just copy and paste what I said in the last PR, because all of it still applies to this one. There are a lot of really cool modsuit modules that are hampered by the other drawbacks that modsuits have. These drawbacks exist for a good reason; space proof suits should have tradeoffs, especially ones available at the start of the round like modsuits are. But that doesn't really solve the problem with the modules. One of the biggest examples of this problem is the pepper shoulders module that comes on security modsuits. It's a very cool module conceptually, but it tends to have limited usefulness in practice. Out in space, whoever you're fighting is likely wearing a spacesuit of their own, which will make them completely immune to the pepper spray. On the station, the person wearing the suit has to deal with the slowdown from it, which will far outweigh any advantage granted by the pepper shoulders module. Another good example is the medical modules, like the surgical processor, organ thrower/organizer, and thread ripper modules. All of these are great for a medical player trying to perform surgery, but who is going to be doing surgery in a depressurized room? All these modules don't mesh well with the design of modsuits as special spacesuits, and the new civilian model will hopefully give them more room to be used. ## Changelog 🆑 add: Added the civilian modsuit module as a standalone model. It offers no slowdown while activated but does NOT protect you from the void of space. You can print the plating from an exosuit fabricator and build it like a normal modsuit. del: Removed the civilian skin from the standard modsuit, as it is now a standalone model. image: Tweaked the sprites for the civilian modsuit head, both in-hand and on the mob. Also added a civilian mod plating sprite. /🆑 * Adds a standalone Civilian Modsuit model, available from robotics --------- Co-authored-by: GPeckman <21979502+GPeckman@users.noreply.github.com> Co-authored-by: SpaceLoveSs13 <68121607+SpaceLoveSs13@users.noreply.github.com>
310 lines
10 KiB
Plaintext
310 lines
10 KiB
Plaintext
/obj/item/mod/construction
|
|
desc = "A part used in MOD construction."
|
|
icon = 'icons/obj/clothing/modsuit/mod_construction.dmi'
|
|
inhand_icon_state = "rack_parts"
|
|
|
|
/obj/item/mod/construction/helmet
|
|
name = "MOD helmet"
|
|
icon_state = "helmet"
|
|
|
|
/obj/item/mod/construction/helmet/examine(mob/user)
|
|
. = ..()
|
|
. += span_notice("You could insert it into a <b>MOD shell</b>...")
|
|
|
|
/obj/item/mod/construction/chestplate
|
|
name = "MOD chestplate"
|
|
icon_state = "chestplate"
|
|
|
|
/obj/item/mod/construction/chestplate/examine(mob/user)
|
|
. = ..()
|
|
. += span_notice("You could insert it into a <b>MOD shell</b>...")
|
|
|
|
/obj/item/mod/construction/gauntlets
|
|
name = "MOD gauntlets"
|
|
icon_state = "gauntlets"
|
|
|
|
/obj/item/mod/construction/gauntlets/examine(mob/user)
|
|
. = ..()
|
|
. += span_notice("You could insert these into a <b>MOD shell</b>...")
|
|
|
|
/obj/item/mod/construction/boots
|
|
name = "MOD boots"
|
|
icon_state = "boots"
|
|
|
|
/obj/item/mod/construction/boots/examine(mob/user)
|
|
. = ..()
|
|
. += span_notice("You could insert these into a <b>MOD shell</b>...")
|
|
|
|
/obj/item/mod/construction/broken_core
|
|
name = "broken MOD core"
|
|
icon_state = "mod-core"
|
|
desc = "An internal power source for a Modular Outerwear Device. You don't seem to be able to source any power from this one, though."
|
|
|
|
/obj/item/mod/construction/broken_core/examine(mob/user)
|
|
. = ..()
|
|
. += span_notice("You could repair it with a <b>screwdriver</b>...")
|
|
|
|
/obj/item/mod/construction/broken_core/screwdriver_act(mob/living/user, obj/item/tool)
|
|
. = ..()
|
|
balloon_alert(user, "repairing...")
|
|
if(!tool.use_tool(src, user, 5 SECONDS, volume = 30))
|
|
balloon_alert(user, "interrupted!")
|
|
return
|
|
new /obj/item/mod/core/standard(drop_location())
|
|
qdel(src)
|
|
|
|
/obj/item/mod/construction/lavalandcore
|
|
name = "plasma flower"
|
|
icon_state = "plasma-flower"
|
|
desc = "A strange flower from the desolate wastes of lavaland. It pulses with a bright purple glow. \
|
|
Its shape is remarkably similar to that of a MOD core."
|
|
light_system = OVERLAY_LIGHT
|
|
light_color = "#cc00cc"
|
|
light_range = 2.5
|
|
light_power = 1.5
|
|
|
|
/obj/item/mod/construction/lavalandcore/examine(mob/user)
|
|
. = ..()
|
|
. += span_notice("You could probably attach some <b>wires</b> to it...")
|
|
|
|
/obj/item/mod/construction/lavalandcore/attackby(obj/item/weapon, mob/user, params)
|
|
if(!istype(weapon, /obj/item/stack/cable_coil))
|
|
return ..()
|
|
if(!weapon.tool_start_check(user, amount=2))
|
|
return
|
|
balloon_alert(user, "installing wires...")
|
|
if(!weapon.use_tool(src, user, 5 SECONDS, amount = 2, volume = 30))
|
|
balloon_alert(user, "interrupted!")
|
|
return
|
|
new /obj/item/mod/core/plasma/lavaland(drop_location())
|
|
qdel(src)
|
|
|
|
/obj/item/mod/construction/plating
|
|
name = "MOD external plating"
|
|
desc = "External plating used to finish a MOD control unit."
|
|
icon_state = "standard-plating"
|
|
var/datum/mod_theme/theme = /datum/mod_theme
|
|
|
|
/obj/item/mod/construction/plating/Initialize(mapload)
|
|
. = ..()
|
|
var/datum/mod_theme/used_theme = GLOB.mod_themes[theme]
|
|
name = "MOD [used_theme.name] external plating"
|
|
desc = "[desc] [used_theme.desc]"
|
|
icon_state = "[used_theme.default_skin]-plating"
|
|
|
|
/obj/item/mod/construction/plating/civilian
|
|
theme = /datum/mod_theme/civilian
|
|
|
|
/obj/item/mod/construction/plating/engineering
|
|
theme = /datum/mod_theme/engineering
|
|
|
|
/obj/item/mod/construction/plating/atmospheric
|
|
theme = /datum/mod_theme/atmospheric
|
|
|
|
/obj/item/mod/construction/plating/medical
|
|
theme = /datum/mod_theme/medical
|
|
|
|
/obj/item/mod/construction/plating/security
|
|
theme = /datum/mod_theme/security
|
|
|
|
/obj/item/mod/construction/plating/cosmohonk
|
|
theme = /datum/mod_theme/cosmohonk
|
|
|
|
#define START_STEP "start"
|
|
#define CORE_STEP "core"
|
|
#define SCREWED_CORE_STEP "screwed_core"
|
|
#define HELMET_STEP "helmet"
|
|
#define CHESTPLATE_STEP "chestplate"
|
|
#define GAUNTLETS_STEP "gauntlets"
|
|
#define BOOTS_STEP "boots"
|
|
#define WRENCHED_ASSEMBLY_STEP "wrenched_assembly"
|
|
#define SCREWED_ASSEMBLY_STEP "screwed_assembly"
|
|
|
|
/obj/item/mod/construction/shell
|
|
name = "MOD shell"
|
|
icon_state = "mod-construction_start"
|
|
desc = "A MOD shell."
|
|
var/obj/item/core
|
|
var/obj/item/helmet
|
|
var/obj/item/chestplate
|
|
var/obj/item/gauntlets
|
|
var/obj/item/boots
|
|
var/step = START_STEP
|
|
|
|
/obj/item/mod/construction/shell/examine(mob/user)
|
|
. = ..()
|
|
var/display_text
|
|
switch(step)
|
|
if(START_STEP)
|
|
display_text = "It looks like it's missing a <b>MOD core</b>..."
|
|
if(CORE_STEP)
|
|
display_text = "The core seems <b>loose</b>..."
|
|
if(SCREWED_CORE_STEP)
|
|
display_text = "It looks like it's missing a <b>helmet</b>..."
|
|
if(HELMET_STEP)
|
|
display_text = "It looks like it's missing a <b>chestplate</b>..."
|
|
if(CHESTPLATE_STEP)
|
|
display_text = "It looks like it's missing <b>gauntlets</b>..."
|
|
if(GAUNTLETS_STEP)
|
|
display_text = "It looks like it's missing <b>boots</b>..."
|
|
if(BOOTS_STEP)
|
|
display_text = "The assembly seems <b>unsecured</b>..."
|
|
if(WRENCHED_ASSEMBLY_STEP)
|
|
display_text = "The assembly seems <b>loose</b>..."
|
|
if(SCREWED_ASSEMBLY_STEP)
|
|
display_text = "All it's missing is <b>external plating</b>..."
|
|
. += span_notice(display_text)
|
|
|
|
/obj/item/mod/construction/shell/attackby(obj/item/part, mob/user, params)
|
|
. = ..()
|
|
switch(step)
|
|
if(START_STEP)
|
|
if(!istype(part, /obj/item/mod/core))
|
|
return
|
|
if(!user.transferItemToLoc(part, src))
|
|
balloon_alert(user, "core stuck to your hand!")
|
|
return
|
|
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
|
balloon_alert(user, "core inserted")
|
|
core = part
|
|
step = CORE_STEP
|
|
if(CORE_STEP)
|
|
if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct
|
|
if(part.use_tool(src, user, 0, volume=30))
|
|
balloon_alert(user, "core screwed")
|
|
step = SCREWED_CORE_STEP
|
|
else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
|
|
if(part.use_tool(src, user, 0, volume=30))
|
|
core.forceMove(drop_location())
|
|
balloon_alert(user, "core taken out")
|
|
step = START_STEP
|
|
if(SCREWED_CORE_STEP)
|
|
if(istype(part, /obj/item/mod/construction/helmet)) //Construct
|
|
if(!user.transferItemToLoc(part, src))
|
|
balloon_alert(user, "helmet stuck to your hand!")
|
|
return
|
|
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
|
balloon_alert(user, "helmet added")
|
|
helmet = part
|
|
step = HELMET_STEP
|
|
else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Deconstruct
|
|
if(part.use_tool(src, user, 0, volume=30))
|
|
balloon_alert(user, "core unscrewed")
|
|
step = CORE_STEP
|
|
if(HELMET_STEP)
|
|
if(istype(part, /obj/item/mod/construction/chestplate)) //Construct
|
|
if(!user.transferItemToLoc(part, src))
|
|
balloon_alert(user, "chestplate stuck to your hand!")
|
|
return
|
|
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
|
balloon_alert(user, "chestplate added")
|
|
chestplate = part
|
|
step = CHESTPLATE_STEP
|
|
else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
|
|
if(part.use_tool(src, user, 0, volume=30))
|
|
helmet.forceMove(drop_location())
|
|
balloon_alert(user, "helmet removed")
|
|
helmet = null
|
|
step = SCREWED_CORE_STEP
|
|
if(CHESTPLATE_STEP)
|
|
if(istype(part, /obj/item/mod/construction/gauntlets)) //Construct
|
|
if(!user.transferItemToLoc(part, src))
|
|
balloon_alert(user, "gauntlets stuck to your hand!")
|
|
return
|
|
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
|
balloon_alert(user, "gauntlets added")
|
|
gauntlets = part
|
|
step = GAUNTLETS_STEP
|
|
else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
|
|
if(part.use_tool(src, user, 0, volume=30))
|
|
chestplate.forceMove(drop_location())
|
|
balloon_alert(user, "chestplate removed")
|
|
chestplate = null
|
|
step = HELMET_STEP
|
|
if(GAUNTLETS_STEP)
|
|
if(istype(part, /obj/item/mod/construction/boots)) //Construct
|
|
if(!user.transferItemToLoc(part, src))
|
|
balloon_alert(user, "boots added")
|
|
return
|
|
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
|
balloon_alert(user, "fit [part.name]")
|
|
boots = part
|
|
step = BOOTS_STEP
|
|
else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
|
|
if(part.use_tool(src, user, 0, volume=30))
|
|
gauntlets.forceMove(drop_location())
|
|
balloon_alert(user, "gauntlets removed")
|
|
gauntlets = null
|
|
step = CHESTPLATE_STEP
|
|
if(BOOTS_STEP)
|
|
if(part.tool_behaviour == TOOL_WRENCH) //Construct
|
|
if(part.use_tool(src, user, 0, volume=30))
|
|
balloon_alert(user, "assembly secured")
|
|
step = WRENCHED_ASSEMBLY_STEP
|
|
else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
|
|
if(part.use_tool(src, user, 0, volume=30))
|
|
boots.forceMove(drop_location())
|
|
balloon_alert(user, "boots removed")
|
|
boots = null
|
|
step = GAUNTLETS_STEP
|
|
if(WRENCHED_ASSEMBLY_STEP)
|
|
if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct
|
|
if(part.use_tool(src, user, 0, volume=30))
|
|
balloon_alert(user, "assembly screwed")
|
|
step = SCREWED_ASSEMBLY_STEP
|
|
else if(part.tool_behaviour == TOOL_WRENCH) //Deconstruct
|
|
if(part.use_tool(src, user, 0, volume=30))
|
|
balloon_alert(user, "assembly unsecured")
|
|
step = BOOTS_STEP
|
|
if(SCREWED_ASSEMBLY_STEP)
|
|
if(istype(part, /obj/item/mod/construction/plating)) //Construct
|
|
var/obj/item/mod/construction/plating/external_plating = part
|
|
if(!user.transferItemToLoc(part, src))
|
|
return
|
|
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
|
var/obj/item/mod = new /obj/item/mod/control(drop_location(), external_plating.theme, null, core)
|
|
core = null
|
|
qdel(src)
|
|
user.put_in_hands(mod)
|
|
mod.balloon_alert(user, "suit finished")
|
|
else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct
|
|
if(part.use_tool(src, user, 0, volume=30))
|
|
balloon_alert(user, "assembly unscrewed")
|
|
step = SCREWED_ASSEMBLY_STEP
|
|
update_icon_state()
|
|
|
|
/obj/item/mod/construction/shell/update_icon_state()
|
|
. = ..()
|
|
icon_state = "mod-construction_[step]"
|
|
|
|
/obj/item/mod/construction/shell/Destroy()
|
|
QDEL_NULL(core)
|
|
QDEL_NULL(helmet)
|
|
QDEL_NULL(chestplate)
|
|
QDEL_NULL(gauntlets)
|
|
QDEL_NULL(boots)
|
|
return ..()
|
|
|
|
/obj/item/mod/construction/shell/Exited(atom/movable/gone, direction)
|
|
. = ..()
|
|
if(gone == core)
|
|
core = null
|
|
if(gone == helmet)
|
|
helmet = null
|
|
if(gone == chestplate)
|
|
chestplate = null
|
|
if(gone == gauntlets)
|
|
gauntlets = null
|
|
if(gone == boots)
|
|
boots = null
|
|
|
|
#undef START_STEP
|
|
#undef CORE_STEP
|
|
#undef SCREWED_CORE_STEP
|
|
#undef HELMET_STEP
|
|
#undef CHESTPLATE_STEP
|
|
#undef GAUNTLETS_STEP
|
|
#undef BOOTS_STEP
|
|
#undef WRENCHED_ASSEMBLY_STEP
|
|
#undef SCREWED_ASSEMBLY_STEP
|