vanburendolphin

StaminaSystem

Jul 28th, 2025
347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
GDScript 8.08 KB | Gaming | 0 0
  1. extends Node
  2. class_name StaminaSystem
  3.  
  4. enum StaminaType {
  5.     MOVEMENT,  # Для спринта и перекатов
  6.     DASH       # Для дэша
  7. }
  8.  
  9. # Настройки стамины движения
  10. @export var max_movement_stamina: float = 100.0
  11. @export var movement_regeneration_rate: float = 20.0  # Стамины в секунду
  12. @export var movement_regeneration_delay: float = 1.0  # Задержка после использования
  13.  
  14. # Настройки стамины дэша
  15. @export var max_dash_stamina: float = 100.0
  16. @export var dash_regeneration_rate: float = 15.0
  17. @export var dash_regeneration_delay: float = 2.0
  18.  
  19. # Текущие значения
  20. var current_movement_stamina: float
  21. var current_dash_stamina: float
  22. var last_movement_use_time: float = 0.0
  23. var last_dash_use_time: float = 0.0
  24.  
  25. # Сигналы
  26. signal stamina_changed(movement_stamina: float, dash_stamina: float)
  27. signal movement_stamina_depleted
  28. signal dash_stamina_depleted
  29. signal stamina_used(amount: float, type: StaminaType)
  30. signal stamina_restored(amount: float, type: StaminaType)
  31.  
  32. func _ready():
  33.     current_movement_stamina = max_movement_stamina
  34.     current_dash_stamina = max_dash_stamina
  35.     stamina_changed.emit(current_movement_stamina, current_dash_stamina)
  36.  
  37. func _process(delta):
  38.     # Регенерация стамины движения
  39.     if should_regenerate_movement():
  40.         regenerate_stamina(delta, StaminaType.MOVEMENT)
  41.    
  42.     # Регенерация стамины дэша
  43.     if should_regenerate_dash():
  44.         regenerate_stamina(delta, StaminaType.DASH)
  45.  
  46. func use_stamina(amount: float, type: StaminaType) -> bool:
  47.     var current_stamina = get_current_stamina(type)
  48.    
  49.     if current_stamina < amount:
  50.         return false
  51.    
  52.     match type:
  53.         StaminaType.MOVEMENT:
  54.             current_movement_stamina -= amount
  55.             current_movement_stamina = max(current_movement_stamina, 0)
  56.             last_movement_use_time = Time.get_ticks_msec() / 1000.0
  57.             if current_movement_stamina <= 0:
  58.                 movement_stamina_depleted.emit()
  59.        
  60.         StaminaType.DASH:
  61.             current_dash_stamina -= amount
  62.             current_dash_stamina = max(current_dash_stamina, 0)
  63.             last_dash_use_time = Time.get_ticks_msec() / 1000.0
  64.             if current_dash_stamina <= 0:
  65.                 dash_stamina_depleted.emit()
  66.    
  67.     stamina_used.emit(amount, type)
  68.     stamina_changed.emit(current_movement_stamina, current_dash_stamina)
  69.     return true
  70.  
  71. func restore_stamina(amount: float, type: StaminaType) -> float:
  72.     var max_stamina = get_max_stamina(type)
  73.     var current_stamina = get_current_stamina(type)
  74.    
  75.     var old_stamina = current_stamina
  76.     var new_stamina = min(current_stamina + amount, max_stamina)
  77.     var actual_restore = new_stamina - old_stamina
  78.    
  79.     match type:
  80.         StaminaType.MOVEMENT:
  81.             current_movement_stamina = new_stamina
  82.         StaminaType.DASH:
  83.             current_dash_stamina = new_stamina
  84.    
  85.     if actual_restore > 0:
  86.         stamina_restored.emit(actual_restore, type)
  87.         stamina_changed.emit(current_movement_stamina, current_dash_stamina)
  88.    
  89.     return actual_restore
  90.  
  91. func can_use_stamina(amount: float, type: StaminaType) -> bool:
  92.     return get_current_stamina(type) >= amount
  93.  
  94. func get_current_stamina(type: StaminaType) -> float:
  95.     match type:
  96.         StaminaType.MOVEMENT:
  97.             return current_movement_stamina
  98.         StaminaType.DASH:
  99.             return current_dash_stamina
  100.         _:
  101.             return 0.0
  102.  
  103. func get_max_stamina(type: StaminaType) -> float:
  104.     match type:
  105.         StaminaType.MOVEMENT:
  106.             return max_movement_stamina
  107.         StaminaType.DASH:
  108.             return max_dash_stamina
  109.         _:
  110.             return 0.0
  111.  
  112. func get_stamina_percentage(type: StaminaType) -> float:
  113.     var max_stamina = get_max_stamina(type)
  114.     if max_stamina <= 0:
  115.         return 0.0
  116.     return get_current_stamina(type) / max_stamina
  117.  
  118. func is_stamina_full(type: StaminaType) -> bool:
  119.     return get_current_stamina(type) >= get_max_stamina(type)
  120.  
  121. func is_stamina_empty(type: StaminaType) -> bool:
  122.     return get_current_stamina(type) <= 0
  123.  
  124. # Система регенерации
  125. func should_regenerate_movement() -> bool:
  126.     return (movement_regeneration_rate > 0 and
  127.             not is_stamina_full(StaminaType.MOVEMENT) and
  128.             Time.get_ticks_msec() / 1000.0 - last_movement_use_time >= movement_regeneration_delay)
  129.  
  130. func should_regenerate_dash() -> bool:
  131.     return (dash_regeneration_rate > 0 and
  132.             not is_stamina_full(StaminaType.DASH) and
  133.             Time.get_ticks_msec() / 1000.0 - last_dash_use_time >= dash_regeneration_delay)
  134.  
  135. func regenerate_stamina(delta: float, type: StaminaType):
  136.     var regen_rate = 0.0
  137.     match type:
  138.         StaminaType.MOVEMENT:
  139.             regen_rate = movement_regeneration_rate
  140.         StaminaType.DASH:
  141.             regen_rate = dash_regeneration_rate
  142.    
  143.     var regen_amount = regen_rate * delta
  144.     restore_stamina(regen_amount, type)
  145.  
  146. # Настройки стамины
  147. func set_max_stamina(new_max: float, type: StaminaType, restore_to_full: bool = false):
  148.     match type:
  149.         StaminaType.MOVEMENT:
  150.             var percentage = get_stamina_percentage(type) if not restore_to_full else 1.0
  151.             max_movement_stamina = max(new_max, 1.0)
  152.             current_movement_stamina = max_movement_stamina * percentage
  153.        
  154.         StaminaType.DASH:
  155.             var percentage = get_stamina_percentage(type) if not restore_to_full else 1.0
  156.             max_dash_stamina = max(new_max, 1.0)
  157.             current_dash_stamina = max_dash_stamina * percentage
  158.    
  159.     stamina_changed.emit(current_movement_stamina, current_dash_stamina)
  160.  
  161. func set_regeneration_rate(new_rate: float, type: StaminaType):
  162.     match type:
  163.         StaminaType.MOVEMENT:
  164.             movement_regeneration_rate = new_rate
  165.         StaminaType.DASH:
  166.             dash_regeneration_rate = new_rate
  167.  
  168. func set_regeneration_delay(new_delay: float, type: StaminaType):
  169.     match type:
  170.         StaminaType.MOVEMENT:
  171.             movement_regeneration_delay = new_delay
  172.         StaminaType.DASH:
  173.             dash_regeneration_delay = new_delay
  174.  
  175. func restore_all_to_full():
  176.     current_movement_stamina = max_movement_stamina
  177.     current_dash_stamina = max_dash_stamina
  178.     stamina_changed.emit(current_movement_stamina, current_dash_stamina)
  179.  
  180. func drain_all():
  181.     current_movement_stamina = 0
  182.     current_dash_stamina = 0
  183.     stamina_changed.emit(current_movement_stamina, current_dash_stamina)
  184.     movement_stamina_depleted.emit()
  185.     dash_stamina_depleted.emit()
  186.  
  187. # Временные модификаторы (для будущих статусных эффектов)
  188. var stamina_modifiers: Dictionary = {}
  189.  
  190. func add_stamina_modifier(id: String, movement_multiplier: float, dash_multiplier: float, duration: float = -1):
  191.     stamina_modifiers[id] = {
  192.         "movement_mult": movement_multiplier,
  193.         "dash_mult": dash_multiplier,
  194.         "duration": duration,
  195.         "start_time": Time.get_ticks_msec() / 1000.0
  196.     }
  197.  
  198. func remove_stamina_modifier(id: String):
  199.     stamina_modifiers.erase(id)
  200.  
  201. func get_modified_regeneration_rate(type: StaminaType) -> float:
  202.     var base_rate = movement_regeneration_rate if type == StaminaType.MOVEMENT else dash_regeneration_rate
  203.     var multiplier = 1.0
  204.    
  205.     for modifier_id in stamina_modifiers:
  206.         var modifier = stamina_modifiers[modifier_id]
  207.         if modifier.duration > 0 and Time.get_ticks_msec() / 1000.0 - modifier.start_time > modifier.duration:
  208.             stamina_modifiers.erase(modifier_id)
  209.             continue
  210.        
  211.         if type == StaminaType.MOVEMENT:
  212.             multiplier *= modifier.movement_mult
  213.         else:
  214.             multiplier *= modifier.dash_mult
  215.    
  216.     return base_rate * multiplier
  217.  
  218. # Сохранение/загрузка
  219. func get_save_data() -> Dictionary:
  220.     return {
  221.         "current_movement_stamina": current_movement_stamina,
  222.         "current_dash_stamina": current_dash_stamina,
  223.         "max_movement_stamina": max_movement_stamina,
  224.         "max_dash_stamina": max_dash_stamina,
  225.         "movement_regeneration_rate": movement_regeneration_rate,
  226.         "dash_regeneration_rate": dash_regeneration_rate
  227.     }
  228.  
  229. func load_save_data(data: Dictionary):
  230.     current_movement_stamina = data.get("current_movement_stamina", max_movement_stamina)
  231.     current_dash_stamina = data.get("current_dash_stamina", max_dash_stamina)
  232.     max_movement_stamina = data.get("max_movement_stamina", 100.0)
  233.     max_dash_stamina = data.get("max_dash_stamina", 100.0)
  234.     movement_regeneration_rate = data.get("movement_regeneration_rate", 20.0)
  235.     dash_regeneration_rate = data.get("dash_regeneration_rate", 15.0)
  236.     stamina_changed.emit(current_movement_stamina, current_dash_stamina)
Advertisement
Add Comment
Please, Sign In to add comment