[Freeciv-Dev] (PR#9490) Patch: Background "mood" music
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: |
undisclosed-recipients: ; |
Subject: |
[Freeciv-Dev] (PR#9490) Patch: Background "mood" music |
From: |
"Gregory Richards" <akaquinn@xxxxxxxxxxx> |
Date: |
Sat, 24 Jul 2004 17:59:34 -0700 |
Reply-to: |
rt@xxxxxxxxxxx |
<URL: http://rt.freeciv.org/Ticket/Display.html?id=9490 >
Thanks to vasc for helping me out with that, I didn't realize that the
iterate macros also initialized the variable.
diff -ruN -X freeciv-cvs-Jul-23/diff_ignore freeciv-cvs-Jul-23/client/audio.c
freeciv-cvs-Jul-23-music/client/audio.c
--- freeciv-cvs-Jul-23/client/audio.c 2004-04-19 22:14:21.000000000 -0700
+++ freeciv-cvs-Jul-23-music/client/audio.c 2004-07-24 18:02:35.000000000
-0700
@@ -1,4 +1,4 @@
-/**********************************************************************
+/**********************************************************************
Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -27,6 +27,11 @@
#include "registry.h"
#include "shared.h"
#include "support.h"
+#include "game.h"
+#include "player.h"
+#include "unit.h"
+#include "map.h"
+#include "unistd.h"
#ifdef AMIGA
#include "audio_amiga.h"
@@ -56,6 +61,7 @@
static struct audio_plugin plugins[MAX_NUM_PLUGINS];
static int num_plugins_used = 0;
static int selected_plugin = -1;
+static const char *curmusic;
/**********************************************************************
Returns a static, NULL-terminated list of all sound plugins
@@ -66,7 +72,7 @@
{
static const char* plugin_list[MAX_NUM_PLUGINS + 1];
int i;
-
+
for (i = 0; i < num_plugins_used; i++) {
plugin_list[i] = plugins[i].name;
}
@@ -277,7 +283,7 @@
}
#ifdef ESD
- if (audio_select_plugin("esd")) return;
+ if (audio_select_plugin("esd")) return;
#endif
#ifdef SDL
if (audio_select_plugin("sdl")) return;
@@ -354,10 +360,21 @@
freelog(LOG_DEBUG, "audio_play_music('%s', '%s')", tag, pretty_alt_tag);
- /* try playing primary tag first, if not go to alternative tag */
- if (!audio_play_tag(tag, TRUE) && !audio_play_tag(alt_tag, TRUE)) {
- freelog(LOG_VERBOSE, "Neither of tags %s or %s found", tag,
- pretty_alt_tag);
+ if (!curmusic || strcmp(curmusic, tag)) {
+ if (audio_play_tag(tag, TRUE)) {
+ curmusic = tag;
+ return;
+ }
+
+ if (!curmusic || strcmp(curmusic, alt_tag)) {
+ if (audio_play_tag(alt_tag, TRUE)) {
+ curmusic = alt_tag;
+ return;
+ }
+
+ freelog(LOG_VERBOSE, "Neither of tags %s or %s found", tag,
+ pretty_alt_tag);
+ }
}
}
@@ -407,3 +424,71 @@
sz_strlcat(buffer, "]");
return buffer;
}
+
+/**************************************************************************
+ This is merely a wrapper for mood_music (below)
+**************************************************************************/
+void bg_mood_music_callback(struct client_option *option)
+{
+ if (!option->p_bool_value) return;
+ if (*(option->p_bool_value) == TRUE) {
+ bg_mood_music = TRUE;
+ mood_music();
+ } else {
+ curmusic = NULL;
+ audio_stop();
+ }
+}
+
+/**************************************************************************
+ Sets the audio according to the "mood" of the game
+**************************************************************************/
+void mood_music()
+{
+ struct player *pplayer = game.player_ptr;
+ int offensive = 0;
+ int defensive = 0;
+
+ /* ESD does not stop music, and having many playing at once is bad at best */
+ if (selected_plugin == -1) return;
+ if (!strcmp(plugins[selected_plugin].name, "esd") || !bg_mood_music) return;
+
+ /* 1) Are we at the beginning of the game? */
+ if (game.turn <= 5) {
+ audio_play_music("music_begin", "music_ambient");
+ return;
+ }
+
+ /* 2) Get number of units in enemy war zones and number of enemy units in
our zone */
+ /* A) Iterate through all players, seek out enemies, and find if they have
people in our zone */
+ players_iterate(cplayer) {
+ if (pplayers_at_war(pplayer, cplayer)) {
+ unit_list_iterate(cplayer->units, punit) {
+ if (map_get_owner(punit->x, punit->y) == pplayer &&
is_military_unit(punit)) {
+ defensive++;
+ }
+ } unit_list_iterate_end
+ }
+ } players_iterate_end
+
+ /* B) Iterate through own units, and find if they're in enemy positions */
+ unit_list_iterate(pplayer->units, punit) {
+ if (map_get_owner(punit->x, punit->y)) {
+ if (pplayers_at_war(map_get_owner(punit->x, punit->y), pplayer) &&
is_military_unit(punit)) {
+ offensive++;
+ }
+ }
+ } unit_list_iterate_end
+
+ /* C) Choose whether to do offensive/defensive or ambient music */
+ if (offensive > 0 || defensive > 0) {
+ if (defensive > offensive) {
+ audio_play_music("music_defense", "music_ambient");
+ } else {
+ audio_play_music("music_offense", "music_ambient");
+ }
+ return;
+ }
+
+ audio_play_music("music_ambient", NULL);
+}
diff -ruN -X freeciv-cvs-Jul-23/diff_ignore freeciv-cvs-Jul-23/client/audio.h
freeciv-cvs-Jul-23-music/client/audio.h
--- freeciv-cvs-Jul-23/client/audio.h 2002-11-01 10:11:42.000000000 -0800
+++ freeciv-cvs-Jul-23-music/client/audio.h 2004-07-24 17:49:35.000000000
-0700
@@ -1,4 +1,4 @@
-/**********************************************************************
+/**********************************************************************
Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -14,6 +14,7 @@
#define FC__AUDIO_H
#include "shared.h" /* bool type */
+#include "options.h"
#define MAX_AUDIO_NAME_LEN 20
#define MAX_AUDIO_DESCR_LEN 200
@@ -44,4 +45,7 @@
bool audio_select_plugin(const char *const name);
const char *audio_get_all_plugin_names(void);
+void mood_music(void);
+void bg_mood_music_callback(struct client_option *option);
+
#endif /* FC__AUDIO_H */
diff -ruN -X freeciv-cvs-Jul-23/diff_ignore freeciv-cvs-Jul-23/client/options.c
freeciv-cvs-Jul-23-music/client/options.c
--- freeciv-cvs-Jul-23/client/options.c 2004-07-20 22:14:34.000000000 -0700
+++ freeciv-cvs-Jul-23-music/client/options.c 2004-07-24 17:49:35.000000000
-0700
@@ -1,4 +1,4 @@
-/**********************************************************************
+/**********************************************************************
Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -72,6 +72,7 @@
bool popup_new_cities = TRUE;
bool keyboardless_goto = TRUE;
bool show_task_icons = TRUE;
+bool bg_mood_music = TRUE;
/* This option is currently set by the client - not by the user. */
bool update_city_text_in_refresh_tile = TRUE;
@@ -107,6 +108,7 @@
GEN_BOOL_OPTION(auto_turn_done, N_("End Turn when done moving")),
GEN_BOOL_OPTION(ask_city_name, N_("Prompt for city names")),
GEN_BOOL_OPTION(popup_new_cities, N_("Pop up city dialog for new
cities")),
+ GEN_BOOL_OPTION_CALLBACK(bg_mood_music, N_("Background music"),
bg_mood_music_callback)
};
#undef GEN_INT_OPTION
#undef GEN_BOOL_OPTION
diff -ruN -X freeciv-cvs-Jul-23/diff_ignore freeciv-cvs-Jul-23/client/options.h
freeciv-cvs-Jul-23-music/client/options.h
--- freeciv-cvs-Jul-23/client/options.h 2004-04-05 12:04:08.000000000 -0700
+++ freeciv-cvs-Jul-23-music/client/options.h 2004-07-24 17:49:59.000000000
-0700
@@ -1,4 +1,4 @@
-/**********************************************************************
+/**********************************************************************
Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -47,6 +47,7 @@
extern bool update_city_text_in_refresh_tile;
extern bool keyboardless_goto;
extern bool show_task_icons;
+extern bool bg_mood_music;
enum client_option_type {
COT_BOOL,
@@ -81,6 +82,9 @@
#define GEN_BOOL_OPTION(oname, desc) { #oname, desc, COT_BOOL, \
NULL, &oname, NULL, 0, NULL, \
NULL, NULL }
+#define GEN_BOOL_OPTION_CALLBACK(oname, desc, callback) { #oname, desc,
COT_BOOL, \
+ NULL, &oname, NULL, 0, callback, \
+ NULL, NULL }
#define GEN_STR_OPTION(oname, desc, str_defaults, callback) \
{ #oname, desc, COT_STR, \
NULL, NULL, oname, sizeof(oname), \
diff -ruN -X freeciv-cvs-Jul-23/diff_ignore
freeciv-cvs-Jul-23/client/packhand.c freeciv-cvs-Jul-23-music/client/packhand.c
--- freeciv-cvs-Jul-23/client/packhand.c 2004-07-20 22:14:34.000000000
-0700
+++ freeciv-cvs-Jul-23-music/client/packhand.c 2004-07-24 17:49:35.000000000
-0700
@@ -1,4 +1,4 @@
-/**********************************************************************
+/**********************************************************************
Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -834,6 +834,8 @@
if(game.player_ptr->ai.control && !ai_manual_turn_done) {
user_ended_turn();
}
+
+ mood_music();
}
/**************************************************************************
- [Freeciv-Dev] (PR#9490) Patch: Background "mood" music, (continued)
- [Freeciv-Dev] (PR#9490) Patch: Background "mood" music, Gregory Richards, 2004/07/24
- [Freeciv-Dev] (PR#9490) Patch: Background "mood" music, Gregory Richards, 2004/07/24
- [Freeciv-Dev] (PR#9490) Patch: Background "mood" music, Mateusz Stefek, 2004/07/24
- [Freeciv-Dev] (PR#9490) Patch: Background "mood" music, Gregory Richards, 2004/07/24
- [Freeciv-Dev] (PR#9490) Patch: Background "mood" music, Gregory Richards, 2004/07/24
- [Freeciv-Dev] (PR#9490) Patch: Background "mood" music, Gregory Richards, 2004/07/24
- [Freeciv-Dev] (PR#9490) Patch: Background "mood" music, Gregory Richards, 2004/07/24
- [Freeciv-Dev] (PR#9490) Patch: Background "mood" music, Mateusz Stefek, 2004/07/24
|
|