games-request@tekred.TEK.COM (01/21/88)
Submitted by: "Laurence R. Brothers" <brothers@paul.rutgers.edu>
Comp.sources.games: Volume 3, Issue 59
Archive-name: omega/Part12
#! /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 <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 12 (of 15)."
# Contents: oaux1.c omega.log omega.thanks oscr.c
# Wrapped by billr@tekred on Mon Jan 18 10:20:42 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f oaux1.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"oaux1.c\"
else
echo shar: Extracting \"oaux1.c\" \(30687 characters\)
sed "s/^X//" >oaux1.c <<'END_OF_oaux1.c'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987 */
X
X/* oaux1.c */
X
X/* auxiliary functions for those in ocom.c, also see oaux2.c */
X/* Only functions called in ocom.c should be here */
X
X#include <strings.h>
X#include "oglob.h"
X
X/* from oitem */
Xextern pob create_object();
X
X/* from ospell */
Xextern char *spellid();
X
X/* from ogen */
Xextern char *roomname();
X
X/* from oeffect 1 or 2 */
Xextern void manastorm();
X
X/* from oitemf */
Xextern void weapon_normal_hit(),weapon_demonblade(),weapon_lightsabre();
Xextern void weapon_mace_disrupt(),weapon_bare_hands();
Xextern void weapon_vorpal(),weapon_desecrate(),weapon_firestar();
Xextern void weapon_defend(),weapon_victrix(),weapon_tangle();
Xextern void weapon_arrow(),weapon_bolt();
X
X/* from oitem */
Xextern void item_use();
X
X/* from oinv */
Xextern void pickup_at(),drop_at(),givemonster(),conform_lost_objects();
Xextern void add_item_to_pack();
Xextern char *itemid();
Xextern int getitem(),badobject(),cursed();
X
X/* from outil */
Xextern int random_range();
Xextern int inbounds(),confirmation();
Xextern char inversedir();
Xextern char *getarticle();
Xextern int unblocked(),bitp();
Xextern void bitset(),bitreset();
X
X/* from oetc */
Xextern char *wordnum();
X
X/* from oscr */
Xextern void showcursor(),refreshmsg(),drawspot(),describe_player();
Xextern void mprint(),endgraf(),showflags(),dataprint(),menuaddch();
Xextern void locprint(),xredraw(),putspot(),blankoutspot(),levelrefresh();
Xextern void drawvision(),display_death(),morewait(),menumorewait(),printm();
Xextern void menuclear(),menuprint(),display_win(),mnumprint(),menunumprint();
Xextern void screencheck();
Xextern char mgetc(),lgetc(),ynq(),getspot();
X
X
X/* from ocom */
Xvoid p_process();
X
X/* from omon */
Xextern void m_status_set(),m_status_reset(),m_death(),m_pickup();
Xextern void tacmonster(),m_teleport(),m_dropstuff(),m_vanish();
Xextern int m_statusp();
X
X/* from oaux2 */
Xextern char *actionlocstr();
Xextern void break_weapon(),drop_weapon(),gain_experience(),gain_level();
Xextern void p_fumble(),p_win(),p_hit(),p_miss(),addring();
Xextern void top_level(),printactions(),movecursor(),p_drown();
Xextern void tacplayer(),weapon_use(),move_status_check(),hour_status_check();
Xextern int expval(),player_hit(),statmod(),item_value(),true_item_value();
Xextern int p_immune();
X
X/* oaux1 functions */
Xvoid pickup_at(),setspot(),foodcheck(),p_death(),hourly_check();
Xvoid calc_melee(),p_melee(),gain_experience(),p_damage();
Xvoid p_process(),p_teleport(),tacplayer(),roomcheck(),tunnelcheck();
Xvoid searchat(),showroom(),weapon_use(),damage_item(),tacmode();
Xvoid hand_wield(),optionset(),optionreset(),describe_player();
Xvoid lightroom(),surrender(),threaten(),darkenroom();
Xchar *itemid(),*mstatus_string(),*trapid();
Xint p_moveable(),cursed(),getitem(),getdir(),optionp(),goberserk();
Xint player_on_sanctuary();
X
X
X/* check to see if too much tunneling has been done in this level */
Xvoid tunnelcheck()
X{
X Leveldata[Dlevel].tunnelled++;
X if ((Leveldata[Dlevel].tunnelled) > WIDTH/4)
X mprint("Dust and stone fragments fall on you from overhead.");
X if ((Leveldata[Dlevel].tunnelled) > WIDTH/2)
X mprint("You hear groaning and creaking noises.");
X if ((Leveldata[Dlevel].tunnelled) > 3*WIDTH/4)
X mprint("The floor trembles and you hear a loud grinding screech.");
X if ((Leveldata[Dlevel].tunnelled) > WIDTH) {
X mprint("With a scream of tortured stone, the entire level caves in!!!");
X gain_experience(5000);
X mprint("You are flattened into an unpleasant jellylike substance.");
X p_death("dungeon cave-in");
X }
X}
X
X/* displays a room's name */
Xvoid showroom(i)
Xint i;
X{
X if (Dlevel == 0) locprint("The City of Rampart.");
X else {
X strcpy(Str1,"Level ");
X if (Dlevel < 10) {
X Str1[6] = Dlevel + '0';
X Str1[7] = 0;
X }
X else {
X Str1[6] = ((int) Dlevel / 10) + '0';
X Str1[7] = (Dlevel % 10) + '0';
X Str1[8] = 0;
X }
X strcat(Str1," -- ");
X strcat(Str1,roomname(i));
X locprint(Str1);
X }
X}
X
X
Xint player_on_sanctuary()
X{
X if ((Player.slevel==Dlevel) &&
X (Player.x==Player.sx) &&
X (Player.y==Player.sy))
X return(TRUE);
X else {
X if (Player.patron) {
X if ((Dungeon[Dlevel][Player.x][Player.y].locchar == ALTAR) &&
X (Dungeon[Dlevel][Player.x][Player.y].aux == Player.patron))
X return(TRUE);
X else return(FALSE);
X }
X else return(FALSE);
X }
X}
X
X
X/* check a move attempt, maybe attack something, return TRUE if ok to move. */
X/* x y is the proposed place to move to */
X int p_moveable(x,y)
X int x,y;
X {
X Skipmonsters = TRUE;
X if (! inbounds(x,y)) return (FALSE);
X else if (Player.status[SHADOWFORM]) {
X Skipmonsters = FALSE;
X return(TRUE);
X }
X else if (Dungeon[Dlevel][x][y].secret) {
X if (!Fastmove) mprint("Ouch!");
X return(FALSE);
X }
X else if (Dungeon[Dlevel][x][y].creature != NULL) {
X if ((! Fastmove) || optionp(BELLICOSE)) {
X p_melee(Dungeon[Dlevel][x][y].creature);
X Skipmonsters = FALSE;
X return(FALSE);
X }
X else return(FALSE);
X }
X else if ((Dungeon[Dlevel][x][y].locchar == WALL) ||
X (Dungeon[Dlevel][x][y].locchar == STATUE) ||
X (Dungeon[Dlevel][x][y].locchar == CLOSED_DOOR) ||
X (Fastmove &&
X ((Dungeon[Dlevel][x][y].locchar == HEDGE) ||
X (Dungeon[Dlevel][x][y].locchar == LAVA) ||
X (Dungeon[Dlevel][x][y].locchar == ABYSS) ||
X (Dungeon[Dlevel][x][y].locchar == FIRE) ||
X (Dungeon[Dlevel][x][y].locchar == WATER) ||
X (Dungeon[Dlevel][x][y].locchar == WHIRLWIND) ||
X (Dungeon[Dlevel][x][y].locchar == LIFT) ||
X (Dungeon[Dlevel][x][y].locchar == TRAP)))) {
X if (! Fastmove) mprint("Ouch!");
X return(FALSE);
X }
X else if (optionp(CONFIRM)) {
X if ((Dungeon[Dlevel][x][y].locchar == HEDGE) ||
X (Dungeon[Dlevel][x][y].locchar == LAVA) ||
X (Dungeon[Dlevel][x][y].locchar == FIRE) ||
X (Dungeon[Dlevel][x][y].locchar == ABYSS) ||
X (Dungeon[Dlevel][x][y].locchar == WATER) ||
X (Dungeon[Dlevel][x][y].locchar == WHIRLWIND) ||
X (Dungeon[Dlevel][x][y].locchar == LIFT) ||
X (Dungeon[Dlevel][x][y].locchar == TRAP)) {
X return(! (Skipmonsters = ! confirmation()) );
X }
X else {
X Skipmonsters = FALSE;
X return(TRUE);
X }
X }
X else {
X Skipmonsters = FALSE;
X return(TRUE);
X }
X }
X
X
X/* search once particular spot */
Xvoid searchat(x,y)
Xint x,y;
X{
X int i;
X if (inbounds(x,y) && (random_range(3) || Player.status[ALERT])) {
X if (Dungeon[Dlevel][x][y].secret) {
X Dungeon[Dlevel][x][y].secret = FALSE;
X if ((Dungeon[Dlevel][x][y].locchar==OPEN_DOOR) ||
X (Dungeon[Dlevel][x][y].locchar==CLOSED_DOOR))
X mprint("You find a secret door!");
X else mprint("You find a secret passage!");
X for(i=0;i<8;i++)
X Dungeon[Dlevel][x+Dirs[0][i]][y+Dirs[1][i]].stopsrun = TRUE;
X drawvision(Player.x,Player.y,Player.vision);
X }
X if ((Dungeon[Dlevel][x][y].p_locf >= TRAP_BASE) &&
X (Dungeon[Dlevel][x][y].locchar != TRAP) &&
X (Dungeon[Dlevel][x][y].p_locf <= TRAP_BASE+NUMTRAPS)) {
X Dungeon[Dlevel][x][y].locchar = TRAP;
X mprint("You find a trap!");
X if (Fastmove == TRUE) {
X drawvision(Player.x,Player.y,Player.vision);
X Fastmove = FALSE;
X }
X }
X }
X}
X
X/* This is called whenever anything might change player performance in
X melee, such as changing weapon, statistics, etc. */
Xvoid calc_melee()
X{
X Player.maxweight = (Player.str * Player.agi * 10);
X Player.absorption = Player.status[PROTECTION];
X Player.defense = 2 * statmod(Player.agi)+(Player.level/2);
X Player.hit = Player.level + statmod(Player.dex)+1;
X Player.dmg = statmod(Player.str)+3;
X Player.speed = 5 - min(4,(statmod(Player.agi)/2));
X if (Player.status[HASTED]) Player.speed = Player.speed / 2;
X if (Player.status[SLOWED]) Player.speed = Player.speed * 2;
X if (Player.itemweight > 0)
X switch(Player.maxweight / Player.itemweight) {
X case 0: Player.speed+=6; break;
X case 1: Player.speed+=3; break;
X case 2: Player.speed+=2; break;
X case 3: Player.speed+=1; break;
X }
X
X if (Player.status[ACCURATE]) Player.hit+=20;
X if (Player.status[HERO]) Player.hit+=Player.dex;
X if (Player.status[HERO]) Player.dmg+=Player.str;
X if (Player.status[HERO]) Player.defense+=Player.agi;
X if (Player.status[HERO]) Player.speed=Player.speed / 2;
X
X Player.speed = max(1,min(25,Player.speed));
X
X /* weapon */
X if (Player.primary != NULL) {
X Player.hit += Player.primary->hit + Player.primary->plus;
X Player.dmg += Player.primary->dmg + Player.primary->plus;
X }
X
X /* shield */
X if (Player.secondary != NULL)
X Player.defense += Player.secondary->aux + Player.secondary->plus;
X
X /* armor */
X if (Player.armor != NULL) {
X Player.absorption += Player.armor->dmg;
X Player.defense = Player.defense + Player.armor->plus - Player.armor->aux;
X }
X comwinprint();
X}
X
X
X/* player attacks monster m */
Xvoid p_melee(m)
Xstruct monster *m;
X{
X int hitmod = 0;
X if (Lunarity == 1) hitmod += Player.level;
X else if (Lunarity == -1) hitmod -= (Player.level / 2);
X if (Player.status[AFRAID])
X mprint("You are much too afraid to fight!");
X else if (player_on_sanctuary())
X mprint("You restrain yourself from descrating this holy place.");
X else if (Player.status[SHADOWFORM])
X mprint("Your attack has no effect in your shadowy state.");
X else {
X if (! m->attacked) Player.alignment--; /* chaotic action */
X m_status_set(m,AWAKE);
X m_status_set(m,HOSTILE);
X m->attacked = TRUE;
X if (hitp(Player.hit+hitmod,m->ac))
X weapon_use(0,Player.primary,m);
X else p_miss(m,NORMAL_DAMAGE);
X }
X}
X
X/* Attempt to break an object o */
Xvoid damage_item(o)
Xpob o;
X{
X int i;
X if (o->objchar == STICK) {
X strcpy(Str1,"Your ");
X strcat(Str1,(o->blessing >= 0 ? o->truename : o->cursestr));
X strcat(Str1," explodes!");
X mprint(Str1);
X morewait();
X if (o->charge < 1)
X mprint("Fzzz... Out of Power... Oh well...");
X else {
X mprint("Ka-Blamm!!!");
X /* general case. Some sticks will eventually do special things */
X for(i=0;i<9;i++)
X manastorm(Player.x+Dirs[0][i],
X Player.y+Dirs[1][i],
X o->charge*o->level*10);
X conform_lost_objects(1,o);
X }
X }
X else if (o->blessing > 0) {
X strcpy(Str1,"Your ");
X strcat(Str1,itemid(o));
X strcat(Str1," glows strongly.");
X mprint(Str1);
X }
X else if (o->blessing < -1) {
X strcpy(Str1,"You hear an evil giggle from your ");
X strcat(Str1,itemid(o));
X mprint(Str1);
X }
X else if (o->plus > 0) {
X strcpy(Str1,"Your ");
X strcat(Str1,itemid(o));
X strcat(Str1," glows and then fades.");
X mprint(Str1);
X o->plus--;
X }
X else {
X strcpy(Str1,"Your ");
X strcat(Str1,itemid(o));
X strcat(Str1," shatters in a thousand lost fragments!");
X conform_lost_objects(1,o);
X mprint(Str1);
X }
X}
X
X
X
X
X
X/* do dmg points of damage of type dtype, from source fromstring */
Xvoid p_damage(dmg,dtype,fromstring)
Xint dmg,dtype;
Xchar *fromstring;
X{
X if (! p_immune(dtype)) {
X if (Fastmove == TRUE) {
X drawvision(Player.x,Player.y,Player.vision);
X Fastmove = FALSE;
X }
X if (dtype == NORMAL_DAMAGE) Player.hp -= max(1,(dmg-Player.absorption));
X else Player.hp -= dmg;
X if (Player.hp < 1) p_death(fromstring);
X }
X else mprint("You resist the effects!");
X}
X
X/* game over, you lose! */
Xvoid p_death(fromstring)
Xchar *fromstring;
X{
X Player.hp = -1;
X mprint("You died!");
X morewait();
X display_death(fromstring);
X endgraf();
X exit(0);
X}
X
X
X/* move the cursor around, like for firing a wand, sets x and y to target */
Xvoid setspot(x,y)
Xint *x,*y;
X{
X char c = ' ';
X mprint("Targeting.... ? for help");
X showcursor(*x,*y);
X while ((c != '.') && (c != ESCAPE)) {
X c = lgetc();
X switch(c) {
X case 'h':case '4': movecursor(x,y,-1,0); break;
X case 'j':case '2': movecursor(x,y,0,1); break;
X case 'k':case '8': movecursor(x,y,0,-1); break;
X case 'l':case '6': movecursor(x,y,1,0); break;
X case 'b':case '1': movecursor(x,y,-1,1); break;
X case 'n':case '3': movecursor(x,y,1,1); break;
X case 'y':case '7': movecursor(x,y,-1,-1); break;
X case 'u':case '9': movecursor(x,y,1,-1); break;
X case '?':
X menuclear();
X menuprint("Use vi keys or numeric keypad\n");
X menuprint("to move cursor to target.\n");
X menuprint("Hit the '.' key when done,\n");
X menuprint("or ESCAPE to abort.");
X menumorewait();
X xredraw();
X break;
X }
X }
X if (c==ESCAPE) *x = *y= ABORT;
X screencheck(Player.y);
X}
X
X
X/* get a direction: return index into Dirs array corresponding to direction */
Xint getdir()
X{
X mprint("Select direction [hjklyubn, ESCAPE to quit]: ");
X switch (mgetc()) {
X case '4':
X case 'h':
X case 'H': return(5); break;
X case '2':
X case 'j':
X case 'J': return(6); break;
X case '8':
X case 'k':
X case 'K': return(7); break;
X case '6':
X case 'l':
X case 'L': return(4); break;
X case '7':
X case 'y':
X case 'Y': return(3); break;
X case '9':
X case 'u':
X case 'U': return(1); break;
X case '1':
X case 'b':
X case 'B': return(2); break;
X case '3':
X case 'n':
X case 'N': return(0); break;
X case ESCAPE: return(ABORT); break;
X default: mprint("That's not a direction! "); return(getdir()); break;
X }
X}
X
X
X
X
X/* bitwise access functions to Player.options */
X
Xint optionp(o)
Xint o;
X{
X return(bitp(Player.options,o));
X}
X
Xvoid optionset(o)
Xint o;
X{
X bitset(&(Player.options),o);
X}
X
Xvoid optionreset(o)
Xint o;
X{
X bitreset(&(Player.options),o);
X}
X
X
X
X/* functions describes monster m's state for examine function */
Xchar *mstatus_string(m)
Xstruct monster *m;
X{
X if (m->uniqueness == COMMON) {
X if (m->hp < Monsters[m->id].hp / 3)
X strcpy(Str2,"a grievously injured");
X else if (m->hp < Monsters[m->id].hp / 2)
X strcpy(Str2,"a severely injured");
X else if (m->hp < Monsters[m->id].hp)
X strcpy(Str2,"an injured ");
X else strcpy(Str2,getarticle(m->monstring));
X if (m->level > Monsters[m->id].level) {
X strcat(Str2," (level ");
X strcat(Str2,wordnum(m->level+1-Monsters[m->id].level));
X strcat(Str2,") ");
X }
X strcat(Str2,m->monstring);
X }
X else {
X strcpy(Str2,m->monstring);
X if (m->hp < Monsters[m->id].hp / 3)
X strcat(Str2,"who is grievously injured");
X else if (m->hp < Monsters[m->id].hp / 2)
X strcat(Str2,"who is severely injured");
X else if (m->hp < Monsters[m->id].hp)
X strcat(Str2,"who is injured ");
X }
X return(Str2);
X}
X
X
X
X
X/* for the examine function */
Xvoid describe_player()
X{
X if (Player.hp < (Player.maxhp /5))
X menuprint("\nA grievously injured ");
X else if (Player.hp < (Player.maxhp /2))
X menuprint("\nA seriously wounded ");
X else if (Player.hp < Player.maxhp)
X menuprint("\n somewhat bruised ");
X else menuprint("\nA fit ");
X
X if (Player.level == 0)
X menuprint("\nbeginning adventurer named\n");
X else if (Player.level < 4)
X menuprint("\nnovice adventurer named\n");
X else if (Player.level < 8)
X menuprint("\nexperienced adventurer named\n");
X else if (Player.level < 16)
X menuprint("\nmaster adventurer named\n");
X else menuprint("\ngodlike adventurer named\n");
X menuprint(Player.name);
X}
X
X
X/* access to player experience... */
Xvoid gain_experience(amount)
Xint amount;
X{
X Player.xp += amount;
X gain_level();
X}
X
X
X/* try to hit a monster in an adjacent space. If there are none
X return FALSE */
Xint goberserk()
X{
X int wentberserk=FALSE,i;
X
X for(i=0;i<8;i++)
X if (Dungeon[Dlevel][Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].creature
X != NULL) {
X wentberserk=TRUE;
X p_melee(Dungeon
X [Dlevel]
X [Player.x+Dirs[0][i]]
X [Player.y+Dirs[1][i]].creature);
X }
X
X return(wentberserk);
X}
X
X/* identifies a trap for examine() by its aux value */
Xchar *trapid(trapno)
Xint trapno;
X{
X switch (trapno) {
X case L_TRAP_DART:return("A dart trap");
X case L_TRAP_PIT:return("A pit");
X case L_TRAP_SNARE:return("A snare");
X case L_TRAP_BLADE:return("A blade trap");
X case L_TRAP_FIRE:return("A fire trap");
X case L_TRAP_TELEPORT:return("A teleport trap");
X case L_TRAP_DISINTEGRATE:return("A disintegration trap");
X case L_TRAP_DOOR:return("A trap door");
X case L_TRAP_MANADRAIN:return("A manadrain trap");
X case L_TRAP_ACID:return("An acid shower trap");
X case L_TRAP_SLEEP_GAS:return("A sleep gas trap");
X case L_TRAP_ABYSS:return("A concealed entrance to the abyss");
X }
X}
X
X
X/* checks current food status of player, every hour, and when food is eaten */
Xvoid foodcheck()
X{
X if (Player.food > 24) {
X mprint("You vomit up your huge meal.");
X Player.food = 4;
X }
X else if (Player.food == 3) mprint("You feel hungry.");
X else if (Player.food == 1) {
X mprint("You feel weak.");
X if (Fastmove == TRUE) {
X drawvision(Player.x,Player.y,Player.vision);
X Fastmove = FALSE;
X }
X }
X else if (Player.food < 0) {
X if (Fastmove == TRUE) {
X drawvision(Player.x,Player.y,Player.vision);
X Fastmove = FALSE;
X }
X mprint("You're starving!");
X p_damage(-5*Player.food,UNSTOPPABLE,"starvation");
X }
X showflags();
X}
X
X
X/* tactical fighting mode, top-level routine */
Xvoid tacplayer(p_actions,pnumactions,m_actions,mnumactions,m)
Xint p_actions[10],*pnumactions,m_actions[10],mnumactions;
Xstruct monster *m;
X{
X int i,actionsleft,index,maneuvers,done;
X float times;
X
X times = (Player.status[HASTED] ? 2.0 : 1.0);
X times *= (Player.status[SLOWED] ? 0.5 : 1.0);
X
X done = FALSE;
X *pnumactions = 0;
X maneuvers = 2 + Player.level/10;
X if (Player.rank[ARENA]) maneuvers++;
X maneuvers = ((int) (maneuvers*times));
X maneuvers = min(8,max(1,maneuvers));
X actionsleft = maneuvers;
X printm("\n");
X do {
X menuclear();
X if (Arena)
X menuprint("Arena Combat: [abgwlrd,BACKSPACE/DELETE,CR/ESC,?]");
X else if (Final)
X menuprint("Final Duel: [abgwlrm,BACKSPACE/DELETE,CR/ESC,?]");
X else
X menuprint("Tactical Combat: [abgwlrmd,BACKSPACE/DELETE,CR/ESC,?]");
X printactions(*pnumactions,p_actions);
X menuprint("\n");
X menunumprint(actionsleft);
X menuprint(" Maneuvers left.\n");
X switch(mgetc()) {
X case '?':
X if (Arena)
X menuprint("ARENA COMBAT\n\n");
X else if (Final) menuprint("THE FINAL DUEL\n\n");
X else menuprint("TACTICAL COMBAT\n\n");
X menuprint("\nOpponent: ");
X menuprint(mstatus_string(m));
X menuprint("\n\nSelect maneuvers:");
X menuprint("\n[a] attack (1 maneuver)");
X menuprint("\n[b] block (1 maneuver)");
X menuprint("\n[g] pick up (all maneuvers)");
X menuprint("\n[w] wield (all maneuvers)");
X menuprint("\n[l] lunge (2 maneuvers)");
X menuprint("\n[r] riposte (2 maneuvers)");
X if (! Arena)
X menuprint("\n[m] magic (all maneuvers)");
X if (! Final) menuprint("\n[d] disengage (all maneuvers)");
X menuprint("\nBACKSPACE/DELETE clears choices");
X menuprint("\nESCAPE/RETURN when done");
X menuprint("\n? for this list");
X menumorewait();
X break;
X case 'a':
X if (actionsleft>0) {
X if (Player.status[AFRAID])
X menuprint("You are too afraid!");
X else {
X if (Player.primary == NULL) p_actions[*pnumactions] = CUT;
X else if ((Player.primary->type == THRUSTING) ||
X (Player.primary->type == MISSILE))
X p_actions[*pnumactions] = THRUST;
X else p_actions[*pnumactions] = CUT;
X menuprint("\nAttack");
X p_actions[*pnumactions]+=getlocation();
X (*pnumactions)++;
X actionsleft--;
X }
X }
X else {
X menuprint("\nNo more maneuvers!");
X morewait();
X }
X break;
X case 'b':
X if (actionsleft>0) {
X p_actions[*pnumactions] = BLOCK;
X menuprint("\nBlock ");
X p_actions[*pnumactions]+= getlocation();
X (*pnumactions)++;
X actionsleft--;
X }
X else {
X menuprint("\nNo more maneuvers!.");
X morewait();
X }
X break;
X case 'l':
X if (actionsleft>1) {
X if (Player.status[AFRAID]) {
X menuprint("You are too afraid!");
X morewait();
X }
X else if (Player.primary != NULL) {
X if (Player.primary->type != MISSILE) {
X p_actions[*pnumactions] = LUNGE;
X p_actions[*pnumactions]+=getlocation();
X (*pnumactions)++;
X actionsleft -= 2;
X menuprint("\nLunge ");
X }
X else {
X menuprint("\nNot with a missile weapon!");
X morewait();
X }
X }
X else {
X menuprint("\Not without a weapon!");
X morewait();
X }
X }
X else {
X menuprint("\nNo more maneuvers!");
X morewait();
X }
X break;
X case 'r':
X if (actionsleft>1) {
X if (Player.status[AFRAID]) {
X menuprint("You are too afraid!");
X morewait();
X }
X else if (Player.primary != NULL) {
X if (Player.primary->type == THRUSTING) {
X p_actions[*pnumactions] = RIPOSTE;
X menuprint("\nRiposte ");
X p_actions[*pnumactions]+=getlocation();
X (*pnumactions)++;
X actionsleft -= 2;
X }
X else {
X menuprint("\nNot without a thrusting weapon!");
X morewait();
X }
X }
X else {
X menuprint("\nNot without a weapon!");
X morewait();
X }
X }
X else {
X menuprint("\nNo more maneuvers!!");
X morewait();
X }
X break;
X case 'm':
X if (Arena) mprint("Magic is not allowed in the Arena.");
X else if (actionsleft == maneuvers) {
X if (Player.status[AFRAID]) {
X menuprint("\nYou are too afraid!");
X morewait();
X }
X else {
X index = getspell();
X if (index == ABORT)
X Skipmonsters = TRUE;
X else if (Spells[index].powerdrain > Player.mana) {
X menuprint("\nYou lack the power! ");
X morewait();
X }
X else {
X Player.mana -= Spells[index].powerdrain;
X p_actions[0] = MAGIC;
X p_actions[1] = index;
X *pnumactions = 1;
X actionsleft = 0;
X }
X xredraw();
X }
X }
X else {
X menuprint("No more maneuvers!");
X morewait();
X }
X break;
X case 'g':
X if (Dungeon[Dlevel][Player.x][Player.y].things == NULL) {
X menuprint("Nothing to pick up!");
X morewait();
X }
X else if (actionsleft == maneuvers) {
X p_actions[0] = PICK_UP;
X *pnumactions = 1;
X actionsleft = 0;
X }
X else {
X menuprint("No more maneuvers!");
X morewait();
X }
X break;
X case 'w':
X if (actionsleft == maneuvers) {
X p_actions[0] = WIELD;
X *pnumactions = 1;
X actionsleft = 0;
X }
X else {
X menuprint("No more maneuvers!");
X morewait();
X }
X break;
X case 'd':
X if (Final) {
X menuprint("There's nowhere to run....");
X morewait();
X }
X else if (actionsleft == maneuvers) {
X p_actions[0] = DISENGAGE;
X *pnumactions = 1;
X actionsleft = 0;
X }
X else {
X menuprint("No more manuevers!");
X morewait();
X }
X break;
X case BACKSPACE:
X case DELETE:
X *pnumactions=0;
X actionsleft=maneuvers;
X break;
X case RETURN:
X case LINEFEED:
X case ESCAPE:
X done = TRUE;
X break;
X }
X } while (! done);
X menuclear();
X dataprint();
X}
X
Xvoid tacmode(m)
Xstruct monster *m;
X{
X int p_actions[10],pnumactions,m_actions[10],mnumactions;
X int px=Player.x,py=Player.y,mx=m->x,my=m->y,level=Dlevel;
X Tacmode = TRUE;
X m_status_set(m,AWAKE);
X m_status_set(m,HOSTILE);
X m->attacked = TRUE;
X while (Tacmode) {
X tacplayer(p_actions,&pnumactions,m_actions,mnumactions,m);
X morewait();
X tacmonster(p_actions,pnumactions,m_actions,&mnumactions,m);
X tacexecute(p_actions,pnumactions,m_actions,mnumactions,m);
X if ((px!=Player.x) ||
X (py!=Player.y) ||
X (mx!=m->x) ||
X (my!=m->y) ||
X (level != Dlevel) ||
X (Player.hp < 1) ||
X (m->hp < 1))
X Tacmode = FALSE;
X }
X if ((px!=Player.x) ||
X (py!=Player.y) ||
X (mx!=m->x) ||
X (level != Dlevel) ||
X (my!=m->y))
X mprint("Close combat broken off by disengagement.");
X}
X
Xvoid roomcheck()
X{
X static int oldroom = -1;
X int roomno;
X
X if (oldroom !=
X (roomno = Dungeon[Dlevel][Player.x][Player.y].roomnumber)) {
X if (oldroom >= ROOMBASE) darkenroom(oldroom);
X if (roomno >= ROOMBASE) {
X lightroom(roomno);
X showroom(Leveldata[Dlevel].rooms[roomno-ROOMBASE].rsi);
X }
X else showroom(roomno);
X }
X oldroom = roomno;
X}
X
X
X/* illuminate room when entered */
Xvoid lightroom(roomno)
Xint roomno;
X{
X int i,j;
X struct level_data *l;
X struct room *r;
X char c;
X
X l = &(Leveldata[Dlevel]);
X
X r = &(l->rooms[roomno-ROOMBASE]);
X
X if (roomno > -1) {
X if (Fastmove == TRUE) {
X drawvision(Player.x,Player.y,Player.vision);
X Fastmove = FALSE;
X }
X if ((r->lighted) || Player.status[ILLUMINATION])
X for(i=r->left;i<=r->right;i++)
X for(j=r->top;j<=r->bottom;j++) {
X c = getspot(i,j,FALSE);
X Dungeon[Dlevel][i][j].seen = TRUE;
X Dungeon[Dlevel][i][j].showchar = c;
X putspot(i,j,c);
X }
X }
X}
X
Xvoid darkenroom(roomno)
Xint roomno;
X{
X int i,j;
X struct room *r;
X
X if (roomno >= ROOMBASE) {
X r = &(Leveldata[Dlevel].rooms[roomno-ROOMBASE]);
X for(i=r->left-1;i<=r->right+1;i++)
X for(j=r->top-1;j<=r->bottom+1;j++)
X blankoutspot(i,j);
X }
X levelrefresh();
X}
X
X
X
X/* ask for mercy */
Xvoid surrender(m)
X struct monster *m;
X{
X int i,bestitem,bestvalue;
X switch(random_range(4)) {
X case 0: printm("\nYou grovel at the monster's feet..."); break;
X case 1: printm("\nYou cry 'uncle'!");
X case 2: printm("\nYou beg for mercy.");
X case 3: printm("\nYou yield to the monster.");
X }
X if ((m->talkf==M_NO_OP) ||
X (m->talkf==M_TALK_STUPID))
X mprint("Your plea is ignored.");
X else {
X mprint("Your surrender is accepted.");
X mprint("All your gold is taken....");
X Player.cash = 0;
X bestvalue = 0;
X bestitem = ABORT;
X for (i=0;i<MAXITEMS;i++)
X if (Player.possessions[i] != NULL)
X if (bestvalue < true_item_value(Player.possessions[i]))
X bestitem = i;
X if (bestitem != ABORT) {
X mprint("You also give away your best item....");
X mprint(itemid(Player.possessions[bestitem]));
X givemonster(m,Player.possessions[bestitem]);
X }
X mprint("You feel less experienced...");
X Player.xp = max(0,Player.xp - m->xpv);
X mprint("The monster seems more experienced!");
X m->level = (min(10,m->level+1));
X m->hp += m->level*20;
X m->hit += m->level;
X m->dmg += m->level;
X m->ac += m->level;
X m->xpv += m->level*10;
X m->actions++;
X if ((m->talkf == M_TALK_EVIL) && random_range(10)) {
X mprint("It continues to attack you, laughing evilly!");
X m_status_set(m,HOSTILE);
X m_status_reset(m,GREEDY);
X }
X else {
X mprint("The monster leaves, chuckling to itself....");
X m_teleport(m);
X }
X }
X}
X
X
X/* threaten a monster */
Xvoid threaten(m)
Xstruct monster *m;
X{
X char response;
X switch(random_range(4)) {
X case 0:mprint("You demand that your opponent surrender!"); break;
X case 1:mprint("You threaten to do bodily harm to it."); break;
X case 2:mprint("You attempt to bluster it into submission."); break;
X case 3:mprint("You try to cow it with your awesome presence."); break;
X }
X if ((m->talkf == M_NO_OP) || (m->talkf == M_TALK_STUPID))
X mprint("Your demand is ignored!");
X else if (! m_statusp(m,HOSTILE)) {
X mprint("You only annoy it with your futile demand.");
X m_status_set(m,HOSTILE);
X }
X else if (m->level*3 > Player.level)
X mprint("It sneers contemptuously at you.");
X else if ((m->level*2 < Player.level) || (m->hp < Player.dmg)) {
X mprint("It yields to your mercy.");
X Player.alignment++;
X mprint("Kill it, rob it, or free it? [krf] ");
X do response = mgetc();
X while ((response != 'k')&&(response != 'r')&&(response !='f'));
X if (response == 'k') {
X m_death(m);
X mprint("You treacherous rogue!");
X Player.alignment -= 10;
X }
X else if (response == 'r') {
X mprint("It drops its treasure and flees.");
X m_dropstuff(m);
X m_vanish(m);
X }
X else {
X Player.alignment+=5;
X mprint("'If you love something set it free ... '");
X if (random_range(100)==13)
X mprint("'...If it doesn't come back, hunt it down and kill it.'");
X mprint("It departs with a renewed sense of its own mortality.");
X m_status_reset(m,HOSTILE);
X m_teleport(m);
X }
X }
X}
X
X
X
X
X/* Various things that get looked at every hour. Food/hunger status,
X random events, hourly status checks, wandering monster generation,
X player healing */
Xvoid hourly_check()
X{
X int i;
X pol ol;
X pml ml;
X
X Player.food--;
X foodcheck();
X wandercheck();
X hour_status_check();
X if ((Player.status[DISEASED] == 0) && (Player.hp < Player.maxhp))
X Player.hp = min(Player.maxhp,Player.hp+Player.level+1);
X
X /* random events, just general weirdness for the heck of it */
X switch(random_range(1000)) {
X case 0:
X mprint("You feel an unexplainable elation.");
X morewait();
X break;
X case 1:
X mprint("You hear a distant rumbling.");
X morewait();
X break;
X case 2:
X mprint("You realize your fly is open.");
X morewait();
X break;
X case 3:
X mprint("You have a sudden craving for a pecan twirl.");
X morewait();
X break;
X case 4:
X mprint("A mysterious healing flux settles over the level.");
X morewait();
X for (ml=Mlist[Dlevel];ml!=NULL;ml=ml->next)
X ml->m->hp = Monsters[ml->m->id].hp;
X Player.hp = max(Player.hp,Player.maxhp);
X break;
X case 5:
X mprint("You discover an itch just where you can't scratch it.");
X morewait();
X break;
X case 6:
X mprint("A cosmic ray strikes!");
X p_damage(10,UNSTOPPABLE,"a cosmic ray");
X morewait();
X break;
X case 7:
X mprint("You catch your second wind....");
X Player.hp = ++Player.maxhp;
X Player.mana = max(Player.mana, calcmana());
X morewait();
X break;
X case 8:
X mprint("You find some spare change in a hidden pocket.");
X Player.cash += Player.level*Player.level+1;
X morewait();
X break;
X case 9:
X if (Player.primary != NULL) {
X mprint("The warranty runs out on your weapon...");
X damage_item(Player.primary);
X }
X else mprint("You feel strangely lucky.");
X morewait();
X break;
X case 10:
X if (Dungeon[Dlevel][Player.x][Player.y].locchar == FLOOR) {
X Dungeon[Dlevel][Player.x][Player.y].locchar = TRAP;
X Dungeon[Dlevel][Player.x][Player.y].p_locf = L_TRAP_PIT;
X mprint("You fall into a pit -- filled with treasure!");
X morewait();
X for (i=0;i<5;i++) {
X ol = ((pol) calloc(1,sizeof(oltype)));
X ol->thing = create_object();
X ol->next = Dungeon[Dlevel][Player.x][Player.y].things;
X Dungeon[Dlevel][Player.x][Player.y].things = ol;
X }
X pickup();
X }
X else mprint("You feel like fortune has passed you by....");
X break;
X case 11:
X mprint("A mysterious voice echoes all around you....");
X hint();
X morewait();
X break;
X case 12:
X if (Balance > 0) {
X mprint("You get word of the failure of your bank!");
X Balance = 0;
X }
X else mprint("You feel lucky.");
X break;
X case 13:
X if (Balance > 0) {
X mprint("You get word of a bank error in your favor!");
X Balance += 5000;
X }
X else mprint("You feel unlucky.");
X break;
X }
X showflags();
X}
X
X
END_OF_oaux1.c
if test 30687 -ne `wc -c <oaux1.c`; then
echo shar: \"oaux1.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f omega.log -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"omega.log\"
else
echo shar: Extracting \"omega.log\" \(135 characters\)
sed "s/^X//" >omega.log <<'END_OF_omega.log'
XSysop
XCaspar (The Friendly Ghost)
X1 2 1118
XSysop
XSlongo The Unknown
X2 5 2718
XSysop
XVlad Tepes
X2 3 2618
XSysop
XBedwyr the Brave
X1 2 3012
END_OF_omega.log
if test 135 -ne `wc -c <omega.log`; then
echo shar: \"omega.log\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f omega.thanks -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"omega.thanks\"
else
echo shar: Extracting \"omega.thanks\" \(130 characters\)
sed "s/^X//" >omega.thanks <<'END_OF_omega.thanks'
X
X
XThanks to:
X
XBen Page, Greg Fisher, Hammy, and Silver, for bug reports, playtesting,
Xsuggestions, debugging, and general advice.
END_OF_omega.thanks
if test 130 -ne `wc -c <omega.thanks`; then
echo shar: \"omega.thanks\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f oscr.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"oscr.c\"
else
echo shar: Extracting \"oscr.c\" \(22823 characters\)
sed "s/^X//" >oscr.c <<'END_OF_oscr.c'
X/* omega (c) 1987 by Laurence Raphael Brothers */
X/* oscr.c */
X/* functions that use curses routines directly */
X/* plus a few file i/o stuff */
X/* also some in ofile.c */
X
X#include <curses.h>
X#include <strings.h>
X#include <sys/types.h>
X#include <sys/timeb.h>
X#include "oglob.h"
X
X/* from ofile */
Xextern void showscores(),extendlog(),showfile();
X
X
X
X/* from outil */
Xextern int los_p(),view_los_p();
Xextern int inbounds();
Xextern int screenmod();
Xextern int offscreen();
Xextern int distance();
Xextern int calc_points();
Xextern int hour(),showhour();
Xextern int day();
Xextern char *month(),*ordinal();
X
X/* from oplay */
Xextern char *itemid();
Xextern int optionp();
X
X/* from ospell */
Xextern char *spellid();
X
XWINDOW *Levelw,*Dataw,*Flagw,*Timew,*Menuw1,*Menuw2,*Msgw,*Locw,*Morew,*Phasew;
XWINDOW *CurrentMenu,*Rightside,*Comwin;
X
Xvoid redraw(),drawspot(),drawvision(),morewait(),drawmonsters();
Xvoid mprint(),printm(),title(),sitclear(),initgraf(),xredraw();
Xvoid plotchar(),show_screen(),blankoutspot(),show_license();
Xvoid menuclear(),showcursor(),mnumprint(),menumorewait(),menunumprint();
Xvoid menu_i_print(),clearmsg(),menuprint(),menu_item_print();
Xvoid stdmorewait(),draw_explosion(),dataprint(),comwinprint(),timeprint();
Xvoid menuspellprint(),erase_level(),levelrefresh();
Xvoid refreshmsg(),menuaddch(),drawscreen(),maddch(),putspot();
Xvoid menuprintitem(),display_quit(),showflags();
Xvoid drawplayer(),displaystats(),display_death(),plotmon();
Xvoid dobackspace(),drawandrefreshspot(),selectmenu();
Xvoid drawomega(),screencheck(),blotspot(),plotspot();
Xint parsenum(),getnumber(),litroom();
Xchar getspot(),mgetc(),lgetc(),menugetc(),*msgscanstring();
Xchar mcigetc();
X
Xvoid phaseprint()
X{
X wclear(Phasew);
X wprintw(Phasew,"Moon's Phase:\n");
X switch(Phase/2) {
X case 0: wprintw(Phasew,"NEW"); break;
X case 1: case 11: wprintw(Phasew,"CRESCENT"); break;
X case 2: case 10: wprintw(Phasew,"1/4"); break;
X case 3: case 9: wprintw(Phasew,"HALF"); break;
X case 4: case 8: wprintw(Phasew,"3/4"); break;
X case 5: case 7: wprintw(Phasew,"GIBBOUS"); break;
X case 6: wprintw(Phasew,"FULL"); break;
X }
X}
X
Xvoid selectmenu()
X{
X int y,x;
X getyx(CurrentMenu,y,x);
X if (y>17) {
X if (CurrentMenu == Menuw1)
X CurrentMenu = Menuw2;
X else {
X menumorewait();
X menuclear();
X CurrentMenu = Menuw1;
X }
X }
X}
X
Xvoid show_screen(y)
Xint y;
X{
X int i,j,seen,top,bottom;
X wclear(Levelw);
X switch(y) {
X case 0:
X top = TOPEDGE;
X bottom = EDGE1+2;
X break;
X case 1:
X top = EDGE1-1;
X bottom = EDGE2+1;
X break;
X case 2:
X top = EDGE2-1;
X bottom = EDGE3+1;
X break;
X case 3:
X top = EDGE3-2;
X bottom = BOTTOMEDGE;
X break;
X }
X for (j=top;j<=bottom;j++)
X for (i=0;i<WIDTH;i++) {
X seen = Dungeon[Dlevel][i][j].seen;
X wmove(Levelw,screenmod(j),i);
X waddch(Levelw,(seen ? Dungeon[Dlevel][i][j].showchar : ' '));
X }
X wrefresh(Levelw);
X}
X
X
X
X
X
Xvoid refreshmsg()
X{
X wrefresh(Msgw);
X}
X
X
Xchar mgetc()
X{
X return(wgetch(Msgw));
X}
X
X/* case insensitive mgetc -- sends uppercase to lowercase */
Xchar mcigetc()
X{
X char c = wgetch(Msgw);
X if ((c>='A') && (c<='Z'))
X return(c+('a'-'A'));
X else return(c);
X}
X
Xchar menugetc()
X{
X return(wgetch(Menuw1));
X}
X
X
Xchar lgetc()
X{
X return(wgetch(Levelw));
X}
X
X
Xchar ynq()
X{
X char p=' ';
X while ((p != 'n') && (p != 'y') && (p != 'q') && (p != ESCAPE))
X p = wgetch(Msgw);
X switch (p) {
X case 'y': wprintw(Msgw,"yes. "); break;
X case 'n': wprintw(Msgw,"no. "); break;
X case ESCAPE:
X case 'q': wprintw(Msgw,"quit. "); break;
X }
X wrefresh(Msgw);
X return(p);
X}
X
X
X/* for external call */
Xvoid clearmsg()
X{
X wclear(Msgw);
X wrefresh(Msgw);
X}
X
X
Xvoid erase_level()
X{
X wclear(Levelw);
X}
X
X
X/* possible moreprint to message window, otherwise just a printm */
Xvoid mprint(s)
Xchar *s;
X{
X int x,y;
X if (! SuppressPrinting) {
X strcpy(Laststring,s);
X getyx(Msgw,y,x);
X if (x+strlen(s) > 64) {
X morewait();
X wclear(Msgw);
X }
X wprintw(Msgw,s);
X waddch(Msgw,' ');
X wrefresh(Msgw);
X }
X}
X
X
X
X/* no new line */
Xvoid printm(s)
Xchar *s;
X{
X if (! SuppressPrinting) {
X wprintw(Msgw,s);
X waddch(Msgw,' ');
X wrefresh(Msgw);
X }
X}
X
Xvoid title()
X{
X FILE *fd;
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"omega.motd");
X fd = fopen(Str1,"r");
X showfile(fd);
X /* Pseudo Random Seed */
X Seed = (int) time(0);
X clear();
X refresh();
X showscores();
X}
X
X
X
X
X
X
X
X
X
X
X/* initialize, screen, windows */
Xvoid initgraf()
X{
X initscr();
X
X Rightside = newwin(20,15,1,65);
X Msgw = newwin(1,80,0,0);
X Morew = newwin(1,15,1,65);
X Locw = newwin(1,80,21,0);
X Levelw = newwin(20,64,1,0);
X Menuw1 = newwin(20,64,1,0);
X Menuw2 = newwin(20,40,1,40);
X Dataw = newwin(2,80,22,0);
X Timew = newwin(2,15,3,65);
X Phasew = newwin(2,15,6,65);
X Flagw = newwin(3,15,9,65);
X Comwin = newwin(8,15,13,65);
X CurrentMenu = Menuw1;
X
X noecho();
X crmode();
X
X scrollok(Msgw,TRUE);
X
X wclear(Msgw);
X wclear(Locw);
X wclear(Levelw);
X wclear(Timew);
X wclear(Flagw);
X wclear(Phasew);
X wclear(Dataw);
X wclear(Menuw1);
X wclear(Menuw2);
X wclear(Comwin);
X
X clear();
X refresh();
X title();
X clear();
X refresh();
X}
X
Xvoid drawplayer()
X{
X static int lastx=0,lasty=0;
X plotspot(lastx,lasty,(Player.status[BLINDED]>0 ? FALSE : TRUE));
X wmove(Levelw,screenmod(Player.y),Player.x);
X if ((! Player.status[INVISIBLE]) || Player.status[TRUESIGHT])
X waddch(Levelw,PLAYER);
X lastx = Player.x;
X lasty = Player.y;
X}
X
Xint litroom(x,y)
Xint x,y;
X{
X if (Dungeon[Dlevel][x][y].roomnumber < ROOMBASE) return(FALSE);
X else
X return(Leveldata[Dlevel].rooms
X [Dungeon[Dlevel][x][y].roomnumber-ROOMBASE].lighted ||
X Player.status[ILLUMINATION]);
X}
X
Xvoid drawvision(x,y,v)
Xint x,y,v;
X{
X static int oldx,oldy,oldv,oldroom;
X int i,j;
X if (Dlevel != 0)
X for (i=0-oldv;i<oldv+1;i++)
X for (j=0-oldv;j<oldv+1;j++)
X if (inbounds(oldx+i,oldy+j))
X if ((oldroom != Dungeon[Dlevel][x][y].roomnumber) ||
X (! litroom(oldx,oldy)))
X blankoutspot(oldx+i,oldy+j);
X if (Player.status[BLINDED]) {
X drawspot(oldx,oldy);
X drawspot(x,y);
X drawplayer();
X v = 0;
X }
X else {
X for (i=0-v;i<v+1;i++)
X for (j=0-v;j<v+1;j++)
X if (inbounds(x+i,y+j))
X drawspot(x+i,y+j);
X drawplayer();
X drawmonsters(TRUE);
X }
X if ((! Fastmove) || (! optionp(JUMPMOVE)))
X showcursor(Player.x,Player.y);
X oldx = x;
X oldy = y;
X oldv = v;
X oldroom = Dungeon[Dlevel][x][y].roomnumber;
X}
X
X
Xvoid showcursor(x,y)
Xint x,y;
X{
X wmove(Levelw,screenmod(y),x);
X wrefresh(Levelw);
X}
X
Xvoid levelrefresh()
X{
X wrefresh(Levelw);
X}
X
X/* this one refreshes immediately and also ignores monsters */
Xvoid drawandrefreshspot(x,y)
Xint x,y;
X{
X char c = getspot(x,y,FALSE);
X int l;
X if (c != Dungeon[Dlevel][x][y].showchar)
X if (view_los_p(Player.x,Player.y,x,y)) {
X Dungeon[Dlevel][x][y].seen = TRUE;
X Dungeon[Dlevel][x][y].showchar = c;
X putspot(x,y,c);
X }
X wrefresh(Levelw);
X}
X
X/* draws a particular spot under if in line-of-sight */
Xvoid drawspot(x,y)
Xint x,y;
X{
X char c = getspot(x,y,FALSE);
X if (c != Dungeon[Dlevel][x][y].showchar)
X if (view_los_p(Player.x,Player.y,x,y)) {
X Dungeon[Dlevel][x][y].seen = TRUE;
X Dungeon[Dlevel][x][y].showchar = c;
X putspot(x,y,c);
X }
X}
X
X/* write a blank to a spot if it is floor */
Xvoid blankoutspot(i,j)
Xint i,j;
X{
X if (Dungeon[Dlevel][i][j].showchar == FLOOR)
X blotspot(i,j);
X}
X
X/* blank out a spot regardless */
Xvoid blotspot(i,j)
Xint i,j;
X{
X Dungeon[Dlevel][i][j].seen = FALSE;
X Dungeon[Dlevel][i][j].showchar = SPACE;
X if (! offscreen(j)) {
X wmove(Levelw,screenmod(j),i);
X wdelch(Levelw);
X winsch(Levelw,SPACE);
X }
X}
X
X
X/* for displaying activity specifically at some point */
Xvoid plotspot(x,y,showmonster)
Xint x,y,showmonster;
X{
X if (Dungeon[Dlevel][x][y].seen)
X putspot(x,y,getspot(x,y,showmonster));
X else
X putspot(x,y,' ');
X}
X
Xvoid putspot(x,y,c)
Xint x,y;
Xchar c;
X{
X if (! offscreen(y)) {
X wmove(Levelw,screenmod(y),x);
X waddch(Levelw,c);
X }
X}
X
X
X/* regardless of line of sight, etc, draw a monster */
Xvoid plotmon(m)
Xstruct monster *m;
X{
X if (! offscreen(m->y)) {
X wmove(Levelw,screenmod(m->y),m->x);
X waddch(Levelw,m->monchar);
X }
X}
X
X/* if display, displays monsters, otherwise erases them */
Xvoid drawmonsters(display)
Xint display;
X{
X pml ml;
X for (ml=Mlist[Dlevel];ml!=NULL;ml=ml->next) {
X if (display) {
X if (view_los_p(Player.x,Player.y,ml->m->x,ml->m->y))
X if (Player.status[TRUESIGHT] || (! m_statusp(ml->m,M_INVISIBLE)))
X putspot(ml->m->x,ml->m->y,ml->m->monchar);
X }
X else if (Dungeon[Dlevel][ml->m->x][ml->m->y].seen)
X putspot(ml->m->x,
X ml->m->y,
X Dungeon[Dlevel][ml->m->x][ml->m->y].showchar);
X else blotspot(ml->m->x,ml->m->y);
X }
X}
X
X/* find apt char to display at some location */
Xchar getspot(x,y,showmonster)
Xint x,y,showmonster;
X{
X if (Dungeon[Dlevel][x][y].secret) return(WALL);
X switch (Dungeon[Dlevel][x][y].locchar) {
X case WHIRLWIND:
X return((Time % 2 == 1) ? WHIRLWIND2 : WHIRLWIND);
X break;
X case WATER:
X if (Dungeon[Dlevel][x][y].creature == NULL)
X return(WATER);
X else if (m_statusp(Dungeon[Dlevel][x][y].creature,SWIMMING))
X return(WATER);
X else return(Dungeon[Dlevel][x][y].creature->monchar);
X break;
X case CLOSED_DOOR:
X case LAVA:
X case HEDGE:
X case FIRE:
X case PORTAL:
X case ABYSS:
X return(Dungeon[Dlevel][x][y].locchar);
X break;
X default:
X if (showmonster && (Dungeon[Dlevel][x][y].creature != NULL)) {
X if ((m_statusp(Dungeon[Dlevel][x][y].creature,M_INVISIBLE)) &&
X (! Player.status[TRUESIGHT]))
X return(getspot(x,y,FALSE));
X else return (Dungeon[Dlevel][x][y].creature->monchar);
X }
X else if (Dungeon[Dlevel][x][y].things != NULL) {
X if (Dungeon[Dlevel][x][y].things->next != NULL)
X return(PILE);
X else return(Dungeon[Dlevel][x][y].things->thing->objchar);
X }
X else return(Dungeon[Dlevel][x][y].locchar);
X break;
X }
X}
X
Xvoid commanderror()
X{
X wclear(Msgw);
X wrefresh(Msgw);
X wprintw(Msgw,"%c : unknown command",Cmd);
X wrefresh(Msgw);
X}
X
Xvoid timeprint()
X{
X wclear(Timew);
X wprintw(Timew,"%d",showhour());
X wprintw(Timew,hour()>11 ? " PM \n" : " AM \n");
X wprintw(Timew,month());
X wprintw(Timew," the %d",day());
X wprintw(Timew,ordinal(day()));
X wrefresh(Timew);
X}
X
X
Xvoid comwinprint()
X{
X wclear(Comwin);
X wprintw(Comwin,"Hit: %d \n",Player.hit);
X wprintw(Comwin,"Dmg: %d \n",Player.dmg);
X wprintw(Comwin,"Def: %d \n",Player.defense);
X wprintw(Comwin,"Arm: %d \n",Player.absorption);
X wprintw(Comwin,"Spd: %.2f \n",5.0/Player.speed);
X wrefresh(Comwin);
X}
X
Xvoid dataprint()
X{
X wclear(Dataw);
X wprintw(Dataw,"HP:%d/%d MANA:%d/%d AU:%d LEVEL:%d/%d CARRY:%d/%d \n",
X Player.hp,Player.maxhp,Player.mana,Player.maxmana,Player.cash,
X Player.level,Player.xp,Player.itemweight,Player.maxweight);
X wprintw(Dataw,"STR:%d/%d CON:%d/%d DEX:%d/%d AGI:%d/%d INT:%d/%d POW:%d/%d ",
X Player.str,Player.maxstr,Player.con,Player.maxcon,
X Player.dex,Player.maxdex,Player.agi,Player.maxagi,
X Player.iq,Player.maxiq,Player.pow,Player.maxpow);
X wrefresh(Dataw);
X}
X
X
Xvoid displaystats(statpoints)
Xint statpoints;
X{
Xwclear(Dataw);
Xwprintw(Dataw," Statistic Points Left: %d \n",statpoints);
Xwprintw(Dataw,"STR:%d CON:%d DEX:%d AGI:%d INT:%d POW:%d ",
X Player.maxstr,Player.maxcon,Player.maxdex,Player.maxagi,Player.maxiq,
X Player.maxpow);
Xwrefresh(Dataw);
X}
X
X
X/* redraw everything currently displayed */
Xvoid redraw()
X{
X touchwin(curscr);
X wrefresh(curscr);
X}
X
X/* redraw each permanent window */
Xvoid xredraw()
X{
X wclear(Rightside);
X wrefresh(Rightside);
X scrollok(Msgw,FALSE);
X touchwin(Msgw);
X touchwin(Levelw);
X touchwin(Timew);
X touchwin(Flagw);
X touchwin(Dataw);
X touchwin(Locw);
X touchwin(Morew);
X touchwin(Phasew);
X touchwin(Comwin);
X wrefresh(Msgw);
X wrefresh(Levelw);
X wrefresh(Timew);
X wrefresh(Flagw);
X wrefresh(Dataw);
X wrefresh(Locw);
X wrefresh(Morew);
X wrefresh(Phasew);
X wrefresh(Comwin);
X scrollok(Msgw,TRUE);
X}
X
X
X
Xvoid menuaddch(c)
Xchar c;
X{
X selectmenu();
X waddch(CurrentMenu,c);
X wrefresh(CurrentMenu);
X}
X
Xvoid stdmorewait()
X{
X printw("\n---More---");
X refresh();
X while (wgetch(stdscr) != SPACE) { }
X}
X
Xvoid menumorewait()
X{
X wprintw(Menuw2,"\n ---More---");
X wrefresh(Menuw2);
X while (wgetch(Menuw2) != SPACE) { }
X}
X
X
X/* Neato the way it doesn't matter what display is set to, huh */
Xvoid morewait()
X{
X int display;
X do {
X wclear(Morew);
X if (display) wprintw(Morew,"*** MORE ***");
X else wprintw(Morew,"+++ MORE +++");
X display = ! display;
X wrefresh(Morew);
X } while (wgetch(Msgw) != SPACE);
X wclear(Morew);
X wrefresh(Morew);
X}
X
Xvoid menuclear()
X{
X wclear(Menuw1);
X wclear(Menuw2);
X wrefresh(Menuw1);
X wrefresh(Menuw2);
X CurrentMenu = Menuw1;
X}
X
Xvoid menuspellprint(i)
Xint i;
X{
X selectmenu();
X wprintw(CurrentMenu,spellid(i));
X wprintw(CurrentMenu,"(%d)\n",Spells[i].powerdrain);
X wrefresh(CurrentMenu);
X}
X
Xvoid menuprint(s)
Xchar *s;
X{
X selectmenu();
X wprintw(CurrentMenu,s);
X wrefresh(CurrentMenu);
X}
X
Xvoid menu_i_print(i)
Xint i;
X{
X menu_item_print(i,Player.possessions[i]);
X}
X
Xvoid menuprintitem(i,s)
Xint i;
Xchar *s;
X{
X selectmenu();
X wprintw(CurrentMenu,"%d",i);
X waddch(CurrentMenu,':');
X waddch(CurrentMenu,' ');
X wprintw(CurrentMenu,s);
X wprintw(CurrentMenu,"\n");
X wrefresh(CurrentMenu);
X}
X
Xvoid menu_item_print(i,item)
Xint i;
Xpob item;
X{
X selectmenu();
X waddch(CurrentMenu,((char) ('a' + i)));
X waddch(CurrentMenu,':');
X waddch(CurrentMenu,' ');
X waddch(CurrentMenu,item->objchar);
X waddch(CurrentMenu,' ');
X wprintw(CurrentMenu,itemid(item));
X if (item->used) wprintw(CurrentMenu," (in use)");
X wprintw(CurrentMenu,"\n");
X wrefresh(CurrentMenu);
X}
X
X
X
Xvoid endgraf()
X{
Xclear();
Xrefresh();
Xendwin();
X}
X
X
Xvoid plotchar(pyx,x,y)
Xchar pyx;
Xint x,y;
X{
X if (! offscreen(y)) {
X wmove(Levelw,screenmod(y),x);
X waddch(Levelw,pyx);
X wrefresh(Levelw);
X }
X}
X
X
X
Xvoid draw_explosion(pyx,x,y)
Xchar pyx;
Xint x,y;
X{
X int i,j;
X
X for(j=0;j<3;j++) {
X for(i=0;i<9;i++)
X plotchar(pyx,x+Dirs[0][i],y+Dirs[1][i]);
X for(i=0;i<9;i++)
X plotchar(' ',x+Dirs[0][i],y+Dirs[1][i]);
X }
X for(i=0;i<9;i++)
X plotspot(x+Dirs[0][i],y+Dirs[1][i],TRUE);
X wrefresh(Levelw);
X}
X
Xchar *msgscanstring()
X{
X char instring[80],byte='x';
X int i=0;
X
X instring[0]=0;
X byte = mgetc();
X while (byte != '\n') {
X if ((byte == 8) || (byte == 127)) { /* ^h or delete */
X instring[i] = 0;
X if (i>0){
X i--;
X dobackspace();
X }
X }
X else {
X instring[i] = byte;
X waddch(Msgw,byte);
X wrefresh(Msgw);
X i++;
X instring[i] = 0;
X }
X byte = mgetc();
X }
X return(instring);
X}
X
X
Xvoid locprint(s)
Xchar *s;
X{
X wclear(Locw);
X wprintw(Locw,s);
X wrefresh(Locw);
X}
X
X/* draw everything whether visible or not */
Xvoid drawscreen()
X{
X int i,j;
X
X for (i=0;i<WIDTH;i++)
X for(j=0;j<LENGTH;j++)
X putspot(i,j,Dungeon[Dlevel][i][j].locchar);
X wrefresh(Levelw);
X morewait();
X xredraw();
X}
X
X/*selects a number up to range */
X
Xint getnumber(range)
X{
X int done=FALSE,value=1;
X char atom;
X
X if (range==1) return(1);
X else while (! done) {
X printm("\nHow many? Change with < or >, ESCAPE to select:");
X mnumprint(value);
X do atom=mgetc();
X while ((atom != '<')&&(atom != '>')&&(atom!=ESCAPE));
X if ((atom=='>') && (value < range)) value++;
X else if ((atom=='<') && (value > 1)) value--;
X else if (atom==ESCAPE) done = TRUE;
X }
X return(value);
X}
X
X/* reads a positive number up to 99999 */
Xint parsenum()
X{
X int number[5];
X int place = -1;
X int done=FALSE;
X int i,x,y,num=0,mult=1;
X char byte=' ';
X
X while ((byte != ESCAPE) && (byte != '\n')) {
X byte = mgetc();
X if ((byte == BACKSPACE) || (byte == DELETE)) {
X if (place > -1) {
X number[place] = 0;
X place--;
X getyx(Msgw,y,x);
X wmove(Msgw,y,x-1);
X waddch(Msgw,' ');
X wmove(Msgw,y,x-1);
X wrefresh(Msgw);
X }
X }
X else if ((byte <= '9') && (byte >= '0') && (place < 4)) {
X place++;
X number[place]=byte;
X waddch(Msgw,byte);
X wrefresh(Msgw);
X }
X }
X if (byte == ESCAPE) return(ABORT);
X else {
X for (i=place;i>=0;i--) {
X num += mult*(number[i]-'0');
X mult*=10;
X }
X return(num);
X }
X}
X
X
X
Xvoid maddch(c)
Xchar c;
X{
X waddch(Msgw,c);
X wrefresh(Msgw);
X}
X
X
Xvoid display_death(source)
Xchar *source;
X{
X clear();
X printw("\n\n\n\n");
X printw("Requiescat In Pace, ");
X printw(Player.name);
X printw(" (%d points)",calc_points());
X strcpy(Str4,"Killed by ");
X strcat(Str4,source);
X printw("\n");
X printw(Str4);
X printw(".");
X printw("\n\n\n\n\n\Hit any key to continue.");
X refresh();
X wgetch(stdscr);
X clear();
X refresh();
X extendlog(Str4,DEAD);
X}
X
X
Xvoid display_win()
X{
X clear();
X printw("\n\n\n\n");
X printw(Player.name);
X if (Player.status[ADEPT]) {
X printw("is a total master of omega with %d points!",calc_points());
X strcpy(Str4,"A total master of omega");
X }
X else {
X strcpy(Str4,"retired a winner");
X printw(" triumphed in omega with %d points!",calc_points());
X printw("\nDeepest penetration was level %d.",Deepest);
X }
X printw("\n\n\n\n\n\Hit any key to continue.");
X refresh();
X wgetch(stdscr);
X clear();
X refresh();
X if (Player.status[ADEPT])
X extendlog(Str4,BIGWIN);
X else extendlog(Str4,WIN);
X}
X
Xvoid display_quit()
X{
X clear();
X printw("\n\n\n\n");
X printw(Player.name);
X strcpy(Str4,"A quitter.");
X printw(" wimped out on level %d with %d points!",Dlevel,calc_points());
X printw("\nDeepest penetration was level %d.",Deepest);
X printw("\n\n\n\n\n\Hit any key to continue.");
X refresh();
X wgetch(stdscr);
X clear();
X refresh();
X extendlog(Str4,QUIT);
X}
X
X
Xvoid mnumprint(n)
Xint n;
X{
X wprintw(Msgw,"%d",n);
X wrefresh(Msgw);
X}
X
Xvoid menunumprint(n)
Xint n;
X{
X wprintw(CurrentMenu,"%d",n);
X wrefresh(CurrentMenu);
X}
X
Xvoid dobackspace()
X{
X int x,y;
X
X getyx(Msgw,y,x);
X if (x > 0) {
X waddch(Msgw,' ');
X wmove(Msgw,y,x-1);
X waddch(Msgw,' ');
X wmove(Msgw,y,x-1);
X }
X wrefresh(Msgw);
X}
X
X
Xvoid showflags()
X{
X
X phaseprint();
X wclear(Flagw);
X if (Player.food > 20)
X wprintw(Flagw,"Satiated\n");
X else if (Player.food < 0)
X wprintw(Flagw,"Starving\n");
X else if (Player.food < 2)
X wprintw(Flagw,"Weak\n");
X else if (Player.food < 4)
X wprintw(Flagw,"Hungry\n");
X else if (Player.food < 8)
X wprintw(Flagw,"A mite peckish\n");
X else wprintw(Flagw,"Content\n");
X
X if (Player.status[POISONED]>0)
X wprintw(Flagw,"Poisoned\n");
X else wprintw(Flagw,"Vigorous\n");
X
X if (Player.status[DISEASED]>0)
X wprintw(Flagw,"Diseased\n");
X else wprintw(Flagw,"Healthy\n");
X
X wrefresh(Flagw);
X}
X
Xvoid drawomega()
X{
X int i;
X for(i=0;i<7;i++) {
X clear();
X printw("\n *****");
X printw("\n ****** ******");
X printw("\n *** ***");
X printw("\n *** ***");
X printw("\n ** **");
X printw("\n *** ***");
X printw("\n ** **");
X printw("\n ** **");
X printw("\n *** ***");
X printw("\n *** ***");
X printw("\n ** **");
X printw("\n * *** *** *");
X printw("\n **** ****");
X refresh();
X clear();
X printw("\n +++++");
X printw("\n ++++++ ++++++");
X printw("\n +++ +++");
X printw("\n +++ +++");
X printw("\n ++ ++");
X printw("\n +++ +++");
X printw("\n ++ ++");
X printw("\n ++ ++");
X printw("\n +++ +++");
X printw("\n +++ +++");
X printw("\n ++ ++");
X printw("\n + +++ +++ +");
X printw("\n ++++ ++++");
X refresh();
X clear();
X printw("\n .....");
X printw("\n ...... ......");
X printw("\n ... ...");
X printw("\n ... ...");
X printw("\n .. ..");
X printw("\n ... ...");
X printw("\n .. ..");
X printw("\n .. ..");
X printw("\n ... ...");
X printw("\n ... ...");
X printw("\n .. ..");
X printw("\n . ... ... .");
X printw("\n .... ....");
X refresh();
X }
X xredraw();
X}
X
X
Xvoid screencheck(y)
Xint y;
X{
X if (y/16 != WhichScreen) {
X WhichScreen = y/16;
X show_screen(WhichScreen);
X }
X}
X
X
X
Xvoid show_license()
X{
X Skipmonsters = TRUE;
X clear();
X printw("General Public License:\n\n");
X printw("omega is copyright (C) 1987 by:\n");
X printw("Laurence R. Brothers (brothers@paul.rutgers.edu)\n\n");
X printw("All rights are reserved, save the following permissions:\n\n");
X printw("Free copying: Anyone may make a copy of omega, and distribute\n");
X printw("the copy, so long as this license remains accessible\n");
X printw("(via the 'P' command). No charge will be levied for such copying\n");
X printw("or distribution. The author will gladly accept any remuneration\n");
X printw("that users may wish to provide, however.\n\n");
X printw("Modification: No one may modify omega except inasmuch\n");
X printw("as may be necessary to cause omega to function in any given\n");
X printw("computer environment. 'Porting' is therefore freely allowed. Any\n");
X printw("such modifications will be considered 'works for hire'\n");
X printw("and the modifiers will have no rights of ownership over\n");
X printw("such modifications. I specifically note that no compensation\n");
X printw("in any form will be rendered to those who make such allowed\n");
X printw("changes to omega. All other modifications are in violation of\n");
X printw("this license.\n\n");
X stdmorewait();
X clear();
X printw("Warranty: No warranty is made for omega's operation.\n");
X printw("Any damages incurred in the use of omega or in its\n");
X printw("implementation are solely the responsibility of the end-user.\n\n");
X printw("Coverage: Anyone who compiles, runs, copies, or in any other way\n");
X printw("manipulates any copy of omega's code, programs, or files shall\n");
X printw("considered to be bound by this license.\n");
X refresh();
X stdmorewait();
X xredraw();
X}
END_OF_oscr.c
if test 22823 -ne `wc -c <oscr.c`; then
echo shar: \"oscr.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 12 \(of 15\).
cp /dev/null ark12isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 15 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0