From decwrl!decvax!tektronix!tekgen!tekred!games Sat Dec 3 17:20:44 PST 1988 Article 453 of comp.sources.games: Path: granite!decwrl!decvax!tektronix!tekgen!tekred!games From: games@tekred.TEK.COM Newsgroups: comp.sources.games Subject: v05i087: umoria2 - single player dungeon simulation (ver. 4.87), Patch4 Message-ID: <3316@tekred.TEK.COM> Date: 30 Nov 88 01:12:24 GMT Sender: billr@tekred.TEK.COM Lines: 1876 Approved: billr@saab.CNA.TEK.COM Submitted by: "James E. Wilson" Comp.sources.games: Volume 5, Issue 87 Archive-name: umoria2/Patch4 [From the author....] First of all, I should point out that the version of umoria recently posted in comp.sources.games already had the first three patches applied. You can verify this by looking in the README file. This latest patch adds the 'patchlevel' info to the version command to make it easier to determine the patch level. Applying the Patches: If you have a copy of the game that you ftp'ed from ucbarpa, then you may have trouble applying the patches. Apparently, there were some differences between the version I had available via ftp and the version that was posted. You can either apply by hand the patches that fail, or you can ftp a copy of the posted version from the comp.sources.games archives on uunet.uu.net. If you have applied any of the semi-official patches posted to rec.games.moria, then a few of these patches will fail. You can ignore a patch if you have an equivalent one already installed. As always, don't forget to use the -N option of patch! Problems fixed: There have been two bugs reported that can cause core dumps. 1) fighting a Lich (any kind) or Balrog with no items in inventory 2) regaining more than 22 spells due to the use of a "restore level" potion Both of these bugs are fixed by this patch file. I have added an option to the config.h file, so that the person installing the game can decide whether or not panic saved games should have their scores entered into the scoreboard. The default is to not save scores from panic save files. A number of minor problems have been fixed, some of the more visible fixes: 1) no longer need to be next to a monster for polymorph to work 2) the map command failed if output width was not a divisor of 196 3) dispell now awards experience points when it kills a monster 4) using the destroy trap spell on a chest now changes the name of the chest 5) add plurals to magic books, and pints of ale/wine 6) panic save and exit if read EOF from stdin, (was a problem for some people who wrote automatic rerolling programs) Many other minor problems have been fixed also. Many, many bugs still remain. A complete, although occasionally cryptic, list of fixes and remaining bugs can be found in the file PROBLEMS. Jim Wilson "If winning is not important, then why keep score?" wilson@ji.Berkeley.EDU Worf - Star Trek: The Next Generation ucbvax!ucbji!wilson #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh patches04 <<'END_OF_patches04' X*** oldmoria/INSTALL Sun Oct 30 01:18:12 1988 X--- newmoria/INSTALL Sun Oct 30 01:07:29 1988 X*************** X*** 23,26 **** X--- 23,32 ---- X define NO_SIGNED_CHARS in config.h. X X+ By default, scores from panic saved games are not stored into the X+ scoreboard. Some sites have a lot of trouble with HANGUP signals though. X+ If so, you can allow scores of panic saved games to be recorded by defining X+ SCORE_PANIC_SAVES. This is not recommended, as it enables some rather X+ devious cheating methods. X+ X Moria may not compile properly on SYS III machines(?) X X*** oldmoria/Int16bit.patch Sun Oct 30 01:17:48 1988 X--- newmoria/Int16bit.patch Sun Oct 30 01:08:00 1988 X*************** X*** 393,397 **** X { X register int i; X! register int mask = 0x1; X X ! for (i = 0; i < sizeof(int)*8; i++) { X--- 393,397 ---- X { X register int i; X! ! register int mask = 0x1; X X ! for (i = 0; i < sizeof(int)*8; i++) { X*************** X*** 406,410 **** X { X register int i; X! register int mask = 0x1; X X ! for (i = 0; i < sizeof(*test)*8; i++) { X--- 406,410 ---- X { X register int i; X! ! bitset_t mask = 0x1; X X ! for (i = 0; i < sizeof(*test)*8; i++) { X*************** X*** 500,504 **** X int new_spell; X int test_array[32]; X! ! bitset_t int spell_flag; X int learn; X register spell_type *s_ptr; X--- 500,504 ---- X int new_spell; X int test_array[32]; X! ! bitset_t spell_flag; X int learn; X register spell_type *s_ptr; X*** oldmoria/Moria_news Sun Oct 30 01:16:40 1988 X--- newmoria/Moria_news Sun Oct 30 01:07:31 1988 X*************** X*** 9,13 **** X UNIX Port : James E. Wilson / UC Berkeley X X- This is a beta release of umoria 4.87 X- X Dungeon Master: This file may contain updates and news. X--- 9,11 ---- X*** oldmoria/PROBLEMS Sun Oct 30 01:17:44 1988 X--- newmoria/PROBLEMS Sun Oct 30 01:07:32 1988 X*************** X*** 466,469 **** X--- 466,527 ---- X many files: change move_char(5) to move_light(char_row, char_col, char_row, X char_col), avoid problems with potential recursive calls to move_char() X+ sent out u487.p3 patch file X+ --------------------- 7/6 X+ Int16bit.patch: change "bitset_t int" to "bitset_t" X+ config.h: NO_SIGNED_CHARS was missing trailing */ X+ Moria_news: delete beta release comment X+ --------------------- 7/8 X+ spells.c: fixed poly_monster, only worked when next to monster X+ --------------------- 8/9 X+ save.c: printing of version changed from %lf to %.2lf X+ config.h: eliminated comment about dynix not needing BUGGY_CURSES X+ --------------------- 8/13 X+ Int16bit.patch: mask in bit_pos() in misc1.c should be bitset_t, not int X+ --------------------- 8/15 X+ misc2.c,spells.c: changed array decl for function parameters (e.g. vtype) X+ to pointers (e.g. char *) X+ --------------------- 8/24 X+ help.c: change char for original mode shell_out command from $ to ! X+ files.c: null terminate dun_line in after inner_loop; make filename, page_width X+ and page_height static to remember new default values X+ save.c: change references of st_atime to st_mtime, prevent automatic backup X+ programs from corrupting save files X+ -------------------- 9/21 X+ creature.c: for drain charge attack (24), only succeed if there is comething X+ in the player's inventory X+ --------------------- 9/30 X+ moria1.c: missing 'int' keyword added back in X+ --------------------- 10/10 X+ moria1.c: sub3_move_light, change order of declarations since it caused a X+ problem on a 3B2 X+ types.h: spl_type declared as array of 22 when should have been array of 32 X+ ---------------------- 10/17 X+ externs.h: t_level declared incorrectly X+ ---------------------- 10/29 X+ *.c: fix all uses of divide operator, eliminate unnecessary floating point X+ operations, distinguish between round() and trunc()/div in VMS source X+ monsters.c: changed invisible stalker from 'E' to 'I' X+ spells.c: fixed td_destroy, so that when it destroys trap on chest, it also changes X+ name of chest to reflect this X+ moria2.c, spells.c: eliminated first extraneous space in " (Empty)" etc. strings X+ scrolls.c: fixed dangling pointer bug, was calling inven_destroy, and then using X+ pointer to destroyed object X+ files.c, death.c: add name of score file to "can't open" error messages X+ moria2.c: examine_book does not work if blind/no light/confused X+ treasure1.c, treasure2.c: add plurals to magic books, and pints of ale/wine X+ io.c: panic save if read EOF from stdin X+ main.c, save.c, signals.c: only panic save if character generation is complete, X+ eliminated variable generate X+ signals.c: flush input in control-C handler, move put_qio so "y/n?" message erased X+ dungeon.c: ^A (0) no longer asks if you want to quit, can be returned by an X+ interrupted getchar call X+ moria1.c: area_affect does not need to test find_flag, it is always true X+ treasure1.c: change potion of water to "crystal clear", so no conflict with X+ randomly named potions X+ config.h, death.c, save.c: added option SCORE_PANIC_SAVES for those who X+ find the non-scoring panic_save feature annoying X+ store2.c: add asterisk to call through function pointer, some compilers need this X+ constants.h, README, wizard.c: update patch level to 4, create PATCHLEVEL X+ define and print it out with version command X X Working on: X*************** X*** 480,507 **** X X Things to be fixed: X! X! check plurals "~" in object names, esp. Pint in treasure2.c X! make get_panel run stops user customizable? X! objects in outside corners do not stop run X! moria1.c: area_affect does not need to check "if (find_flag)" X! carefully check everyplace that clears find_flag, there are a lot X! of unnecessary checks, perhaps even some recursive calls to move_char X! check setting of moria_flag in dungeon.c, esp. after restore_char () X add "moria ^file" option to automatically do wizard restore, X do the umask calls in the program instead of forcing user to type them X! don't ask for quit on char '\0', should instead ignore it X! check for EOF when reading characters X! complaint that a hangup (kill -1) results in a game whose X! score will no longer be posted to the scoreboard X! resting should have small but finite chance of waking a monster X! perhaps check once every 10 turns against randint(6) > stealth X! cursor should be positioned somewhere before each inkey call X all npc spells should print descriptive message X allow rerolling after choose race/class X! remove "clear" from random potion names? X pad should take a char not a string X- print a number with the repeat_msg command X Message line overextending into second line should be erased X! identify staffs/wands as having zero charges, when they run out X ``can't carry that much weight'' before ``that many items'' is wrong? X I like it the way it is now, though X--- 538,582 ---- X X Things to be fixed: X! suspend handler should save/restore local special characters, X! need routine to surround or replace suspend_handdler() X! these commands which take a dir should not work when confused, X! bash, tunnel, closeobject, jamdoor, openobject X add "moria ^file" option to automatically do wizard restore, X do the umask calls in the program instead of forcing user to type them X! some armor have negative to-hit values, should this be part of the name? X! mention this in the Moria.doc file X! add a pull-back map command like the PC version, display entire map on screen X! only showing important features, like stairs X! apply the new.16bit.patches to create a new Int16bit.patch file X! identify staffs/wands as having zero charges, when they run out X! list of spell books not cleared when get cast which spell? prompt X! wielding heavy wepaons, fix + to hit on screen? X! ptho subtracted in attak_blows() misc2.c, could probably subtract X! these point in moria1.c py_bonuses(), when calculate dis_th X! should one really be able to find a chest inside of another chest?? X! received report that someone once lost a light source because of the X! wield/wear command, I don't see anything wrong though X! trap names are vague, X! have two names for each trap, a simple search discloses current vague name, X! setting it off, or a find/identify trap gives the long name X! use of reset_flag for free moves still a little inconsistent X! commands that only use objects in backpack (use,aim,quaff,eat,read_scroll, X! pray,cast,etc.) are free move if no action taken, X! other commands (bash,openobject,closeobject,jamdoor,etc.) always use move X! even if no action taken X! problems with mass polymorph wand? I once ended up surrounded by X! non existant mushrooms after many zaps. I think it is a race, i.e. X! scans monster list while adding and deleting elements. X! - this can also while cloning cubes X! - also, when compact_monsters deletes a monster, it does not update screen X! add scorefile editing functions, perhaps just have an ascii score file? X! should low level monsters be able to eat high level monsters? X! objects in outside corners do not stop run X all npc spells should print descriptive message X allow rerolling after choose race/class X! cursor should be positioned somewhere before each inkey call X pad should take a char not a string X Message line overextending into second line should be erased X! print a number with the repeat_msg command X ``can't carry that much weight'' before ``that many items'' is wrong? X I like it the way it is now, though X*************** X*** 509,512 **** X--- 584,589 ---- X perhaps use only motion optimization stuff? X Dot tunneling command X+ resting should have small but finite chance of waking a monster X+ perhaps check once every 10 turns against randint(6) > stealth X encrypt info before writing it to the save file X perhaps xor with stat buffer X*************** X*** 517,522 **** X of the vault_trap bug fixed 4/6 X subval, missile_ctr could be short ints X- note that some armor can decrease to-hit values in docs, X- should these be displayed in name? X missing amulets, 1-4 strength, constitution, intelligence, dexterity X missing rings 5-6 gain wisdom, gain charisma X--- 594,597 ---- X*************** X*** 529,533 **** X perhaps some ifdefed code which does no-blocking I/O for them? X add death due to starvation X- wielding heavy wepaons, fix + to hit on screen? X don't let dragons breathe on first attack, AMHD is nasty X especially after the screen changes to the next panel X--- 604,607 ---- X*************** X*** 534,538 **** X checking both ((!m_ptr->ml) or (!see_invis && mon invis)) is probably X redundant when determining whether or not player can see a monster X- list of spell books not cleared when get cast which spell? prompt X should we call m_name if spell only applies to visible creatures? X many spells do not print desciptive comment, aggravate_monster for instance X--- 608,611 ---- X*************** X*** 562,567 **** X in general, loss of an ability should have many affects, non of which are X implemented, for example, lose of intelligence should cause a mage X! to lose spells X! cases of permanent slowness reported? X add user name to scoreboard? X also add points and experience to scoreboard X--- 635,640 ---- X in general, loss of an ability should have many affects, non of which are X implemented, for example, lose of intelligence should cause a mage X! to lose spells, gain of int should cause mage to learn spells X! cases of permanent slowness reported, why does this happen? X add user name to scoreboard? X also add points and experience to scoreboard X*************** X*** 570,574 **** X change turn to a long X store_open should be a long X- use of reset_flag for free moves still a little inconsistent X fix save files to include obj desc, then only need one random number X generator which can use table program X--- 643,646 ---- X*************** X*** 575,582 **** X replace magic numbers with constants X name objects if use did not identify them X X- add a pull-back map command like the PC version, display entire map on screen X- only showing important features, like stairs X- X Very Hard things to add: X recenter character on screen? X--- 647,654 ---- X replace magic numbers with constants X name objects if use did not identify them X+ light spells should work in corridors, what they light should be permanent X+ creeping coins should leaves coins as treasure X+ when creature steals and then dies, the stolen item should appear X X Very Hard things to add: X recenter character on screen? X*************** X*** 588,593 **** X--- 660,667 ---- X 'flavor' the levels, dragons on one level, undead on another, etc. X what's been discovered list X+ make get_panel run stops user customizable? via environment variable X use environment variables to specify rogue-like/original keys X use environment variable for default save file X+ use environment variables for files.c: page_height,page_width, filename X add option to restore files from default save filename X commands not close enough to rogue style X*** oldmoria/README Sun Oct 30 01:16:34 1988 X--- newmoria/README Sun Oct 30 01:07:32 1988 X*************** X*** 1,4 **** X X! This copy of umoria includes the first three patch files (upto u487.p3). X X Please report problems to wilson@ji.Berkeley.EDU (ucbvax!ucbji!wilson). X--- 1,4 ---- X X! This copy of 4.87 umoria includes the first four patch files (upto u487.p4). X X Please report problems to wilson@ji.Berkeley.EDU (ucbvax!ucbji!wilson). X*** oldmoria/config.h Sun Oct 30 01:16:45 1988 X--- newmoria/config.h Sun Oct 30 01:07:32 1988 X*************** X*** 38,43 **** X /* if the screen does not look right (it will be obvious) then you have a buggy X version of curses, and you must define this */ X! /* this must be defined for Ultrix systems, and for most 4.2BSD systems X! it is not needed for Dynix */ X /* only need to recompile io.c */ X /* #define BUGGY_CURSES */ X--- 38,42 ---- X /* if the screen does not look right (it will be obvious) then you have a buggy X version of curses, and you must define this */ X! /* this must be defined for Ultrix systems, and for most 4.2BSD systems */ X /* only need to recompile io.c */ X /* #define BUGGY_CURSES */ X*************** X*** 45,49 **** X /* define this is your machine does not have signed characters: X this is needed for IBM PC-RT, 3B1, 3B2, 3B20, and perhaps others */ X! /* #define NO_SIGNED_CHARS X X /* this will slow down the game a bit, and therefore make it use up a little X--- 44,48 ---- X /* define this is your machine does not have signed characters: X this is needed for IBM PC-RT, 3B1, 3B2, 3B20, and perhaps others */ X! /* #define NO_SIGNED_CHARS */ X X /* this will slow down the game a bit, and therefore make it use up a little X*************** X*** 52,55 **** X--- 51,61 ---- X /* only need to recompile dungeon.c and create.c X /* #define SLOW */ X+ X+ /* if this is defined, scores from panic save files will be added to the X+ scoreboard, this is not recommended because it enables several rather X+ devious cheating methods, however, it is useful on systems where HANGUP X+ signals are common (i.e. lots of dialup users, unreliable terminal X+ multiplexors, etc.) */ X+ /* #define SCORE_PANIC_SAVES */ X X /* system dependent defines follow, you should not need to change anything X*** oldmoria/constants.h Sun Oct 30 01:18:04 1988 X--- newmoria/constants.h Sun Oct 30 01:07:33 1988 X*************** X*** 10,13 **** X--- 10,14 ---- X /* Current version number of Moria */ X #define CUR_VERSION 4.87 X+ #define PATCH_LEVEL 4 X X #ifndef TRUE X*** oldmoria/creature.c Sun Oct 30 01:17:37 1988 X--- newmoria/creature.c Sun Oct 30 01:07:34 1988 X*************** X*** 423,427 **** X case 24: /*Eat charges */ X if (test_hit(15, (int)c_ptr->level, 0, p_ptr->pac+p_ptr->ptoac)) X! flag = TRUE; X break; X case 99: X--- 423,428 ---- X case 24: /*Eat charges */ X if (test_hit(15, (int)c_ptr->level, 0, p_ptr->pac+p_ptr->ptoac)) X! if (inven_ctr > 0) /* check to make sure an object exists */ X! flag = TRUE; X break; X case 99: X*************** X*** 1171,1175 **** X (void) strcat(cdesc, "breathes lightning."); X msg_print(cdesc); X! breath(1, char_row, char_col, (int)(m_ptr->hp/4.0), ddesc); X break; X case 21: /*Breath Gas */ X--- 1172,1176 ---- X (void) strcat(cdesc, "breathes lightning."); X msg_print(cdesc); X! breath(1, char_row, char_col, (m_ptr->hp / 4), ddesc); X break; X case 21: /*Breath Gas */ X*************** X*** 1176,1180 **** X (void) strcat(cdesc, "breathes gas."); X msg_print(cdesc); X! breath(2, char_row, char_col, (int)(m_ptr->hp/3.0), ddesc); X break; X case 22: /*Breath Acid */ X--- 1177,1181 ---- X (void) strcat(cdesc, "breathes gas."); X msg_print(cdesc); X! breath(2, char_row, char_col, (m_ptr->hp / 3), ddesc); X break; X case 22: /*Breath Acid */ X*************** X*** 1181,1185 **** X (void) strcat(cdesc, "breathes acid."); X msg_print(cdesc); X! breath(3, char_row, char_col, (int)(m_ptr->hp/3.0), ddesc); X break; X case 23: /*Breath Frost */ X--- 1182,1186 ---- X (void) strcat(cdesc, "breathes acid."); X msg_print(cdesc); X! breath(3, char_row, char_col, (m_ptr->hp / 3), ddesc); X break; X case 23: /*Breath Frost */ X*************** X*** 1186,1190 **** X (void) strcat(cdesc, "breathes frost."); X msg_print(cdesc); X! breath(4, char_row, char_col, (int)(m_ptr->hp/3.0), ddesc); X break; X case 24: /*Breath Fire */ X--- 1187,1191 ---- X (void) strcat(cdesc, "breathes frost."); X msg_print(cdesc); X! breath(4, char_row, char_col, (m_ptr->hp / 3), ddesc); X break; X case 24: /*Breath Fire */ X*************** X*** 1191,1195 **** X (void) strcat(cdesc, "breathes fire."); X msg_print(cdesc); X! breath(5, char_row, char_col, (int)(m_ptr->hp/3.0), ddesc); X break; X default: X--- 1192,1196 ---- X (void) strcat(cdesc, "breathes fire."); X msg_print(cdesc); X! breath(5, char_row, char_col, (m_ptr->hp / 3), ddesc); X break; X default: X*************** X*** 1350,1354 **** X else if (py.flags.rest < 1) X if (randint(10) > py.misc.stl) X! m_ptr->csleep -= (75.0/m_ptr->cdis); X if (m_ptr->stunned > 0) X m_ptr->stunned--; X--- 1351,1355 ---- X else if (py.flags.rest < 1) X if (randint(10) > py.misc.stl) X! m_ptr->csleep -= (75 / m_ptr->cdis); X if (m_ptr->stunned > 0) X m_ptr->stunned--; X*** oldmoria/death.c Sun Oct 30 01:18:05 1988 X--- newmoria/death.c Sun Oct 30 01:07:35 1988 X*************** X*** 133,140 **** X high_scores score; X char list[20][256]; X X if (1 > (fd = open(MORIA_TOP, O_RDONLY, 0644))) X { X! prt("Error opening top twenty file\n", 0, 0); X return ; X } X--- 133,142 ---- X high_scores score; X char list[20][256]; X+ char string[100]; X X if (1 > (fd = open(MORIA_TOP, O_RDONLY, 0644))) X { X! sprintf (string, "Error opening score file \"%s\"\n", MORIA_TOP); X! prt(string, 0, 0); X return ; X } X*************** X*** 267,270 **** X--- 269,273 ---- X exit_game(); X X+ #ifndef SCORE_PANIC_SAVES X if (panic_save == 1) X { X*************** X*** 275,278 **** X--- 278,282 ---- X exit_game(); X } X+ #endif X X myscore.points = (long)total_points(); X*** oldmoria/dungeon.c Sun Oct 30 01:17:26 1988 X--- newmoria/dungeon.c Sun Oct 30 01:07:53 1988 X*************** X*** 704,708 **** X if (randint(100) == 1) X { X! find_flag = FALSE; /* no need for move_char(5) */ X teleport(40); X } X--- 704,708 ---- X if (randint(100) == 1) X { X! find_flag = FALSE; /* no need for move_char(5) */ X teleport(40); X } X*************** X*** 753,757 **** X switch(*com_val) X { X! case 0: case 11: /*^K == exit */ X flush(); X if (get_com("Enter 'Q' to quit", &command)) X--- 753,757 ---- X switch(*com_val) X { X! case 11: /*^K == exit */ X flush(); X if (get_com("Enter 'Q' to quit", &command)) X*************** X*** 1084,1087 **** X--- 1084,1089 ---- X restore_char(); /*^V == restore */ X prt_stat_block(); X+ /* force generation of new level, in case there is something wrong X+ with the old one */ X moria_flag = TRUE; X break; X*************** X*** 1147,1151 **** X switch(*com_val) X { X! case 0: case 'Q': /*Q == exit */ X flush(); X if (get_com("Do you really want to quit?", &command)) X--- 1149,1153 ---- X switch(*com_val) X { X! case 'Q': /*Q == exit */ X flush(); X if (get_com("Do you really want to quit?", &command)) X*************** X*** 1566,1569 **** X--- 1568,1573 ---- X restore_char(); /*^V == restore */ X prt_stat_block(); X+ /* force generation of new level, in case there is something wrong X+ with the old one */ X moria_flag = TRUE; X break; X*** oldmoria/eat.c Sun Oct 30 01:18:14 1988 X--- newmoria/eat.c Sun Oct 30 01:07:35 1988 X*************** X*** 210,214 **** X { X m_ptr = &py.misc; X! m_ptr->exp += ((i_ptr->level/m_ptr->lev) + .5); X prt_experience(); X } X--- 210,214 ---- X { X m_ptr = &py.misc; X! m_ptr->exp += (((float) i_ptr->level / (float) m_ptr->lev) + 0.5); X prt_experience(); X } X*** oldmoria/externs.h Sun Oct 30 01:18:15 1988 X--- newmoria/externs.h Sun Oct 30 01:07:42 1988 X*************** X*** 12,16 **** X extern int missile_ctr; /* Counter for missiles */ X extern int msg_flag; /* Set with first msg */ X- extern int generate; /* Generate next level */ X extern int death; /* True if died */ X extern vtype died_from; /* What killed him */ X--- 12,15 ---- X*************** X*** 93,97 **** X extern treasure_type object_list[MAX_OBJECTS]; X extern int object_ident[MAX_OBJECTS]; X! extern int t_level[MAX_OBJ_LEVEL]; X extern treasure_type gold_list[MAX_GOLD]; X extern treasure_type t_list[MAX_TALLOC]; X--- 92,96 ---- X extern treasure_type object_list[MAX_OBJECTS]; X extern int object_ident[MAX_OBJECTS]; X! extern int t_level[MAX_OBJ_LEVEL+1]; X extern treasure_type gold_list[MAX_GOLD]; X extern treasure_type t_list[MAX_TALLOC]; X*** oldmoria/files.c Sun Oct 30 01:18:00 1988 X--- newmoria/files.c Sun Oct 30 01:07:36 1988 X*************** X*** 33,37 **** X if (1 > (highscore_fd = open(MORIA_TOP, O_RDWR | O_CREAT, 0644))) X { X! (void) fputs("Can't open score file!\n", stderr); X exit(1); X } X--- 33,37 ---- X if (1 > (highscore_fd = open(MORIA_TOP, O_RDWR | O_CREAT, 0644))) X { X! (void) fprintf (stderr, "Can't open score file \"%s\"\n", MORIA_TOP); X exit(1); X } X*************** X*** 120,138 **** X register k, l; X register i7, i8; X! char dun_line[MAX_WIDTH]; X char *dun_ptr; X! vtype filename1; X char tmp_str[80]; X FILE *file1; X! int page_width = OUTPAGE_WIDTH; X! int page_height = OUTPAGE_HEIGHT; X X /* this allows us to strcat each character in the inner loop, X instead of using the expensive sprintf */ X! prt("File name: ", 0, 0); X! if (get_string(filename1, 0, 11, 64)) X { X! if (strlen(filename1) == 0) X! (void) strcpy(filename1, "MORIAMAP.DAT"); X if ((file1 = fopen(filename1, "w")) == NULL) X { X--- 120,140 ---- X register k, l; X register i7, i8; X! char dun_line[MAX_WIDTH+1]; X char *dun_ptr; X! static vtype filename1 = "MORIAMAP.DAT"; X! vtype filename2; X char tmp_str[80]; X FILE *file1; X! static int page_width = OUTPAGE_WIDTH; X! static int page_height = OUTPAGE_HEIGHT; X X /* this allows us to strcat each character in the inner loop, X instead of using the expensive sprintf */ X! (void) sprintf (tmp_str, "File name [%s]: ", filename1); X! prt(tmp_str, 0, 0); X! if (get_string(filename2, 0, strlen(tmp_str), 64)) X { X! if (strlen(filename2) > 0) X! (void) strcpy(filename1, filename2); X if ((file1 = fopen(filename1, "w")) == NULL) X { X*************** X*** 209,212 **** X--- 211,215 ---- X } X *dun_ptr++ = '\n'; X+ *dun_ptr++ = '\0'; X (void) fputs(dun_line, file1); X } X*** oldmoria/generate.c Sun Oct 30 01:17:53 1988 X--- newmoria/generate.c Sun Oct 30 01:07:37 1988 X*************** X*** 140,145 **** X X /* Choose starting point and direction */ X! y = (cur_height/2.0) + 11 - randint(23); X! x = (cur_width/2.0) + 16 - randint(33); X X dir = randint(8); /* Number 1-4, 6-9 */ X--- 140,145 ---- X X /* Choose starting point and direction */ X! y = (cur_height / 2) + 11 - randint(23); X! x = (cur_width / 2) + 16 - randint(33); X X dir = randint(8); /* Number 1-4, 6-9 */ X*** oldmoria/help.c Sun Oct 30 01:17:33 1988 X--- newmoria/help.c Sun Oct 30 01:07:38 1988 X*************** X*** 133,137 **** X prt("e Equipment list. | ^X Save character and quit.", X 14, 0); X! prt("f Fire/Throw an item. | $ Shell out of game.", 15, 0); X /* prt("h Help on key commands. |", 16, 0); */ X prt("i Inventory list. | < Go up an up-staircase.", 17, 0); X--- 133,137 ---- X prt("e Equipment list. | ^X Save character and quit.", X 14, 0); X! prt("f Fire/Throw an item. | ! Shell out of game.", 15, 0); X /* prt("h Help on key commands. |", 16, 0); */ X prt("i Inventory list. | < Go up an up-staircase.", 17, 0); X*** oldmoria/io.c Sun Oct 30 01:17:17 1988 X--- newmoria/io.c Sun Oct 30 01:07:38 1988 X*************** X*** 3,6 **** X--- 3,7 ---- X #include X #include X+ #include X X #include "constants.h" X*************** X*** 231,236 **** X char *ch; X { X put_qio(); /* Dump IO buffer */ X! *ch = getch(); X msg_flag = FALSE; X } X--- 232,251 ---- X char *ch; X { X+ int i; X+ X put_qio(); /* Dump IO buffer */ X! i = getch(); X! if ((i == EOF) && (feof (stdin))) X! { X! prt ("Read end of file!!!!!", 22, 0); X! refresh (); X! /* fake a call to the signal handler routines to do a panic save */ X! #ifdef USG X! signal_save_core (-1); X! #else X! signal_save_core (-1, -1, (struct sigcontext *)0); X! #endif X! } X! *ch = i; X msg_flag = FALSE; X } X*** oldmoria/main.c Sun Oct 30 01:18:08 1988 X--- newmoria/main.c Sun Oct 30 01:07:39 1988 X*************** X*** 134,138 **** X if ((argc > 1) && strlen(argv[argc-1])) X { /* Retrieve character */ X! generate = get_char(argv[argc-1]); X change_name(); X magic_init(); X--- 134,138 ---- X if ((argc > 1) && strlen(argv[argc-1])) X { /* Retrieve character */ X! get_char(argv[argc-1]); X change_name(); X magic_init(); X*************** X*** 154,158 **** X py.misc.cmana = (double)py.misc.mana; X magic_init(); X! generate = TRUE; X } X X--- 154,162 ---- X py.misc.cmana = (double)py.misc.mana; X magic_init(); X! generate_cave(); X! /* prevent ^c quit from entering score into scoreboard, X! and prevent signal from creating panic save until this point, X! all info needed for save file is now valid */ X! character_generated = 1; X } X X*************** X*** 164,175 **** X clear_screen(0, 0); X prt_stat_block(); X- /* prevent ^c quit from entering score into scoreboard until this point */ X- character_generated = 1; X X /* Loop till dead, or exit */ X while(!death) { X- if (generate) generate_cave(); /* New level */ X dungeon(); /* Dungeon logic */ X! generate = TRUE; X } X upon_death(); /* Character gets buried */ X--- 168,176 ---- X clear_screen(0, 0); X prt_stat_block(); X X /* Loop till dead, or exit */ X while(!death) { X dungeon(); /* Dungeon logic */ X! generate_cave (); /* New level */ X } X upon_death(); /* Character gets buried */ X*** oldmoria/misc1.c Sun Oct 30 01:17:20 1988 X--- newmoria/misc1.c Sun Oct 30 01:07:30 1988 X*************** X*** 740,744 **** X mon_ptr->csleep = 0; X else X! mon_ptr->csleep = (c_list[z].sleep/5.0) + randint(c_list[z].sleep); X } X else X--- 740,744 ---- X mon_ptr->csleep = 0; X else X! mon_ptr->csleep = (c_list[z].sleep / 5) + randint(c_list[z].sleep); X } X else X*************** X*** 1074,1078 **** X /* abs may be a macro, don't call it with randnor as a parameter */ X tmp = randnor(0, stand_dev); X! x = (abs(tmp)/10.0) + base; X if (x < base) X return(base); X--- 1074,1078 ---- X /* abs may be a macro, don't call it with randnor as a parameter */ X tmp = randnor(0, stand_dev); X! x = (abs(tmp) / 10) + base; X if (x < base) X return(base); X*** oldmoria/misc2.c Sun Oct 30 01:17:07 1988 X--- newmoria/misc2.c Sun Oct 30 01:07:40 1988 X*************** X*** 291,295 **** X X popt(&cur_pos); X! i = ((randint(dun_level+2)+2)/2.0) - 1; X if (randint(OBJ_GREAT) == 1) X i += randint(dun_level+1); X--- 291,295 ---- X X popt(&cur_pos); X! i = ((randint(dun_level+2)+2) / 2) - 1; X if (randint(OBJ_GREAT) == 1) X i += randint(dun_level+1); X*************** X*** 439,443 **** X /* Print character stat in given row, column -RAK- */ X prt_stat(stat_name, stat, row, column) X! vtype stat_name; X byteint stat; X int row, column; X--- 439,443 ---- X /* Print character stat in given row, column -RAK- */ X prt_stat(stat_name, stat, row, column) X! char *stat_name; X byteint stat; X int row, column; X*************** X*** 456,460 **** X /* the longest title is 13 characters, so only pad to 13 */ X prt_field(info, row, column) X! vtype info; X int row, column; X { X--- 456,460 ---- X /* the longest title is 13 characters, so only pad to 13 */ X prt_field(info, row, column) X! char *info; X int row, column; X { X*************** X*** 465,469 **** X /* Print number with header at given row, column -RAK- */ X prt_num(header, num, row, column) X! vtype header; X int num, row, column; X { X--- 465,469 ---- X /* Print number with header at given row, column -RAK- */ X prt_num(header, num, row, column) X! char *header; X int num, row, column; X { X*************** X*** 1367,1371 **** X /* Print list of spells -RAK- */ X print_new_spells(spell, num, redraw) X! spl_type spell; X register int num; X int *redraw; X--- 1367,1371 ---- X /* Print list of spells -RAK- */ X print_new_spells(spell, num, redraw) X! spl_rec *spell; X register int num; X int *redraw; X*************** X*** 1392,1399 **** X /* Returns spell pointer -RAK- */ X int get_spell(spell, num, sn, sc, prompt, redraw) X! spl_type spell; X register int num; X register int *sn, *sc; X! vtype prompt; X int *redraw; X { X--- 1392,1399 ---- X /* Returns spell pointer -RAK- */ X int get_spell(spell, num, sn, sc, prompt, redraw) X! spl_rec *spell; X register int num; X register int *sn, *sc; X! char *prompt; X int *redraw; X { X*************** X*** 1844,1848 **** X else if (p_ptr->cdex < 118) blows = 5; X else blows = 6; X! adj_weight = ((p_ptr->cstr*10)/weight); X if (adj_weight < 2) blows = 1; X else if (adj_weight < 3) blows = (blows/3.0) + 1; X--- 1844,1848 ---- X else if (p_ptr->cdex < 118) blows = 5; X else blows = 6; X! adj_weight = ((p_ptr->cstr*10) / weight); X if (adj_weight < 2) blows = 1; X else if (adj_weight < 3) blows = (blows/3.0) + 1; X*** oldmoria/monsters.c Sun Oct 30 01:16:38 1988 X--- newmoria/monsters.c Sun Oct 30 01:07:49 1988 X*************** X*** 610,614 **** X 20, 48, 1, 'T', "14d8" , "1 1 1d8|1 1 1d8|1 2 1d6|1 2 1d6", 32}, X {"Invisible Stalker" ,0x00030022,0x00000000,0x0000, 200, 200, X! 20, 46, 3, 'E', "19d8" , "1 1 1d6" , 32}, X {"Giant Hunter Ant" ,0x00000002,0x00000000,0x0002, 10, 150, X 16, 40, 1, 'a', "12d8" , "1 2 4d8" , 32}, X--- 610,614 ---- X 20, 48, 1, 'T', "14d8" , "1 1 1d8|1 1 1d8|1 2 1d6|1 2 1d6", 32}, X {"Invisible Stalker" ,0x00030022,0x00000000,0x0000, 200, 200, X! 20, 46, 3, 'I', "19d8" , "1 1 1d6" , 32}, X {"Giant Hunter Ant" ,0x00000002,0x00000000,0x0002, 10, 150, X 16, 40, 1, 'a', "12d8" , "1 2 4d8" , 32}, X*** oldmoria/moria1.c Sun Oct 30 01:17:01 1988 X--- newmoria/moria1.c Sun Oct 30 01:07:54 1988 X*************** X*** 1375,1380 **** X /* When blinded, move only the player symbol... */ X sub3_move_light(y1, x1, y2, x2) X! register int x1, y1; X! int x2, y2; X { X register int i, j; X--- 1375,1380 ---- X /* When blinded, move only the player symbol... */ X sub3_move_light(y1, x1, y2, x2) X! register int y1, x1; X! int y2, x2; X { X register int i, j; X*************** X*** 1393,1397 **** X /* With no light, movement becomes involved... */ X sub4_move_light(y1, x1, y2, x2) X! register y1, x1; X int y2, x2; X { X--- 1393,1397 ---- X /* With no light, movement becomes involved... */ X sub4_move_light(y1, x1, y2, x2) X! register int y1, x1; X int y2, x2; X { X*************** X*** 1645,1651 **** X p_ptr = &py.flags; X if (p_ptr->confused+p_ptr->blind > 0) X! chance = chance / 10.0; X else if (no_light()) X! chance = chance / 5.0; X for (i = (y - 1); i <= (y + 1); i++) X for (j = (x - 1); j <= (x + 1); j++) X--- 1645,1651 ---- X p_ptr = &py.flags; X if (p_ptr->confused+p_ptr->blind > 0) X! chance = chance / 10; X else if (no_light()) X! chance = chance / 5; X for (i = (y - 1); i <= (y + 1); i++) X for (j = (x - 1); j <= (x + 1); j++) X*************** X*** 1724,1728 **** X } X } X! if ((find_flag) && (py.flags.blind < 1)) X { X switch(dir) X--- 1724,1728 ---- X } X } X! if (py.flags.blind < 1) X { X switch(dir) X*************** X*** 1784,1799 **** X /* Objects player can see*/ X /* Including doors */ X! if (find_flag) X! if (player_light) X! { X! if (c_ptr->tptr != 0) X! if ((t_list[c_ptr->tptr].tval != 101) && X! (t_list[c_ptr->tptr].tval != 109)) X! { X! find_flag = FALSE; /* no need to call move_light */ X! return; X! } X! } X! else if ((c_ptr->tl) || (c_ptr->pl) || (c_ptr->fm)) X if (c_ptr->tptr != 0) X if ((t_list[c_ptr->tptr].tval != 101) && X--- 1784,1789 ---- X /* Objects player can see*/ X /* Including doors */ X! if (player_light) X! { X if (c_ptr->tptr != 0) X if ((t_list[c_ptr->tptr].tval != 101) && X*************** X*** 1803,1818 **** X return; X } X! /* Creatures */ X! if (find_flag) X! if ((c_ptr->tl) || (c_ptr->pl) || (player_light)) X! if (c_ptr->cptr > 1) X { X! m_ptr = &m_list[c_ptr->cptr]; X! if (m_ptr->ml) X! { X! find_flag = FALSE; /* no need to call move_light */ X! return; X! } X } X } X } X--- 1793,1816 ---- X return; X } X! } X! else if ((c_ptr->tl) || (c_ptr->pl) || (c_ptr->fm)) X! if (c_ptr->tptr != 0) X! if ((t_list[c_ptr->tptr].tval != 101) && X! (t_list[c_ptr->tptr].tval != 109)) X { X! find_flag = FALSE; /* no need to call move_light */ X! return; X } X+ /* Creatures */ X+ if ((c_ptr->tl) || (c_ptr->pl) || (player_light)) X+ if (c_ptr->cptr > 1) X+ { X+ m_ptr = &m_list[c_ptr->cptr]; X+ if (m_ptr->ml) X+ { X+ find_flag = FALSE; /* no need to call move_light */ X+ return; X+ } X+ } X } X } X*** oldmoria/moria2.c Sun Oct 30 01:16:49 1988 X--- newmoria/moria2.c Sun Oct 30 01:07:42 1988 X*************** X*** 352,355 **** X--- 352,361 ---- X if (!find_range(90, 91, &i, &k)) X msg_print("You are not carrying any books."); X+ else if (py.flags.blind > 0) X+ msg_print("You can't see to read your spell book!"); X+ else if (no_light()) X+ msg_print("You have no light to read by."); X+ else if (py.flags.confused > 0) X+ msg_print("You are too confused..."); X else if (get_item(&item_val, "Which Book?", &redraw, i, k)) X { X*************** X*** 739,743 **** X c_ptr = &c_list[m_ptr->mptr]; X p_ptr = &py.misc; X! acc_tmp = c_ptr->mexp*((c_ptr->level+0.1)/p_ptr->lev); X i = (int)(acc_tmp); X acc_exp += (acc_tmp - i); X--- 745,749 ---- X c_ptr = &c_list[m_ptr->mptr]; X p_ptr = &py.misc; X! acc_tmp = c_ptr->mexp * ((float) c_ptr->level / (float) p_ptr->lev); X i = (int)(acc_tmp); X acc_exp += (acc_tmp - i); X*************** X*** 1126,1130 **** X if (tmp_str != 0) X tmp_str[0] = '\0'; X! (void) strcat(t_ptr->name, " (Empty)"); X known2(t_ptr->name); X t_ptr->cost = 0; X--- 1132,1136 ---- X if (tmp_str != 0) X tmp_str[0] = '\0'; X! (void) strcat(t_ptr->name, "(Empty)"); X known2(t_ptr->name); X t_ptr->cost = 0; X*************** X*** 1150,1154 **** X else X msg_print("I do not see anything you can open there."); X! } X } X X--- 1156,1160 ---- X else X msg_print("I do not see anything you can open there."); X! } X } X X*************** X*** 1380,1388 **** X tot = t1 + t2 + t3 + t4; X if (py.flags.blind > 0) X! tot = tot / 5.0; X else if (no_light()) X! tot = tot / 2.0; X if (py.flags.confused > 0) X! tot = tot / 3.0; X i = t_list[c_ptr->tptr].tval; X t5 = t_list[c_ptr->tptr].level; X--- 1386,1394 ---- X tot = t1 + t2 + t3 + t4; X if (py.flags.blind > 0) X! tot = tot / 5; X else if (no_light()) X! tot = tot / 2; X if (py.flags.confused > 0) X! tot = tot / 3; X i = t_list[c_ptr->tptr].tval; X t5 = t_list[c_ptr->tptr].level; X*************** X*** 1424,1430 **** X tmp_str[0] = '\0'; X if (0x00000001 & i_ptr->flags) X! (void) strcat(i_ptr->name, " (Locked)"); X else X! (void) strcat(i_ptr->name, " (Disarmed)"); X msg_print("You have disarmed the chest."); X known2(i_ptr->name); X--- 1430,1436 ---- X tmp_str[0] = '\0'; X if (0x00000001 & i_ptr->flags) X! (void) strcat(i_ptr->name, "(Locked)"); X else X! (void) strcat(i_ptr->name, "(Disarmed)"); X msg_print("You have disarmed the chest."); X known2(i_ptr->name); X*************** X*** 1888,1895 **** X i_ptr->tval = 1; X p_ptr = &py; X! p_ptr->misc.bth = ((p_ptr->stats.cstr+ X! p_ptr->misc.wt)/6.0); X p_ptr->misc.ptohit = 0; X! p_ptr->misc.ptodam = (p_ptr->misc.wt/75.0) + 1; X if (py_attack(y, x)) X { X--- 1894,1900 ---- X i_ptr->tval = 1; X p_ptr = &py; X! p_ptr->misc.bth = ((p_ptr->stats.cstr + p_ptr->misc.wt) / 6); X p_ptr->misc.ptohit = 0; X! p_ptr->misc.ptodam = (p_ptr->misc.wt / 75) + 1; X if (py_attack(y, x)) X { X*** oldmoria/potions.c Sun Oct 30 01:17:27 1988 X--- newmoria/potions.c Sun Oct 30 01:07:42 1988 X*************** X*** 253,257 **** X msg_print("You feel your memories fade..."); X /* avoid randint(0) call */ X! l = (py.misc.exp/5.0); X if (l == 0) X lose_exp(1); X--- 253,257 ---- X msg_print("You feel your memories fade..."); X /* avoid randint(0) call */ X! l = (py.misc.exp / 5); X if (l == 0) X lose_exp(1); X*************** X*** 360,364 **** X { X m_ptr = &py.misc; X! m_ptr->exp += (int)(i_ptr->level/m_ptr->lev + 0.5); X prt_experience(); X } X--- 360,364 ---- X { X m_ptr = &py.misc; X! m_ptr->exp += (((float) i_ptr->level / (float) m_ptr->lev) + 0.5); X prt_experience(); X } X*** oldmoria/save.c Sun Oct 30 01:17:39 1988 X--- newmoria/save.c Sun Oct 30 01:07:43 1988 X*************** X*** 311,315 **** X else if (flag) X { X! (void) sprintf(temp,"Character saved. [Moria Version %lf]",CUR_VERSION); X prt(temp, 0, 0); X if (exit) X--- 311,315 ---- X else if (flag) X { X! (void) sprintf(temp,"Character saved. [Moria Version %.2lf]\n",CUR_VERSION); X prt(temp, 0, 0); X if (exit) X*************** X*** 471,475 **** X controlz(); X X! if (buf.st_atime >= buf2.st_atime + 5) X { X (void) sprintf(temp, "File %s has been touched, sorry.", fnam); X--- 471,475 ---- X controlz(); X X! if (buf.st_mtime >= buf2.st_mtime + 5) X { X (void) sprintf(temp, "File %s has been touched, sorry.", fnam); X*************** X*** 495,499 **** X else X { X! age = (long)buf2.st_atime - (long)buf.st_atime; /* age in seconds */ X age = (age / 86400) + 1; /* age in days */ X for (i = 0; i < age; i++) X--- 495,499 ---- X else X { X! age = (long)buf2.st_atime - (long)buf.st_mtime; /* age in seconds */ X age = (age / 86400) + 1; /* age in days */ X for (i = 0; i < age; i++) X*************** X*** 508,511 **** X--- 508,517 ---- X } X X+ /* prevent ^c quit from entering score into scoreboard, X+ and prevent signal from creating panic save until this point, X+ old save file has just been deleted */ X+ character_generated = 1; X+ X+ #ifndef SCORE_PANIC_SAVES X if (panic_save == 1) X { X*************** X*** 515,518 **** X--- 521,525 ---- X msg_print (" "); X } X+ #endif X X /* reidentify objects */ X*************** X*** 531,535 **** X death = 1; X } X- X- return(FALSE); X } X--- 538,540 ---- X*** oldmoria/scrolls.c Sun Oct 30 01:18:02 1988 X--- newmoria/scrolls.c Sun Oct 30 01:07:44 1988 X*************** X*** 480,491 **** X if (!first) X { X- desc_remain(item_val); X- inven_destroy(item_val); X if (i_ptr->flags != 0) X { X m_ptr = &py.misc; X! m_ptr->exp += (i_ptr->level/m_ptr->lev); X prt_experience(); X } X } X } X--- 480,492 ---- X if (!first) X { X if (i_ptr->flags != 0) X { X m_ptr = &py.misc; X! m_ptr->exp += (((float) i_ptr->level / (float) m_ptr->lev) X! + 0.5); X prt_experience(); X } X+ desc_remain(item_val); X+ inven_destroy(item_val); X } X } X*** oldmoria/signals.c Sun Oct 30 01:17:02 1988 X--- newmoria/signals.c Sun Oct 30 01:07:44 1988 X*************** X*** 14,18 **** X X extern int total_winner; X- extern int moria_flag; X extern int search_flag; X X--- 14,17 ---- X*************** X*** 74,78 **** X error_sig = sig; X error_code = 0; X! if (!character_saved) X { X prt("OH NO!!!!!!!!!! Attempting panic save.", 23, 0); X--- 73,77 ---- X error_sig = sig; X error_code = 0; X! if (!character_saved && character_generated) X { X prt("OH NO!!!!!!!!!! Attempting panic save.", 23, 0); X*************** X*** 110,114 **** X error_sig = sig; X error_code = code; X! if (!character_saved) X { X prt("OH NO!!!!!!!!!! Attempting panic save.", 23, 0); X--- 109,113 ---- X error_sig = sig; X error_code = code; X! if (!character_saved && character_generated) X { X prt("OH NO!!!!!!!!!! Attempting panic save.", 23, 0); X*************** X*** 147,151 **** X error_sig = sig; X error_code = 0; X! if (!character_saved) X save_char(FALSE, TRUE); X exit_game(); X--- 146,150 ---- X error_sig = sig; X error_code = 0; X! if (!character_saved && character_generated) X save_char(FALSE, TRUE); X exit_game(); X*************** X*** 163,167 **** X error_sig = sig; X error_code = code; X! if (!character_saved) X save_char(FALSE, TRUE); X exit_game(); X--- 162,166 ---- X error_sig = sig; X error_code = code; X! if (!character_saved && character_generated) X save_char(FALSE, TRUE); X exit_game(); X*************** X*** 186,189 **** X--- 185,190 ---- X return; X } X+ /* flush input just in case */ X+ flush (); X if (get_com("Do you really want to quit?", &command)) X switch(command) X*************** X*** 204,209 **** X { X put_buffer(" -more-", MSG_LINE, 0); X- put_qio(); X } X } X #else X--- 205,210 ---- X { X put_buffer(" -more-", MSG_LINE, 0); X } X+ put_qio(); X } X #else X*************** X*** 223,226 **** X--- 224,229 ---- X return; X } X+ /* flush input just in case */ X+ flush(); X if (get_com("Do you really want to quit?", &command)) X switch(command) X*************** X*** 241,246 **** X { X put_buffer(" -more-", MSG_LINE, 0); X- put_qio(); X } X } X #endif X--- 244,249 ---- X { X put_buffer(" -more-", MSG_LINE, 0); X } X+ put_qio(); X } X #endif X*** oldmoria/spells.c Sun Oct 30 01:18:23 1988 X--- newmoria/spells.c Sun Oct 30 01:07:45 1988 X*************** X*** 499,502 **** X--- 499,503 ---- X register int destroy; X register cave_type *c_ptr; X+ char *tmp_str; X X destroy = FALSE; X*************** X*** 516,521 **** X } X else if (t_list[c_ptr->tptr].tval == 2) X! /* destroy traps on chest and unlock */ X! t_list[c_ptr->tptr].flags &= 0xFF000000; X } X } X--- 517,530 ---- X } X else if (t_list[c_ptr->tptr].tval == 2) X! { X! /* destroy traps on chest and unlock */ X! t_list[c_ptr->tptr].flags &= 0xFF000000; X! tmp_str = index(t_list[c_ptr->tptr].name, '('); X! if (tmp_str != 0) X! tmp_str[0] = '\0'; X! (void) strcat (t_list[c_ptr->tptr].name, "(Disarmed)"); X! msg_print ("You have disarmed the chest."); X! known2 (t_list[c_ptr->tptr].name); X! } X } X } X*************** X*** 672,676 **** X if (i >= 0) X t_ptr->name[i] = '\0'; X! (void) strcat(t_ptr->name, " (Unlocked)"); X known2(t_ptr->name); X } X--- 681,685 ---- X if (i >= 0) X t_ptr->name[i] = '\0'; X! (void) strcat(t_ptr->name, "(Unlocked)"); X known2(t_ptr->name); X } X*************** X*** 737,741 **** X int fire_bolt(typ, dir, y, x, dam, bolt_typ) X int typ, dir, y, x, dam; X! ctype bolt_typ; X { X int i, oldy, oldx, dist; X--- 746,750 ---- X int fire_bolt(typ, dir, y, x, dam, bolt_typ) X int typ, dir, y, x, dam; X! char *bolt_typ; X { X int i, oldy, oldx, dist; X*************** X*** 784,788 **** X dam = dam*2; X else if (weapon_type & r_ptr->spells) X! dam = (dam/4.0); X i = mon_take_hit((int)c_ptr->cptr, dam); X monster_name(m_name, m_ptr, r_ptr); X--- 793,797 ---- X dam = dam*2; X else if (weapon_type & r_ptr->spells) X! dam = (dam / 4); X i = mon_take_hit((int)c_ptr->cptr, dam); X monster_name(m_name, m_ptr, r_ptr); X*************** X*** 830,834 **** X int fire_ball(typ, dir, y, x, dam_hp, descrip) X int typ, dir, y, x, dam_hp; X! ctype descrip; X { X register int i, j; X--- 839,843 ---- X int fire_ball(typ, dir, y, x, dam_hp, descrip) X int typ, dir, y, x, dam_hp; X! char *descrip; X { X register int i, j; X*************** X*** 1009,1013 **** X dam = dam*2; X else if (weapon_type & r_ptr->spells) X! dam = (dam/4.0); X dam = (dam/(distance(i, j, y, x)+1)); X m_ptr->hp = m_ptr->hp - dam; X--- 1018,1022 ---- X dam = dam*2; X else if (weapon_type & r_ptr->spells) X! dam = (dam / 4); X dam = (dam/(distance(i, j, y, x)+1)); X m_ptr->hp = m_ptr->hp - dam; X*************** X*** 1528,1533 **** X } X } X- else X- flag = TRUE; X } X } X--- 1537,1540 ---- X*************** X*** 2167,2171 **** X c_list[m_ptr->mptr].cmove); X p_ptr = &py.misc; X! p_ptr->exp += ((r_ptr->mexp*(r_ptr->level/p_ptr->lev)) + 0.5); X delete_monster(i); X } X--- 2174,2179 ---- X c_list[m_ptr->mptr].cmove); X p_ptr = &py.misc; X! p_ptr->exp += ((r_ptr->mexp * ((float) r_ptr->level / (float) p_ptr->lev)) X! + 0.5); X delete_monster(i); X } X*************** X*** 2444,2448 **** X if (f_ptr->poisoned > 0) X { X! f_ptr->poisoned = f_ptr->poisoned / 2.0; X if (f_ptr->poisoned < 1) f_ptr->poisoned = 1; X slow = TRUE; X--- 2452,2456 ---- X if (f_ptr->poisoned > 0) X { X! f_ptr->poisoned = f_ptr->poisoned / 2; X if (f_ptr->poisoned < 1) f_ptr->poisoned = 1; X slow = TRUE; X*** oldmoria/staffs.c Sun Oct 30 01:18:17 1988 X--- newmoria/staffs.c Sun Oct 30 01:07:46 1988 X*************** X*** 29,33 **** X chance = m_ptr->save + m_ptr->lev + int_adj() - i_ptr->level - 5; X if (py.flags.confused > 0) X! chance = chance / 2.0; X if (chance <= 0) chance = 1; X if (randint(chance) < USE_DEVICE) X--- 29,33 ---- X chance = m_ptr->save + m_ptr->lev + int_adj() - i_ptr->level - 5; X if (py.flags.confused > 0) X! chance = chance / 2; X if (chance <= 0) chance = 1; X if (randint(chance) < USE_DEVICE) X*************** X*** 144,148 **** X { X m_ptr = &py.misc; X! m_ptr->exp += ((i_ptr->level/m_ptr->lev) + 0.5); X prt_experience(); X } X--- 144,148 ---- X { X m_ptr = &py.misc; X! m_ptr->exp += (((float)i_ptr->level / (float)m_ptr->lev) + 0.5); X prt_experience(); X } X*** oldmoria/store1.c Sun Oct 30 01:17:11 1988 X--- newmoria/store1.c Sun Oct 30 01:07:46 1988 X*************** X*** 122,126 **** X else if (index(i_ptr->name, '^') == 0) X { X! value = i_ptr->cost + (i_ptr->cost/20.0)*i_ptr->p1; X } X } X--- 122,126 ---- X else if (index(i_ptr->name, '^') == 0) X { X! value = i_ptr->cost + (i_ptr->cost / 20) * i_ptr->p1; X } X } X*** oldmoria/store2.c Sun Oct 30 01:17:56 1988 X--- newmoria/store2.c Sun Oct 30 01:07:47 1988 X*************** X*** 960,964 **** X /* make sure player sees the message */ X msg_print(" "); X! if ((store_buy[store_num])(inventory[INVEN_MAX].tval)) X if (store_check_num(store_num)) X switch(sell_haggle(store_num, &price, inventory[INVEN_MAX])) X--- 960,964 ---- X /* make sure player sees the message */ X msg_print(" "); X! if ((*store_buy[store_num])(inventory[INVEN_MAX].tval)) X if (store_check_num(store_num)) X switch(sell_haggle(store_num, &price, inventory[INVEN_MAX])) X*** oldmoria/treasure1.c Sun Oct 30 01:16:43 1988 X--- newmoria/treasure1.c Sun Oct 30 01:07:56 1988 X*************** X*** 637,641 **** X {"& Light Brown Potion~| of Apple Juice" , 75, '!',0x00000000, X 250, 1, 282, 4, 1, 0, 0, 0, 0, "1d1" , 0}, X! {"& Clear Potion~| of Water" , 75, '!',0x00000000, X 200, 0, 283, 4, 1, 0, 0, 0, 0, "1d1" , 0}, X {"& %C Potion~| of Gain Dexterity" , 75, '!',0x02000000, X--- 637,641 ---- X {"& Light Brown Potion~| of Apple Juice" , 75, '!',0x00000000, X 250, 1, 282, 4, 1, 0, 0, 0, 0, "1d1" , 0}, X! {"& Crystal Clear Potion~| of Water" , 75, '!',0x00000000, X 200, 0, 283, 4, 1, 0, 0, 0, 0, "1d1" , 0}, X {"& %C Potion~| of Gain Dexterity" , 75, '!',0x02000000, X*************** X*** 775,793 **** X {"& %W Staff| of Darkness^ (%P1 charges)" , 55, '_',0x01000000, X 0, 0, 25, 50, 1, 0, 0, 0, 0, "1d2" , 5}, X! {"& Book of Magic Spells [Beginners-Magik]" , 90, '?',0x0000007F, X 0, 25, 257, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Book of Magic Spells [Magik I]" , 90, '?',0x0000FF80, X 0, 100, 258, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Book of Magic Spells [Magik II]" , 90, '?',0x00FF0000, X 0, 400, 259, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Book of Magic Spells [The Mage's Guide to Power]", 90, '?',0x7F000000, X 0, 800, 261, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Holy Book of Prayers [Beginners Handbook]" , 91, '?',0x000000FF, X 0, 25, 258, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Holy Book of Prayers [Words of Wisdom]" , 91, '?',0x0000FF00, X 0, 100, 259, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Holy Book of Prayers [Chants and Blessings]" , 91, '?',0x01FF0000, X 0, 300, 260, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Holy Book of Prayers [Exorcism and Dispelling]", 91, '?',0x7E000000, X 0, 900, 261, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X {"& Small wooden chest" , 2, '&',0x0F000000, X--- 775,793 ---- X {"& %W Staff| of Darkness^ (%P1 charges)" , 55, '_',0x01000000, X 0, 0, 25, 50, 1, 0, 0, 0, 0, "1d2" , 5}, X! {"& Book~ of Magic Spells [Beginners-Magik]" , 90, '?',0x0000007F, X 0, 25, 257, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Book~ of Magic Spells [Magik I]" , 90, '?',0x0000FF80, X 0, 100, 258, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Book~ of Magic Spells [Magik II]" , 90, '?',0x00FF0000, X 0, 400, 259, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Book~ of Magic Spells [The Mage's Guide to Power]", 90, '?',0x7F000000, X 0, 800, 261, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Holy Book~ of Prayers [Beginners Handbook]" , 91, '?',0x000000FF, X 0, 25, 258, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Holy Book~ of Prayers [Words of Wisdom]" , 91, '?',0x0000FF00, X 0, 100, 259, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Holy Book~ of Prayers [Chants and Blessings]" , 91, '?',0x01FF0000, X 0, 300, 260, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X! {"& Holy Book~ of Prayers [Exorcism and Dispelling]", 91, '?',0x7E000000, X 0, 900, 261, 30, 1,-100, 0, 0, 0, "1d1" , 40}, X {"& Small wooden chest" , 2, '&',0x0F000000, X*** oldmoria/treasure2.c Sun Oct 30 01:17:50 1988 X--- newmoria/treasure2.c Sun Oct 30 01:07:58 1988 X*************** X*** 98,104 **** X {"& Strip~ of Beef Jerky" , 80, ',',0x00000000, X 1750, 2, 310, 2, 5, 0, 0, 0, 0, "0d0" , 0}, /* 3*/ X! {"& Pint of Fine Ale" , 80, ',',0x00000000, X 500, 1, 311, 10, 3, 0, 0, 0, 0, "0d0" , 0}, /* 4*/ X! {"& Pint of Fine Wine" , 80, ',',0x00000000, X 400, 2, 312, 10, 1, 0, 0, 0, 0, "0d0" , 0}, /* 5*/ X {"& Dagger (Misericorde) (%P2,%P3)" , 23, '|',0x00000000, X--- 98,104 ---- X {"& Strip~ of Beef Jerky" , 80, ',',0x00000000, X 1750, 2, 310, 2, 5, 0, 0, 0, 0, "0d0" , 0}, /* 3*/ X! {"& Pint~ of Fine Ale" , 80, ',',0x00000000, X 500, 1, 311, 10, 3, 0, 0, 0, 0, "0d0" , 0}, /* 4*/ X! {"& Pint~ of Fine Wine" , 80, ',',0x00000000, X 400, 2, 312, 10, 1, 0, 0, 0, 0, "0d0" , 0}, /* 5*/ X {"& Dagger (Misericorde) (%P2,%P3)" , 23, '|',0x00000000, X*************** X*** 224,242 **** X {"& Scroll~ of Recharging" , 70, '?',0x01000000, X 0, 200, 311, 5, 1, 0, 0, 0, 0, "0d0" , 0}, /* 66*/ X! {"& Book of Magic Spells [Beginners-Magik]" , 90, '?',0x0000007F, X 0, 25, 257, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 67*/ X! {"& Book of Magic Spells [Magik I]" , 90, '?',0x0000FF80, X 0, 100, 258, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 68*/ X! {"& Book of Magic Spells [Magik II]" , 90, '?',0x00FF0000, X 0, 400, 259, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 69*/ X! {"& Book of Magic Spells [The Mage's Guide to Power]", 90, '?',0x7F000000, X 0, 800, 261, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 70*/ X! {"& Holy Book of Prayers [Beginners Handbook]" , 91, '?',0x000000FF, X 0, 25, 258, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 71*/ X! {"& Holy Book of Prayers [Words of Wisdom]" , 91, '?',0x0000FF00, X 0, 100, 259, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 72*/ X! {"& Holy Book of Prayers [Chants and Blessings]" , 91, '?',0x01FF0000, X 0, 300, 260, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 73*/ X! {"& Holy Book of Prayers [Exorcism and Dispelling]", 91, '?',0x7E000000, X 0, 900, 261, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 74*/ X {"& Potion~ of Restore Strength" , 75, '!',0x00000004, X--- 224,242 ---- X {"& Scroll~ of Recharging" , 70, '?',0x01000000, X 0, 200, 311, 5, 1, 0, 0, 0, 0, "0d0" , 0}, /* 66*/ X! {"& Book~ of Magic Spells [Beginners-Magik]" , 90, '?',0x0000007F, X 0, 25, 257, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 67*/ X! {"& Book~ of Magic Spells [Magik I]" , 90, '?',0x0000FF80, X 0, 100, 258, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 68*/ X! {"& Book~ of Magic Spells [Magik II]" , 90, '?',0x00FF0000, X 0, 400, 259, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 69*/ X! {"& Book~ of Magic Spells [The Mage's Guide to Power]", 90, '?',0x7F000000, X 0, 800, 261, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 70*/ X! {"& Holy Book~ of Prayers [Beginners Handbook]" , 91, '?',0x000000FF, X 0, 25, 258, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 71*/ X! {"& Holy Book~ of Prayers [Words of Wisdom]" , 91, '?',0x0000FF00, X 0, 100, 259, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 72*/ X! {"& Holy Book~ of Prayers [Chants and Blessings]" , 91, '?',0x01FF0000, X 0, 300, 260, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 73*/ X! {"& Holy Book~ of Prayers [Exorcism and Dispelling]", 91, '?',0x7E000000, X 0, 900, 261, 30, 1,-100, 0, 0, 0, "1d1" , 0}, /* 74*/ X {"& Potion~ of Restore Strength" , 75, '!',0x00000004, X*************** X*** 426,428 **** X {"a down staircase" , 108, '>',0x00000000, X 0, 0, 1, 0, 1, 0, 0, 0, 0, "1d1" , 0}; X- X--- 426,427 ---- X*** oldmoria/types.h Sun Oct 30 01:17:08 1988 X--- newmoria/types.h Sun Oct 30 01:07:48 1988 X*************** X*** 191,195 **** X } spl_rec; X X! typedef spl_rec spl_type[22]; X X typedef struct race_type X--- 191,195 ---- X } spl_rec; X X! typedef spl_rec spl_type[32]; X X typedef struct race_type X*** oldmoria/variables.c Sun Oct 30 01:17:14 1988 X--- newmoria/variables.c Sun Oct 30 01:07:51 1988 X*************** X*** 16,20 **** X int missile_ctr = 0; /* Counter for missiles */ X int msg_flag; /* Set with first msg */ X- int generate; /* Generate next level */ X int death = FALSE; /* True if died */ X vtype died_from; /* What killed him */ X--- 16,19 ---- X*** oldmoria/wands.c Sun Oct 30 01:16:56 1988 X--- newmoria/wands.c Sun Oct 30 01:07:49 1988 X*************** X*** 46,50 **** X chance = m_ptr->save + m_ptr->lev + int_adj() - i_ptr->level; X if (py.flags.confused > 0) X! chance = chance / 2.0; X if (chance <= 0) chance = 1; X if (randint(chance) < USE_DEVICE) X--- 46,50 ---- X chance = m_ptr->save + m_ptr->lev + int_adj() - i_ptr->level; X if (py.flags.confused > 0) X! chance = chance / 2; X if (chance <= 0) chance = 1; X if (randint(chance) < USE_DEVICE) X*************** X*** 158,162 **** X { X m_ptr = &py.misc; X! m_ptr->exp += ((i_ptr->level/m_ptr->lev) + 0.5); X prt_experience(); X } X--- 158,162 ---- X { X m_ptr = &py.misc; X! m_ptr->exp += (((float)i_ptr->level / (float)m_ptr->lev) + 0.5); X prt_experience(); X } X*** oldmoria/wizard.c Sun Oct 30 01:18:09 1988 X--- newmoria/wizard.c Sun Oct 30 01:07:50 1988 X*************** X*** 23,27 **** X X clear_screen(0, 0); X! (void) sprintf(tmp_str, " Moria Version %f", CUR_VERSION); X put_buffer(tmp_str, 0, 0); X put_buffer("Version 0.1 : 03/25/83", 1, 0); X--- 23,27 ---- X X clear_screen(0, 0); X! (void) sprintf(tmp_str, " Moria Version %.2lf", CUR_VERSION); X put_buffer(tmp_str, 0, 0); X put_buffer("Version 0.1 : 03/25/83", 1, 0); X*************** X*** 54,57 **** X--- 54,60 ---- X put_buffer("Please call it 'umoria' or 'UNIX MORIA' or something", 9, 0); X put_buffer("similar to avoid confusion.", 10, 0); X+ (void) sprintf(tmp_str, "Moria Version %.2lf, patch level %d", CUR_VERSION, X+ PATCH_LEVEL); X+ put_buffer(tmp_str, 12, 0); X pause_line(23); X draw_cave(); X END_OF_patches04 if test 60251 -ne `wc -c