1<!DOCTYPE html> 2<html> 3<head> 4 <title>TFC Maps Archive</title> 5 6 <!-- Bootstrap 4 CSS --> 7 <!-- <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.24/css/jquery.dataTables.css"> --> 8 <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.25/css/jquery.dataTables.min.css"> 9 <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css'> 10 <!-- <link rel='stylesheet' href='https://cdn.datatables.net/1.10.22/css/dataTables.bootstrap4.min.css'> --> 11 12 <!-- My CSS --> 13 <link rel='stylesheet' href='./css/main.css'> 14 <link rel='icon' href='./favicon.ico?' type='image/x-icon'> 15 16</head> 17<body> 18 <div class='content'> 19 <a href='./' style='text-decoration: none'> 20 <div class='head'> 21 <h1><img src='../images/tfc_logo_tp.png' class='tfc_logo'>TFC Maps Archive</h1> 22 </div> 23 </a> 24 25 <div class='intro'> 26 <p> 27 This is an archive of maps for <i>Team Fortress Classic</i>, a 1999 class-based shooter and modification of the original <i>Half-Life</i>. 28 The archive consists of <b>5,000+</b> custom, fan-made maps that I've accumulated over the years. TFC had an incredibly creative community of map makers. 29 I wanted to preserve their work, even if TFC is no longer actively played. 30 </p> 31 <p>You can use the table below to search for information about the maps. You can use the following links to download the maps as one complete file or as a collection of individual files. Also, the maps are downloadable as packaged ZIP files by selecting them from the table.</p> 32 <p class='repo_link'>DOWNLOAD MAPS</p> 33 <div class='link_table_div'> 34 <table class='download_options_table'> 35 <tr class='first_row'> 36 <td class='download_options_desc'>One complete file (.7z):</td> 37 <td class='download_options_link_single'><a href='https://drive.google.com/file/d/1OORy1_U25ycF7lWtd0aeAVifxjpwZziY/view?usp=share_link' target='_blank'>Google Drive</a> <b>|</b> <a href='https://mega.nz/file/UHBiQbyK#tsgA9EgykPC4k9XisNoKmI-fFJKLsubO4vREwtgpRSs' target='_blank'>MEGA</a> <b>|</b> <a href='https://www.mediafire.com/file/7h66b4d5l06wzr8/TFC_Maps_Archive.7z/file' target='_blank'>MediaFire</a></td> 38 </tr> 39 <tr> 40 <td class='download_options_desc'>Individual resource files:</td> 41 <td class='download_options_link_loose'><a href='https://mega.nz/folder/cK5RGKAR#MwPZ_9S3lRWvT4z7CzegJA' target='_blank'>MEGA</a></td> 42 </tr> 43 </table> 44 </div> 45 <p class='repo_version'>Last updated: <b>October 3, 2026</b> (<a href='./changelog.txt' target='_blank'>changelog</a>)</p> 46 <p class='request'>Have any custom maps that aren't on this list? <a href='./submit_maps.php'><b>Submit them here.</b></a></p> 47 </div> 48 49 50 51 <div class="container"> 52 <div class="row"> 53 <div class="col-12 m-auto"> 54 <table class='cell-border row-border stripe hover' id='mapTable'> 55 <thead> 56 <th> Map (<a href='#' class='map_tooltip'>?</a>)<br> 57 <div class="filter-controls"> 58 <input type="text" placeholder="Filter map name" class="form-control" id="filterMap"> 59 <span id="clearfilterMap" class="cancel-btn">✖</span> 60 </div> 61 </th> 62 63 <th> Game Type (<a href='game_types' class='game_type_tooltip' target='_blank'>?</a>)<br> 64 <div class="filter-controls" 65 <label for="filterGameType"></label> 66 <select class="form-control" id="filterGameType"> 67 <option value="">All</option> 68 <option value="Arena">Arena</option> 69 <option value="Attack and defend">Attack and defend</option> 70 <option value="Capture the flag">Capture the flag</option> 71 <option value="Climb">Climb</option> 72 <option value="Destruction">Destruction</option> 73 <option value="Flag run">Flag run</option> 74 <option value="Hunted">Hunted</option> 75 <option value="Kill the carrier">Kill the carrier</option> 76 <option value="King of the hill">King of the hill</option> 77 <option value="Push CTF">Push CTF</option> 78 <option value="Racing">Racing</option> 79 <option value="Reverse CTF">Reverse CTF</option> 80 <option value="Skill">Skill</option> 81 <option value="Sniper war">Sniper war</option> 82 <option value="Social/cooperative">Social/cooperative</option> 83 <option value="Team deathmatch">Team deathmatch</option> 84 <option value="Territorial control">Territorial control</option> 85 <option value="Vote">Vote</option> 86 </select> 87 </div> 88 </th> 89 90 <th> Author<br>
91 <div class="filter-controls"> 92 <input type="text" placeholder="Filter author" class="form-control" id="filterAuthor"> 93 <span id="clearfilterAuthor" class="cancel-btn">✖</span> 94 </div> 95 </th> 96 97 <th> Year (<a href='#' class='year_tooltip'>?</a>)<br> 98 <div class="filter-controls"> 99 <input type="text" placeholder="Filter year" class="form-control" id="filterYear"> 100 <span id="clearfilterYear" class="cancel-btn">✖</span> 101 </div> 102 </th> 103 104 <th> Status (<a href='#' class='status_tooltip'>?</a>)<br> 105 <div class="filter-controls" 106 <label for="filterStatus"></label> 107 <select class="form-control" id="filterStatus"> 108 <option value="">All</option> 109 <option value="Working">Working</option> 110 <option value="Broken">Broken</option> 111 </select> 112 </div> 113 </th> 114 115 <!-- Hidden headers for columns that don't appear in the table. --> 116 <th> Col 5</th> 117 <th> Col 6</th> 118 <th> Col 7</th> 119 <th> Col 8</th> 120 121 <th> Date Added<br> 122 <div class="filter-controls"> 123 <input type="text" placeholder="Filter date added" class="form-control" id="filterDateAdded"> 124 <span id="clearfilterDateAdded" class="cancel-btn">✖</span> 125 </div> 126 </th> 127 </thead> 128 <tbody> 129 <tr> 130 </tr> 131 </tbody> 132 </table> 133 </div> 134 </div> 135 </div> 136 137 <div class='disclaimer'> 138 <p>This is a fan site and is in no way affiliated with or endorsed by Valve Corporation.</p> 139 </div> 140 </div> 141 142 <!--
142<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
142 --> 143
143<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
143 144
144<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
144 145
145<script src='https://cdn.jdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css'></script>
145 146 <!--
146<script src='https://cdn.datatables.net/1.10.22/js/dataTables.bootstrap4.min.js'></script>
146 --> 147 148 <!-- CDN jQuery Datatable --> 149 <!--
149<script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.24/js/jquery.dataTables.js"></script>
149 --> 150
150<script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.25/js/jquery.dataTables.min.js"></script>
150 151 152 <div class='tipjar'> 153
153<script type='text/javascript' src='Widget_2.js'></script>
153 154
154<script type='text/javascript'>kofiwidget2.init('Tips', '#CEAF4A', 'P5P6IOMK4');kofiwidget2.draw();</script>
154 155 </div> 156 157</body> 158</html> 159
160<script> 161 // Limit page numbers in pagination controls. 162 $.fn.DataTable.ext.pager.numbers_length = 5; 163 164 $(document).ready(function() { 165 166 // Function to get URL parameters 167 function getUrlParameter(name) { 168 name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); 169 var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); 170 var results = regex.exec(location.search); 171 return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); 172 } 173 174 // DataTable initialization 175 var dataTable = $('#mapTable').DataTable( { 176 'bPaginate': true, 177 'iDisplayLength': 10, 178 'processing': true, 179 'serverSide': true, 180 'ajax': './serv_proc/server_processing.php', 181 'bAutoWidth': false, 182 183 // 'search': { 184 // 'regex': true 185 // }, 186 187 // Adds pagination to top. 188 // dom: 'lpftrip', 189 dom: "<'row'<'col-sm-3'l><'col-sm-4'f><'col-sm-5'p>>" + 190 "<'row'<'col-sm-12'tr>>" + 191 "<'row'<'col-sm-5'i><'col-sm-7'p>>", 192 193 columnDefs: [ 194 { type: 'text', targets: '_all' }, // Set default column type to text. 195 { targets: [0, 1, 2, 3, 4, 9], searchable: true, visible: true }, // Enable filtering for visible columns. 196 { targets: [5, 6, 7, 8], visible: false } // Hide these columns. 197 ] 198 } ); 199 200 // Function to update URL parameters 201 function updateUrlParameter(key, value) { 202 // Get current URL parameters 203 var urlParams = new URLSearchParams(window.location.search); 204 205 // Update or add the parameter 206 if (value === '') { 207 urlParams.delete(key); 208 } else { 209 urlParams.set(key, value); 210 } 211 212 // Replace the current state in the browser history 213 var newUrl = window.location.pathname + '?' + urlParams.toString(); 214 history.replaceState(null, null, newUrl); 215 } 216 217 // Function to set filter controls based on URL parameters 218 function setFilterControlsFromUrl() { 219 $('#filterMap').val(getUrlParameter('filterMap')); 220 $('#filterGameType').val(getUrlParameter('filterGameType')); 221 $('#filterAuthor').val(getUrlParameter('filterAuthor')); 222 $('#filterYear').val(getUrlParameter('filterYear')); 223 $('#filterStatus').val(getUrlParameter('filterStatus')); 224 $('#filterDateAdded').val(getUrlParameter('filterDateAdded')); 225 } 226 227 // Apply filters from URL parameters or use default value 228 var filterMap = getUrlParameter('filterMap') || ''; 229 if (filterMap) { 230 // Apply filterMap to the DataTable 231 dataTable.column(0).search(filterMap).draw(); 232 } 233 234 var filterGameType = getUrlParameter('filterGameType') || ''; 235 if (filterGameType) { 236 // Apply filterGameType to the DataTable 237 dataTable.column(1).search(filterGameType).draw(); 238 } 239 240 var filterAuthor = getUrlParameter('filterAuthor') || ''; 241 if (filterAuthor) { 242 // Apply filterAuthor to the DataTable 243 dataTable.column(2).search(filterAuthor).draw(); 244 } 245 246 var filterYear = getUrlParameter('filterYear') || ''; 247 if (filterYear) { 248 // Apply filterYear to the DataTable 249 dataTable.column(3).search(filterYear).draw(); 250 } 251 252 var filterStatus = getUrlParameter('filterStatus') || ''; 253 if (filterStatus) { 254 // Apply filterStatus to the DataTable 255 dataTable.column(4).search(filterStatus).draw(); 256 } 257 258 var filterDateAdded = getUrlParameter('filterDateAdded') || ''; 259 if (filterDateAdded) { 260 // Apply filterDateAdded to the DataTable 261 dataTable.column(9).search(filterDateAdded).draw(); 262 } 263 264 // Set filter controls based on URL parameters 265 setFilterControlsFromUrl(); 266 267 // Drop-down-menu filtering logic 268 $('#filterGameType').on('change', function() { 269 var selectedGameType = $(this).val(); 270 dataTable.column(1).search(selectedGameType).draw(); 271 updateUrlParameter('filterGameType', selectedGameType); 272 }); 273 274 $('#filterStatus').on('change', function() { 275 var selectedStatus = $(this).val(); 276 dataTable.column(4).search(selectedStatus).draw(); 277 updateUrlParameter('filterStatus', selectedStatus); 278 }); 279 280 // Text-box filtering logic 281 $('#filterMap, #filterAuthor, #filterYear, #filterDateAdded').on('keyup', function() { 282 dataTable.column(0).search($('#filterMap').val()).draw(); 283 dataTable.column(2).search($('#filterAuthor').val()).draw(); 284 dataTable.column(3).search($('#filterYear').val()).draw(); 285 dataTable.column(9).search($('#filterDateAdded').val()).draw(); 286 287 // Update URL parameters 288 updateUrlParameter('filterMap', $('#filterMap').val()); 289 updateUrlParameter('filterAuthor', $('#filterAuthor').val()); 290 updateUrlParameter('filterYear', $('#filterYear').val()); 291 updateUrlParameter('filterDateAdded', $('#filterDateAdded').val()); 292 }); 293 294 // Prevent sorting when interacting with filter controls.
295 $('.filter-controls input, .filter-controls select, .filter-controls span').click(function (e) { 296 e.stopPropagation(); 297 }); 298 299 // Clear map filter when user selects "X" button. 300 $('#clearfilterMap').click(function() { 301 $('#filterMap').val(''); 302 dataTable.column(0).search($('#filterMap').val()).draw(); 303 updateUrlParameter('filterMap', ''); 304 }); 305 306 // Clear author filter when user selects "X" button. 307 $('#clearfilterAuthor').click(function() { 308 $('#filterAuthor').val(''); 309 dataTable.column(2).search($('#filterAuthor').val()).draw(); 310 updateUrlParameter('filterAuthor', ''); 311 }); 312 313 // Clear year filter when user selects "X" button. 314 $('#clearfilterYear').click(function() { 315 $('#filterYear').val(''); 316 dataTable.column(3).search($('#filterYear').val()).draw(); 317 updateUrlParameter('filterYear', ''); 318 }); 319 320 // Clear date added filter when user selects "X" button. 321 $('#clearfilterDateAdded').click(function() { 322 $('#filterDateAdded').val(''); 323 dataTable.column(9).search($('#filterDateAdded').val()).draw(); 324 updateUrlParameter('filterDateAdded', ''); 325 }); 326 327 } ); 328 329</script>
vendor: 2 bytes, line 329
329
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.