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