/*
* games.c
*/
#include <string.h>
#include "player.h"
extern void TELLPLAYER();
extern player *find_player_global();
extern char *next_space(), *get_gender_string();
extern list_ent *fle_from_save();
/* for paper_rock_scissors -
unsigned int prs;
prs%4 = selection (null, paper, rock, scissors)
prs/4 = game number.
*/
void check_prs2(player * p) {
int wins = 0, loss = 0, ties = 0;
loss = p->prs_record % 1000;
wins = p->prs_record / 1000000;
ties = (p->prs_record / 1000) - (wins*1000);
if (wins >= 1000) {
TELLPLAYER(p, " -=*> Congrats on your 1000th win!!\n");
LOGF("prs", "%s makes grand champion with a record of %d-%d-%d", p->name, wins, ties, loss);
TELLPLAYER(p, " Resetting your stats to avoid overflow.\n");
p->prs_record = 0;
}
else if (loss >= 1000) {
TELLPLAYER(p, " -=*> Ack! That's your 1000th loss!!\n");
LOGF("prs", "%s becomes a big loooozer -- %d-%d-%d", p->name, wins, ties, loss);
TELLPLAYER(p, " Resetting your stats (mercifly) to avoid overflow.\n");
p->prs_record = 0;
}
else if (ties >= 1000) {
TELLPLAYER(p, " -=*> *Yawn* 1000 ties already?!\n");
LOGF("prs", "%s reaches the apex of mediocraty -- %d-%d-%d", p->name, wins, ties, loss);
TELLPLAYER(p, " Resetting your stats (mercifly) to avoid overflow.\n");
p->prs_record = 0;
}
}
void check_prs(player * p1, player * p2) {
check_prs2(p1);
check_prs2(p2);
}
int get_prs_choice(char *str) {
if (*str == 'p' || *str == 'P')
return 1;
if (*str == 'r' || *str == 'R')
return 2;
if (*str == 's' || *str == 'S')
return 3;
return 0;
}
int open_new_prsgame()
{
int game, con = 1;
player *scan;
for (game = 4; con && game < 10000; game+=4) {
con = 0;
for (scan = flatlist_start; scan; scan = scan->flat_next)
if (scan->prs/4 == game)
con = 1;
if (!con)
return game;
}
}
void paper_rock_scissors(player *p, char *str) {
char *select;
player *p2;
int choice, gameno;
list_ent *l;
if (!*str) {
TELLPLAYER(p, " Format: prs <player> <paper/rock/scissors>\n");
return;
}
if (!strcasecmp(str, "clear")) {
TELLPLAYER(p, " You clear prs game status.\n");
if (p->prs/4 == 0) return;
gameno = p->prs/4;
p->prs = 0;
for (p2 = flatlist_start; p2; p2 = p2->flat_next)
if (p2->prs/4 == gameno) {
if (p2->misc_flags & GAME_HI)
command_type |= HIGHLIGHT;
TELLPLAYER(p2, " (%d) %s backs out of the game.\n", gameno/4, p->name);
if (p2->misc_flags & GAME_HI)
command_type &= ~HIGHLIGHT;
p2->prs = 0;
}
return;
}
select = next_space(str);
if (*select)
*select++ = 0;
else {
TELLPLAYER(p, " Format: prs <player> <paper/rock/scissors>\n");
return;
}
p2 = find_player_global(str);
if (!p2) return;
if (p->misc_flags & NO_PRS) {
TELLPLAYER(p, " You cannot play prs when blocking game offers.\n");
return; }
if (p2->misc_flags & NO_PRS) {
TELLPLAYER(p, " That person doesn't like that game.\n");
return;
}
if (p2->saved) {
l = fle_from_save(p2->saved, p->lower_name);
if (l && l->flags & (IGNORE|BLOCK)) {
TELLPLAYER(p, " That person is ignoring you.\n");
return;
}
}
if (p==p2) {
TELLPLAYER(p, " Now where would the challenge in THAT be?\n");
return;
}
if (p->prs/4) {
gameno = p->prs/4;
if (p2->prs/4 != gameno) {
if (p->misc_flags & GAME_HI)
command_type |= HIGHLIGHT;
TELLPLAYER(p, " (%d) You're not playing against %s..\n", gameno/4, p2->name);
if (p->misc_flags & GAME_HI)
command_type &= ~HIGHLIGHT;
return; }
else {
choice = get_prs_choice(select);
if (!choice) {
if (p->misc_flags & GAME_HI)
command_type |= HIGHLIGHT;
TELLPLAYER(p, " (%d) Try rock, paper, or scissors.\n", gameno/4);
if (p->misc_flags & GAME_HI)
command_type &= ~HIGHLIGHT;
return;
}
if (p2->prs%4 == 0) {
if (p->misc_flags & GAME_HI)
command_type |= HIGHLIGHT;
TELLPLAYER(p, " (%d) You've already offered a game to %s... be patient\n", gameno/4, p2->name);
if (p->misc_flags & GAME_HI)
command_type &= ~HIGHLIGHT;
if (p2->misc_flags & GAME_HI)
command_type |= HIGHLIGHT;
TELLPLAYER(p2, " (%d) %s waits for you go play against %s... \n", gameno/4, p->name, get_gender_string(p));
if (p2->misc_flags & GAME_HI)
command_type &= ~HIGHLIGHT;
return;
}
if (choice == p2->prs%4) {
if (p->misc_flags & GAME_HI)
command_type |= HIGHLIGHT;
TELLPLAYER(p, " (%d) You tie with %s.\n", gameno/4, p2->name);
if (p->misc_flags & GAME_HI)
command_type &= ~HIGHLIGHT;
if (p2->misc_flags & GAME_HI)
command_type |= HIGHLIGHT;
TELLPLAYER(p2, " (%d) You tie with %s.\n", gameno/4, p->name);
if (p2->misc_flags & GAME_HI)
command_type &= ~HIGHLIGHT;
p->prs = 0;
p2->prs = 0;
p->prs_record += 1000;
p2->prs_record += 1000;
check_prs(p, p2);
return;
}
if ((choice == 1 && p2->prs%4 == 2) ||
(choice == 2 && p2->prs%4 == 3) ||
(choice == 3 && p2->prs%4 == 1)) {
if (p->misc_flags & GAME_HI)
command_type |= HIGHLIGHT;
TELLPLAYER(p, " (%d) You defeat %s!\n", gameno/4, p2->name);
if (p->misc_flags & GAME_HI)
command_type &= ~HIGHLIGHT;
if (p2->misc_flags & GAME_HI)
command_type |= HIGHLIGHT;
TELLPLAYER(p2," (%d) Rats! %s beat you!\n", gameno/4, p->name);
if (p2->misc_flags & GAME_HI)
command_type &= ~HIGHLIGHT;
p->prs = 0;
p2->prs = 0;
p->prs_record += 1000000;
p2->prs_record += 1;
check_prs(p, p2);
}
else {
if (p2->misc_flags & GAME_HI)
command_type |= HIGHLIGHT;
TELLPLAYER(p2, " (%d) You defeat %s!\n", gameno/4, p->name);
if (p2->misc_flags & GAME_HI)
command_type &= ~HIGHLIGHT;
if (p->misc_flags & GAME_HI)
command_type |= HIGHLIGHT;
TELLPLAYER(p," (%d) Rats! %s beat you!\n", gameno/4, p2->name);
if (p->misc_flags & GAME_HI)
command_type &= ~HIGHLIGHT;
p->prs = 0;
p2->prs = 0;
p->prs_record += 1;
p2->prs_record += 1000000;
check_prs(p, p2);
}
}
}
else { /* starting a new game */
choice = get_prs_choice(select);
if (!choice) {
TELLPLAYER(p, " Try rock, paper, or scissors.\n");
return;
}
if (p2->prs/4) {
TELLPLAYER(p, " That person is playing someone else atm.\n");
return;
}
gameno = open_new_prsgame();
p->prs = gameno*4 + choice;
p2->prs = gameno*4;
if (p2->misc_flags & GAME_HI)
command_type |= HIGHLIGHT;
if (p2->residency & ADMIN && !(p->residency & SU))
TELLPLAYER(p2, " (%d) %s wants to play Paper-rock-scissors with you. (%s)\n", gameno/4, p->name, select);
else
TELLPLAYER(p2, " (%d) %s wants to play Paper-rock-scissors with you.\n", gameno/4, p->name);
if (p2->misc_flags & GAME_HI)
command_type &= ~HIGHLIGHT;
if (p->misc_flags & GAME_HI)
command_type |= HIGHLIGHT;
TELLPLAYER(p, " (%d) You ask %s to play Paper-rock-scissors with you.\n", gameno/4, p2->name);
if (p->misc_flags & GAME_HI)
command_type &= ~HIGHLIGHT;
}
}
void toggle_noprs(player * p, char* str) {
p->misc_flags ^= NO_PRS;
if (p->misc_flags & NO_PRS)
TELLPLAYER(p, " You are blocking all game offers.\n");
else
TELLPLAYER(p, " You unblock game offers.\n");
}
void prs_record_display(player *p) {
int wins = 0, loss = 0, ties = 0;
char *tempstack;
loss = p->prs_record % 1000;
wins = p->prs_record / 1000000;
ties = (p->prs_record / 1000) - (wins*1000);
tempstack = stack;
sprintf(stack, "%d wins, %d losses, %d ties\n", wins, loss, ties);
stack = strchr(stack, 0);
}
void game_hi(player * p, char* str) {
p->misc_flags ^= GAME_HI;
if (p->misc_flags & GAME_HI)
TELLPLAYER(p, " You hilight all game offers.\n");
else
TELLPLAYER(p, " You turn off game hilighting.\n");
}