From f32f2b329fb5949541cd5d9cb05e04a3e85eb330 Mon Sep 17 00:00:00 2001 From: Giacomand Date: Fri, 9 May 2014 00:00:44 +0100 Subject: [PATCH] Mobs will now slowly bop up and down while in zero gravity. Conflicts: code/game/area/areas.dm code/game/turfs/turf.dm code/modules/clothing/shoes/magboots.dm code/modules/mob/living/carbon/human/human_movement.dm code/modules/mob/living/living.dm code/modules/mob/living/living_defines.dm code/modules/mob/mob_movement.dm code/modules/power/gravitygenerator.dm --- code/game/area/areas.dm | 13 +++++++ code/modules/clothing/clothing.dm | 3 ++ code/modules/clothing/shoes/magboots.dm | 6 ++- .../mob/living/carbon/human/human_movement.dm | 9 +++++ code/modules/mob/living/living.dm | 13 +++++++ code/modules/mob/living/living_defines.dm | 1 + code/modules/mob/mob_movement.dm | 21 +++++----- code/modules/power/gravitygenerator.dm | 39 +++++++++---------- 8 files changed, 73 insertions(+), 32 deletions(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 9603638f719..cb137a898b4 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -409,3 +409,16 @@ M << "Gravity!" +/proc/has_gravity(atom/AT, turf/T) + if(!T) + T = get_turf(AT) + var/area/A = get_area(T) + if(istype(T, /turf/space)) // Turf never has gravity + return 0 + else if(A && A.has_gravity) // Areas which always has gravity + return 1 + else + // There's a gravity generator on our z level + if(T && gravity_generators["[T.z]"] && length(gravity_generators["[T.z]"])) + return 1 + return 0 diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 6cceaf55527..03cd5e21b4c 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -186,6 +186,9 @@ BLIND // can't see anything slowdown = SHOES_SLOWDOWN species_restricted = list("exclude","Unathi","Tajaran") +/obj/item/proc/negates_gravity() + return 0 + //Suit /obj/item/clothing/suit icon = 'icons/obj/clothing/suits.dmi' diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index f5ce0d793c4..32deb3bfe40 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -26,6 +26,7 @@ icon_state = "magboots1" user << "You enable the mag-pulse traction system." user.update_inv_shoes() //so our mob-overlays update + user.update_gravity(user.mob_has_gravity()) examine() set src in view() @@ -33,4 +34,7 @@ var/state = "disabled" if(src.flags&NOSLIP) state = "enabled" - usr << "Its mag-pulse traction system appears to be [state]." \ No newline at end of file + usr << "Its mag-pulse traction system appears to be [state]." + +/obj/item/clothing/shoes/magboots/negates_gravity() + return flags & NOSLIP \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index da472d7b4ce..0c9295e9128 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -104,3 +104,12 @@ prob_slip = round(prob_slip) return(prob_slip) + +/mob/living/carbon/human/mob_has_gravity() + . = ..() + if(!.) + if(mob_negates_gravity()) + . = 1 + +/mob/living/carbon/human/mob_negates_gravity() + return shoes && shoes.negates_gravity() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b97d653baa9..e273b8c557d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -705,3 +705,16 @@ CM.drop_from_inventory(CM.legcuffed) CM.legcuffed = null CM.update_inv_legcuffed() + +/mob/living/update_gravity(has_gravity) + if(!ticker) + return + float(!has_gravity) + +/mob/living/proc/float(on) + if(on && !floating) + animate(src, pixel_y = 2, time = 10, loop = -1) + floating = 1 + else if(!on && floating) + animate(src, pixel_y = initial(pixel_y), time = 10) + floating = 0 \ No newline at end of file diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 26758a41d96..317e4695c9c 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -42,3 +42,4 @@ var/specialsauce = 0 //Has this person consumed enough special sauce? IF so they're a ticking time bomb of death. var/implanting = 0 //Used for the mind-slave implant var/silent = null //Can't talk. Value goes down every life proc. + var/floating = 0 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 8d58ebafe04..f912fe59d63 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -424,14 +424,8 @@ if(istype(turf,/turf/space)) continue - if(istype(src,/mob/living/carbon/human/)) // Only humans can wear magboots, so we give them a chance to. - if((istype(turf,/turf/simulated/floor)) && (src.lastarea.has_gravity == 0) && !(istype(src:shoes, /obj/item/clothing/shoes/magboots) && (src:shoes:flags & NOSLIP))) - continue - - - else - if((istype(turf,/turf/simulated/floor)) && (src.lastarea.has_gravity == 0)) // No one else gets a chance. - continue + if(!turf.density && !mob_negates_gravity()) + continue @@ -460,18 +454,22 @@ if(!dense_object) return 0 - - //Check to see if we slipped if(prob(Process_Spaceslipping(5))) src << "\blue You slipped!" src.inertia_dir = src.last_move step(src, src.inertia_dir) return 0 + //If not then we can reset inertia and move inertia_dir = 0 return 1 +/mob/proc/mob_has_gravity(turf/T) + return has_gravity(src, T) + +/mob/proc/mob_negates_gravity() + return 0 /mob/proc/Process_Spaceslipping(var/prob_slip = 5) //Setup slipage @@ -481,3 +479,6 @@ prob_slip = round(prob_slip) return(prob_slip) + +/mob/proc/update_gravity() + return diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 9e494458225..efe29e93d34 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -1,3 +1,4 @@ + // // Gravity Generator // @@ -31,6 +32,9 @@ var/const/GRAV_NEEDS_WRENCH = 3 if(severity == 1) // Very sturdy. set_broken() +/obj/machinery/gravity_generator/blob_act() + set_broken() + /obj/machinery/gravity_generator/meteorhit() return @@ -138,10 +142,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 var/obj/machinery/gravity_generator/part/part = new(T) if(count == 5) // Middle middle = part - if(count <= 3) // Their sprite is the top part of the generator - part.density = 0 - part.layer = MOB_LAYER + 0.1 - part.sprite_number = count + part.sprite_number = count; part.main_part = src parts += part part.update_icon() @@ -289,24 +290,15 @@ var/const/GRAV_NEEDS_WRENCH = 3 alert = 1 investigate_log("was brought online and is now producing gravity for this level.", "gravity") message_admins("The gravity generator was brought online. ([area.name])") - for(var/area/A in world) - if (A.z != 1) continue - A.gravitychange(1,A) else if(gravity_in_level() == 1) alert = 1 investigate_log("was brought offline and there is now no gravity for this level.", "gravity") message_admins("The gravity generator was brought offline with no backup generator. ([area.name])") - for(var/area/A in world) - if (A.z != 1) continue - A.gravitychange(0,A) - update_icon() - update_list() + update_list(alert) src.updateUsrDialog() - if(alert) - shake_everyone() // Charge/Discharge and turn on/off gravity when you reach 0/100 percent. // Also emit radiation and handle the overlays. @@ -325,7 +317,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 charge_count -= 2 if(charge_count % 4 == 0 && prob(75)) // Let them know it is charging/discharging. - playsound(src.loc, 'sound/effects/EMPulse.ogg', 75, 1) + playsound(src.loc, 'sound/effects/EMPulse.ogg', 100, 1) updateDialog() if(prob(25)) // To help stop "Your clothes feel warm" spam. @@ -357,15 +349,19 @@ var/const/GRAV_NEEDS_WRENCH = 3 L.apply_effect(20, IRRADIATE) // Shake everyone on the z level to let them know that gravity was enagaged/disenagaged. -/obj/machinery/gravity_generator/main/proc/shake_everyone() +// Update their gravity floatness +/obj/machinery/gravity_generator/main/proc/check_everyone(var/alert) + if(!ticker) + return var/turf/our_turf = get_turf(src) - for(var/mob/M in player_list) + for(var/mob/M in mob_list) var/turf/their_turf = get_turf(M) - if(M.client && their_turf.z == our_turf.z) + M.update_gravity(M.mob_has_gravity(their_turf)) + if(alert && M.client && their_turf.z == our_turf.z) shake_camera(M, 15, 1) - M.playsound_local(our_turf, 'sound/machines/signal.ogg', 100) + M.playsound_local(our_turf, 'sound/effects/alert.ogg', 100, 1, 0.5) -/obj/machinery/gravity_generator/main/proc/gravity_in_level() +/obj/machinery/gravity_generator/main/proc/gravity_in_level(var/alert) var/turf/T = get_turf(src) if(!T) return 0 @@ -373,7 +369,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 return length(gravity_generators["[T.z]"]) return 0 -/obj/machinery/gravity_generator/main/proc/update_list() +/obj/machinery/gravity_generator/main/proc/update_list(var/alert) var/turf/T = get_turf(src.loc) if(T) if(!gravity_generators["[T.z]"]) @@ -382,6 +378,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 gravity_generators["[T.z]"] |= src else gravity_generators["[T.z]"] -= src + check_everyone(alert) // Misc