/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St#Rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/***************************************************************************
* _/ _/ *
* _/_/_/ _/_/ _/_/_/ _/ _/_/ _/ _/ _/_/_/ *
* _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ *
* _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ *
* _/ _/ _/ _/_/_/ _/ _/_/ _/_/_/ _/_/_/ *
***************************************************************************
* Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius), *
* Additional credits are in the help file CODECREDITS *
* All Rights Reserved. *
***************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "interp.h"
/* globals */
char *vote_topic;
int vote[3];
int player_vote = 0;
void write_votes(char *topic, float yes, float no, int total);
void read_votes(void);
typedef struct vote_info VOTE;
struct vote_info
{
VOTE *next;
char *topic;
float yes;
float no;
int total;
};
VOTE *vote_list;
void do_vote(CHAR_DATA * ch, char *argument)
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
DESCRIPTOR_DATA *d;
VOTE *s_vote;
char buf[MAX_STRING_LENGTH];
int num = 0;
int i = 0;
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if (arg1[0] == '\0')
{
if (vote[0])
{
xprintf(buf, "The topic of the vote is [%s]\n\r"
"There are roughly %d seconds left to vote.\n\r",
vote_topic, vote[0]);
send_to_char(buf, ch);
return;
}
send_to_char("There is no vote going on at this time.\n\r",
ch);
return;
}
if (!str_cmp(arg1, "show"))
{
VOTE *v_start = vote_list;
buf[0] = '\0';
if (arg2[0] == '\0')
{
num = 0;
}
else
{
num = atoi(arg2);
}
for (i = 0; i < num; i++)
{
buf[0] = '\0';
for (s_vote = v_start; s_vote; s_vote = s_vote->next)
{
if (strlen(buf) > MAX_STRING_LENGTH - 250)
{
v_start = s_vote;
break;
}
xprintf(buf + strlen(buf),
"#D -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r"
"#w Vote Topic:#w %s\n\r"
"#w Yes -#R %.2f%%\n\r"
"#w No -#R %.2f%%\n\r"
"#w Total Votes -#R %d\n\r"
"#D -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r",
s_vote->topic, s_vote->yes,
s_vote->no, (int) s_vote->total);
}
}
buf[0] = '\0';
for (s_vote = vote_list; s_vote; s_vote = s_vote->next)
{
if (strlen(buf) > MAX_STRING_LENGTH - 250)
{
xprintf(buf + strlen(buf),
"There is too much information. Type vote show %d to see more.\n\r",
num + 1);
break;
}
// xprintf(buf+strlen(buf),"[#w%s{x] Yes[{Y%.2f%%{x] No[#R%.2f%%{x] Total Votes[%d]\n\r",
xprintf(buf + strlen(buf),
"#D -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r"
"#w Vote Topic:#w %s\n\r"
"#w Yes -#R %.2f%%\n\r" "#w No -#R %.2f%%\n\r"
"#w Total Votes -#R %d\n\r"
"#D -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r",
s_vote->topic, s_vote->yes, s_vote->no,
(int) s_vote->total);
}
send_to_char(buf, ch);
return;
}
if (!str_cmp(arg1, "topic") && (IS_IMMORTAL(ch) || player_vote))
{
if (vote[0])
{
send_to_char
("There is all ready a vote going on.\n\r",
ch);
return;
}
if (!is_number(arg2))
{
send_to_char
("Second argument must be the amount of time in seconds, increments of 5.\n\r",
ch);
return;
}
if (argument[0] == '\0' || strlen(argument) < 5)
{
send_to_char("You must supply a valid topic.\n\r",
ch);
return;
}
if (atoi(arg2) % 5 != 0)
{
send_to_char("Timer must be in increments of 5.\n\r",
ch);
return;
}
if (atoi(arg2) > 300)
{
send_to_char
("Dont you think 5 minutes is long enought to vote?\n\r",
ch);
return;
}
xprintf(buf, "#D -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r"
"#R %s has started a vote\n\r"
"#D -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r"
"#Y Topic:\n\r"
"#w %s\n\r"
"#D -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r"
"#w You have #R%d #wseconds to vote.\n\r"
"#D -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\r"
"#w #PSyntax#D: #Cvote yes #D- #Cvote no#n\n\r",
ch->name, argument, atoi(arg2));
do_echo(ch, buf);
vote[0] = atoi(arg2);
vote[1] = 0;
vote[2] = 0;
vote[3] = 0;
vote_topic = str_dup(argument);
for (d = descriptor_list; d; d = d->next)
{
if (d->connected != CON_PLAYING || !d->character)
continue;
d->character->pcdata->voted = 0;
}
return;
}
if (IS_IMMORTAL(ch))
{
if (!str_cmp(arg1, "cancel"))
{
vote[0] = 0;
vote[1] = 0;
vote[2] = 0;
free_string(vote_topic);
xprintf(buf,
"Info-> The vote has been canceled by %s.\n\r",
ch->name);
do_echo(ch, buf);
return;
}
if (!str_cmp(arg1, "player"))
{
if (!str_cmp(arg2, "on"))
{
player_vote = 1;
send_to_char
("Players may start a vote topic now.\n\r",
ch);
return;
}
if (!str_cmp(arg2, "off"))
{
player_vote = 0;
send_to_char
("Players may not start a vote topic now.\n\r",
ch);
return;
}
send_to_char("Syntax: vote player <on/off>\n\r", ch);
return;
}
}
if (!vote[0])
{
send_to_char("There is no vote going on.\n\r", ch);
return;
}
if (ch->pcdata->voted)
{
send_to_char("You can only vote once dumbshit.\n\r", ch);
return;
}
if (!str_cmp(arg1, "yes"))
{
vote[1]++;
ch->pcdata->voted = 1;
send_to_char("You vote yes.\n\r", ch);
return;
}
if (!str_cmp(arg1, "no"))
{
vote[2]++;
ch->pcdata->voted = 1;
send_to_char("You vote no.\n\r", ch);
return;
}
send_to_char("Vote yes or no dumbass.\n\r", ch);
return;
}
void vote_update(void)
{
char buf[MAX_STRING_LENGTH];
float total, x1, x2;
if (!vote[0])
return;
vote[0] -= 5;
if (vote[0] <= 0)
{
total = vote[1] + vote[2];
x1 = vote[1] == 0 ? 0 : (float) vote[1] / total * 100;
x2 = vote[2] == 0 ? 0 : (float) vote[2] / total * 100;
xprintf(buf, "#wVote has ended for topic #D[#W%s#D]#n\n\r",
vote_topic);
do_info(NULL, buf);
xprintf(buf,
"#wVote outcome is #GYes#D[#Y%.2f%%#D] #RNo#D[#Y%.2f%%#D] #BTotal Votes#D[#Y%d#D]#n\n\r",
x1, x2, (int) total);
do_info(NULL, buf);
write_votes(vote_topic, x1, x2, (int) total);
vote[0] = 0;
return;
}
}
void write_votes(char *topic, float yes, float no, int total)
{
FILE *fp;
VOTE *svote;
fclose(fpReserve);
if ((fp = fopen(VOTE_FILE, "w+")) == NULL)
{
bug("write_vote: unable to open file for writing!", 0);
return;
}
svote = alloc_perm(sizeof(*svote));
svote->topic = topic;
svote->yes = yes;
svote->no = no;
svote->total = total;
svote->next = vote_list;
vote_list = svote;
for (svote = vote_list; svote; svote = svote->next)
fprintf(fp, "vote\n%s~ %d %d %d\n", svote->topic,
(int) svote->yes, (int) svote->no,
(int) svote->total);
fprintf(fp, "\nend\n\n");
fclose(fp);
fpReserve = fopen(NULL_FILE, "r");
return;
}
void read_votes(void)
{
FILE *fp;
VOTE *svote;
char *word;
if ((fp = fopen(VOTE_FILE, "r")) == NULL)
{
bug("read_votes: unable to open file ro reading!", 0);
return;
}
while (1)
{
word = fread_word(fp);
if (!str_cmp(word, "end"))
break;
if (!str_cmp(word, "vote"))
{
svote = alloc_perm(sizeof(*svote));
svote->topic = fread_string(fp);
svote->yes = fread_number(fp);
svote->no = fread_number(fp);
svote->total = fread_number(fp);
svote->next = vote_list;
vote_list = svote;
continue;
}
bug("read_votes: wrong word!", 0);
break;
}
return;
}