/*
* Playground+ - gag.c
* Gag commands
* ---------------------------------------------------------------------------
*/
#include <ctype.h>
#include <string.h>
#ifndef BSDISH
#include <malloc.h>
#else
#include <stdlib.h>
#endif
#include <fcntl.h>
#include <memory.h>
#include "include/config.h"
#include "include/player.h"
#include "include/fix.h"
#include "include/proto.h"
int count_gags(player * p)
{
int cnt = 0;
gag_entry *g;
if (!(p->gag_top))
return 0;
else
for (g = p->gag_top; g; g = g->next)
cnt++;
return cnt;
}
int match_gag(player * p, player * q)
{
gag_entry *g;
for (g = p->gag_top; g; g = g->next)
{
if (g->gagged == q)
return 1;
}
return 0;
}
void create_gag(player * p, char *str)
{
gag_entry *g;
player *p2;
if (!*str)
{
TELLPLAYER(p, " Format: gag <player>\n");
return;
}
p2 = find_player_absolute_quiet(str);
if (!p2)
{
TELLPLAYER(p, " That player isn't logged on at the moment.\n");
return;
}
if (match_gag(p, p2))
{
TELLPLAYER(p, " You have already gagged %s.\n", p2->name);
return;
}
/* create the entry */
g = (gag_entry *) MALLOC(sizeof(gag_entry));
if (!g)
{
log("error", "Failed to malloc in add_gag...ouch!");
tell_player(p, " Ergs! A lowlevel memory error occured, try again.\n");
return;
}
g->gagged = p2;
g->next = p->gag_top;
p->gag_top = g;
TELLPLAYER(p2, " (You have been gagged by %s...)\n", p->name);
TELLPLAYER(p, " You gag %s.\n", p2->name);
}
void del_gag(player * p, char *str, int verbose)
{
gag_entry *g, *gp;
player *p2;
if (!*str && verbose)
{
TELLPLAYER(p, " Format: ungag <player>\n");
return;
}
p2 = find_player_absolute_quiet(str);
if (!p2 && verbose)
{
TELLPLAYER(p, " That player isn't logged on at the moment.\n");
return;
}
/* ok, delete the gag if it exists */
if (!(p->gag_top))
{
TELLPLAYER(p, " You haven't got anyone gagged atm.\n");
return;
}
if (p->gag_top->gagged == p2)
{
g = p->gag_top;
p->gag_top = g->next;
FREE(g);
if (verbose)
TELLPLAYER(p, " %s has been ungagged.\n", p2->name);
return;
}
for (gp = p->gag_top, g = gp->next; g; gp = g, g = g->next)
{
if (g->gagged == p2)
{
/* FREE() the gag, and relink stuff */
gp->next = g->next;
FREE(g);
if (verbose)
TELLPLAYER(p, " %s has been ungagged.\n", p2->name);
return;
}
}
if (verbose)
TELLPLAYER(p, " But you never gagged %s!\n", p2->name);
}
void delete_gag(player * p, char *str)
{
del_gag(p, str, 1);
}
void list_all_gags(player * p, char *str)
{
char *oldstack = stack;
gag_entry *g;
int gagcount = count_gags(p);
if (!gagcount)
{
TELLPLAYER(p, " You aren't gagging anyone atm.\n");
return;
}
ADDSTACK(" Listing all your current gags:\n ");
for (g = p->gag_top; g; g = g->next)
ADDSTACK(" %s", g->gagged->name);
if (gagcount > 1)
ENDSTACK("\n You are gagging %d people\n", gagcount);
else
ENDSTACK("\n You are gagging one person\n");
TELLPLAYER(p, oldstack);
stack = oldstack;
}
void clear_gag_logoff(player * git)
{
player *scan;
for (scan = flatlist_start; scan; scan = scan->flat_next)
{
if (match_gag(scan, git))
del_gag(scan, git->lower_name, 0);
}
}
void purge_gaglist(player * p, char *str)
{
gag_entry *g, *g2;
if (!count_gags(p))
return;
for (g = p->gag_top, g2 = g; g2; g = g2)
{
g2 = g->next;
FREE(g);
}
p->gag_top = 0;
}