summaryrefslogtreecommitdiff
path: root/src/newgrf_generic.cpp
diff options
context:
space:
mode:
authormichi_cc <michi_cc@openttd.org>2011-11-04 21:05:08 +0000
committermichi_cc <michi_cc@openttd.org>2011-11-04 21:05:08 +0000
commit707b0f48e6b4d886a7e744802096a56a5a097e3e (patch)
tree8d41f1903db127cafe30a1d8462aa7979e6d1d2e /src/newgrf_generic.cpp
parenta471a20491a0253125ca1f24c44879371d8d950e (diff)
downloadopenttd-707b0f48e6b4d886a7e744802096a56a5a097e3e.tar.xz
(svn r23114) -Feature: [NewGRF] Ambient sound effect callback.
Diffstat (limited to 'src/newgrf_generic.cpp')
-rw-r--r--src/newgrf_generic.cpp46
1 files changed, 43 insertions, 3 deletions
diff --git a/src/newgrf_generic.cpp b/src/newgrf_generic.cpp
index abf2461dd..0c57a0ef4 100644
--- a/src/newgrf_generic.cpp
+++ b/src/newgrf_generic.cpp
@@ -15,6 +15,9 @@
#include "newgrf_spritegroup.h"
#include "industrytype.h"
#include "core/bitmath_func.hpp"
+#include "core/random_func.hpp"
+#include "tile_map.h"
+#include "newgrf_sound.h"
#include <list>
@@ -84,6 +87,14 @@ static void GenericCallbackSetTriggers(const ResolverObject *object, int trigger
static uint32 GenericCallbackGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
{
+ DEBUG(grf, 1, "Unhandled generic feature variable 0x%02X", variable);
+
+ *available = false;
+ return UINT_MAX;
+}
+
+static uint32 GenericAiCallbackGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
+{
switch (variable) {
case 0x40: return object->grffile->cargo_map[object->u.generic.cargo_type];
@@ -115,12 +126,12 @@ static const SpriteGroup *GenericCallbackResolveReal(const ResolverObject *objec
}
-static inline void NewGenericResolver(ResolverObject *res)
+static inline void NewGenericResolver(ResolverObject *res, bool ai_callback)
{
res->GetRandomBits = &GenericCallbackGetRandomBits;
res->GetTriggers = &GenericCallbackGetTriggers;
res->SetTriggers = &GenericCallbackSetTriggers;
- res->GetVariable = &GenericCallbackGetVariable;
+ res->GetVariable = ai_callback ? &GenericAiCallbackGetVariable : &GenericCallbackGetVariable;
res->ResolveReal = &GenericCallbackResolveReal;
res->callback = CBID_NO_CALLBACK;
@@ -181,7 +192,7 @@ uint16 GetAiPurchaseCallbackResult(uint8 feature, CargoID cargo_type, uint8 defa
{
ResolverObject object;
- NewGenericResolver(&object);
+ NewGenericResolver(&object, true);
if (src_industry != IT_AI_UNKNOWN && src_industry != IT_AI_TOWN) {
const IndustrySpec *is = GetIndustrySpec(src_industry);
@@ -209,3 +220,32 @@ uint16 GetAiPurchaseCallbackResult(uint8 feature, CargoID cargo_type, uint8 defa
if (callback != CALLBACK_FAILED) callback = GB(callback, 0, 8);
return callback;
}
+
+
+/**
+ * 'Execute' the ambient sound effect callback.
+ * @param tile Tile the sound effect should be generated for.
+ */
+void AmbientSoundEffectCallback(TileIndex tile)
+{
+ assert(IsTileType(tile, MP_CLEAR) || IsTileType(tile, MP_TREES) || IsTileType(tile, MP_WATER));
+
+ /* Only run callback if enabled. */
+ if (!HasGrfMiscBit(GMB_AMBIENT_SOUND_CALLBACK)) return;
+ /* Only run every 1/200-th time. */
+ uint32 r; // Save for later
+ if (!Chance16R(1, 200, r)) return;
+
+ ResolverObject object;
+
+ /* Prepare resolver object. */
+ NewGenericResolver(&object, false);
+ object.callback = CBID_SOUNDS_AMBIENT_EFFECT;
+ object.callback_param1 = GetTileType(tile) << 28 | TileHeight(tile) << 24 | GB(r, 16, 8) << 16 | GetTerrainType(tile);
+
+ /* Run callback. */
+ const GRFFile *grf_file;
+ uint16 callback = GetGenericCallbackResult(GSF_SOUNDFX, &object, &grf_file);
+
+ if (callback != CALLBACK_FAILED) PlayTileSound(grf_file, callback, tile);
+}