From: hgn Date: Thu, 1 May 2025 08:53:37 +0000 (+0100) Subject: user profile stuff X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=8fef37b2ebffc8ae5cd8f58d9e5ec174041b6951;p=carveJwlIkooP6JGAAIwe30JlM.git user profile stuff --- diff --git a/.gitignore b/.gitignore index ac4266b..4fa1699 100755 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,8 @@ vg bin/ dist/ models_src/boards/workshop +ccflags/png +icons/png # auto generated code shaders/*.h diff --git a/build.c b/build.c index 32c6d06..bdb8aa7 100644 --- a/build.c +++ b/build.c @@ -251,6 +251,7 @@ void build_game_bin( struct vg_project *proj, struct vg_compiler_env *env ) vg_add_controller_database( proj ); } +#if 0 struct compile_result build_sqlite_for_env( struct vg_compiler_env *env ) { @@ -268,14 +269,19 @@ build_sqlite_for_env( struct vg_compiler_env *env ) "dep/sqlite3/sqlite3.c ", "sqlite3", k_obj_type_obj ); } +#endif void compile_server( struct vg_project *proj, struct vg_compiler_env *env ) { +#if 0 struct compile_result sqlite = build_sqlite_for_env( env ); +#endif vg_str sources = {0}; vg_strcat( &sources, "src/gameserver.c vg/vg_tool.c vg/vg_steam.c \\\n " ); +#if 0 vg_strcat( &sources, sqlite.path.buffer ); +#endif struct vg_compiler_conf conf = {0}; vg_strcat( &conf.include, "-Isrc -I./dep " ); @@ -407,22 +413,22 @@ void s_testing_server(void) compile_server( &test_proj, &vg_test_env ); } -void s_queuetest_build(void) +void s_dbtest_build(void) { - vg_info( "running script: s_queuetest_build(void)\n" ); + vg_info( "running script: s_dbtest_build(void)\n" ); struct vg_project test_proj; - vg_project_init( &test_proj, "bin", "queuetest", &vg_test_env, 0 ); + vg_project_init( &test_proj, "bin", "dbtest", &vg_test_env, 0 ); vg_str sources = {0}; - vg_strcat( &sources, "src/queuetest.c vg/vg_tool.c \\\n " ); + vg_strcat( &sources, "src/dbtest.c vg/vg_tool.c \\\n " ); struct vg_compiler_conf conf = {0}; vg_strcat( &conf.include, "-Isrc -I./dep " ); vg_strcat( &conf.include, "-I. -I./vg -I./vg/dep " ); vg_strcat( &conf.library, "-L./vg/dep/steam " ); vg_strcat( &conf.link, "-ldl -lpthread -lm " ); - vg_compiler_run( &test_proj, &vg_test_env, &conf, sources.buffer, "qtest", k_obj_type_exe ); + vg_compiler_run( &test_proj, &vg_test_env, &conf, sources.buffer, "dbtest", k_obj_type_exe ); } int main( int argc, const char *argv[] ) @@ -443,8 +449,8 @@ int main( int argc, const char *argv[] ) if( vg_long_opt( "testing-server", NULL ) ) s_testing_server(); - if( vg_long_opt( "queuetest", NULL ) ) - s_queuetest_build(); + if( vg_long_opt( "dbtest", NULL ) ) + s_dbtest_build(); if( vg_long_opt( "tools", NULL ) ) s_compile_tools(); diff --git a/ccflags/comb.png b/ccflags/comb.png new file mode 100644 index 0000000..264e45b Binary files /dev/null and b/ccflags/comb.png differ diff --git a/ccflags/make_png.sh b/ccflags/make_png.sh new file mode 100755 index 0000000..27cc407 --- /dev/null +++ b/ccflags/make_png.sh @@ -0,0 +1,2 @@ +mkdir png +for i in svg/*.svg; do inkscape -w 96 -h 64 "$i" -o "png/$(basename $i).png"; done diff --git a/ccflags/make_world.py b/ccflags/make_world.py new file mode 100644 index 0000000..8d1852a --- /dev/null +++ b/ccflags/make_world.py @@ -0,0 +1,320 @@ +import os.path + +all = [\ +"Afghanistan", "AF", "AFG", "4", "33", "65", +"Aland Islands", "AX", "ALA", "248", "60.116667", "19.9", +"Sealand", "01", "SLN", "826", "51.8", "1.49", +"Albania", "AL", "ALB", "8", "41", "20", +"Algeria", "DZ", "DZA", "12", "28", "3", +"American Samoa", "AS", "ASM", "16", "-14.3333", "-170", +"Andorra", "AD", "AND", "20", "42.5", "1.6", +"Angola", "AO", "AGO", "24", "-12.5", "18.5", +"Anguilla", "AI", "AIA", "660", "18.25", "-63.1667", +"Antarctica", "AQ", "ATA", "10", "-90", "0", +"Antigua and Barbuda", "AG", "ATG", "28", "17.05", "-61.8", +"Argentina", "AR", "ARG", "32", "-34", "-64", +"Armenia", "AM", "ARM", "51", "40", "45", +"Aruba", "AW", "ABW", "533", "12.5", "-69.9667", +"Australia", "AU", "AUS", "36", "-27", "133", +"Austria", "AT", "AUT", "40", "47.3333", "13.3333", +"Azerbaijan", "AZ", "AZE", "31", "40.5", "47.5", +"Bahamas", "BS", "BHS", "44", "24.25", "-76", +"Bahrain", "BH", "BHR", "48", "26", "50.55", +"Bangladesh", "BD", "BGD", "50", "24", "90", +"Barbados", "BB", "BRB", "52", "13.1667", "-59.5333", +"Belarus", "BY", "BLR", "112", "53", "28", +"Belgium", "BE", "BEL", "56", "50.8333", "4", +"Belize", "BZ", "BLZ", "84", "17.25", "-88.75", +"Benin", "BJ", "BEN", "204", "9.5", "2.25", +"Bermuda", "BM", "BMU", "60", "32.3333", "-64.75", +"Bhutan", "BT", "BTN", "64", "27.5", "90.5", +"Bolivia", "BO", "BOL", "68", "-17", "-65", +"Bonaire, Sint Eustatius and Saba", "BQ", "BES", "535", "12.183333", "-68.233333", +"Bosnia and Herzegovina", "BA", "BIH", "70", "44", "18", +"Botswana", "BW", "BWA", "72", "-22", "24", +"Bouvet Island", "BV", "BVT", "74", "-54.4333", "3.4", +"Brazil", "BR", "BRA", "76", "-10", "-55", +"British Indian Ocean Territory", "IO", "IOT", "86", "-6", "71.5", +"Brunei", "BN", "BRN", "96", "4.5", "114.6667", +"Bulgaria", "BG", "BGR", "100", "43", "25", +"Burkina Faso", "BF", "BFA", "854", "13", "-2", +"Burundi", "BI", "BDI", "108", "-3.5", "30", +"Cambodia", "KH", "KHM", "116", "13", "105", +"Cameroon", "CM", "CMR", "120", "6", "12", +"Canada", "CA", "CAN", "124", "60", "-95", +"Cape Verde", "CV", "CPV", "132", "16", "-24", +"Cayman Islands", "KY", "CYM", "136", "19.5", "-80.5", +"Central African Republic", "CF", "CAF", "140", "7", "21", +"Chad", "TD", "TCD", "148", "15", "19", +"Chile", "CL", "CHL", "152", "-30", "-71", +"China", "CN", "CHN", "156", "35", "105", +"Christmas Island", "CX", "CXR", "162", "-10.5", "105.6667", +"Cocos (Keeling) Islands", "CC", "CCK", "166", "-12.5", "96.8333", +"Colombia", "CO", "COL", "170", "4", "-72", +"Comoros", "KM", "COM", "174", "-12.1667", "44.25", +"Congo, DR", "CD", "COD", "180", "0", "25", +"Congo", "CG", "COG", "178", "-1", "15", +"Cook Islands", "CK", "COK", "184", "-21.2333", "-159.7667", +"Costa Rica", "CR", "CRI", "188", "10", "-84", +"Croatia", "HR", "HRV", "191", "45.1667", "15.5", +"Cuba", "CU", "CUB", "192", "21.5", "-80", +"CuraCao", "CW", "CUW", "531", "12.166667", "-68.966667", +"Cyprus", "CY", "CYP", "196", "35", "33", +"Czech Republic", "CZ", "CZE", "203", "49.75", "15.5", +"Denmark", "DK", "DNK", "208", "56", "10", +"Djibouti", "DJ", "DJI", "262", "11.5", "43", +"Dominica", "DM", "DMA", "212", "15.4167", "-61.3333", +"Dominican Republic", "DO", "DOM", "214", "19", "-70.6667", +"Ecuador", "EC", "ECU", "218", "-2", "-77.5", +"Egypt", "EG", "EGY", "818", "27", "30", +"El Salvador", "SV", "SLV", "222", "13.8333", "-88.9167", +"Equatorial Guinea", "GQ", "GNQ", "226", "2", "10", +"Eritrea", "ER", "ERI", "232", "15", "39", +"Estonia", "EE", "EST", "233", "59", "26", +"Ethiopia", "ET", "ETH", "231", "8", "38", +"Falkland Islands (Malvinas)", "FK", "FLK", "238", "-51.75", "-59", +"Faroe Islands", "FO", "FRO", "234", "62", "-7", +"Fiji", "FJ", "FJI", "242", "-18", "175", +"Finland", "FI", "FIN", "246", "64", "26", +"France", "FR", "FRA", "250", "46", "2", +"French Guiana", "GF", "GUF", "254", "4", "-53", +"French Polynesia", "PF", "PYF", "258", "-15", "-140", +"French Southern Territories", "TF", "ATF", "260", "-43", "67", +"Gabon", "GA", "GAB", "266", "-1", "11.75", +"Gambia", "GM", "GMB", "270", "13.4667", "-16.5667", +"Georgia", "GE", "GEO", "268", "42", "43.5", +"Germany", "DE", "DEU", "276", "51", "9", +"Ghana", "GH", "GHA", "288", "8", "-2", +"Gibraltar", "GI", "GIB", "292", "36.1833", "-5.3667", +"Greece", "GR", "GRC", "300", "39", "22", +"Greenland", "GL", "GRL", "304", "72", "-40", +"Grenada", "GD", "GRD", "308", "12.1167", "-61.6667", +"Guadeloupe", "GP", "GLP", "312", "16.25", "-61.5833", +"Guam", "GU", "GUM", "316", "13.4667", "144.7833", +"Guatemala", "GT", "GTM", "320", "15.5", "-90.25", +"Guernsey", "GG", "GGY", "831", "49.5", "-2.56", +"Guinea-Bissau", "GW", "GNB", "624", "12", "-15", +"Guinea", "GN", "GIN", "324", "11", "-10", +"Guyana", "GY", "GUY", "328", "5", "-59", +"Haiti", "HT", "HTI", "332", "19", "-72.4167", +"Heard and McDonald", "HM", "HMD", "334", "-53.1", "72.5167", +"Vatican City", "VA", "VAT", "336", "41.9", "12.45", +"Honduras", "HN", "HND", "340", "15", "-86.5", +"Hong Kong", "HK", "HKG", "344", "22.25", "114.1667", +"Hungary", "HU", "HUN", "348", "47", "20", +"Iceland", "IS", "ISL", "352", "65", "-18", +"India", "IN", "IND", "356", "20", "77", +"Indonesia", "ID", "IDN", "360", "-5", "120", +"Iran", "IR", "IRN", "364", "32", "53", +"Iraq", "IQ", "IRQ", "368", "33", "44", +"Isle of Man", "IM", "IMN", "833", "54.23", "-4.55", +"Israel", "IL", "ISR", "376", "31.5", "34.75", +"Italy", "IT", "ITA", "380", "42.8333", "12.8333", +"Ivory Coast", "CI", "CIV", "384", "8", "-5", +"Jamaica", "JM", "JAM", "388", "18.25", "-77.5", +"Japan", "JP", "JPN", "392", "36", "138", +"Jersey", "JE", "JEY", "832", "49.21", "-2.13", +"Jordan", "JO", "JOR", "400", "31", "36", +"Kazakhstan", "KZ", "KAZ", "398", "48", "68", +"Kenya", "KE", "KEN", "404", "1", "38", +"Kiribati", "KI", "KIR", "296", "1.4167", "173", +"Korea, DPRK", "KP", "PRK", "408", "40", "127", +"Kosovo", "XK", "XKX", "95", "42.583333", "21", +"Kuwait", "KW", "KWT", "414", "29.3375", "47.6581", +"Kyrgyzstan", "KG", "KGZ", "417", "41", "75", +"Lao PDR", "LA", "LAO", "418", "18", "105", +"Latvia", "LV", "LVA", "428", "57", "25", +"Lebanon", "LB", "LBN", "422", "33.8333", "35.8333", +"Lesotho", "LS", "LSO", "426", "-29.5", "28.5", +"Liberia", "LR", "LBR", "430", "6.5", "-9.5", +"Libya", "LY", "LBY", "434", "25", "17", +"Liechtenstein", "LI", "LIE", "438", "47.1667", "9.5333", +"Lithuania", "LT", "LTU", "440", "56", "24", +"Luxembourg", "LU", "LUX", "442", "49.75", "6.1667", +"Macao", "MO", "MAC", "446", "22.1667", "113.55", +"Macedonia", "MK", "MKD", "807", "41.8333", "22", +"Madagascar", "MG", "MDG", "450", "-20", "47", +"Malawi", "MW", "MWI", "454", "-13.5", "34", +"Malaysia", "MY", "MYS", "458", "2.5", "112.5", +"Maldives", "MV", "MDV", "462", "3.25", "73", +"Mali", "ML", "MLI", "466", "17", "-4", +"Malta", "MT", "MLT", "470", "35.8333", "14.5833", +"Marshall Islands", "MH", "MHL", "584", "9", "168", +"Martinique", "MQ", "MTQ", "474", "14.6667", "-61", +"Mauritania", "MR", "MRT", "478", "20", "-12", +"Mauritius", "MU", "MUS", "480", "-20.2833", "57.55", +"Mayotte", "YT", "MYT", "175", "-12.8333", "45.1667", +"Mexico", "MX", "MEX", "484", "23", "-102", +"Micronesia, Federated States of", "FM", "FSM", "583", "6.9167", "158.25", +"Moldova, Republic of", "MD", "MDA", "498", "47", "29", +"Monaco", "MC", "MCO", "492", "43.7333", "7.4", +"Mongolia", "MN", "MNG", "496", "46", "105", +"Montenegro", "ME", "MNE", "499", "42", "19", +"Montserrat", "MS", "MSR", "500", "16.75", "-62.2", +"Morocco", "MA", "MAR", "504", "32", "-5", +"Mozambique", "MZ", "MOZ", "508", "-18.25", "35", +"Myanmar", "MM", "MMR", "104", "22", "98", +"Namibia", "NA", "NAM", "516", "-22", "17", +"Nauru", "NR", "NRU", "520", "-0.5333", "166.9167", +"Nepal", "NP", "NPL", "524", "28", "84", +"Netherlands", "NL", "NLD", "528", "52.5", "5.75", +"New Caledonia", "NC", "NCL", "540", "-21.5", "165.5", +"New Zealand", "NZ", "NZL", "554", "-41", "174", +"Nicaragua", "NI", "NIC", "558", "13", "-85", +"Niger", "NE", "NER", "562", "16", "8", +"Nigeria", "NG", "NGA", "566", "10", "8", +"Niue", "NU", "NIU", "570", "-19.0333", "-169.8667", +"Norfolk Island", "NF", "NFK", "574", "-29.0333", "167.95", +"Northern Mariana Islands", "MP", "MNP", "580", "15.2", "145.75", +"Norway", "NO", "NOR", "578", "62", "10", +"Oman", "OM", "OMN", "512", "21", "57", +"Pakistan", "PK", "PAK", "586", "30", "70", +"Palau", "PW", "PLW", "585", "7.5", "134.5", +"Palestine", "PS", "PSE", "275", "32", "35.25", +"Panama", "PA", "PAN", "591", "9", "-80", +"Papua New Guinea", "PG", "PNG", "598", "-6", "147", +"Paraguay", "PY", "PRY", "600", "-23", "-58", +"Peru", "PE", "PER", "604", "-10", "-76", +"Philippines", "PH", "PHL", "608", "13", "122", +"Pitcairn", "PN", "PCN", "612", "-24.7", "-127.4", +"Poland", "PL", "POL", "616", "52", "20", +"Portugal", "PT", "PRT", "620", "39.5", "-8", +"Puerto Rico", "PR", "PRI", "630", "18.25", "-66.5", +"Qatar", "QA", "QAT", "634", "25.5", "51.25", +"Reunion", "RE", "REU", "638", "-21.1", "55.6", +"Romania", "RO", "ROU", "642", "46", "25", +"Russia", "RU", "RUS", "643", "60", "100", +"Rwanda", "RW", "RWA", "646", "-2", "30", +"Saint Barthelemy", "BL", "BLM", "652", "17.897728", "-62.834244", +"Saint Helena, Ascension and Tristan da Cunha", "SH", "SHN", "654", "-15.9333", "-5.7", +"Saint Kitts and Nevis", "KN", "KNA", "659", "17.3333", "-62.75", +"Saint Lucia", "LC", "LCA", "662", "13.8833", "-61.1333", +"Saint Martin (French part)", "MF", "MAF", "663", "18.075278", "-63.06", +"Saint Pierre and Miquelon", "PM", "SPM", "666", "46.8333", "-56.3333", +"Saint Vincent & the Grenadines", "VC", "VCT", "670", "13.25", "-61.2", +"Samoa", "WS", "WSM", "882", "-13.5833", "-172.3333", +"San Marino", "SM", "SMR", "674", "43.7667", "12.4167", +"Sao Tome and Principe", "ST", "STP", "678", "1", "7", +"Saudi Arabia", "SA", "SAU", "682", "25", "45", +"Senegal", "SN", "SEN", "686", "14", "-14", +"Serbia", "RS", "SRB", "688", "44", "21", +"Seychelles", "SC", "SYC", "690", "-4.5833", "55.6667", +"Sierra Leone", "SL", "SLE", "694", "8.5", "-11.5", +"Singapore", "SG", "SGP", "702", "1.3667", "103.8", +"Sint Maarten (Dutch part)", "SX", "SXM", "534", "18.033333", "-63.05", +"Slovakia", "SK", "SVK", "703", "48.6667", "19.5", +"Slovenia", "SI", "SVN", "705", "46", "15", +"Solomon Islands", "SB", "SLB", "90", "-8", "159", +"Somalia", "SO", "SOM", "706", "10", "49", +"South Africa", "ZA", "ZAF", "710", "-29", "24", +"South Georgia and the South Sandwich Islands", "GS", "SGS", "239", "-54.5", "-37", +"South Korea", "KR", "KOR", "410", "37", "127.5", +"South Sudan", "SS", "SSD", "728", "8", "30", +"Spain", "ES", "ESP", "724", "40", "-4", +"Sri Lanka", "LK", "LKA", "144", "7", "81", +"Sudan", "SD", "SDN", "736", "15", "30", +"Suriname", "SR", "SUR", "740", "4", "-56", +"Svalbard and Jan Mayen", "SJ", "SJM", "744", "78", "20", +"Swaziland", "SZ", "SWZ", "748", "-26.5", "31.5", +"Sweden", "SE", "SWE", "752", "62", "15", +"Switzerland", "CH", "CHE", "756", "47", "8", +"Syrian Arab Republic", "SY", "SYR", "760", "35", "38", +"Taiwan", "TW", "TWN", "158", "23.5", "121", +"Tajikistan", "TJ", "TJK", "762", "39", "71", +"Tanzania, United Republic of", "TZ", "TZA", "834", "-6", "35", +"Thailand", "TH", "THA", "764", "15", "100", +"Timor-Leste", "TL", "TLS", "626", "-8.55", "125.5167", +"Togo", "TG", "TGO", "768", "8", "1.1667", +"Tokelau", "TK", "TKL", "772", "-9", "-172", +"Tonga", "TO", "TON", "776", "-20", "-175", +"Trinidad and Tobago", "TT", "TTO", "780", "11", "-61", +"Tunisia", "TN", "TUN", "788", "34", "9", +"Turkey", "TR", "TUR", "792", "39", "35", +"Turkmenistan", "TM", "TKM", "795", "40", "60", +"Turks and Caicos Islands", "TC", "TCA", "796", "21.75", "-71.5833", +"Tuvalu", "TV", "TUV", "798", "-8", "178", +"Uganda", "UG", "UGA", "800", "1", "32", +"Ukraine", "UA", "UKR", "804", "49", "32", +"United Arab Emirates", "AE", "ARE", "784", "24", "54", +"England", "EN", "ENG", "826", "51.42", "0.00", +"Scotland", "OL", "SCT", "826", "56.36", "-3.96", +"Wales", "WA", "WAL", "826", "52.15", "-3.83", +"United States Minor Outlying Islands", "UM", "UMI", "581", "19.2833", "166.6", +"United States", "US", "USA", "840", "38", "-97", +"Uruguay", "UY", "URY", "858", "-33", "-56", +"Uzbekistan", "UZ", "UZB", "860", "41", "64", +"Vanuatu", "VU", "VUT", "548", "-16", "167", +"Venezuela", "VE", "VEN", "862", "8", "-66", +"Vietnam", "VN", "VNM", "704", "16", "106", +"Ireland", "IE", "IRL", "372", "53", "-8", +"Virgin Islands, British", "VG", "VGB", "92", "18.5", "-64.5", +"Virgin Islands, U.S.", "VI", "VIR", "850", "18.3333", "-64.8333", +"Wallis and Futuna", "WF", "WLF", "876", "-13.3", "-176.2", +"Western Sahara", "EH", "ESH", "732", "24.5", "-13", +"Yemen", "YE", "YEM", "887", "15", "48", +"Zambia", "ZM", "ZMB", "894", "-15", "30", +"EU", "EU", "EUR", "894", "49.53", "11.8", +"United Kingdom", "GB", "GBR", "826", "54", "-2", +"Zimbabwe", "ZW", "ZWE", "716", "-20", "30"] + +def floaty(x): + if '.' in x: return x + 'f' + else: return x + '.0f' + +mega_string = "" +msl = 0 + +f = open( "../src/cc.h", "w" ) + +f.write( 'struct country k_countries[] = {' ) +for i in range(0,len(all)//6): +#{ + j = i*6 + ofs = msl + name = all[j].encode( 'ascii', 'ignore' ).decode('ascii') + + for c in name: + mega_string += F"{ord(c)}," + msl += 1 + mega_string += "0," + msl += 1 + + top=83.633402 + bot=-55.9277 + x = (float(all[j+5])/180.0)*0.5+0.5 + y = (float(all[j+4])-bot) / (top-bot) + if y < 0.0: y = 0.0 + if y > 1.0: y = 1.0 + f.write( '{'+ F'{ofs},{x:.6f}f,{y:.6f}f' + '},\n' ) +#} +f.write( '};\n' ) +f.write( F'const char k_country_names[] = {'{'}{mega_string}{'}'};\n' ) + +used = [] +monstr = "" + +f.write( 'const char k_country_iso2[] = {') +for i in range(0,len(all)//6): +#{ + j = i*6 + cc = all[j+1] + + if cc in used: + print( F"Duplicate! {cc}" ) + + monstr += "png/" + cc + ".svg.png " + + used.append(cc) + f.write( F'{ord(cc[0])},{ord(cc[1])},0,' ) + + if not os.path.isfile( F"png/{all[j+1]}.svg.png" ): + print( F"Not found! {all[j+1]}.svg.png" ) +#} +f.write( '};\n') +f.write( F'u32 k_country_count = {len(all)//6};\n' ) + +f.close() + +os.system( F'montage {monstr} -tile 16x16 -geometry +0+0 comb.png' ) + +print( "done" ) diff --git a/ccflags/svg/01.svg b/ccflags/svg/01.svg new file mode 100644 index 0000000..07b4421 --- /dev/null +++ b/ccflags/svg/01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AD.svg b/ccflags/svg/AD.svg new file mode 100644 index 0000000..2aba7c1 --- /dev/null +++ b/ccflags/svg/AD.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AE.svg b/ccflags/svg/AE.svg new file mode 100644 index 0000000..59ddafd --- /dev/null +++ b/ccflags/svg/AE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AF.svg b/ccflags/svg/AF.svg new file mode 100644 index 0000000..9cec9d8 --- /dev/null +++ b/ccflags/svg/AF.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AG.svg b/ccflags/svg/AG.svg new file mode 100644 index 0000000..16881fe --- /dev/null +++ b/ccflags/svg/AG.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AI.svg b/ccflags/svg/AI.svg new file mode 100644 index 0000000..a7fcfd0 --- /dev/null +++ b/ccflags/svg/AI.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AL.svg b/ccflags/svg/AL.svg new file mode 100644 index 0000000..d7989d9 --- /dev/null +++ b/ccflags/svg/AL.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AM.svg b/ccflags/svg/AM.svg new file mode 100644 index 0000000..d49087d --- /dev/null +++ b/ccflags/svg/AM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AO.svg b/ccflags/svg/AO.svg new file mode 100644 index 0000000..ebb14c1 --- /dev/null +++ b/ccflags/svg/AO.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AQ.svg b/ccflags/svg/AQ.svg new file mode 100644 index 0000000..14d59c7 --- /dev/null +++ b/ccflags/svg/AQ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AR.svg b/ccflags/svg/AR.svg new file mode 100644 index 0000000..8dfd3df --- /dev/null +++ b/ccflags/svg/AR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AS.svg b/ccflags/svg/AS.svg new file mode 100644 index 0000000..bd00809 --- /dev/null +++ b/ccflags/svg/AS.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AT.svg b/ccflags/svg/AT.svg new file mode 100644 index 0000000..6ccf7c4 --- /dev/null +++ b/ccflags/svg/AT.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AU.svg b/ccflags/svg/AU.svg new file mode 100644 index 0000000..f91b013 --- /dev/null +++ b/ccflags/svg/AU.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AW.svg b/ccflags/svg/AW.svg new file mode 100644 index 0000000..cff670d --- /dev/null +++ b/ccflags/svg/AW.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AX.svg b/ccflags/svg/AX.svg new file mode 100644 index 0000000..9bbfa51 --- /dev/null +++ b/ccflags/svg/AX.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/AZ.svg b/ccflags/svg/AZ.svg new file mode 100644 index 0000000..486d3b8 --- /dev/null +++ b/ccflags/svg/AZ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BA.svg b/ccflags/svg/BA.svg new file mode 100644 index 0000000..1731a3a --- /dev/null +++ b/ccflags/svg/BA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BB.svg b/ccflags/svg/BB.svg new file mode 100644 index 0000000..05e0dd9 --- /dev/null +++ b/ccflags/svg/BB.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BD.svg b/ccflags/svg/BD.svg new file mode 100644 index 0000000..e3c7267 --- /dev/null +++ b/ccflags/svg/BD.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BE.svg b/ccflags/svg/BE.svg new file mode 100644 index 0000000..cc1b013 --- /dev/null +++ b/ccflags/svg/BE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BF.svg b/ccflags/svg/BF.svg new file mode 100644 index 0000000..126e61f --- /dev/null +++ b/ccflags/svg/BF.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BG.svg b/ccflags/svg/BG.svg new file mode 100644 index 0000000..7ebee38 --- /dev/null +++ b/ccflags/svg/BG.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BH.svg b/ccflags/svg/BH.svg new file mode 100644 index 0000000..5134d60 --- /dev/null +++ b/ccflags/svg/BH.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BI.svg b/ccflags/svg/BI.svg new file mode 100644 index 0000000..68ac163 --- /dev/null +++ b/ccflags/svg/BI.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BJ.svg b/ccflags/svg/BJ.svg new file mode 100644 index 0000000..63a6f9b --- /dev/null +++ b/ccflags/svg/BJ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BL.svg b/ccflags/svg/BL.svg new file mode 100644 index 0000000..dd9cdb5 --- /dev/null +++ b/ccflags/svg/BL.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BM.svg b/ccflags/svg/BM.svg new file mode 100644 index 0000000..97a7d2b --- /dev/null +++ b/ccflags/svg/BM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BN.svg b/ccflags/svg/BN.svg new file mode 100644 index 0000000..3b758a0 --- /dev/null +++ b/ccflags/svg/BN.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BO.svg b/ccflags/svg/BO.svg new file mode 100644 index 0000000..6a0996e --- /dev/null +++ b/ccflags/svg/BO.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BQ.svg b/ccflags/svg/BQ.svg new file mode 100644 index 0000000..6318504 --- /dev/null +++ b/ccflags/svg/BQ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BR.svg b/ccflags/svg/BR.svg new file mode 100644 index 0000000..f4dbb02 --- /dev/null +++ b/ccflags/svg/BR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BS.svg b/ccflags/svg/BS.svg new file mode 100644 index 0000000..aac6004 --- /dev/null +++ b/ccflags/svg/BS.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BT.svg b/ccflags/svg/BT.svg new file mode 100644 index 0000000..ed53f32 --- /dev/null +++ b/ccflags/svg/BT.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BV.svg b/ccflags/svg/BV.svg new file mode 100644 index 0000000..c3652bf --- /dev/null +++ b/ccflags/svg/BV.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BW.svg b/ccflags/svg/BW.svg new file mode 100644 index 0000000..5343de6 --- /dev/null +++ b/ccflags/svg/BW.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BY.svg b/ccflags/svg/BY.svg new file mode 100644 index 0000000..86a423a --- /dev/null +++ b/ccflags/svg/BY.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/BZ.svg b/ccflags/svg/BZ.svg new file mode 100644 index 0000000..9ac59b0 --- /dev/null +++ b/ccflags/svg/BZ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CA.svg b/ccflags/svg/CA.svg new file mode 100644 index 0000000..457d316 --- /dev/null +++ b/ccflags/svg/CA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CC.svg b/ccflags/svg/CC.svg new file mode 100644 index 0000000..16c3b66 --- /dev/null +++ b/ccflags/svg/CC.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CD.svg b/ccflags/svg/CD.svg new file mode 100644 index 0000000..203b3c6 --- /dev/null +++ b/ccflags/svg/CD.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CF.svg b/ccflags/svg/CF.svg new file mode 100644 index 0000000..f7eaa95 --- /dev/null +++ b/ccflags/svg/CF.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CG.svg b/ccflags/svg/CG.svg new file mode 100644 index 0000000..d8b6c13 --- /dev/null +++ b/ccflags/svg/CG.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CH.svg b/ccflags/svg/CH.svg new file mode 100644 index 0000000..498b7d1 --- /dev/null +++ b/ccflags/svg/CH.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CI.svg b/ccflags/svg/CI.svg new file mode 100644 index 0000000..24ae0ea --- /dev/null +++ b/ccflags/svg/CI.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CK.svg b/ccflags/svg/CK.svg new file mode 100644 index 0000000..0e21062 --- /dev/null +++ b/ccflags/svg/CK.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CL.svg b/ccflags/svg/CL.svg new file mode 100644 index 0000000..cd2f03a --- /dev/null +++ b/ccflags/svg/CL.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CM.svg b/ccflags/svg/CM.svg new file mode 100644 index 0000000..f564968 --- /dev/null +++ b/ccflags/svg/CM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CN.svg b/ccflags/svg/CN.svg new file mode 100644 index 0000000..64629b2 --- /dev/null +++ b/ccflags/svg/CN.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CO.svg b/ccflags/svg/CO.svg new file mode 100644 index 0000000..dc46df0 --- /dev/null +++ b/ccflags/svg/CO.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CR.svg b/ccflags/svg/CR.svg new file mode 100644 index 0000000..57ce8cb --- /dev/null +++ b/ccflags/svg/CR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CU.svg b/ccflags/svg/CU.svg new file mode 100644 index 0000000..780e99c --- /dev/null +++ b/ccflags/svg/CU.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CV.svg b/ccflags/svg/CV.svg new file mode 100644 index 0000000..a3e3ed4 --- /dev/null +++ b/ccflags/svg/CV.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CW.svg b/ccflags/svg/CW.svg new file mode 100644 index 0000000..6fdf223 --- /dev/null +++ b/ccflags/svg/CW.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CX.svg b/ccflags/svg/CX.svg new file mode 100644 index 0000000..197201d --- /dev/null +++ b/ccflags/svg/CX.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CY.svg b/ccflags/svg/CY.svg new file mode 100644 index 0000000..3998689 --- /dev/null +++ b/ccflags/svg/CY.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/CZ.svg b/ccflags/svg/CZ.svg new file mode 100644 index 0000000..c6ae614 --- /dev/null +++ b/ccflags/svg/CZ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/DE.svg b/ccflags/svg/DE.svg new file mode 100644 index 0000000..295d13e --- /dev/null +++ b/ccflags/svg/DE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/DJ.svg b/ccflags/svg/DJ.svg new file mode 100644 index 0000000..e79b3bd --- /dev/null +++ b/ccflags/svg/DJ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/DK.svg b/ccflags/svg/DK.svg new file mode 100644 index 0000000..1fecf56 --- /dev/null +++ b/ccflags/svg/DK.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/DM.svg b/ccflags/svg/DM.svg new file mode 100644 index 0000000..6b8da64 --- /dev/null +++ b/ccflags/svg/DM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/DO.svg b/ccflags/svg/DO.svg new file mode 100644 index 0000000..4fa3817 --- /dev/null +++ b/ccflags/svg/DO.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/DZ.svg b/ccflags/svg/DZ.svg new file mode 100644 index 0000000..fe8bb71 --- /dev/null +++ b/ccflags/svg/DZ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/EC.svg b/ccflags/svg/EC.svg new file mode 100644 index 0000000..bb8e07f --- /dev/null +++ b/ccflags/svg/EC.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/EE.svg b/ccflags/svg/EE.svg new file mode 100644 index 0000000..28a9e16 --- /dev/null +++ b/ccflags/svg/EE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/EG.svg b/ccflags/svg/EG.svg new file mode 100644 index 0000000..3aa0fee --- /dev/null +++ b/ccflags/svg/EG.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/EH.svg b/ccflags/svg/EH.svg new file mode 100644 index 0000000..c2e0c07 --- /dev/null +++ b/ccflags/svg/EH.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/EN.svg b/ccflags/svg/EN.svg new file mode 100644 index 0000000..b2989e6 --- /dev/null +++ b/ccflags/svg/EN.svg @@ -0,0 +1,42 @@ + + + + + + + diff --git a/ccflags/svg/ER.svg b/ccflags/svg/ER.svg new file mode 100644 index 0000000..b361deb --- /dev/null +++ b/ccflags/svg/ER.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/ES.svg b/ccflags/svg/ES.svg new file mode 100644 index 0000000..e143324 --- /dev/null +++ b/ccflags/svg/ES.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/ET.svg b/ccflags/svg/ET.svg new file mode 100644 index 0000000..a4c6e32 --- /dev/null +++ b/ccflags/svg/ET.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/EU.svg b/ccflags/svg/EU.svg new file mode 100644 index 0000000..a359b05 --- /dev/null +++ b/ccflags/svg/EU.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/FI.svg b/ccflags/svg/FI.svg new file mode 100644 index 0000000..285363e --- /dev/null +++ b/ccflags/svg/FI.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/FJ.svg b/ccflags/svg/FJ.svg new file mode 100644 index 0000000..f59c63d --- /dev/null +++ b/ccflags/svg/FJ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/FK.svg b/ccflags/svg/FK.svg new file mode 100644 index 0000000..3c17685 --- /dev/null +++ b/ccflags/svg/FK.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/FM.svg b/ccflags/svg/FM.svg new file mode 100644 index 0000000..36aec4c --- /dev/null +++ b/ccflags/svg/FM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/FO.svg b/ccflags/svg/FO.svg new file mode 100644 index 0000000..524e87b --- /dev/null +++ b/ccflags/svg/FO.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/FR.svg b/ccflags/svg/FR.svg new file mode 100644 index 0000000..ec311d7 --- /dev/null +++ b/ccflags/svg/FR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GA.svg b/ccflags/svg/GA.svg new file mode 100644 index 0000000..7291224 --- /dev/null +++ b/ccflags/svg/GA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GB.svg b/ccflags/svg/GB.svg new file mode 100644 index 0000000..91f11d8 --- /dev/null +++ b/ccflags/svg/GB.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GD.svg b/ccflags/svg/GD.svg new file mode 100644 index 0000000..e257d21 --- /dev/null +++ b/ccflags/svg/GD.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GE.svg b/ccflags/svg/GE.svg new file mode 100644 index 0000000..b418200 --- /dev/null +++ b/ccflags/svg/GE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GF.svg b/ccflags/svg/GF.svg new file mode 100644 index 0000000..a163357 --- /dev/null +++ b/ccflags/svg/GF.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GG.svg b/ccflags/svg/GG.svg new file mode 100644 index 0000000..48f90b5 --- /dev/null +++ b/ccflags/svg/GG.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GH.svg b/ccflags/svg/GH.svg new file mode 100644 index 0000000..f59c0a4 --- /dev/null +++ b/ccflags/svg/GH.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GI.svg b/ccflags/svg/GI.svg new file mode 100644 index 0000000..da68f69 --- /dev/null +++ b/ccflags/svg/GI.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GL.svg b/ccflags/svg/GL.svg new file mode 100644 index 0000000..0cbd6ff --- /dev/null +++ b/ccflags/svg/GL.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GM.svg b/ccflags/svg/GM.svg new file mode 100644 index 0000000..30e0c6a --- /dev/null +++ b/ccflags/svg/GM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GN.svg b/ccflags/svg/GN.svg new file mode 100644 index 0000000..62427f4 --- /dev/null +++ b/ccflags/svg/GN.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GP.svg b/ccflags/svg/GP.svg new file mode 100644 index 0000000..ec311d7 --- /dev/null +++ b/ccflags/svg/GP.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GQ.svg b/ccflags/svg/GQ.svg new file mode 100644 index 0000000..42f6b11 --- /dev/null +++ b/ccflags/svg/GQ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GR.svg b/ccflags/svg/GR.svg new file mode 100644 index 0000000..0067170 --- /dev/null +++ b/ccflags/svg/GR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GS.svg b/ccflags/svg/GS.svg new file mode 100644 index 0000000..0706e7b --- /dev/null +++ b/ccflags/svg/GS.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GT.svg b/ccflags/svg/GT.svg new file mode 100644 index 0000000..20882e9 --- /dev/null +++ b/ccflags/svg/GT.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GU.svg b/ccflags/svg/GU.svg new file mode 100644 index 0000000..553d206 --- /dev/null +++ b/ccflags/svg/GU.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GW.svg b/ccflags/svg/GW.svg new file mode 100644 index 0000000..48d9a9c --- /dev/null +++ b/ccflags/svg/GW.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/GY.svg b/ccflags/svg/GY.svg new file mode 100644 index 0000000..f2d09f0 --- /dev/null +++ b/ccflags/svg/GY.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/HK.svg b/ccflags/svg/HK.svg new file mode 100644 index 0000000..284a722 --- /dev/null +++ b/ccflags/svg/HK.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/HM.svg b/ccflags/svg/HM.svg new file mode 100644 index 0000000..a0e8ac2 --- /dev/null +++ b/ccflags/svg/HM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/HN.svg b/ccflags/svg/HN.svg new file mode 100644 index 0000000..15ec213 --- /dev/null +++ b/ccflags/svg/HN.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/HR.svg b/ccflags/svg/HR.svg new file mode 100644 index 0000000..c61e8c8 --- /dev/null +++ b/ccflags/svg/HR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/HT.svg b/ccflags/svg/HT.svg new file mode 100644 index 0000000..3120c71 --- /dev/null +++ b/ccflags/svg/HT.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/HU.svg b/ccflags/svg/HU.svg new file mode 100644 index 0000000..8d92a84 --- /dev/null +++ b/ccflags/svg/HU.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/IC.svg b/ccflags/svg/IC.svg new file mode 100644 index 0000000..0370157 --- /dev/null +++ b/ccflags/svg/IC.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/ID.svg b/ccflags/svg/ID.svg new file mode 100644 index 0000000..2684a3d --- /dev/null +++ b/ccflags/svg/ID.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/IE.svg b/ccflags/svg/IE.svg new file mode 100644 index 0000000..f3f99d9 --- /dev/null +++ b/ccflags/svg/IE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/IL.svg b/ccflags/svg/IL.svg new file mode 100644 index 0000000..da41218 --- /dev/null +++ b/ccflags/svg/IL.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/IM.svg b/ccflags/svg/IM.svg new file mode 100644 index 0000000..26c2721 --- /dev/null +++ b/ccflags/svg/IM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/IN.svg b/ccflags/svg/IN.svg new file mode 100644 index 0000000..8e3537f --- /dev/null +++ b/ccflags/svg/IN.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/IO.svg b/ccflags/svg/IO.svg new file mode 100644 index 0000000..0f3ef14 --- /dev/null +++ b/ccflags/svg/IO.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/IQ.svg b/ccflags/svg/IQ.svg new file mode 100644 index 0000000..5937321 --- /dev/null +++ b/ccflags/svg/IQ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/IR.svg b/ccflags/svg/IR.svg new file mode 100644 index 0000000..5f4ba03 --- /dev/null +++ b/ccflags/svg/IR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/IS.svg b/ccflags/svg/IS.svg new file mode 100644 index 0000000..43cf1d4 --- /dev/null +++ b/ccflags/svg/IS.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/IT.svg b/ccflags/svg/IT.svg new file mode 100644 index 0000000..2eb1289 --- /dev/null +++ b/ccflags/svg/IT.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/JE.svg b/ccflags/svg/JE.svg new file mode 100644 index 0000000..63726b6 --- /dev/null +++ b/ccflags/svg/JE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/JM.svg b/ccflags/svg/JM.svg new file mode 100644 index 0000000..98d4f4b --- /dev/null +++ b/ccflags/svg/JM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/JO.svg b/ccflags/svg/JO.svg new file mode 100644 index 0000000..fa3f9ad --- /dev/null +++ b/ccflags/svg/JO.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/JP.svg b/ccflags/svg/JP.svg new file mode 100644 index 0000000..8714514 --- /dev/null +++ b/ccflags/svg/JP.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/KE.svg b/ccflags/svg/KE.svg new file mode 100644 index 0000000..ff76773 --- /dev/null +++ b/ccflags/svg/KE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/KG.svg b/ccflags/svg/KG.svg new file mode 100644 index 0000000..2d78279 --- /dev/null +++ b/ccflags/svg/KG.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/KH.svg b/ccflags/svg/KH.svg new file mode 100644 index 0000000..7f9df82 --- /dev/null +++ b/ccflags/svg/KH.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/KI.svg b/ccflags/svg/KI.svg new file mode 100644 index 0000000..2f4abd8 --- /dev/null +++ b/ccflags/svg/KI.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/KM.svg b/ccflags/svg/KM.svg new file mode 100644 index 0000000..82121dc --- /dev/null +++ b/ccflags/svg/KM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/KN.svg b/ccflags/svg/KN.svg new file mode 100644 index 0000000..1ad001b --- /dev/null +++ b/ccflags/svg/KN.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/KP.svg b/ccflags/svg/KP.svg new file mode 100644 index 0000000..cbd271f --- /dev/null +++ b/ccflags/svg/KP.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/KR.svg b/ccflags/svg/KR.svg new file mode 100644 index 0000000..93b93ec --- /dev/null +++ b/ccflags/svg/KR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/KW.svg b/ccflags/svg/KW.svg new file mode 100644 index 0000000..266cda3 --- /dev/null +++ b/ccflags/svg/KW.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/KY.svg b/ccflags/svg/KY.svg new file mode 100644 index 0000000..d70f115 --- /dev/null +++ b/ccflags/svg/KY.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/KZ.svg b/ccflags/svg/KZ.svg new file mode 100644 index 0000000..bb020c9 --- /dev/null +++ b/ccflags/svg/KZ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/LA.svg b/ccflags/svg/LA.svg new file mode 100644 index 0000000..09281c3 --- /dev/null +++ b/ccflags/svg/LA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/LB.svg b/ccflags/svg/LB.svg new file mode 100644 index 0000000..bd663ac --- /dev/null +++ b/ccflags/svg/LB.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/LC.svg b/ccflags/svg/LC.svg new file mode 100644 index 0000000..33511bb --- /dev/null +++ b/ccflags/svg/LC.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/LI.svg b/ccflags/svg/LI.svg new file mode 100644 index 0000000..20e2ca3 --- /dev/null +++ b/ccflags/svg/LI.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/LK.svg b/ccflags/svg/LK.svg new file mode 100644 index 0000000..78b239c --- /dev/null +++ b/ccflags/svg/LK.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/LR.svg b/ccflags/svg/LR.svg new file mode 100644 index 0000000..9866be4 --- /dev/null +++ b/ccflags/svg/LR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/LS.svg b/ccflags/svg/LS.svg new file mode 100644 index 0000000..2450492 --- /dev/null +++ b/ccflags/svg/LS.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/LT.svg b/ccflags/svg/LT.svg new file mode 100644 index 0000000..47343ca --- /dev/null +++ b/ccflags/svg/LT.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/LU.svg b/ccflags/svg/LU.svg new file mode 100644 index 0000000..8aa2421 --- /dev/null +++ b/ccflags/svg/LU.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/LV.svg b/ccflags/svg/LV.svg new file mode 100644 index 0000000..a420dbf --- /dev/null +++ b/ccflags/svg/LV.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/LY.svg b/ccflags/svg/LY.svg new file mode 100644 index 0000000..1f3ff6b --- /dev/null +++ b/ccflags/svg/LY.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MA.svg b/ccflags/svg/MA.svg new file mode 100644 index 0000000..8b33ccf --- /dev/null +++ b/ccflags/svg/MA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MC.svg b/ccflags/svg/MC.svg new file mode 100644 index 0000000..06df387 --- /dev/null +++ b/ccflags/svg/MC.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MD.svg b/ccflags/svg/MD.svg new file mode 100644 index 0000000..c755eee --- /dev/null +++ b/ccflags/svg/MD.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/ME.svg b/ccflags/svg/ME.svg new file mode 100644 index 0000000..35ccee2 --- /dev/null +++ b/ccflags/svg/ME.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MF.svg b/ccflags/svg/MF.svg new file mode 100644 index 0000000..ff13ef7 --- /dev/null +++ b/ccflags/svg/MF.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MG.svg b/ccflags/svg/MG.svg new file mode 100644 index 0000000..25fb05d --- /dev/null +++ b/ccflags/svg/MG.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MH.svg b/ccflags/svg/MH.svg new file mode 100644 index 0000000..ee87421 --- /dev/null +++ b/ccflags/svg/MH.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MK.svg b/ccflags/svg/MK.svg new file mode 100644 index 0000000..56ee6e1 --- /dev/null +++ b/ccflags/svg/MK.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/ML.svg b/ccflags/svg/ML.svg new file mode 100644 index 0000000..1727bc8 --- /dev/null +++ b/ccflags/svg/ML.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MM.svg b/ccflags/svg/MM.svg new file mode 100644 index 0000000..4eff4ee --- /dev/null +++ b/ccflags/svg/MM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MN.svg b/ccflags/svg/MN.svg new file mode 100644 index 0000000..6624023 --- /dev/null +++ b/ccflags/svg/MN.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MO.svg b/ccflags/svg/MO.svg new file mode 100644 index 0000000..cf248f9 --- /dev/null +++ b/ccflags/svg/MO.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MP.svg b/ccflags/svg/MP.svg new file mode 100644 index 0000000..0bd240a --- /dev/null +++ b/ccflags/svg/MP.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MQ.svg b/ccflags/svg/MQ.svg new file mode 100644 index 0000000..6bdf4b6 --- /dev/null +++ b/ccflags/svg/MQ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MR.svg b/ccflags/svg/MR.svg new file mode 100644 index 0000000..0311a1c --- /dev/null +++ b/ccflags/svg/MR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MS.svg b/ccflags/svg/MS.svg new file mode 100644 index 0000000..f4f9735 --- /dev/null +++ b/ccflags/svg/MS.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MT.svg b/ccflags/svg/MT.svg new file mode 100644 index 0000000..cc11c9e --- /dev/null +++ b/ccflags/svg/MT.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MU.svg b/ccflags/svg/MU.svg new file mode 100644 index 0000000..a367b14 --- /dev/null +++ b/ccflags/svg/MU.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MV.svg b/ccflags/svg/MV.svg new file mode 100644 index 0000000..4cc7ebc --- /dev/null +++ b/ccflags/svg/MV.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MW.svg b/ccflags/svg/MW.svg new file mode 100644 index 0000000..44fb0cb --- /dev/null +++ b/ccflags/svg/MW.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MX.svg b/ccflags/svg/MX.svg new file mode 100644 index 0000000..bbdf84d --- /dev/null +++ b/ccflags/svg/MX.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MY.svg b/ccflags/svg/MY.svg new file mode 100644 index 0000000..38cc877 --- /dev/null +++ b/ccflags/svg/MY.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/MZ.svg b/ccflags/svg/MZ.svg new file mode 100644 index 0000000..a11eeda --- /dev/null +++ b/ccflags/svg/MZ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/NA.svg b/ccflags/svg/NA.svg new file mode 100644 index 0000000..a9f5a41 --- /dev/null +++ b/ccflags/svg/NA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/NC.svg b/ccflags/svg/NC.svg new file mode 100644 index 0000000..09ee863 --- /dev/null +++ b/ccflags/svg/NC.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/NE.svg b/ccflags/svg/NE.svg new file mode 100644 index 0000000..3c09399 --- /dev/null +++ b/ccflags/svg/NE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/NF.svg b/ccflags/svg/NF.svg new file mode 100644 index 0000000..f08fdbd --- /dev/null +++ b/ccflags/svg/NF.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/NG.svg b/ccflags/svg/NG.svg new file mode 100644 index 0000000..624166b --- /dev/null +++ b/ccflags/svg/NG.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/NI.svg b/ccflags/svg/NI.svg new file mode 100644 index 0000000..c0a05ca --- /dev/null +++ b/ccflags/svg/NI.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/NL.svg b/ccflags/svg/NL.svg new file mode 100644 index 0000000..3c762c3 --- /dev/null +++ b/ccflags/svg/NL.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/NO.svg b/ccflags/svg/NO.svg new file mode 100644 index 0000000..28a0c5d --- /dev/null +++ b/ccflags/svg/NO.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/NP.svg b/ccflags/svg/NP.svg new file mode 100644 index 0000000..373df1e --- /dev/null +++ b/ccflags/svg/NP.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/NR.svg b/ccflags/svg/NR.svg new file mode 100644 index 0000000..9552cc3 --- /dev/null +++ b/ccflags/svg/NR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/NU.svg b/ccflags/svg/NU.svg new file mode 100644 index 0000000..fc5183e --- /dev/null +++ b/ccflags/svg/NU.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/NZ.svg b/ccflags/svg/NZ.svg new file mode 100644 index 0000000..c5b41b5 --- /dev/null +++ b/ccflags/svg/NZ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/OL.svg b/ccflags/svg/OL.svg new file mode 100644 index 0000000..7d852b6 --- /dev/null +++ b/ccflags/svg/OL.svg @@ -0,0 +1,44 @@ + + + + + + + diff --git a/ccflags/svg/OM.svg b/ccflags/svg/OM.svg new file mode 100644 index 0000000..3fba679 --- /dev/null +++ b/ccflags/svg/OM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PA.svg b/ccflags/svg/PA.svg new file mode 100644 index 0000000..a6f5940 --- /dev/null +++ b/ccflags/svg/PA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PE.svg b/ccflags/svg/PE.svg new file mode 100644 index 0000000..16360e3 --- /dev/null +++ b/ccflags/svg/PE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PF.svg b/ccflags/svg/PF.svg new file mode 100644 index 0000000..a66c420 --- /dev/null +++ b/ccflags/svg/PF.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PG.svg b/ccflags/svg/PG.svg new file mode 100644 index 0000000..6ef2aa3 --- /dev/null +++ b/ccflags/svg/PG.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PH.svg b/ccflags/svg/PH.svg new file mode 100644 index 0000000..7533140 --- /dev/null +++ b/ccflags/svg/PH.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PK.svg b/ccflags/svg/PK.svg new file mode 100644 index 0000000..f16fe95 --- /dev/null +++ b/ccflags/svg/PK.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PL.svg b/ccflags/svg/PL.svg new file mode 100644 index 0000000..82b564b --- /dev/null +++ b/ccflags/svg/PL.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PM.svg b/ccflags/svg/PM.svg new file mode 100644 index 0000000..ec311d7 --- /dev/null +++ b/ccflags/svg/PM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PN.svg b/ccflags/svg/PN.svg new file mode 100644 index 0000000..1593ef6 --- /dev/null +++ b/ccflags/svg/PN.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PR.svg b/ccflags/svg/PR.svg new file mode 100644 index 0000000..c0878bb --- /dev/null +++ b/ccflags/svg/PR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PS.svg b/ccflags/svg/PS.svg new file mode 100644 index 0000000..3f5fed7 --- /dev/null +++ b/ccflags/svg/PS.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PT.svg b/ccflags/svg/PT.svg new file mode 100644 index 0000000..407b0ec --- /dev/null +++ b/ccflags/svg/PT.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PW.svg b/ccflags/svg/PW.svg new file mode 100644 index 0000000..1ac8419 --- /dev/null +++ b/ccflags/svg/PW.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/PY.svg b/ccflags/svg/PY.svg new file mode 100644 index 0000000..967a7e7 --- /dev/null +++ b/ccflags/svg/PY.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/QA.svg b/ccflags/svg/QA.svg new file mode 100644 index 0000000..a0a666f --- /dev/null +++ b/ccflags/svg/QA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/RE.svg b/ccflags/svg/RE.svg new file mode 100644 index 0000000..ec311d7 --- /dev/null +++ b/ccflags/svg/RE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/RO.svg b/ccflags/svg/RO.svg new file mode 100644 index 0000000..fabf12e --- /dev/null +++ b/ccflags/svg/RO.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/RS.svg b/ccflags/svg/RS.svg new file mode 100644 index 0000000..de18ca1 --- /dev/null +++ b/ccflags/svg/RS.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/RU.svg b/ccflags/svg/RU.svg new file mode 100644 index 0000000..1117270 --- /dev/null +++ b/ccflags/svg/RU.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/RW.svg b/ccflags/svg/RW.svg new file mode 100644 index 0000000..73a7a7c --- /dev/null +++ b/ccflags/svg/RW.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SA.svg b/ccflags/svg/SA.svg new file mode 100644 index 0000000..d898f67 --- /dev/null +++ b/ccflags/svg/SA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SB.svg b/ccflags/svg/SB.svg new file mode 100644 index 0000000..9970ee8 --- /dev/null +++ b/ccflags/svg/SB.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SC.svg b/ccflags/svg/SC.svg new file mode 100644 index 0000000..df5386b --- /dev/null +++ b/ccflags/svg/SC.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SD.svg b/ccflags/svg/SD.svg new file mode 100644 index 0000000..0a5f70f --- /dev/null +++ b/ccflags/svg/SD.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SE.svg b/ccflags/svg/SE.svg new file mode 100644 index 0000000..7ec1787 --- /dev/null +++ b/ccflags/svg/SE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SG.svg b/ccflags/svg/SG.svg new file mode 100644 index 0000000..c374c47 --- /dev/null +++ b/ccflags/svg/SG.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SH.svg b/ccflags/svg/SH.svg new file mode 100644 index 0000000..67f09f7 --- /dev/null +++ b/ccflags/svg/SH.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SI.svg b/ccflags/svg/SI.svg new file mode 100644 index 0000000..8d8c70c --- /dev/null +++ b/ccflags/svg/SI.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SJ.svg b/ccflags/svg/SJ.svg new file mode 100644 index 0000000..28a0c5d --- /dev/null +++ b/ccflags/svg/SJ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SK.svg b/ccflags/svg/SK.svg new file mode 100644 index 0000000..300f814 --- /dev/null +++ b/ccflags/svg/SK.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SL.svg b/ccflags/svg/SL.svg new file mode 100644 index 0000000..588393d --- /dev/null +++ b/ccflags/svg/SL.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SM.svg b/ccflags/svg/SM.svg new file mode 100644 index 0000000..cfd3f1a --- /dev/null +++ b/ccflags/svg/SM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SN.svg b/ccflags/svg/SN.svg new file mode 100644 index 0000000..85b2c85 --- /dev/null +++ b/ccflags/svg/SN.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SO.svg b/ccflags/svg/SO.svg new file mode 100644 index 0000000..1ee75a6 --- /dev/null +++ b/ccflags/svg/SO.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SR.svg b/ccflags/svg/SR.svg new file mode 100644 index 0000000..c6e1ba6 --- /dev/null +++ b/ccflags/svg/SR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SS.svg b/ccflags/svg/SS.svg new file mode 100644 index 0000000..65f8191 --- /dev/null +++ b/ccflags/svg/SS.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/ST.svg b/ccflags/svg/ST.svg new file mode 100644 index 0000000..2f4f5f4 --- /dev/null +++ b/ccflags/svg/ST.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SV.svg b/ccflags/svg/SV.svg new file mode 100644 index 0000000..c4b1c30 --- /dev/null +++ b/ccflags/svg/SV.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SX.svg b/ccflags/svg/SX.svg new file mode 100644 index 0000000..5511e2f --- /dev/null +++ b/ccflags/svg/SX.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SY.svg b/ccflags/svg/SY.svg new file mode 100644 index 0000000..bb439bf --- /dev/null +++ b/ccflags/svg/SY.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/SZ.svg b/ccflags/svg/SZ.svg new file mode 100644 index 0000000..acf86aa --- /dev/null +++ b/ccflags/svg/SZ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TA.svg b/ccflags/svg/TA.svg new file mode 100644 index 0000000..502683a --- /dev/null +++ b/ccflags/svg/TA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TC.svg b/ccflags/svg/TC.svg new file mode 100644 index 0000000..b510da0 --- /dev/null +++ b/ccflags/svg/TC.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TD.svg b/ccflags/svg/TD.svg new file mode 100644 index 0000000..3c11067 --- /dev/null +++ b/ccflags/svg/TD.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TF.svg b/ccflags/svg/TF.svg new file mode 100644 index 0000000..f9232b9 --- /dev/null +++ b/ccflags/svg/TF.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TG.svg b/ccflags/svg/TG.svg new file mode 100644 index 0000000..e1e26c2 --- /dev/null +++ b/ccflags/svg/TG.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TH.svg b/ccflags/svg/TH.svg new file mode 100644 index 0000000..01b837c --- /dev/null +++ b/ccflags/svg/TH.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TJ.svg b/ccflags/svg/TJ.svg new file mode 100644 index 0000000..f9d8ffa --- /dev/null +++ b/ccflags/svg/TJ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TK.svg b/ccflags/svg/TK.svg new file mode 100644 index 0000000..080b4af --- /dev/null +++ b/ccflags/svg/TK.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TL.svg b/ccflags/svg/TL.svg new file mode 100644 index 0000000..c2d3e1e --- /dev/null +++ b/ccflags/svg/TL.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TM.svg b/ccflags/svg/TM.svg new file mode 100644 index 0000000..75d107f --- /dev/null +++ b/ccflags/svg/TM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TN.svg b/ccflags/svg/TN.svg new file mode 100644 index 0000000..7cbdb90 --- /dev/null +++ b/ccflags/svg/TN.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TO.svg b/ccflags/svg/TO.svg new file mode 100644 index 0000000..4e31c70 --- /dev/null +++ b/ccflags/svg/TO.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TR.svg b/ccflags/svg/TR.svg new file mode 100644 index 0000000..1e08e23 --- /dev/null +++ b/ccflags/svg/TR.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TT.svg b/ccflags/svg/TT.svg new file mode 100644 index 0000000..23886ae --- /dev/null +++ b/ccflags/svg/TT.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TV.svg b/ccflags/svg/TV.svg new file mode 100644 index 0000000..d8caff3 --- /dev/null +++ b/ccflags/svg/TV.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TW.svg b/ccflags/svg/TW.svg new file mode 100644 index 0000000..c3660f1 --- /dev/null +++ b/ccflags/svg/TW.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/TZ.svg b/ccflags/svg/TZ.svg new file mode 100644 index 0000000..480cbec --- /dev/null +++ b/ccflags/svg/TZ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/UA.svg b/ccflags/svg/UA.svg new file mode 100644 index 0000000..8eaa507 --- /dev/null +++ b/ccflags/svg/UA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/UG.svg b/ccflags/svg/UG.svg new file mode 100644 index 0000000..488d395 --- /dev/null +++ b/ccflags/svg/UG.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/UM.svg b/ccflags/svg/UM.svg new file mode 100644 index 0000000..dc427e7 --- /dev/null +++ b/ccflags/svg/UM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/US.svg b/ccflags/svg/US.svg new file mode 100644 index 0000000..dc427e7 --- /dev/null +++ b/ccflags/svg/US.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/UY.svg b/ccflags/svg/UY.svg new file mode 100644 index 0000000..9ee475c --- /dev/null +++ b/ccflags/svg/UY.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/UZ.svg b/ccflags/svg/UZ.svg new file mode 100644 index 0000000..cec70f0 --- /dev/null +++ b/ccflags/svg/UZ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/VA.svg b/ccflags/svg/VA.svg new file mode 100644 index 0000000..15621e7 --- /dev/null +++ b/ccflags/svg/VA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/VC.svg b/ccflags/svg/VC.svg new file mode 100644 index 0000000..2db5414 --- /dev/null +++ b/ccflags/svg/VC.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/VE.svg b/ccflags/svg/VE.svg new file mode 100644 index 0000000..07cf3a8 --- /dev/null +++ b/ccflags/svg/VE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/VG.svg b/ccflags/svg/VG.svg new file mode 100644 index 0000000..a66195e --- /dev/null +++ b/ccflags/svg/VG.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/VI.svg b/ccflags/svg/VI.svg new file mode 100644 index 0000000..3d5556e --- /dev/null +++ b/ccflags/svg/VI.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/VN.svg b/ccflags/svg/VN.svg new file mode 100644 index 0000000..d52233d --- /dev/null +++ b/ccflags/svg/VN.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/VU.svg b/ccflags/svg/VU.svg new file mode 100644 index 0000000..a1c9397 --- /dev/null +++ b/ccflags/svg/VU.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/WA.svg b/ccflags/svg/WA.svg new file mode 100644 index 0000000..da4893b --- /dev/null +++ b/ccflags/svg/WA.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + diff --git a/ccflags/svg/WF.svg b/ccflags/svg/WF.svg new file mode 100644 index 0000000..592f0fb --- /dev/null +++ b/ccflags/svg/WF.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/WS.svg b/ccflags/svg/WS.svg new file mode 100644 index 0000000..b198a8f --- /dev/null +++ b/ccflags/svg/WS.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/XK.svg b/ccflags/svg/XK.svg new file mode 100644 index 0000000..d31fca8 --- /dev/null +++ b/ccflags/svg/XK.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/YE.svg b/ccflags/svg/YE.svg new file mode 100644 index 0000000..0149232 --- /dev/null +++ b/ccflags/svg/YE.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/YT.svg b/ccflags/svg/YT.svg new file mode 100644 index 0000000..1196883 --- /dev/null +++ b/ccflags/svg/YT.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/ZA.svg b/ccflags/svg/ZA.svg new file mode 100644 index 0000000..1b294c9 --- /dev/null +++ b/ccflags/svg/ZA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/ZM.svg b/ccflags/svg/ZM.svg new file mode 100644 index 0000000..5ab44ec --- /dev/null +++ b/ccflags/svg/ZM.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/ZW.svg b/ccflags/svg/ZW.svg new file mode 100644 index 0000000..8bba16a --- /dev/null +++ b/ccflags/svg/ZW.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/unused/AC.svg b/ccflags/svg/unused/AC.svg new file mode 100644 index 0000000..5339332 --- /dev/null +++ b/ccflags/svg/unused/AC.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/unused/GE-AB.svg b/ccflags/svg/unused/GE-AB.svg new file mode 100644 index 0000000..544852e --- /dev/null +++ b/ccflags/svg/unused/GE-AB.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/svg/unused/GE-OS.svg b/ccflags/svg/unused/GE-OS.svg new file mode 100644 index 0000000..18344e2 --- /dev/null +++ b/ccflags/svg/unused/GE-OS.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ccflags/world_map.png b/ccflags/world_map.png new file mode 100644 index 0000000..ac88fcf Binary files /dev/null and b/ccflags/world_map.png differ diff --git a/ccflags/world_map.svg b/ccflags/world_map.svg new file mode 100644 index 0000000..f1e25bc --- /dev/null +++ b/ccflags/world_map.svg @@ -0,0 +1,77 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/content_skaterift/textures/cc.qoi b/content_skaterift/textures/cc.qoi new file mode 100644 index 0000000..251ebaf Binary files /dev/null and b/content_skaterift/textures/cc.qoi differ diff --git a/content_skaterift/textures/menu_icons.qoi b/content_skaterift/textures/menu_icons.qoi new file mode 100644 index 0000000..695abb3 Binary files /dev/null and b/content_skaterift/textures/menu_icons.qoi differ diff --git a/content_skaterift/textures/world_map.qoi b/content_skaterift/textures/world_map.qoi new file mode 100644 index 0000000..b7acd84 Binary files /dev/null and b/content_skaterift/textures/world_map.qoi differ diff --git a/icons/blank.svg b/icons/blank.svg new file mode 100644 index 0000000..86e856d --- /dev/null +++ b/icons/blank.svg @@ -0,0 +1,58 @@ + + + + diff --git a/icons/early.svg b/icons/early.svg new file mode 100644 index 0000000..cb26e52 --- /dev/null +++ b/icons/early.svg @@ -0,0 +1,198 @@ + + + +EARLY +Supporter + diff --git a/icons/icon_comb.png b/icons/icon_comb.png new file mode 100644 index 0000000..2263421 Binary files /dev/null and b/icons/icon_comb.png differ diff --git a/icons/make.py b/icons/make.py new file mode 100644 index 0000000..7302a10 --- /dev/null +++ b/icons/make.py @@ -0,0 +1,49 @@ +import os.path + +f = open( "../src/ui_menu_icons.h0", "w" ) + +all = [ "early", "Early adopter", + "top3", "Global top 3 time record", + "top10", "Global top 10 time record" ] + +mega_string = "" +msl = 0 +enumvs = [] + +f.write( 'struct menu_icon_inf k_menu_icons[] = {' ) +for i in range(0,len(all)//2): +#{ + j = i*2 + ofs = msl + desc = all[j+1] + for c in desc: + mega_string += F"{ord(c)}," + msl += 1 + mega_string += "0," + msl += 1 + + f.write( '{'+ F'{ofs}' + '},\n' ) +#} +f.write( '};\n' ) +f.write( F'const char k_menu_icon_descriptions[] = {'{'}{mega_string}{'}'};\n' ) + +monstr = "" + +os.system( F"mkdir -p png" ) +f.write( 'enum menu_icon {\n' ) +for i in range(0,len(all)//2): +#{ + j = i*2 + f.write( F"k_menu_icon_{all[j]} = {i},\n" ) + os.system( F"inkscape -w 128 -h 128 {all[j]}.svg -o png/{all[j]}.png" ) + monstr += F"png/{all[j]}.png " +#} +f.write( '};\n' ) +f.close() + +os.system( F"inkscape -w 128 -h 128 blank.svg -o png/blank.png" ) +for i in range(8*8-len(all)//2): + monstr += "png/blank.png " + +os.system( F'montage {monstr} -tile 8x8 -geometry +0+0 -background transparent icon_comb.png' ) +print( "done" ) diff --git a/icons/top10.svg b/icons/top10.svg new file mode 100644 index 0000000..39d81da --- /dev/null +++ b/icons/top10.svg @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TOP 10 + + + + + + + diff --git a/icons/top3.svg b/icons/top3.svg new file mode 100644 index 0000000..968fd8c --- /dev/null +++ b/icons/top3.svg @@ -0,0 +1,420 @@ + + + +TOP 3 diff --git a/src/cc.h b/src/cc.h new file mode 100644 index 0000000..9adb09b --- /dev/null +++ b/src/cc.h @@ -0,0 +1,259 @@ +struct country k_countries[] = {{0,0.680556f,0.637195f}, +{12,0.555278f,0.831495f}, +{26,0.504139f,0.771903f}, +{34,0.555556f,0.694518f}, +{42,0.508333f,0.601369f}, +{50,0.027778f,0.298037f}, +{65,0.504444f,0.705266f}, +{73,0.551389f,0.311173f}, +{80,0.324537f,0.531507f}, +{89,0.500000f,0.000000f}, +{100,0.328333f,0.522909f}, +{120,0.322222f,0.157119f}, +{130,0.625000f,0.687353f}, +{138,0.305648f,0.490306f}, +{144,0.869444f,0.207276f}, +{154,0.537037f,0.739898f}, +{162,0.631944f,0.690935f}, +{173,0.288889f,0.574499f}, +{181,0.640417f,0.587038f}, +{189,0.750000f,0.572708f}, +{200,0.334630f,0.495084f}, +{209,0.577778f,0.780502f}, +{217,0.511111f,0.764977f}, +{225,0.253472f,0.524342f}, +{232,0.506250f,0.468810f}, +{238,0.320139f,0.632418f}, +{246,0.751389f,0.597786f}, +{253,0.319444f,0.278929f}, +{261,0.310463f,0.488037f}, +{294,0.550000f,0.716014f}, +{317,0.566667f,0.243103f}, +{326,0.509444f,0.010708f}, +{340,0.347222f,0.329087f}, +{347,0.698611f,0.357748f}, +{378,0.818519f,0.432984f}, +{385,0.569444f,0.708849f}, +{394,0.494444f,0.493889f}, +{407,0.583333f,0.375661f}, +{415,0.791667f,0.493889f}, +{424,0.533333f,0.443732f}, +{433,0.236111f,0.830659f}, +{440,0.433333f,0.515385f}, +{451,0.276389f,0.540464f}, +{466,0.558333f,0.450897f}, +{491,0.552778f,0.508220f}, +{496,0.302778f,0.185780f}, +{502,0.791667f,0.651526f}, +{508,0.793519f,0.325504f}, +{525,0.768981f,0.311173f}, +{549,0.300000f,0.429401f}, +{558,0.622917f,0.313562f}, +{566,0.569444f,0.400740f}, +{576,0.541667f,0.393575f}, +{582,0.056204f,0.248596f}, +{595,0.266667f,0.472393f}, +{606,0.543056f,0.724374f}, +{614,0.277778f,0.554794f}, +{619,0.308426f,0.487918f}, +{627,0.591667f,0.651526f}, +{634,0.543056f,0.757215f}, +{649,0.527778f,0.801998f}, +{657,0.619444f,0.483141f}, +{666,0.329630f,0.511205f}, +{675,0.303704f,0.536881f}, +{694,0.284722f,0.386409f}, +{702,0.583333f,0.594204f}, +{708,0.253009f,0.499860f}, +{720,0.527778f,0.415071f}, +{738,0.608333f,0.508220f}, +{746,0.572222f,0.823494f}, +{754,0.605556f,0.458062f}, +{763,0.336111f,0.029935f}, +{791,0.480556f,0.844990f}, +{805,0.986111f,0.271764f}, +{810,0.572222f,0.859320f}, +{818,0.505556f,0.730345f}, +{825,0.352778f,0.429401f}, +{839,0.111111f,0.293260f}, +{856,0.686111f,0.092631f}, +{884,0.532639f,0.393575f}, +{890,0.453981f,0.497233f}, +{897,0.620833f,0.701683f}, +{905,0.525000f,0.766171f}, +{913,0.494444f,0.458062f}, +{919,0.485092f,0.660005f}, +{929,0.561111f,0.680187f}, +{936,0.388889f,0.916643f}, +{946,0.328704f,0.487560f}, +{954,0.328935f,0.517176f}, +{965,0.902176f,0.497233f}, +{970,0.249306f,0.511802f}, +{980,0.492889f,0.755423f}, +{989,0.458333f,0.486724f}, +{1003,0.472222f,0.479558f}, +{1010,0.336111f,0.436566f}, +{1017,0.298843f,0.536881f}, +{1023,0.701435f,0.020261f}, +{1042,0.534583f,0.700967f}, +{1055,0.259722f,0.508220f}, +{1064,0.817130f,0.560168f}, +{1074,0.555556f,0.737510f}, +{1082,0.450000f,0.866486f}, +{1090,0.713889f,0.544046f}, +{1096,0.833333f,0.364913f}, +{1106,0.647222f,0.630030f}, +{1111,0.622222f,0.637195f}, +{1116,0.487361f,0.789315f}, +{1128,0.596528f,0.626447f}, +{1135,0.535648f,0.707654f}, +{1141,0.486111f,0.458062f}, +{1153,0.284722f,0.531507f}, +{1161,0.883333f,0.658691f}, +{1167,0.494083f,0.753345f}, +{1174,0.600000f,0.622865f}, +{1181,0.688889f,0.744675f}, +{1192,0.605556f,0.407905f}, +{1198,0.980556f,0.410891f}, +{1207,0.852778f,0.687353f}, +{1219,0.558333f,0.705863f}, +{1226,0.632384f,0.610952f}, +{1233,0.708333f,0.694518f}, +{1244,0.791667f,0.529716f}, +{1252,0.569444f,0.809163f}, +{1259,0.599537f,0.643166f}, +{1267,0.579167f,0.189363f}, +{1275,0.473611f,0.447314f}, +{1283,0.547222f,0.579873f}, +{1289,0.526481f,0.738704f}, +{1303,0.566667f,0.801998f}, +{1313,0.517130f,0.757215f}, +{1324,0.815417f,0.559571f}, +{1330,0.561111f,0.700489f}, +{1340,0.630556f,0.257433f}, +{1351,0.594444f,0.304008f}, +{1358,0.812500f,0.418653f}, +{1367,0.702778f,0.424027f}, +{1376,0.488889f,0.522550f}, +{1381,0.540509f,0.657497f}, +{1387,0.966667f,0.465228f}, +{1404,0.330556f,0.505831f}, +{1415,0.466667f,0.544046f}, +{1426,0.659861f,0.255404f}, +{1436,0.625463f,0.308785f}, +{1444,0.216667f,0.565542f}, +{1451,0.939583f,0.450300f}, +{1483,0.580556f,0.737510f}, +{1504,0.520556f,0.714103f}, +{1511,0.791667f,0.730345f}, +{1520,0.552778f,0.701683f}, +{1531,0.327222f,0.520759f}, +{1542,0.486111f,0.630030f}, +{1550,0.597222f,0.269973f}, +{1561,0.772222f,0.558377f}, +{1569,0.547222f,0.243103f}, +{1577,0.963658f,0.396919f}, +{1583,0.733333f,0.601369f}, +{1589,0.515972f,0.776919f}, +{1601,0.959722f,0.246685f}, +{1615,0.983333f,0.106962f}, +{1627,0.263889f,0.493889f}, +{1637,0.522222f,0.515385f}, +{1643,0.522222f,0.472393f}, +{1651,0.028148f,0.264360f}, +{1656,0.966528f,0.192707f}, +{1671,0.904861f,0.509653f}, +{1696,0.527778f,0.844990f}, +{1703,0.658333f,0.551212f}, +{1708,0.694444f,0.615699f}, +{1717,0.873611f,0.454480f}, +{1723,0.597917f,0.630030f}, +{1733,0.277778f,0.465228f}, +{1740,0.908333f,0.357748f}, +{1757,0.338889f,0.235938f}, +{1766,0.288889f,0.329087f}, +{1771,0.838889f,0.493889f}, +{1783,0.146111f,0.223756f}, +{1792,0.555556f,0.773337f}, +{1799,0.477778f,0.683770f}, +{1808,0.315278f,0.531507f}, +{1820,0.642361f,0.583456f}, +{1826,0.654444f,0.249552f}, +{1834,0.569444f,0.730345f}, +{1842,0.777778f,0.830659f}, +{1849,0.583333f,0.386409f}, +{1856,0.325460f,0.528983f}, +{1873,0.484167f,0.286573f}, +{1918,0.325694f,0.524939f}, +{1940,0.330185f,0.500218f}, +{1952,0.324833f,0.530255f}, +{1979,0.343519f,0.736315f}, +{2005,0.330000f,0.495680f}, +{2036,0.021296f,0.303411f}, +{2042,0.534491f,0.714342f}, +{2053,0.519444f,0.407905f}, +{2075,0.625000f,0.579873f}, +{2088,0.461111f,0.501054f}, +{2096,0.558333f,0.716014f}, +{2103,0.654630f,0.367899f}, +{2114,0.468056f,0.461645f}, +{2127,0.788333f,0.410533f}, +{2137,0.324861f,0.529954f}, +{2163,0.554167f,0.749452f}, +{2172,0.541667f,0.730345f}, +{2181,0.941667f,0.343417f}, +{2197,0.636111f,0.472393f}, +{2205,0.566667f,0.192946f}, +{2218,0.397222f,0.010230f}, +{2263,0.854167f,0.665857f}, +{2275,0.583333f,0.458062f}, +{2287,0.488889f,0.687353f}, +{2293,0.725000f,0.450897f}, +{2303,0.583333f,0.508220f}, +{2309,0.344444f,0.429401f}, +{2318,0.555556f,0.959635f}, +{2341,0.587500f,0.210859f}, +{2351,0.541667f,0.844990f}, +{2358,0.522222f,0.737510f}, +{2370,0.605556f,0.651526f}, +{2391,0.836111f,0.569125f}, +{2398,0.697222f,0.680187f}, +{2409,0.597222f,0.357748f}, +{2438,0.777778f,0.508220f}, +{2447,0.848658f,0.339476f}, +{2459,0.503241f,0.458062f}, +{2464,0.022222f,0.336252f}, +{2472,0.013889f,0.257433f}, +{2478,0.330556f,0.479558f}, +{2498,0.525000f,0.644361f}, +{2506,0.597222f,0.680187f}, +{2513,0.666667f,0.687353f}, +{2526,0.301158f,0.556586f}, +{2551,0.994444f,0.343417f}, +{2558,0.588889f,0.407905f}, +{2565,0.588889f,0.751841f}, +{2573,0.650000f,0.572708f}, +{2594,0.500000f,0.769181f}, +{2602,0.489000f,0.804577f}, +{2611,0.489361f,0.774411f}, +{2617,0.962778f,0.538911f}, +{2654,0.230556f,0.673022f}, +{2668,0.344444f,0.164284f}, +{2676,0.677778f,0.694518f}, +{2687,0.963889f,0.286095f}, +{2695,0.316667f,0.458062f}, +{2705,0.794444f,0.515385f}, +{2713,0.477778f,0.780502f}, +{2721,0.320833f,0.533298f}, +{2745,0.319908f,0.532104f}, +{2766,0.010556f,0.305441f}, +{2784,0.463889f,0.576290f}, +{2799,0.633333f,0.508220f}, +{2805,0.583333f,0.293260f}, +{2812,0.532778f,0.755638f}, +{2815,0.494444f,0.787667f}, +{2830,0.583333f,0.257433f}, +}; +const char k_country_names[] = {65,102,103,104,97,110,105,115,116,97,110,0,65,108,97,110,100,32,73,115,108,97,110,100,115,0,83,101,97,108,97,110,100,0,65,108,98,97,110,105,97,0,65,108,103,101,114,105,97,0,65,109,101,114,105,99,97,110,32,83,97,109,111,97,0,65,110,100,111,114,114,97,0,65,110,103,111,108,97,0,65,110,103,117,105,108,108,97,0,65,110,116,97,114,99,116,105,99,97,0,65,110,116,105,103,117,97,32,97,110,100,32,66,97,114,98,117,100,97,0,65,114,103,101,110,116,105,110,97,0,65,114,109,101,110,105,97,0,65,114,117,98,97,0,65,117,115,116,114,97,108,105,97,0,65,117,115,116,114,105,97,0,65,122,101,114,98,97,105,106,97,110,0,66,97,104,97,109,97,115,0,66,97,104,114,97,105,110,0,66,97,110,103,108,97,100,101,115,104,0,66,97,114,98,97,100,111,115,0,66,101,108,97,114,117,115,0,66,101,108,103,105,117,109,0,66,101,108,105,122,101,0,66,101,110,105,110,0,66,101,114,109,117,100,97,0,66,104,117,116,97,110,0,66,111,108,105,118,105,97,0,66,111,110,97,105,114,101,44,32,83,105,110,116,32,69,117,115,116,97,116,105,117,115,32,97,110,100,32,83,97,98,97,0,66,111,115,110,105,97,32,97,110,100,32,72,101,114,122,101,103,111,118,105,110,97,0,66,111,116,115,119,97,110,97,0,66,111,117,118,101,116,32,73,115,108,97,110,100,0,66,114,97,122,105,108,0,66,114,105,116,105,115,104,32,73,110,100,105,97,110,32,79,99,101,97,110,32,84,101,114,114,105,116,111,114,121,0,66,114,117,110,101,105,0,66,117,108,103,97,114,105,97,0,66,117,114,107,105,110,97,32,70,97,115,111,0,66,117,114,117,110,100,105,0,67,97,109,98,111,100,105,97,0,67,97,109,101,114,111,111,110,0,67,97,110,97,100,97,0,67,97,112,101,32,86,101,114,100,101,0,67,97,121,109,97,110,32,73,115,108,97,110,100,115,0,67,101,110,116,114,97,108,32,65,102,114,105,99,97,110,32,82,101,112,117,98,108,105,99,0,67,104,97,100,0,67,104,105,108,101,0,67,104,105,110,97,0,67,104,114,105,115,116,109,97,115,32,73,115,108,97,110,100,0,67,111,99,111,115,32,40,75,101,101,108,105,110,103,41,32,73,115,108,97,110,100,115,0,67,111,108,111,109,98,105,97,0,67,111,109,111,114,111,115,0,67,111,110,103,111,44,32,68,82,0,67,111,110,103,111,0,67,111,111,107,32,73,115,108,97,110,100,115,0,67,111,115,116,97,32,82,105,99,97,0,67,114,111,97,116,105,97,0,67,117,98,97,0,67,117,114,97,67,97,111,0,67,121,112,114,117,115,0,67,122,101,99,104,32,82,101,112,117,98,108,105,99,0,68,101,110,109,97,114,107,0,68,106,105,98,111,117,116,105,0,68,111,109,105,110,105,99,97,0,68,111,109,105,110,105,99,97,110,32,82,101,112,117,98,108,105,99,0,69,99,117,97,100,111,114,0,69,103,121,112,116,0,69,108,32,83,97,108,118,97,100,111,114,0,69,113,117,97,116,111,114,105,97,108,32,71,117,105,110,101,97,0,69,114,105,116,114,101,97,0,69,115,116,111,110,105,97,0,69,116,104,105,111,112,105,97,0,70,97,108,107,108,97,110,100,32,73,115,108,97,110,100,115,32,40,77,97,108,118,105,110,97,115,41,0,70,97,114,111,101,32,73,115,108,97,110,100,115,0,70,105,106,105,0,70,105,110,108,97,110,100,0,70,114,97,110,99,101,0,70,114,101,110,99,104,32,71,117,105,97,110,97,0,70,114,101,110,99,104,32,80,111,108,121,110,101,115,105,97,0,70,114,101,110,99,104,32,83,111,117,116,104,101,114,110,32,84,101,114,114,105,116,111,114,105,101,115,0,71,97,98,111,110,0,71,97,109,98,105,97,0,71,101,111,114,103,105,97,0,71,101,114,109,97,110,121,0,71,104,97,110,97,0,71,105,98,114,97,108,116,97,114,0,71,114,101,101,99,101,0,71,114,101,101,110,108,97,110,100,0,71,114,101,110,97,100,97,0,71,117,97,100,101,108,111,117,112,101,0,71,117,97,109,0,71,117,97,116,101,109,97,108,97,0,71,117,101,114,110,115,101,121,0,71,117,105,110,101,97,45,66,105,115,115,97,117,0,71,117,105,110,101,97,0,71,117,121,97,110,97,0,72,97,105,116,105,0,72,101,97,114,100,32,97,110,100,32,77,99,68,111,110,97,108,100,0,86,97,116,105,99,97,110,32,67,105,116,121,0,72,111,110,100,117,114,97,115,0,72,111,110,103,32,75,111,110,103,0,72,117,110,103,97,114,121,0,73,99,101,108,97,110,100,0,73,110,100,105,97,0,73,110,100,111,110,101,115,105,97,0,73,114,97,110,0,73,114,97,113,0,73,115,108,101,32,111,102,32,77,97,110,0,73,115,114,97,101,108,0,73,116,97,108,121,0,73,118,111,114,121,32,67,111,97,115,116,0,74,97,109,97,105,99,97,0,74,97,112,97,110,0,74,101,114,115,101,121,0,74,111,114,100,97,110,0,75,97,122,97,107,104,115,116,97,110,0,75,101,110,121,97,0,75,105,114,105,98,97,116,105,0,75,111,114,101,97,44,32,68,80,82,75,0,75,111,115,111,118,111,0,75,117,119,97,105,116,0,75,121,114,103,121,122,115,116,97,110,0,76,97,111,32,80,68,82,0,76,97,116,118,105,97,0,76,101,98,97,110,111,110,0,76,101,115,111,116,104,111,0,76,105,98,101,114,105,97,0,76,105,98,121,97,0,76,105,101,99,104,116,101,110,115,116,101,105,110,0,76,105,116,104,117,97,110,105,97,0,76,117,120,101,109,98,111,117,114,103,0,77,97,99,97,111,0,77,97,99,101,100,111,110,105,97,0,77,97,100,97,103,97,115,99,97,114,0,77,97,108,97,119,105,0,77,97,108,97,121,115,105,97,0,77,97,108,100,105,118,101,115,0,77,97,108,105,0,77,97,108,116,97,0,77,97,114,115,104,97,108,108,32,73,115,108,97,110,100,115,0,77,97,114,116,105,110,105,113,117,101,0,77,97,117,114,105,116,97,110,105,97,0,77,97,117,114,105,116,105,117,115,0,77,97,121,111,116,116,101,0,77,101,120,105,99,111,0,77,105,99,114,111,110,101,115,105,97,44,32,70,101,100,101,114,97,116,101,100,32,83,116,97,116,101,115,32,111,102,0,77,111,108,100,111,118,97,44,32,82,101,112,117,98,108,105,99,32,111,102,0,77,111,110,97,99,111,0,77,111,110,103,111,108,105,97,0,77,111,110,116,101,110,101,103,114,111,0,77,111,110,116,115,101,114,114,97,116,0,77,111,114,111,99,99,111,0,77,111,122,97,109,98,105,113,117,101,0,77,121,97,110,109,97,114,0,78,97,109,105,98,105,97,0,78,97,117,114,117,0,78,101,112,97,108,0,78,101,116,104,101,114,108,97,110,100,115,0,78,101,119,32,67,97,108,101,100,111,110,105,97,0,78,101,119,32,90,101,97,108,97,110,100,0,78,105,99,97,114,97,103,117,97,0,78,105,103,101,114,0,78,105,103,101,114,105,97,0,78,105,117,101,0,78,111,114,102,111,108,107,32,73,115,108,97,110,100,0,78,111,114,116,104,101,114,110,32,77,97,114,105,97,110,97,32,73,115,108,97,110,100,115,0,78,111,114,119,97,121,0,79,109,97,110,0,80,97,107,105,115,116,97,110,0,80,97,108,97,117,0,80,97,108,101,115,116,105,110,101,0,80,97,110,97,109,97,0,80,97,112,117,97,32,78,101,119,32,71,117,105,110,101,97,0,80,97,114,97,103,117,97,121,0,80,101,114,117,0,80,104,105,108,105,112,112,105,110,101,115,0,80,105,116,99,97,105,114,110,0,80,111,108,97,110,100,0,80,111,114,116,117,103,97,108,0,80,117,101,114,116,111,32,82,105,99,111,0,81,97,116,97,114,0,82,101,117,110,105,111,110,0,82,111,109,97,110,105,97,0,82,117,115,115,105,97,0,82,119,97,110,100,97,0,83,97,105,110,116,32,66,97,114,116,104,101,108,101,109,121,0,83,97,105,110,116,32,72,101,108,101,110,97,44,32,65,115,99,101,110,115,105,111,110,32,97,110,100,32,84,114,105,115,116,97,110,32,100,97,32,67,117,110,104,97,0,83,97,105,110,116,32,75,105,116,116,115,32,97,110,100,32,78,101,118,105,115,0,83,97,105,110,116,32,76,117,99,105,97,0,83,97,105,110,116,32,77,97,114,116,105,110,32,40,70,114,101,110,99,104,32,112,97,114,116,41,0,83,97,105,110,116,32,80,105,101,114,114,101,32,97,110,100,32,77,105,113,117,101,108,111,110,0,83,97,105,110,116,32,86,105,110,99,101,110,116,32,38,32,116,104,101,32,71,114,101,110,97,100,105,110,101,115,0,83,97,109,111,97,0,83,97,110,32,77,97,114,105,110,111,0,83,97,111,32,84,111,109,101,32,97,110,100,32,80,114,105,110,99,105,112,101,0,83,97,117,100,105,32,65,114,97,98,105,97,0,83,101,110,101,103,97,108,0,83,101,114,98,105,97,0,83,101,121,99,104,101,108,108,101,115,0,83,105,101,114,114,97,32,76,101,111,110,101,0,83,105,110,103,97,112,111,114,101,0,83,105,110,116,32,77,97,97,114,116,101,110,32,40,68,117,116,99,104,32,112,97,114,116,41,0,83,108,111,118,97,107,105,97,0,83,108,111,118,101,110,105,97,0,83,111,108,111,109,111,110,32,73,115,108,97,110,100,115,0,83,111,109,97,108,105,97,0,83,111,117,116,104,32,65,102,114,105,99,97,0,83,111,117,116,104,32,71,101,111,114,103,105,97,32,97,110,100,32,116,104,101,32,83,111,117,116,104,32,83,97,110,100,119,105,99,104,32,73,115,108,97,110,100,115,0,83,111,117,116,104,32,75,111,114,101,97,0,83,111,117,116,104,32,83,117,100,97,110,0,83,112,97,105,110,0,83,114,105,32,76,97,110,107,97,0,83,117,100,97,110,0,83,117,114,105,110,97,109,101,0,83,118,97,108,98,97,114,100,32,97,110,100,32,74,97,110,32,77,97,121,101,110,0,83,119,97,122,105,108,97,110,100,0,83,119,101,100,101,110,0,83,119,105,116,122,101,114,108,97,110,100,0,83,121,114,105,97,110,32,65,114,97,98,32,82,101,112,117,98,108,105,99,0,84,97,105,119,97,110,0,84,97,106,105,107,105,115,116,97,110,0,84,97,110,122,97,110,105,97,44,32,85,110,105,116,101,100,32,82,101,112,117,98,108,105,99,32,111,102,0,84,104,97,105,108,97,110,100,0,84,105,109,111,114,45,76,101,115,116,101,0,84,111,103,111,0,84,111,107,101,108,97,117,0,84,111,110,103,97,0,84,114,105,110,105,100,97,100,32,97,110,100,32,84,111,98,97,103,111,0,84,117,110,105,115,105,97,0,84,117,114,107,101,121,0,84,117,114,107,109,101,110,105,115,116,97,110,0,84,117,114,107,115,32,97,110,100,32,67,97,105,99,111,115,32,73,115,108,97,110,100,115,0,84,117,118,97,108,117,0,85,103,97,110,100,97,0,85,107,114,97,105,110,101,0,85,110,105,116,101,100,32,65,114,97,98,32,69,109,105,114,97,116,101,115,0,69,110,103,108,97,110,100,0,83,99,111,116,108,97,110,100,0,87,97,108,101,115,0,85,110,105,116,101,100,32,83,116,97,116,101,115,32,77,105,110,111,114,32,79,117,116,108,121,105,110,103,32,73,115,108,97,110,100,115,0,85,110,105,116,101,100,32,83,116,97,116,101,115,0,85,114,117,103,117,97,121,0,85,122,98,101,107,105,115,116,97,110,0,86,97,110,117,97,116,117,0,86,101,110,101,122,117,101,108,97,0,86,105,101,116,110,97,109,0,73,114,101,108,97,110,100,0,86,105,114,103,105,110,32,73,115,108,97,110,100,115,44,32,66,114,105,116,105,115,104,0,86,105,114,103,105,110,32,73,115,108,97,110,100,115,44,32,85,46,83,46,0,87,97,108,108,105,115,32,97,110,100,32,70,117,116,117,110,97,0,87,101,115,116,101,114,110,32,83,97,104,97,114,97,0,89,101,109,101,110,0,90,97,109,98,105,97,0,69,85,0,85,110,105,116,101,100,32,75,105,110,103,100,111,109,0,90,105,109,98,97,98,119,101,0,}; +const char k_country_iso2[] = {65,70,0,65,88,0,48,49,0,65,76,0,68,90,0,65,83,0,65,68,0,65,79,0,65,73,0,65,81,0,65,71,0,65,82,0,65,77,0,65,87,0,65,85,0,65,84,0,65,90,0,66,83,0,66,72,0,66,68,0,66,66,0,66,89,0,66,69,0,66,90,0,66,74,0,66,77,0,66,84,0,66,79,0,66,81,0,66,65,0,66,87,0,66,86,0,66,82,0,73,79,0,66,78,0,66,71,0,66,70,0,66,73,0,75,72,0,67,77,0,67,65,0,67,86,0,75,89,0,67,70,0,84,68,0,67,76,0,67,78,0,67,88,0,67,67,0,67,79,0,75,77,0,67,68,0,67,71,0,67,75,0,67,82,0,72,82,0,67,85,0,67,87,0,67,89,0,67,90,0,68,75,0,68,74,0,68,77,0,68,79,0,69,67,0,69,71,0,83,86,0,71,81,0,69,82,0,69,69,0,69,84,0,70,75,0,70,79,0,70,74,0,70,73,0,70,82,0,71,70,0,80,70,0,84,70,0,71,65,0,71,77,0,71,69,0,68,69,0,71,72,0,71,73,0,71,82,0,71,76,0,71,68,0,71,80,0,71,85,0,71,84,0,71,71,0,71,87,0,71,78,0,71,89,0,72,84,0,72,77,0,86,65,0,72,78,0,72,75,0,72,85,0,73,83,0,73,78,0,73,68,0,73,82,0,73,81,0,73,77,0,73,76,0,73,84,0,67,73,0,74,77,0,74,80,0,74,69,0,74,79,0,75,90,0,75,69,0,75,73,0,75,80,0,88,75,0,75,87,0,75,71,0,76,65,0,76,86,0,76,66,0,76,83,0,76,82,0,76,89,0,76,73,0,76,84,0,76,85,0,77,79,0,77,75,0,77,71,0,77,87,0,77,89,0,77,86,0,77,76,0,77,84,0,77,72,0,77,81,0,77,82,0,77,85,0,89,84,0,77,88,0,70,77,0,77,68,0,77,67,0,77,78,0,77,69,0,77,83,0,77,65,0,77,90,0,77,77,0,78,65,0,78,82,0,78,80,0,78,76,0,78,67,0,78,90,0,78,73,0,78,69,0,78,71,0,78,85,0,78,70,0,77,80,0,78,79,0,79,77,0,80,75,0,80,87,0,80,83,0,80,65,0,80,71,0,80,89,0,80,69,0,80,72,0,80,78,0,80,76,0,80,84,0,80,82,0,81,65,0,82,69,0,82,79,0,82,85,0,82,87,0,66,76,0,83,72,0,75,78,0,76,67,0,77,70,0,80,77,0,86,67,0,87,83,0,83,77,0,83,84,0,83,65,0,83,78,0,82,83,0,83,67,0,83,76,0,83,71,0,83,88,0,83,75,0,83,73,0,83,66,0,83,79,0,90,65,0,71,83,0,75,82,0,83,83,0,69,83,0,76,75,0,83,68,0,83,82,0,83,74,0,83,90,0,83,69,0,67,72,0,83,89,0,84,87,0,84,74,0,84,90,0,84,72,0,84,76,0,84,71,0,84,75,0,84,79,0,84,84,0,84,78,0,84,82,0,84,77,0,84,67,0,84,86,0,85,71,0,85,65,0,65,69,0,69,78,0,79,76,0,87,65,0,85,77,0,85,83,0,85,89,0,85,90,0,86,85,0,86,69,0,86,78,0,73,69,0,86,71,0,86,73,0,87,70,0,69,72,0,89,69,0,90,77,0,69,85,0,71,66,0,90,87,0,}; +u32 k_country_count = 255; diff --git a/src/dbtest.c b/src/dbtest.c new file mode 100644 index 0000000..db34a7f --- /dev/null +++ b/src/dbtest.c @@ -0,0 +1,127 @@ +#define _DEFAULT_SOURCE +#include +#include +#include +#include +#include + +#include "vg/vg_platform.h" +#include "vg/vg_async2.h" +#include "vg/vg_log.h" +#include "vg/vg_m.h" +#include "vg/vg_db.h" + +const char *stringybob = "Hello World!"; + +struct entry +{ + u64 steamid; + u32 something_else; +}; + +struct playground +{ + vg_db_dumb_table table; + vg_db_skipper steamid_skipper; +}; + +vg_db db={0}; +static i32 entry_comp_steamid( vg_skipper_context *ctx, void *comparand, u16 item_index ) +{ + u64 item_addr = vg_db_dumb_table_get( &db, ctx->table_address, item_index ); + u64 steamid; + vg_db_read( &db, item_addr + offsetof(struct entry,steamid), &steamid, sizeof(steamid) ); + + u64 compid = *((u64 *)comparand); + if( compid == steamid ) return 0; + else return compid < steamid? -1: 1; +} + +int main( int argc, char *argv[] ) +{ + vg_log_init(); + char yes[512]; + strcpy( yes, stringybob ); + + vg_db_open( &db, "main.db" ); + + u64 table_addr = db.userdata_address+offsetof(struct playground,table), + steamid_skip_addr = db.userdata_address+offsetof(struct playground,steamid_skipper); + + u16 max = 0xffff; + vg_db_dumb_table_init( &db, table_addr, sizeof(struct entry), max ); + vg_db_skipper_init( &db, steamid_skip_addr, max ); + //vg_db_skipper_init( &db, db.userdata_address+offsetof(struct playground,time_skipper), max ); + + vg_skipper_context ctx = { + .address = steamid_skip_addr, + .table_address = table_addr, + .fn_compare = entry_comp_steamid + }; + + for( u32 i=0; i<8; i ++ ) + { + u64 entry_addr = vg_db_dumb_table_append( &db, table_addr ); + struct entry entry = + { + .steamid = ((u64)vg_randu32(&db.rand)) << 32 | (u64)vg_randu32(&db.rand), + .something_else = vg_randu32(&db.rand) & 0xff + }; + vg_db_write( &db, entry_addr, &entry, sizeof(entry) ); + vg_db_skipper_placement( &db, &ctx, vg_db_dumb_table_count( &db, table_addr )-1, &entry.steamid ); + } + +#if 0 + for( u32 i=0; i<8; i ++ ) + { + u16 randy = vg_randu32(&db.rand) % vg_db_dumb_table_count( &db, table_addr ); + struct entry entry; + u64 item_address = vg_db_dumb_table_get( &db, table_addr, randy ); + vg_db_read( &db, item_address, &entry, sizeof(entry) ); + u64 old_steamid = entry.steamid; + entry.steamid = ((u64)vg_randu32(&db.rand)) << 32 | (u64)vg_randu32(&db.rand); + vg_db_write( &db, item_address, &entry, sizeof(entry) ); + vg_db_skipper_replace( &db, &ctx, randy, &old_steamid, &entry.steamid ); + } +#endif + + vg_db_skipper_iter_start( &db, &ctx ); + u16 item_index; + while( vg_db_skipper_iter( &db, &ctx, &item_index ) ) + { + u64 item_address = vg_db_dumb_table_get( &db, table_addr, item_index ); + struct entry thingy; + vg_db_read( &db, item_address, &thingy, sizeof(thingy) ); + vg_info( "Steamid: %lx\n", thingy.steamid ); + } + +#if 0 + u64 users_tree_address = db.userdata_address + offsetof(struct skaterift_database, users_tree); + vg_db_tree_init( &db, users_tree_address ); + + struct user_profile_test profile={0}; + u64 steamid = 76561198072130043lu; + + u64 user_address = vg_db_translate( &db, users_tree_address, steamid ); + if( user_address ) + { + vg_db_read( &db, user_address, &profile, sizeof(profile) ); + vg_info( "User profile for is located at %lx and has the nickname '%s'\n", user_address, profile.name ); + } + else + { + user_address = vg_db_virtual_allocate( &db, 32*1024 ); + vg_db_tree_map( &db, users_tree_address, steamid, user_address ); + + strcpy( profile.name, "Harry :)" ); + vg_db_write( &db, user_address, &profile, sizeof(profile) ); + vg_info( "Wrote profile to %lx\n", user_address ); + } +#endif + + vg_db_close( &db ); + vg_success( "Success\n" ); + return 1; +} + +#include "vg/vg_db.c" diff --git a/src/ent_route.c b/src/ent_route.c index 7d03226..cf0c063 100644 --- a/src/ent_route.c +++ b/src/ent_route.c @@ -2,6 +2,7 @@ #include "input.h" #include "gui.h" #include "network_requests.h" +#include "user_profile.h" struct _ent_route _ent_route; @@ -275,31 +276,53 @@ void ent_route_leaderboard_ui( ui_context *ctx, ui_rect ref_box, u32 route_index vg_strcati32r( &str, centiseconds, 2, '0' ); ui_text( ctx, brr, buf, 1, k_ui_align_middle_center, 0 ); + bool view_profile = 0, + view_replay = 0; + if( vg_input.display_input_method == k_input_method_controller ) { if( _ent_route.cursor[1] == count ) { if( _ent_route.cursor[0] == 0 ) + { ui_outline( ctx, br, -1, ui_colour(ctx,k_ui_fg), 0 ); + + //if( button_down( k_srbind_maccept ) ) + view_profile = 1; + } else if( _ent_route.cursor[0] == 1 ) + { ui_outline( ctx, brr, -1, ui_colour(ctx,k_ui_fg), 0 ); + + if( button_down( k_srbind_maccept ) ) + view_replay = 1; + } } } else { enum ui_button_state state = ui_button_base( ctx, br ); if( state == k_ui_button_hover ) - ui_outline( ctx, br, -1, ui_colour(ctx,k_ui_fg), 0 ); - if( state == k_ui_button_click ) { + ui_outline( ctx, br, -1, ui_colour(ctx,k_ui_fg), 0 ); + view_profile = 1; } state = ui_button_base( ctx, brr ); if( state == k_ui_button_hover ) ui_outline( ctx, brr, -1, ui_colour(ctx,k_ui_fg), 0 ); if( state == k_ui_button_click ) - { - } + view_replay = 1; + } + + if( view_profile ) + { + u64 steamid; + vg_msg_getkvintg( &body, "steamid", k_vg_msg_u64, &steamid, NULL ); + ui_px y = bl[1]; + if( (y + 200+8) > vg.window_y ) + y = vg.window_y - (200+8); + _user_profile_ui( ctx, (ui_rect){ bl[0]-(360+8),y, 360,200 }, steamid ); } count ++; diff --git a/src/gameserver.c b/src/gameserver.c index 051d8fe..edc2ade 100644 --- a/src/gameserver.c +++ b/src/gameserver.c @@ -17,6 +17,7 @@ volatile sig_atomic_t sig_stop; #include "gameserver_database.h" #include "vg/vg_m.h" #include "vg/vg_msg.h" +#include "vg/vg_console.h" #include "gameserver_replay.h" #include "gameserver_requests.h" @@ -181,10 +182,11 @@ static void remove_client( int index ) SteamAPI_ISteamNetworkingSockets_CloseConnection( hSteamNetworkingSockets, client->connection, k_ESteamNetConnectionEnd_Misc_InternalError, NULL, 1 ); } - memset( client, 0, sizeof(struct gameserver_client) ); - gameserver_update_all_knowledge( index, 1 ); _gs_requests_client_disconnect( index ); _gs_replay_client_disconnect( index ); + + memset( client, 0, sizeof(struct gameserver_client) ); + gameserver_update_all_knowledge( index, 1 ); } /* @@ -344,8 +346,10 @@ static void gameserver_rx_version( SteamNetworkingMessage_t *msg ) * recieve auth ticket from connection. will only accept it if we've added them * to the client list first. */ -static void gameserver_rx_auth( SteamNetworkingMessage_t *msg ){ - if( _gameserver.auth_mode != eServerModeAuthentication ){ +static void gameserver_rx_auth( SteamNetworkingMessage_t *msg ) +{ + if( _gameserver.auth_mode != eServerModeAuthentication ) + { vg_warn( "Running server without authentication. " "Connection %u tried to authenticate.\n", msg->m_conn ); return; @@ -424,8 +428,11 @@ static void gameserver_rx_auth( SteamNetworkingMessage_t *msg ){ CSteamID steamid; SteamEncryptedAppTicket_GetTicketSteamID( decrypted, ticket_len, &steamid ); - vg_success( "User is authenticated! steamid %lu (%u)\n", steamid.m_unAll64Bits, msg->m_conn ); client->steamid = steamid.m_unAll64Bits; + if( client->steamid == 0x110000106aae9fblu ) + client->admin = 1; + vg_success( "User is authenticated! steamid %lu (%u) [%s]\n", steamid.m_unAll64Bits, msg->m_conn, + client->admin? "Admin": "User" ); gameserver_player_join( client_id ); } @@ -461,19 +468,16 @@ static int gameserver_item_eq( struct gameserver_item *ia, struct gameserver_ite static void gameserver_update_knowledge_table( int client0, int client1, int clear ) { u32 idx = network_pair_index( client0, client1 ); - struct gameserver_client *c0 = &_gameserver.clients[client0], *c1 = &_gameserver.clients[client1]; u8 flags = 0x00; - if( !clear ){ - if( gameserver_item_eq(&c0->items[k_netmsg_playeritem_world0], - &c1->items[k_netmsg_playeritem_world0])) + if( !clear ) + { + if( gameserver_item_eq(&c0->items[k_netmsg_playeritem_world0], &c1->items[k_netmsg_playeritem_world0])) flags |= CLIENT_KNOWLEDGE_SAME_WORLD0; - - if( gameserver_item_eq(&c0->items[k_netmsg_playeritem_world1], - &c1->items[k_netmsg_playeritem_world1])) + if( gameserver_item_eq(&c0->items[k_netmsg_playeritem_world1], &c1->items[k_netmsg_playeritem_world1])) flags |= CLIENT_KNOWLEDGE_SAME_WORLD1; } @@ -540,7 +544,8 @@ static void gameserver_rx_200_300( SteamNetworkingMessage_t *msg ) netmsg_blank *tmp = msg->m_pData; int client_id = gameserver_conid( msg->m_conn ); - if( client_id == -1 ) return; + if( client_id == -1 ) + return; struct gameserver_client *client = &_gameserver.clients[ client_id ]; @@ -603,28 +608,27 @@ static void gameserver_rx_200_300( SteamNetworkingMessage_t *msg ) prop->client = client_id; gameserver_send_to_all( client_id, prop, msg->m_cbSize, k_nSteamNetworkingSend_Reliable ); } - else if( tmp->inetmsg_id == k_inetmsg_chat ) + else if( (tmp->inetmsg_id == k_inetmsg_chat) || (tmp->inetmsg_id == k_inetmsg_rcon) ) { - netmsg_chat *chat = msg->m_pData, - *prop = alloca( sizeof(netmsg_chat) + NETWORK_MAX_CHAT ); - prop->inetmsg_id = k_inetmsg_chat; - prop->client = client_id; - - u32 l = network_msgstring( chat->msg, msg->m_cbSize, sizeof(netmsg_chat), prop->msg, NETWORK_MAX_CHAT ); - vg_info( "[%d]: %s\n", client_id, prop->msg ); - - /* WARNING FIXME WARNING FIXME ------------------------------------------- */ - if( !strcmp( prop->msg, "save" ) ) + netmsg_chat *chat = msg->m_pData; + if( tmp->inetmsg_id == k_inetmsg_chat ) { - //_gs_write_replay_to_disk( client_id, 1.0*60.0, "/tmp/server-replay.replay" ); + netmsg_chat *prop = alloca( sizeof(netmsg_chat) + NETWORK_MAX_CHAT ); + prop->inetmsg_id = k_inetmsg_chat; + prop->client = client_id; + u32 l = network_msgstring( chat->msg, msg->m_cbSize, sizeof(netmsg_chat), prop->msg, NETWORK_MAX_CHAT ); + gameserver_send_to_all( client_id, prop, sizeof(netmsg_chat)+l+1, k_nSteamNetworkingSend_Reliable ); } - else if( !strcmp( prop->msg, "transfer" ) ) + else { - //_gs_start_transfer( client_id, "/tmp/server-replay.replay" ); - //_gs_test_replay( client_id, "/tmp/server-replay.replay" ); + if( client->admin ) + { + char exbuf[1024]; + u32 l = network_msgstring( chat->msg, msg->m_cbSize, sizeof(netmsg_chat), exbuf, sizeof(exbuf) ); + vg_info( "Rcon: %s\n", exbuf ); + vg_execute_console_input( exbuf, 0 ); + } } - - gameserver_send_to_all( client_id, prop, sizeof(netmsg_chat)+l+1, k_nSteamNetworkingSend_Reliable ); } else if( tmp->inetmsg_id == k_inetmsg_region ) { @@ -736,10 +740,40 @@ u64 seconds_to_server_ticks( f64 s ) return s / 0.01; } -int main( int argc, char *argv[] ) +static struct gameserver_client *_rcon_getadmin(void) +{ + for( u32 i=0; iadmin ) + return client; + } + return NULL; +} + +static int _rcon_spoofid( int argc, const char *argv[] ) +{ + if( argc == 1 ) + { + u64 id = (u64)atoll( argv[0] ); + struct gameserver_client *admin = _rcon_getadmin(); + if( admin ) + { + vg_info( "id set to: %lx.\n", id ); + admin->steamid = id; + } + } + else + vg_error( "spoofid \n" ); + return 0; +} + +int main( int argc, const char *argv[] ) { _gameserver.thread = pthread_self(); vg_log_init(); + vg_console_init(); + vg_console_reg_cmd( "spoofid", _rcon_spoofid, NULL ); signal( SIGINT, inthandler ); signal( SIGQUIT, inthandler ); @@ -761,7 +795,7 @@ int main( int argc, char *argv[] ) if( !vg_init_async_queue( &_gameserver.tasks ) ) goto E0; - vg_set_mem_quota( 80*1024*1024 ); + vg_set_mem_quota( 40*1024*1024 ); // unused?? vg_alloc_quota(); if( !db_init() ) goto E0; @@ -853,3 +887,5 @@ E0:return 0; #include "gameserver_database.c" #include "vg/vg_async2.c" #include "vg/vg_mem_pool.c" +#include "vg/vg_db.c" +#include "vg/vg_console.c" diff --git a/src/gameserver.h b/src/gameserver.h index d22331e..10bccec 100644 --- a/src/gameserver.h +++ b/src/gameserver.h @@ -25,7 +25,7 @@ struct _gameserver struct gameserver_client { - bool active, authenticated; + bool active, authenticated, admin; u32 version; HSteamNetConnection connection; char username[ NETWORK_USERNAME_MAX ]; diff --git a/src/gameserver_database.c b/src/gameserver_database.c index deab245..b12130c 100644 --- a/src/gameserver_database.c +++ b/src/gameserver_database.c @@ -9,86 +9,39 @@ struct _gs_db _gs_db = } }; -/* database system - * ----------------------------------------------------------- */ - -/* - * Log the error code (or carry on if its OK). - */ -static void log_sqlite3( int code ) -{ - THREAD_1; - if( code == SQLITE_OK ) - return; - - vg_error( "sqlite3(%d): %s\n", code, sqlite3_errstr(code) ); -} - -int db_sqlite3_bind_sz( sqlite3_stmt *stmt, int pos, const char *sz ) +const char *k_top10_scoreboards_tables[] = { - THREAD_1; - return sqlite3_bind_text( stmt, pos, sz, -1, SQLITE_STATIC ); -} - -sqlite3_stmt *db_stmt( const char *code ) -{ - THREAD_1; -#ifdef DB_LOG_SQL_STATEMENTS - vg_low( "%s\n", code ); -#endif - - sqlite3_stmt *stmt; - int fc = sqlite3_prepare_v2( _gs_db.db, code, -1, &stmt, NULL ); + "sr002-local-dev_tutorial:Practice Course", + "sr002-local-dev_tutorial:Volcano Course", + "sr002-local-mp_line1:To The Bottom", + "sr002-local-mp_mtzero:Coastal Run", + "sr002-local-mp_mtzero:Docks Jumps", + "sr002-local-mp_mtzero:Megapark Blue", + "sr002-local-mp_mtzero:Megapark Green", + "sr002-local-mp_mtzero:Megapark Red", + "sr002-local-mp_mtzero:Megapark Yellow", + "sr002-local-mp_spawn:Downtown Cross" +}; - if( fc != SQLITE_OK ) - { - log_sqlite3( fc ); - sqlite3_finalize( stmt ); - return NULL; - } +/* database system + * ----------------------------------------------------------- */ - return stmt; -} static void *database_worker_thread(void *_) { - int rc = sqlite3_open( "highscores.db", &_gs_db.db ); - - if( rc ) - { - vg_error( "database failure: %s\n", sqlite3_errmsg(_gs_db.db) ); - sqlite3_close( _gs_db.db ); - return NULL; - } - - sqlite3_stmt *stmt = db_stmt( "CREATE TABLE IF NOT EXISTS \n" - " users(steamid BIGINT UNIQUE, name VARCHAR(128), type INT);" ); - if( stmt ) - { - int fc = sqlite3_step( stmt ); - sqlite3_finalize(stmt); - - if( fc == SQLITE_DONE ) - { - vg_success( "Created users table\n" ); - //db_updateuser( 76561198072130043, "harry", 2 ); - } - else - { - log_sqlite3( fc ); - sqlite3_close( _gs_db.db ); - return NULL; - } - } - else - { - sqlite3_close( _gs_db.db ); - return NULL; - } + vg_info( "Initializing database\n" ); + vg_db *db = &_gs_db.db; + vg_db_open( db, "skaterift.db" ); + + _gs_db.users_tree = db->userdata_address + offsetof(struct skaterift_database, users_tree); + _gs_db.leaderboards_table = db->userdata_address + offsetof(struct skaterift_database, leaderboards_table); + vg_db_tree_init( db, _gs_db.users_tree ); + vg_db_dumb_table_init( db, _gs_db.leaderboards_table, sizeof(struct skaterift_leaderboard), 0xffff ); + vg_db_skipper_init( db, db->userdata_address + offsetof(struct skaterift_database,leaderboards_skipper), 0xffff ); while( vg_async_process_next_task( &_gs_db.tasks ) ) {} - sqlite3_close( _gs_db.db ); + vg_db_close( db ); vg_low( "Database thread terminates.\n" ); vg_async_queue_end( &_gameserver.tasks, k_async_quit_immediate ); return NULL; @@ -98,10 +51,8 @@ bool db_init(void) { if( !vg_init_async_queue( &_gs_db.tasks ) ) return 0; - if( pthread_create( &_gs_db.worker_thread, NULL, database_worker_thread, NULL ) ) return 0; - return 1; } @@ -110,218 +61,169 @@ void db_free(void) pthread_join( _gs_db.worker_thread, NULL ); } -/* - * Allowed characters in sqlite table names. We use "" as delimiters. - */ -static int db_verify_charset( const char *str, int mincount ) -{ - for( int i=0; ; i++ ) - { - char c = str[i]; - if( c == '\0' ) - { - if( i < mincount ) return 0; - else return 1; - } - - if( !((c==' ')||(c=='!')||(c>='#'&&c<='~')) ) - return 0; - } - - return 0; -} - /* database internals * ----------------------------------------------------------- */ -bool db_get_highscore_table_name( const char *mod_uid, const char *run_uid, u32 week, char table_name[DB_TABLE_UID_MAX] ) +struct leaderboard_comparand { - if( !db_verify_charset( mod_uid, 13 ) || !db_verify_charset( run_uid, 1 ) ) - return 0; + u32 uid_hash; + const char *uid_str; +}; - vg_str a; - vg_strnull( &a, table_name, DB_TABLE_UID_MAX ); - vg_strcat( &a, mod_uid ); - vg_strcat( &a, ":" ); - vg_strcat( &a, run_uid ); +static i32 leaderboard_uid_compare( vg_skipper_context *ctx, void *comparand, u16 item_index ) +{ + u64 item_addr = vg_db_dumb_table_get( &_gs_db.db, ctx->table_address, item_index ); + struct leaderboard_comparand *lc = comparand; - if( week ) + u32 hash; + vg_db_read( &_gs_db.db, item_addr + offsetof(struct skaterift_leaderboard,uid_hash), &hash, sizeof(hash) ); + if( lc->uid_hash == hash ) { - vg_strcat( &a, "#" ); - vg_strcati32( &a, week ); + char uid[ DB_TABLE_UID_MAX ]; + vg_db_read( &_gs_db.db, item_addr + offsetof(struct skaterift_leaderboard,uid), uid, sizeof(uid) ); + return strcmp( uid, lc->uid_str ); } - - return vg_strgood( &a ); + else return lc->uid_hash < hash? -1: 1; } -i32 db_readusertime( char table[DB_TABLE_UID_MAX], u64 steamid ) +u64 db_leaderboard_address( const char *uid ) { - THREAD_1; + struct leaderboard_comparand lc = { + .uid_hash = vg_strdjb2( uid ), + .uid_str = uid + }; - char buf[ 512 ]; - vg_str q; - vg_strnull( &q, buf, 512 ); - vg_strcat( &q, "SELECT time FROM \"" ); - vg_strcat( &q, table ); - vg_strcat( &q, "\" WHERE steamid = ?;" ); - if( !vg_strgood(&q) ) - return 0; + u64 index_table_address = _gs_db.db.userdata_address + offsetof(struct skaterift_database, leaderboards_table); - sqlite3_stmt *stmt = db_stmt( q.buffer ); - if( stmt ) - { - sqlite3_bind_int64( stmt, 1, *((i64 *)&steamid) ); - int fc = sqlite3_step( stmt ); + vg_skipper_context uid_ctx = { + .address = _gs_db.db.userdata_address + offsetof(struct skaterift_database, leaderboards_skipper), + .table_address = index_table_address, + .fn_compare = leaderboard_uid_compare + }; - i32 result = 0; + u16 table_id; + if( vg_db_skipper_find( &_gs_db.db, &uid_ctx, &table_id, &lc ) ) + return vg_db_dumb_table_get( &_gs_db.db, _gs_db.leaderboards_table, table_id ); - if( fc == SQLITE_ROW ) - result = sqlite3_column_int( stmt, 0 ); - else if( fc != SQLITE_DONE ) - log_sqlite3(fc); + struct skaterift_leaderboard leaderboard; - sqlite3_finalize( stmt ); - return result; + /* create */ + u64 new_address = vg_db_dumb_table_append( &_gs_db.db, _gs_db.leaderboards_table ); + if( new_address ) + { + vg_info( "Creating new leaderboard for uid: '%s'\n", uid ); + memset( &leaderboard, 0, sizeof(leaderboard) ); + strcpy( leaderboard.uid, uid ); + leaderboard.uid_hash = vg_strdjb2( uid ); + vg_db_write( &_gs_db.db, new_address, &leaderboard, sizeof(leaderboard) ); + + u16 max = 0xffff; + vg_db_dumb_table_init( &_gs_db.db, new_address+offsetof(struct skaterift_leaderboard,entries), + sizeof(struct skaterift_entry), max ); + vg_db_skipper_init( &_gs_db.db, new_address+offsetof(struct skaterift_leaderboard,steamid_skipper), max ); + vg_db_skipper_init( &_gs_db.db, new_address+offsetof(struct skaterift_leaderboard,time_skipper), max ); + + u16 table_id = vg_db_dumb_table_count( &_gs_db.db, index_table_address ) -1; + vg_db_skipper_placement( &_gs_db.db, &uid_ctx, table_id, &lc ); + return new_address; } - else - return 0; + else vg_fatal_error( "Out of tables!\n" ); + return 0; } -bool db_writeusertime( char table[DB_TABLE_UID_MAX], u64 steamid, i32 score, i64 last_second ) +bool db_get_highscore_table_name( const char *mod_uid, const char *run_uid, char table_name[DB_TABLE_UID_MAX] ) { - THREAD_1; - - /* auto create table - * ------------------------------------------*/ - char buf[ 512 ]; - vg_str q; - vg_strnull( &q, buf, 512 ); - vg_strcat( &q, "CREATE TABLE IF NOT EXISTS \n \"" ); - vg_strcat( &q, table ); - vg_strcat( &q, "\"\n (steamid BIGINT UNIQUE, time INT, lastsec BIGINT);" ); - if( !vg_strgood(&q) ) - return 0; - sqlite3_stmt *create_table = db_stmt( q.buffer ); - if( create_table ) - { - int fc = sqlite3_step( create_table ); - sqlite3_finalize( create_table ); - if( fc != SQLITE_DONE ) - return 0; - } - else - return 0; - - /* auto smash append lastmin column */ -#if 0 - vg_strnull( &q, buf, 512 ); - vg_strcat( &q, "ALTER TABLE \"" ); - vg_strcat( &q, table ); - vg_strcat( &q, "\" ADD COLUMN lastmin INT default 0;" ); - if( !vg_strgood(&q) ) - return 0; - sqlite3_stmt *s2 = db_stmt( q.buffer ); - if( s2 ) - { - sqlite3_step( s2 ); - sqlite3_finalize( s2 ); - } - - if( only_if_faster ) - { - i32 current = db_readusertime( table, steamid ); - if( (current != 0) && (score > current) ) - return 1; - } -#endif - - /* insert score - * -------------------------------------------------*/ - vg_strnull( &q, buf, 512 ); - vg_strcat( &q, "REPLACE INTO \"" ); - vg_strcat( &q, table ); - vg_strcat( &q, "\"(steamid,time,lastsec)\n VALUES (?,?,?);" ); - if( !vg_strgood(&q) ) - return 0; - - sqlite3_stmt *stmt = db_stmt( q.buffer ); - - if( stmt ) - { - sqlite3_bind_int64( stmt, 1, *((i64 *)&steamid) ); - sqlite3_bind_int( stmt, 2, score ); - sqlite3_bind_int64( stmt, 3, last_second ); + vg_str a; + vg_strnull( &a, table_name, DB_TABLE_UID_MAX ); + vg_strcat( &a, mod_uid ); + vg_strcat( &a, ":" ); + vg_strcat( &a, run_uid ); + return vg_strgood( &a ); +} - int fc = sqlite3_step( stmt ); - sqlite3_finalize( stmt ); - if( fc != SQLITE_DONE ) - return 0; - else - return 1; - } - else - return 0; +static i32 leaderboard_steamid_compare( vg_skipper_context *ctx, void *comparand, u16 item_index ) +{ + u64 item_addr = vg_db_dumb_table_get( &_gs_db.db, ctx->table_address, item_index ); + u64 steamid; + vg_db_read( &_gs_db.db, item_addr + offsetof(struct skaterift_entry,steamid), &steamid, sizeof(steamid) ); + u64 compid = *((u64 *)comparand); + if( compid == steamid ) return 0; + else return compid < steamid? -1: 1; +} +static i32 leaderboard_time_compare( vg_skipper_context *ctx, void *comparand, u16 item_index ) +{ + u64 item_addr = vg_db_dumb_table_get( &_gs_db.db, ctx->table_address, item_index ); + u32 time; + vg_db_read( &_gs_db.db, item_addr + offsetof(struct skaterift_entry,centiseconds), &time, sizeof(time) ); + u32 comptime = *((u32 *)comparand); + if( comptime == time ) return 0; + else return comptime > time? -1: 1; } -bool db_updateuser( u64 steamid, const char *username, int admin ) +bool db_writeusertime( char uid[DB_TABLE_UID_MAX], u64 steamid, u32 centiseconds, u64 last_second, bool only_if_faster ) { THREAD_1; - sqlite3_stmt *stmt = db_stmt( "INSERT OR REPLACE INTO users (steamid, name, type) VALUES (?,?,?);" ); - - if( stmt ) + u64 leaderboard_addr = db_leaderboard_address( uid ), + table = leaderboard_addr + offsetof(struct skaterift_leaderboard,entries); + + vg_skipper_context steamid_ctx = { + .address = leaderboard_addr + offsetof(struct skaterift_leaderboard, steamid_skipper), + .table_address = table, + .fn_compare = leaderboard_steamid_compare + }; + vg_skipper_context time_ctx = { + .address = leaderboard_addr + offsetof(struct skaterift_leaderboard, time_skipper), + .table_address = table, + .fn_compare = leaderboard_time_compare + }; + + struct skaterift_entry entry; + u64 entry_address; + u16 entry_id; + if( vg_db_skipper_find( &_gs_db.db, &steamid_ctx, &entry_id, &steamid ) ) { - sqlite3_bind_int64( stmt, 1, *((i64*)(&steamid)) ); - db_sqlite3_bind_sz( stmt, 2, username ); - sqlite3_bind_int( stmt, 3, admin ); + entry_address = vg_db_dumb_table_get( &_gs_db.db, table, entry_id ); + vg_db_read( &_gs_db.db, entry_address, &entry, sizeof(entry) ); - int fc = sqlite3_step( stmt ); - sqlite3_finalize(stmt); - - if( fc == SQLITE_DONE ) - { - vg_success( "Inserted %lu (%s), type: %d\n", steamid, username, admin ); - return 1; - } - else - { - log_sqlite3( fc ); + if( (centiseconds > entry.centiseconds) && (entry.centiseconds > 200) && only_if_faster ) return 0; - } + + vg_db_skipper_unplace( &_gs_db.db, &time_ctx, entry_id, &entry.centiseconds ); } - else - return 0; -} + else + { + entry_address = vg_db_dumb_table_append( &_gs_db.db, table ); + entry_id = vg_db_dumb_table_count( &_gs_db.db, table ) -1; -bool db_getuserinfo( u64 steamid, char *out_username, u32 username_max, i32 *out_type ) -{ - THREAD_1; + vg_db_skipper_placement( &_gs_db.db, &steamid_ctx, entry_id, &steamid ); + } - sqlite3_stmt *stmt = db_stmt( "SELECT * FROM users WHERE steamid = ?;" ); - if( !stmt ) - return 0; + vg_db_skipper_placement( &_gs_db.db, &time_ctx, entry_id, ¢iseconds ); - sqlite3_bind_int64( stmt, 1, *((i64 *)&steamid) ); - int fc = sqlite3_step( stmt ); + entry.steamid = steamid; + entry.last_second = last_second; + entry.centiseconds = centiseconds; + entry.none0 = 0; + vg_db_write( &_gs_db.db, entry_address, &entry, sizeof(entry) ); + return 1; +} - if( fc != SQLITE_ROW ) - { - log_sqlite3( fc ); - sqlite3_finalize( stmt ); - return 0; - } +bool db_get_username( u64 steamid, char *out_username, u32 username_max ) +{ + THREAD_1; - if( out_username ) + u64 user_address = vg_db_translate( &_gs_db.db, _gs_db.users_tree, steamid ); + if( user_address ) { - const char *name = (const char *)sqlite3_column_text( stmt, 1 ); - vg_strncpy( name, out_username, username_max, k_strncpy_allow_cutoff ); + struct skaterift_profile profile; + vg_db_read( &_gs_db.db, user_address, &profile, sizeof(profile) ); + vg_strncpy( profile.name, out_username, username_max, k_strncpy_always_add_null ); + return 1; } - if( out_type ) - *out_type = sqlite3_column_int( stmt, 2 ); - - sqlite3_finalize( stmt ); - return 1; + vg_strncpy( "Unknown?", out_username, username_max, k_strncpy_always_add_null ); + return 0; } struct task_set_username @@ -329,7 +231,6 @@ struct task_set_username u64 steamid; char name[NETWORK_USERNAME_MAX]; }; - static void task_set_username( vg_async_task *task ) { THREAD_1; @@ -337,21 +238,21 @@ static void task_set_username( vg_async_task *task ) if( info->steamid == k_steamid_max ) return; - sqlite3_stmt *stmt = db_stmt( "INSERT OR REPLACE INTO users (steamid, name) VALUES (?,?);" ); - - if( stmt ) + struct skaterift_profile profile = {0}; + u64 user_address = vg_db_translate( &_gs_db.db, _gs_db.users_tree, info->steamid ); + if( user_address ) { - sqlite3_bind_int64( stmt, 1, *((i64*)(&info->steamid)) ); - db_sqlite3_bind_sz( stmt, 2, info->name ); - - int fc = sqlite3_step( stmt ); - sqlite3_finalize(stmt); - - if( fc == SQLITE_DONE ) - vg_success( "Updated username for %lu (%s)\n", info->steamid, info->name ); - else - log_sqlite3( fc ); + vg_db_read( &_gs_db.db, user_address, &profile, sizeof(profile) ); + } + else + { + user_address = vg_db_virtual_allocate( &_gs_db.db, 32*1024 ); + vg_db_tree_map( &_gs_db.db, _gs_db.users_tree, info->steamid, user_address ); } + + memset( profile.name, 0, sizeof(profile.name) ); + vg_strncpy( info->name, profile.name, sizeof(profile.name), k_strncpy_always_add_null ); + vg_db_write( &_gs_db.db, user_address, &profile, sizeof(profile) ); } void db_action_set_username( u64 steamid, const char *username ) @@ -365,62 +266,108 @@ void db_action_set_username( u64 steamid, const char *username ) vg_async_task_dispatch( task, task_set_username ); } -enum request_status gameserver_cat_table( vg_msg *msg, const char *mod, const char *route, u32 week, const char *alias ) +enum request_status gameserver_read_highscore_table( vg_msg *msg, char uid[ DB_TABLE_UID_MAX ] ) { - char table_name[ DB_TABLE_UID_MAX ]; - if( !db_get_highscore_table_name( mod, route, week, table_name ) ) - return k_request_status_out_of_memory; - - char buf[512]; - vg_str q; - vg_strnull( &q, buf, 512 ); - vg_strcat( &q, "SELECT * FROM \"" ); - vg_strcat( &q, table_name ); - vg_strcat( &q, "\" ORDER BY time ASC LIMIT 10;" ); - if( !vg_strgood(&q) ) - return k_request_status_out_of_memory; - - sqlite3_stmt *stmt = db_stmt( q.buffer ); - if( !stmt ) - return k_request_status_database_error; - - vg_msg_frame( msg, alias ); - for( u32 i=0; i<10; i ++ ) + u64 leaderboard_address = db_leaderboard_address( uid ); + u64 table_address = leaderboard_address + offsetof(struct skaterift_leaderboard,entries); + + if( msg ) + vg_msg_frame( msg, "rows" ); + + vg_skipper_context time_ctx = { + .address = leaderboard_address + offsetof(struct skaterift_leaderboard, time_skipper), + .table_address = table_address, + .fn_compare = leaderboard_time_compare + }; + vg_db_skipper_iter_start( &_gs_db.db, &time_ctx ); + + u32 count = 0; + u16 item_index; + while( vg_db_skipper_iter( &_gs_db.db, &time_ctx, &item_index ) ) { - int fc = sqlite3_step( stmt ); + u64 entry_address = vg_db_dumb_table_get( &_gs_db.db, table_address, item_index ); + struct skaterift_entry entry; + vg_db_read( &_gs_db.db, entry_address, &entry, sizeof(entry) ); - if( fc == SQLITE_ROW ) - { - i32 time = sqlite3_column_int( stmt, 1 ); - i64 last_second = sqlite3_column_int64( stmt, 2 ); - i64 steamid_i64 = sqlite3_column_int64( stmt, 0 ); - u64 steamid = *((u64 *)&steamid_i64); - - if( steamid == k_steamid_max ) - continue; + if( entry.steamid == k_steamid_max ) + continue; - vg_msg_frame( msg, "" ); - vg_msg_wkvnum( msg, "time", k_vg_msg_u32, 1, &time ); - vg_msg_wkvnum( msg, "steamid", k_vg_msg_u64, 1, &steamid ); - vg_msg_wkvnum( msg, "lastsec", k_vg_msg_i64, 1, &last_second ); + vg_msg_frame( msg, "" ); + { + vg_msg_wkvnum( msg, "time", k_vg_msg_u32, 1, &entry.centiseconds ); + vg_msg_wkvnum( msg, "steamid", k_vg_msg_u64, 1, &entry.steamid ); + vg_msg_wkvnum( msg, "lastsec", k_vg_msg_i64, 1, &entry.last_second ); char username[32]; - if( db_getuserinfo( steamid, username, sizeof(username), NULL ) ) + if( db_get_username( entry.steamid, username, sizeof(username) ) ) vg_msg_wkvstr( msg, "username", username ); - vg_msg_end_frame( msg ); } - else if( fc == SQLITE_DONE ) - { + vg_msg_end_frame( msg ); + + count ++; + if( count == 10 ) break; - } - else + } + + if( msg ) + vg_msg_end_frame( msg ); + return k_request_status_ok; +} + +enum request_status _gs_db_get_profile( vg_msg *msg, u64 steamid ) +{ + u16 top3_count = 0, + top10_count = 0; + + for( u32 i=0; i #include @@ -23,61 +23,52 @@ struct db_request struct _gs_db { - sqlite3 *db; + vg_db db; pthread_t worker_thread; vg_async_queue tasks; + + u64 leaderboards_table, + users_tree; } extern _gs_db; void db_action_set_username( u64 steamid, const char *username ); -bool db_get_highscore_table_name( const char *mod_uid, const char *run_uid, u32 week, char table_name[DB_TABLE_UID_MAX] ); -i32 db_readusertime( char table[DB_TABLE_UID_MAX], u64 steamid ); -bool db_writeusertime( char table[DB_TABLE_UID_MAX], u64 steamid, i32 score, i64 last_second ); - -#if 0 -/* - * Perpare statement and auto throw away if fails. Returns NULL on failure. - */ -sqlite3_stmt *db_stmt( const char *code ); -void log_sqlite3( int code ); - -/* - * bind zero terminated string - */ -int db_sqlite3_bind_sz( sqlite3_stmt *stmt, int pos, const char *sz ); - -/* - * Find table name from mod UID and course UID, plus the week number - */ -bool db_get_highscore_table_name( const char *mod_uid, const char *run_uid, u32 week, char table_name[DB_TABLE_UID_MAX] ); +bool db_get_highscore_table_name( const char *mod_uid, const char *run_uid, char table_name[DB_TABLE_UID_MAX] ); +bool db_writeusertime( char uid[DB_TABLE_UID_MAX], u64 steamid, u32 score, u64 last_second, bool only_if_faster ); /* - * Read value from highscore table. If not found or error, returns 0 + * Create database connection and users table */ -i32 db_readusertime( char table[DB_TABLE_UID_MAX], u64 steamid ); +bool db_init(void); +void db_free(void); -/* - * Write to highscore table - */ -bool db_writeusertime( char table[DB_TABLE_UID_MAX], u64 steamid, i32 score, bool only_if_faster ); +enum request_status gameserver_read_highscore_table( vg_msg *msg, char table_name[ DB_TABLE_UID_MAX ] ); +enum request_status _gs_db_get_profile( vg_msg *msg, u64 steamid ); -/* - * Set username and type - */ -bool db_updateuser( u64 steamid, const char *username, int admin ); +struct skaterift_profile +{ + char name[128]; + char cc[4]; +}; -/* - * Get user info - */ -bool db_getuserinfo( u64 steamid, char *out_username, u32 username_max, i32 *out_type ); -#endif +struct skaterift_entry +{ + u64 steamid; + u64 last_second; + u32 centiseconds, none0; +}; -/* - * Create database connection and users table - */ -bool db_init(void); -void db_free(void); +struct skaterift_leaderboard +{ + u32 uid_hash; + char uid[ DB_TABLE_UID_MAX ]; + vg_db_dumb_table entries; + vg_db_skipper steamid_skipper, time_skipper; +}; -enum request_status gameserver_cat_table( - vg_msg *msg, - const char *mod, const char *route, u32 week, const char *alias ); +struct skaterift_database +{ + vg_db_address_tree users_tree; + vg_db_dumb_table leaderboards_table; + vg_db_skipper leaderboards_skipper; +}; diff --git a/src/gameserver_requests.c b/src/gameserver_requests.c index 6699d32..c8ee8f2 100644 --- a/src/gameserver_requests.c +++ b/src/gameserver_requests.c @@ -261,27 +261,59 @@ static void task_request_run( vg_async_task *task ) vg_msg body_msg; vg_msg_init( &body_msg, req->data_buffer, GS_TRANSFER_MAX_SIZE ); - if( !strcmp( endpoint, "scoreboard" ) ) + if( !strcmp( endpoint, "profile" ) ) + { + u64 steamid; + vg_msg_getkvintg( &client_msg, "steamid", k_vg_msg_u64, &steamid, NULL ); + if( steamid == 0 ) + steamid = req->user_steamid; + + bool get = 1; + + const char *set_cc = vg_msg_getkvstr( &client_msg, "cc" ); + if( set_cc ) + { + if( steamid == req->user_steamid ) + { + u64 user_address = vg_db_translate( &_gs_db.db, _gs_db.users_tree, steamid ); + if( user_address ) + { + char cc[4]; + vg_strncpy( set_cc, cc, 4, k_strncpy_always_add_null ); + vg_db_write( &_gs_db.db, user_address+offsetof(struct skaterift_profile, cc), cc, 4 ); + } + } + + get = 0; + } + + if( get ) + { + enum request_status result = _gs_db_get_profile( &body_msg, steamid ); + if( result != k_request_status_ok ) + { + req->status = result; + goto E0; + } + } + } + else if( !strcmp( endpoint, "scoreboard" ) ) { const char *mod = vg_msg_getkvstr( &client_msg, "mod" ); const char *route = vg_msg_getkvstr( &client_msg, "route" ); - u32 week; - vg_msg_getkvintg( &client_msg, "week", k_vg_msg_u32, &week, NULL ); - gameserver_cat_table( &body_msg, mod, route, 0, "rows" ); - -#if 0 - if( week == NETWORK_LEADERBOARD_CURRENT_WEEK ) + + char table_name[ DB_TABLE_UID_MAX ]; + if( !db_get_highscore_table_name( mod, route, table_name ) ) { - gameserver_cat_table( &body_msg, mod, route, gameserver_get_current_week(), "rows_weekly" ); + req->status = k_request_status_out_of_memory; + goto E0; } - else if( week == NETWORK_LEADERBOARD_ALLTIME_AND_CURRENT_WEEK ) + enum request_status result = gameserver_read_highscore_table( &body_msg, table_name ); + if( result != k_request_status_ok ) { - gameserver_cat_table( &body_msg, mod, route, 0, "rows" ); - gameserver_cat_table( &body_msg, mod, route, gameserver_get_current_week(), "rows_weekly" ); + req->status = result; + goto E0; } - else - gameserver_cat_table( &body_msg, mod, route, week, "rows" ); -#endif } else if( !strcmp( endpoint, "replay" ) ) { @@ -338,13 +370,14 @@ static void task_request_run( vg_async_task *task ) goto E0; } + i64 last_second = time(NULL); const char *mod = vg_msg_getkvstr( &client_msg, "mod" ); const char *route = vg_msg_getkvstr( &client_msg, "route" ); //char weekly_table[ DB_TABLE_UID_MAX ], char table[ DB_TABLE_UID_MAX ]; - if( !db_get_highscore_table_name( mod, route, 0, table ) ) + if( !db_get_highscore_table_name( mod, route, table ) ) { req->status = k_request_status_out_of_memory; goto E0; @@ -358,15 +391,8 @@ static void task_request_run( vg_async_task *task ) goto E0; } - i32 current_time = db_readusertime( table, req->user_steamid ); - if( (current_time == 0) || (centiseconds < current_time) ) - { - i64 last_second = time(NULL); + if( db_writeusertime( table, req->user_steamid, centiseconds, last_second, 1 ) ) _gs_replay_request_save( req->client_id, req->user_steamid, last_second, centiseconds, 1 ); - db_writeusertime( table, req->user_steamid, centiseconds, last_second ); - } - - //db_writeusertime( weekly_table, req->user_steamid, centiseconds, 1, last_minute ); } else { @@ -375,6 +401,7 @@ static void task_request_run( vg_async_task *task ) if( body_msg.error != k_vg_msg_error_OK ) { + vg_error( "msg error: %u\n", body_msg.error ); req->status = k_request_status_out_of_memory; } @@ -425,6 +452,7 @@ void _gs_handle_request_message( u32 client_id, SteamNetworkingMessage_t *msg ) req->data_buffer = NULL; req->data_buffer_send_size = 0; req->send_offset = 0; + req->waiting_request = 0; gs_request *last_request = vg_pool_item( &_gs_requests.request_pool, rc->current_request ), *next = last_request; diff --git a/src/menu.c b/src/menu.c index b98dddb..d402ca5 100644 --- a/src/menu.c +++ b/src/menu.c @@ -12,7 +12,7 @@ #include "network.h" #include "shaders/model_menu.h" -struct global_menu menu = { .skip_starter = 0 }; +struct global_menu menu = { .skip_starter = 0, .prof_row = -1 }; void menu_at_begin(void) { @@ -792,7 +792,8 @@ void menu_gui( ui_context *ctx ) [k_menu_main_main] = "Menu", [k_menu_main_map] = "Map", [k_menu_main_settings ] = "Settings", - [k_menu_main_guide ] = "Guides" + [k_menu_main_guide ] = "Guides", + [k_menu_main_online ] = "Online" }; i32 main_index_before = menu.main_index; @@ -954,6 +955,137 @@ void menu_gui( ui_context *ctx ) vg.window_should_close = 1; } } +/* PAGE main */ + else if( menu.main_index == k_menu_main_online ) + { + if( menu.choosing_country ) + { + menu_backable_to_exit = 0; + bool close = _user_profile_country_picker( ctx, (ui_rect){ 8, height+32, + vg.window_x-16, vg.window_y-(height+32+16) } ); + if( close ) + menu.choosing_country = 0; + } + else + { + bool connected = network_connected(), + edit_profile = (menu.prof_row!=-1) && connected; + + i32 R = -1, + S = -1; + + if( edit_profile ) + { + S = menu_nav( &menu.prof_row, mv, 1 ); + menu_backable_to_exit = 0; + if( button_down( k_srbind_mback ) ) + menu.prof_row = -1; + } + else + R = menu_nav( &menu.main_row, mv, connected? 2: 1 ); + + /* online box */ + ui_rect online_box; + ui_split( list, k_ui_axis_h, 128, 8, online_box, list ); + ui_fill( ctx, online_box, ui_opacity( GUI_COL_DARK, 0.3f ) ); + ui_outline( ctx, online_box, 1, GUI_COL_NORM, 0 ); + + ui_rect inner_online_panel; + rect_copy( online_box, inner_online_panel ); + ui_rect_pad( inner_online_panel, (ui_px[2]){8,8} ); + + ctx->font = &vgf_default_large; + i32 temp = network_client.user_intent; + if( menu_checkbox( ctx, inner_online_panel, R == 0, "Online Mode", &temp ) ) + network_client.user_intent = temp; + + ui_rect label_box; + ctx->font = &vgf_default_small; + menu_standard_widget( ctx, inner_online_panel, label_box, 1 ); + ui_text( ctx, label_box, "Connection status:", 1, k_ui_align_middle_left, 0 ); + + char buf[128]; + vg_str str; + vg_strnull( &str, buf, sizeof(buf) ); + u32 colour = 0; + network_status_string( &str, &colour ); + menu_standard_widget( ctx, inner_online_panel, label_box, 1 ); + ui_text( ctx, label_box, buf, 1, k_ui_align_middle_left, colour ); + + ctx->font = &vgf_default_title; + + if( connected ) + { + ui_rect profile_box; + ui_split( list, k_ui_axis_h, 200, 8, profile_box, list ); + ui_fill( ctx, profile_box, ui_opacity( GUI_COL_DARK, 0.3f ) ); + ui_outline( ctx, profile_box, 1, GUI_COL_NORM, 0 ); + _user_profile_ui( ctx, profile_box, 0 ); + + bool click_edit = 0, hover_edit = 0; + if( !edit_profile ) + { + if( vg_input.display_input_method == k_input_method_controller ) + { + if( R == 1 ) + { + menu_decor_select( ctx, profile_box ); + if( button_down( k_srbind_maccept ) ) + click_edit = 1; + hover_edit = 1; + } + } + else + { + enum ui_button_state state = ui_button_base( ctx, profile_box ); + if( state == k_ui_button_hover ) + hover_edit = 1; + + if( state == 1 ) + click_edit = 1; + } + + if( hover_edit ) + { + vg_ui.frosting = 0.015f; + ui_flush( ctx, k_ui_shader_colour, NULL ); + vg_ui.frosting = 0.0f; + ui_fill( ctx, profile_box, ui_opacity( GUI_COL_DARK, 0.4f ) ); + ui_flush( ctx, k_ui_shader_colour, NULL ); + ui_text( ctx, profile_box, "Edit profile?", 1, k_ui_align_middle_center, 0 ); + } + + if( click_edit ) + menu.prof_row = 0; + } + + if( edit_profile ) + { + ui_rect edit_box = { profile_box[0]+profile_box[2]+8, profile_box[1], 260, 400 }, + edit_title; + ui_fill( ctx, edit_box, ui_opacity( GUI_COL_DARK, 0.3f ) ); + ui_outline( ctx, edit_box, 1, GUI_COL_NORM, 0 ); + + if( vg_input.display_input_method == k_input_method_kbm ) + { + ui_rect close_box = {edit_box[0]+edit_box[2]+2,edit_box[1],32,32}; + if( menu_button_rect( ctx, close_box, 0, 1, "X" ) ) + { + menu.prof_row = -1; + } + } + + ui_split( edit_box, k_ui_axis_h, 48, 8, edit_title, edit_box ); + ui_text( ctx, edit_title, "Edit Profile", 1, k_ui_align_middle_center, 0 ); + ctx->font = &vgf_default_large; + + if( menu_button( ctx, edit_box, S == 0, 1, "Represent Country" ) ) + menu.choosing_country = 1; + } + } + ctx->font = &vgf_default_small; + } + } /* PAGE settings */ else if( menu.main_index == k_menu_main_settings ) { @@ -1076,36 +1208,31 @@ void menu_gui( ui_context *ctx ) if( menu_button( ctx, list, R == 2, 1, "Skating \xb2" ) ) { menu.guide_sel = 0; - menu_link_modal( - "https://skaterift.com/index.php?page=movement" ); + menu_link_modal( "https://skaterift.com/index.php?page=movement" ); } //if( menu.guide_sel == 0 || menu.guide_sel > 3 ) menu_try_find_cam( 3 ); if( menu_button( ctx, list, R == 3, 1, "Tricks \xb2" ) ) { menu.guide_sel = 0; - menu_link_modal( - "https://skaterift.com/index.php?page=tricks" ); + menu_link_modal( "https://skaterift.com/index.php?page=tricks" ); } menu_heading( ctx, list, "Workshop", 0 ); if( menu_button( ctx, list, R == 4, 1, "Create a Board \xb2" ) ) { menu.guide_sel = 0; - menu_link_modal( - "https://skaterift.com/index.php?page=workshop_board" ); + menu_link_modal( "https://skaterift.com/index.php?page=workshop_board" ); } if( menu_button( ctx, list, R == 5, 1, "Create a World \xb2" ) ) { menu.guide_sel = 0; - menu_link_modal( - "https://skaterift.com/index.php?page=workshop_world" ); + menu_link_modal( "https://skaterift.com/index.php?page=workshop_world" ); } if( menu_button( ctx, list, R == 6, 1, "Create a Playermodel \xb2" ) ) { menu.guide_sel = 0; - menu_link_modal( - "https://skaterift.com/index.php?page=workshop_player" ); + menu_link_modal( "https://skaterift.com/index.php?page=workshop_player" ); } } } diff --git a/src/menu.h b/src/menu.h index fddd0cf..2e27922 100644 --- a/src/menu.h +++ b/src/menu.h @@ -15,15 +15,16 @@ enum menu_page k_menu_page_main, k_menu_page_credits, k_menu_page_help, - k_menu_page_impromptu_guide + k_menu_page_impromptu_guide, }; enum menu_main_subpage { k_menu_main_main = 0, k_menu_main_map = 1, - k_menu_main_settings = 2, - k_menu_main_guide = 3 + k_menu_main_online = 2, + k_menu_main_settings = 3, + k_menu_main_guide = 4 }; struct global_menu @@ -37,10 +38,12 @@ struct global_menu guides_row, intro_row, guide_sel, - prem_row; + prem_row, + prof_row; f32 mouse_dist; /* used for waking up mouse */ f32 repeater; + bool choosing_country; bool bg_blur; ent_camera *bg_cam; diff --git a/src/network.c b/src/network.c index b41ff9e..01d1764 100644 --- a/src/network.c +++ b/src/network.c @@ -647,38 +647,34 @@ void network_update(void) } } -void chat_send_message( const char *message ) +void chat_send_message( const char *message, bool rcon ) { - if( !network_connected() ){ + if( !network_connected() ) return; - } netmsg_chat *chat = alloca( sizeof(netmsg_chat) + NETWORK_MAX_CHAT ); - chat->inetmsg_id = k_inetmsg_chat; + chat->inetmsg_id = rcon? k_inetmsg_rcon: k_inetmsg_chat; chat->client = 0; - - u32 l = vg_strncpy( message, chat->msg, NETWORK_MAX_CHAT, - k_strncpy_always_add_null ); - + u32 l = vg_strncpy( message, chat->msg, NETWORK_MAX_CHAT, k_strncpy_always_add_null ); SteamAPI_ISteamNetworkingSockets_SendMessageToConnection( hSteamNetworkingSockets, network_client.remote, chat, sizeof(netmsg_chat)+l+1, k_nSteamNetworkingSend_Reliable, NULL ); } -static int cmd_network_send_message( int argc, const char *argv[] ){ +static int cmd_network_send_rcon( int argc, const char *argv[] ) +{ char buf[ NETWORK_MAX_CHAT ]; vg_str str; vg_strnull( &str, buf, NETWORK_MAX_CHAT ); - - for( int i=0; i=2 ) + { + for( u32 i=0; iinetmsg_id = k_inetmsg_request; + + vg_msg data; + vg_msg_init( &data, packet->buffer, 512 ); + vg_msg_wkvstr( &data, "endpoint", "profile" ); + vg_msg_wkvnum( &data, "steamid", k_vg_msg_u64, 1, &steamid ); + network_send_request( packet, &data, _profile_download_callback, steamid ); + } + } + + ui_fill( ctx, box, ui_opacity( GUI_COL_DARK, 0.36f ) ); + const ui_px p = 16; + + ui_rect inner; + rect_copy( box, inner ); + ui_rect_pad( inner, (ui_px[2]){p,p} ); + + ui_rect span; + rect_copy( inner, span ); + span[3] = 2; + ui_fill( ctx, span, ui_colour( ctx, k_ui_fg ) ); + span[1] = inner[1] + inner[3] - span[3]; + ui_fill( ctx, span, ui_colour( ctx, k_ui_fg ) ); + + inner[1] += p; + inner[3] -= p*2; + + if( _user_profile.state != k_user_profile_state_open ) + { + bool download = _user_profile.state == k_user_profile_state_downloading; + ctx->font = &vgf_default_title; + ui_text( ctx, inner, download? "...": "???", 1, k_ui_align_middle_center, ui_colour(ctx,k_ui_fg) ); + ctx->font = &vgf_default_large; + return; + } + + ui_px pfpw = inner[3]/2; + ui_rect pfp = { inner[0], inner[1], pfpw, pfpw }; + ui_rect flagbox = { inner[0], inner[1] + pfpw, pfpw, pfpw }; + ui_rect flag = {0,0, pfpw-p, ((pfpw-p)*2)/3 }; + ui_rect_center( flagbox, flag ); + + if( _user_profile.country_index ) + { + vg_ui.frosting = 0.015f; + ui_flush( ctx, k_ui_shader_colour, NULL ); + vg_ui.frosting = 0.0f; + + u32 i = _user_profile.country_index-1, + x = (i & 0xf)*16, + y = ((i>>4) & 0xf)*16; + ui_fill_rect( ctx, flag, 0xffffffff, (ui_px[4]){ x,y,x+16,y+16 } ); + + struct ui_batch_shader_data_image inf = { .resource = &_user_profile.cc_tex }; + ui_flush( ctx, k_ui_shader_image, &inf ); + } + + ui_fill( ctx, pfp, ui_colour( ctx, k_ui_blue ) ); + + ui_rect a2 = { inner[0] + pfpw + p, inner[1], inner[2] - (pfpw+p), inner[3] }; + ui_rect title_box; + ui_split( a2, k_ui_axis_h, 48, 4, title_box, a2 ); + + ctx->font = &vgf_default_title; + ui_text( ctx, title_box, _user_profile.username, 1, k_ui_align_middle_center, ui_colour(ctx,k_ui_yellow) ); + ctx->font = &vgf_default_large; + + ui_rect medal_row; + ui_px mw = 64; + ui_split( a2, k_ui_axis_h, mw, 0, medal_row, a2 ); + + struct + { + enum menu_icon which; + u16 count; + } + medal_list[5]; + + u32 medal_count = 0; + u16 race3 = 0, race10 = 0; + + if( _user_profile.race3 ) + { + medal_list[ medal_count ].which = k_menu_icon_top3; + medal_list[ medal_count++ ].count = _user_profile.race3; + } + + if( _user_profile.race10 ) + { + medal_list[ medal_count ].which = k_menu_icon_top10; + medal_list[ medal_count++ ].count = _user_profile.race10; + } + + if( medal_count ) + { + vg_ui.frosting = 0.015f; + ui_flush( ctx, k_ui_shader_colour, NULL ); + vg_ui.frosting = 0.0f; + + ui_px row_width = (mw*medal_count + 8*(medal_count-1)), + base = medal_row[0] + (medal_row[2]-row_width)/2, + x = base; + + for( u32 i=0; i>3) & 0x7)*32; + ui_fill_rect( ctx, medal_box, 0xffffffff, (ui_px[4]){ z,w,z+32,w+32 } ); + } + + struct ui_batch_shader_data_image inf = { .resource = &_user_profile.icon_tex }; + ui_flush( ctx, k_ui_shader_image, &inf ); + + x = base; + for( u32 i=0; i 1 ) + { + char buf[32]; + vg_str str; + vg_strnull( &str, buf, sizeof(buf) ); + vg_strcatch( &str, 'x' ); + vg_strcati32( &str, medal_list[i].count ); + ui_text( ctx, count_box, buf, 1, k_ui_align_middle, ui_colour(ctx,k_ui_fg) ); + } + } + } +} + +bool _user_profile_country_picker( ui_context *ctx, ui_rect box ) +{ + bool close = 0, + picking = 0; + + ui_fill( ctx, box, ui_opacity( GUI_COL_DARK, 0.36f ) ); + ui_outline( ctx, box, 1, ui_colour( ctx, k_ui_fg ), 0 ); + + v2f co; + + if( _user_profile.country_index ) + { + struct country *country = &k_countries[_user_profile.country_index-1]; + co[0] = country->x; + co[1] = 1.0f-country->y; + } + else + { + picking = 1; + if( vg_input.display_input_method == k_input_method_controller ) + { + v2f steer; + joystick_state( k_srjoystick_steer, steer ); + v2_muladds( _user_profile.country_coords, steer, vg.time_frame_delta*0.33f, co ); + co[0] = vg_fractf( co[0] ); + co[1] = vg_fractf( co[1] ); + } + else + { + co[0] = ((f32)ctx->mouse[0] - (f32)box[0]) / (f32)box[2]; + co[1] = ((f32)ctx->mouse[1] - (f32)box[1]) / (f32)box[3]; + } + } + + v2_copy( co, _user_profile.country_coords ); + + ui_px cx = co[0] * (f32)box[2], + cy = co[1] * (f32)box[3]; + + ui_px r = 8; + ui_px c[2] = { box[0]+cx, box[1]+cy }; + ui_rect c1 = { c[0]-1, c[1]-1, 3, 3 }, + c2 = { c[0]-r, c[1]-r, r*2, r*2 }, + cv = { c[0], box[1], 1, box[3] }, + ch = { box[0], c[1], box[2], 1 }; + + f32 min_dist = 0.2f; + i32 min_country = -1; + + ui_rect min_country_rect={0}; + + vg_ui.frosting = 0.015f; + ui_flush( ctx, k_ui_shader_colour, NULL ); + vg_ui.frosting = 0.0f; + + ui_fill_rect( ctx, box, 0xffffffff, (ui_px[4]){ 0,0,256,256 } ); + + struct ui_batch_shader_data_image inf1 = { .resource = &_user_profile.map_tex }; + ui_flush( ctx, k_ui_shader_image, &inf1 ); + + for( u32 i=0; ix,1.0f-country->y}; + v2_sub( co, cco, v0 ); + + f32 d = v2_length(v0); + + f32 s = vg_maxf((0.5f - d) / 0.5f,0.0f), + s2 = vg_maxf(powf(s,5.0f), 0.2f), + s5 = powf(vg_maxf((0.05f - d) / 0.05f,0.0f), 2.0f)*0.5f; + ui_px size = 64.0f*s2, + w = size, + h = (size*2)/3; + + cx = vg_clampf(cco[0]-v0[0]*s5,0.0f,1.0f) * (f32)box[2], + cy = vg_clampf(cco[1]-v0[1]*2.0f*s5,0.0f,1.0f) * (f32)box[3]; + ui_rect flag = { box[0] + cx-w/2, box[1] + cy-h/2, w, h }; + u32 x = (i & 0xf)*16, + y = ((i>>4) & 0xf)*16; + ui_fill_rect( ctx, flag, picking? 0xffffffff: ui_opacity(0xffffffff,0.2f), (ui_px[4]){ x,y,x+16,y+16 } ); + + if( d < min_dist ) + { + min_dist = d; + min_country = i; + rect_copy( flag, min_country_rect ); + } + } + + if( min_country >= 0 ) + { + u32 x = (min_country & 0xf)*16, + y = ((min_country>>4) & 0xf)*16; + ui_fill_rect( ctx, min_country_rect, 0xffffffff, (ui_px[4]){ x,y,x+16,y+16 } ); + } + + struct ui_batch_shader_data_image inf = { .resource = &_user_profile.cc_tex }; + ui_flush( ctx, k_ui_shader_image, &inf ); + + if( min_country >= 0 ) + { + ui_outline( ctx, min_country_rect, 1, ui_colour( ctx, k_ui_fg ), 0 ); + } + + ui_fill( ctx, c1, ui_colour( ctx, k_ui_fg ) ); + ui_fill( ctx, cv, ui_opacity(ui_colour( ctx, k_ui_fg ), 0.4f) ); + ui_fill( ctx, ch, ui_opacity(ui_colour( ctx, k_ui_fg ), 0.4f) ); + ui_outline( ctx, c2, 1, ui_colour( ctx, k_ui_fg ), 0 ); + + ctx->font = &vgf_default_large; + ui_rect descriptor_box = { box[0] + (box[2]-600)/2, box[1]-16, 600, 32 }; + + ui_fill( ctx, descriptor_box, ui_opacity( GUI_COL_DARK, 0.3f ) ); + ui_outline( ctx, descriptor_box, 1, ui_colour( ctx, k_ui_fg ), 0 ); + + if( picking && (min_country >=0) ) + { + bool set=0; + u32 offset = k_countries[min_country].name_offset; + ui_text( ctx, descriptor_box, k_country_names+offset, 1, k_ui_align_middle_center, 0 ); + + if( vg_input.display_input_method == k_input_method_controller ) + { + if( button_down( k_srbind_maccept ) ) + { + vg_audio_lock(); + vg_audio_oneshot( &audio_ui[3], 1.0f, 0.0f, 0, 0 ); + vg_audio_unlock(); + set = 1; + } + } + else + { + if( ui_click_down(ctx, UI_MOUSE_LEFT) ) + set = 1; + } + + if( set ) + _user_profile.country_index = min_country+1; + } + + if( !picking && _user_profile.country_index ) + { + bool rid=0; + u32 offset = k_countries[_user_profile.country_index-1].name_offset; + ui_text( ctx, descriptor_box, k_country_names+offset, 1, k_ui_align_middle_center, 0 ); + + ui_rect box_under; + rect_copy( descriptor_box, box_under ); + box_under[1] += box_under[3] + 8; + ui_fill( ctx, box_under, ui_opacity( GUI_COL_DARK, 0.3f ) ); + ctx->font = &vgf_default_small; + ui_text( ctx, box_under, ">> representing <<", 1, k_ui_align_middle_center, ui_colour(ctx,k_ui_yellow) ); + + if( vg_input.display_input_method == k_input_method_controller ) + { + ctx->font = &vgf_default_large; + char buf[50]; + vg_str helper_text; + vg_strnull( &helper_text, buf, sizeof(buf) ); + vg_strcat( &helper_text, "Stop (" ); + vg_input_string( &helper_text, input_button_list[k_srbind_mback], 1 ); + vg_strcat( &helper_text, "\x07) Confirm (" ); + vg_input_string( &helper_text, input_button_list[k_srbind_maccept], 1 ); + vg_strcat( &helper_text, "\x07)" ); + ui_px w = 300; + + ui_rect helper_label_box = { box_under[0] + (box_under[2]-w)/2, box[1] + box[3]-(70), w, 32 }; + ui_fill( ctx, helper_label_box, ui_opacity( GUI_COL_DARK, 0.36f ) ); + ui_text( ctx, helper_label_box, buf, 1, k_ui_align_middle_center, 0 ); + + if( button_down( k_srbind_mback ) ) + { + vg_audio_lock(); + vg_audio_oneshot( &audio_ui[3], 1.0f, 0.0f, 0, 0 ); + vg_audio_unlock(); + rid =1; + } + if( button_down( k_srbind_maccept ) ) + { + vg_audio_lock(); + vg_audio_oneshot( &audio_ui[3], 1.0f, 0.0f, 0, 0 ); + vg_audio_unlock(); + close = 1; + } + } + else + { + ui_rect no_box = {box_under[0]+box_under[2]-32, box_under[1], 32, box_under[3] }; + if( ui_button_text( ctx, no_box, "X", 1 ) == 1 ) + rid = 1; + } + + if( rid ) + _user_profile.country_index = 0; + } + + if( vg_input.display_input_method == k_input_method_controller ) + { + if( picking && button_down( k_srbind_mback ) ) + { + vg_audio_lock(); + vg_audio_oneshot( &audio_ui[3], 1.0f, 0.0f, 0, 0 ); + vg_audio_unlock(); + close = 1; + } + } + + if( vg_input.display_input_method == k_input_method_kbm ) + { + ctx->font = &vgf_default_large; + + ui_px w = 200; + ui_rect close_button = { box[0] + (box[2]-w)/2, box[1] + box[3]-(70), w, 48 }; + if( menu_button_rect( ctx, close_button, 0, 1, "Confirm" ) ) + close = 1; + } + + if( close ) + { + _user_profile.state = k_user_profile_state_none; + netmsg_request *packet = alloca( sizeof(netmsg_request) + 512 ); + packet->inetmsg_id = k_inetmsg_request; + + vg_msg data; + vg_msg_init( &data, packet->buffer, 512 ); + vg_msg_wkvstr( &data, "endpoint", "profile" ); + + u32 index = _user_profile.country_index; + vg_msg_wkvstr( &data, "cc", index == 0? "00": k_country_iso2+(index-1)*3 ); + network_send_request( packet, &data, _profile_download_callback, 0 ); + } + + return close; +} diff --git a/src/user_profile.h b/src/user_profile.h new file mode 100644 index 0000000..6accf55 --- /dev/null +++ b/src/user_profile.h @@ -0,0 +1,4 @@ +#pragma once +void _user_profile_init(void); +void _user_profile_ui( ui_context *ctx, ui_rect box, u64 steamid ); +bool _user_profile_country_picker( ui_context *ctx, ui_rect box );