GameBoy (Color) port of the GTA San Andreas arcade game Duality
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

gen_angles.py 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #!/usr/bin/env python3
  2. import sys
  3. import os
  4. import math
  5. import argparse
  6. sGBDK = """//AUTOGENERATED FILE FROM {:s}
  7. #include <stdint.h>
  8. #include <gbdk/platform.h>
  9. #include "{:s}.h"
  10. BANKREF({:s})
  11. const {:s} {:s}[{:s}_SIZE] = {{
  12. {:s}}};
  13. """
  14. hGBDK = """//AUTOGENERATED FILE FROM {:s}
  15. #ifndef GEN_CONST_ANGLES_{:s}_H
  16. #define GEN_CONST_ANGLES_{:s}_H
  17. #include <stdint.h>
  18. #include <gbdk/platform.h>
  19. #define {:s}_WIDTH {:d}
  20. #define {:s}_SIZE {:d}
  21. extern const {:s} {:s}[{:s}_SIZE];
  22. BANKREF_EXTERN({:s})
  23. #endif
  24. """
  25. def calc(args):
  26. s = ""
  27. for i in range(0, args.steps):
  28. angle = 360 / args.steps * i
  29. sin_a = math.sin(math.radians(angle)) * args.max
  30. cos_a = math.cos(math.radians(angle)) * args.max
  31. for n in range(0, args.shift):
  32. sin_a *= 2
  33. cos_a *= 2
  34. if args.width > 0:
  35. s += f" {round(sin_a)},"
  36. if args.width > 1:
  37. s += f" {round(cos_a)},"
  38. s += f" // {angle}\n"
  39. return (s, args.steps * args.width)
  40. def main(args):
  41. outheader = os.path.join(args.dir, f"{args.name}.h")
  42. outsource = os.path.join(args.dir, f"{args.name}.c")
  43. data, length = calc(args)
  44. source = sGBDK.format(sys.argv[0],
  45. args.name, args.name,
  46. args.type,
  47. args.name, args.name,
  48. data)
  49. if args.verbose:
  50. print(f"Source: {outsource}")
  51. print(source)
  52. if not args.dry_run:
  53. with open(outsource, "w") as o:
  54. o.write(source)
  55. header = hGBDK.format(sys.argv[0],
  56. args.name, args.name, args.name,
  57. args.width,
  58. args.name,
  59. length, args.type,
  60. args.name, args.name, args.name)
  61. if args.verbose:
  62. print(f"Header: {outheader}")
  63. print(header)
  64. if not args.dry_run:
  65. with open(outheader, "w") as o:
  66. o.write(header)
  67. if __name__=='__main__':
  68. parser = argparse.ArgumentParser()
  69. parser.add_argument("-d", "--dir", default=os.path.realpath("."))
  70. parser.add_argument("-n", "--name", required=True) #default="angles")
  71. parser.add_argument("-s", "--steps", default=16, type=int)
  72. parser.add_argument("-w", "--width", default=2, type=int)
  73. parser.add_argument("-f", "--shift", default=0, type=int)
  74. parser.add_argument("-m", "--max", default=42, type=int)
  75. parser.add_argument("-t", "--type", default="int8_t")
  76. parser.add_argument("-v", "--verbose", action="store_true")
  77. parser.add_argument("-y", "--dry-run", action="store_true")
  78. args = parser.parse_args()
  79. #print(args)
  80. main(args)