Repository navigation
Expand file tree
/
Copy pathapi_client.py
More file actions
100 lines (87 loc) · 3 KB
/
Copy pathapi_client.py
File metadata and controls
100 lines (87 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
"""
api_client.py — Cliente de API externa (Open-Meteo).
El clima real afecta al daño de las habilidades especiales durante el combate.
"""
import requests
BASE_URL = "https://api.open-meteo.com/v1/forecast"
def obtener_clima_actual(latitud=40.4168, longitud=-3.7038):
"""
Obtiene el clima actual para una ubicación (por defecto Madrid).
Devuelve dict con temperatura, código de clima y descripción.
"""
params = {
"latitude": latitud,
"longitude": longitud,
"current_weather": True
}
try:
response = requests.get(BASE_URL, params=params, timeout=5)
response.raise_for_status()
data = response.json()
clima = data["current_weather"]
return {
"temperatura": clima["temperature"],
"codigo": clima["weathercode"],
"velocidad_viento": clima["windspeed"],
"descripcion": interpretar_codigo(clima["weathercode"])
}
except Exception as e:
print(f"⚠️ API no disponible: {e}")
return None
def interpretar_codigo(codigo):
"""Interpreta el código WMO del clima en una descripción legible."""
if codigo == 0:
return "despejado"
elif codigo in [1, 2, 3]:
return "nublado"
elif codigo in range(51, 68):
return "lluvia"
elif codigo in range(71, 78):
return "nieve"
elif codigo in range(95, 100):
return "tormenta"
return "desconocido"
def modificador_clima(clima):
"""
Devuelve un modificador de daño basado en el clima actual.
Se aplica a las habilidades especiales durante el combate.
"""
if clima is None:
return 1.0
desc = clima["descripcion"]
modificadores = {
"tormenta": 1.30, # +30% daño en tormenta
"lluvia": 0.85, # -15% daño en lluvia
"nieve": 0.90, # -10% en nieve
"despejado": 1.10, # +10% en día despejado
"nublado": 1.00 # sin modificador
}
return modificadores.get(desc, 1.0)
def describir_clima(clima):
"""Genera una descripción legible del clima y su efecto en combate."""
if clima is None:
return "🌐 No se pudo obtener el clima. Sin modificadores de combate."
emojis = {
"despejado": "☀️",
"nublado": "☁️",
"lluvia": "🌧️",
"nieve": "❄️",
"tormenta": "🌩️",
"desconocido": "🌐"
}
emoji = emojis.get(clima["descripcion"], "🌐")
mod = modificador_clima(clima)
temp = clima["temperatura"]
viento = clima["velocidad_viento"]
efecto = ""
if mod > 1.0:
efecto = f"Las habilidades hacen +{int((mod - 1) * 100)}% de daño."
elif mod < 1.0:
efecto = f"Las habilidades hacen -{int((1 - mod) * 100)}% de daño."
else:
efecto = "Sin modificadores de combate."
return (
f"{emoji} Clima actual: {clima['descripcion'].capitalize()}\n"
f" 🌡️ Temperatura: {temp}°C | 💨 Viento: {viento} km/h\n"
f" ⚔️ {efecto}"
)