diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 54cedf46ab1..f80d1358e17 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1480,7 +1480,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
someone saves them or they manage to crawl out. Be sure not to ram into any walls or vending machines, as the springloaded seats \
are very sensetive. Now with our included lube defense mechanism which will protect you against any angry shitcurity!"
item = /obj/vehicle/sealed/car/clowncar
- cost = 18
+ cost = 15
restricted_roles = list("Clown")
// Pointless
diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm
index 510242b9dbd..9e9b41bd80c 100644
--- a/code/modules/vehicles/cars/car.dm
+++ b/code/modules/vehicles/cars/car.dm
@@ -16,10 +16,10 @@
/obj/vehicle/sealed/car/MouseDrop_T(atom/dropping, mob/M)
if(!M.canmove || M.stat || M.restrained())
return FALSE
- if(ismob(dropping) && M != dropping)
- var/mob/D = dropping
- M.visible_message("[M] starts forcing [D] into [src]!")
- mob_try_forced_enter(M, D)
+ if(isliving(dropping) && M != dropping)
+ var/mob/living/L = dropping
+ L.visible_message("[M] starts forcing [L] into [src]!")
+ mob_try_forced_enter(M, L)
return ..()
/obj/vehicle/sealed/car/mob_try_exit(mob/M, mob/user, silent = FALSE)
@@ -39,10 +39,20 @@
last_enginesound_time = world.time
playsound(src, engine_sound, 100, TRUE)
+/obj/vehicle/sealed/car/attacked_by(obj/item/I, mob/living/user)
+ if(!I.force)
+ return
+ if(occupants[user])
+ to_chat(user, "Your attack bounces off of the car's padded interior.")
+ return
+ return ..()
+
/obj/vehicle/sealed/car/attack_hand(mob/living/user)
. = ..()
if(!(car_traits & CAN_KIDNAP))
return
+ if(occupants[user])
+ return
to_chat(user, "You start opening [src]'s trunk.")
if(do_after(user, 30))
if(return_amount_of_controllers_with_flag(VEHICLE_CONTROL_KIDNAPPED))
diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm
index ceafc64320b..3485c0f378e 100644
--- a/code/modules/vehicles/cars/clowncar.dm
+++ b/code/modules/vehicles/cars/clowncar.dm
@@ -2,7 +2,7 @@
name = "clown car"
desc = "How someone could even fit in there is beyond me."
icon_state = "clowncar"
- max_integrity = 500
+ max_integrity = 150
armor = list("melee" = 70, "bullet" = 40, "laser" = 40, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
enter_delay = 20
max_occupants = 50
@@ -10,6 +10,9 @@
car_traits = CAN_KIDNAP
key_type = /obj/item/bikehorn
key_type_exact = FALSE
+ var/droppingoil = FALSE
+ var/RTDcooldown = 150
+ var/lastRTDtime = 0
/obj/vehicle/sealed/car/clowncar/generate_actions()
. = ..()
@@ -20,7 +23,7 @@
var/mob/living/carbon/human/H = M
if(H.mind && H.mind.assigned_role == "Clown") //Ensures only clowns can drive the car. (Including more at once)
add_control_flags(M, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_PERMISSION)
- return
+ return
add_control_flags(M, VEHICLE_CONTROL_KIDNAPPED)
/obj/vehicle/sealed/car/clowncar/mob_forced_enter(mob/M, silent = FALSE)
@@ -33,14 +36,25 @@
visible_message("[src] spews out a ton of space lube!")
new /obj/effect/particle_effect/foam(loc) //YEET
-/obj/vehicle/sealed/car/clowncar/Bump(atom/movable/M)
- ..()
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- C.Knockdown(50)
- C.visible_message("[src] rams into [C] and sucks him up!") //fuck off shezza this isn't ERP.
- mob_forced_enter(C)
+/obj/vehicle/sealed/car/clowncar/attacked_by(obj/item/I, mob/living/user)
+ . = ..()
+ if(istype(I, /obj/item/reagent_containers/food/snacks/grown/banana))
+ var/obj/item/reagent_containers/food/snacks/grown/banana/banana = I
+ obj_integrity += min(banana.seed.potency, max_integrity-obj_integrity)
+ to_chat(user, "You use the [banana] to repair the [src]!")
+ qdel(banana)
+/obj/vehicle/sealed/car/clowncar/Bump(atom/movable/M)
+ . = ..()
+ if(isliving(M))
+ if(ismegafauna(M))
+ return
+ var/mob/living/L = M
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ C.Knockdown(40) //I play to make sprites go horizontal
+ L.visible_message("[src] rams into [L] and sucks him up!") //fuck off shezza this isn't ERP.
+ mob_forced_enter(L)
playsound(src, pick('sound/vehicles/clowncar_ram1.ogg', 'sound/vehicles/clowncar_ram2.ogg', 'sound/vehicles/clowncar_ram3.ogg'), 75)
else if(istype(M, /turf/closed))
visible_message("[src] rams into [M] and crashes!")
@@ -48,6 +62,69 @@
playsound(src, 'sound/vehicles/clowncar_crashpins.ogg', 75)
DumpMobs(TRUE)
-/obj/vehicle/sealed/car/clowncar/deconstruct(disassembled = TRUE)
- . = ..()
+/obj/vehicle/sealed/car/clowncar/emag_act(mob/user)
+ if(obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ to_chat(user, "You scramble the clowncar child safety lock and a panel with 6 colorful buttons appears!")
+ initialize_controller_action_type(/datum/action/vehicle/sealed/RollTheDice, VEHICLE_CONTROL_DRIVE)
+
+/obj/vehicle/sealed/car/clowncar/Destroy()
playsound(src, 'sound/vehicles/clowncar_fart.ogg', 100)
+ return ..()
+
+/obj/vehicle/sealed/car/clowncar/after_move(direction)
+ . = ..()
+ if(droppingoil)
+ new /obj/effect/decal/cleanable/oil/slippery(loc)
+
+/obj/vehicle/sealed/car/clowncar/proc/RollTheDice(mob/user)
+ if(world.time - lastRTDtime < RTDcooldown)
+ to_chat(user, "The button panel is currently recharging.")
+ return
+ lastRTDtime = world.time
+ var/randomnum = rand(1,6)
+ switch(randomnum)
+ if(1)
+ visible_message("[user] has pressed one of the colorful buttons on [src] and a special banana peel drops out of it.")
+ new /obj/item/grown/bananapeel/specialpeel(loc)
+ if(2)
+ visible_message("[user] has pressed one of the colorful buttons on [src] and unknown chemicals flood out of it.")
+ var/datum/reagents/R = new/datum/reagents(300)
+ R.my_atom = src
+ R.add_reagent(get_random_reagent_id(), 100)
+ var/datum/effect_system/foam_spread/foam = new
+ foam.set_up(200, loc, R)
+ foam.start()
+ if(3)
+ visible_message("[user] has pressed one of the colorful buttons on [src] and the clown car turns on its singularity disguise system.")
+ icon = 'icons/obj/singularity.dmi'
+ icon_state = "singularity_s1"
+ addtimer(CALLBACK(src, .proc/ResetIcon), 100)
+ if(4)
+ visible_message("[user] has pressed one of the colorful buttons on [src] and the clown car spews out a cloud of laughing gas.")
+ var/datum/reagents/R = new/datum/reagents(300)
+ R.my_atom = src
+ R.add_reagent("superlaughter", 50)
+ var/datum/effect_system/smoke_spread/chem/smoke = new()
+ smoke.set_up(R, 4)
+ smoke.attach(src)
+ smoke.start()
+ if(5)
+ visible_message("[user] has pressed one of the colorful buttons on [src] and the clown car starts dropping an oil trail.")
+ droppingoil = TRUE
+ addtimer(CALLBACK(src, .proc/StopDroppingOil), 30)
+ if(6)
+ visible_message("[user] has pressed one of the colorful buttons on [src] and the clown car lets out a comedic toot.")
+ playsound(src, 'sound/vehicles/clowncar_fart.ogg', 100)
+ for(var/mob/living/L in orange(loc, 6))
+ L.emote("laughs")
+ for(var/mob/living/L in occupants)
+ L.emote("laughs")
+
+/obj/vehicle/sealed/car/clowncar/proc/ResetIcon()
+ icon = initial(icon)
+ icon_state = initial(icon_state)
+
+/obj/vehicle/sealed/car/clowncar/proc/StopDroppingOil()
+ droppingoil = FALSE
diff --git a/code/modules/vehicles/entered.dm b/code/modules/vehicles/entered.dm
index f25de2d89fc..30ae49ecd28 100644
--- a/code/modules/vehicles/entered.dm
+++ b/code/modules/vehicles/entered.dm
@@ -83,25 +83,26 @@
user.put_in_hands(inserted_key)
inserted_key = null
-/obj/vehicle/sealed/deconstruct(disassembled = TRUE)
- . = ..()
+/obj/vehicle/sealed/Destroy()
DumpMobs()
explosion(loc, 0, 1, 2, 3, 0)
+ return ..()
/obj/vehicle/sealed/proc/DumpMobs(randomstep = TRUE)
for(var/i in occupants)
+ mob_exit(i, null, randomstep)
if(iscarbon(i))
var/mob/living/carbon/Carbon = i
- mob_exit(Carbon, null, randomstep)
Carbon.Knockdown(40)
/obj/vehicle/sealed/proc/DumpSpecificMobs(flag, randomstep = TRUE)
for(var/i in occupants)
- if((occupants[i] & flag) && iscarbon(i))
- var/mob/living/carbon/C = i
- mob_exit(C, null, randomstep)
- C.Knockdown(40)
-
-
+ if((occupants[i] & flag))
+ mob_exit(i, null, randomstep)
+ if(iscarbon(i))
+ var/mob/living/carbon/C = i
+ C.Knockdown(40)
+
+
/obj/vehicle/sealed/AllowDrop()
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/vehicles/vehicle_actions.dm b/code/modules/vehicles/vehicle_actions.dm
index 82d64de41d3..8c0e76e06a4 100644
--- a/code/modules/vehicles/vehicle_actions.dm
+++ b/code/modules/vehicles/vehicle_actions.dm
@@ -153,3 +153,14 @@
/datum/action/vehicle/sealed/DumpKidnappedMobs/Trigger()
vehicle_entered_target.visible_message("[vehicle_entered_target] starts dumping the people inside of it.")
vehicle_entered_target.DumpSpecificMobs(VEHICLE_CONTROL_KIDNAPPED)
+
+
+/datum/action/vehicle/sealed/RollTheDice
+ name = "Press a colorful button"
+ desc = "Press one of those colorful buttons on your display panel!."
+ button_icon_state = "car_rtd"
+
+/datum/action/vehicle/sealed/RollTheDice/Trigger()
+ if(istype(vehicle_entered_target, /obj/vehicle/sealed/car/clowncar))
+ var/obj/vehicle/sealed/car/clowncar/C = vehicle_entered_target
+ C.RollTheDice(owner)
diff --git a/icons/mob/actions/actions_vehicle.dmi b/icons/mob/actions/actions_vehicle.dmi
index c8044ec51f9..cee683c60d8 100644
Binary files a/icons/mob/actions/actions_vehicle.dmi and b/icons/mob/actions/actions_vehicle.dmi differ