weather coord events

This commit is contained in:
cawtds
2024-11-18 14:43:49 +01:00
parent 1c0e0c3e4a
commit 633a2d313e
2 changed files with 105 additions and 37 deletions

View File

@@ -78,7 +78,6 @@
.endm
@ Defines a weather coord event for map data. Any coord event is treated as a weather coord event if its script is NULL.
@ NOTE: In FRLG, the weather handling functions are dummied out. See src/coord_event_weather.c
.macro coord_weather_event x:req, y:req, elevation:req, weather:req
coord_event \x, \y, \elevation, \weather, 0, NULL
.endm

View File

@@ -1,48 +1,117 @@
#include "global.h"
#include "field_weather.h"
#include "constants/weather.h"
// These were all dummied out because it's always sunny in Viridian
void WeatherCoordEvent_SunnyClouds(void) {}
void WeatherCoordEvent_Sunny(void) {}
void WeatherCoordEvent_Rain(void) {}
void WeatherCoordEvent_Snow(void) {}
void WeatherCoordEvent_RainThunderstorm(void) {}
void WeatherCoordEvent_FogHorizontal(void) {}
void WeatherCoordEvent_VolcanicAsh(void) {}
void WeatherCoordEvent_Sandstorm(void) {}
void WeatherCoordEvent_FogDiagonal(void) {}
void WeatherCoordEvent_Underwater(void) {}
void WeatherCoordEvent_Shade(void) {}
void WeatherCoordEvent_Route119Cycle(void) {}
void WeatherCoordEvent_Route123Cycle(void) {}
static struct {
u8 weatherId;
void (*callback)(void);
} const sWeatherCoordEventFuncs[] = {
{WEATHER_SUNNY_CLOUDS, WeatherCoordEvent_SunnyClouds },
{WEATHER_SUNNY, WeatherCoordEvent_Sunny },
{WEATHER_RAIN, WeatherCoordEvent_Rain },
{WEATHER_SNOW, WeatherCoordEvent_Snow },
{WEATHER_RAIN_THUNDERSTORM, WeatherCoordEvent_RainThunderstorm},
{WEATHER_FOG_HORIZONTAL, WeatherCoordEvent_FogHorizontal },
{WEATHER_VOLCANIC_ASH, WeatherCoordEvent_VolcanicAsh },
{WEATHER_SANDSTORM, WeatherCoordEvent_Sandstorm },
{WEATHER_FOG_DIAGONAL, WeatherCoordEvent_FogDiagonal },
{WEATHER_UNDERWATER, WeatherCoordEvent_Underwater },
{WEATHER_SHADE, WeatherCoordEvent_Shade },
{WEATHER_ROUTE119_CYCLE, WeatherCoordEvent_Route119Cycle },
{WEATHER_ROUTE123_CYCLE, WeatherCoordEvent_Route123Cycle }
struct CoordEventWeather
{
u8 coordEventWeather;
void (*func)(void);
};
void DoCoordEventWeather(u8 weatherId)
static void CoordEventWeather_Clouds(void);
static void CoordEventWeather_Sunny(void);
static void CoordEventWeather_Rain(void);
static void CoordEventWeather_Snow(void);
static void CoordEventWeather_Thunderstorm(void);
static void CoordEventWeather_HorizontalFog(void);
static void CoordEventWeather_DiagonalFog(void);
static void CoordEventWeather_Ash(void);
static void CoordEventWeather_Sandstorm(void);
static void CoordEventWeather_Shade(void);
static void CoordEventWeather_Drought(void);
static void CoordEventWeather_Route119Cycle(void);
static void CoordEventWeather_Route123Cycle(void);
static const struct CoordEventWeather sCoordEventWeatherFuncs[] =
{
{ COORD_EVENT_WEATHER_SUNNY_CLOUDS, CoordEventWeather_Clouds },
{ COORD_EVENT_WEATHER_SUNNY, CoordEventWeather_Sunny },
{ COORD_EVENT_WEATHER_RAIN, CoordEventWeather_Rain },
{ COORD_EVENT_WEATHER_SNOW, CoordEventWeather_Snow },
{ COORD_EVENT_WEATHER_RAIN_THUNDERSTORM, CoordEventWeather_Thunderstorm },
{ COORD_EVENT_WEATHER_FOG_HORIZONTAL, CoordEventWeather_HorizontalFog },
{ COORD_EVENT_WEATHER_FOG_DIAGONAL, CoordEventWeather_DiagonalFog },
{ COORD_EVENT_WEATHER_VOLCANIC_ASH, CoordEventWeather_Ash },
{ COORD_EVENT_WEATHER_SANDSTORM, CoordEventWeather_Sandstorm },
{ COORD_EVENT_WEATHER_SHADE, CoordEventWeather_Shade },
{ COORD_EVENT_WEATHER_DROUGHT, CoordEventWeather_Drought },
{ COORD_EVENT_WEATHER_ROUTE119_CYCLE, CoordEventWeather_Route119Cycle },
{ COORD_EVENT_WEATHER_ROUTE123_CYCLE, CoordEventWeather_Route123Cycle },
};
static void CoordEventWeather_Clouds(void)
{
SetWeather(WEATHER_SUNNY_CLOUDS);
}
static void CoordEventWeather_Sunny(void)
{
SetWeather(WEATHER_SUNNY);
}
static void CoordEventWeather_Rain(void)
{
SetWeather(WEATHER_RAIN);
}
static void CoordEventWeather_Snow(void)
{
SetWeather(WEATHER_SNOW);
}
static void CoordEventWeather_Thunderstorm(void)
{
SetWeather(WEATHER_RAIN_THUNDERSTORM);
}
static void CoordEventWeather_HorizontalFog(void)
{
SetWeather(WEATHER_FOG_HORIZONTAL);
}
static void CoordEventWeather_DiagonalFog(void)
{
SetWeather(WEATHER_FOG_DIAGONAL);
}
static void CoordEventWeather_Ash(void)
{
SetWeather(WEATHER_VOLCANIC_ASH);
}
static void CoordEventWeather_Sandstorm(void)
{
SetWeather(WEATHER_SANDSTORM);
}
static void CoordEventWeather_Shade(void)
{
SetWeather(WEATHER_SHADE);
}
static void CoordEventWeather_Drought(void)
{
SetWeather(WEATHER_DROUGHT);
}
static void CoordEventWeather_Route119Cycle(void)
{
SetWeather(WEATHER_ROUTE119_CYCLE);
}
static void CoordEventWeather_Route123Cycle(void)
{
SetWeather(WEATHER_ROUTE123_CYCLE);
}
void DoCoordEventWeather(u8 coordEventWeather)
{
u8 i;
for (i = 0; i < NELEMS(sWeatherCoordEventFuncs); i++)
for (i = 0; i < ARRAY_COUNT(sCoordEventWeatherFuncs); i++)
{
if (sWeatherCoordEventFuncs[i].weatherId == weatherId)
if (sCoordEventWeatherFuncs[i].coordEventWeather == coordEventWeather)
{
sWeatherCoordEventFuncs[i].callback();
sCoordEventWeatherFuncs[i].func();
return;
}
}