57
59
const struct ft_color color,
58
60
const char *format, va_list vargs)
60
RETURN_IF_FAIL(NULL != packet);
62
fc_assert_ret(NULL != packet);
64
packet->tile = (NULL != ptile ? tile_index(ptile) : -1);
69
65
packet->event = event;
70
66
packet->conn_id = pconn ? pconn->id : -1;
73
69
/* A color is requested. */
74
70
char buf[MAX_LEN_MSG];
76
my_vsnprintf(buf, sizeof(buf), format, vargs);
72
fc_vsnprintf(buf, sizeof(buf), format, vargs);
77
73
featured_text_apply_tag(buf, packet->message, sizeof(packet->message),
78
74
TTT_COLOR, 0, FT_OFFSET_UNSET, color);
81
my_vsnprintf(packet->message, sizeof(packet->message), format, vargs);
77
fc_vsnprintf(packet->message, sizeof(packet->message), format, vargs);
186
182
const struct packet_chat_msg *packet)
188
184
struct packet_chat_msg real_packet = *packet;
185
int tile = packet->tile;
186
struct tile *ptile = index_to_tile(tile);
192
189
dest = game.est_connections;
195
if (is_normal_map_pos(packet->x, packet->y)) {
196
ptile = map_pos_to_tile(packet->x, packet->y);
201
192
conn_list_iterate(dest, pconn) {
202
193
/* Avoid sending messages that could potentially reveal
203
194
* internal information about the server machine to
212
203
&& ((NULL == pconn->playing && pconn->observer)
213
204
|| (NULL != pconn->playing
214
205
&& map_is_known(ptile, pconn->playing)))) {
215
/* coordinates are OK; see above */
216
real_packet.x = ptile->x;
217
real_packet.y = ptile->y;
206
/* tile info is OK; see above. */
207
/* FIXME: in the case this is a city event, we should check if the
208
* city is really known. */
209
real_packet.tile = tile;
220
assert(S_S_RUNNING > server_state() || !is_normal_map_pos(-1, -1));
212
real_packet.tile = -1;
225
215
send_packet_chat_msg(pconn, &real_packet);
370
360
struct packet_chat_msg genmsg;
371
361
struct event_cache_players *players = NULL;
373
struct player_research *research = get_player_research(pplayer);
363
struct player_research *research = player_research_get(pplayer);
375
365
va_start(args, format);
376
366
vpackage_event(&genmsg, NULL, event, color, format, args);
379
369
players_iterate(other_player) {
380
if (get_player_research(other_player) == research) {
370
if (player_research_get(other_player) == research) {
381
371
lsend_packet_chat_msg(other_player->connections, &genmsg);
382
372
players = event_cache_player_add(players, other_player);
430
420
**************************************************************************/
431
421
static void event_cache_data_destroy(struct event_cache_data *pdata)
433
RETURN_IF_FAIL(NULL != event_cache);
434
RETURN_IF_FAIL(NULL != pdata);
423
fc_assert_ret(NULL != event_cache);
424
fc_assert_ret(NULL != pdata);
436
event_cache_data_list_unlink(event_cache, pdata);
426
event_cache_data_list_remove(event_cache, pdata);
458
RETURN_VAL_IF_FAIL(NULL != packet, NULL);
448
fc_assert_ret_val(NULL != packet, NULL);
460
450
if (packet->event == E_MESSAGE_WALL) {
461
451
/* No popups at save game load. */
516
506
event_cache_iterate(pdata) {
517
507
event_cache_data_destroy(pdata);
518
508
} event_cache_iterate_end;
519
event_cache_data_list_free(event_cache);
509
event_cache_data_list_destroy(event_cache);
520
510
event_cache = NULL;
522
512
event_cache_status = FALSE;
588
578
pdata = event_cache_data_new(packet, game.info.turn, time(NULL),
589
579
server_state(), ECT_PLAYERS, NULL);
590
RETURN_IF_FAIL(NULL != pdata);
580
fc_assert_ret(NULL != pdata);
591
581
BV_SET(pdata->target, player_index(pplayer));
696
686
strftime(timestr, sizeof(timestr), "%H:%M:%S",
697
687
localtime(&pdata->timestamp));
698
688
pcm = pdata->packet;
699
my_snprintf(pcm.message, sizeof(pcm.message), "(T%d - %s) %s",
689
fc_snprintf(pcm.message, sizeof(pcm.message), "(T%d - %s) %s",
700
690
pdata->turn, timestr, pdata->packet.message);
701
691
notify_conn_packet(pconn->self, &pcm);
715
705
enum event_cache_target target_type;
716
706
enum server_states server_status;
717
707
struct event_cache_players *players = NULL;
718
int i, turn, event_count;
708
int i, x, y, turn, event_count;
719
709
time_t timestamp, now;
720
710
const char *p, *q;
722
712
event_count = secfile_lookup_int_default(file, 0, "%s.count", section);
723
freelog(LOG_VERBOSE, "Saved events: %d.", event_count);
713
log_verbose("Saved events: %d.", event_count);
725
715
if (0 >= event_count) {
729
719
now = time(NULL);
730
720
for (i = 0; i < event_count; i++) {
731
721
/* restore packet */
732
packet.x = secfile_lookup_int_default(file, -1, "%s.events%d.x",
734
packet.y = secfile_lookup_int_default(file, -1, "%s.events%d.y",
722
x = secfile_lookup_int_default(file, -1, "%s.events%d.x", section, i);
723
y = secfile_lookup_int_default(file, -1, "%s.events%d.y", section, i);
724
packet.tile = (is_normal_map_pos(x, y) ? map_pos_to_index(x, y) : -1);
736
725
packet.conn_id = -1;
738
727
p = secfile_lookup_str(file, "%s.events%d.event", section, i);
740
freelog(LOG_ERROR, "[Event cache %4d] Missing event type.", i);
729
log_verbose("[Event cache %4d] Missing event type.", i);
743
packet.event = event_type_by_name(p, mystrcasecmp);
732
packet.event = event_type_by_name(p, fc_strcasecmp);
744
733
if (!event_type_is_valid(packet.event)) {
745
freelog(LOG_ERROR, "[Event cache %4d] Not supported event type: %s",
734
log_verbose("[Event cache %4d] Not supported event type: %s", i, p);
750
738
p = secfile_lookup_str(file, "%s.events%d.message", section, i);
752
freelog(LOG_ERROR, "[Event cache %4d] Missing message.", i);
740
log_verbose("[Event cache %4d] Missing message.", i);
755
743
sz_strlcpy(packet.message, p);
764
752
p = secfile_lookup_str(file, "%s.events%d.server_state", section, i);
766
freelog(LOG_ERROR, "[Event cache %4d] Missing server state info.", i);
754
log_verbose("[Event cache %4d] Missing server state info.", i);
769
server_status = server_states_by_name(p, mystrcasecmp);
757
server_status = server_states_by_name(p, fc_strcasecmp);
770
758
if (!server_states_is_valid(server_status)) {
771
freelog(LOG_ERROR, "[Event cache %4d] Server state no supported: %s",
759
log_verbose("[Event cache %4d] Server state no supported: %s", i, p);
776
763
p = secfile_lookup_str(file, "%s.events%d.target", section, i);
778
freelog(LOG_ERROR, "[Event cache %4d] Missing target info.", i);
765
log_verbose("[Event cache %4d] Missing target info.", i);
780
} else if (0 == mystrcasecmp(p, "All")) {
767
} else if (0 == fc_strcasecmp(p, "All")) {
781
768
target_type = ECT_ALL;
782
} else if (0 == mystrcasecmp(p, "Global Observers")) {
769
} else if (0 == fc_strcasecmp(p, "Global Observers")) {
783
770
target_type = ECT_GLOBAL_OBSERVERS;
785
772
bool valid = TRUE;
799
786
} players_iterate_end;
801
788
if (!valid && NULL == players) {
802
freelog(LOG_ERROR, "[Event cache %4d] invalid target bitmap: %s",
789
log_verbose("[Event cache %4d] invalid target bitmap: %s", i, p);
804
790
if (NULL != players) {
805
791
FC_FREE(players);
825
811
***************************************************************/
826
812
void event_cache_save(struct section_file *file, const char *section)
828
815
int event_count = 0;
829
char target[MAX_NUM_PLAYERS + MAX_NUM_BARBARIANS + 1];
816
char target[MAX_NUM_PLAYER_SLOTS + 1];
832
/* stop event logging; this way events from freelog() will not be added
819
/* stop event logging; this way events from log_*() will not be added
833
820
* to the event list while saving the event list */
834
821
event_cache_status = FALSE;
836
823
event_cache_iterate(pdata) {
824
ptile = index_to_tile(pdata->packet.tile);
837
825
secfile_insert_int(file, pdata->turn, "%s.events%d.turn",
838
826
section, event_count);
839
827
secfile_insert_int(file, pdata->timestamp, "%s.events%d.timestamp",
840
828
section, event_count);
841
secfile_insert_int(file, pdata->packet.x, "%s.events%d.x",
842
section, event_count);
843
secfile_insert_int(file, pdata->packet.y, "%s.events%d.y",
844
section, event_count);
829
secfile_insert_int(file, NULL != ptile ? ptile->x : -1,
830
"%s.events%d.x", section, event_count);
831
secfile_insert_int(file, NULL != ptile ? ptile->y : -1,
832
"%s.events%d.y", section, event_count);
845
833
secfile_insert_str(file, server_states_name(pdata->server_state),
846
834
"%s.events%d.server_state", section, event_count);
847
835
secfile_insert_str(file, event_type_name(pdata->packet.event),
848
836
"%s.events%d.event", section, event_count);
849
837
switch (pdata->target_type) {
851
my_snprintf(target, sizeof(target), "All");
839
fc_snprintf(target, sizeof(target), "All");
853
841
case ECT_PLAYERS:
860
848
case ECT_GLOBAL_OBSERVERS:
861
my_snprintf(target, sizeof(target), "Global Observers");
849
fc_snprintf(target, sizeof(target), "Global Observers");
864
852
secfile_insert_str(file, target, "%s.events%d.target",
866
854
secfile_insert_str(file, pdata->packet.message, "%s.events%d.message",
867
855
section, event_count);
869
freelog(LOG_VERBOSE, "Event %4d saved.", event_count);
857
log_verbose("Event %4d saved.", event_count);
872
860
} event_cache_iterate_end;
874
862
/* save the number of events in the event cache */
875
863
secfile_insert_int(file, event_count, "%s.count", section);
877
freelog(LOG_VERBOSE, "Events saved: %d.", event_count);
865
log_verbose("Events saved: %d.", event_count);
879
867
event_cache_status = TRUE;