diff --git a/code/datums/action.dm b/code/datums/action.dm index 8677b36b556..c95ee1e4086 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -215,8 +215,17 @@ /datum/action/item_action/toggle_helmet name = "Toggle Helmet" -/datum/action/item_action/jetpack_mode - name = "Jetpack Mode" +/datum/action/item_action/toggle_jetpack + name = "Toggle Jetpack" + +/datum/action/item_action/jetpack_stabilization + name = "Toggle Jetpack Stabilization" + +/datum/action/item_action/jetpack_stabilization/IsAvailable() + var/obj/item/weapon/tank/jetpack/J = target + if(!istype(J) || !J.on) + return 0 + return ..() /datum/action/item_action/hands_free check_flags = AB_CHECK_CONSCIOUS diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 4728e0ad868..85add856f66 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -5,10 +5,10 @@ item_state = "jetpack" w_class = 4 distribute_pressure = ONE_ATMOSPHERE * O2STANDARD - actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/jetpack_mode) + actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) var/gas_type = "o2" var/on = FALSE - var/turbo = FALSE + var/stabilizers = FALSE var/datum/effect_system/trail_follow/ion/ion_trail /obj/item/weapon/tank/jetpack/New() @@ -20,8 +20,12 @@ ion_trail.set_up(src) /obj/item/weapon/tank/jetpack/ui_action_click(mob/user, actiontype) - if(actiontype == /datum/action/item_action/jetpack_mode) + if(actiontype == /datum/action/item_action/toggle_jetpack) cycle(user) + else if(actiontype == /datum/action/item_action/jetpack_stabilization) + if(on) + stabilizers = !stabilizers + user << "You turn the jetpack stabilization [stabilizers ? "on" : "off"]." else toggle_internals(user) @@ -32,14 +36,10 @@ if(!on) turn_on() - user << "You turn the thrusters on." - else if(!turbo) - turbo = TRUE - user << "You engage turbo mode." + user << "You turn the jetpack on." else turn_off() - turbo = FALSE - user << "You turn jetpack off." + user << "You turn the jetpack off." for(var/X in actions) var/datum/action/A = X A.UpdateButtonIcon() @@ -52,6 +52,7 @@ /obj/item/weapon/tank/jetpack/proc/turn_off() on = FALSE + stabilizers = FALSE icon_state = initial(icon_state) ion_trail.stop() @@ -114,7 +115,7 @@ desc = "A device that will use your internals tank as a gas source for propulsion." icon_state = "jetpack-void" item_state = "jetpack-void" - actions_types = list(/datum/action/item_action/jetpack_mode) + actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) var/obj/item/weapon/tank/internals/tank = null /obj/item/weapon/tank/jetpack/suit/New() @@ -172,4 +173,4 @@ if(!istype(J) && istype(wear_suit, /obj/item/clothing/suit/space/hardsuit)) var/obj/item/clothing/suit/space/hardsuit/C = wear_suit J = C.jetpack - return J \ No newline at end of file + return J diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index d556b547fca..d079a26f178 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -363,13 +363,6 @@ return "trails_1" return "trails_2" -var/const/NO_SLIP_WHEN_WALKING = 1 -var/const/SLIDE = 2 -var/const/GALOSHES_DONT_HELP = 4 -/mob/living/carbon/slip(s_amount, w_amount, obj/O, lube) - add_logs(src,, "slipped",, "on [O ? O.name : "floor"]") - return loc.handle_slip(src, s_amount, w_amount, O, lube) - /mob/living/carbon/fall(forced) loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm new file mode 100644 index 00000000000..cd52170662e --- /dev/null +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -0,0 +1,40 @@ +/mob/living/carbon/movement_delay() + . = ..() + if(legcuffed) + . += legcuffed.slowdown + + var/obj/item/organ/internal/cyberimp/chest/thrusters/J = getorganslot("thrusters") + if(istype(J) && J.on) + . -= 2 + + +var/const/NO_SLIP_WHEN_WALKING = 1 +var/const/SLIDE = 2 +var/const/GALOSHES_DONT_HELP = 4 + +/mob/living/carbon/slip(s_amount, w_amount, obj/O, lube) + add_logs(src,, "slipped",, "on [O ? O.name : "floor"]") + return loc.handle_slip(src, s_amount, w_amount, O, lube) + + +/mob/living/carbon/Process_Spacemove(movement_dir = 0) + if(..()) + return 1 + if(!isturf(loc)) + return 0 + + // Do we have a jetpack implant (and is it on)? + var/obj/item/organ/internal/cyberimp/chest/thrusters/J = getorganslot("thrusters") + if(istype(J) && movement_dir && J.allow_thrust(0.01)) + return 1 + + +/mob/living/carbon/Move(NewLoc, direct) + . = ..() + if(.) + if(src.nutrition && src.stat != 2) + src.nutrition -= HUNGER_FACTOR/10 + if(src.m_intent == "run") + src.nutrition -= HUNGER_FACTOR/10 + if((src.disabilities & FAT) && src.m_intent == "run" && src.bodytemperature <= 360) + src.bodytemperature += 2 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 4f65ede2160..0fefb46d227 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -777,14 +777,14 @@ if(!(H.status_flags & IGNORESLOWDOWN)) if(!has_gravity(H)) - // If there's no gravity we have the option of sanic speed. + // If there's no gravity we have the sanic speed of jetpack. var/obj/item/weapon/tank/jetpack/J = H.back var/obj/item/clothing/suit/space/hardsuit/C = H.wear_suit if(!istype(J) && istype(C)) J = C.jetpack - if(istype(J) && J.turbo && J.allow_thrust(0.01, H)) - . -= 2 // Turbo mode. Gotta go fast. + if(istype(J) && J.allow_thrust(0.01, H)) + . -= 2 else var/health_deficiency = (100 - H.health + H.staminaloss) if(health_deficiency >= 40) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 028bc09f8ae..9ba09d72318 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -231,6 +231,17 @@ build_path = /obj/item/organ/internal/cyberimp/chest/reviver category = list("Misc", "Medical Designs") +/datum/design/cyberimp_thrusters + name = "Thrusters set implant" + desc = "This implant will allow you to use gas from environment or your internals for propulsion in zero-gravity areas." + id = "ci-thrusters" + req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 4, "engineering" = 5) + build_type = PROTOLATHE | MECHFAB + construction_time = 80 + materials = list(MAT_METAL = 4000, MAT_GLASS = 2000, MAT_SILVER = 1000, MAT_DIAMOND = 1000) + build_path = /obj/item/organ/internal/cyberimp/chest/thrusters + category = list("Misc", "Medical Designs") + ///////////////////////////////////////// ////////////Regular Implants///////////// diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 916051d133c..486f5f4536b 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -103,4 +103,94 @@ spawn(600 / severity) H.heart_attack = 0 if(H.stat == CONSCIOUS) - H << "You feel your heart beating again!" \ No newline at end of file + H << "You feel your heart beating again!" + + + + +/obj/item/organ/internal/cyberimp/chest/thrusters + name = "implantable thrusters set" + desc = "An implantable set of thruster ports. They use the gas from environment or subject's internals for propulsion in zero-gravity areas. \ + Unlike regular jetpack, this device has no stablilzation system." + slot = "thrusters" + icon_state = "imp_jetpack" + origin_tech = "materials=6;programming=4;magnets=3;biotech=4;engineering=4" + implant_overlay = null + implant_color = null + actions_types = list(/datum/action/item_action/organ_action/toggle) + w_class = 3 + var/on = 0 + var/datum/effect_system/trail_follow/ion/ion_trail + +/obj/item/organ/internal/cyberimp/chest/thrusters/Insert(mob/living/carbon/M, special = 0) + ..() + if(!ion_trail) + ion_trail = new + ion_trail.set_up(M) + +/obj/item/organ/internal/cyberimp/chest/thrusters/Remove(mob/living/carbon/M, special = 0) + if(on) + toggle(silent=1) + ..() + +/obj/item/organ/internal/cyberimp/chest/thrusters/ui_action_click() + toggle() + +/obj/item/organ/internal/cyberimp/chest/thrusters/proc/toggle(silent=0) + if(!on) + if(crit_fail) + if(!silent) + owner << "Your thrusters set seems to be broken!" + return 0 + on = 1 + if(allow_thrust(0.01)) + ion_trail.start() + if(!silent) + owner << "You turn your thrusters set on." + else + ion_trail.stop() + if(!silent) + owner << "You turn your thrusters set off." + on = 0 + update_icon() + +/obj/item/organ/internal/cyberimp/chest/thrusters/update_icon() + if(on) + icon_state = "imp_jetpack-on" + else + icon_state = "imp_jetpack" + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/organ/internal/cyberimp/chest/thrusters/proc/allow_thrust(num) + if(!on || !owner) + return 0 + + var/turf/T = get_turf(owner) + if(!T) // No more runtimes from being stuck in nullspace. + return 0 + + // Priority 1: use air from environment. + var/datum/gas_mixture/environment = T.return_air() + if(environment && environment.return_pressure() > 30) + return 1 + + // Priority 2: use plasma from internal plasma storage. + // (just in case someone would ever use this implant system to make cyber-alien ops with jetpacks and taser arms) + if(owner.getPlasma() >= num*100) + owner.adjustPlasma(-num*100) + return 1 + + // Priority 3: use internals tank. + var/obj/item/weapon/tank/I = owner.internal + if(I && I.air_contents && I.air_contents.total_moles() > num) + var/datum/gas_mixture/removed = I.air_contents.remove(num) + if(removed.total_moles() > 0.005) + T.assume_air(removed) + return 1 + else + T.assume_air(removed) + + toggle(silent=1) + return 0 \ No newline at end of file diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 9252dbf89f6..8267d88bdb4 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/tgstation.dme b/tgstation.dme index d132120802b..cf7d9eb98f3 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1194,6 +1194,7 @@ #include "code\modules\mob\living\carbon\carbon.dm" #include "code\modules\mob\living\carbon\carbon_defense.dm" #include "code\modules\mob\living\carbon\carbon_defines.dm" +#include "code\modules\mob\living\carbon\carbon_movement.dm" #include "code\modules\mob\living\carbon\death.dm" #include "code\modules\mob\living\carbon\emote.dm" #include "code\modules\mob\living\carbon\examine.dm"