= 0) {
1212 | lut[lut_size] = transparent_color; // Set the transparent color
1213 | colorInfo[1] = lut_size;
1214 | }
1215 |
1216 | return lut_size;
1217 | }
1218 |
1219 | /* Histogram is in elements 1..HISTSIZE along each axis,
1220 | * element 0 is for base or marginal value
1221 | * NB: these must start out 0!
1222 | */
1223 | private void Hist3d(long vwt[][][], long vmr[][][], long vmg[][][], long vmb[][][], float m2[][][]) {
1224 | /* build 3-D color histogram of counts, r/g/b, c^2 */
1225 | int r, g, b;
1226 | int i, inr, ing, inb, table[] = new int[256];
1227 |
1228 | for(i = 0; i < 256; ++i) table[i]= i*i;
1229 |
1230 | qadd = new int[size];
1231 |
1232 | for(i = 0; i < size; ++i) {
1233 | int rgb = pixels[i];
1234 | if((rgb >>> 24) < 0x80) { // Transparent
1235 | if (transparent_color < 0) // Find the transparent color
1236 | transparent_color = rgb;
1237 | }
1238 | r = ((rgb >> 16)& 0xff);
1239 | g = ((rgb >> 8 )& 0xff);
1240 | b = ( rgb & 0xff);
1241 | inr = (r >> 3) + 1;
1242 | ing = (g >> 3) + 1;
1243 | inb = (b >> 3) + 1;
1244 | qadd[i] = (inr << 10) + (inr << 6) + inr + (ing << 5) + ing + inb;
1245 | /*[inr][ing][inb]*/
1246 | ++vwt[inr][ing][inb];
1247 | vmr[inr][ing][inb] += r;
1248 | vmg[inr][ing][inb] += g;
1249 | vmb[inr][ing][inb] += b;
1250 | m2[inr][ing][inb] += table[r] + table[g] + table[b];
1251 | }
1252 | }
1253 |
1254 | /* At conclusion of the histogram step, we can interpret
1255 | * wt[r][g][b] = sum over voxel of P(c)
1256 | * mr[r][g][b] = sum over voxel of r*P(c) , similarly for mg, mb
1257 | * m2[r][g][b] = sum over voxel of c^2*P(c)
1258 | * Actually each of these should be divided by 'size' to give the usual
1259 | * interpretation of P() as ranging from 0 to 1, but we needn't do that here.
1260 | */
1261 |
1262 | /* We now convert histogram into moments so that we can rapidly calculate
1263 | * the sums of the above quantities over any desired box.
1264 | */
1265 | private void M3d(long vwt[][][], long vmr[][][], long vmg[][][], long vmb[][][], float m2[][][]) {
1266 | /* compute cumulative moments. */
1267 | int i, r, g, b;
1268 | int line, line_r, line_g, line_b;
1269 | int area[] = new int[QUANT_SIZE];
1270 | int area_r[] = new int[QUANT_SIZE];
1271 | int area_g[] = new int[QUANT_SIZE];
1272 | int area_b[] = new int[QUANT_SIZE];
1273 | float line2, area2[] = new float[QUANT_SIZE];
1274 |
1275 | for(r = 1; r < QUANT_SIZE; ++r) {
1276 | for(i = 0; i < QUANT_SIZE; ++i)
1277 | area2[i] = area[i] = area_r[i] = area_g[i] = area_b[i] = 0;
1278 | for(g = 1; g < QUANT_SIZE; ++g) {
1279 | line2 = line = line_r = line_g = line_b = 0;
1280 | for(b = 1; b < QUANT_SIZE; ++b){
1281 | line += vwt[r][g][b];
1282 | line_r += vmr[r][g][b];
1283 | line_g += vmg[r][g][b];
1284 | line_b += vmb[r][g][b];
1285 | line2 += m2[r][g][b];
1286 |
1287 | area[b] += line;
1288 | area_r[b] += line_r;
1289 | area_g[b] += line_g;
1290 | area_b[b] += line_b;
1291 | area2[b] += line2;
1292 |
1293 | vwt[r][g][b] = vwt[r-1][g][b] + area[b];
1294 | vmr[r][g][b] = vmr[r-1][g][b] + area_r[b];
1295 | vmg[r][g][b] = vmg[r-1][g][b] + area_g[b];
1296 | vmb[r][g][b] = vmb[r-1][g][b] + area_b[b];
1297 | m2[r][g][b] = m2[r-1][g][b] + area2[b];
1298 | }
1299 | }
1300 | }
1301 | }
1302 |
1303 | private long Vol(Box cube, long mmt[][][]) {
1304 | /* Compute sum over a box of any given statistic */
1305 | return ( mmt[cube.r1][cube.g1][cube.b1]
1306 | -mmt[cube.r1][cube.g1][cube.b0]
1307 | -mmt[cube.r1][cube.g0][cube.b1]
1308 | +mmt[cube.r1][cube.g0][cube.b0]
1309 | -mmt[cube.r0][cube.g1][cube.b1]
1310 | +mmt[cube.r0][cube.g1][cube.b0]
1311 | +mmt[cube.r0][cube.g0][cube.b1]
1312 | -mmt[cube.r0][cube.g0][cube.b0] );
1313 | }
1314 |
1315 | /* The next two routines allow a slightly more efficient calculation
1316 | * of Vol() for a proposed subbox of a given box. The sum of Top()
1317 | * and Bottom() is the Vol() of a subbox split in the given direction
1318 | * and with the specified new upper bound.
1319 | */
1320 |
1321 | private long Bottom(Box cube, int dir, long mmt[][][]) {
1322 | /* Compute part of Vol(cube, mmt) that doesn't depend on r1, g1, or b1 */
1323 | /* (depending on dir) */
1324 | switch(dir) {
1325 | case RED:
1326 | return( -mmt[cube.r0][cube.g1][cube.b1]
1327 | +mmt[cube.r0][cube.g1][cube.b0]
1328 | +mmt[cube.r0][cube.g0][cube.b1]
1329 | -mmt[cube.r0][cube.g0][cube.b0] );
1330 | case GREEN:
1331 | return( -mmt[cube.r1][cube.g0][cube.b1]
1332 | +mmt[cube.r1][cube.g0][cube.b0]
1333 | +mmt[cube.r0][cube.g0][cube.b1]
1334 | -mmt[cube.r0][cube.g0][cube.b0] );
1335 | case BLUE:
1336 | return( -mmt[cube.r1][cube.g1][cube.b0]
1337 | +mmt[cube.r1][cube.g0][cube.b0]
1338 | +mmt[cube.r0][cube.g1][cube.b0]
1339 | -mmt[cube.r0][cube.g0][cube.b0] );
1340 | default:
1341 | return 0;
1342 | }
1343 | }
1344 |
1345 | private long Top(Box cube, int dir, int pos, long mmt[][][]) {
1346 | /* Compute remainder of Vol(cube, mmt), substituting pos for */
1347 | /* r1, g1, or b1 (depending on dir) */
1348 | switch(dir) {
1349 | case RED:
1350 | return( mmt[pos][cube.g1][cube.b1]
1351 | -mmt[pos][cube.g1][cube.b0]
1352 | -mmt[pos][cube.g0][cube.b1]
1353 | +mmt[pos][cube.g0][cube.b0] );
1354 | case GREEN:
1355 | return( mmt[cube.r1][pos][cube.b1]
1356 | -mmt[cube.r1][pos][cube.b0]
1357 | -mmt[cube.r0][pos][cube.b1]
1358 | +mmt[cube.r0][pos][cube.b0] );
1359 | case BLUE:
1360 | return( mmt[cube.r1][cube.g1][pos]
1361 | -mmt[cube.r1][cube.g0][pos]
1362 | -mmt[cube.r0][cube.g1][pos]
1363 | +mmt[cube.r0][cube.g0][pos] );
1364 | default:
1365 | return 0;
1366 | }
1367 | }
1368 |
1369 | private float Var(Box cube) {
1370 | /* Compute the weighted variance of a box */
1371 | /* NB: as with the raw statistics, this is really the variance * size */
1372 | float dr, dg, db, xx;
1373 | dr = Vol(cube, mr);
1374 | dg = Vol(cube, mg);
1375 | db = Vol(cube, mb);
1376 | xx = m2[cube.r1][cube.g1][cube.b1]
1377 | -m2[cube.r1][cube.g1][cube.b0]
1378 | -m2[cube.r1][cube.g0][cube.b1]
1379 | +m2[cube.r1][cube.g0][cube.b0]
1380 | -m2[cube.r0][cube.g1][cube.b1]
1381 | +m2[cube.r0][cube.g1][cube.b0]
1382 | +m2[cube.r0][cube.g0][cube.b1]
1383 | -m2[cube.r0][cube.g0][cube.b0];
1384 | return xx - (dr*dr + dg*dg + db*db)/Vol(cube,wt);
1385 | }
1386 |
1387 | /* We want to minimize the sum of the variances of two subboxes.
1388 | * The sum(c^2) terms can be ignored since their sum over both subboxes
1389 | * is the same (the sum for the whole box) no matter where we split.
1390 | * The remaining terms have a minus sign in the variance formula,
1391 | * so we drop the minus sign and MAXIMIZE the sum of the two terms.
1392 | */
1393 | private float Maximize(Box cube, int dir, int first, int last, int cut[],
1394 | long whole_r, long whole_g, long whole_b, long whole_w) {
1395 | long half_r, half_g, half_b, half_w;
1396 | long base_r, base_g, base_b, base_w;
1397 | int i;
1398 | float temp, max;
1399 |
1400 | base_r = Bottom(cube, dir, mr);
1401 | base_g = Bottom(cube, dir, mg);
1402 | base_b = Bottom(cube, dir, mb);
1403 | base_w = Bottom(cube, dir, wt);
1404 |
1405 | max = 0.0f;
1406 | cut[0] = -1;
1407 |
1408 | for(i = first; i < last; ++i){
1409 | half_r = base_r + Top(cube, dir, i, mr);
1410 | half_g = base_g + Top(cube, dir, i, mg);
1411 | half_b = base_b + Top(cube, dir, i, mb);
1412 | half_w = base_w + Top(cube, dir, i, wt);
1413 | /* now half_x is sum over lower half of box, if split at i */
1414 | if (half_w == 0) /* subbox could be empty of pixels! */
1415 | continue; /* never split into an empty box */
1416 | temp = (half_r*half_r + half_g*half_g + half_b*half_b)/(float)half_w;
1417 | half_r = whole_r - half_r;
1418 | half_g = whole_g - half_g;
1419 | half_b = whole_b - half_b;
1420 | half_w = whole_w - half_w;
1421 | if (half_w == 0) /* subbox could be empty of pixels! */
1422 | continue; /* never split into an empty box */
1423 | temp += (half_r*half_r + half_g*half_g + half_b*half_b)/(float)half_w;
1424 |
1425 | if (temp > max) { max = temp; cut[0] = i;}
1426 | }
1427 |
1428 | return max;
1429 | }
1430 |
1431 | private boolean Cut(Box set1, Box set2) {
1432 | int dir;
1433 | int cutr[] = new int[1];
1434 | int cutg[] = new int[1];
1435 | int cutb[] = new int[1];
1436 | float maxr, maxg, maxb;
1437 | long whole_r, whole_g, whole_b, whole_w;
1438 |
1439 | whole_r = Vol(set1, mr);
1440 | whole_g = Vol(set1, mg);
1441 | whole_b = Vol(set1, mb);
1442 | whole_w = Vol(set1, wt);
1443 |
1444 | maxr = Maximize(set1, RED, set1.r0 + 1, set1.r1, cutr,
1445 | whole_r, whole_g, whole_b, whole_w);
1446 | maxg = Maximize(set1, GREEN, set1.g0 + 1, set1.g1, cutg,
1447 | whole_r, whole_g, whole_b, whole_w);
1448 | maxb = Maximize(set1, BLUE, set1.b0 + 1, set1.b1, cutb,
1449 | whole_r, whole_g, whole_b, whole_w);
1450 |
1451 | if(maxr >= maxg && maxr >= maxb) {
1452 | dir = RED;
1453 | if (cutr[0] < 0) return false; /* can't split the box */
1454 | } else if(maxg >= maxr && maxg >= maxb)
1455 | dir = GREEN;
1456 | else
1457 | dir = BLUE;
1458 |
1459 | set2.r1 = set1.r1;
1460 | set2.g1 = set1.g1;
1461 | set2.b1 = set1.b1;
1462 |
1463 | switch (dir){
1464 | case RED:
1465 | set2.r0 = set1.r1 = cutr[0];
1466 | set2.g0 = set1.g0;
1467 | set2.b0 = set1.b0;
1468 | break;
1469 | case GREEN:
1470 | set2.g0 = set1.g1 = cutg[0];
1471 | set2.r0 = set1.r0;
1472 | set2.b0 = set1.b0;
1473 | break;
1474 | case BLUE:
1475 | set2.b0 = set1.b1 = cutb[0];
1476 | set2.r0 = set1.r0;
1477 | set2.g0 = set1.g0;
1478 | break;
1479 | }
1480 | set1.vol = (set1.r1 - set1.r0)*(set1.g1 - set1.g0)*(set1.b1 - set1.b0);
1481 | set2.vol = (set2.r1 - set2.r0)*(set2.g1 - set2.g0)*(set2.b1 - set2.b0);
1482 |
1483 | return true;
1484 | }
1485 |
1486 | private void Mark(Box cube, int label, int tag[]) {
1487 | int r, g, b;
1488 |
1489 | for(r = cube.r0 + 1; r <= cube.r1; ++r)
1490 | for(g = cube.g0 + 1; g <= cube.g1; ++g)
1491 | for(b = cube.b0 + 1; b <= cube.b1; ++b)
1492 | tag[(r<<10) + (r<<6) + r + (g<<5) + g + b] = label;
1493 | }
1494 | }
1495 |
1496 | /**
1497 | * A hash table using primitive integer keys.
1498 | *
1499 | * Based on
1500 | * QuadraticProbingHashTable.java
1501 | *
1502 | * Probing table implementation of hash tables.
1503 | * Note that all "matching" is based on the equals method.
1504 | *
1505 | * @author Mark Allen Weiss
1506 | */
1507 | private static class IntHashtable {
1508 |
1509 | /** The array of HashEntry. */
1510 | private HashEntry [ ] array; // The array of HashEntry
1511 | private int currentSize; // The number of occupied cells
1512 |
1513 | /**
1514 | * Construct the hash table.
1515 | * @param size the approximate initial size.
1516 | */
1517 | @SuppressWarnings("unchecked")
1518 | public IntHashtable(int size) {
1519 | array = new HashEntry [size];
1520 | makeEmpty( );
1521 | }
1522 |
1523 | /**
1524 | * Insert into the hash table. If the item is
1525 | * already present, do nothing.
1526 | * @param key the item to insert.
1527 | */
1528 | public void put(int key, E value) {
1529 | // Insert key as active
1530 | int currentPos = locate( key );
1531 | if( isActive( currentPos ) )
1532 | return;
1533 |
1534 | array[ currentPos ] = new HashEntry ( key, value, true );
1535 |
1536 | // Rehash
1537 | if( ++currentSize > array.length / 2 )
1538 | rehash( );
1539 | }
1540 |
1541 | /**
1542 | * Expand the hash table.
1543 | */
1544 | @SuppressWarnings("unchecked")
1545 | private void rehash( ) {
1546 | HashEntry [ ] oldArray = array;
1547 |
1548 | // Create a new double-sized, empty table
1549 | array = new HashEntry [nextPrime( 2 * oldArray.length )];
1550 | currentSize = 0;
1551 |
1552 | // Copy table over
1553 | for( int i = 0; i < oldArray.length; i++ )
1554 | if( oldArray[i] != null && oldArray[i].isActive )
1555 | put( oldArray[i].key, oldArray[i].value );
1556 |
1557 | return;
1558 | }
1559 |
1560 | /**
1561 | * Method that performs quadratic probing resolution.
1562 | * @param key the item to search for.
1563 | * @return the index of the item.
1564 | */
1565 | private int locate(int key) {
1566 | int collisionNum = 0;
1567 |
1568 | // And with the largest positive integer
1569 | int currentPos = (key & 0x7FFFFFFF) % array.length;
1570 |
1571 | while( array[ currentPos ] != null &&
1572 | array[ currentPos ].key != key )
1573 | {
1574 | currentPos += 2 * ++collisionNum - 1; // Compute ith probe
1575 | if( currentPos >= array.length ) // Implement the mod
1576 | currentPos -= array.length;
1577 | }
1578 | return currentPos;
1579 | }
1580 |
1581 | /**
1582 | * Find an item in the hash table.
1583 | * @param key the item to search for.
1584 | * @return the value of the matching item.
1585 | */
1586 | public E get(int key) {
1587 | int currentPos = locate( key );
1588 | return isActive( currentPos ) ? array[ currentPos ].value : null;
1589 | }
1590 |
1591 | /**
1592 | * Return true if currentPos exists and is active.
1593 | * @param currentPos the result of a call to findPos.
1594 | * @return true if currentPos is active.
1595 | */
1596 | private boolean isActive( int currentPos ) {
1597 | return array[ currentPos ] != null && array[ currentPos ].isActive;
1598 | }
1599 |
1600 | /**
1601 | * Make the hash table logically empty.
1602 | */
1603 | public void makeEmpty( ) {
1604 | currentSize = 0;
1605 | for( int i = 0; i < array.length; i++ )
1606 | array[ i ] = null;
1607 | }
1608 |
1609 | /**
1610 | * Internal method to find a prime number at least as large as n.
1611 | * @param n the starting number (must be positive).
1612 | * @return a prime number larger than or equal to n.
1613 | */
1614 | private static int nextPrime(int n) {
1615 | if( n % 2 == 0 )
1616 | n++;
1617 |
1618 | for( ; !isPrime( n ); n += 2 )
1619 | ;
1620 |
1621 | return n;
1622 | }
1623 |
1624 | /**
1625 | * Internal method to test if a number is prime.
1626 | * Not an efficient algorithm.
1627 | * @param n the number to test.
1628 | * @return the result of the test.
1629 | */
1630 | private static boolean isPrime(int n) {
1631 | if( n == 2 || n == 3 )
1632 | return true;
1633 |
1634 | if( n == 1 || n % 2 == 0 )
1635 | return false;
1636 |
1637 | for( int i = 3; i * i <= n; i += 2 )
1638 | if( n % i == 0 )
1639 | return false;
1640 |
1641 | return true;
1642 | }
1643 |
1644 | // The basic entry stored in ProbingHashTable
1645 | private static class HashEntry {
1646 | int key; // the key
1647 | V value; // the value
1648 | boolean isActive; // false if deleted
1649 |
1650 | @SuppressWarnings("unused")
1651 | HashEntry(int k, V val) {
1652 | this( k, val, true );
1653 | }
1654 |
1655 | HashEntry(int k, V val, boolean i) {
1656 | key = k;
1657 | value = val;
1658 | isActive = i;
1659 | }
1660 | }
1661 | }
1662 |
1663 | private static class InverseColorMap {
1664 | private int bitsReserved;// Number of bits used in color quantization.
1665 | private int bitsDiscarded;// Number of discarded bits
1666 | private int maxColorVal;// Maximum value for each quantized color
1667 | private int invMapLen;// Length of the inverse color map
1668 | // The inverse color map itself
1669 | private byte[] invColorMap;
1670 |
1671 | // Default constructor using 5 for quantization bits
1672 | public InverseColorMap() {
1673 | this(5);
1674 | }
1675 |
1676 | // Constructor using bitsReserved bits for quantization
1677 | public InverseColorMap(int rbits) {
1678 | bitsReserved = rbits;
1679 | bitsDiscarded = 8 - bitsReserved;
1680 | maxColorVal = 1 << bitsReserved;
1681 | invMapLen = maxColorVal * maxColorVal * maxColorVal;
1682 | invColorMap = new byte[invMapLen];
1683 | }
1684 |
1685 | // Fetch the forward color map index for this RGB
1686 | public int getNearestColorIndex(int red, int green, int blue) {
1687 | return invColorMap[(((red >> bitsDiscarded) << (bitsReserved<<1))) |
1688 | ((green >> bitsDiscarded) << bitsReserved) |
1689 | (blue >> bitsDiscarded)]&0xff;
1690 | }
1691 |
1692 | /**
1693 | * Create an inverse color map using the input forward RGB map.
1694 | */
1695 | public void createInverseMap(int no_of_colors, int[] colorPalette) {
1696 | int red, green, blue, r, g, b;
1697 | int rdist, gdist, bdist, dist;
1698 | int rinc, ginc, binc;
1699 |
1700 | int x = (1 << bitsDiscarded);// Step size for each color
1701 | int xsqr = (1 << (bitsDiscarded + bitsDiscarded));
1702 | int txsqr = xsqr + xsqr;
1703 | int buf_index;
1704 |
1705 | int[] dist_buf = new int[invMapLen];
1706 |
1707 | // Initialize the distance buffer array with the largest integer value
1708 | for (int i = invMapLen; --i >= 0;)
1709 | dist_buf[i] = 0x7FFFFFFF;
1710 | // Now loop through all the colors in the color map
1711 | for (int i = 0; i < no_of_colors; i++)
1712 | {
1713 | red = ((colorPalette[i]>>16)&0xff);
1714 | green = ((colorPalette[i]>>8)&0xff);
1715 | blue = (colorPalette[i]&0xff);
1716 | /**
1717 | * We start from the origin (0,0,0) of the quantized colors, calculate
1718 | * the distance between the cell center of the quantized colors and
1719 | * the current color map entry as follows:
1720 | * (rcenter * x + x/2) - red, where rcenter is the center of the
1721 | * Quantized red color map entry which is 0 since we start from 0.
1722 | */
1723 | rdist = (x>>1) - red;// Red distance
1724 | gdist = (x>>1) - green;// Green distance
1725 | bdist = (x>>1) - blue;// Blue distance
1726 | dist = rdist*rdist + gdist*gdist + bdist*bdist;//The modular
1727 | // The distance increment with each step value x
1728 | rinc = txsqr - (red << (bitsDiscarded + 1));
1729 | ginc = txsqr - (green << (bitsDiscarded + 1));
1730 | binc = txsqr - (blue << (bitsDiscarded + 1));
1731 |
1732 | buf_index = 0;
1733 | // Loop through quantized RGB space
1734 | for (r = 0, rdist = dist; r < maxColorVal; rdist += rinc, rinc += txsqr, r++ )
1735 | {
1736 | for (g = 0, gdist = rdist; g < maxColorVal; gdist += ginc, ginc += txsqr, g++)
1737 | {
1738 | for (b = 0, bdist = gdist; b < maxColorVal; bdist += binc, binc += txsqr, buf_index++, b++)
1739 | {
1740 | if (bdist < dist_buf[buf_index])
1741 | {
1742 | dist_buf[buf_index] = bdist;
1743 | invColorMap[buf_index] = (byte)i;
1744 | }
1745 | }
1746 | }
1747 | }
1748 | }
1749 | }
1750 | }
1751 | }
--------------------------------------------------------------------------------
/src/main/java/mayaseii/wildsmoddingtool/App.java:
--------------------------------------------------------------------------------
1 | package mayaseii.wildsmoddingtool;
2 |
3 | public class App
4 | {
5 | public static void main(String[] args)
6 | {
7 | Application.main(args);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/mayaseii/wildsmoddingtool/Application.java:
--------------------------------------------------------------------------------
1 | package mayaseii.wildsmoddingtool;
2 |
3 | import javafx.fxml.FXMLLoader;
4 | import javafx.scene.Scene;
5 | import javafx.scene.image.Image;
6 | import javafx.scene.layout.AnchorPane;
7 | import javafx.scene.media.MediaPlayer;
8 | import javafx.scene.media.MediaView;
9 | import javafx.scene.text.Font;
10 | import javafx.stage.Stage;
11 | import javafx.scene.media.Media;
12 | import javafx.util.Duration;
13 | import org.jetbrains.annotations.NotNull;
14 |
15 | import java.io.IOException;
16 | import java.net.URISyntaxException;
17 | import java.util.Locale;
18 | import java.util.Objects;
19 | import java.util.ResourceBundle;
20 |
21 | public class Application extends javafx.application.Application
22 | {
23 | static MediaPlayer mediaPlayer = null;
24 |
25 | public static Locale locale;
26 |
27 | @Override
28 | public void start(@NotNull Stage stage) throws IOException
29 | {
30 | // Resolves the locale.
31 | // locale = new Locale("es");
32 | locale = Locale.getDefault();
33 | ResourceBundle bundle = ResourceBundle.getBundle("mayaseii.wildsmoddingtool.strings", locale);
34 |
35 | // Loads the custom Pokémon font.
36 | Font.loadFont(Objects.requireNonNull(getClass().getResource("PokeWilds-Regular.ttf")).toExternalForm().replace("%20", " "), 16);
37 |
38 | // Loads the scene from the FXML file.
39 | FXMLLoader fxmlLoader = new FXMLLoader(Application.class.getResource("main-menu.fxml"), bundle);
40 | Scene scene = new Scene(fxmlLoader.load());
41 |
42 | // Loads the CSS file to apply to the view.
43 | String css = Objects.requireNonNull(this.getClass().getResource("app.css")).toExternalForm();
44 | scene.getStylesheets().add(css);
45 |
46 | // Sets up the media player for the background music.
47 | this.setupMediaPlayer();
48 |
49 | // Prepares the app window.
50 | stage.getIcons().add(new Image("file:src/icon.png"));
51 | stage.setTitle(bundle.getString("Global.AppTitle"));
52 | stage.setResizable(false);
53 |
54 | // Shows the stage.
55 | stage.setScene(scene);
56 | stage.show();
57 |
58 | // Starts the media player.
59 | this.startMediaPlayer(scene);
60 | }
61 |
62 | public static void main(String[] args)
63 | {
64 | launch(args);
65 | }
66 |
67 | private void setupMediaPlayer()
68 | {
69 | Media media = null;
70 |
71 | // Loads the background music track.
72 | try { media = new Media(Objects.requireNonNull(getClass().getResource("audio/BG_VioletCity.wav")).toURI().toString()); }
73 | catch (URISyntaxException e) { e.printStackTrace(); }
74 |
75 | assert media != null;
76 | mediaPlayer = new MediaPlayer(media);
77 | mediaPlayer.setVolume(0.3);
78 |
79 | // Enables looping.
80 | mediaPlayer.setOnEndOfMedia(() ->
81 | {
82 | mediaPlayer.seek(Duration.seconds(2.2));
83 | mediaPlayer.play();
84 | });
85 |
86 | mediaPlayer.setCycleCount(Integer.MAX_VALUE);
87 | }
88 |
89 | private void startMediaPlayer(@NotNull Scene scene)
90 | {
91 | // Plays the background track.
92 | mediaPlayer.setAutoPlay(true);
93 |
94 | // Adds the media player to the scene.
95 | MediaView mediaView = new MediaView(mediaPlayer);
96 | ((AnchorPane)scene.getRoot()).getChildren().add(mediaView);
97 | }
98 | }
--------------------------------------------------------------------------------
/src/main/java/mayaseii/wildsmoddingtool/ColorMapper.java:
--------------------------------------------------------------------------------
1 | package mayaseii.wildsmoddingtool;
2 |
3 | import java.awt.*;
4 | import java.awt.image.LookupTable;
5 | import java.util.Arrays;
6 |
7 | public class ColorMapper extends LookupTable {
8 |
9 | private final int[] from;
10 | private final int[] to;
11 |
12 | public ColorMapper(Color from,
13 | Color to) {
14 | super(0, 4);
15 |
16 | this.from = new int[] {
17 | from.getRed(),
18 | from.getGreen(),
19 | from.getBlue(),
20 | from.getAlpha(),
21 | };
22 | this.to = new int[] {
23 | to.getRed(),
24 | to.getGreen(),
25 | to.getBlue(),
26 | to.getAlpha(),
27 | };
28 | }
29 |
30 | @Override
31 | public int[] lookupPixel(int[] src,
32 | int[] dest) {
33 | if (dest == null) {
34 | dest = new int[src.length];
35 | }
36 |
37 | int[] newColor = (Arrays.equals(src, from) ? to : src);
38 | System.arraycopy(newColor, 0, dest, 0, newColor.length);
39 |
40 | return dest;
41 | }
42 | }
--------------------------------------------------------------------------------
/src/main/java/mayaseii/wildsmoddingtool/Controller.java:
--------------------------------------------------------------------------------
1 | package mayaseii.wildsmoddingtool;
2 |
3 | import javafx.event.ActionEvent;
4 | import javafx.fxml.FXMLLoader;
5 | import javafx.scene.Node;
6 | import javafx.scene.Parent;
7 | import javafx.scene.Scene;
8 | import javafx.scene.image.Image;
9 | import javafx.scene.image.ImageView;
10 | import javafx.scene.input.MouseEvent;
11 | import javafx.stage.Stage;
12 |
13 | import java.io.IOException;
14 | import java.net.URI;
15 | import java.net.URISyntaxException;
16 | import java.util.Locale;
17 | import java.util.Objects;
18 |
19 | import java.awt.*;
20 | import java.util.ResourceBundle;
21 |
22 | public class Controller
23 | {
24 | public void volumeControl(MouseEvent e) throws URISyntaxException
25 | {
26 | // Gets the volume control image view.
27 | ImageView image = (ImageView)e.getSource();
28 |
29 | // Checks whether the music is on.
30 | if (Application.mediaPlayer.getVolume() == .2)
31 | {
32 | // Disables the music.
33 | Application.mediaPlayer.setVolume(0);
34 | image.setImage(new Image(Objects.requireNonNull(this.getClass().getResource("img/noVolume.png")).toURI().toString()));
35 | }
36 | else
37 | {
38 | // Enables the music.
39 | Application.mediaPlayer.setVolume(.2);
40 | image.setImage(new Image(Objects.requireNonNull(this.getClass().getResource("img/volume.png")).toURI().toString()));
41 | }
42 | }
43 |
44 | public void openSeiiLink(ActionEvent e) throws URISyntaxException, IOException
45 | {
46 | // Opens Seiiccubus' Twitter link on the client's browser.
47 | Desktop.getDesktop().browse(new URI("https://twitter.com/mayaseii"));
48 | }
49 |
50 | public void playerSkinScene(ActionEvent e) throws IOException
51 | {
52 | switchScene((Stage)((Node)e.getSource()).getScene().getWindow(), "player-skin.fxml", "player-skin.css");
53 | }
54 |
55 | private void switchScene(Stage stage, String sceneName, String cssFile) throws IOException
56 | {
57 | // Resolves the locale.
58 | ResourceBundle bundle = ResourceBundle.getBundle("mayaseii.wildsmoddingtool.strings", Application.locale);
59 |
60 | // Loads the scene.
61 | Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource(sceneName)), bundle);
62 | Scene scene = new Scene(root);
63 |
64 | // Loads the CSS file to apply to the view.
65 | String css = Objects.requireNonNull(this.getClass().getResource(cssFile)).toExternalForm();
66 | scene.getStylesheets().add(css);
67 |
68 | // Shows the stage.
69 | stage.setScene(scene);
70 | stage.centerOnScreen();
71 | stage.show();
72 | }
73 | }
--------------------------------------------------------------------------------
/src/main/java/mayaseii/wildsmoddingtool/GifSequenceWriter.java:
--------------------------------------------------------------------------------
1 | package mayaseii.wildsmoddingtool;//
2 | // GifSequenceWriter.java
3 | //
4 | // Created by Elliot Kroo on 2009-04-25.
5 | //
6 | // This work is licensed under the Creative Commons Attribution 3.0 Unported
7 | // License. To view a copy of this license, visit
8 | // http://creativecommons.org/licenses/by/3.0/ or send a letter to Creative
9 | // Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
10 |
11 |
12 | import javax.imageio.*;
13 | import javax.imageio.metadata.*;
14 | import javax.imageio.stream.*;
15 | import java.awt.image.*;
16 | import java.io.*;
17 | import java.util.Iterator;
18 |
19 | public class GifSequenceWriter {
20 | protected ImageWriter gifWriter;
21 | protected ImageWriteParam imageWriteParam;
22 | protected IIOMetadata imageMetaData;
23 |
24 | /**
25 | * Creates a new GifSequenceWriter
26 | *
27 | * @param outputStream the ImageOutputStream to be written to
28 | * @param imageType one of the imageTypes specified in BufferedImage
29 | * @param timeBetweenFramesMS the time between frames in miliseconds
30 | * @param loopContinuously wether the gif should loop repeatedly
31 | * @throws IIOException if no gif ImageWriters are found
32 | *
33 | * @author Elliot Kroo (elliot[at]kroo[dot]net)
34 | */
35 | public GifSequenceWriter(
36 | ImageOutputStream outputStream,
37 | int imageType,
38 | int timeBetweenFramesMS,
39 | boolean loopContinuously) throws IIOException, IOException {
40 | // my method to create a writer
41 | gifWriter = getWriter();
42 | imageWriteParam = gifWriter.getDefaultWriteParam();
43 | ImageTypeSpecifier imageTypeSpecifier =
44 | ImageTypeSpecifier.createFromBufferedImageType(imageType);
45 |
46 | imageMetaData =
47 | gifWriter.getDefaultImageMetadata(imageTypeSpecifier,
48 | imageWriteParam);
49 |
50 | String metaFormatName = imageMetaData.getNativeMetadataFormatName();
51 |
52 | IIOMetadataNode root = (IIOMetadataNode)
53 | imageMetaData.getAsTree(metaFormatName);
54 |
55 | IIOMetadataNode graphicsControlExtensionNode = getNode(
56 | root,
57 | "GraphicControlExtension");
58 |
59 | graphicsControlExtensionNode.setAttribute("disposalMethod", "none");
60 | graphicsControlExtensionNode.setAttribute("userInputFlag", "FALSE");
61 | graphicsControlExtensionNode.setAttribute(
62 | "transparentColorFlag",
63 | "FALSE");
64 | graphicsControlExtensionNode.setAttribute(
65 | "delayTime",
66 | Integer.toString(timeBetweenFramesMS / 10));
67 | graphicsControlExtensionNode.setAttribute(
68 | "transparentColorIndex",
69 | "0");
70 |
71 | IIOMetadataNode commentsNode = getNode(root, "CommentExtensions");
72 | commentsNode.setAttribute("CommentExtension", "Created by MAH");
73 |
74 | IIOMetadataNode appEntensionsNode = getNode(
75 | root,
76 | "ApplicationExtensions");
77 |
78 | IIOMetadataNode child = new IIOMetadataNode("ApplicationExtension");
79 |
80 | child.setAttribute("applicationID", "NETSCAPE");
81 | child.setAttribute("authenticationCode", "2.0");
82 |
83 | int loop = loopContinuously ? 0 : 1;
84 |
85 | child.setUserObject(new byte[]{ 0x1, (byte) (loop & 0xFF), (byte)
86 | ((loop >> 8) & 0xFF)});
87 | appEntensionsNode.appendChild(child);
88 |
89 | imageMetaData.setFromTree(metaFormatName, root);
90 |
91 | gifWriter.setOutput(outputStream);
92 |
93 | gifWriter.prepareWriteSequence(null);
94 | }
95 |
96 | public void writeToSequence(RenderedImage img) throws IOException {
97 | gifWriter.writeToSequence(
98 | new IIOImage(
99 | img,
100 | null,
101 | imageMetaData),
102 | imageWriteParam);
103 | }
104 |
105 | /**
106 | * Close this GifSequenceWriter object. This does not close the underlying
107 | * stream, just finishes off the GIF.
108 | */
109 | public void close() throws IOException {
110 | gifWriter.endWriteSequence();
111 | }
112 |
113 | /**
114 | * Returns the first available GIF ImageWriter using
115 | * ImageIO.getImageWritersBySuffix("gif").
116 | *
117 | * @return a GIF ImageWriter object
118 | * @throws IIOException if no GIF image writers are returned
119 | */
120 | private static ImageWriter getWriter() throws IIOException {
121 | Iterator iter = ImageIO.getImageWritersBySuffix("gif");
122 | if(!iter.hasNext()) {
123 | throw new IIOException("No GIF Image Writers Exist");
124 | } else {
125 | return iter.next();
126 | }
127 | }
128 |
129 | /**
130 | * Returns an existing child node, or creates and returns a new child node (if
131 | * the requested node does not exist).
132 | *
133 | * @param rootNode the IIOMetadataNode to search for the child node.
134 | * @param nodeName the name of the child node.
135 | *
136 | * @return the child node, if found or a new node created with the given name.
137 | */
138 | private static IIOMetadataNode getNode(
139 | IIOMetadataNode rootNode,
140 | String nodeName) {
141 | int nNodes = rootNode.getLength();
142 | for (int i = 0; i < nNodes; i++) {
143 | if (rootNode.item(i).getNodeName().compareToIgnoreCase(nodeName)
144 | == 0) {
145 | return((IIOMetadataNode) rootNode.item(i));
146 | }
147 | }
148 | IIOMetadataNode node = new IIOMetadataNode(nodeName);
149 | rootNode.appendChild(node);
150 | return(node);
151 | }
152 |
153 | /**
154 | public GifSequenceWriter(
155 | BufferedOutputStream outputStream,
156 | int imageType,
157 | int timeBetweenFramesMS,
158 | boolean loopContinuously) {
159 |
160 | */
161 |
162 | public static void main(String[] args) throws Exception {
163 | if (args.length > 1) {
164 | // grab the output image type from the first image in the sequence
165 | BufferedImage firstImage = ImageIO.read(new File(args[0]));
166 |
167 | // create a new BufferedOutputStream with the last argument
168 | ImageOutputStream output =
169 | new FileImageOutputStream(new File(args[args.length - 1]));
170 |
171 | // create a gif sequence with the type of the first image, 1 second
172 | // between frames, which loops continuously
173 | GifSequenceWriter writer =
174 | new GifSequenceWriter(output, firstImage.getType(), 1, false);
175 |
176 | // write out the first image to our sequence...
177 | writer.writeToSequence(firstImage);
178 | for(int i=1; i _fromColours = new ArrayList<>();
66 |
67 | private static boolean _neverOpened = true;
68 |
69 | public void initialize(URL location, @NotNull ResourceBundle bundle)
70 | {
71 | resizeUsingNearestNeighbour(leftPane);
72 | resizeUsingNearestNeighbour(rightPane);
73 |
74 | lockPaneDivider();
75 | limitNameFieldLength();
76 |
77 | // Sets the default character and author names.
78 | nameLabel.setText(nameField.getText());
79 | authorField.setText(bundle.getString("PlayerSkin.Author"));
80 |
81 | initialiseErrorPane();
82 | hidePreviewPane();
83 |
84 | _bundle = bundle;
85 | }
86 |
87 | private void initialiseErrorPane()
88 | {
89 | errorLabel.setTextOverrun(OverrunStyle.LEADING_ELLIPSIS);
90 | errorPane.setVisible(false);
91 | }
92 |
93 | private void limitNameFieldLength()
94 | {
95 | Pattern pattern = Pattern.compile(".{0,16}");
96 | TextFormatter formatter = new TextFormatter<>(change -> pattern.matcher(change.getControlNewText()).matches() ? change : null);
97 | nameField.setTextFormatter(formatter);
98 | }
99 |
100 | private void lockPaneDivider()
101 | {
102 | SplitPane.Divider divider = splitPane.getDividers().get(0);
103 | double position = divider.getPosition();
104 | divider.positionProperty().addListener((observable, oldValue, newValue) -> divider.setPosition(position));
105 | }
106 |
107 | private void resizeUsingNearestNeighbour(@NotNull AnchorPane pane)
108 | {
109 | for (Node child : pane.getChildren())
110 | {
111 | if (child instanceof ImageView view)
112 | {
113 | Image newImage = new Image(view.getImage().getUrl(), view.getFitWidth(), view.getFitHeight(), true, false);
114 | view.setImage(newImage);
115 | }
116 | }
117 | }
118 |
119 | public void backToMenu(@NotNull ActionEvent e) throws IOException
120 | {
121 | Stage stage = (Stage)((Node)e.getSource()).getScene().getWindow();
122 |
123 | // Resolves the locale.
124 | ResourceBundle bundle = ResourceBundle.getBundle("mayaseii.wildsmoddingtool.strings", Application.locale);
125 |
126 | // Loads the scene.
127 | Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("main-menu.fxml")), bundle);
128 | Scene scene = new Scene(root);
129 |
130 | // Loads the CSS file to apply to the view.
131 | String css = Objects.requireNonNull(this.getClass().getResource("app.css")).toExternalForm();
132 | scene.getStylesheets().add(css);
133 |
134 | // Shows the stage.
135 | stage.setScene(scene);
136 | stage.show();
137 | }
138 |
139 | public void characterNameChanged(@NotNull InputEvent e)
140 | {
141 | // Updates the name label to reflect the new text.
142 | TextField textField = (TextField) e.getSource();
143 | nameLabel.setText(textField.getText());
144 | }
145 |
146 | public void uploadImage(@NotNull MouseEvent e)
147 | {
148 | ImageView imageView = (ImageView) e.getSource();
149 |
150 | File file = getFile();
151 | if (file == null) return; // Tests if image file is null.
152 |
153 | // Stores the chosen image.
154 | Image image = new Image(file.toURI().toString());
155 | boolean isSheet = isSpriteSheet(imageView, image);
156 | @NonNls String spriteType = imageView.getId().split("-")[0]; // E.g., walking, running.
157 |
158 | if (!isSheet && !imageFitsView(imageView, image)) displayDimensionsErrorPopup(imageView, spriteType);
159 | else showUploadedImage(imageView, file, image, isSheet, spriteType);
160 | }
161 |
162 | private void showUploadedImage(ImageView imageView, File file, Image image, boolean isSheet, String spriteType)
163 | {
164 | if (!isSheet) displayIndividualSprite(imageView, file);
165 | else displaySpriteSheet(file, image, spriteType);
166 | }
167 |
168 | private void displayDimensionsErrorPopup(ImageView imageView, String spriteType)
169 | {
170 | Vector2 dimensions = getSpriteSheetDimensions(spriteType);
171 | String popupText = getDimensionsErrorText(imageView, (int) dimensions.x, (int) dimensions.y);
172 |
173 | displayInfoPopup(popupText);
174 | }
175 |
176 | private void displaySpriteSheet(@NotNull File file, Image image, @NonNls String spriteType)
177 | {
178 | // Resizes the image.
179 | image = new Image(file.toURI().toString(), image.getWidth() * 2, image.getHeight() * 2, true, false);
180 |
181 | // Prepares the counter.
182 | int x = 0;
183 |
184 | // Loops through all image view nodes.
185 | for (Node child : rightPane.getChildren())
186 | {
187 | // Checks if the image view has a relevant ID.
188 | if (child instanceof ImageView view && view.getId() != null && view.getId().contains(spriteType))
189 | {
190 | // Crops the image accordingly.
191 | WritableImage newImage = cropImage(image, x, view);
192 |
193 | // Sets the image for each view.
194 | view.setImage(newImage);
195 | view.setOpacity(1);
196 |
197 | // Displays the image on the corresponding file-name image view.
198 | ImageView fileView = (ImageView) view.getScene().lookup('#' + view.getId() + "-1");
199 | fileView.setImage(newImage);
200 | fileView.setOpacity(1);
201 |
202 | // Increases the X coordinate for the next sprite.
203 | x += view.getFitWidth();
204 | }
205 | }
206 | }
207 |
208 | private @NotNull WritableImage cropImage(@NotNull Image image, int x, @NotNull ImageView view)
209 | {
210 | PixelReader reader = image.getPixelReader();
211 | return new WritableImage(reader, x, (int) (image.getHeight() - view.getFitHeight()), (int) view.getFitWidth(), (int) view.getFitHeight());
212 | }
213 |
214 | private void displayIndividualSprite(@NotNull ImageView imageView, @NotNull File file)
215 | {
216 | // Resizes the image.
217 | Image image = new Image(file.toURI().toString(), imageView.getFitWidth(), imageView.getFitHeight(), true, false);
218 |
219 | // Displays the image on the image view.
220 | imageView.setImage(image);
221 | imageView.setOpacity(1);
222 |
223 | // Displays the image on the corresponding file-name image view.
224 | ImageView fileView = (ImageView) imageView.getScene().lookup('#' + imageView.getId() + "-1");
225 | if (fileView == null) return;
226 |
227 | fileView.setImage(image);
228 | fileView.setOpacity(1);
229 | }
230 |
231 | private boolean imageFitsView(@NotNull ImageView imageView, @NotNull Image image)
232 | {
233 | return image.getWidth() == imageView.getFitWidth() / 2 && image.getHeight() == imageView.getFitHeight() / 2;
234 | }
235 |
236 | private Vector2 getSpriteSheetDimensions(@NonNls String spriteType)
237 | {
238 | Vector2 dimensions = Vector2.Zero;
239 |
240 | // Gets the sprite sheet dimensions.
241 | for (Node child : rightPane.getChildren())
242 | {
243 | if (child instanceof ImageView view && view.getId() != null && view.getId().contains(spriteType))
244 | {
245 | dimensions.x += view.getFitWidth() / 2;
246 | if (dimensions.y == 0) dimensions.y = view.getFitHeight() / 2;
247 | }
248 | }
249 | return dimensions;
250 | }
251 |
252 | private @NonNls @NotNull String getDimensionsErrorText(@NotNull ImageView imageView, int width, int height)
253 | {
254 | @NonNls String popupText = _bundle.getString("PlayerSkin.IncorrectDimensions") + " ";
255 | popupText += (int)(imageView.getFitWidth() / 2) + "x" + (int)(imageView.getFitHeight() / 2) + "px";
256 | popupText += " (" + _bundle.getString("PlayerSkin.Sprite") + ") ";
257 | popupText += _bundle.getString("PlayerSkin.Or") + " " + width + "x" + height + "px (" + _bundle.getString("PlayerSkin.SpriteSheet") + ").";
258 | return popupText;
259 | }
260 |
261 | private void displayInfoPopup(@NonNls String popupText)
262 | {
263 | errorLabel.setText(popupText);
264 | errorPane.setVisible(true);
265 | }
266 |
267 | private boolean isSpriteSheet(@NotNull ImageView imageView, Image image)
268 | {
269 | boolean isSheet = imageView.getId().contains("walking") && image.getWidth() == 128 && image.getHeight() == 16;
270 | isSheet |= imageView.getId().contains("running") && image.getWidth() == 128 && image.getHeight() == 16;
271 | isSheet |= imageView.getId().contains("sitting") && image.getWidth() == 48 && image.getHeight() == 16;
272 | isSheet |= imageView.getId().contains("fishing") && image.getWidth() == 56 && image.getHeight() == 24;
273 | return isSheet;
274 | }
275 |
276 | private File getFile()
277 | {
278 | FileChooser fileChooser = new FileChooser();
279 | FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.PNG)", "*.PNG");
280 | FileChooser.ExtensionFilter extFilterpng = new FileChooser.ExtensionFilter("png files (*.png)", "*.png");
281 | fileChooser.getExtensionFilters().addAll(extFilterPNG, extFilterpng);
282 |
283 | // Opens the file chooser.
284 | return fileChooser.showOpenDialog(null);
285 | }
286 |
287 | public void closePopup()
288 | {
289 | // Hides the error popup.
290 | errorPane.setVisible(false);
291 | }
292 |
293 | public void downloadTemplate() throws IOException
294 | {
295 | String selectedDirPath = getUserChosenDirectory("PlayerSkin.SaveTemplate");
296 | if (selectedDirPath == null) return;
297 |
298 | Path to = Paths.get(selectedDirPath + "/Wilds_PlayerSkinTemplate.zip");
299 | InputStream from = getClass().getResourceAsStream("misc/Wilds_PlayerSkinTemplate.zip");
300 |
301 | Files.copy(Objects.requireNonNull(from), to, StandardCopyOption.REPLACE_EXISTING);
302 |
303 | displayTemplateSuccessPopup(selectedDirPath);
304 | }
305 |
306 | private @NonNls void displayTemplateSuccessPopup(@NotNull String selectedDirPath)
307 | {
308 | @NonNls String popupText = _bundle.getString("PlayerSkin.TemplateDownloadedTo") + "\n";
309 | popupText += selectedDirPath.replace('\\', '/');
310 |
311 | displayInfoPopup(popupText);
312 | }
313 |
314 | private @Nullable String getUserChosenDirectory(String key)
315 | {
316 | // Creates a directory choose for the download folder.
317 | DirectoryChooser dirChooser = new DirectoryChooser();
318 | dirChooser.setTitle(_bundle.getString(key));
319 |
320 | // Gets the absolute path for the directory chosen.
321 | File selectedDir = dirChooser.showDialog(null);
322 | return selectedDir == null ? null : selectedDir.getAbsolutePath();
323 | }
324 |
325 | public void downloadMod() throws IOException
326 | {
327 | String charName = nameField.getText().trim();
328 | String authorName = authorField.getText().trim();
329 |
330 | if (charName.isBlank())
331 | {
332 | displayInfoPopup(String.format(_bundle.getString("PlayerSkin.MustNotBeEmpty"), _bundle.getString("PlayerSkin.CharacterName").toLowerCase()));
333 | return;
334 | }
335 | else if (authorName.isBlank())
336 | {
337 | displayInfoPopup(String.format(_bundle.getString("PlayerSkin.MustNotBeEmpty"), _bundle.getString("PlayerSkin.ModAuthor").toLowerCase()));
338 | return;
339 | }
340 |
341 | BufferedImage[] wSprites = new BufferedImage[8];
342 | BufferedImage[] rSprites = new BufferedImage[8];
343 | BufferedImage[] sSprites = new BufferedImage[3];
344 | BufferedImage[] fSprites = new BufferedImage[3];
345 |
346 | loadSpritesIntoArrays(wSprites, rSprites, sSprites, fSprites);
347 |
348 | // Concatenates all sprite arrays.
349 | BufferedImage walkingSprite = concatenateImages(wSprites);
350 | BufferedImage runningSprite = concatenateImages(rSprites);
351 | BufferedImage sittingSprite = concatenateImages(sSprites);
352 | BufferedImage fishingSprite = concatenateImages(fSprites);
353 |
354 | // Gets individual sprites.
355 | BufferedImage sleepingSprite = getSingularSprite(sleepingView);
356 | BufferedImage frontSprite = getSingularSprite(frontView);
357 | BufferedImage backSprite = getSingularSprite(backView);
358 |
359 | // Creates a directory choose for the download folder.
360 | String selectedDirPath = getUserChosenDirectory("PlayerSkin.SaveMod");
361 | if (selectedDirPath == null) return;
362 |
363 | // Creates the zip folder.
364 | File zip = new File(selectedDirPath + "/Wilds_PlayerSkin_" + nameField.getText() + ".zip");
365 | ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zip));
366 |
367 | // Adds all sprites to the zip folder.
368 | addSpriteToZip("walking.png", walkingSprite, outputStream);
369 | addSpriteToZip("running.png", runningSprite, outputStream);
370 | addSpriteToZip("sitting.png", sittingSprite, outputStream);
371 | addSpriteToZip("fishing.png", fishingSprite, outputStream);
372 | addSpriteToZip("front.png", frontSprite, outputStream);
373 | addSpriteToZip("back.png", backSprite, outputStream);
374 | addSpriteToZip("sleepingbag.png", sleepingSprite, outputStream);
375 |
376 | addCreditsFileToZip(outputStream);
377 | addPaletteFileToZip(outputStream);
378 |
379 | outputStream.close();
380 |
381 | displayModDownloadSuccessPopup(selectedDirPath);
382 | }
383 |
384 | private void displayModDownloadSuccessPopup(@NotNull String selectedDirPath)
385 | {
386 | // Creates the text for the success popup.
387 | @NonNls String popupText = _bundle.getString("PlayerSkin.ModCreatedIn") + "\n";
388 | popupText += selectedDirPath.replace('\\', '/');
389 |
390 | // Displays the success popup.
391 | displayInfoPopup(popupText);
392 | }
393 |
394 | private void addCreditsFileToZip(@NotNull ZipOutputStream outputStream) throws IOException
395 | {
396 | // Gets the bytes needed for the credits file.
397 | byte @NonNls [] data = ("Mod created by " + authorField.getText() + ".\nDo not remove this file from the mod folder.").getBytes();
398 |
399 | // Creates and saves the credits file.
400 | ZipEntry entry = new ZipEntry("credits.txt");
401 | outputStream.putNextEntry(entry);
402 | outputStream.write(data, 0, data.length);
403 | outputStream.closeEntry();
404 | }
405 |
406 | private void addPaletteFileToZip(@NotNull @NonNls ZipOutputStream outputStream) throws IOException
407 | {
408 | // Ignores this file if no colours were chosen.
409 | if (_fromColours.size() == 0) return;
410 |
411 | // Gets the bytes needed for the palette file.
412 | @NonNls StringBuilder toConvert = new StringBuilder();
413 | for (java.awt.Color colour : _fromColours) toConvert.append("\tRGB ").append(colour.getRed()).append(", ").append(colour.getGreen()).append(", ").append(colour.getBlue()).append("\n");
414 | byte @NonNls [] data = toConvert.toString().getBytes();
415 |
416 | // Creates and saves the palette file.
417 | ZipEntry entry = new ZipEntry("var.pal");
418 | outputStream.putNextEntry(entry);
419 | outputStream.write(data, 0, data.length);
420 | outputStream.closeEntry();
421 | }
422 |
423 | private void addSpriteToZip(String name, BufferedImage walkingSprite, @NotNull ZipOutputStream outputStream) throws IOException
424 | {
425 | ZipEntry entry = new ZipEntry(name);
426 | outputStream.putNextEntry(entry);
427 | ImageIO.write(walkingSprite, "png", outputStream);
428 | outputStream.closeEntry();
429 | }
430 |
431 | private BufferedImage getSingularSprite(@NotNull ImageView view)
432 | {
433 | Image baseImage = view.getImage();
434 | Image smallImage = scale(baseImage, (int) (baseImage.getWidth() / 2), (int) (baseImage.getHeight() / 2));
435 | return SwingFXUtils.fromFXImage(smallImage, null);
436 | }
437 |
438 | private void loadSpritesIntoArrays(BufferedImage[] w, BufferedImage[] r, BufferedImage[] s, BufferedImage[] f)
439 | {
440 | int cWalking = 0;
441 | int cRunning = 0;
442 | int cSitting = 0;
443 | int cFishing = 0;
444 |
445 | for (Node child : rightPane.getChildren())
446 | {
447 | // Checks if the image view has a relevant ID.
448 | if (child instanceof ImageView view && view.getId() != null)
449 | {
450 | Image baseImage = view.getImage();
451 | Image smallImage = scale(baseImage, (int) (baseImage.getWidth() / 2), (int) (baseImage.getHeight() / 2));
452 |
453 | if (view.getId().contains("walking"))
454 | {
455 | w[cWalking] = SwingFXUtils.fromFXImage(smallImage, null);
456 | cWalking++;
457 | }
458 | else if (view.getId().contains("running"))
459 | {
460 | r[cRunning] = SwingFXUtils.fromFXImage(smallImage, null);
461 | cRunning++;
462 | }
463 | else if (view.getId().contains("sitting"))
464 | {
465 | s[cSitting] = SwingFXUtils.fromFXImage(smallImage, null);
466 | cSitting++;
467 | }
468 | else if (view.getId().contains("fishing"))
469 | {
470 | f[cFishing] = SwingFXUtils.fromFXImage(smallImage, null);
471 | cFishing++;
472 | }
473 | }
474 | }
475 | }
476 |
477 | private @NotNull BufferedImage concatenateImages(BufferedImage @NotNull [] imageSet)
478 | {
479 | int widthTotal = 0;
480 | for (BufferedImage image : imageSet) widthTotal += image.getWidth();
481 |
482 | int widthCurr = 0;
483 | BufferedImage concatImage = new BufferedImage(widthTotal, imageSet[0].getHeight(), BufferedImage.TYPE_INT_ARGB);
484 | Graphics2D g2d = concatImage.createGraphics();
485 |
486 | // Adds the images together.
487 | for (BufferedImage image : imageSet)
488 | {
489 | g2d.drawImage(image, widthCurr, concatImage.getHeight() - image.getHeight(), null);
490 | widthCurr += image.getWidth();
491 | }
492 |
493 | g2d.dispose();
494 |
495 | return concatImage;
496 | }
497 |
498 | private Image scale(Image source, int targetWidth, int targetHeight)
499 | {
500 | ImageView imageView = new ImageView(source);
501 | imageView.setPreserveRatio(true);
502 | imageView.setFitWidth(targetWidth);
503 | imageView.setFitHeight(targetHeight);
504 |
505 | SnapshotParameters parameters = new SnapshotParameters();
506 | parameters.setFill(Color.TRANSPARENT);
507 |
508 | return imageView.snapshot(parameters, null);
509 | }
510 |
511 | public void showPreviewPane() throws Exception
512 | {
513 | if (_neverOpened)
514 | {
515 | createPreviewGIFs();
516 | loadGIFsIntoViews();
517 | changePNGPaneColour();
518 |
519 | Map colourMap = getSpriteColourMap();
520 | createPalettePanel(colourMap);
521 |
522 | _neverOpened = false;
523 | }
524 |
525 | previewPane.setVisible(true);
526 | }
527 |
528 | private void createPalettePanel(@NotNull Map colourMap)
529 | {
530 | int x = (int) originPane.getLayoutX() + 8;
531 | int y = (int) originPane.getLayoutY() + 10;
532 |
533 | int i = 0;
534 |
535 | boolean switchY = true;
536 |
537 | for (Integer colour : colourMap.keySet())
538 | {
539 | Rectangle palettePane = new Rectangle();
540 |
541 | palettePane.setWidth(32);
542 | palettePane.setHeight(32);
543 | palettePane.setLayoutX(x);
544 | palettePane.setLayoutY(y);
545 |
546 | palettePane.getStyleClass().add("colour-pane");
547 |
548 | Color newColor = Color.valueOf(String.format("#%06X", (0xFFFFFF & colour)));
549 | palettePane.setFill(newColor);
550 |
551 | // Adds the mouse click event handler.
552 | EventHandler eventHandler = this::palettePanelClicked;
553 | palettePane.addEventHandler(MouseEvent.MOUSE_CLICKED, eventHandler);
554 |
555 | colourGroup.getChildren().add(palettePane);
556 |
557 | if (switchY)
558 | {
559 | y += 32;
560 | switchY = false;
561 | }
562 | else
563 | {
564 | y -= 32;
565 | x += 32;
566 | switchY = true;
567 | }
568 |
569 | i++;
570 | if (i >= 14) break;
571 | }
572 |
573 | for (int j = i; j < 14; j++)
574 | {
575 | Rectangle palettePane = new Rectangle();
576 |
577 | palettePane.setWidth(32);
578 | palettePane.setHeight(32);
579 | palettePane.setLayoutX(x);
580 | palettePane.setLayoutY(y);
581 |
582 | // Default panes.
583 | palettePane.getStyleClass().add("colour-pane");
584 | palettePane.setFill(Color.BLACK);
585 |
586 | // Adds the mouse click event handler.
587 | EventHandler eventHandler = this::palettePanelClicked;
588 | palettePane.addEventHandler(MouseEvent.MOUSE_CLICKED, eventHandler);
589 |
590 | colourGroup.getChildren().add(palettePane);
591 |
592 | if (switchY)
593 | {
594 | y += 32;
595 | switchY = false;
596 | }
597 | else
598 | {
599 | y -= 32;
600 | x += 32;
601 | switchY = true;
602 | }
603 | }
604 | }
605 |
606 | private void loadGIFsIntoViews()
607 | {
608 | for (Node node : previewPane.getChildren())
609 | {
610 | if (node instanceof ImageView view && view.getId() != null && !view.getId().contains("-2"))
611 | {
612 | File imageFile = new File(view.getId() + ".gif");
613 | Image image = new Image(imageFile.toURI().toString());
614 |
615 | if (!imageFile.delete()) System.out.println("Couldn't delete file.");
616 |
617 | view.setImage(image);
618 | }
619 | }
620 | }
621 |
622 | private @NotNull Map getSpriteColourMap()
623 | {
624 | Map colourMap = new HashMap<>();
625 |
626 | // Adds all pixel colours to the colour map.
627 | for (Node node: rightPane.getChildren())
628 | {
629 | if (node instanceof ImageView view && view.getId() != null && view.getImage() != null)
630 | {
631 | int[] data = ( (DataBufferInt) SwingFXUtils.fromFXImage(view.getImage(), null).getRaster().getDataBuffer() ).getData();
632 | for (int datum : data) putColourInMap(colourMap, datum);
633 | }
634 | }
635 |
636 | return colourMap;
637 | }
638 |
639 | private void putColourInMap(@NotNull Map colourMap, int datum)
640 | {
641 | int rgba = new java.awt.Color(datum).getRGB();
642 |
643 | Integer colourCount = colourMap.get(rgba);
644 | colourCount = colourCount == null ? 1 : colourCount + 1;
645 | colourMap.put(rgba, colourCount);
646 | }
647 |
648 | private void createPreviewGIFs() throws Exception
649 | {
650 | int delay = 200;
651 | int runDelay = (int) (delay / 1.5);
652 |
653 | int[] delays = new int[] { delay, delay, delay, delay };
654 | int[] runDelays = new int[] { runDelay, runDelay, runDelay, runDelay };
655 |
656 | // Walking GIFs.
657 | createDirectionGIF(delays, "walking", "front", "anim-walk-front.gif", true);
658 | createDirectionGIF(delays, "walking", "back", "anim-walk-back.gif", true);
659 | createDirectionGIF(delays, "walking", "left", "anim-walk-left.gif", false);
660 | createDirectionGIF(delays, "walking", "right", "anim-walk-right.gif", false);
661 |
662 | // Running GIFs.
663 | createDirectionGIF(runDelays, "running", "front", "anim-run-front.gif", true);
664 | createDirectionGIF(runDelays, "running", "back", "anim-run-back.gif", true);
665 | createDirectionGIF(runDelays, "running", "left", "anim-run-left.gif", false);
666 | createDirectionGIF(runDelays, "running", "right", "anim-run-right.gif", false);
667 | }
668 |
669 | private @NonNls void createDirectionGIF(int[] delays, String action, String direction, String file, boolean mirror) throws Exception
670 | {
671 | BufferedImage[] sprites = new BufferedImage[mirror ? 4 : 2];
672 | populateSpriteArray(action, direction, mirror, sprites);
673 |
674 | AnimatedGIFWriter writer = new AnimatedGIFWriter(true);
675 | OutputStream os = new FileOutputStream(file);
676 |
677 | writer.writeAnimatedGIF(sprites, delays, os);
678 | }
679 |
680 | private void populateSpriteArray(String action, String direction, boolean mirror, BufferedImage[] sprites)
681 | {
682 | int i = 0;
683 |
684 | for (Node node : rightPane.getChildren())
685 | {
686 | if (node instanceof ImageView view && view.getId() != null && view.getId().contains(action) && view.getId().contains(direction))
687 | {
688 | BufferedImage sprite = SwingFXUtils.fromFXImage(view.getImage(), null);
689 |
690 | sprites[i] = sprite;
691 |
692 | if (mirror)
693 | {
694 | sprite = mirrorImage(sprite);
695 | sprites[i + 2] = sprite;
696 | }
697 |
698 | i++;
699 | }
700 | }
701 | }
702 |
703 | private BufferedImage mirrorImage(@NotNull BufferedImage img)
704 | {
705 | AffineTransform tx = AffineTransform.getScaleInstance(-1, 1);
706 | tx.translate(-img.getWidth(), 0);
707 |
708 | AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
709 |
710 | return op.filter(img, null);
711 | }
712 |
713 | public void palettePanelClicked(@NotNull MouseEvent e)
714 | {
715 | Rectangle button = (Rectangle) e.getSource();
716 | _fromColours.add(fxToAWTColor((Color) button.getFill()));
717 |
718 | createColourSelector(new Vector2((int) button.getLayoutX(), (int) button.getLayoutY()), fxToAWTColor((Color) button.getFill()));
719 |
720 | changeColour();
721 | }
722 |
723 | private void createColourSelector(@NotNull Vector2 position, java.awt.@NotNull Color colour)
724 | {
725 | ImageView view = new ImageView();
726 | view.setImage(new Image(Objects.requireNonNull(getClass().getResourceAsStream("img/player-skin/frame-selection.png"))));
727 |
728 | view.setLayoutX(position.x);
729 | view.setLayoutY(position.y);
730 |
731 | view.setId(String.valueOf(colour.getRGB()));
732 | view.getStyleClass().add("colour-pane");
733 |
734 | EventHandler eventHandler = this::removeFromSelectedColours;
735 | view.setOnMouseClicked(eventHandler);
736 |
737 | colourGroup.getChildren().add(view);
738 |
739 | view.toFront();
740 | }
741 |
742 | private void removeFromSelectedColours(@NotNull MouseEvent e)
743 | {
744 | ImageView view = (ImageView) e.getSource();
745 | int code = Integer.parseInt(view.getId());
746 | java.awt.Color toRemove = new java.awt.Color(code);
747 |
748 | _fromColours.remove(toRemove);
749 | colourGroup.getChildren().remove(view);
750 |
751 | changeColour();
752 | }
753 |
754 | private void changeColour()
755 | {
756 | ArrayList originalImages = changeTemporaryPaneColour(_toColour);
757 |
758 | try
759 | {
760 | changePNGPaneColour();
761 | createPreviewGIFs();
762 | loadGIFsIntoViews();
763 | }
764 | catch (Exception ex)
765 | {
766 | throw new RuntimeException(ex);
767 | }
768 | finally
769 | {
770 | revertTemporaryChanges(originalImages);
771 | }
772 | }
773 |
774 | private void changePNGPaneColour()
775 | {
776 | for (Node node : previewPane.getChildren())
777 | {
778 | if (node instanceof ImageView view && view.getId() != null && view.getId().contains("-2") && !view.getId().contains("pane"))
779 | {
780 | view.setImage(((ImageView) rightPane.lookup("#" + view.getId().replace("-2", ""))).getImage());
781 | }
782 | }
783 | }
784 |
785 | private @NotNull ArrayList changeTemporaryPaneColour(java.awt.Color to)
786 | {
787 | ArrayList oldImageList = new ArrayList<>();
788 |
789 | for (Node node : rightPane.getChildren())
790 | {
791 | if (node instanceof ImageView view && view.getId() != null)
792 | {
793 | Image oldImage = view.getImage();
794 | oldImageList.add(oldImage);
795 |
796 | BufferedImage convertedImage = SwingFXUtils.fromFXImage(oldImage, null);
797 |
798 | for (java.awt.Color fromColour : _fromColours)
799 | {
800 | BufferedImageOp lookup = new LookupOp(new ColorMapper(fromColour, to), null);
801 | convertedImage = lookup.filter(convertedImage, null);
802 | }
803 |
804 | if (convertedImage != null) view.setImage(SwingFXUtils.toFXImage(convertedImage, null));
805 | }
806 | }
807 |
808 | return oldImageList;
809 | }
810 |
811 | private void revertTemporaryChanges(ArrayList originalImages)
812 | {
813 | for (Node node : rightPane.getChildren())
814 | {
815 | if (node instanceof ImageView view && view.getId() != null)
816 | {
817 | view.setImage(originalImages.get(0));
818 | originalImages.remove(0);
819 | }
820 | }
821 | }
822 |
823 | public void setReplacementColour(@NotNull MouseEvent e)
824 | {
825 | Rectangle colourRect = (Rectangle) e.getSource();
826 | Color fxColour = (Color) colourRect.getFill();
827 |
828 | toPicker.setLayoutX(colourRect.getLayoutX());
829 | toPicker.setLayoutY(colourRect.getLayoutY());
830 |
831 | _toColour = new java.awt.Color((float) fxColour.getRed(), (float) fxColour.getGreen(), (float) fxColour.getBlue(), (float) fxColour.getOpacity());
832 |
833 | if (_fromColours.size() == 0) return;
834 | changeColour();
835 | }
836 |
837 | public void hidePreviewPane()
838 | {
839 | previewPane.setVisible(false);
840 | }
841 |
842 | @Contract("_ -> new")
843 | private java.awt.@NotNull Color fxToAWTColor(@NotNull Color fxColour)
844 | {
845 | return new java.awt.Color((float) fxColour.getRed(), (float) fxColour.getGreen(), (float) fxColour.getBlue(), (float) fxColour.getOpacity());
846 | }
847 | }
--------------------------------------------------------------------------------
/src/main/java/mayaseii/wildsmoddingtool/Vector2.java:
--------------------------------------------------------------------------------
1 | package mayaseii.wildsmoddingtool;
2 |
3 | public class Vector2
4 | {
5 | public final static Vector2 Zero = new Vector2();
6 |
7 | public double x;
8 |
9 | public double y;
10 |
11 | public Vector2()
12 | {
13 | this.x = 0;
14 | this.y = 0;
15 | }
16 |
17 | public Vector2(int x, int y)
18 | {
19 | this.x = x;
20 | this.y = y;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/module-info.java:
--------------------------------------------------------------------------------
1 | module mayaseii.wildsmoddingtool {
2 | requires javafx.controls;
3 | requires javafx.fxml;
4 | requires javafx.media;
5 | requires javafx.web;
6 | requires javafx.swing;
7 |
8 | requires org.controlsfx.controls;
9 | requires com.dlsc.formsfx;
10 | requires validatorfx;
11 | requires org.kordamp.ikonli.javafx;
12 | requires org.kordamp.bootstrapfx.core;
13 | requires eu.hansolo.tilesfx;
14 | requires java.datatransfer;
15 | requires java.desktop;
16 | requires org.jetbrains.annotations;
17 |
18 | opens mayaseii.wildsmoddingtool to javafx.fxml;
19 | exports mayaseii.wildsmoddingtool;
20 | }
--------------------------------------------------------------------------------
/src/main/resources/META-INF/MANIFEST.MF:
--------------------------------------------------------------------------------
1 | Manifest-Version: 1.0
2 | Main-Class: mayaseii.wildsmoddingtool.App
3 |
4 |
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/PokeWilds-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/PokeWilds-Regular.ttf
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/app.css:
--------------------------------------------------------------------------------
1 | .root {
2 |
3 | -fx-font-family: "PokeWilds";
4 | -fx-font-size: 16px;
5 |
6 | }
7 |
8 | .label {
9 |
10 | -fx-font-family: "PokeWilds";
11 | -fx-text-fill: black;
12 |
13 | }
14 |
15 | .button {
16 |
17 | -fx-padding: 0 28px;
18 | -fx-background-color: transparent;
19 | -fx-background-image: url("img/buttonBG.png");
20 | -fx-border: 0px;
21 | -fx-text-fill: black;
22 |
23 | }
24 |
25 | .button:hover {
26 |
27 | -fx-background-color: #a8a8c8;
28 | -fx-cursor: hand;
29 |
30 | }
31 |
32 | #container {
33 |
34 | -fx-background-image: url("img/background.png");
35 |
36 | }
37 |
38 | #seii-span {
39 |
40 | -fx-font-size: 16px;
41 | -fx-font-family: "PokeWilds";
42 | -fx-text-fill: #f83808;
43 | -fx-cursor: hand;
44 |
45 | }
46 |
47 | .hyperlink {
48 | -fx-border-color: transparent;
49 | }
50 |
51 | #btn-pokemon {
52 | -fx-alignment: center-right;
53 | -fx-background-image: url("img/buttonPokemonBG.png");
54 | }
55 |
56 | #btn-texture {
57 | -fx-alignment: center-right;
58 | -fx-background-image: url("img/buttonTextureBG.png");
59 | }
60 |
61 | #btn-resource {
62 | -fx-alignment: center-right;
63 | -fx-background-image: url("img/buttonResourceBG.png");
64 | }
65 |
66 | #btn-biome {
67 | -fx-alignment: center-left;
68 | -fx-background-image: url("img/buttonBiomeBG.png");
69 | }
70 |
71 | #btn-music {
72 | -fx-alignment: center-left;
73 | -fx-background-image: url("img/buttonMusicBG.png");
74 | }
75 |
76 | #btn-skin {
77 | -fx-alignment: center-left;
78 | -fx-background-image: url("img/buttonPlayerBG.png");
79 | }
80 |
81 | #volume:hover {
82 | -fx-cursor: hand;
83 | }
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/audio/BG_AzaleaTown.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/audio/BG_AzaleaTown.mp3
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/audio/BG_AzaleaTown.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/audio/BG_AzaleaTown.wav
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/audio/BG_VioletCity.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/audio/BG_VioletCity.wav
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/audio/click.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/audio/click.wav
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/background.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/buttonBG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/buttonBG.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/buttonBiomeBG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/buttonBiomeBG.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/buttonMusicBG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/buttonMusicBG.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/buttonPlayerBG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/buttonPlayerBG.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/buttonPokemonBG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/buttonPokemonBG.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/buttonResourceBG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/buttonResourceBG.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/buttonTextureBG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/buttonTextureBG.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/noVolume.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/noVolume.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/back.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/fishing-back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/fishing-back.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/fishing-front.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/fishing-front.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/fishing-side.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/fishing-side.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-colours.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-colours.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-error.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-error.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-large.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-long.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-long.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-medium-long.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-medium-long.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-medium.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-selection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-selection.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-short.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-short.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-xlarge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame-xlarge.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/frame.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/front.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/front.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/generate-btn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/generate-btn.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/idle-back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/idle-back.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/idle-front.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/idle-front.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/idle-left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/idle-left.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/idle-right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/idle-right.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/name-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/name-bg.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/preview-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/preview-bg.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/preview-btn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/preview-btn.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-back.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-front.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-front.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-idle-back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-idle-back.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-idle-front.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-idle-front.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-idle-left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-idle-left.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-idle-right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-idle-right.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-left.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/run-right.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/sitting-back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/sitting-back.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/sitting-front.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/sitting-front.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/sitting-side.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/sitting-side.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/sleeping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/sleeping.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/walk-back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/walk-back.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/walk-front.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/walk-front.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/walk-left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/walk-left.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/walk-right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/player-skin/walk-right.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/toolbarBG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/toolbarBG.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/img/volume.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/img/volume.png
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/main-menu.fxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
34 |
39 |
40 |
41 |
42 |
43 |
44 |
56 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/misc/Wilds_PlayerSkinTemplate.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/misc/Wilds_PlayerSkinTemplate.zip
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/player-skin.css:
--------------------------------------------------------------------------------
1 | .root {
2 |
3 | -fx-font-family: "PokeWilds";
4 | -fx-font-size: 16px;
5 |
6 | }
7 |
8 | .label {
9 |
10 | -fx-font-family: "PokeWilds";
11 | -fx-text-fill: black;
12 |
13 | }
14 |
15 | .view-clickable, .colour-pane {
16 |
17 | -fx-cursor: hand;
18 |
19 | }
20 |
21 | #dimensions-dialog, #preview-pane {
22 |
23 | -fx-background-color: rgba(0, 0, 0, 0.5);
24 | -fx-z-index: 15;
25 |
26 | }
27 |
28 | .split-pane-divider {
29 |
30 | -fx-cursor: default;
31 |
32 | }
33 |
34 | .text-field {
35 |
36 | -fx-font-family: "PokeWilds";
37 | -fx-font-size: 16px;
38 |
39 | -fx-border-style: hidden hidden solid hidden;
40 | -fx-border-width: 2;
41 | -fx-border-color: rgba(0, 0, 0, 0.5);
42 | -fx-text-fill: rgba(0, 0, 0, 0.8);
43 | -fx-padding: 0 0 2px -3px;
44 | -fx-background-color: transparent;
45 |
46 | }
47 |
48 | .tool-bar {
49 |
50 | -fx-background-color: black;
51 | }
52 |
53 | .split-pane > .split-pane-divider {
54 | -fx-padding: 0;
55 | }
56 |
57 | #back-button, #template-button {
58 |
59 | -fx-text-fill: white;
60 | -fx-border: 0px;
61 | -fx-background-color: transparent;
62 | -fx-cursor: hand;
63 |
64 | }
65 |
66 | #template-button {
67 |
68 | -fx-border-style: hidden hidden hidden solid;
69 | -fx-border-width: 1px;
70 | -fx-border-color: white;
71 | -fx-padding: 0px 0px 0px 15px;
72 |
73 | }
74 |
75 | #section-title {
76 |
77 | -fx-text-fill: white;
78 |
79 | }
80 |
81 | #right-pane {
82 |
83 | -fx-background-image: url("img/toolbarBG.png");
84 |
85 | }
86 |
87 | #label-name {
88 |
89 | -fx-text-fill: white;
90 | -fx-alignment: center;
91 |
92 | }
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/player-skin.fxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
116 |
121 |
126 |
127 |
128 |
129 |
134 |
135 |
136 |
137 |
138 |
139 |
144 |
149 |
154 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
296 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
330 |
335 |
340 |
341 |
342 |
343 |
344 |
345 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
406 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
435 |
436 |
437 |
439 |
440 |
441 |
443 |
444 |
445 |
447 |
448 |
449 |
451 |
452 |
453 |
455 |
456 |
457 |
462 |
467 |
472 |
474 |
475 |
476 |
481 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
497 |
502 |
507 |
509 |
510 |
511 |
512 |
513 |
514 |
515 |
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/strings.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/strings.properties
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/strings_es.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/strings_es.properties
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/strings_fr.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/strings_fr.properties
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/strings_jp.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/strings_jp.properties
--------------------------------------------------------------------------------
/src/main/resources/mayaseii/wildsmoddingtool/strings_pt.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MayaSeii/wilds-modding-tool/54922e0db38d2ee582651ecb08b4f2cfc1ad0617/src/main/resources/mayaseii/wildsmoddingtool/strings_pt.properties
--------------------------------------------------------------------------------