Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame
- # Initialize Pygame for font and color constants
- pygame.init()
- # Grid and screen dimensions
- TILE_SIZE = 20
- GRID_WIDTH, GRID_HEIGHT = 35, 35
- WIDTH, HEIGHT = GRID_WIDTH * TILE_SIZE, GRID_HEIGHT * TILE_SIZE
- # Colors
- BACKGROUND_COLOR = (0, 0, 0)
- ROOM_COLOR = (102, 204, 255)
- LANE_COLOR = (50, 50, 50)
- PILLAR_COLOR = (255, 255, 255)
- HIGHLIGHT_COLOR = (255, 255, 0)
- TEXT_COLOR = (255, 255, 255)
- UI_BACKGROUND = (30, 30, 30)
- SLIDER_COLOR = (100, 100, 100)
- SLIDER_HANDLE_COLOR = (200, 200, 200)
- PLAYER_COLOR = (255, 165, 0)
- # Nylo colors
- NYLO_MAGE_COLOR = (0, 0, 255)
- NYLO_RANGE_COLOR = (0, 255, 0)
- NYLO_MELEE_COLOR = (128, 128, 128)
- NYLO_SMALL_TYPES = ['mage', 'range', 'melee']
- NYLO_COLOR_MAP = {
- 'mage': NYLO_MAGE_COLOR,
- 'range': NYLO_RANGE_COLOR,
- 'melee': NYLO_MELEE_COLOR
- }
- # Game constants
- TICK_INTERVAL_MS = 600
- NYLO_TIMEOUT = 52
- ROOM_CAP = 12
- WAVE_INTERVAL = 4
- BOSS_SPAWN_DELAY_TICKS = 16
- PLAYER_MAX_HP = 99
- NYLO_ATTACK_SPEED = 3
- # Death animation delays (in ticks)
- BIG_NYLO_DEATH_DELAY = 3 # Bigs take 3 ticks before splitting
- TIMEOUT_DEATH_DELAY = 2 # Timeouts take 2 ticks before exploding
- # Projectile speeds (tiles per tick)
- PROJECTILE_SPEEDS = {
- 'ayak': 7,
- 'barrage': 6,
- 'tbow': 6,
- 'chin': 7,
- 'pipe': 4,
- # Non-projectile weapons have instant hit
- 'sulpher': 0,
- 'scythe': 0,
- 'claws': 0
- }
- # MAXIMUM AGGRESSION CONFIG - Forces constant attacking
- # Philosophy: Attack first, optimize later
- # 1. SURVIVAL (Moderate to allow risk-taking)
- REWARD_SURVIVAL_BASE = 15.0
- REWARD_HIGH_HP_BONUS = 25.0
- REWARD_MEDIUM_HP = 10.0
- PUNISH_LOW_HP = -40.0
- PUNISH_CRITICAL_HP = -100.0
- # 2. KILL REWARDS (High to encourage aggression)
- REWARD_KILL_BASE = 200.0
- REWARD_URGENT_KILL_MULTIPLIER = 2.0
- REWARD_FRESH_KILL_MULTIPLIER = 2.5 # Massive bonus for fresh kills
- REWARD_AGGRESSIVE_KILL_BONUS = 100.0 # Big bonus for aggressive kills
- REWARD_BIG_NYLO_KILL_BONUS = 150.0 # Big bonus for bigs
- # 3. FORCE ATTACKING BEHAVIOR
- PUNISH_MISSED_ATTACK_OPPORTUNITY = -500.0 # MASSIVE penalty for not attacking
- PUNISH_WASTED_TICK = -300.0 # Heavy penalty for waiting
- REWARD_ANY_ATTACK_ATTEMPT = 50.0 # Reward just for trying to attack
- # 4. REDUCE WEAPON SWITCHING BARRIERS
- PUNISH_WRONG_WEAPON_TYPE = -100.0 # Much lower wrong weapon penalty
- PUNISH_WRONG_TYPE_IN_CLUMP = -25.0 # Lower AoE wrong type penalty
- REWARD_CORRECT_WEAPON_SWITCH = 30.0 # Moderate switch reward
- # 5. TIMEOUT AVOIDANCE (Keep existing logic)
- PUNISH_TIMEOUT_EXPLOSION = -400.0
- REWARD_TIMEOUT_PREVENTION = 80.0 # FIXED: Now positive
- PUNISH_NEAR_TIMEOUT = -150.0
- # 6. PREFIRING (Massive rewards for early aggression)
- REWARD_LANE_PREFIRE = 300.0 # Huge lane prefiring bonus
- REWARD_EARLY_ENGAGEMENT = 150.0 # Big early engagement bonus
- PUNISH_LATE_ENGAGEMENT = -50.0 # Moderate late penalty
- # 7. CLUMPING (High rewards for efficient killing)
- REWARD_CLUMP_2_NYLOS = 200.0
- REWARD_CLUMP_3_NYLOS = 500.0
- REWARD_CLUMP_EFFICIENCY = 75.0
- # 8. POSITIONING (Moderate - don't interfere with aggression)
- REWARD_SAFE_POSITIONING = 10.0
- REWARD_OPTIMAL_RANGE_POSITIONING = 20.0
- PUNISH_DANGEROUS_POSITIONING = -30.0
- # 9. PRAYER (Standard)
- REWARD_CORRECT_PRAYER = 60.0
- PUNISH_WRONG_PRAYER = -80.0
- PUNISH_UNNECESSARY_PRAYER = -5.0
- # 10. ROOM CAP (High penalties to force speed)
- PUNISH_ROOM_CAP_STALL = -400.0
- REWARD_ROOM_CAP_PREVENTION = 100.0
- REWARD_OPTIMAL_CLUMP_POSITIONING = 10.0
- # Map and Path Data
- ROOM_X_START, ROOM_Y_START = 11, 11
- ROOM_WIDTH, ROOM_HEIGHT = 12, 12
- PILLAR_POSITIONS = {
- 'ne': (11, 21), 'nw': (11, 11), 'se': (21, 21), 'sw': (21, 11)
- }
- ROOM_TILES = set()
- for x in range(ROOM_X_START, ROOM_X_START + ROOM_WIDTH):
- for y in range(ROOM_Y_START, ROOM_Y_START + ROOM_HEIGHT):
- ROOM_TILES.add((x, y))
- PILLAR_TILES = set()
- for pos in PILLAR_POSITIONS.values():
- for x in range(pos[0], pos[0] + 2):
- for y in range(pos[1], pos[1] + 2):
- PILLAR_TILES.add((x, y))
- LANE_TILES = [
- (17, 1), (17, 2), (17, 3), (17, 4), (17, 5), (17, 6), (17, 7), (17, 8), (17, 9), (17, 10),
- (16, 1), (16, 2), (16, 3), (16, 4), (16, 5), (16, 6), (16, 7), (16, 8), (16, 9), (16, 10),
- (1, 16), (2, 16), (3, 16), (4, 16), (5, 16), (6, 16), (7, 16), (8, 16), (9, 16), (10, 16),
- (1, 17), (2, 17), (3, 17), (4, 17), (5, 17), (6, 17), (7, 17), (8, 17), (9, 17), (10, 17),
- (23, 16), (24, 16), (25, 16), (26, 16), (27, 16), (28, 16), (29, 16), (30, 16), (31, 16), (32, 16),
- (23, 17), (24, 17), (25, 17), (26, 17), (27, 17), (28, 17), (29, 17), (30, 17), (31, 17), (32, 17),
- ]
- WALKABLE_TILES = set(LANE_TILES) | ROOM_TILES
- PILLAR_ADJACENT_TILES = {
- 'ne': [(11, 20), (12, 20), (13, 21), (13, 22)],
- 'nw': [(20, 21), (20, 22), (21, 20), (22, 20)],
- 'se': [(11, 13), (12, 13), (13, 12), (13, 11)],
- 'sw': [(21, 13), (22, 13), (20, 11), (20, 12)],
- }
- for tiles in PILLAR_ADJACENT_TILES.values():
- WALKABLE_TILES.update(tiles)
- DESTINATION_TO_PILLAR_MAP = {}
- for pillar, tiles in PILLAR_ADJACENT_TILES.items():
- for tile in tiles:
- DESTINATION_TO_PILLAR_MAP[tile] = pillar
- LANE_MAP = {
- '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)]},
- '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)]},
- '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)]},
- '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)]},
- '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)]},
- '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)]}
- }
- NYLO_SPAWN_DATA = [
- {'Wave #': 1, 'EastN': 'melee: (20,22)', 'EastS': '', 'SouthE': 'mage: (11,20)', 'SouthW': '', 'WestN': '', 'WestS': 'range: aggro'},
- {'Wave #': 2, 'EastN': 'range: (11,13)', 'EastS': '', 'SouthE': 'melee: aggro', 'SouthW': '', 'WestN': '', 'WestS': 'mage: (13,22)'},
- {'Wave #': 3, 'EastN': 'mage: aggro', 'EastS': '', 'SouthE': 'range: (13,11)', 'SouthW': '', 'WestN': '', 'WestS': 'melee: (13,21)'},
- {'Wave #': 4, 'EastN': 'melee: (12,20)', 'EastS': '', 'SouthE': 'MAGE: (20,11)', 'SouthW': '', 'WestN': '', 'WestS': 'range: (22,20)'},
- {'Wave #': 5, 'EastN': 'mage: (11,20)', 'EastS': '', 'SouthE': 'melee: (13,11)', 'SouthW': '', 'WestN': '', 'WestS': 'RANGE: (22,13)'},
- {'Wave #': 'stall'}, {'Wave #': 'stall'}, {'Wave #': 'stall'},
- {'Wave #': 6, 'EastN': '', 'EastS': 'MELEE: (11,13)', 'SouthE': 'range: (22,20)', 'SouthW': '', 'WestN': '', 'WestS': 'mage: (13,22)'},
- {'Wave #': 7, 'EastN': '', 'EastS': 'MELEE: (20,22)', 'SouthE': 'mage: (11,20)', 'SouthW': 'RANGE: aggro', 'WestN': '', 'WestS': ''},
- {'Wave #': 'stall'}, {'Wave #': 'stall'},
- {'Wave #': 8, 'EastN': 'range: (11,13)', 'EastS': '', 'SouthE': 'melee: (22,20)', 'SouthW': '', 'WestN': '', 'WestS': 'MAGE: aggro'},
- {'Wave #': 9, 'EastN': 'mage: (22,20)', 'EastS': '', 'SouthE': '', 'SouthW': 'melee: (13,11)', 'WestN': 'RANGE: aggro', 'WestS': ''},
- {'Wave #': 'stall'}, {'Wave #': 'stall'}, {'Wave #': 'stall'},
- {'Wave #': 10, 'EastN': 'range: aggro', 'EastS': 'RANGE: (11,20)', 'SouthE': 'range: (13,11)', 'SouthW': 'range: (13,11)', 'WestN': 'range: (22,20)', 'WestS': 'range: aggro'},
- {'Wave #': 11, 'EastN': 'mage: aggro', 'EastS': 'mage: (11,20)', 'SouthE': 'mage: (13,11)', 'SouthW': 'mage: (13,11)', 'WestN': '', 'WestS': 'MAGE: aggro'},
- {'Wave #': 12, 'EastN': 'melee: aggro', 'EastS': 'melee: (12,20)', 'SouthE': 'MELEE: (20,11)', 'SouthW': '', 'WestN': 'melee: (21,20)', 'WestS': 'melee: aggro'},
- {'Wave #': 'stall'},
- {'Wave #': 13, 'EastN': 'MELEE: aggro', 'EastS': '', 'SouthE': 'range: (13,11)', 'SouthW': 'melee: (20,11)', 'WestN': 'range: (22,20)', 'WestS': 'mage: aggro'},
- {'Wave #': 'stall'},
- {'Wave #': 14, 'EastN': 'RANGE: aggro', 'EastS': '', 'SouthE': 'mage: (13,12)', 'SouthW': 'range: (20,12)', 'WestN': 'mage: (21,20)', 'WestS': 'melee: aggro'},
- {'Wave #': 'stall'},
- {'Wave #': 15, 'EastN': 'mage: aggro', 'EastS': 'range: (11,20)', 'SouthE': 'MAGE: (20,11)', 'SouthW': '', 'WestN': 'melee: (22,20)', 'WestS': 'range: aggro'},
- {'Wave #': 'stall'},
- {'Wave #': 16, 'EastN': 'mage-melee-range: (11,20)', 'EastS': '', 'SouthE': 'melee-mage-range: (20,12)', 'SouthW': '', 'WestN': '', 'WestS': 'range-mage-range: (22,20)'},
- {'Wave #': 17, 'EastN': '', 'EastS': 'MAGE-MELEE-MAGE: (11,20)', 'SouthE': 'MAGE-MELEE-MAGE: (13,11)', 'SouthW': '', 'WestN': '', 'WestS': 'MAGE-MELEE-MAGE: (22,13)'},
- {'Wave #': 'stall'}, {'Wave #': 'stall'},
- {'Wave #': 18, 'EastN': '', 'EastS': 'RANGE-MAGE-RANGE: (20,22)', 'SouthE': 'RANGE-MAGE-RANGE: (20,11)', 'SouthW': '', 'WestN': '', 'WestS': 'RANGE-MAGE-RANGE: aggro'},
- {'Wave #': 'stall'},
- {'Wave #': 19, 'EastN': '', 'EastS': 'MAGE-MELEE-MAGE: aggro', 'SouthE': 'MAGE-MELEE-MAGE: (13,11)', 'SouthW': '', 'WestN': '', 'WestS': 'MAGE-MELEE-MAGE: (13,22)'},
- {'Wave #': 'stall'}, {'Wave #': 'stall'},
- {'Wave #': 20, 'EastN': 'MELEE-RANGE-MELEE: (11,20)', 'EastS': '', 'SouthE': 'MELEE-RANGE-MELEE: aggro', 'SouthW': '', 'WestN': '', 'WestS': 'MELEE-RANGE-MELEE: (22,20)'},
- {'Wave #': 'stall'}, {'Wave #': 'stall'}, {'Wave #': 'stall'},
- {'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)'},
- {'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)'},
- {'Wave #': 'stall'}, {'Wave #': 'stall'},
- {'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)'},
- {'Wave #': 'stall'},
- {'Wave #': 24, 'EastN': 'MELEE: aggro', 'EastS': '', 'SouthE': 'MAGE: aggro', 'SouthW': '', 'WestN': '', 'WestS': 'RANGE-MAGE-MELEE: aggro'},
- {'Wave #': 25, 'EastN': 'MAGE-MELEE-MAGE: (11,13)', 'EastS': '', 'SouthE': 'RANGE: (20,11)', 'SouthW': '', 'WestN': '', 'WestS': 'MELEE: aggro'},
- {'Wave #': 'stall'},
- {'Wave #': 26, 'EastN': 'MAGE: (11,20)', 'EastS': '', 'SouthE': 'MELEE-MAGE-MELEE: (20,11)', 'SouthW': '', 'WestN': '', 'WestS': 'MAGE: aggro'},
- {'Wave #': 27, 'EastN': 'MAGE-MELEE-MAGE: (12,13)', 'EastS': '', 'SouthE': 'MELEE-MAGE-RANGE: aggro', 'SouthW': '', 'WestN': '', 'WestS': 'MAGE: (21,20)'},
- {'Wave #': 'stall'},
- {'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'},
- {'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)'},
- {'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)'},
- {'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)'},
- ]
- NYLO_STATS = {
- 'melee': {'health': 11, 'speed': 1, 'size': 1},
- 'range': {'health': 11, 'speed': 1, 'size': 1},
- 'mage': {'health': 11, 'speed': 1, 'size': 1},
- 'MELEE': {'health': 22, 'speed': 1, 'size': 2},
- 'RANGE': {'health': 22, 'speed': 1, 'size': 2},
- 'MAGE': {'health': 22, 'speed': 1, 'size': 2},
- 'smelee': {'health': 11, 'speed': 1, 'size': 1},
- 'srange': {'health': 11, 'speed': 1, 'size': 1},
- 'smage': {'health': 11, 'speed': 1, 'size': 1},
- }
- WEAPON_STATS = {
- 'chin': {'max_hit': 36, 'accuracy': 0.97, 'range': 9, 'attack_speed': 3, 'multi_target': 1, 'synergy': 10, 'valid_types': ['range']},
- 'tbow': {'max_hit': 86, 'accuracy': 0.99, 'range': 10, 'attack_speed': 5, 'multi_target': 0, 'synergy': 10, 'valid_types': ['range']},
- 'pipe': {'max_hit': 33, 'accuracy': 0.96, 'range': 5, 'attack_speed': 2, 'multi_target': 0, 'synergy': 10, 'valid_types': ['range']},
- 'ayak': {'max_hit': 29, 'accuracy': 0.95, 'range': 9, 'attack_speed': 3, 'multi_target': 0, 'synergy': 8, 'valid_types': ['mage']},
- 'barrage': {'max_hit': 40, 'accuracy': 0.98, 'range': 9, 'attack_speed': 4, 'multi_target': 1, 'synergy': 9, 'valid_types': ['mage']},
- 'sulpher': {'max_hit': 34, 'accuracy': 0.96, 'range': 1, 'attack_speed': 4, 'multi_target': 0, 'synergy': 5, 'valid_types': ['melee']},
- 'scythe': {'max_hit': 36, 'accuracy': 0.96, 'range': 1, 'attack_speed': 5, 'multi_target': 1, 'synergy': 3, 'valid_types': ['melee']},
- 'claws': {'max_hit': 31, 'accuracy': 0.96, 'range': 1, 'attack_speed': 4, 'multi_target': 0, 'synergy': 3, 'valid_types': ['melee']},
- }
Advertisement
Add Comment
Please, Sign In to add comment