/*- * Copyright (c) 1998 efdi <efdi@iclub.nsu.ru> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: rating.c,v 1.14 1998/12/01 10:53:55 fjoe Exp $ */ #include <sys/time.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include "merc.h" #include "rating.h" struct rating_data { const char *name; int pc_killed; }; struct rating_data rating_table[RATING_TABLE_SIZE]; /* * Updates player's rating. * Should be called every death. */ void rating_update(CHAR_DATA *ch, CHAR_DATA *victim) { if (IS_NPC(ch) || IS_NPC(victim) || ch == victim || IS_IMMORTAL(ch) || (victim->in_room && IS_SET(victim->in_room->room_flags, ROOM_BATTLE_ARENA))) return; rating_add(ch->name, ++ch->pcdata->pc_killed); } /* * rating_add - add (or replace) `name/pc_killed' to (in) rating_table */ void rating_add(const char* name, int pc_killed) { int i; struct rating_data *p = rating_table; for (i = 0; i < RATING_TABLE_SIZE; i++) { if (rating_table[i].name != NULL && str_cmp(name, rating_table[i].name) == 0) { rating_table[i].pc_killed = pc_killed; return; } if (rating_table[i].pc_killed < p->pc_killed) p = rating_table + i; } if (p->pc_killed < pc_killed) { if (p->name != NULL) free_string(p->name); p->name = str_dup(name); p->pc_killed = pc_killed; } } static int rating_data_cmp(const void *a, const void *b) { return ((struct rating_data*) b)->pc_killed - ((struct rating_data*) a)->pc_killed; } void do_rating(CHAR_DATA *ch, const char *argument) { int i; qsort(rating_table, RATING_TABLE_SIZE, sizeof(struct rating_data), rating_data_cmp); char_puts("Name | PC's killed\n", ch); char_puts("------------------------+------------\n", ch); for (i = 0; i < RATING_TABLE_SIZE; i++) { if (rating_table[i].name == NULL) continue; char_printf(ch, "%-24s| %d\n", rating_table[i].name, rating_table[i].pc_killed); } if (!ch->pcdata->pc_killed) char_puts("\nDo you profess to be SO {Cpeaceful{x?\n" "You have killed no one.\n", ch); else { if (!strcmp(rating_table[0].name, ch->name)) char_puts("\nI bet you are {Rawful{x. \n" "You're at the top of this list!", ch); char_printf(ch, "\nYou have killed %s{R%d{x player%s.\n", ch->pcdata->pc_killed == 1 ? "ONLY " : str_empty, ch->pcdata->pc_killed, ch->pcdata->pc_killed == 1 ? str_empty : "s"); } }