home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hall of Fame
/
HallofFameCDROM.cdr
/
proglc
/
mor4873s.lzh
/
CREATE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1988-11-01
|
12KB
|
503 lines
#include <stdio.h>
#include "constant.h"
#include "config.h"
#include "types.h"
#include "externs.h"
#ifdef USG
#include <string.h>
#else
#include <strings.h>
#endif
#ifdef sun /* correct SUN stupidity in the stdio.h file */
char *sprintf();
#endif
#ifdef USG
unsigned sleep();
#endif
#ifdef ultrix
void sleep();
#endif
/* Generates character's stats -JWT- */
byteint get_stat()
{
register byteint i;
i = randint(4) + randint(4) + randint(4) + 5;
return(i);
}
/* Changes stats by given amount -JWT- */
byteint change_stat(cur_stat, amount)
byteint cur_stat;
int amount;
{
register int i;
if (amount < 0)
for (i = 0; i > amount; i--)
cur_stat = de_statp(cur_stat);
else
for (i = 0; i < amount; i++)
cur_stat = in_statp(cur_stat);
return(cur_stat);
}
/* generate all stats and modify for race... needed in a separate module so
looping of character selection would be allowed -RGM- */
void get_stats ()
{
register player_type *p_ptr;
register race_type *r_ptr;
p_ptr = &py;
r_ptr = &race[p_ptr->misc.prace];
p_ptr->stats.str = get_stat();
p_ptr->stats.intel = get_stat();
p_ptr->stats.wis = get_stat();
p_ptr->stats.dex = get_stat();
p_ptr->stats.con = get_stat();
p_ptr->stats.chr = get_stat();
p_ptr->stats.str = change_stat(p_ptr->stats.str, r_ptr->str_adj);
p_ptr->stats.intel = change_stat(p_ptr->stats.intel, r_ptr->int_adj);
p_ptr->stats.wis = change_stat(p_ptr->stats.wis, r_ptr->wis_adj);
p_ptr->stats.dex = change_stat(p_ptr->stats.dex, r_ptr->dex_adj);
p_ptr->stats.con = change_stat(p_ptr->stats.con, r_ptr->con_adj);
p_ptr->stats.chr = change_stat(p_ptr->stats.chr, r_ptr->chr_adj);
p_ptr->stats.cstr = p_ptr->stats.str;
p_ptr->stats.cint = p_ptr->stats.intel;
p_ptr->stats.cwis = p_ptr->stats.wis;
p_ptr->stats.cdex = p_ptr->stats.dex;
p_ptr->stats.ccon = p_ptr->stats.con;
p_ptr->stats.cchr = p_ptr->stats.chr;
p_ptr->misc.srh = r_ptr->srh;
p_ptr->misc.bth = r_ptr->bth;
p_ptr->misc.bthb = r_ptr->bthb;
p_ptr->misc.fos = r_ptr->fos;
p_ptr->misc.stl = r_ptr->stl;
p_ptr->misc.save = r_ptr->bsav;
p_ptr->misc.hitdie = r_ptr->bhitdie;
p_ptr->misc.lev = 1;
p_ptr->misc.ptodam = todam_adj();
p_ptr->misc.ptohit = tohit_adj();
p_ptr->misc.ptoac = 0;
p_ptr->misc.pac = toac_adj();
p_ptr->misc.expfact = r_ptr->b_exp;
p_ptr->flags.see_infra = r_ptr->infra;
}
/* Allows player to select a race -JWT- */
int choose_race()
{
register int j, k;
int l, m;
char s;
int exit_flag;
char tmp_str[80];
register player_type *p_ptr;
register race_type *r_ptr;
int res;
j = 0;
k = 0;
l = 2;
m = 21;
clear_screen(20, 0);
/* help is unimplemented */
/* prt("Choose a race (? for Help):", 20, 2); */
prt("Choose a race:", 20, 2);
do
{
(void) sprintf(tmp_str, "%c) %s", k+97, race[j].trace);
put_buffer(tmp_str, m, l);
k++;
l += 15;
if (l > 70)
{
l = 2;
m++;
}
j++;
}
while (j < MAX_RACES);
/* clear race string */
py.misc.race[0] = '\0';
move_cursor (20, 18);
exit_flag = FALSE;
do
{
inkey(&s);
j = s - 97;
if ((j < MAX_RACES) && (j >= 0))
{
p_ptr = &py;
r_ptr = &race[j];
p_ptr->misc.prace = j;
(void) strcpy(p_ptr->misc.race, r_ptr->trace);
get_stats(); /* We don't need the code twice. */
exit_flag = TRUE; /* so use function get_stats -RGM- */
res = TRUE;
put_buffer(py.misc.race, 3, 14);
}
}
while (!exit_flag);
return(res);
}
/* Will print the history of a character -JWT- */
print_history()
{
register int i;
put_buffer("Character Background", 13, 27);
for(i = 0; i < 5; i++)
put_buffer(py.misc.history[i], i+14, 4);
}
/* Get the racial history, determines social class -RAK- */
/* Assumptions: Each race has init history beginning at */
/* (race-1)*3+1 */
/* All history parts are in ascending order */
get_history()
{
int hist_ptr, cur_ptr, test_roll;
register int start_pos, end_pos, cur_len;
int line_ctr, new_start, social_class;
char history_block[400];
vtype tmp_str;
int flag;
register background_type *b_ptr;
int i = 0;
/* Get a block of history text */
hist_ptr = py.misc.prace*3 + 1;
history_block[0] = '\0';
social_class = randint(4);
cur_ptr = 0;
do
{
flag = FALSE;
do
{
if (background[cur_ptr].chart == hist_ptr)
{
test_roll = randint(100);
while (test_roll > background[cur_ptr].roll)
cur_ptr++;
b_ptr = &background[cur_ptr];
(void) strcat(history_block, b_ptr->info);
social_class += b_ptr->bonus;
if (hist_ptr > b_ptr->next)
cur_ptr = 0;
hist_ptr = b_ptr->next;
flag = TRUE;
}
else
cur_ptr++;
}
while (!flag);
}
while (hist_ptr >= 1);
/* Process block of history text for pretty output */
start_pos = 0;
end_pos = strlen(history_block) - 1;
line_ctr = 0;
flag = FALSE;
while (history_block[end_pos] == ' ')
end_pos--;
do
{
while (history_block[start_pos] == ' ')
start_pos++;
cur_len = end_pos - start_pos + 1;
if (cur_len > 70)
{
cur_len = 70;
while (history_block[start_pos+cur_len-1] != ' ')
cur_len--;
new_start = start_pos + cur_len;
while (history_block[start_pos+cur_len-1] == ' ')
cur_len--;
}
else
flag = TRUE;
(void) strncpy(tmp_str, &history_block[start_pos], cur_len);
tmp_str[cur_len] = '\0';
(void) strcpy(py.misc.history[line_ctr], tmp_str);
line_ctr++;
start_pos = new_start;
}
while (!flag);
/* Compute social class for player */
if (social_class > 100)
social_class = 100;
else if (social_class < 1)
social_class = 1;
py.misc.sc = social_class;
}
/* Gets the character's sex -JWT- */
int get_sex()
{
char s;
int exit_flag;
int sex;
py.misc.sex[0] = '\0';
clear_screen(20, 0);
/* help is unimplemented */
/* prt("Choose a sex (? for Help):", 20, 2); */
prt("Choose a sex:", 20, 2);
prt("m) Male f) Female", 21, 2);
move_cursor (20, 16);
do
{
inkey(&s);
switch(s)
{
case 'f': case 'F':
(void) strcpy(py.misc.sex, "Female");
prt(py.misc.sex, 4, 14);
exit_flag = TRUE;
sex = TRUE;
break;
case 'm': case 'M':
(void) strcpy(py.misc.sex, "Male");
prt(py.misc.sex, 4, 14);
exit_flag = TRUE;
sex = TRUE;
break;
default:
sex = FALSE;
exit_flag = FALSE;
break;
}
}
while (!exit_flag);
return(sex);
}
/* Computes character's age, height, and weight -JWT- */
get_ahw()
{
register int i;
i = py.misc.prace;
py.misc.age = race[i].b_age + randint((int)race[i].m_age);
switch(py.misc.sex[0])
{
case 'F': case 'f':
py.misc.ht = randnor((int)race[i].f_b_ht, (int)race[i].f_m_ht);
py.misc.wt = randnor((int)race[i].f_b_wt, (int)race[i].f_m_wt);
break;
case 'M': case 'm':
py.misc.ht = randnor((int)race[i].m_b_ht, (int)race[i].m_m_ht);
py.misc.wt = randnor((int)race[i].m_b_wt, (int)race[i].m_m_wt);
break;
}
py.misc.disarm = race[i].b_dis + todis_adj();
}
/* Gets a character class -JWT- */
int get_class()
{
register int i, j;
int k, l, m;
int cl[MAX_CLASS];
char s;
int exit_flag;
int res;
register struct misc *m_ptr;
register player_type *p_ptr;
char tmp_str[80];
for (j = 0; j < MAX_CLASS; j++)
cl[j] = 0;
i = py.misc.prace;
j = 0;
k = 0;
l = 2;
m = 21;
clear_screen(20, 0);
/* help is unimplemented */
/* prt("Choose a class (? for Help):", 20, 2); */
prt("Choose a class:", 20, 2);
do
{
if (race[i].tclass & bit_array[j])
{
(void) sprintf(tmp_str, "%c) %s", k+97, class[j].title);
put_buffer(tmp_str, m, l);
cl[k] = j;
l += 15;
if (l > 70)
{
l = 2;
m++;
}
k++;
}
j++;
}
while (j < MAX_CLASS);
py.misc.pclass = 0;
move_cursor (20, 19);
exit_flag = FALSE;
do
{
inkey(&s);
j = s - 97;
if ((j < k) && (j >= 0))
{
(void) strcpy(py.misc.tclass, class[cl[j]].title);
py.misc.pclass = cl[j];
exit_flag = TRUE;
res = TRUE;
clear_screen(20, 0);
put_buffer(py.misc.tclass, 5, 14);
/* Adjust the stats for the class adjustment -RAK- */
p_ptr = &py;
p_ptr->stats.str = change_stat(p_ptr->stats.str,
class[p_ptr->misc.pclass].madj_str);
p_ptr->stats.intel= change_stat(p_ptr->stats.intel,
class[p_ptr->misc.pclass].madj_int);
p_ptr->stats.wis = change_stat(p_ptr->stats.wis,
class[p_ptr->misc.pclass].madj_wis);
p_ptr->stats.dex = change_stat(p_ptr->stats.dex,
class[p_ptr->misc.pclass].madj_dex);
p_ptr->stats.con = change_stat(p_ptr->stats.con,
class[p_ptr->misc.pclass].madj_con);
p_ptr->stats.chr = change_stat(p_ptr->stats.chr,
class[p_ptr->misc.pclass].madj_chr);
p_ptr->stats.cstr = p_ptr->stats.str;
p_ptr->stats.cint = p_ptr->stats.intel;
p_ptr->stats.cwis = p_ptr->stats.wis;
p_ptr->stats.cdex = p_ptr->stats.dex;
p_ptr->stats.ccon = p_ptr->stats.con;
p_ptr->stats.cchr = p_ptr->stats.chr;
p_ptr->misc.ptodam = todam_adj(); /* Real values */
p_ptr->misc.ptohit = tohit_adj();
p_ptr->misc.ptoac = toac_adj();
p_ptr->misc.pac = 0;
p_ptr->misc.dis_td = p_ptr->misc.ptodam; /* Displayed values */
p_ptr->misc.dis_th = p_ptr->misc.ptohit;
p_ptr->misc.dis_tac= p_ptr->misc.ptoac;
p_ptr->misc.dis_ac = p_ptr->misc.pac;
/* now set misc stats, do this after setting stats because
of con_adj() for hitpoints */
m_ptr = &py.misc;
m_ptr->hitdie += class[m_ptr->pclass].adj_hd;
m_ptr->mhp = con_adj() + m_ptr->hitdie;
m_ptr->chp = (double)m_ptr->mhp;
m_ptr->bth += class[m_ptr->pclass].mbth;
m_ptr->bthb += class[m_ptr->pclass].mbthb; /*RAK*/
m_ptr->srh += class[m_ptr->pclass].msrh;
m_ptr->disarm += class[m_ptr->pclass].mdis;
m_ptr->fos += class[m_ptr->pclass].mfos;
m_ptr->stl += class[m_ptr->pclass].mstl;
m_ptr->save += class[m_ptr->pclass].msav;
(void) strcat(m_ptr->title, player_title[m_ptr->pclass][0]);
m_ptr->expfact += class[m_ptr->pclass].m_exp;
}
}
while (!exit_flag);
return(res);
}
get_money()
{
register int tmp;
register struct stats *p_ptr;
register struct misc *m_ptr;
p_ptr = &py.stats;
tmp = p_ptr->cstr + p_ptr->cint + p_ptr->cwis +
p_ptr->cdex + p_ptr->ccon + p_ptr->cchr;
m_ptr = &py.misc;
m_ptr->au = m_ptr->sc*6 + randint(25) + 325; /* Social Class adj */
m_ptr->au = m_ptr->au - tmp; /* Stat adj */
m_ptr->au = m_ptr->au + p_ptr->cchr; /* Charisma adj */
if (m_ptr->au < 80) m_ptr->au = 80; /* Minimum */
}
/* ---------- M A I N for Character Creation Routine ---------- */
/* -JWT- */
create_character()
{
char s;
register int exit_flag = 1;
put_character();
(void) choose_race();
(void) get_sex();
/* here we start a loop giving a player a choice of characters -RGM- */
get_stats ();
get_history();
get_ahw();
put_character();
print_history();
put_misc1();
put_stats();
exit_flag = 1;
do
{
prt("Hit space to reroll or ESC to accept characteristics: ", 20, 2);
inkey(&s);
switch (s)
{
case 27:
exit_flag = 0;
break;
case ' ':
get_stats ();
get_history();
get_ahw();
put_character();
print_history();
put_misc1();
put_stats();
#ifdef SLOW
(void) sleep (0);
#endif
break;
default:
break;
}
} /* done with stats generation */
while (exit_flag == 1);
(void) get_class();
get_money();
put_stats();
put_misc2();
put_misc3();
get_name();
/* This delay may be reduced, but is recommended to keep players */
/* from continuously rolling up characters, which can be VERY */
/* expensive CPU wise. */
pause_exit(23, PLAYER_EXIT_PAUSE);
}