diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 20747361d3..d14c760d85 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -11,6 +11,9 @@ mob/proc/airflow_stun() if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN)) src << "You stay upright as the air rushes past you." return 0 + if(buckled) + src << "Air suddenly rushes past you!" + return 0 if(!lying) src << "The sudden rush of air knocks you over!" Weaken(5) diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm index 9bff0fbbe9..b21c88245a 100644 --- a/code/modules/mob/animations.dm +++ b/code/modules/mob/animations.dm @@ -108,7 +108,10 @@ note dizziness decrements automatically in the mob's Life() proc. return /mob/proc/make_floating(var/n) - + if(buckled) + if(is_floating) + stop_floating() + return floatiness = n if(floatiness && !is_floating) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 9e89abf4ca..837a0f93fc 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -457,7 +457,7 @@ return 0 //Check to see if we slipped - if(prob(Process_Spaceslipping(5))) + if(prob(Process_Spaceslipping(5)) && !buckled) src << "\blue You slipped!" src.inertia_dir = src.last_move step(src, src.inertia_dir) diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm new file mode 100644 index 0000000000..8136b06353 --- /dev/null +++ b/code/modules/vehicles/bike.dm @@ -0,0 +1,142 @@ +/obj/vehicle/bike/ + name = "space-bike" + desc = "Space wheelies! Woo! " + icon = 'icons/obj/bike.dmi' + icon_state = "bike_off" + dir = SOUTH + + load_item_visible = 1 + mob_offset_y = 5 + health = 100 + maxhealth = 100 + + fire_dam_coeff = 0.6 + brute_dam_coeff = 0.5 + var/protection_percent = 60 + + var/land_speed = 10 //if 0 it can't go on turf + var/space_speed = 1 + var/bike_icon = "bike" + + var/datum/effect/effect/system/ion_trail_follow/ion + var/kickstand = 1 + +/obj/vehicle/bike/New() + ..() + ion = new /datum/effect/effect/system/ion_trail_follow() + ion.set_up(src) + turn_off() + overlays += image('icons/obj/bike.dmi', "[icon_state]_off_overlay", MOB_LAYER + 1) + icon_state = "[bike_icon]_off" + +/obj/vehicle/bike/verb/toggle() + set name = "Toggle Engine" + set category = "Vehicle" + set src in view(0) + + if(usr.incapacitated()) return + + if(!on) + turn_on() + src.visible_message("\The [src] rumbles to life.", "You hear something rumble deeply.") + else + turn_off() + src.visible_message("\The [src] putters before turning off.", "You hear something putter slowly.") + +/obj/vehicle/bike/verb/kickstand() + set name = "Toggle Kickstand" + set category = "Vehicle" + set src in view(0) + + if(usr.incapacitated()) return + + if(kickstand) + src.visible_message("You put up \the [src]'s kickstand.") + else + if(istype(src.loc,/turf/space)) + usr << " You don't think kickstands work in space..." + return + src.visible_message("You put down \the [src]'s kickstand.") + if(pulledby) + pulledby.stop_pulling() + + kickstand = !kickstand + anchored = (kickstand || on) + +/obj/vehicle/bike/load(var/atom/movable/C) + var/mob/living/M = C + if(!istype(C)) return 0 + if(M.buckled || M.restrained() || !Adjacent(M) || !M.Adjacent(src)) + return 0 + return ..(M) + +/obj/vehicle/bike/MouseDrop_T(var/atom/movable/C, mob/user as mob) + if(!load(C)) + user << " You were unable to load \the [C] onto \the [src]." + return + +/obj/vehicle/bike/attack_hand(var/mob/user as mob) + if(user == load) + unload(load) + user << "You unbuckle yourself from \the [src]" + +/obj/vehicle/bike/relaymove(mob/user, direction) + if(user != load || !on) + return + return Move(get_step(src, direction)) + +/obj/vehicle/bike/Move(var/turf/destination) + if(kickstand) return + + + //these things like space, not turf. Dragging shouldn't weigh you down. + if(istype(destination,/turf/space) || pulledby) + if(!space_speed) + return 0 + move_delay = space_speed + else + if(!land_speed) + return 0 + move_delay = land_speed + return ..() + +/obj/vehicle/bike/turn_on() + ion.start() + anchored = 1 + + update_icon() + + if(pulledby) + pulledby.stop_pulling() + ..() +/obj/vehicle/bike/turn_off() + ion.stop() + anchored = kickstand + + update_icon() + + ..() + +/obj/vehicle/bike/bullet_act(var/obj/item/projectile/Proj) + if(buckled_mob && prob(protection_percent)) + buckled_mob.bullet_act(Proj) + return + ..() + +/obj/vehicle/bike/update_icon() + overlays.Cut() + + if(on) + overlays += image('icons/obj/bike.dmi', "[bike_icon]_on_overlay", MOB_LAYER + 1) + icon_state = "[bike_icon]_on" + else + overlays += image('icons/obj/bike.dmi', "[bike_icon]_off_overlay", MOB_LAYER + 1) + icon_state = "[bike_icon]_off" + + ..() + + +/obj/vehicle/bike/Destroy() + qdel(ion) + + ..() \ No newline at end of file diff --git a/icons/obj/bike.dmi b/icons/obj/bike.dmi new file mode 100644 index 0000000000..69aa0ccb4e Binary files /dev/null and b/icons/obj/bike.dmi differ