patch_factory.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. from abc import ABC, abstractmethod
  2. from typing import Optional
  3. import sys
  4. import os
  5. # Agregar el directorio padre al path para importar config
  6. sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  7. from config import PATCH_CONFIG
  8. class Patch(ABC):
  9. """Clase base para todos los tipos de parches"""
  10. @abstractmethod
  11. def create_patch(self, original_data: bytes) -> bytes:
  12. """Crea el código del parche"""
  13. pass
  14. @abstractmethod
  15. def get_patch_size(self) -> int:
  16. """Retorna el tamaño del parche"""
  17. pass
  18. @abstractmethod
  19. def get_description(self) -> str:
  20. """Retorna la descripción del parche"""
  21. pass
  22. class StaminaPatch(Patch):
  23. """Parche específico para stamina infinita"""
  24. def create_patch(self, original_data: bytes) -> bytes:
  25. """Crea el código de parche para stamina infinita"""
  26. # Obtener configuración del patch desde config
  27. stamina_config = PATCH_CONFIG['stamina']
  28. # Preservar el byte del salto original
  29. jump_offset = original_data[1] if len(original_data) > 1 else 0x16
  30. # Usar instrucciones desde configuración
  31. instructions = stamina_config['instructions'].copy()
  32. instructions[1] = jump_offset # Actualizar el offset del salto
  33. return bytes(instructions)
  34. def get_patch_size(self) -> int:
  35. """Retorna el tamaño del parche de stamina"""
  36. return 18
  37. def get_description(self) -> str:
  38. """Descripción del parche de stamina"""
  39. return PATCH_CONFIG['stamina']['description']
  40. class SpeedPatch(Patch):
  41. """Parche específico para velocidad de movimiento"""
  42. def __init__(self, speed_multiplier: str = '2x'):
  43. self.speed_multiplier = speed_multiplier
  44. def create_patch(self, original_data: bytes) -> bytes:
  45. """Crea el código de parche para velocidad modificada"""
  46. # Obtener configuración del patch desde config
  47. speed_config = PATCH_CONFIG['speed']
  48. # Obtener el patrón de velocidad deseado
  49. if self.speed_multiplier in speed_config['speed_multipliers']:
  50. return bytes(speed_config['speed_multipliers'][self.speed_multiplier])
  51. else:
  52. # Fallback a velocidad normal si no se encuentra el multiplicador
  53. return bytes(speed_config['speed_multipliers']['1x'])
  54. def get_patch_size(self) -> int:
  55. """Retorna el tamaño del parche de velocidad"""
  56. return 16
  57. def get_description(self) -> str:
  58. """Descripción del parche de velocidad"""
  59. return f"{PATCH_CONFIG['speed']['description']} (Multiplicador: {self.speed_multiplier})"
  60. class HealthPatch(Patch):
  61. """Parche para vida infinita (ejemplo de extensibilidad)"""
  62. def create_patch(self, original_data: bytes) -> bytes:
  63. """Placeholder para parche de vida"""
  64. # Implementación futura
  65. return b'\x90' * 8 # NOPs por ahora
  66. def get_patch_size(self) -> int:
  67. return 8
  68. def get_description(self) -> str:
  69. return "Parche de vida infinita (no implementado)"
  70. class PatchFactory:
  71. """Factory para crear diferentes tipos de parches"""
  72. _patch_types = {
  73. 'stamina': StaminaPatch,
  74. 'speed': SpeedPatch,
  75. 'health': HealthPatch
  76. }
  77. @classmethod
  78. def create_patch(cls, patch_type: str, **kwargs) -> Optional[Patch]:
  79. """Crea un parche del tipo especificado"""
  80. patch_class = cls._patch_types.get(patch_type.lower())
  81. if patch_class:
  82. if patch_type.lower() == 'speed':
  83. speed_multiplier = kwargs.get('speed_multiplier', '2x')
  84. return patch_class(speed_multiplier)
  85. else:
  86. return patch_class()
  87. return None
  88. @classmethod
  89. def get_available_patches(cls) -> list:
  90. """Retorna la lista de parches disponibles"""
  91. return list(cls._patch_types.keys())
  92. @classmethod
  93. def get_speed_multipliers(cls) -> list:
  94. """Retorna la lista de multiplicadores de velocidad disponibles"""
  95. return list(PATCH_CONFIG['speed']['speed_multipliers'].keys())