/datum/buildmode_mode/tilting
key = "tilt"
/// The thing we're tilting over
var/atom/movable/tilter
var/crush_damage = 25
var/crit_chance = 0
var/datum/tilt_crit/forced_crit
var/weaken_time = 4 SECONDS
var/knockdown_time = 14 SECONDS
var/ignore_gravity = TRUE
var/should_rotate = TRUE
var/rotation_angle
var/rightable = TRUE
var/block_interactions_until_righted = TRUE
/datum/buildmode_mode/tilting/show_help(mob/user)
to_chat(user, "***********************************************************")
to_chat(user, "Left Mouse Button on obj/mob = Select atom to tilt")
to_chat(user, "Right Mouse Button on turf/obj/mob = Tilt selected atom onto target")
to_chat(user, "Right Mouse Button + Alt = Untilt selected atom")
to_chat(user, "Right-click the main action button to customize tilting behavior.")
to_chat(user, "***********************************************************")
/datum/buildmode_mode/tilting/change_settings(mob/user)
crush_damage = input(user, "Crush Damage", "Damage", initial(crush_damage)) as num|null
crit_chance = input(user, "Crit Chance (out of 100)", "Crit chance", 0) as num|null
if(crit_chance > 0)
var/forced_crit_path = input(user, "Force a specific crit?", "Forced Crit", null) as null|anything in GLOB.tilt_crits
if(forced_crit_path)
forced_crit = GLOB.tilt_crits[forced_crit_path]
weaken_time = input(user, "How long to weaken (in seconds)?", "Weaken Time", 4) as num|null
weaken_time = weaken_time SECONDS
knockdown_time = input(user, "How long to knockdown (in seconds)?", "Knockdown Time", 12) as num|null
knockdown_time = knockdown_time SECONDS
ignore_gravity = alert(user, "Ignore gravity?", "Ignore gravity", "Yes", "No") == "Yes"
should_rotate = alert(user, "Should it rotate on falling?", "Should rotate", "Yes", "No") == "Yes"
if(should_rotate)
rotation_angle = input(user, "Which angle to rotate at? (if empty, defaults to 90 degrees in either direction)", "Rotation angle", 0) as num|null
rightable = alert(user, "Should it be rightable with alt-click?", "Rightable", "Yes", "No") == "Yes"
if(rightable)
block_interactions_until_righted = alert(user, "Should it block interactions until righted (by alt-clicking)?", "Block interactions", "Yes", "No") == "Yes"
/datum/buildmode_mode/tilting/handle_click(mob/user, params, atom/movable/object)
var/list/pa = params2list(params)
var/left_click = pa.Find("left")
var/right_click = pa.Find("right")
var/alt_click = pa.Find("alt")
if(left_click)
if(!ismovable(object))
return
tilter = object
to_chat(user, "Selected object '[tilter]' to tilt.")
if(right_click)
if(!tilter)
to_chat(user, "You need to select something to tilt (or untilt) first.")
return
if(tilter.GetComponent(/datum/component/tilted) && alt_click)
tilter.untilt(duration = 0)
log_admin("Build Mode: [key_name(user)] has righted [tilter] ([tilter.x],[tilter.y],[tilter.z])")
return
if(!object || isnull(get_turf(object)))
to_chat(user, "You need to select a target first.")
return
tilter.fall_and_crush(get_turf(object), crush_damage, prob(crit_chance), 2, forced_crit, weaken_time, knockdown_time, ignore_gravity, should_rotate, rotation_angle, rightable, block_interactions_until_righted)
log_admin("Build Mode: [key_name(user)] tilted [tilter] onto [ADMIN_COORDJMP(object)]")