Portal 2 Rules

This document aims to provide an overview of rules for speedrunning Portal 2 and its mods. Most rules are universally applicable, however, every category will have exceptions and/or additional rules. Every rule detailed in the "General Rules" section below may be overruled within a category - for this reason, you should make sure to read all rules relevant to the category you are running.

Also note that this set of rules is not exhaustive on lists of commands or more generally on banned actions. If anything seems at all ambiguous to you or you're not sure if something is allowed, please consult a board moderator for the category in question. Lists of moderators can be found in the category's section below.

Definitions

Commands

In the game's console, you can execute commands, as well as bind keys to execute commands. We define several classes of command.

"Functional Commands" are commands which have some effect on the run or the runner's ability to perform it. The vast majority of commands fit into this category - effectively the only ones that don't are ones which impact timing, such as sar_speedrun_result, and purely cosmetic ones, such as sar_hud_set_text.

"Action Commands" are a subset of functional commands defined as any command which has a direct effect on the game world. This includes all player movement commands (+forward, -forward, +duck, etc), as well as commands such as load.

Pause Abuse

Pause Abuse is defined as using game pauses (via the ESC key, gameui commands, or opening the developer console) to affect the chance of some event occurring, make an event possible, or otherwise contribute to the run. For instance, the Betsrighter jump in sp_a1_wakeup can be done far more consistently by console pausing as you land - as such, pausing at this moment in the run is considered pause abuse, as it affects your chances of getting the jump. More subtly, pausing while lining up a precise shot is also pause abuse, since the time you are paused can allow you time to read your coordinates and prepare to move your mouse correctly.

Save/Load Abuse (SLA)

Save/Load Abuse (SLA) is defined as using any unnatural load or level transition (i.e. anything other than touching a changelevel trigger in the map) in order to affect the chance of some event occurring or make an event possible. For instance, saveload clipping is considered SLA, since it achieves an effect which would otherwise be impossible. Similarly, loading saves to retry lucky door skip in sp_a2_bridge_the_gap is SLA, as it affects the overall chance of successfully getting through the door. Exceptions are made to this rule for physics RNG specifically, so that loading saves and getting different physics RNG is not considered SLA, since this RNG is prevalant to the point of being unavoidable.

Out of Bounds (OOB)

The Source Engine has a strict technical definition of whether a point is "out of bounds" based on its BSP world system (a point is out of bounds if it is in a CONTENTS_SOLID leaf and not within a brush). We define the player themselves as being out of bounds if a) the player's eye position goes out of bounds or b) all 8 vertices of the player's bounding box go out of bounds.

General Rules

Commands

IF YOU ARE UNSURE WHETHER A COMMAND IS ALLOWED, CHECK WITH A MODERATOR FOR YOUR CATEGORY BEFORE USING IT.

The game contains a wide array of commands and variables (cvars) which can be used to achieve various effects. Commands are banned or allowed considering several criteria. All commands accessible in normal gameplay (e.g. common movement commands, save/load) are allowed. Other commands receive rulings based on their interaction with the rest of the game, their similarity to other commands, and how they fit in with other rules. If you're not sure whether a command is allowed, you should speak to a moderator for the category you are running.

Allowed commands can be categorised as "action commands", "functional commands", and "non-functional commands" (note that all action commands are also functional commands). Any allowed command may be manually executed by typing it into the console at any point, including executing such commands indirectly through exec or aliases.

HUDs

SAR and the game itself provide various HUDs to the user, accessible through console commands. In general, a HUD provided by SAR is allowed only if there is an equivalent HUD allowed which the base game provides. The command list below exhaustively lists all known allowed HUDs.

HUDs containing unchanging, predetermined user-provided text or content - such as through sar_hud_set_text or sar_toast_create - are always allowed, even if they are giving information about the run, such as dialogue fades or lineups.

Graphics

Most commands affecting the game's graphics are allowed to be used, and are not classed as functional commands. This is because using these commands is sometimes required for good performance on lower-end hardware. This includes most commands starting r_ provided they do not make parts of the world invisible or cause other major differences to default behaviour.

Crosshairs

The game's default crosshair size (including quickhud) has a fixed pixel size. Custom crosshairs via sar_crosshair and sar_quickhud are permitted only with specific assets and parameters, to get a crosshair equivalent to the default on a different resolution. The crosshair used must may change throughout the run. If you wish to use a custom crosshair, ask a moderator for your category for an allowed configuration.

Command List

This list details the allowed values for every SAR command as well as a lot of base game commands. Please note that any category can override any of these rulings. An allowed value of - means that any value is permitted.

Command Type Allowed Values
load Action -
+forward / -forward Action -
+moveleft / -moveleft Action -
+moveright / -moveright Action -
+back / -back Action -
+left / -left Action -
+right / -right Action -
+duck / -duck Action -
+movedown / -movedown Action -
+use / -use Action -
+attack / -attack Action -
+attack2 / -attack2 Action -
+remote_view / -remote_view Functional -
+zoom / -zoom Functional -
+quick_ping Action -
-quick_ping Functional -
+coop_ping Action -
-coop_ping Functional -
+mouse_menu Functional -
-mouse_menu Action -
sv_zoom_stop_movement_threashold Functional -
sv_zoom_stop_time_threashold Functional -
sensitivity Functional -
zoom_sensitivity_ratio Functional -
m_yaw Functional -
m_rawinput Functional -
save Functional -
autosave Functional -
con_drawnotify Functional -
vm_debug Functional -
cl_showpos Functional 0, 1
cl_forwardspeed Functional 0 .. 175
cl_backspeed Functional 0 .. 175
cl_sidespeed Functional 0 .. 175
cl_fov Functional 45 .. 140
contimes Functional -
developer Functional 0, 1
con_filter_enable Functional -
con_filter_text_out Functional -
stopvideos (in a cutscene video) Action -
stopvideos (in coop level transition) Non-functional -
net_graph Non-functional -
viewmodel_offset_x Non-functional -
viewmodel_offset_y Non-functional -
viewmodel_offset_z Non-functional -
r_PortalTestEnts Non-functional -
r_portal_fastpath Non-functional -
r_portal_use_pvs_optimization Non-functional -
cc_lang Non-functional -
cc_subtitles Non-functional -
mat_vsync Non-functional -
mat_specular Non-functional -
mat_motion_blur_enabled Non-functional -
mat_ambient_light_r Non-functional -
mat_ambient_light_g Non-functional -
mat_ambient_light_b Non-functional -
mat_fullbright Non-functional 0, 1
save_history_count Non-functional -
save_screenshot Non-functional -
ui_loadingscreen_transition_time Non-functional -
ui_loadingscreen_fadein_time Non-functional -
ui_loadingscreen_mintransition_time Non-functional -
ui_transition_effect Non-functional -
fps_max Functional 30 .. 999
say Non-functional -
ghost_type Non-functional 0, 1, 4
ghost_prop_model Banned -
ghost_* Non-functional -
sar_force_fov Functional 45 .. 140
sar_speedrun_* Non-functional -
sar_stop Functional -
sar_toast_create Non-functional -
sar_check_update Non-functional -
sar_update Non-functional -
svar_* Non-functional -
sar_aim_point_* Banned -
sar_aircontrol Banned -
sar_autojump Banned -
sar_autorecord Non-functional -
sar_cam_* Banned -
nop Non-functional -
sar_about Non-functional -
sar_achievement_tracker_* Non-functional -
sar_allow_resizing_window Non-functional -
sar_always_transmit_heavy_ents Non-functional -
sar_avg_* Non-functional -
sar_bink_respect_host_time Non-functional -
sar_challenge_autostop Non-functional -
sar_challenge_autosubmit_reload_api_key Non-functional -
sar_chat Non-functional -
sar_cheat_hud_* Non-functional -
sar_clear_lines Non-functional -
sar_cm_rightwarp Non-functional -
sar_con_filter_* Non-functional -
sar_coop_reset_progress Banned -
sar_cps_* Non-functional -
sar_cvarlist Non-functional -
sar_cvars_* Banned -
sar_debug_listener Banned -
sar_delete_alias_cmds Non-functional -
sar_demo_blacklist_* Non-functional -
sar_demo_overwrite_bak Non-functional -
sar_demo_portal_interp_fix Non-functional -
sar_demo_remove_broken Non-functional -
sar_demo_replay Banned -
sar_disable_challenge_stats_hud Non-functional -
sar_disable_coop_score_hud Non-functional -
sar_disable_no_focus_sleep Non-functional -
sar_disable_progress_bar_update Non-functional -
sar_disable_save_status_hud Non-functional -
sar_disable_steam_pause Non-functional -
sar_disable_weapon_sway Non-functional -
sar_dpi_scale Functional -
sar_drawline_* Banned -
sar_duckjump Banned -
sar_dump_* Banned -
sar_echo Non-functional -
sar_echo_nolf Non-functional -
sar_ei_* Banned -
sar_ent_info Banned -
sar_ent_slot_serial Banned -
sar_exit Functional -
sar_export_stats Non-functional -
sar_import_stats Non-functional -
sar_fast_load_preset Non-functional -
sar_fcps_* Banned -
sar_find_client_class Banned -
sar_find_server_class Banned -
sar_find_ent Banned -
sar_find_ents Banned -
sar_fix_reloaded_cheats Non-functional -
sar_font_* Non-functional -
sar_force_fov Functional -
sar_force_qc Banned -
sar_getpos Banned -
sar_geteyepos Banned -
sar_give_betsrighter Banned -
sar_give_fly Banned -
sar_groundframes_* Non-functional -
sar_hud_velocity_precision Functional 0 .. 2
sar_hud_precision Functional 0 .. 6
sar_hud_ent_slot_serial Banned -
sar_hud_eyeoffset Banned -
sar_hud_inspection Banned -
sar_hud_tbeam Banned -
sar_hud_tbeam_count Banned -
sar_hud_trace Banned -
sar_hud_* Functional -
sar_ihud_* Non-functional -
sar_inspection_* Banned -
sar_jumpboost Banned -
sar_list_client_classes Banned -
sar_list_server_classes Banned -
sar_list_ents Banned -
sar_load_delay Non-functional -
sar_loads_norender Non-functional -
sar_loads_uncap Non-functional -
sar_lphud_* Non-functional -
sar_minimap_* Non-functional -
sar_mtrigger_legacy_* Non-functional -
sar_nextdemo Banned -
sar_paint_reseed Banned -
sar_patch_bhop Banned -
sar_patch_cfg Banned -
sar_pip_align Non-functional -
sar_portalgun_hud_* Banned -
sar_portals_thru_portals Banned -
sar_pp_hud_* Banned -
sar_prevent_ehm Non-functional -
sar_prevent_mat_snapshot_recompute Non-functional -
sar_print_stats Non-functional -
sar_record_at_* Non-functional -
sar_record_mkdir Non-functional -
sar_record_prefix Non-functional -
sar_rename Non-functional -
sar_render_* Banned -
sar_rng_* Banned -
sar_ruler_* Banned -
sar_scrollspeed Non-functional -
sar_seamshot_finder Banned -
sar_session Non-functional -
sar_show_entinp Banned -
sar_skiptodemo Banned -
sar_speedrun_* Non-functional -
sar_sr_hud_* Non-functional -
sar_startdemos Banned -
sar_startdemosfolder Banned -
sar_statcounter_filepath Non-functional -
sar_stats_* Non-functional -
sar_stitcher_* Banned -
sar_stop Non-functional -
sar_strafe_quality_* Non-functional -
sar_strafesync_* Non-functional -
sar_sum_* Non-functional -
sar_tas_* Banned -
sar_teleport Banned -
sar_teleport_setpos Non-functional -
sar_tick_debug Banned -
sar_time_demo Banned -
sar_time_demos Banned -
sar_time_demo_dev Banned -
sar_timer_* Non-functional -
sar_toast_* Non-functional -
sar_togglewait Banned -
sar_trace_* Banned -
sar_velocitygraph_* Non-functional -
sar_vphys_hud_* Banned -
sar_vphys_setangle Banned -
sar_vphys_setasleep Banned -
sar_vphys_setgravity Banned -
sar_vphys_setspin Banned -
sar_workshop_* Banned -
sar_pause_at Banned -
sar_pause_for Banned -
sar_alias Non-functional -
sar_function Non-functional -
sar_expand Inherited -
cond Inherited -
conds Inherited -
sar_alias_run Inherited -
sar_function_run Inherited -
svar_* Non-functional -
sar_on_* Non-functional Non-functional commands only
hwait Non-functional Non-functional commands only
seq Non-functional Non-functional commands only
wait Non-functional Non-functional commands only
wait_to Non-functional Non-functional commands only
wait_for Non-functional Non-functional commands only
wait_mode Non-functional -
wait_persist_across_loads Non-functional -
sar_quickhud_* Non-functional Pre-defined allowed values, see above
sar_crosshair_* Non-functional Pre-defined allowed values, see above

Scripting

Any time a key is pressed or released, an arbitrary amount of allowed commands may be executed. These may include up to one action command. Any functional commands in the sequence must be executed without delay. For other commands, delay is permitted, e.g. through SAR's hwait command. Note that scrolling the mouse wheel a single tick counts as pressing and immediately releasing the "key" of the mouse wheel.

Automation of commands may be achieved through mechanisms like the sar_on_load command. This is limited to non-functional commands during the run; however, note that in Challenge Mode, automatically running functional commands is allowed provided the command could have benn performed manually prior to the run with the same effect. Examples of this include changing sensitivity or mat_fullbright.

Pre-Run Setup

It is not allowed to perform any setup for a glitch or exploit before the run. For instance, you cannot use map logic or otherwise to modify the value of sv_allow_mobile_portals before the run, nor can you load into maps so as to set up EHM, nor prepare CM Wrong Warp.

External Modifications

Currently, the only permitted external modifications for use in runs are SourceAutoRecord (SAR) on the latest full release or a later pre-release, and pathmatch_cache for Linux users.

Custom builds of SAR are not allowed - only the releases from the official GitHub repository may be used. Other external modifications, such as game plugins or code injectors, are not allowed. Runs performed with SAR pre-releases may be retroactively banned if a pre-release is found to provide some advantage. While unlikely, you acknowledge that by using a SAR pre-release you are putting your runs at risk. When a new full release of SAR is made available, there is a grace period of 1 week in which the previous full release is still allowed.

Exceptions may be made on a case-by-case basis: if you think you have a legitimate case for using an external modification which isn't listed here, consult a moderator for the category you're running.

Asset Modifications

Texture modifications are allowed, with some caveats. The textures of portal surfaces must not be modified in any way. No textures can be modified to provide any visual assistance, such as help with a lineup. No texture may be modified to be more translucent than it was, with the exception of the player's viewmodel.

Modifying models is not allowed, with the exception of the portal gun (including both the viewmodel and the in-world model). Modifying audio files, captions or any other asset is not allowed.

OOB

Some categories are marked as "inbounds", which essentially means the player and all portals and props must stay inbounds at all times. More precisely, we say that the player, all portal origins, and all prop origins must remain inbounds at all times, except where the game requires otherwise (e.g. certain level transitions place the player temporarily OOB).

Exceptions can be made to this rule in accidental cases where the rule is briefly broken. In particular, if an extreme eye offset from a portal transition causes the player's eye to momentarily peek OOB, but this is not abused, it would not be grounds for even a high-level run to be rejected.

Cooperative Play

In any online cooperative run, both players (not just the host) must provide appropriate proof for the run. The proof requirements are unaffected for local splitscreen runs.

The network conditions used in online coop are regulated. Any use of packet loss which benefits the player is banned. Ping-based advantages, however, are allowed - you may artificially increase ping through external means, such as a VPN, but not through the net_fakelag command. Similarly, net_fakenoise, net_fakejitter, and net_fakeloss are not allowed under any circumstances.

Miscellaneous

Timing

Most runs use demo time for timing (the main notable exception is Challenge Mode, which uses its integrated timer). Even when not recording demos, SAR's timer perfectly emulates demo timing (except in CM where it emulates the integrated timer), so is recommended for use most of the time. For video submissions, which are required to have a timer visible on-screen, the timer HUD from sar_sr_hud may be used. Alternatively, SAR's integrated timer may be linked to external speedrun timers such as LiveSplit or adrift, and these may be overlaid on the video.

If using pause abuse (in a category where it is allowed), the pauses in question must be timed. This can be done using sar_speedrun_time_pauses 1, or manually with video evidence.

To ensure the run is not affected by network conditions, cooperative runs are timed differently. The inter-level timing standard for coop is defined per-game.

Proof Standards

Unless otherwise noted in category rules, all runs most have some form of proof associated with them, which could be in the form of a video or of demo(s). Most categories will require demo proof for runs above a certain rank. Demos are generally encouraged over videos as they have several tangible advantages.

Videos submitted as proof must have an accepted timer visible on the screen. They must always be submitted as a single continuous video, and must not have any severe quality or framerate issues which impact viewability.

Demos must be submitted for every segment of the run, in the correct order, with none missing. You must start recording demos before the run begins where possible, or otherwise as soon as you can - it is recommended to use sar_record_at to achieve this. On runs with multiple segments, demos must be recorded across loads - this is normally expected to be achieved via the sar_autorecord command, but categories may define different methods.

For any category other than Challenge Mode, any custom .vpk files active during the run must be included in the run submission. They can be uploaded to a site such as Google Drive along with the demo files.

Games

Portal 2

General

When running a non-splitscreen cooperative category, progress must be entirely reset before every run. It is recommended to do this using sar_coop_reset_progress. Alternatively, it can be achieved by running mp_coop_mark_all_maps_incomplete and mp_coop_lock_all_taunts, followed by returning to the main menu and re-inviting your partner.

Timing

The singleplayer campaign is timed as follows:

The cooperative campaign is timed as follows:

Unless otherwise specified, partial campaign runs (e.g. chapter runs) are timed as a subset of the relevant campaign, so e.g. Chapter 9 runs begin timing as soon as the player loads into Finale 1 and end timing when the player shoots the moon.

Challenge Mode
Complete individual maps from the singleplayer or coop campaign in Challenge Mode.
OOB: YesSLA: NoPause Abuse: NoDemo Requirement: 200thLeaderboardModerators: Betsruner, Daniel, Rex, Xinera
Ranks above 200 do not require proof. sv_player_funnel_into_portals 0 is allowed. sar_pause_at may be set at 0 with any value of sar_pause_for.
Inbounds No SLA
Complete the entire singleplayer campaign.
OOB: NoSLA: NoPause Abuse: YesDemo Requirement: 200thLeaderboardModerators: Betsruner, BiSaXa, Fridge
any% (Singleplayer)
Complete the entire singleplayer campaign.
OOB: YesSLA: YesPause Abuse: YesDemo Requirement: 200thLeaderboardModerators: Betsruner, BiSaXa, Fridge
sar_cm_rightwarp is not allowed.
All Main Courses
Complete courses 1-5 of the cooperative campaign, without skipping any.
OOB: YesSLA: YesPause Abuse: NoDemo Requirement: 200th (Both partners submit for top 50)LeaderboardModerators: Betsruner, BiSaXa, Fridge
All Courses
Complete all courses (1-6) of the cooperative campaign, without skipping any.
OOB: YesSLA: YesPause Abuse: NoDemo Requirement: 200thLeaderboardModerators: Betsruner, BiSaXa, Fridge
Course 6 may be completed at any point in the run.
any% (Cooperative)
Complete up to the end of course 5 of the cooperative campaign.
OOB: YesSLA: YesPause Abuse: NoDemo Requirement: 200thLeaderboardModerators: Betsruner, BiSaXa, Fridge
You may use glitches to skip courses and maps.
Solo Co-op
Complete courses 1-5 of the cooperative campaign, without skipping any, alone in splitscreen.
OOB: YesSLA: YesPause Abuse: NoDemo Requirement: 200thLeaderboardModerators: Betsruner, BiSaXa, Fridge
in_forceuser may be changed, for which sv_cheats 1 is required. All other command restrictions remain unchanged.
Most Recent Community Chambers
Complete the specified amount of community maps from the Most Recent option.
OOB: NoSLA: NoPause Abuse: NoDemo Requirement: N/ALeaderboardModerators: Betsruner, BiSaXa, Fridge, phunkpai
Video proof is required. You can skip levels. You cannot play your own maps or maps you have previously seen.
Co-op any% EHM
Complete up to the end of course 5 of the cooperative campaign.
OOB: YesSLA: YesPause Abuse: NoDemo Requirement: 200thLeaderboardModerators: Betsruner, BiSaXa, Fridge, phunkpai
You may use glitches to skip courses and maps. EHM is allowed.
Portal Placement Never Fail
Complete the specified campaign according to the standard ruleset for the underlying category.
OOB: YesSLA: -Pause Abuse: -Demo Requirement: All runsLeaderboardModerators: Betsruner, BiSaXa, Fridge, phunkpai
You may use sv_portal_placement_never_fail 1 (which requires sv_cheats 1). All other rules come from the underlying category (Inbounds No SLA, AMC, Co-op any%, or Solo Co-op).
Singleplayer 100 Portals
Complete the entire singleplayer campaign within 100 portals.
OOB: NoSLA: NoPause Abuse: YesDemo Requirement: 200thLeaderboardModerators: Betsruner, BiSaXa, Fridge, phunkpai
You must place no more than 100 portals during the run. sar_lphud can be used to track portal shots.
Co-op 69 Portals
Complete all courses (1-6) of the cooperative campaign within 69 portals.
OOB: YesSLA: YesPause Abuse: NoDemo Requirement: 200thLeaderboardModerators: Betsruner, BiSaXa, Fridge, phunkpai
You must place no more than 69 portals during the run. sar_lphud can be used to track portal shots.

Portal 2 Speedrun Mod

Timing

Most categories are timed as follows:

Reverse Mod is timed as follows:

Normal Mode
Complete the game in Normal Mode.
OOB: NoSLA: NoPause Abuse: YesDemo Requirement: 200thLeaderboardModerators: Betsruner, BiSaXa, Fridge
Celeste Mode
Complete the game in Celeste Mode.
OOB: NoSLA: NoPause Abuse: YesDemo Requirement: 10thLeaderboardModerators: Betsruner, BiSaXa, Fridge
Fog%
Complete the game in Fog%.
OOB: NoSLA: NoPause Abuse: YesDemo Requirement: 200thLeaderboardModerators: Betsruner, BiSaXa, Fridge
mat_ambient_light_r/g/b and mat_fullbright are banned. On top of the demo requirement, video evidence is required for all runs.
Reverse%
Complete the game in Reverse Mod.
OOB: NoSLA: NoPause Abuse: YesDemo Requirement: 200thLeaderboardModerators: Betsruner, BiSaXa, Fridge

Portal Stories: Mel

General

Demos are not recorded in any Mel category, since they cause some maps to break. SAR or SourceSplit must be used for accurate timing.

Timing

Story Mode - Inbounds
Complete the whole campaign in story mode.
OOB: NoSLA: YesPause Abuse: YesDemo Requirement: N/ALeaderboardModerators: Betsruner, Nidboj132
Story Mode - OOB
Complete the whole campaign in story mode.
OOB: YesSLA: YesPause Abuse: YesDemo Requirement: N/ALeaderboardModerators: Betsruner, Nidboj132
Advanced Mode - Inbounds
Complete the whole campaign in advanced mode.
OOB: NoSLA: YesPause Abuse: YesDemo Requirement: N/ALeaderboardModerators: Betsruner, Nidboj132
Advanced Mode - OOB
Complete the whole campaign in advanced mode.
OOB: YesSLA: YesPause Abuse: YesDemo Requirement: N/ALeaderboardModerators: Betsruner, Nidboj132

Portal Reloaded

General

All Portal Reloaded categories ban the developer 1 command due to an unnatural advantage it provides on some maps.

Timing

No SLA
Complete the entire campaign with either ending.
OOB: NoSLA: NoPause Abuse: YesDemo Requirement: 25thLeaderboardModerators: Betsruner, BiSaXa, Fridge
developer 1 is banned.
SLA
Complete the entire campaign with either ending.
OOB: YesSLA: YesPause Abuse: YesDemo Requirement: 25thLeaderboardModerators: Betsruner, BiSaXa, Fridge
developer 1 is banned.

Aperture Tag

Timing

Inbounds No SLA
Complete the entire campaign.
OOB: NoSLA: NoPause Abuse: YesDemo Requirement: 10thLeaderboardModerators: Betsruner, Fridge