A GUI application to sort, rename, filter and backup replays from the popular RTS-game Starcraft Brood War.
- Parse replays by importing replay files from multiple directories. View the parsed replays in the replay list view.
- You can create ignore files and use them to ignore replays while parsing.
- Categorize or "sort" replays into a new directory by choosing from the following list of criteria: player name, match-up, map, duration and game type.
- You can preview sort output
- Rename replays according to a special syntax allowing you to extract information such as player names, match-up, race, duration, date,... You can rename replays as is, or also move them into a new output directory.
- Filter parsed replays on player-name, winner, race, match-up, duration, date or map. Will support units and build orders in the near future as well!
- Backup entire directories of replays and have the possibility to always recover them exactly as they were! You can easily share database files with each other manually. In the future there might be built-in way.
- Export parsed replays to csv files
Currently there are 3 ways to get the program:
- Use the setup.exe installer from .RAR archive
- Use the non-setup based .exe from the .RAR archive labelled as such
- Compile from source
You can find the latest release here: https://github.com/CrispyDrone/BWSort/releases/tag/v1.1.1
After an optional installation, run the .exe file.
First things first, you will have to parse replays. Choose a directory by clicking the set directory button, and next click on the Add button:
You can repeatedly import replays from directories and they will show up in the listbox at the bottom of the screen. You can remove replays you don't want to parse by right clicking on them and choosing "Remove file". You can see that all the replays have a yellow box in front of them. This means these replays are waiting to be parsed. Next, click on parse and wait until all replays have been parsed. Once this finishes, a green box will indicate success, whereas a red box will indicate a failure to parse the replays.
If there are certain replays that you never want to parse, you can make use of an ignore file. Click on the Create - Edit
button at the right side of the window. This will open a new buffer for you to create an ignore file in, or it will edit the ignore file that's configured in the advanced settings.
You can click on the Import directory
to import all the filenames (recursively) in that directory. You can click on the Select filenames
to select multiple replays you would like to ignore. Note that you specify filenames, however the ignore functionality works based on file hashes. This means that it will ignore these replays you've specified, regardless of what the actual file name is!
After you've parsed replays, you can see your results in the Search tab:
A crown icon indicates the winning players. An eye icon indicates observers. You can see the different teams that were part of the game. Unfortunately, team identification is currently buggy due to known issues with the replay parser.. Each player's race is visible and there are some additional columns showing the map, duration, the date the game was played on, and the path of the replay file.
You can filter this list of replays by typing filter expressions in the search bar. Aside from using this search function to find a specific replay, you can also use the filtered output as input for the sorting and renaming actions, but more on that later.
As you can see, many maps don't have an actual image yet but instead a placeholder. If you want to, you can download images and add them to the images/maps
folder. In the future, this won't be necessary any more since I will use the data present inside the replay files and Brood War's MPQ file. Name the file exactly like the map but use _
instead of spaces and remove any special characters such as '
. Check the map section for a list of the expected file names of all maps.
To use a filter you specify its code followed by a colon. You combine individual filters by separating them with a comma. To reset all filters and get back the original full list of replays, just use an empty filter and press enter.
Filter | code |
---|---|
Map | m |
Player | p |
Duration | du |
Match-up | mu |
Date | d |
For each of the following filters you can combine different conditions by using the vertical bar |
:
-
Filter on map by using the
m:<mapname>
filter.You can specify any part of the map name and it will find it. The
<mapname>
can also be a regular expression allowing for more advanced usage. -
Filter on player by using the
p:<playername>
filter. This filter allows you to optionally specify whether this player needs to be a winner& isWinner
, and which race they need to be& race=<race>
.You can search for any part of a player name. You can also add the
& isWinner
construct to filter out replays where this player lost, unfortunately as mentioned before due to the buggy behavior of the parser this doesn't work that well yet.. You can also further restrict the set of replays to only show those where this player is of a specific race by using the& race=<race>
construct, where race can be either the full name or the first letter (z
,t
, orp
). You can search for multiple players at the same time by separating them with a comma. So for example:p:MJ & race=z, Sadeas & race=p
would only give back replays that contain both a player whose name containsMJ
and played as zerg, and a player with a name that containsSadeas
and who played as protoss. -
Filter on duration by using the
du:<duration>
filter. This filter allows you to search for replays lesser than, greater than or equal a specific duration. You can also search for replays between 2 durations.You can use specify digital or written durations and use the following operators
<
,<=
,>
,>=
,=
to specify ranges or an exact match. For the digital pattern you can specify minutes and seconds, so for example:5:00
would mean 5 minutes. You can also specify hours like so01:03:15
which would mean 1 hour, 3 minutes and 15 seconds. The written durations are of the following formatx<hours>y<minutes>z<seconds>
where any element can be optional:<hours>
: can be eitherh
,hrs
, orhours
<minutes>
: can be eitherm
,min
, orminutes
<seconds>
: can be eithers
,sec
, orseconds
It is also possible to search for replays between 2 durations, use the
between x-y
construct for this.x
andy
can be any format previously discussed. -
Filter on match-up by using the
mu:<matchup>
filter. This filter allows you to search for replays matching the desired match-up.You can specify a match-up of the format
xvx
where x can be eitherz
,t
,p
, or.
. The latter is a wildcard meaning it can be any race. Currently it's not possible to search for "broken" match-ups where there's only a single team. -
Filter on date by using the
d:<date>
filter. You can use absolute and relative dates.You can specify relative or absolute dates to filter replays. Same as for durations the operators
<
,<=
,>
,>=
,=
are available. By default the=
is applied. Note the dates represent a specific point in time. This means that when you say<4 months and 3 weeks ago
it does not mean "less than 4 months and 3 weeks ago" but instead it means before 4 months and 3 weeks ago! The digital pattern is as follows<year><sep><month><sep><day>
:<year>
: Mandatory, can be 2 or 4 digits.<month>
: Optional, can be 1 or 2 digits.<day>
: Optional, can be 1 or 2 digits.<sep>
: Separator, can be-
,.
or/
.
The relative dates support many more options:
- You can specify
this
orlast
together withyear
,month
orweek
. - You can specify
today
oryesterday
- You can specify any month of the year literally such as
january
. - You can use a date of the format
<number><time-unit> ago
for example such as5 months ago
, or<number><time-unit> and ... ago
for example5 months and 3 weeks ago
- 1 week is counted as 7 days
- 1 month is counted as 31 days
- 1 year is counted as 365 days
- Finally there is also the
previous <number><time-unit>
. This allows you to more easily refer to a time range of a specific time unit. For exampleprevious 2 weeks
would span the period between the ending of last week and the beginning of 2 weeks ago.
Finally, same as for the duration filter, you can use the
between x and y
construct to filter replays between 2 dates.x
andy
can be any format previously described. Note thatbetween
works inclusively which means that it acts as if you stated>= date1 and <= date2
.
-
The between construct filters between 2 dates, inclusively.
-
Use the greater than or equal operator to specify that you want all replays later than the point in time that follows it. Note As mentioned before, this might be confusing at first, so it's best to think of
>
as "later than" and<
as earlier than. -
Use the less than operator to specify that you want all replays earlier than the point in time that follows it. Note As mentioned before, this might be confusing at first, so it's best to think of
>
as "later than" and<
as earlier than. -
Use previous if you want to find all replays of the previous X days, weeks, months or years excluding the current day, week, month, or year. So for example, the previous 2 weeks would find all replays between Monday of 2 weeks ago and Sunday of last week.
After parsing, you have the option to sort or categorize your replays to an output directory of your choice. You can either decide to sort the entire set of replays you've parsed, or to first filter them appropriately and then selecting the Select as input
checkbox.
On the sort tab you specify the output directory, and can drag the blocks that represent the sort criteria into the order you want. To activate a sort criteria, click on it, it should turn blue. After you've decided on the sort criteria you want to use, you can tick off the preview
checkbox and press the sort button below. This will render a preview inside the view. In case you also want to rename your replays while sorting, uncheck the Keep original replay names
checkbox and you will be able to specify a renaming format. For the syntax, check the renaming syntax section.
The following criteria are currently supported:
- Playername: You can specify whether to make folders for winner-only, loser-only, both or none (this latter essentially allows you to extract/copy all replays from a directory tree, and rename them according to a custom format).
- Map
- Duration: You can specify your own intervals.
5 10 30
will result in the intervals 0-5min, 5-10min, 10-30min, and 30+min. - Matchup: You can specify which game types you want to include since it might not be so useful to know the "match-up" for a UMS-game.
- Gametype
Finally it is possible to combine multiple sort criteria. For example map playername
will sort your replays first on the map the game was played on, and then create additional folders per player name within the map folder.
Since it can be quite unwieldy to navigate the sort result, you can right click on a node and perform a set of actions to help you, you can do the one of the following:
Expand all
: Expand all the nodes in the tree.Collapse all
: Collapse all nodes in the tree.Expand level
: Reveals all nodes of a single level in the tree.Collapse level
: Collapses all nodes belonging to a single level in the tree.Collapse level recursively
: Collapses all nodes below a single level in the tree.Expand node
: Expands a single node recursively.Collapse node
: Collapses a single node recursively.Find node by name
: Search nodes matching a specific regex based on the name that's visible in the tree.
Find node by the full name (name of current node and all the parent nodes combined) is currently not possible because of technical reasons, but it shouldn't be too hard to rectify in future version.
Search for the nodes matching fighting spirit
.
The number of hits is shown in the status bar. You can use the arrows at the top right side of the tree view to easily jump to respectively the first, previous, next, and last search result.
You can now rename replays after parsing, either into an output directory or in place. You can either rename all replays, or only those that matched the latest used filter by ticking the Select as input
checkbox on the search tab. If you want to experiment with the syntax without actually renaming your replays, make sure to tick off the Preview
checkbox. After renaming, the transformation from the old to new filename will be shown in the output view. You can toggle between filenames only (hamburger icon) and the entire filepath (directory tree icon) by clicking on the button next to the 2 arrows. As you might have guessed, these 2 arrows are buttons for undoing and redoing a rename. The number of actions you can undo or redo can be configured in the advanced settings but by default is 10. If you are executing renames on many replays, be aware that this has the potential to quickly increase memory usage of BWSort.
It is always possible to return to how the replays were named originally. Just tick off the checkbox Restore original replay names
and execute!.
You can right click on a replay to open it in explorer or to select it in the search tab.
You can rename your replays by using special placeholders that start with the /
character, currently BWSort supports the following placeholders:
/WR
or/Wr
: Stands for WinningRaces, which will be replaced by a comma separated list of the races of the winning players./LR
or/Lr
: Stands for LosingRaces, which will be replaced by a comma separated list of the races of the losing players./R
or/r
: Stands for Races, which will be replaced by a comma separated list of the races of all players (excluding observers)./WT
or/Wt
: Stands for WinningTeam, which will be replaced by a comma separated list of all the names of the winning players./LT
or/Lt
: Stands for LosingTeams, which will be replaced by a comma separated list of all the names of the losing players. Each team will be surrounded by parentheses./T
: Stands for Teams, which will be replaced by a comma separated list of all the names of all players, excluding observers. Each team will be surrounded by parentheses./m
: Stands for map. This will print a short form i.e. the first letter of each word. This is sufficiently recognizable for most maps however some maps will have strange abbreviations./M
: Stands for map. This will print the long form i.e. the full map name./MU
or/Mu
: Stands for Match-up. This will be replaced by the match-up./d
: Stands for date. This will be replaced by the date in the year-month-day format./D
: Stands for datetime. This will be replaced by the datetime in a format that resembles ISO-8601, without the timezone information, an example would be2019-05-25T160510
which means 5 minutes and 10 seconds past 4 in the afternoon on 25th of May, 2019./du
: Stands for duration. This will be replaced by the duration of the replay in a short format, an example would be01_05_15
which means 1 hour, 5 minutes and 15 seconds./DU
or/Du
: Stands for duration. This will be replaced by the duration of the replay in a longer format by writing out the time units (hours, minutes, seconds). An example would be1 hour 5 minutes 15 seconds
./F
: Stands for game format. This will be replaced by the team grouping to give an indication of what kind of game it was i.e. 1v1, 2v2, 3v3.../gt
: Stands for game type. This will be replaced by the actual game type as known by Starcraft such as TopVsBottom (TvB), Melee (M), OneOnOne (OvO),... in an abbreviated form./GT
or/Gt
: Stands for game type. This will be replaced by the full name of the game type./P
: Stands for players. This will be replaced by a comma separated list of all players including observers./p
: Stands for players. This will be replaced by a comma separated list of all players excluding observers./</>
: Stands for player info block. In this block you can specify arguments that will be applied to all players of the replay. This will return a list of the requested properties for each player, grouped by teams. You can add literal characters inside the block for example to surround the race with parentheses./p
: Stands for player. This will be replaced by the name of the player./R:
Stands for race. This will be replaced by the full name of the race of the player./r
: Stands for race. This will be replaced by the first letter of the race of the player./W
: Stands for winstatus. This will be replaced byWinner
orLoser
depending on whether the player is a winner or loser./w
: Stands for winstatus. This will be replaced byW
orL
depending on whether the player is a winner or loser.
- The following placeholders allow you to specify a non-negative (natural) integer. This corresponds to the identifier a player has in the game, unfortunately these are unpredictable.
/Px
: Stands for player x. This will be replaced by the name of the x'th player./Rx
: Stands for race x. This will be replaced by the full name of the race of the x'th player./rx
: Stands for race x. This will be replaced by the first letter of the race of the x'th player./Wx
: Stands for winstatus x. This will be replaced byWinner
orLoser
depending on whether the x'th player is a winner or loser./wx
: Stands for winstatus x. This will be replaced byW
orL
depending on whether the x'th player is a winner or loser.
/O
: Stands for original. This will be replaced by the original name of the replay./c
: Stands for counter. This will increment on each replay that is being renamed./C
: Stands for counter. This is exactly the same asc
aside from padding 0's to the left to give a consistent width to the counter.
You can use these placeholders in an otherwise literally interpreted sentence: Defiler tournament - /d - /Mu - /</p /r /w>
which would produce replays with names such as:
Defiler tournament - 2019-05-03 - ZvZ - Jaedong Z W, CrispyDrone Z L
Defiler tournament - 2019-05-03 - PZvPZ - Bisu P W, Jaedong Z W, CrispyDrone Z L, AbstractDaddy P L
-
Example using the
/C
construct that allows numbering of replays. -
Example using the
/p
construct which extracts all players excluding observers.
You can backup directories containing replays. First you will have to create a new database file; you can give it a name and create it in a specific directory, it will be automatically selected as the active database.
To create a backup, press the create button at the bottom of the screen. A new window will pop up:
You can specify a name and an optional comment. To add replays to this backup click on the import button. At the moment, you can only import replays from one directory! This is because when restoring from a backup, it needs to be able to write to a single directory. Maybe in the future, there will be support to make it so you can import replays from multiple directories, and it will congregate the multiple directories under one parent directory when executing the restore. To now create a backup, click on the Create backup
button.
After you've created a backup, you can inspect it. You'll be able to see its name, the comment, how many replays, which directory you backed up, on which date, and finally the directory and file hierarchy of the folder you backed up.
Once you remember what this backup was all about, and you need to restore replays from it, you can press the restore button. Just select a directory and click on the restore button!
You can delete a backup in case you don't need it any more. Select the Delete orphan replays
in case you want to also delete all replays that are not part of any backup.
Finally, there are some extra buttons in the panel on the side:
- Empty database: If for some reason you want to delete all the data in the database, you can click on this button.
- Delete database: This will delete the database file, and from the list.
- Clean database list: This will verify whether the databases still exist and if not, delete them from the list.
- Add existing database: If you have an existing database that's not part of the list (someone shared it with you for example, or you moved the database to another location), use this button.
You can now export replays. Currently the only supported format is CSV. For exporting to csv there are 3 configuration values available:
- Delimiter: the character that is used to delimit fields.
,
by default. - Quote character: the character that will be used to quote fields that have a delimiter in them.
"
by default. - Escape character: the character that will be used to escape quotes.
\
by default.
- Max undo level: This setting controls the maximum number of undos or redos you can do.
- Check for updates on startup: Check to check at startup whether a newer version is available.
- Remember parsing directory: Check to remember the last-used parsing directory.
- Include subdirectories by default while parsing: Check to always include subdirectories when discovering replays.
- Load replays on startup: Check to start parsing replays automatically from the last-used parsing directory. This option requires Remember parsing directory to be checked.
- Check for duplicates when parsing additional replays: When checked, will ensure no duplicate replays are parsed.
- Ignore file path: The location of the ignore file you want to use. You still need to check the
Ignore specific files and directories
checkbox when parsing for it to have an effect. - Logging directory: The directory to to write logging information to. This can be helpful to solve bugs and strange behavior.
- Generate intermediate folders during sorting: When using multiple sort criteria, by default it will generate intermediary folders named after the criteria, if you don't like these folders, uncheck this option.
- For now only replays of version 1.18 or later are supported. I haven't had the time yet to improve the parser. If anyone wants to help me implement this, feel free to contact me or make a pull request.
- There will be errors for certain criteria like player name. If you specify to make a folder for the winner or for both, but the replay doesn't have a winner, it will fail to sort this replay.
- Another common error is the "unable to distinguish player from observer", which means that not a single player did a build, unit training, or unit morph action. In most cases, this is a replay of a few seconds long where none of the players did a single action, so you can safely ignore these too.
- If a replay shows up in a non-terminal folder (in case of multiple sort criteria), this means one of the errors as mentioned above occurred, meaning it was impossible to determine the winner, the match-up,...
Due to the possible presence of some bugs and it being hard to verify edge case behavior, I suggest either not working on your original replay folder but instead on a copy or using the built-in backup functionality!
- The parser has many issues which affect:
- team identification
- matchup identification
- observer identification
- build order identification
- the action list. See the towards the future section.
- Using the
Use as input
functionality will result in a wrong reporting of the number of replays sorted or renamed. - When navigating the sort output with the arrow keys. The up arrow key will get stuck on random nodes after using any of the context menu actions. I think this is a framework bug, which I can circumvent by writing my own event handlers for the up arrow key. But this would require some refactoring that I haven't gotten around to.
- Add additional filters for the search tab based on units, and user defined build orders.
- Allow sorting in place and add possibility to undo/redo.
- Add additional sort criteria such as
date
,build order
,game format
,... - Add replay detail view with action history (i.e. build order) and some basic stats and graphs.
- Add map rendering in the replay list view based on map data inside the replay instead of needing to use image files. This requires sprites that are present inside a BW installation's MPQ file.
- Try to improve the parsing algorithm which will mean more reliable sorting, renaming, filtering,...:
- This will fix team identification which is currently very buggy. Players are often reported to be on the same team even though they are opponents.
- Match-up identification as a result is also buggy since players are not separated into the correct teams.
- It will fix observer identification since actions in many instances aren't parsed correctly
- It will fix the action list allowing much better insight into the build order of a replay
- ...
- Support for 1.16 replays
- Allow backups of multiple directories at the same time.
- General bug fixing.
- Other possible changes:
- Support searching on full names in the sort output view.
- Support searching on replay content in the sort, and rename output view.
- Add option to "pop-out" the sort output and rename output views.
- Allow "merging" of sort outputs into the same folder. Currently it will always write to new directories.
- Add option to allow the "unique number" generation to happen at the end of sorting, so all replays in the same folder have sequential numbering.
- Add help tooltips
- Add a rename symbol box similar to scelight or sc2gears so users can select a renaming syntax item by using their mouse.
- Improve the options menu.
- Add filtering and sorting for observers.
- Add a dark theme.
- Improve the application's visual style and layout.
- Add configuration settings inside search view tab to be able to disable crown icon,...
- Add additional useful context actions everywhere in the application, such as the
Launch in starcraft
action. - Improve UI for working with ignore files.
- Add global undo/redo buttons with information on what will be "redone/undone".
- Add option to pin replays in search tab so they always stay at the top.
- Add option to remove replays from the search tab (temporarily) to make it easier to craft a set of replays to rename or sort.
At the end of 2017 I had just started to learn how to program and was still playing some Starcraft here and there. I was severely annoyed at the lack of support from Blizzard in regards to managing replays. I thought this could be the ideal way to gain some experience as a new developer and at the same time help out the Starcraft community. As it was my first real project ever, and many of the important design decisions were made during this period when I had absolutely no experience, the code base is very badly designed and a pain to work with.
- Disable
Export
button while exporting is going on to prevent exceptions - Fix progress reporting to actually show percentage instead of the number of replays that have been processed
- Added export to csv functionality
- Fixed application version and some errors in the README file.
- Fixed version checking from failing on versions including a patch number.
Bug fixes!
- Fixed filtering on player names, it was broken.
- Cancel button in the create ignore file window didn't work.
- Changing logging settings wouldn't take effect until after restarting the application.
- Disabling logging and resetting ignore file location wouldn't work, it would remember the old value.
- Allow whitespace when filtering on maps, and duration to deliver a better user experience.
- Rewrote the renaming feature. It is now much more flexible and supports many more options.
- Removed support to rename the last sort since it was too complex and made some aspects of the UI confusing.
- Updated graphical user interface to be more intuitive.
- Added a view to discover replay files before parsing allowing you to craft the set of replays you want to parse i.e. you can import from multiple directories and remove individual replays.
- Updated the layout of the sorting and renaming tabs.
- Added a window that will render the output of the sort or rename action.
- Added support for previewing replay sorts.
- Added support for previesing replay renamings.
- Added advanced settings window that allows you to set options such as remember last parsing directory, parse on startup,...
- Added "ignore" file functionality, which allows you to prevent parsing of specific replays based on file hashes.
- Added a parsed replay list that shows information such as players, winners, races, map, filepath,...
- Added filter functionality to search the parsed replay list. Currently supported filters are player name, race, winner, map, duration, match-up, date. You can then use this filtered set of replays for sorting or renaming purposes.
- Added undo/redo functionality when renaming replays.
- Added backup functionality that allows you to backup replay folders. This will make sure you can always restore your replay folders just the way they were at time of backup.
- Added automatic checking for newer versions.
- Added a help section that renders this README file inside BWSort.
- Added support for renaming replays without sorting.
- Rename replays in place
- Rename the last sort
- Rename replays to an output directory
- Added support to "undo" (i.e. reset) replay names to their originals at time of parsing.
- Fixed major issue with nested sorts resulting in replays being sorted into the wrong folder, and receiving the wrong names.
- Added a simple graphical user interface
- Fixed issue with wrong replays being sorted/renamed in case you opted to not move replays that encountered errors during parsing.
- Added the possibility to specify output directories for "bad replays" and sorting.
First release:
- Sort replays according to criteria, and optionally rename them according to a custom format.
This project is licensed under the GNU GPLv3 license.
Many thanks to Excolo for porting the replay parser to C#. You can find the original project here: https://github.com/Excolo/SCReplayFileParser
815.jpg
acheron.jpg
alchemist.jpg
alternative.jpg
andromeda.jpg
another_day.jpg
arcadia.jpg
arizona.jpg
arkanoid.jpg
ashrigo.jpg
athena.jpg
autobahn.jpg
avalon.jpg
avant_garde.jpg
azalea.jpg
aztec.jpg
baekmagoji.jpg
beltway.jpg
benzene.jpg
bifrost.jpg
blade_storm.jpg
blaze.jpg
blitz.jpg
block_chain.jpg
bloody_ridge.jpg
blue_storm.jpg
byzantium.jpg
camelot.jpg
carthage.jpg
central_plains.jpg
chain_reaction.jpg
chariots_of_fire.jpg
charity.jpg
chupung-ryeong.jpg
circuit_breaker.jpg
colosseum.jpg
crimson_isles.jpg
cross_game.jpg
crossing_field.jpg
dmz.jpg
dahlia_of_jungle.jpg
dantes_peak.jpg
dantes_peak_se.jpg
dark_sauron.jpg
dark_stone.jpg
deep_purple.jpg
demian.jpg
demons_forest.jpg
desert_fox.jpg
desperado.jpg
destination.jpg
detonation.jpg
dream_of_balhae.jpg
eddy.jpg
el_niño.jpg
electric_circuit.jpg
elysion.jpg
empire_of_the_sun.jpg
enter_the_dragon.jpg
estrella.jpg
eye_in_the_sky.jpg
eye_of_the_storm.jpg
face_off.jpg
fantasy.jpg
fighting_spirit.jpg
flight-dreamliner.jpg
forbidden_zone.jpg
forte.jpg
fortress.jpg
fortress_se.jpg
full_moon.jpg
gaema_gowon.jpg
gaia.jpg
gauntlet_2003.jpg
geometry.jpg
glacial_epoch.jpg
gladiator.jpg
gold_rush.jpg
gorky_island.jpg
grand_line.jpg
grand_line_se.jpg
great_barrier_reef.jpg
ground_zero.jpg
guillotine.jpg
hall_of_valhalla.jpg
hannibal.jpg
harmony.jpg
heartbreak_ridge.jpg
hitchhiker.jpg
holy_world.jpg
holy_world_se.jpg
hunters.jpg
hwangsanbul.jpg
hwarangdo.jpg
icarus.jpg
incubus.jpg
indian_lament.jpg
into_the_darkness.jpg
iron_curtain.jpg
jade.jpg
jim_raynors_memory.jpg
judgment_day.jpg
jungle_story.jpg
katrina.jpg
korhal_of_ceres.jpg
la_mancha.jpg
legacy_of_char.jpg
loki.jpg
longinus.jpg
lost_temple.jpg
luna.jpg
martian_cross.jpg
match_point.jpg
medusa.jpg
mercury.jpg
mercury_zero.jpg
monte_cristo.jpg
monty_hall.jpg
monty_hall_se.jpg
moon_glaive.jpg
multiverse.jpg
namja_iyagi.jpg
nemesis.jpg
neo_arkanoid.jpg
neo_aztec.jpg
neo_bifrost.jpg
neo_blaze.jpg
neo_electric_circuit.jpg
neo_forbidden_zone.jpg
neo_forte.jpg
neo_ground_zero.jpg
neo_guillotine.jpg
neo_hall_of_valhalla.jpg
neo_harmony.jpg
neo_jungle_story.jpg
neo_legacy_of_char.jpg
neo_requiem.jpg
neo_silent_vortex.jpg
neo_sylphid.jpg
neo_transistor.jpg
neo_vertigo.jpg
new_bloody_ridge.jpg
new_heartbreak_ridge.jpg
new_sniper_ridge.jpg
nostalgia.jpg
odd-eye.jpg
odin.jpg
old_plains_to_hill.jpg
othello.jpg
outlier.jpg
outsider.jpg
outsider_se.jpg
overwatch.jpg
paradoxxx.jpg
parallel_lines.jpg
paranoid_android.jpg
pathfinder.jpg
peaks_of_baekdu.jpg
pelennor.jpg
persona.jpg
pioneer_period.jpg
plains_to_hill.jpg
plasma.jpg
polaris_rhapsody.jpg
python.jpg
r-point.jpg
ragnarok.jpg
raid_assault.jpg
requiem.jpg
return_of_the_king.jpg
reverse_temple.jpg
ride_of_valkyries.jpg
rivalry.jpg
river_of_flames.jpg
roadkill.jpg
roadrunner.jpg
rush_hour.jpg
seongangil.jpg
shin_peaks_of_baekdu.jpg
showdown.jpg
silent_vortex.jpg
sin_815.jpg
sin_chupung-ryeong.jpg
sin_gaema_gowon.jpg
sin_peaks_of_baekdu.jpg
sin_pioneer_period.jpg
sniper_ridge.jpg
snowbound.jpg
space_odyssey.jpg
sparkle.jpg
sylphid.jpg
symmetry_of_psy.jpg
taebaek_mountains.jpg
tau_cross.jpg
tears_of_the_moon.jpg
the_eye.jpg
the_hunters.jpg
the_huntress.jpg
third_world.jpg
tiamat.jpg
tornado.jpg
transistor.jpg
triathlon.jpg
tripod.jpg
troy.jpg
tucson.jpg
u-boat.jpg
ultimatum.jpg
un_goro_crater.jpg
usan_nation.jpg
valley_of_wind.jpg
vampire.jpg
vertigo_plus.jpg
whiteout.jpg
wishbone.jpg
wuthering_heights.jpg
xeno_sky.jpg
zodiac.jpg