PrevinS

Untitled

Sep 28th, 2025
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.48 KB | None | 0 0
  1. import pygame
  2.  
  3. # Initialize Pygame for font and color constants
  4. pygame.init()
  5.  
  6. # Grid and screen dimensions
  7. TILE_SIZE = 20
  8. GRID_WIDTH, GRID_HEIGHT = 35, 35
  9. WIDTH, HEIGHT = GRID_WIDTH * TILE_SIZE, GRID_HEIGHT * TILE_SIZE
  10.  
  11. # Colors
  12. BACKGROUND_COLOR = (0, 0, 0)
  13. ROOM_COLOR = (102, 204, 255)
  14. LANE_COLOR = (50, 50, 50)
  15. PILLAR_COLOR = (255, 255, 255)
  16. HIGHLIGHT_COLOR = (255, 255, 0)
  17. TEXT_COLOR = (255, 255, 255)
  18. UI_BACKGROUND = (30, 30, 30)
  19. SLIDER_COLOR = (100, 100, 100)
  20. SLIDER_HANDLE_COLOR = (200, 200, 200)
  21. PLAYER_COLOR = (255, 165, 0)
  22.  
  23. # Nylo colors
  24. NYLO_MAGE_COLOR = (0, 0, 255)
  25. NYLO_RANGE_COLOR = (0, 255, 0)
  26. NYLO_MELEE_COLOR = (128, 128, 128)
  27. NYLO_SMALL_TYPES = ['mage', 'range', 'melee']
  28. NYLO_COLOR_MAP = {
  29. 'mage': NYLO_MAGE_COLOR,
  30. 'range': NYLO_RANGE_COLOR,
  31. 'melee': NYLO_MELEE_COLOR
  32. }
  33.  
  34. # Game constants
  35. TICK_INTERVAL_MS = 600
  36. NYLO_TIMEOUT = 52
  37. ROOM_CAP = 12
  38. WAVE_INTERVAL = 4
  39. BOSS_SPAWN_DELAY_TICKS = 16
  40. PLAYER_MAX_HP = 99
  41. NYLO_ATTACK_SPEED = 3
  42.  
  43. # Death animation delays (in ticks)
  44. BIG_NYLO_DEATH_DELAY = 3 # Bigs take 3 ticks before splitting
  45. TIMEOUT_DEATH_DELAY = 2 # Timeouts take 2 ticks before exploding
  46.  
  47. # Projectile speeds (tiles per tick)
  48. PROJECTILE_SPEEDS = {
  49. 'ayak': 7,
  50. 'barrage': 6,
  51. 'tbow': 6,
  52. 'chin': 7,
  53. 'pipe': 4,
  54. # Non-projectile weapons have instant hit
  55. 'sulpher': 0,
  56. 'scythe': 0,
  57. 'claws': 0
  58. }
  59.  
  60. # MAXIMUM AGGRESSION CONFIG - Forces constant attacking
  61. # Philosophy: Attack first, optimize later
  62.  
  63. # 1. SURVIVAL (Moderate to allow risk-taking)
  64. REWARD_SURVIVAL_BASE = 15.0
  65. REWARD_HIGH_HP_BONUS = 25.0
  66. REWARD_MEDIUM_HP = 10.0
  67. PUNISH_LOW_HP = -40.0
  68. PUNISH_CRITICAL_HP = -100.0
  69.  
  70. # 2. KILL REWARDS (High to encourage aggression)
  71. REWARD_KILL_BASE = 200.0
  72. REWARD_URGENT_KILL_MULTIPLIER = 2.0
  73. REWARD_FRESH_KILL_MULTIPLIER = 2.5 # Massive bonus for fresh kills
  74. REWARD_AGGRESSIVE_KILL_BONUS = 100.0 # Big bonus for aggressive kills
  75. REWARD_BIG_NYLO_KILL_BONUS = 150.0 # Big bonus for bigs
  76.  
  77. # 3. FORCE ATTACKING BEHAVIOR
  78. PUNISH_MISSED_ATTACK_OPPORTUNITY = -500.0 # MASSIVE penalty for not attacking
  79. PUNISH_WASTED_TICK = -300.0 # Heavy penalty for waiting
  80. REWARD_ANY_ATTACK_ATTEMPT = 50.0 # Reward just for trying to attack
  81.  
  82. # 4. REDUCE WEAPON SWITCHING BARRIERS
  83. PUNISH_WRONG_WEAPON_TYPE = -100.0 # Much lower wrong weapon penalty
  84. PUNISH_WRONG_TYPE_IN_CLUMP = -25.0 # Lower AoE wrong type penalty
  85. REWARD_CORRECT_WEAPON_SWITCH = 30.0 # Moderate switch reward
  86.  
  87. # 5. TIMEOUT AVOIDANCE (Keep existing logic)
  88. PUNISH_TIMEOUT_EXPLOSION = -400.0
  89. REWARD_TIMEOUT_PREVENTION = 80.0 # FIXED: Now positive
  90. PUNISH_NEAR_TIMEOUT = -150.0
  91.  
  92. # 6. PREFIRING (Massive rewards for early aggression)
  93. REWARD_LANE_PREFIRE = 300.0 # Huge lane prefiring bonus
  94. REWARD_EARLY_ENGAGEMENT = 150.0 # Big early engagement bonus
  95. PUNISH_LATE_ENGAGEMENT = -50.0 # Moderate late penalty
  96.  
  97. # 7. CLUMPING (High rewards for efficient killing)
  98. REWARD_CLUMP_2_NYLOS = 200.0
  99. REWARD_CLUMP_3_NYLOS = 500.0
  100. REWARD_CLUMP_EFFICIENCY = 75.0
  101.  
  102. # 8. POSITIONING (Moderate - don't interfere with aggression)
  103. REWARD_SAFE_POSITIONING = 10.0
  104. REWARD_OPTIMAL_RANGE_POSITIONING = 20.0
  105. PUNISH_DANGEROUS_POSITIONING = -30.0
  106.  
  107. # 9. PRAYER (Standard)
  108. REWARD_CORRECT_PRAYER = 60.0
  109. PUNISH_WRONG_PRAYER = -80.0
  110. PUNISH_UNNECESSARY_PRAYER = -5.0
  111.  
  112. # 10. ROOM CAP (High penalties to force speed)
  113. PUNISH_ROOM_CAP_STALL = -400.0
  114. REWARD_ROOM_CAP_PREVENTION = 100.0
  115.  
  116. REWARD_OPTIMAL_CLUMP_POSITIONING = 10.0
  117.  
  118. # Map and Path Data
  119. ROOM_X_START, ROOM_Y_START = 11, 11
  120. ROOM_WIDTH, ROOM_HEIGHT = 12, 12
  121. PILLAR_POSITIONS = {
  122. 'ne': (11, 21), 'nw': (11, 11), 'se': (21, 21), 'sw': (21, 11)
  123. }
  124. ROOM_TILES = set()
  125. for x in range(ROOM_X_START, ROOM_X_START + ROOM_WIDTH):
  126. for y in range(ROOM_Y_START, ROOM_Y_START + ROOM_HEIGHT):
  127. ROOM_TILES.add((x, y))
  128.  
  129. PILLAR_TILES = set()
  130. for pos in PILLAR_POSITIONS.values():
  131. for x in range(pos[0], pos[0] + 2):
  132. for y in range(pos[1], pos[1] + 2):
  133. PILLAR_TILES.add((x, y))
  134.  
  135. LANE_TILES = [
  136. (17, 1), (17, 2), (17, 3), (17, 4), (17, 5), (17, 6), (17, 7), (17, 8), (17, 9), (17, 10),
  137. (16, 1), (16, 2), (16, 3), (16, 4), (16, 5), (16, 6), (16, 7), (16, 8), (16, 9), (16, 10),
  138. (1, 16), (2, 16), (3, 16), (4, 16), (5, 16), (6, 16), (7, 16), (8, 16), (9, 16), (10, 16),
  139. (1, 17), (2, 17), (3, 17), (4, 17), (5, 17), (6, 17), (7, 17), (8, 17), (9, 17), (10, 17),
  140. (23, 16), (24, 16), (25, 16), (26, 16), (27, 16), (28, 16), (29, 16), (30, 16), (31, 16), (32, 16),
  141. (23, 17), (24, 17), (25, 17), (26, 17), (27, 17), (28, 17), (29, 17), (30, 17), (31, 17), (32, 17),
  142. ]
  143.  
  144. WALKABLE_TILES = set(LANE_TILES) | ROOM_TILES
  145. PILLAR_ADJACENT_TILES = {
  146. 'ne': [(11, 20), (12, 20), (13, 21), (13, 22)],
  147. 'nw': [(20, 21), (20, 22), (21, 20), (22, 20)],
  148. 'se': [(11, 13), (12, 13), (13, 12), (13, 11)],
  149. 'sw': [(21, 13), (22, 13), (20, 11), (20, 12)],
  150. }
  151. for tiles in PILLAR_ADJACENT_TILES.values():
  152. WALKABLE_TILES.update(tiles)
  153.  
  154. DESTINATION_TO_PILLAR_MAP = {}
  155. for pillar, tiles in PILLAR_ADJACENT_TILES.items():
  156. for tile in tiles:
  157. DESTINATION_TO_PILLAR_MAP[tile] = pillar
  158.  
  159. LANE_MAP = {
  160. 'EastN': {'spawn': (1, 17), 'path': [(1, 17), (2, 17), (3, 17), (4, 17), (5, 17), (6, 17), (7, 17), (8, 17), (9, 17), (10, 17)]},
  161. 'EastS': {'spawn': (1, 16), 'path': [(1, 16), (2, 16), (3, 16), (4, 16), (5, 16), (6, 16), (7, 16), (8, 16), (9, 16), (10, 16)]},
  162. 'SouthE': {'spawn': (16, 1), 'path': [(16, 1), (16, 2), (16, 3), (16, 4), (16, 5), (16, 6), (16, 7), (16, 8), (16, 9), (16, 10)]},
  163. 'SouthW': {'spawn': (17, 1), 'path': [(17, 1), (17, 2), (17, 3), (17, 4), (17, 5), (17, 6), (17, 7), (17, 8), (17, 9), (17, 10)]},
  164. 'WestN': {'spawn': (32, 17), 'path': [(32, 17), (31, 17), (30, 17), (29, 17), (28, 17), (27, 17), (26, 17), (25, 17), (24, 17), (23, 17)]},
  165. 'WestS': {'spawn': (32, 16), 'path': [(32, 16), (31, 16), (30, 16), (29, 16), (28, 16), (27, 16), (26, 16), (25, 16), (24, 16), (23, 16)]}
  166. }
  167. NYLO_SPAWN_DATA = [
  168. {'Wave #': 1, 'EastN': 'melee: (20,22)', 'EastS': '', 'SouthE': 'mage: (11,20)', 'SouthW': '', 'WestN': '', 'WestS': 'range: aggro'},
  169. {'Wave #': 2, 'EastN': 'range: (11,13)', 'EastS': '', 'SouthE': 'melee: aggro', 'SouthW': '', 'WestN': '', 'WestS': 'mage: (13,22)'},
  170. {'Wave #': 3, 'EastN': 'mage: aggro', 'EastS': '', 'SouthE': 'range: (13,11)', 'SouthW': '', 'WestN': '', 'WestS': 'melee: (13,21)'},
  171. {'Wave #': 4, 'EastN': 'melee: (12,20)', 'EastS': '', 'SouthE': 'MAGE: (20,11)', 'SouthW': '', 'WestN': '', 'WestS': 'range: (22,20)'},
  172. {'Wave #': 5, 'EastN': 'mage: (11,20)', 'EastS': '', 'SouthE': 'melee: (13,11)', 'SouthW': '', 'WestN': '', 'WestS': 'RANGE: (22,13)'},
  173. {'Wave #': 'stall'}, {'Wave #': 'stall'}, {'Wave #': 'stall'},
  174. {'Wave #': 6, 'EastN': '', 'EastS': 'MELEE: (11,13)', 'SouthE': 'range: (22,20)', 'SouthW': '', 'WestN': '', 'WestS': 'mage: (13,22)'},
  175. {'Wave #': 7, 'EastN': '', 'EastS': 'MELEE: (20,22)', 'SouthE': 'mage: (11,20)', 'SouthW': 'RANGE: aggro', 'WestN': '', 'WestS': ''},
  176. {'Wave #': 'stall'}, {'Wave #': 'stall'},
  177. {'Wave #': 8, 'EastN': 'range: (11,13)', 'EastS': '', 'SouthE': 'melee: (22,20)', 'SouthW': '', 'WestN': '', 'WestS': 'MAGE: aggro'},
  178. {'Wave #': 9, 'EastN': 'mage: (22,20)', 'EastS': '', 'SouthE': '', 'SouthW': 'melee: (13,11)', 'WestN': 'RANGE: aggro', 'WestS': ''},
  179. {'Wave #': 'stall'}, {'Wave #': 'stall'}, {'Wave #': 'stall'},
  180. {'Wave #': 10, 'EastN': 'range: aggro', 'EastS': 'RANGE: (11,20)', 'SouthE': 'range: (13,11)', 'SouthW': 'range: (13,11)', 'WestN': 'range: (22,20)', 'WestS': 'range: aggro'},
  181. {'Wave #': 11, 'EastN': 'mage: aggro', 'EastS': 'mage: (11,20)', 'SouthE': 'mage: (13,11)', 'SouthW': 'mage: (13,11)', 'WestN': '', 'WestS': 'MAGE: aggro'},
  182. {'Wave #': 12, 'EastN': 'melee: aggro', 'EastS': 'melee: (12,20)', 'SouthE': 'MELEE: (20,11)', 'SouthW': '', 'WestN': 'melee: (21,20)', 'WestS': 'melee: aggro'},
  183. {'Wave #': 'stall'},
  184. {'Wave #': 13, 'EastN': 'MELEE: aggro', 'EastS': '', 'SouthE': 'range: (13,11)', 'SouthW': 'melee: (20,11)', 'WestN': 'range: (22,20)', 'WestS': 'mage: aggro'},
  185. {'Wave #': 'stall'},
  186. {'Wave #': 14, 'EastN': 'RANGE: aggro', 'EastS': '', 'SouthE': 'mage: (13,12)', 'SouthW': 'range: (20,12)', 'WestN': 'mage: (21,20)', 'WestS': 'melee: aggro'},
  187. {'Wave #': 'stall'},
  188. {'Wave #': 15, 'EastN': 'mage: aggro', 'EastS': 'range: (11,20)', 'SouthE': 'MAGE: (20,11)', 'SouthW': '', 'WestN': 'melee: (22,20)', 'WestS': 'range: aggro'},
  189. {'Wave #': 'stall'},
  190. {'Wave #': 16, 'EastN': 'mage-melee-range: (11,20)', 'EastS': '', 'SouthE': 'melee-mage-range: (20,12)', 'SouthW': '', 'WestN': '', 'WestS': 'range-mage-range: (22,20)'},
  191. {'Wave #': 17, 'EastN': '', 'EastS': 'MAGE-MELEE-MAGE: (11,20)', 'SouthE': 'MAGE-MELEE-MAGE: (13,11)', 'SouthW': '', 'WestN': '', 'WestS': 'MAGE-MELEE-MAGE: (22,13)'},
  192. {'Wave #': 'stall'}, {'Wave #': 'stall'},
  193. {'Wave #': 18, 'EastN': '', 'EastS': 'RANGE-MAGE-RANGE: (20,22)', 'SouthE': 'RANGE-MAGE-RANGE: (20,11)', 'SouthW': '', 'WestN': '', 'WestS': 'RANGE-MAGE-RANGE: aggro'},
  194. {'Wave #': 'stall'},
  195. {'Wave #': 19, 'EastN': '', 'EastS': 'MAGE-MELEE-MAGE: aggro', 'SouthE': 'MAGE-MELEE-MAGE: (13,11)', 'SouthW': '', 'WestN': '', 'WestS': 'MAGE-MELEE-MAGE: (13,22)'},
  196. {'Wave #': 'stall'}, {'Wave #': 'stall'},
  197. {'Wave #': 20, 'EastN': 'MELEE-RANGE-MELEE: (11,20)', 'EastS': '', 'SouthE': 'MELEE-RANGE-MELEE: aggro', 'SouthW': '', 'WestN': '', 'WestS': 'MELEE-RANGE-MELEE: (22,20)'},
  198. {'Wave #': 'stall'}, {'Wave #': 'stall'}, {'Wave #': 'stall'},
  199. {'Wave #': 21, 'EastN': 'range-melee-range: (11,20)', 'EastS': 'range-melee-range: aggro', 'SouthE': 'melee-mage-melee: (13,11)', 'SouthW': 'melee-range-melee: aggro', 'WestN': 'mage-range-mage: (22,20)', 'WestS': 'mage-melee-range: (22,13)'},
  200. {'Wave #': 22, 'EastN': 'MAGE-RANGE-MELEE: aggro', 'EastS': '', 'SouthE': 'range-mage-melee: (13,11)', 'SouthW': 'melee-range-melee: (20,11)', 'WestN': '', 'WestS': 'MAGE-RANGE-MELEE: (20,13)'},
  201. {'Wave #': 'stall'}, {'Wave #': 'stall'},
  202. {'Wave #': 23, 'EastN': 'MAGE-RANGE-MELEE: (11,20)', 'EastS': '', 'SouthE': 'RANGE-MAGE-MELEE: aggro', 'SouthW': '', 'WestN': 'mage-range-melee: (21,20)', 'WestS': 'range-mage-range: (22,13)'},
  203. {'Wave #': 'stall'},
  204. {'Wave #': 24, 'EastN': 'MELEE: aggro', 'EastS': '', 'SouthE': 'MAGE: aggro', 'SouthW': '', 'WestN': '', 'WestS': 'RANGE-MAGE-MELEE: aggro'},
  205. {'Wave #': 25, 'EastN': 'MAGE-MELEE-MAGE: (11,13)', 'EastS': '', 'SouthE': 'RANGE: (20,11)', 'SouthW': '', 'WestN': '', 'WestS': 'MELEE: aggro'},
  206. {'Wave #': 'stall'},
  207. {'Wave #': 26, 'EastN': 'MAGE: (11,20)', 'EastS': '', 'SouthE': 'MELEE-MAGE-MELEE: (20,11)', 'SouthW': '', 'WestN': '', 'WestS': 'MAGE: aggro'},
  208. {'Wave #': 27, 'EastN': 'MAGE-MELEE-MAGE: (12,13)', 'EastS': '', 'SouthE': 'MELEE-MAGE-RANGE: aggro', 'SouthW': '', 'WestN': '', 'WestS': 'MAGE: (21,20)'},
  209. {'Wave #': 'stall'},
  210. {'Wave #': 28, 'EastN': 'mage-melee-mage: (11,20)', 'EastS': 'range-melee-mage: (11,13)', 'SouthE': 'melee-range-melee: (13,11)', 'SouthW': 'mage-melee-range: (20,11)', 'WestN': 'melee-mage-melee: (22,20)', 'WestS': 'range-melee-mage: aggro'},
  211. {'Wave #': 29, 'EastN': 'mage-range-melee: (11,20)', 'EastS': 'range-melee-mage: aggro', 'SouthE': 'MELEE: (13,11)', 'SouthW': 'range-melee-range: (20,11)', 'WestN': 'melee-range-mage: aggro', 'WestS': 'range-melee-range: (22,13)'},
  212. {'Wave #': 30, 'EastN': 'MAGE: aggro', 'EastS': '', 'SouthE': 'melee-range-melee: (13,11)', 'SouthW': 'mage-range-melee: (20,11)', 'WestN': '', 'WestS': 'RANGE-MELEE-RANGE: (22,13)'},
  213. {'Wave #': 31, 'EastN': 'mage-range-mage: (11,20)', 'EastS': 'range-melee-range: (11,13)', 'SouthE': 'melee-mage-range: (13,11)', 'SouthW': 'mage-melee-range: (20,11)', 'WestN': 'melee-range-mage: (22,20)', 'WestS': 'range-mage-range: (22,13)'},
  214. ]
  215.  
  216. NYLO_STATS = {
  217. 'melee': {'health': 11, 'speed': 1, 'size': 1},
  218. 'range': {'health': 11, 'speed': 1, 'size': 1},
  219. 'mage': {'health': 11, 'speed': 1, 'size': 1},
  220. 'MELEE': {'health': 22, 'speed': 1, 'size': 2},
  221. 'RANGE': {'health': 22, 'speed': 1, 'size': 2},
  222. 'MAGE': {'health': 22, 'speed': 1, 'size': 2},
  223. 'smelee': {'health': 11, 'speed': 1, 'size': 1},
  224. 'srange': {'health': 11, 'speed': 1, 'size': 1},
  225. 'smage': {'health': 11, 'speed': 1, 'size': 1},
  226. }
  227.  
  228. WEAPON_STATS = {
  229. 'chin': {'max_hit': 36, 'accuracy': 0.97, 'range': 9, 'attack_speed': 3, 'multi_target': 1, 'synergy': 10, 'valid_types': ['range']},
  230. 'tbow': {'max_hit': 86, 'accuracy': 0.99, 'range': 10, 'attack_speed': 5, 'multi_target': 0, 'synergy': 10, 'valid_types': ['range']},
  231. 'pipe': {'max_hit': 33, 'accuracy': 0.96, 'range': 5, 'attack_speed': 2, 'multi_target': 0, 'synergy': 10, 'valid_types': ['range']},
  232. 'ayak': {'max_hit': 29, 'accuracy': 0.95, 'range': 9, 'attack_speed': 3, 'multi_target': 0, 'synergy': 8, 'valid_types': ['mage']},
  233. 'barrage': {'max_hit': 40, 'accuracy': 0.98, 'range': 9, 'attack_speed': 4, 'multi_target': 1, 'synergy': 9, 'valid_types': ['mage']},
  234. 'sulpher': {'max_hit': 34, 'accuracy': 0.96, 'range': 1, 'attack_speed': 4, 'multi_target': 0, 'synergy': 5, 'valid_types': ['melee']},
  235. 'scythe': {'max_hit': 36, 'accuracy': 0.96, 'range': 1, 'attack_speed': 5, 'multi_target': 1, 'synergy': 3, 'valid_types': ['melee']},
  236. 'claws': {'max_hit': 31, 'accuracy': 0.96, 'range': 1, 'attack_speed': 4, 'multi_target': 0, 'synergy': 3, 'valid_types': ['melee']},
  237. }
Advertisement
Add Comment
Please, Sign In to add comment