cotn/notes/
cotn/src/
 /***************************************************************************
 *  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;
}