home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
games
/
volume12
/
mdg
/
part03
/
players.c
< prev
Wrap
C/C++ Source or Header
|
1991-03-04
|
8KB
|
382 lines
/*
MDG Multiuser Dungeon Game -- players.c player code
MDG is Copyright 1990 John C. Gonnerman
This program is subject to the general MDG
copyright statement (see enclosed file, Copyright).
*/
static char *sccsvers = "@(#) players.c\t(1.5)\tcreated 1/3/91";
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
#include "setup.h"
#include "files.h"
#include "struct.h"
extern char *progname;
extern int errno;
extern char *sys_errlist[];
extern struct player_seg *pseg;
extern struct map_seg *mseg;
extern int player_size;
extern int memory[];
saveplayer(indx)
int indx;
{
char fname[128];
FILE *fp;
int i;
time_t time();
if(pseg->p[indx].playernum == -1) /* no such player */
return;
if(pseg->p[indx].loc.sector == LOC_NONESUCH
&& pseg->p[indx].lives < 0) { /* he died */
pseg->p[indx].playernum = -1;
pseg->player_sem++;
return;
}
sprintf(fname, "%s/pl%05d", PLAYERDIR, pseg->p[indx].playernum);
/* mark player's items as old */
for(i = 0; i < pseg->item_count; i++)
if(pseg->itm[i].loc.sector == LOC_PLAYER
&& pseg->itm[i].loc.x == pseg->p[indx].playernum)
pseg->itm[i].loc.y = ITEM_OLD;
/* save player's file */
if((fp = fopen(fname, "w")) == NULL)
return;
fprintf(fp, "%s\n", pseg->p[indx].name);
fprintf(fp, "%ld\n", pseg->p[indx].gold);
for(i = 0; i < 26; i++) {
fprintf(fp, "%hd ", pseg->p[indx].spells[i]);
if(((i + 1) % 13) == 0)
putc('\n', fp);
}
fprintf(fp, "%hd:%hd\n", pseg->p[indx].max_hp,
pseg->p[indx].hitpoints);
fprintf(fp, "%hd:%hd\n", pseg->p[indx].max_mp,
pseg->p[indx].magicpts);
fprintf(fp, "%hd\n", pseg->p[indx].fighting);
fprintf(fp, "[%d/%d]\n", pseg->p[indx].loc.x, pseg->p[indx].home);
fprintf(fp, "%d\n", pseg->p[indx].lives);
fprintf(fp, "%ld\n", time(NULL) - DATE_OFFSET);
fprintf(fp, "%hd\n", pseg->p[indx].createpts);
fprintf(fp, "al = %hd\n", pseg->p[indx].alignment);
fclose(fp);
pseg->p[indx].playernum = -1;
pseg->player_sem++;
}
dmsg_all(msg)
char *msg;
{
int i;
for(i = 0; i < MAX_PLAYERS; i++)
if(pseg->p[i].playernum >= 0)
dmsg_add(i, msg);
}
int loadplayer(indx, playernum)
int indx, playernum;
{
char fname[128], altfname[128], profname[128], *p;
char tmpname[PNAMELEN];
long time_out, time_old, time_diff;
time_t time();
FILE *fp;
int i, startsect;
sprintf(fname, "%s/pl%05d", PLAYERDIR, playernum);
sprintf(altfname, "%s/default", PLAYERDIR);
sprintf(profname, "%s/pr%05d", PLAYERDIR, playernum);
pseg->weapon[indx] = -1;
pseg->armor[indx] = -1;
pseg->shield[indx] = -1;
pseg->p[indx].dmsg[0][0] = '\0';
pseg->p[indx].dmsg[1][0] = '\0';
pseg->p[indx].dmsg_loc = -1;
pseg->p[indx].brief = 0;
pseg->p[indx].clock = 0;
pseg->p[indx].detect = 0;
pseg->p[indx].light = 0;
pseg->p[indx].blocked = 0;
pseg->p[indx].invis = 0;
pseg->p[indx].knight = 0;
pseg->p[indx].user_spell = 0;
pseg->p[indx].gold_hidden = 0;
pseg->p[indx].ma_count = 0;
pseg->p[indx].m_armor = 0;
pseg->p[indx].createpts = 0;
memory[indx] = LOC_NONESUCH;
if((fp = fopen(profname, "r")) == NULL)
pseg->p[indx].name[0] = '\0';
else {
fgets(pseg->p[indx].name, 20, fp);
fclose(fp);
}
if((fp = fopen(fname, "r")) == NULL
&& (fp = fopen(altfname, "r")) == NULL)
return;
fgets(tmpname, 20, fp);
if(pseg->p[indx].name[0] == '\0')
strcpy(pseg->p[indx].name, tmpname);
for(p = pseg->p[indx].name; *p; p++)
if(*p == '\n')
*p = '\0';
if(pseg->p[indx].name[0] == '\0')
get_handle(pseg->p[indx].name, playernum);
fscanf(fp, "%ld\n", &(pseg->p[indx].gold));
for(i = 0; i < 26; i++)
fscanf(fp, "%hd", &(pseg->p[indx].spells[i]));
fscanf(fp, "%hd:%hd\n", &(pseg->p[indx].max_hp),
&(pseg->p[indx].hitpoints));
fscanf(fp, "%hd:%hd\n", &(pseg->p[indx].max_mp),
&(pseg->p[indx].magicpts));
fscanf(fp, "%hd\n", &(pseg->p[indx].fighting));
fscanf(fp, "[%d/%d]\n", &startsect, &(pseg->p[indx].home));
fscanf(fp, "%d\n", &(pseg->p[indx].lives));
fscanf(fp, "%ld\n", &time_old);
fscanf(fp, "%hd\n", &(pseg->p[indx].createpts));
fscanf(fp, "al = %hd\n", &(pseg->p[indx].alignment));
fclose(fp);
for(i = 0; i < MAX_PLAYERS; i++)
pseg->p[indx].partners[i] = pseg->p[indx].alignment;
time_diff = (time(NULL) - DATE_OFFSET) - time_old;
if(time_diff > 600)
time_diff = 600;
time_out = time_diff / TIME_TO_HEAL;
while(time_out--)
heal_a_player(indx);
if(startsect < 0 || startsect >= mseg->max_areas)
startsect = 0;
if(place(indx, startsect) == -1
&& place(indx, 0) == -1)
return;
pseg->p[indx].prev_sect = startsect;
pseg->p[indx].playernum = playernum;
for(i = 0; i < PMAX_ITEMS; i++)
pseg->p[indx].items[i] = -1;
for(i = 0; i < pseg->item_count; i++)
if(pseg->itm[i].loc.sector == LOC_PLAYER
&& pseg->itm[i].loc.x == pseg->p[indx].playernum) {
insert_item(indx, i);
freshen_item(i);
}
move_sym(&(pseg->p[indx].loc), 1 + indx);
pseg->player_sem++;
}
place(p_indx, startsect)
int p_indx, startsect;
{
int rc, x, y;
for(x = MAPCOLS / 3; x < (2 * (MAPCOLS / 3)); x++)
for(y = MAPROWS / 3; y < 2 * (MAPROWS / 3); y++) {
if(try_spot(p_indx, startsect, x, y) == 0)
return 0;
}
return -1;
}
int try_spot(p_indx, startsect, x, y)
int p_indx, startsect, x, y;
{
if(isdigit(mseg->m[startsect].map[y][x]))
return -1;
if(mseg->m[startsect].map[y][x] == '~'
|| mseg->m[startsect].map[y][x] == '%'
|| mseg->m[startsect].map[y][x] == '^')
return -1;
if(move_to(&(pseg->p[p_indx].loc), startsect, x, y, p_indx) == 0)
return 0;
return -1;
}
abortplayer(indx)
int indx;
{
int sector, x, y, under;
sector = pseg->p[indx].loc.sector;
x = pseg->p[indx].loc.x;
y = pseg->p[indx].loc.y;
under = pseg->p[indx].loc.under;
if(sector < 0)
return;
mseg->m[sector].map[y][x] = under;
drop_new(indx, sector, x, y);
pseg->p[indx].playernum = -1;
pseg->player_sem++;
mseg->map_sem++;
notify(sector);
}
drop_new(p_indx, sector, x, y)
int p_indx, sector, x, y;
{
int i, playernum;
playernum = pseg->p[p_indx].playernum;
for(i = 0; i < pseg->item_count; i++)
if(pseg->itm[i].loc.sector == LOC_PLAYER
&& pseg->itm[i].loc.x == playernum
&& pseg->itm[i].loc.y == ITEM_NEW)
if(put_item(i, sector, x, y) == -1)
pseg->itm[i].loc.sector = LOC_NONESUCH;
notify(sector);
}
del_player(p_indx)
int p_indx;
{
char fname[128];
int temp_x;
pseg->p[p_indx].lives--;
if(pseg->p[p_indx].lives >= 0) {
pseg->p[p_indx].hitpoints = 1;
temp_x = pseg->p[p_indx].loc.x;
pseg->p[p_indx].loc.x = 0;
pseg->p[p_indx].gold = 0;
pseg->player_sem++;
saveplayer(p_indx);
pseg->p[p_indx].loc.x = temp_x;
pseg->p[p_indx].hitpoints = 0;
pseg->player_sem++;
tell_player(p_indx);
} else {
sprintf(fname, "%s/pl%05d", PLAYERDIR,
pseg->p[p_indx].playernum);
unlink(fname);
}
}
heal_players()
{
int indx;
for(indx = 0; indx < MAX_PLAYERS; indx++) {
if(pseg->p[indx].playernum >= 0
&& pseg->p[indx].loc.sector >= 0
&& ++pseg->p[indx].clock > TIME_TO_HEAL)
heal_a_player(indx);
if(pseg->p[indx].playernum >= 0
&& (pseg->p[indx].loc.sector == LOC_NONESUCH
|| pseg->p[indx].loc.sector == LOC_HOME)) {
pseg->player_sem++;
tell_player(indx);
}
}
}
heal_a_player(indx)
int indx;
{
pseg->p[indx].clock = 0;
if(pseg->p[indx].hitpoints < pseg->p[indx].max_hp) {
pseg->p[indx].hitpoints +=
rnd(pseg->p[indx].max_hp / HEAL_DIV);
if(pseg->p[indx].hitpoints > pseg->p[indx].max_hp)
pseg->p[indx].hitpoints = pseg->p[indx].max_hp;
pseg->player_sem++;
}
if(pseg->p[indx].hitpoints > MIN_HPS
&& pseg->p[indx].magicpts < pseg->p[indx].max_mp) {
pseg->p[indx].magicpts += CHARGE_INC;
pseg->player_sem++;
}
tell_player(indx);
}
/* end of file. */