Documents and improves the variable names of the shuttle subsystem (#63946)

This commit is contained in:
GoldenAlpharex
2022-01-11 16:08:34 -05:00
committed by GitHub
parent 234fbab6e7
commit c6d616ff11
23 changed files with 295 additions and 247 deletions
+1 -1
View File
@@ -137,7 +137,7 @@ SUBSYSTEM_DEF(mapping)
SSshuttle.transit_requesters.Cut()
message_admins("Clearing dynamic reservation space.")
var/list/obj/docking_port/mobile/in_transit = list()
for(var/i in SSshuttle.transit)
for(var/i in SSshuttle.transit_docking_ports)
var/obj/docking_port/stationary/transit/T = i
if(!istype(T))
continue
+181 -133
View File
@@ -7,86 +7,134 @@ SUBSYSTEM_DEF(shuttle)
flags = SS_KEEP_TIMING
runlevels = RUNLEVEL_SETUP | RUNLEVEL_GAME
var/list/mobile = list()
var/list/stationary = list()
var/list/beacons = list()
var/list/transit = list()
/// A list of all the mobile docking ports.
var/list/mobile_docking_ports = list()
/// A list of all the stationary docking ports.
var/list/stationary_docking_ports = list()
/// A list of all the beacons that can be docked to.
var/list/beacon_list = list()
/// A list of all the transit docking ports.
var/list/transit_docking_ports = list()
//Now it only for ID generation
/// Now it's only for ID generation in /obj/docking_port/mobile/register()
var/list/assoc_mobile = list()
/// Now it's only for ID generation in /obj/docking_port/stationary/register()
var/list/assoc_stationary = list()
/// A list of all the mobile docking ports currently requesting a spot in hyperspace.
var/list/transit_requesters = list()
/// An associative list of the mobile docking ports that have failed a transit request, with the amount of times they've actually failed that transit request, up to MAX_TRANSIT_REQUEST_RETRIES
var/list/transit_request_failures = list()
//emergency shuttle stuff
/**
* Emergency shuttle stuff
*/
/// The mobile docking port of the emergency shuttle.
var/obj/docking_port/mobile/emergency/emergency
/// The mobile docking port of the arrivals shuttle.
var/obj/docking_port/mobile/arrivals/arrivals
/// The mobile docking port of the backup emergency shuttle.
var/obj/docking_port/mobile/emergency/backup/backup_shuttle
var/emergencyCallTime = 6000 //time taken for emergency shuttle to reach the station when called (in deciseconds)
var/emergencyDockTime = 1800 //time taken for emergency shuttle to leave again once it has docked (in deciseconds)
var/emergencyEscapeTime = 1200 //time taken for emergency shuttle to reach a safe distance after leaving station (in deciseconds)
var/area/emergencyLastCallLoc
var/emergencyCallAmount = 0 //how many times the escape shuttle was called
var/emergencyNoEscape
var/emergencyNoRecall = FALSE
var/adminEmergencyNoRecall = FALSE
var/lastMode = SHUTTLE_IDLE
var/lastCallTime = 6000
var/list/hostileEnvironments = list() //Things blocking escape shuttle from leaving
var/list/tradeBlockade = list() //Things blocking cargo from leaving.
var/supplyBlocked = FALSE
/// Time taken for emergency shuttle to reach the station when called (in deciseconds).
var/emergency_call_time = 10 MINUTES
/// Time taken for emergency shuttle to leave again once it has docked (in deciseconds).
var/emergency_dock_time = 3 MINUTES
/// Time taken for emergency shuttle to reach a safe distance after leaving station (in deciseconds).
var/emergency_escape_time = 2 MINUTES
/// Where was the emergency shuttle last called from?
var/area/emergency_last_call_loc
/// How many times was the escape shuttle called?
var/emergencyCallAmount = 0
/// Is the departure of the shuttle currently prevented? FALSE for no, any other number for yes (thanks shuttle code).
var/emergency_no_escape = FALSE
/// Do we prevent the recall of the shuttle?
var/emergency_no_recall = FALSE
/// Did admins force-prevent the recall of the shuttle?
var/admin_emergency_no_recall = FALSE
/// Previous mode of the shuttle before it was forcefully disabled by admins.
var/last_mode = SHUTTLE_IDLE
/// Previous time left to the call, only useful for disabling and re-enabling the shuttle for admins so it doesn't have to start the whole timer again.
var/last_call_time = 10 MINUTES
//supply shuttle stuff
/// Things blocking escape shuttle from leaving.
var/list/hostile_environments = list()
/**
* Supply shuttle stuff
*/
/// The current cargo shuttle's mobile docking port.
var/obj/docking_port/mobile/supply/supply
var/ordernum = 1 //order number given to next order
var/points = 5000 //number of trade-points we have
var/centcom_message = "" //Remarks from CentCom on how well you checked the last order.
var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentCom, associated with their potencies
/// Order number given to next order.
var/order_number = 1
/// Number of trade-points we have (basically money).
var/points = 5000
/// Remarks from CentCom on how well you checked the last order.
var/centcom_message = ""
/// Typepaths for unusual plants we've already sent CentCom, associated with their potencies.
var/list/discovered_plants = list()
/// All of the possible supply packs that can be purchased by cargo
/// Things blocking the cargo shuttle from leaving.
var/list/trade_blockade = list()
/// Is the cargo shuttle currently blocked from leaving?
var/supply_blocked = FALSE
/// All of the possible supply packs that can be purchased by cargo.
var/list/supply_packs = list()
/// Queued supplies to be purchased for the chef
/// Queued supplies to be purchased for the chef.
var/list/chef_groceries = list()
/// Queued supply packs to be purchased
var/list/shoppinglist = list()
/// Queued supply packs to be purchased.
var/list/shopping_list = list()
/// Wishlist items made by crew for cargo to purchase at their leisure
var/list/requestlist = list()
/// Wishlist items made by crew for cargo to purchase at their leisure.
var/list/request_list = list()
/// A listing of previously delivered supply packs
var/list/orderhistory = list()
/// A listing of previously delivered supply packs.
var/list/order_history = list()
/// A list of job accesses that are able to purchase any shuttles
/// A list of job accesses that are able to purchase any shuttles.
var/list/has_purchase_shuttle_access
var/list/hidden_shuttle_turfs = list() //all turfs hidden from navigation computers associated with a list containing the image hiding them and the type of the turf they are pretending to be
var/list/hidden_shuttle_turf_images = list() //only the images from the above list
/// All turfs hidden from navigation computers associated with a list containing the image hiding them and the type of the turf they are pretending to be
var/list/hidden_shuttle_turfs = list()
/// Only the images from the [/datum/controller/subsystem/shuttle/hidden_shuttle_turfs] list.
var/list/hidden_shuttle_turf_images = list()
/// The current shuttle loan event, if any.
var/datum/round_event/shuttle_loan/shuttle_loan
///If the event happens where the crew can purchase shuttle insurance, catastrophe can't run.
/// If the event happens where the crew can purchase shuttle insurance, catastrophe can't run.
var/shuttle_insurance = FALSE
var/shuttle_purchased = SHUTTLEPURCHASE_PURCHASABLE //If the station has purchased a replacement escape shuttle this round
var/list/shuttle_purchase_requirements_met = list() //For keeping track of ingame events that would unlock new shuttles, such as defeating a boss or discovering a secret item
// If the station has purchased a replacement escape shuttle this round.
var/shuttle_purchased = SHUTTLEPURCHASE_PURCHASABLE
/// For keeping track of ingame events that would unlock new shuttles, such as defeating a boss or discovering a secret item.
var/list/shuttle_purchase_requirements_met = list()
var/lockdown = FALSE //disallow transit after nuke goes off
/// Disallow transit after nuke goes off
var/lockdown = FALSE
/// The currently selected shuttle map_template in the shuttle manipulator's template viewer.
var/datum/map_template/shuttle/selected
/// The existing shuttle associated with the selected shuttle map_template.
var/obj/docking_port/mobile/existing_shuttle
var/obj/docking_port/mobile/preview_shuttle
/// The shuttle map_template of the shuttle we want to preview.
var/datum/map_template/shuttle/preview_template
/// The docking port associated to the preview_template that's currently being previewed.
var/obj/docking_port/mobile/preview_shuttle
/// The turf reservation for the current previewed shuttle.
var/datum/turf_reservation/preview_reservation
/// Are we currently in the process of loading a shuttle? Useful to ensure we don't load more than one at once, to avoid weird inconsistencies and possible runtimes.
var/shuttle_loading
/datum/controller/subsystem/shuttle/Initialize(timeofday)
ordernum = rand(1, 9000)
order_number = rand(1, 9000)
var/list/pack_processing = subtypesof(/datum/supply_pack)
while(length(pack_processing))
@@ -119,19 +167,19 @@ SUBSYSTEM_DEF(shuttle)
return ..()
/datum/controller/subsystem/shuttle/proc/initial_load()
for(var/s in stationary)
var/obj/docking_port/stationary/S = s
S.load_roundstart()
for(var/port in stationary_docking_ports)
var/obj/docking_port/stationary/stationary_port = port
stationary_port.load_roundstart()
CHECK_TICK
/datum/controller/subsystem/shuttle/fire()
for(var/thing in mobile)
for(var/thing in mobile_docking_ports)
if(!thing)
mobile.Remove(thing)
mobile_docking_ports.Remove(thing)
continue
var/obj/docking_port/mobile/P = thing
P.check()
for(var/thing in transit)
for(var/thing in transit_docking_ports)
var/obj/docking_port/stationary/transit/T = thing
if(!T.owner)
qdel(T, force=TRUE)
@@ -162,7 +210,7 @@ SUBSYSTEM_DEF(shuttle)
break
/datum/controller/subsystem/shuttle/proc/CheckAutoEvac()
if(emergencyNoEscape || adminEmergencyNoRecall || emergencyNoRecall || !emergency || !SSticker.HasRoundStarted())
if(emergency_no_escape || admin_emergency_no_recall || emergency_no_recall || !emergency || !SSticker.HasRoundStarted())
return
var/threshold = CONFIG_GET(number/emergency_shuttle_autocall_threshold)
@@ -183,33 +231,33 @@ SUBSYSTEM_DEF(shuttle)
var/msg = "Automatically dispatching emergency shuttle due to crew death."
message_admins(msg)
log_shuttle("[msg] Alive: [alive], Roundstart: [total], Threshold: [threshold]")
emergencyNoRecall = TRUE
emergency_no_recall = TRUE
priority_announce("Catastrophic casualties detected: crisis shuttle protocols activated - jamming recall signals across all frequencies.")
if(emergency.timeLeft(1) > emergencyCallTime * 0.4)
if(emergency.timeLeft(1) > emergency_call_time * 0.4)
emergency.request(null, set_coefficient = 0.4)
/datum/controller/subsystem/shuttle/proc/block_recall(lockout_timer)
if(adminEmergencyNoRecall)
if(admin_emergency_no_recall)
priority_announce("Error!", "Emergency Shuttle Uplink Alert", 'sound/misc/announce_dig.ogg')
addtimer(CALLBACK(src, .proc/unblock_recall), lockout_timer)
return
emergencyNoRecall = TRUE
emergency_no_recall = TRUE
addtimer(CALLBACK(src, .proc/unblock_recall), lockout_timer)
/datum/controller/subsystem/shuttle/proc/unblock_recall()
if(adminEmergencyNoRecall)
if(admin_emergency_no_recall)
priority_announce("Error!", "Emergency Shuttle Uplink Alert", 'sound/misc/announce_dig.ogg')
return
emergencyNoRecall = FALSE
emergency_no_recall = FALSE
/datum/controller/subsystem/shuttle/proc/getShuttle(id)
for(var/obj/docking_port/mobile/M in mobile)
for(var/obj/docking_port/mobile/M in mobile_docking_ports)
if(M.id == id)
return M
WARNING("couldn't find shuttle with id: [id]")
/datum/controller/subsystem/shuttle/proc/getDock(id)
for(var/obj/docking_port/stationary/S in stationary)
for(var/obj/docking_port/stationary/S in stationary_docking_ports)
if(S.id == id)
return S
WARNING("couldn't find dock with id: [id]")
@@ -325,18 +373,18 @@ SUBSYSTEM_DEF(shuttle)
return 1
/datum/controller/subsystem/shuttle/proc/canRecall()
if(!emergency || emergency.mode != SHUTTLE_CALL || adminEmergencyNoRecall || emergencyNoRecall)
if(!emergency || emergency.mode != SHUTTLE_CALL || admin_emergency_no_recall || emergency_no_recall)
return
var/security_num = seclevel2num(get_security_level())
switch(security_num)
if(SEC_LEVEL_GREEN)
if(emergency.timeLeft(1) < emergencyCallTime)
if(emergency.timeLeft(1) < emergency_call_time)
return
if(SEC_LEVEL_BLUE)
if(emergency.timeLeft(1) < emergencyCallTime * 0.5)
if(emergency.timeLeft(1) < emergency_call_time * 0.5)
return
else
if(emergency.timeLeft(1) < emergencyCallTime * 0.25)
if(emergency.timeLeft(1) < emergency_call_time * 0.25)
return
return 1
@@ -370,88 +418,88 @@ SUBSYSTEM_DEF(shuttle)
message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.")
/datum/controller/subsystem/shuttle/proc/registerHostileEnvironment(datum/bad)
hostileEnvironments[bad] = TRUE
hostile_environments[bad] = TRUE
checkHostileEnvironment()
/datum/controller/subsystem/shuttle/proc/clearHostileEnvironment(datum/bad)
hostileEnvironments -= bad
hostile_environments -= bad
checkHostileEnvironment()
/datum/controller/subsystem/shuttle/proc/registerTradeBlockade(datum/bad)
tradeBlockade[bad] = TRUE
trade_blockade[bad] = TRUE
checkTradeBlockade()
/datum/controller/subsystem/shuttle/proc/clearTradeBlockade(datum/bad)
tradeBlockade -= bad
trade_blockade -= bad
checkTradeBlockade()
/datum/controller/subsystem/shuttle/proc/checkTradeBlockade()
for(var/datum/d in tradeBlockade)
for(var/datum/d in trade_blockade)
if(!istype(d) || QDELETED(d))
tradeBlockade -= d
supplyBlocked = tradeBlockade.len
trade_blockade -= d
supply_blocked = trade_blockade.len
if(supplyBlocked && (supply.mode == SHUTTLE_IGNITING))
if(supply_blocked && (supply.mode == SHUTTLE_IGNITING))
supply.mode = SHUTTLE_STRANDED
supply.timer = null
//Make all cargo consoles speak up
if(!supplyBlocked && (supply.mode == SHUTTLE_STRANDED))
if(!supply_blocked && (supply.mode == SHUTTLE_STRANDED))
supply.mode = SHUTTLE_DOCKED
//Make all cargo consoles speak up
/datum/controller/subsystem/shuttle/proc/checkHostileEnvironment()
for(var/datum/d in hostileEnvironments)
for(var/datum/d in hostile_environments)
if(!istype(d) || QDELETED(d))
hostileEnvironments -= d
emergencyNoEscape = hostileEnvironments.len
hostile_environments -= d
emergency_no_escape = hostile_environments.len
if(emergencyNoEscape && (emergency.mode == SHUTTLE_IGNITING))
if(emergency_no_escape && (emergency.mode == SHUTTLE_IGNITING))
emergency.mode = SHUTTLE_STRANDED
emergency.timer = null
emergency.sound_played = FALSE
priority_announce("Hostile environment detected. \
Departure has been postponed indefinitely pending \
conflict resolution.", null, 'sound/misc/notice1.ogg', "Priority")
if(!emergencyNoEscape && (emergency.mode == SHUTTLE_STRANDED))
if(!emergency_no_escape && (emergency.mode == SHUTTLE_STRANDED))
emergency.mode = SHUTTLE_DOCKED
emergency.setTimer(emergencyDockTime)
emergency.setTimer(emergency_dock_time)
priority_announce("Hostile environment resolved. \
You have 3 minutes to board the Emergency Shuttle.",
null, ANNOUNCER_SHUTTLEDOCK, "Priority")
//try to move/request to dockHome if possible, otherwise dockAway. Mainly used for admin buttons
/datum/controller/subsystem/shuttle/proc/toggleShuttle(shuttleId, dockHome, dockAway, timed)
var/obj/docking_port/mobile/M = getShuttle(shuttleId)
if(!M)
return 1
var/obj/docking_port/stationary/dockedAt = M.get_docked()
var/destination = dockHome
if(dockedAt && dockedAt.id == dockHome)
destination = dockAway
//try to move/request to dock_home if possible, otherwise dock_away. Mainly used for admin buttons
/datum/controller/subsystem/shuttle/proc/toggleShuttle(shuttle_id, dock_home, dock_away, timed)
var/obj/docking_port/mobile/shuttle_port = getShuttle(shuttle_id)
if(!shuttle_port)
return DOCKING_BLOCKED
var/obj/docking_port/stationary/docked_at = shuttle_port.get_docked()
var/destination = dock_home
if(docked_at && docked_at.id == dock_home)
destination = dock_away
if(timed)
if(M.request(getDock(destination)))
return 2
if(shuttle_port.request(getDock(destination)))
return DOCKING_IMMOBILIZED
else
if(M.initiate_docking(getDock(destination)) != DOCKING_SUCCESS)
return 2
return 0 //dock successful
if(shuttle_port.initiate_docking(getDock(destination)) != DOCKING_SUCCESS)
return DOCKING_IMMOBILIZED
return DOCKING_SUCCESS //dock successful
/datum/controller/subsystem/shuttle/proc/moveShuttle(shuttleId, dockId, timed)
var/obj/docking_port/mobile/M = getShuttle(shuttleId)
var/obj/docking_port/stationary/D = getDock(dockId)
/datum/controller/subsystem/shuttle/proc/moveShuttle(shuttle_id, dock_id, timed)
var/obj/docking_port/mobile/shuttle_port = getShuttle(shuttle_id)
var/obj/docking_port/stationary/docking_target = getDock(dock_id)
if(!M)
return 1
if(!shuttle_port)
return DOCKING_BLOCKED
if(timed)
if(M.request(D))
return 2
if(shuttle_port.request(docking_target))
return DOCKING_IMMOBILIZED
else
if(M.initiate_docking(D) != DOCKING_SUCCESS)
return 2
return 0 //dock successful
if(shuttle_port.initiate_docking(docking_target) != DOCKING_SUCCESS)
return DOCKING_IMMOBILIZED
return DOCKING_SUCCESS //dock successful
/datum/controller/subsystem/shuttle/proc/request_transit_dock(obj/docking_port/mobile/M)
if(!istype(M))
@@ -549,12 +597,12 @@ SUBSYSTEM_DEF(shuttle)
/datum/controller/subsystem/shuttle/Recover()
initialized = SSshuttle.initialized
if (istype(SSshuttle.mobile))
mobile = SSshuttle.mobile
if (istype(SSshuttle.stationary))
stationary = SSshuttle.stationary
if (istype(SSshuttle.transit))
transit = SSshuttle.transit
if (istype(SSshuttle.mobile_docking_ports))
mobile_docking_ports = SSshuttle.mobile_docking_ports
if (istype(SSshuttle.stationary_docking_ports))
stationary_docking_ports = SSshuttle.stationary_docking_ports
if (istype(SSshuttle.transit_docking_ports))
transit_docking_ports = SSshuttle.transit_docking_ports
if (istype(SSshuttle.transit_requesters))
transit_requesters = SSshuttle.transit_requesters
if (istype(SSshuttle.transit_request_failures))
@@ -567,24 +615,24 @@ SUBSYSTEM_DEF(shuttle)
if (istype(SSshuttle.backup_shuttle))
backup_shuttle = SSshuttle.backup_shuttle
if (istype(SSshuttle.emergencyLastCallLoc))
emergencyLastCallLoc = SSshuttle.emergencyLastCallLoc
if (istype(SSshuttle.emergency_last_call_loc))
emergency_last_call_loc = SSshuttle.emergency_last_call_loc
if (istype(SSshuttle.hostileEnvironments))
hostileEnvironments = SSshuttle.hostileEnvironments
if (istype(SSshuttle.hostile_environments))
hostile_environments = SSshuttle.hostile_environments
if (istype(SSshuttle.supply))
supply = SSshuttle.supply
if (istype(SSshuttle.discoveredPlants))
discoveredPlants = SSshuttle.discoveredPlants
if (istype(SSshuttle.discovered_plants))
discovered_plants = SSshuttle.discovered_plants
if (istype(SSshuttle.shoppinglist))
shoppinglist = SSshuttle.shoppinglist
if (istype(SSshuttle.requestlist))
requestlist = SSshuttle.requestlist
if (istype(SSshuttle.orderhistory))
orderhistory = SSshuttle.orderhistory
if (istype(SSshuttle.shopping_list))
shopping_list = SSshuttle.shopping_list
if (istype(SSshuttle.request_list))
request_list = SSshuttle.request_list
if (istype(SSshuttle.order_history))
order_history = SSshuttle.order_history
if (istype(SSshuttle.shuttle_loan))
shuttle_loan = SSshuttle.shuttle_loan
@@ -594,9 +642,9 @@ SUBSYSTEM_DEF(shuttle)
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
centcom_message = SSshuttle.centcom_message
ordernum = SSshuttle.ordernum
order_number = SSshuttle.order_number
points = D.account_balance
emergencyNoEscape = SSshuttle.emergencyNoEscape
emergency_no_escape = SSshuttle.emergency_no_escape
emergencyCallAmount = SSshuttle.emergencyCallAmount
shuttle_purchased = SSshuttle.shuttle_purchased
lockdown = SSshuttle.lockdown
@@ -614,30 +662,30 @@ SUBSYSTEM_DEF(shuttle)
var/area/current = get_area(A)
if(istype(current, /area/shuttle) && !istype(current, /area/shuttle/transit))
return TRUE
for(var/obj/docking_port/mobile/M in mobile)
for(var/obj/docking_port/mobile/M in mobile_docking_ports)
if(M.is_in_shuttle_bounds(A))
return TRUE
/datum/controller/subsystem/shuttle/proc/get_containing_shuttle(atom/A)
var/list/mobile_cache = mobile
for(var/i in 1 to mobile_cache.len)
var/obj/docking_port/port = mobile_cache[i]
var/list/mobile_docking_ports_cache = mobile_docking_ports
for(var/i in 1 to mobile_docking_ports_cache.len)
var/obj/docking_port/port = mobile_docking_ports_cache[i]
if(port.is_in_shuttle_bounds(A))
return port
/datum/controller/subsystem/shuttle/proc/get_containing_dock(atom/A)
. = list()
var/list/stationary_cache = stationary
for(var/i in 1 to stationary_cache.len)
var/obj/docking_port/port = stationary_cache[i]
var/list/stationary_docking_ports_cache = stationary_docking_ports
for(var/i in 1 to stationary_docking_ports_cache.len)
var/obj/docking_port/port = stationary_docking_ports_cache[i]
if(port.is_in_shuttle_bounds(A))
. += port
/datum/controller/subsystem/shuttle/proc/get_dock_overlap(x0, y0, x1, y1, z)
. = list()
var/list/stationary_cache = stationary
for(var/i in 1 to stationary_cache.len)
var/obj/docking_port/port = stationary_cache[i]
var/list/stationary_docking_ports_cache = stationary_docking_ports
for(var/i in 1 to stationary_docking_ports_cache.len)
var/obj/docking_port/port = stationary_docking_ports_cache[i]
if(!port || port.z != z)
continue
var/list/bounds = port.return_coords()
@@ -840,7 +888,7 @@ SUBSYSTEM_DEF(shuttle)
// Status panel
data["shuttles"] = list()
for(var/i in mobile)
for(var/i in mobile_docking_ports)
var/obj/docking_port/mobile/M = i
var/timeleft = M.timeLeft(1)
var/list/L = list()
@@ -885,7 +933,7 @@ SUBSYSTEM_DEF(shuttle)
. = TRUE
if("jump_to")
if(params["type"] == "mobile")
for(var/i in mobile)
for(var/i in mobile_docking_ports)
var/obj/docking_port/mobile/M = i
if(M.id == params["id"])
user.forceMove(get_turf(M))
@@ -893,7 +941,7 @@ SUBSYSTEM_DEF(shuttle)
break
if("fly")
for(var/i in mobile)
for(var/i in mobile_docking_ports)
var/obj/docking_port/mobile/M = i
if(M.id == params["id"])
. = TRUE
@@ -901,7 +949,7 @@ SUBSYSTEM_DEF(shuttle)
break
if("fast_travel")
for(var/i in mobile)
for(var/i in mobile_docking_ports)
var/obj/docking_port/mobile/M = i
if(M.id == params["id"] && M.timer && M.timeLeft(1) >= 50)
M.setTimer(50)