[comp.sources.games.bugs] Omega fixes

ajcd@its63b.ed.ac.uk (Angus Duggan, Department of Computer Science, University of Edinburgh,) (02/27/88)

[warning - line eater at work]

Here's another installment of (unofficial) omega bug fixes. Quite a lot of
these are cosmetic fixes.

#1 Cosmetic - show player statistic and money change after each gym session.

======== Diff for osite.c ========
*** osite.c~	Tue Feb 23 16:53:54 1988
--- osite.c	Wed Feb 24 11:19:25 1988
***************
*** 422,427 ****
--- 419,425 ----
  	break;
        }
      }
+     dataprint();
    } while (! done);
    xredraw();
    calc_melee();
======== End of Diff ========


#2 Bug - Chaotic players always purified by Archdruid.

======== Diff for osite.c ========
*** osite.c~	Fri Feb 26 11:54:57 1988
--- osite.c	Fri Feb 26 17:44:31 1988
***************
*** 230,236 ****
      l_altar();
    }
    else if (response == 'b') {
!     if (abs(Player.alignment > 3))
        mprint("You are not in tune with the Cosmic Balance!");
      else {
        mprint("The ArchDruid conducts a sacred rite of cleansing....");
--- 230,236 ----
      l_altar();
    }
    else if (response == 'b') {
!     if (abs(Player.alignment) > 3)
        mprint("You are not in tune with the Cosmic Balance!");
      else {
        mprint("The ArchDruid conducts a sacred rite of cleansing....");
======== End of Diff ========


#3 Cosmetic - make arena doors stop run.

======== Diff for ocity.c ========
*** ocity.c~	Mon Jan 25 14:48:24 1988
--- ocity.c	Wed Feb 24 12:27:15 1988
***************
*** 83,88 ****
--- 83,92 ----
        case 'A':
  	Dungeon[0][i][j].locchar = OPEN_DOOR;
  	Dungeon[0][i][j].p_locf = L_ARENA;
+ 	Dungeon[0][i][j+1].stopsrun = TRUE;
+ 	Dungeon[0][i+1][j].stopsrun = TRUE;
+ 	Dungeon[0][i-1][j].stopsrun = TRUE;
+ 	Dungeon[0][i][j-1].stopsrun = TRUE;
  	break;
        case 'B':
  	Dungeon[0][i][j].locchar = OPEN_DOOR;
======== End of Diff ========


#4 Bug - Missing temple location marker in city.dat

======== Diff for ocity.dat ========
*** ocity.dat~	Mon Jan 25 14:49:13 1988
--- ocity.dat	Wed Feb 24 12:21:15 1988
***************
*** 12,18 ****
  #.####.####.####.#.###.###.#.##."".....#########..##....##...#.#
  #..#3...4#.......#.##x.x##.#.#x."".##.............###MM###..##.#
  #.####.####.##...............##."".##..######..##..######..#x#.#
! #....#.#....##...#.##x.x##.#.#x."".x#..#####x..###..####..####.#
  #................#.###.###.#.##."".##..######........##..#####.#
  #.#S#######.####.#.........#.......##..######.######....####x..#
  #.#S#SSSSS#.####.#####.#####....##.....######.#####x#..#x###.#.#
--- 12,18 ----
  #.####.####.####.#.###.###.#.##."".....#########..##....##...#.#
  #..#3...4#.......#.##x.x##.#.#x."".##.............###MM###..##.#
  #.####.####.##...............##."".##..######..##..######..#x#.#
! #....#T#....##...#.##x.x##.#.#x."".x#..#####x..###..####..####.#
  #................#.###.###.#.##."".##..######........##..#####.#
  #.#S#######.####.#.........#.......##..######.######....####x..#
  #.#S#SSSSS#.####.#####.#####....##.....######.#####x#..#x###.#.#
======== End of Diff ========


#5 Enhancement - If player is not killed, save immunities to NPC log and
   hiscore log. This code has not been fully tested, but hasn't caused any
   crashes either. Also tidies up some of the NPC code.

======== Diff for ochar.c ========
*** ochar.c~	Mon Jan 25 14:48:22 1988
--- ochar.c	Wed Feb 24 13:19:43 1988
***************
*** 220,225 ****
--- 220,226 ----
  int status;
  {
    int npcbehavior=0;
+   int i,j;
    char response;
    if (status == 1) { /* player is dead, all undead are chaotic */
      npcbehavior+=CHAOTIC;
***************
*** 249,265 ****
      menuprint("\n4: thieving");
      menuprint("\n5: escape");
      menuprint("\n\nEnter NPC response to combat: ");
!     response = '0';
!     while ((response != '1') && 
! 	   (response != '2') &&
! 	   (response != '3') &&
! 	   (response != '4') &&
! 	   (response != '5'))
        response = menugetc();
      menuaddch(response);
      npcbehavior+=10*(response - '0');
      npcbehavior+=100*competence_check(response-'0');
-     response = '0';
      menuprint("\n\n1: threaten");
      menuprint("\n2: greet");
      menuprint("\n3: aid");
--- 250,261 ----
      menuprint("\n4: thieving");
      menuprint("\n5: escape");
      menuprint("\n\nEnter NPC response to combat: ");
!     do
        response = menugetc();
+     while ((response < '1') && (response > '5'));
      menuaddch(response);
      npcbehavior+=10*(response - '0');
      npcbehavior+=100*competence_check(response-'0');
      menuprint("\n\n1: threaten");
      menuprint("\n2: greet");
      menuprint("\n3: aid");
***************
*** 266,282 ****
      menuprint("\n4: beg");
      menuprint("\n5: silence");
      menuprint("\n\nEnter NPC response to conversation: ");
!     while ((response != '1') && 
! 	   (response != '2') &&
! 	   (response != '3') &&
! 	   (response != '4') &&
! 	   (response != '5'))
        response = menugetc();
      menuaddch(response);
      npcbehavior+=1000*(response - '0');
      xredraw();
    }
!     return(npcbehavior);
  }
  
  
--- 262,278 ----
      menuprint("\n4: beg");
      menuprint("\n5: silence");
      menuprint("\n\nEnter NPC response to conversation: ");
!     do
        response = menugetc();
+     while ((response < '1') && (response > '5'));
      menuaddch(response);
      npcbehavior+=1000*(response - '0');
+     for (i=0,j=10000;i<NUMIMMUNITIES;i++,j*=2)
+       if (Player.immunity[i])
+ 	npcbehavior+=j;
      xredraw();
    }
!   return(npcbehavior);
  }
  
  
======== End of Diff ========

======== Diff for omon.c ========
*** omon.c~	Mon Feb 22 17:03:37 1988
--- omon.c	Wed Feb 24 13:25:37 1988
***************
*** 575,581 ****
    npc->status = AWAKE+MOBILE+WANDERING;
    combatype = ((int) ((behavior % 100) / 10));
    competence = ((int) ((behavior % 1000) / 100));
!   talktype = ((int) (behavior / 1000));
    npc->level = competence;
    if (npc->level < 2*Dlevel) npc->status += HOSTILE;
    npc->xpv = npc->level*20;
--- 575,582 ----
    npc->status = AWAKE+MOBILE+WANDERING;
    combatype = ((int) ((behavior % 100) / 10));
    competence = ((int) ((behavior % 1000) / 100));
!   talktype = ((int) ((behavior % 10000) / 1000));
!   npc->immunity = (int) (behavior / 10000);
    npc->level = competence;
    if (npc->level < 2*Dlevel) npc->status += HOSTILE;
    npc->xpv = npc->level*20;
***************
*** 685,691 ****
      npc->status = AWAKE+MOBILE+WANDERING;
      combatype = ((int) ((behavior % 100) / 10));
      competence = ((int) ((behavior % 1000) / 100));
!     talktype = ((int) (behavior / 1000));
      npc->level = competence;
      if (npc->level < 2*Dlevel) npc->status += HOSTILE;
      npc->xpv = npc->level*20;
--- 686,693 ----
      npc->status = AWAKE+MOBILE+WANDERING;
      combatype = ((int) ((behavior % 100) / 10));
      competence = ((int) ((behavior % 1000) / 100));
!     talktype = ((int) ((behavior % 10000) / 1000));
!     npc->immunity = (int) (behavior / 10000);
      npc->level = competence;
      if (npc->level < 2*Dlevel) npc->status += HOSTILE;
      npc->xpv = npc->level*20;
======== End of Diff ========


#6 Bug - prevent multiple trap components from being marked 'in use'.

======== Diff for oitemf.c ========
*** oitemf.c~	Fri Feb 19 12:52:35 1988
--- oitemf.c	Thu Feb 25 12:23:07 1988
***************
*** 1973,1979 ****
  pob o;
  {
    Objects[o->id].known = 1;
!   
    if ((Dungeon[Dlevel][Player.x][Player.y].locchar != FLOOR) ||
        (Dungeon[Dlevel][Player.x][Player.y].p_locf != L_NO_OP))
      mprint("Your attempt fails.");
--- 1973,1979 ----
  pob o;
  {
    Objects[o->id].known = 1;
!   o->used = FALSE;
    if ((Dungeon[Dlevel][Player.x][Player.y].locchar != FLOOR) ||
        (Dungeon[Dlevel][Player.x][Player.y].p_locf != L_NO_OP))
      mprint("Your attempt fails.");
======== End of Diff ========


#7 Bug - prevent player from tunnelling through vault door with bare hands.

======== Diff for osite.c ========
*** osite.c~	Wed Feb 24 11:38:30 1988
--- osite.c	Thu Feb 25 12:04:19 1988
***************
*** 1458,1463 ****
--- 1458,1464 ----
    else {
      mprint("The door is closed.");
      Dungeon[0][Player.x][Player.y+1].locchar = WALL;
+     Dungeon[0][Player.x][Player.y+1].aux = 100;
      mprint("Try to crack it? [yn]");
      if (ynq()=='y') {
        if (random_range(100) < Player.rank[THIEVES]*Player.rank[THIEVES]) {
======== End of Diff ========


#8 Bug - save lastday dole given out in save file to prevent massive dole
   fraud.
   NOTE - this fix makes save files incompatible with old versions.

======== Diff for oglob.h ========
*** oglob.h~	Fri Feb 19 11:29:45 1988
--- oglob.h	Thu Feb 25 15:41:24 1988
***************
*** 112,117 ****
--- 112,120 ----
  extern int Imprisonment;
  /* number of times player sent to prison */
  
+ extern int Lastday;
+ /* last day dole given out */
+ 
  extern int SuppressPrinting;
  /* turn off mprint, printm, when TRUE */
  
======== End of Diff ========

======== Diff for o.c ========
*** o.c~	Fri Feb 19 11:28:01 1988
--- o.c	Thu Feb 25 15:40:41 1988
***************
*** 107,112 ****
--- 107,113 ----
  char Password[64];                    /* autoteller password */
  int Deepest = 0;                      /* The deepest level attained */
  int Imprisonment = 0;                 /* number of times in gaol */
+ int Lastday = -10;                    /* last day dole handed out */
  int SuppressPrinting=FALSE;           /* turn off mprint, printm, when TRUE */
  char Str1[100],Str2[100],Str3[100],Str4[100];
     /* Some string space, random uses */
======== End of Diff ========

======== Diff for olev.c ========
*** olev.c~	Mon Feb 22 10:37:14 1988
--- olev.c	Thu Feb 25 17:02:18 1988
***************
*** 340,345 ****
--- 341,347 ----
    write_int(fd,Collegelevel);
    write_int(fd,Merclevel);
    write_int(fd,Imprisonment);
+   write_int(fd,Lastday);
    write_int(fd,Player.str);
    write_int(fd,Player.con);
    write_int(fd,Player.dex);
***************
*** 632,637 ****
--- 636,642 ----
    Collegelevel = read_int(fd);
    Merclevel = read_int(fd);
    Imprisonment = read_int(fd);
+   Lastday = read_int(fd);
    Player.str = read_int(fd);
    Player.con = read_int(fd);
    Player.dex = read_int(fd);
======== End of Diff ========

======== Diff for osite.c ========
*** osite.c~	Thu Feb 25 12:04:19 1988
--- osite.c	Thu Feb 25 15:43:03 1988
***************
*** 882,890 ****
  
  void l_dpw()
  {
-   static int lastday = -10;
    mprint("Rampart Department of Public Works.");
!   if (Date - lastday < 7)
      printm("\nG'wan! Get a job!");
    else if (Player.cash < 100) {
      mprint("Do you want to go on the dole? [yn]");
--- 882,889 ----
  
  void l_dpw()
  {
    mprint("Rampart Department of Public Works.");
!   if (Date - Lastday < 7)
      printm("\nG'wan! Get a job!");
    else if (Player.cash < 100) {
      mprint("Do you want to go on the dole? [yn]");
***************
*** 897,903 ****
        }
        else {
  	mprint("Here's your handout, layabout!");
! 	lastday = Date;
  	Player.cash = 99;
  	dataprint();
        }
--- 896,902 ----
        }
        else {
  	mprint("Here's your handout, layabout!");
! 	Lastday = Date;
  	Player.cash = 99;
  	dataprint();
        }
***************
*** 1041,1046 ****
--- 1040,1046 ----
  	  }
  	}
        }
+       dataprint();
        calc_melee();
      }
    }
======== End of Diff ========


#9 Economisation - Prevent duplicate copies of same level being saved.

======== Diff for olev.c ========
*** olev.c~	Mon Feb 22 10:37:14 1988
--- olev.c	Thu Feb 25 17:02:18 1988
***************
*** 257,263 ****
      fprintf(fd,"%d\n",gameid);
      save_player(fd);
      save_level(fd,0);
!     save_level(fd,Dlevel);
      fclose(fd);
      mprint("\nGame Saved.");
      morewait();
--- 257,264 ----
      fprintf(fd,"%d\n",gameid);
      save_player(fd);
      save_level(fd,0);
!     if (Dlevel != 0)
!       save_level(fd,Dlevel);
      fclose(fd);
      mprint("\nGame Saved.");
      morewait();
***************
*** 587,595 ****
        initmon0to3();
        initmon4to7();
        initmon8to10();
        restore_player(fd);
        restore_level(fd);
!       restore_level(fd);
        mprint("Restoration complete");
        WhichScreen = -1;
        screencheck(Player.y);
--- 589,598 ----
        initmon0to3();
        initmon4to7();
        initmon8to10();
        restore_player(fd);
        restore_level(fd);
!       if (Dlevel != 0)
! 	  restore_level(fd);
        mprint("Restoration complete");
        WhichScreen = -1;
        screencheck(Player.y);
======== End of Diff ========


#10 Bug - update screen correctly when going up or down levels.

======== Diff for ocom.c ========
*** ocom.c~	Sat Feb 20 11:13:39 1988
--- ocom.c	Fri Feb 26 12:09:18 1988
***************
*** 906,912 ****
  
        Dlevel = newlevel;
  
!       screencheck(Player.y);
        roomcheck();
      }
    }
--- 906,913 ----
  
        Dlevel = newlevel;
  
!       WhichScreen = Player.y/16;
!       show_screen(WhichScreen);
        roomcheck();
      }
    }
======== End of Diff ========


#11 Cosmetic - redisplay diseased flags after cured.

======== Diff for osite.c ========
*** osite.c~	Thu Feb 25 15:43:03 1988
--- osite.c	Fri Feb 26 11:54:57 1988
***************
*** 1262,1267 ****
--- 1262,1268 ----
    else {
      Player.cash -= 250;
      Player.status[DISEASED] = 0;
+     showflags();
      mprint("Quarantine lifted....");
    }
  }  
======== End of Diff ========


#12 Bug - restore monsters correctly to prevent "phantom guardsmen" on city
level.

======== Diff for olev.c ========
*** olev.c~	Thu Feb 25 17:58:29 1988
--- olev.c	Fri Feb 26 18:05:20 1988
***************
*** 850,855 ****
--- 850,856 ----
      ml->m->possessions = restore_itemlist(fd);
      ml->next = Mlist[level];
      Mlist[level] = ml;
+     Dungeon[level][ml->m->x][ml->m->y].creature = ml->m; 
    }
  }
  
======== End of Diff ========

-- 
Angus Duggan, Department of Computer Science, University of Edinburgh,
James Clerk Maxwell Building, The King's Buildings, Mayfield Road,
Edinburgh, EH9 3JZ, Scotland, U.K.
JANET:  ajcd@uk.ac.ed.ecsvax  ARPA: ajcd%ed.ecsvax@nss.cs.ucl.ac.uk
USENET: ajcd@ecsvax.ed.ac.uk  UUCP: ...!mcvax!ukc!ed.ecsvax!ajcd
BITNET: ukacrl.earn!ed.ecsvax!ajcd or ajcd%ed.ecsvax@uk.ac