billr@saab.CNA.TEK.COM (Bill Randle) (07/13/89)
Submitted-by: "Laurence R. Brothers" <brothers@paul.rutgers.edu> Posting-number: Volume 7, Issue 25 Archive-name: omega3/Part06 Supersedes: omega2: Volume 5, Issue 11-29,38-40 #! /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 6 (of 20)." # Contents: oaux3.c odate.h osave.c # Wrapped by billr@saab on Thu Jun 29 08:14:01 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'oaux3.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'oaux3.c'\" else echo shar: Extracting \"'oaux3.c'\" \(30108 characters\) sed "s/^X//" >'oaux3.c' <<'END_OF_FILE' X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */ X X/* oaux3.c */ X X/* some functions called by ocom.c, also see oaux1.c, oaux2.c */ X/* This is a real grab bag file. It contains functions used by X oaux1 and o.c, as well as elsewhere. It is mainly here so oaux1.c X and oaux2 are not huge */ X X#include "oglob.h" X X/* check every ten minutes */ Xvoid tenminute_check() X{ X if (Time % 60 == 0) hourly_check(); X else { X if (Current_Environment == Current_Dungeon) wandercheck(); X minute_status_check(); X tenminute_status_check(); X if ((Player.status[DISEASED] < 1) && (Player.hp < Player.maxhp)) X Player.hp = min(Player.maxhp,Player.hp+Player.level+1); X if (Current_Environment != E_COUNTRYSIDE) X indoors_random_event(); X } X} X X X X/* hourly check is same as ten_minutely check except food is also X checked, and since time moves in hours out of doors, also X outdoors_random_event is possible */ X Xvoid hourly_check() X{ X Player.food--; X foodcheck(); X if (hour()==0) { /* midnight, a new day */ X moon_check(); X Date++; X } X torch_check(); X if (Current_Environment == Current_Dungeon) wandercheck(); X minute_status_check(); X tenminute_status_check(); X if ((Player.status[DISEASED] == 0) && (Player.hp < Player.maxhp)) X Player.hp = min(Player.maxhp,Player.hp+Player.level+1); X if (Current_Environment != E_COUNTRYSIDE) X indoors_random_event(); X} X X X X Xvoid indoors_random_event() X{ X pml ml; X pol ol; X switch(random_range(1000)) { X case 0: X print3("You feel an unexplainable elation."); X morewait(); X break; X case 1: X print3("You hear a distant rumbling."); X morewait(); X break; X case 2: X print3("You realize your fly is open."); X morewait(); X break; X case 3: X print3("You have a sudden craving for a pecan twirl."); X morewait(); X break; X case 4: X print3("A mysterious healing flux settles over the level."); X morewait(); X for (ml=Level->mlist;ml!=NULL;ml=ml->next) X if (ml->m->hp > 0) ml->m->hp = Monsters[ml->m->id].hp; X Player.hp = max(Player.hp,Player.maxhp); X break; X case 5: X print3("You discover an itch just where you can't scratch it."); X morewait(); X break; X case 6: X print3("A cosmic ray strikes!"); X p_damage(10,UNSTOPPABLE,"a cosmic ray"); X morewait(); X break; X case 7: X print3("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 print3("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 print3("You feel strangely lucky."); X morewait(); X break; X case 10: X print3("You trip over something hidden in a shadow..."); X morewait(); X ol = ((pol) malloc(sizeof(oltype))); X ol->thing = create_object(difficulty()); X ol->next = Level->site[Player.x][Player.y].things; X Level->site[Player.x][Player.y].things = ol; X pickup(); X break; X case 11: X print3("A mysterious voice echoes all around you...."); X hint(); X morewait(); X break; X case 12: X if (Balance > 0) { X print3("You get word of the failure of your bank!"); X Balance = 0; X } X else print3("You feel lucky."); X break; X case 13: X if (Balance > 0) { X print3("You get word of a bank error in your favor!"); X Balance += 5000; X } X else print3("You feel unlucky."); X break; X } X showflags(); X} X X X Xvoid outdoors_random_event() X{ X int num,i,j; X pob ob; X X switch(random_range(300)) { X case 0: X switch(Country[Player.x][Player.y].current_terrain_type) { X case TUNDRA: X mprint("It begins to snow. Heavily."); X break; X case DESERT: X mprint("A sandstorm swirls around you."); X break; X default: X if ((Date > 75) && (Date < 330)) X mprint("You are drenched by a sudden downpour!"); X else mprint("It begins to snow. Heavily."); X } X mprint("Due to the inclement weather conditions, you have become lost."); X Precipitation+=random_range(12)+1; X setgamestatus(LOST); X break; X case 1: X mprint("You enter a field of brightly colored flowers..."); X mprint("Wow, man! These are some pretty poppies..."); X morewait(); X mprint("poppies..."); X morewait(); X mprint("poppies..."); X morewait(); X print3("You become somewhat disoriented..."); X setgamestatus(LOST); X break; X case 2: X mprint("You discover a sprig of athelas growing lonely in the wild."); X mprint("Using your herbalist lore you cook a cake of lembas...."); X ob = ((pob) malloc(sizeof(objtype))); X *ob = Objects[FOODID+1]; X gain_item(ob); X break; X case 3: X if (Precipitation > 0) { X mprint("You are struck by a bolt of lightning!"); X p_damage(random_range(25),ELECTRICITY,"a lightning strike"); X } X else mprint("You feel static cling"); X break; X case 4: X mprint("You find a fast-food establishment."); X l_commandant(); X break; X case 5: X mprint("A weird howling tornado hits from out of the West!"); X mprint("You've been caught in a chaos storm!"); X num = random_range(300); X if (num <10) { X mprint("Your cell-structure was disrupted!"); X p_damage(random_range(100),UNSTOPPABLE,"a chaos storm"); X } X else if (num < 20) { X mprint("The chaos storm warps your frame!"); X mprint("Your statistical entropy has been maximized."); X mprint("You feel average..."); 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 ((Player.maxstr+Player.maxcon+Player.maxdex+Player.maxagi+ X Player.maxiq+Player.maxpow+12)/6); X } X else if (num < 30) { X mprint("Your entire body glows with an eerie flickering light."); X for(i=1;i<MAXITEMS;i++) X if (Player.possessions[i] != NULL) { X Player.possessions[i]->plus++; X if (Player.possessions[i]->objchar == STICK) X Player.possessions[i]->charge+=10; X Player.possessions[i]->blessing+=10; X } X cleanse(1); X mprint("You feel filled with energy!"); X Player.maxpow += 5; X Player.pow += 5; X Player.mana = Player.maxmana = calcmana() * 5; X mprint("You also feel weaker. Paradoxical, no?"); X Player.con -= 5; X Player.maxcon -= 5; X if (Player.con < 3) X p_death("congestive heart failure"); X } X else if (num < 40) { X mprint("Your entire body glows black."); X dispel(-1); X dispel(-1); X Player.pow-=10; X Player.mana=0; X } X else if (num < 60) { X mprint("The storm deposits you in a strange place...."); X Player.x = random_range(WIDTH); X Player.y = random_range(LENGTH); X screencheck(Player.y); X } X else if (num < 70) { X mprint("A tendril of the storm condenses and falls into your hands."); X ob = ((pob) malloc(sizeof(objtype))); X make_artifact(ob,-1); X gain_item(ob); X } X else if (num < 80) { X if (gamestatusp(MOUNTED)) { X mprint("Your horse screams as he is transformed into an"); X mprint("imaginary unseen dead tortoise."); X mprint("You are on foot."); X resetgamestatus(MOUNTED); X } X else { X mprint("You notice you are riding a horse. Odd. Very odd...."); X mprint("Now that's a horse of a different color!"); X setgamestatus(MOUNTED); X } X } X else if (num < 90) { X mprint("You feel imbued with godlike power...."); X wish(1); X } X else if (num < 100) { X mprint("The chaos storm has wiped your memory!"); X mprint("You feel extraordinarily naive...."); X mprint("You can't remember a thing! Not even your name."); X Player.xp = 0; X Player.level = 0; X for (i=0;i<NUMRANKS;i++) Player.rank[i] = 0; X for (i=0;i<NUMSPELLS;i++) Spells[i].known = FALSE; X rename_player(); X } X else { X mprint("You survive the chaos storm relatively unscathed."); X mprint("It was a learning experience."); X gain_experience(1000); X } X break; X case 6: case 7: case 8: case 9: case 10: X mprint("An encounter!"); X change_environment(E_TACTICAL_MAP); X break; X case 11: X mprint("You find a Traveller's Aid station with maps of the local area."); X if (gamestatusp(LOST)) { X resetgamestatus(LOST); X mprint("You know where you are now."); X } X for(i=Player.x-5;i<Player.x+6;i++) X for(j=Player.y-5;j<Player.y+6;j++) X if (inbounds(i,j)) { X Country[i][j].explored = TRUE; X Country[i][j].current_terrain_type = X Country[i][j].base_terrain_type; X } X show_screen(); X break; X case 12: X if (! gamestatusp(MOUNTED)) { X mprint("You develop blisters...."); X p_damage(1,UNSTOPPABLE,"blisters"); X } X break; X case 13: X mprint("You discover an itch just where you can't scratch it."); X break; X case 14: X mprint("A cosmic ray strikes!"); X p_damage(10,UNSTOPPABLE,"a cosmic ray"); X break; X case 15: X mprint("You feel strangely lucky."); X break; X case 16: X mprint("The west wind carries with it a weird echoing voice...."); X hint(); X break; X } X dataprint(); X showflags(); X} X X Xchar getlocation() X{ X char response; X menuprint(" (enter location [HCL])"); X do response = mcigetc(); X while ((response != 'h') && X (response != 'c') && X (response != 'l')); X switch(response){ X case 'h':menuprint(" High."); return ('H'); break; X case 'c':menuprint(" Center."); return('C'); break; X case 'l':menuprint(" Low."); return('L'); break; X } X} X X X X X X X/* chance for player to resist magic somehow */ X/* hostile_magic ranges in power from 0 (weak) to 10 (strong) */ Xint magic_resist(hostile_magic) Xint hostile_magic; X{ X if ((Player.rank[COLLEGE]+Player.rank[CIRCLE] > 0) && X (Player.level/2 + random_range(20) > X hostile_magic + random_range(20))) { X if (Player.mana > hostile_magic * hostile_magic) { X mprint("Thinking fast, you defend youself with a counterspell!"); X Player.mana -= hostile_magic * hostile_magic; X dataprint(); X return(TRUE); X } X } X if (Player.level/4 + Player.status[PROTECTION] + random_range(20) > X hostile_magic + random_range(30)) { X mprint("You make your saving throw!"); X return(TRUE); X } X else return(FALSE); X} X X X X X Xvoid terrain_check(takestime) Xint takestime; X{ X if (! takestime) X switch(random_range(32)) { X case 0:print2("Boingg!"); break; X case 1:print2("Whooosh!"); break; X case 2:print2("Over hill, over dale...."); break; X case 3:print2("...able to leap over 7 leagues in a single bound...."); X break; X } X else if (gamestatusp(MOUNTED)) X switch(random_range(32)) { X case 0: X case 1:print2("Clippity Clop.");break; X case 2:print2("....my spurs go jingle jangle jingle....");break; X case 3:print2("....as I go riding merrily along....");break; X } X else switch(random_range(32)) { X case 0:print2("Trudge. Trudge."); break; X case 1:print2("The road goes ever onward...."); break; X } X switch(Country[Player.x][Player.y].current_terrain_type) { X case RIVER: X if ((Player.y < 6) && (Player.x > 20)) locprint("Star Lake."); X else if (Player.y < 41) { X if (Player.x < 10) locprint("Aerie River."); X else locprint("The Great Flood."); X } X else if (Player.x < 42) locprint("The Swamp Runs."); X else locprint("River Greenshriek."); X if (takestime) { X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X } X break; X case ROAD: X locprint("A well-maintained road."); X if (takestime) { X Time += 60; X hourly_check(); X } X break; X case PLAINS: X locprint("A rippling sea of grass."); X if (takestime) { X Time += 60; X hourly_check(); X if (! gamestatusp(MOUNTED)) { X Time += 60; X hourly_check(); X } X } X break; X case TUNDRA: X locprint("The Great Northern Wastes."); X if (takestime) { X Time += 60; X hourly_check(); X if (! gamestatusp(MOUNTED)) { X Time += 60; X hourly_check(); X } X } X break; X case FOREST: X if (Player.y < 10) locprint("The Deepwood."); X else if (Player.y < 18) locprint("The Forest of Erelon."); X else if (Player.y < 46) locprint("The Great Forest."); X if (takestime) { X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X if (! gamestatusp(MOUNTED)) { X Time += 60; X hourly_check(); X } X } X break; X case JUNGLE: X locprint("Greenshriek Jungle."); X if (takestime) { X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X if (! gamestatusp(MOUNTED)) { X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X } X } X break; X case DESERT: X locprint("The Waste of Time."); X if (takestime) { X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X if (! gamestatusp(MOUNTED)) { X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X } X } X break; X case MOUNTAINS: X if ((Player.y < 9) && (Player.x < 12)) X locprint("The Magic Mountains"); X else if ((Player.y < 9) && (Player.y > 2) && (Player.x < 40)) X locprint("The Peaks of the Fist."); X else if (Player.x < 52) X locprint("The Rift Mountains."); X else locprint("Borderland Mountains."); X if (takestime) { X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X if (! gamestatusp(MOUNTED)) { X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X } X } X break; X case PASS: X locprint("A hidden pass."); X if (takestime) { X Time += 60; X hourly_check(); X } X break; X case CHAOS_SEA: X locprint("The Sea of Chaos."); X if (takestime) { X Time += 60; X hourly_check(); X } X l_chaos(); X mprint("You have entered the sea of chaos..."); X break; X case SWAMP: X locprint("The Loathly Swamp."); X if (takestime) { X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X if (! gamestatusp(MOUNTED)) { X Time += 60; X hourly_check(); X Time += 60; X hourly_check(); X } X } X break; X case CITY: X if (gamestatusp(LOST)) { X resetgamestatus(LOST); X mprint("Well, I guess you know where you are now...."); X } X locprint("Outside Rampart, the city."); X break; X case VILLAGE: X if (gamestatusp(LOST)) { X resetgamestatus(LOST); X mprint("The village guards let you know where you are...."); X } X locprint("Outside a small village."); X break; X case CAVES: X locprint("A deserted hillside."); X if (takestime) { X Time += 60; X hourly_check(); X } X mprint("You notice a concealed entrance into the hill."); X break; X case CASTLE: X locprint("Near a fortified castle."); X if (takestime) { X Time += 60; X hourly_check(); X } X mprint("The castle is hewn from solid granite. The drawbridge is down."); X break; X case TEMPLE: X switch(Country[Player.x][Player.y].aux) { X case ODIN: locprint("A rough-hewn granite temple."); break; X case SET: locprint("A black pyramidal temple made of sandstone."); break; X case ATHENA: locprint("A classical marble-columned temple."); break; X case HECATE: locprint("A temple of ebony adorned with ivory."); break; X case DRUID: locprint("A temple formed of living trees."); break; X case DESTINY: locprint("A temple of some mysterious blue crystal."); break; X } X if (takestime) { X Time += 60; X hourly_check(); X } X mprint("You notice an entrance conveniently at hand."); X break; X case MAGIC_ISLE: X locprint("A strange island in the midst of the Sea of Chaos."); X if (takestime) { X Time += 60; X hourly_check(); X } X mprint("There is a narrow causeway to the island from here."); X break; X case STARPEAK: X locprint("Star Peak."); X if (takestime) { X Time += 60; X hourly_check(); X } X mprint("The top of the mountain seems to glow with a allochroous aura."); X break; X case DRAGONLAIR: X locprint("A rocky chasm."); X if (takestime) { X Time += 60; X hourly_check(); X } X mprint("You are at a cave entrance from which you see the glint of gold."); X break; X case VOLCANO: X locprint("HellWell Volcano."); X if (takestime) { X Time += 60; X hourly_check(); X } X mprint("A shimmer of heat lightning plays about the crater rim."); X break; X default: X locprint("I haven't any idea where you are!!!"); X break; X } X outdoors_random_event(); X} X X X Xvoid countrysearch() X{ X int x,y; X Time+=60; X hourly_check(); X for (x=Player.x-1;x<Player.x+2;x++) X for (y=Player.y-1;y<Player.y+2;y++) X if (inbounds(x,y)) { X if (Country[x][y].current_terrain_type != X Country[x][y].base_terrain_type) { X mprint("Your search was fruitful!"); X Country[x][y].current_terrain_type=Country[x][y].base_terrain_type; X mprint("You discovered:"); X mprint(countryid(Country[x][y].base_terrain_type)); X } X } X} X Xchar *countryid(terrain) Xchar terrain; X{ X switch(terrain) { X case MOUNTAINS: X strcpy(Str1,"Almost impassable mountains"); X break; X case PLAINS: X strcpy(Str1,"Seemingly endless plains"); X break; X case TUNDRA: X strcpy(Str1,"A frosty stretch of tundra"); X break; X case ROAD: X strcpy(Str1,"A paved highway"); X break; X case PASS: X strcpy(Str1,"A secret mountain pass"); X break; X case RIVER: X strcpy(Str1,"A rolling river"); X break; X case CITY: X strcpy(Str1,"The city of Rampart"); X break; X case VILLAGE: X strcpy(Str1,"A rural village"); X break; X case FOREST: X strcpy(Str1,"A verdant forest"); X break; X case JUNGLE: X strcpy(Str1,"A densely overgrown jungle"); X break; X case SWAMP: X strcpy(Str1,"A swampy fen"); X break; X case VOLCANO: X strcpy(Str1,"A huge active volcano"); X break; X case CASTLE: X strcpy(Str1,"An imposing castle"); X break; X case STARPEAK: X strcpy(Str1,"A mysterious mountain."); X break; X case DRAGONLAIR: X strcpy(Str1,"A cavern filled with treasure."); X break; X case MAGIC_ISLE: X strcpy(Str1,"An island emanating magic."); X break; X case CAVES: X strcpy(Str1,"A hidden cave entrance"); X break; X case TEMPLE: X strcpy(Str1,"A neoclassical temple"); X break; X case DESERT: X strcpy(Str1,"A sere desert"); X break; X case CHAOS_SEA: X strcpy(Str1,"The Sea of Chaos"); X break; X default: X strcpy(Str1,"I have no idea."); X break; X } X return(Str1); X} X X/* i is the offset from CITYSITEBASE, not the actual constant */ Xchar *citysiteid(i) Xint i; X{ X switch(i+CITYSITEBASE) { X case L_CHARITY:strcpy(Str4,"hospice"); break; X case L_ORDER:strcpy(Str4,"order of paladins"); break; X case L_ARMORER:strcpy(Str4,"armorer"); break; X case L_CLUB:strcpy(Str4,"explorers' club"); break; X case L_GYM:strcpy(Str4,"gymnasium"); break; X case L_THIEVES_GUILD:strcpy(Str4,"thieves' guild"); break; X case L_COLLEGE:strcpy(Str4,"collegium magii"); break; X case L_HEALER:strcpy(Str4,"healer"); break; X case L_CASINO:strcpy(Str4,"casino"); break; X case L_TAVERN:strcpy(Str4,"tavern"); break; X case L_MERC_GUILD:strcpy(Str4,"mercenary guild"); break; X case L_ALCHEMIST:strcpy(Str4,"alchemist"); break; X case L_SORCERORS:strcpy(Str4,"sorcerors' guild "); break; X case L_CASTLE:strcpy(Str4,"castle"); break; X case L_ARENA:strcpy(Str4,"arena"); break; X case L_DPW:strcpy(Str4,"department of public works"); break; X case L_LIBRARY:strcpy(Str4,"library"); break; X case L_PAWN_SHOP:strcpy(Str4,"pawn shop"); break; X case L_BANK:strcpy(Str4,"bank"); break; X case L_CONDO:strcpy(Str4,"condo"); break; X case L_ORACLE:strcpy(Str4,"oracle"); break; X case L_BROTHEL:strcpy(Str4,"brothel"); break; X case L_DINER:strcpy(Str4,"diner"); break; X case L_COMMANDANT:strcpy(Str4,"fast food"); break; X case L_CRAP:strcpy(Str4,"les crapuleux"); break; X case L_TEMPLE:strcpy(Str4,"temple"); break; X case L_COUNTRYSIDE:strcpy(Str4,"city gates"); break; X default:strcpy(Str4,"???"); break; X } X return(Str4); X} X X X Xvoid expandsiteabbrevs(prefix) Xchar prefix[80]; X{ X int i,printed=FALSE; X X menuclear(); X menuprint("\nPossible Sites:\n"); X for (i=0;i<NUMCITYSITES;i++) X if (CitySiteList[i][0] && strprefix(prefix,citysiteid(i))) { X menuprint(citysiteid(i)); X menuprint("\n"); X printed = TRUE; X } X if (! printed) X menuprint("\nNo known sites match that prefix!"); X} X X Xint expandsite(prefix) Xchar prefix[80]; X{ X int i,site,matched=0; X X for (i=0;i<NUMCITYSITES;i++) X if (CitySiteList[i][0] && strprefix(prefix,citysiteid(i))) { X site = i; X matched++; X } X if (matched==0) { X print3("No known locations match that prefix!"); X return(ABORT); X } X else if (matched > 1) { X print3("That is an ambiguous abbreviation!"); X return(ABORT); X } X else return(site); X} X X X Xint parsecitysite() X{ X int site= -3,place=0; X char byte,prefix[80]; X X prefix[0]=0; X X do { X byte = mgetc(); X if ((byte >= 'A') && (byte <= 'Z')) { X maddch(byte+'a'-'A'); X prefix[place] = byte+'a'-'A'; X prefix[place+1] = 0; X place++; X } X else if ((byte == ' ') || ((byte >= 'a') && (byte <= 'z'))) { X maddch(byte); X prefix[place] = byte; X prefix[place+1] = 0; X place++; X } X else if ((byte == 8) || (byte == 127)) { /* ^h or delete */ X prefix[place]=0; X if (place > 0) { X place--; X dobackspace(); X } X } X else if (byte == '?') { X maddch(byte); X expandsiteabbrevs(prefix); X dobackspace(); X } X else if (byte == '\n') X site = expandsite(prefix); X else if (byte == ESCAPE) X site = ABORT; X } while (site == -3); X xredraw(); X return(site); X} X X/* are there hostile monsters within 2 moves? */ Xint hostilemonstersnear() X{ X int i,j,hostile = FALSE; X X for (i=Player.x-2;((i<Player.x+3)&&(! hostile));i++) X for (j=Player.y-2;((j<Player.y+3)&&(! hostile));j++) X if (inbounds(i,j)) X if (Level->site[i][j].creature != NULL) X hostile = m_statusp(Level->site[i][j].creature,HOSTILE); X X return(hostile); X} X X/* random effects from some of stones in villages */ X/* if alignment of stone is alignment of player, gets done sooner */ Xint stonecheck(alignment) X{ X int *stone,match=FALSE,cycle=FALSE,i; X X if (alignment == 1) { X stone = &Lawstone; X match = Player.alignment > 0; X } X else if (alignment == -1) { X stone = &Chaostone; X match = Player.alignment < 0; X } X else { X stone = &Mindstone; X match = FALSE; X } X *stone += random_range(4) + (match ? random_range(4) : 0); X switch((*stone)++) { X case 0:case 2:case 4:case 6:case 8:case 10:case 12:case 14:case 16:case 18: X case 20:case 22:case 24:case 26:case 28:case 30:case 32:case 34:case 36: X case 38:case 40: print1("The stone glows grey."); X print2("Not much seems to happen this time."); X (*stone)--; X break; X case 1: print1("The stone glows black"); X print2("A burden has been removed from your shoulders....."); X print3("Your pack has disintegrated!"); X for(i=0;i<MAXPACK;i++) X if (Player.pack[i] != NULL) { X free((char *) Player.pack[i]); X Player.pack[i] = NULL; X } X Player.packptr = 0; X break; X case 3: print1("The stone glows microwave"); X print2("A vortex of antimana spins about you!"); X dispel(-1); X break; X case 5: print1("The stone glows infrared"); X print2("A portal opens nearby and an obviously confused monster appears!"); X summon(-1,-1); X break; X case 7: print1("The stone glows brick red"); X print2("A gold piece falls from the heavens into your money pouch!"); X Player.cash++; X break; X case 9: print1("The stone glows cherry red"); X print2("A flush of warmth spreads through your body."); X augment(1); X break; X case 11: print1("The stone glows orange"); X print2("A flux of energy blasts you!"); X manastorm(Player.x,Player.y,random_range(Player.maxhp)+1); X break; X case 13: print1("The stone glows lemon yellow"); X print2("You're surrounded by enemies! You begin to foam at the mouth."); X Player.status[BERSERK] += 10; X break; X case 15: print1("The stone glows yellow"); X print2("Oh no! The DREADED AQUAE MORTIS!"); X morewait(); X print2("No, wait, it's just your imagination."); X break; X case 17: print1("The stone glows chartreuse"); X print2("Your joints stiffen up."); X Player.agi -= 3; X break; X case 19: print1("The stone glows green"); X print2("You come down with an acute case of Advanced Leprosy."); X Player.status[DISEASED] = 1100; X Player.hp = 1; X Player.dex -= 5; X break; X case 21: print1("The stone glows forest green"); X print2("You feel wonderful!"); X Player.status[HERO]+=10; X break; X case 23: print1("The stone glows cyan"); X print2("You feel a strange twisting sensation...."); X strategic_teleport(-1); X break; X case 25: print1("The stone glows blue"); X morewait(); X print1("You feel a tingle of an unearthly intuition:"); X hint(); X break; X case 27: print1("The stone glows navy blue"); X print2("A sudden shock of knowledge overcomes you."); X morewait(); X clearmsg(); X identify(1); X knowledge(1); X break; X case 29: print1("The stone glows blue-violet"); X print2("You feel forgetful."); X for(i=0;i<NUMSPELLS;i++) X if (Spells[i].known) { X Spells[i].known = FALSE; X break; X } X break; X case 31: print1("The stone glows violet"); X acquire(0); X break; X case 33: print1("The stone glows deep purple"); X print2("You vanish."); X Player.status[INVISIBLE]+=10; X break; X case 35: print1("The stone glows ultraviolet"); X print2("All your hair rises up on end.... A bolt of lightning hits you!"); X p_damage(random_range(Player.maxhp),ELECTRICITY,"mystic lightning"); X break; X case 37: print1("The stone glows roentgen"); X print2("You feel more experienced."); X gain_experience((Player.level+1)*250); X break; X case 39: print1("The stone glows gamma"); X print2("Your left hand shines silvery, and your right emits a golden aura."); X enchant(1); X bless(1); X print3("Your hands stop glowing."); X break; X case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 48:case 49: X print1("The stone glows cosmic!"); X print2("The stone's energy field quiets for a moment..."); X *stone = 50; X cycle = TRUE; X break; X default: print1("The stone glows polka-dot (?!?!?!?)"); X print2("You feel a strange twisting sensation...."); X *stone = 0; X strategic_teleport(-1); X break; X } X calc_melee(); X return(cycle); X} X Xvoid alert_guards() X{ X int foundguard=FALSE; X pml ml; X for(ml=Level->mlist;ml!=NULL;ml=ml->next) X if (((ml->m->id == ML0+3) || /*guard*/ X ((ml->m->id == ML0+8) && (ml->m->aux2 == 15))) && /*justiciar*/ X (ml->m->hp > 0)) { X foundguard=TRUE; X m_status_set(ml->m,AWAKE); X m_status_set(ml->m,HOSTILE); X } X if (foundguard) print2("You hear a whistle and the sound of running feet!"); X if ((! foundguard) && (Current_Environment == E_CITY)) { X print2("The last member of the Order of Paladins dies...."); X gain_experience(1000); X Player.alignment -= 250; X if (! gamestatusp(KILLED_LAWBRINGER)) { X morewait(); X print1("A chime sounds from far away.... The sound grows stronger...."); X print2("Suddenly the great shadowy form of the LawBringer appears over"); X print3("the city. He points his finger at you...."); X morewait(); X print1("Cursed art thou, minion of chaos! May thy strength fail thee"); X print2("in thy hour of need! You feel an unearthly shiver as the"); X print3("LawBringer waves his palm across the city skies...."); X Player.str /= 2; X morewait(); X print1("You hear a bell tolling, and eerie moans all around you...."); X print2("Suddenly, the image of the LawBringer is gone."); X print3("You hear a guardsman's whistle in the distance!"); X morewait(); X resurrect_guards(); X } X else { X print1("The Order's magical defenses have dropped, and the"); X print2("Legions of Chaos strike...."); X morewait(); X print1("The city shakes! An earthquake has struck!"); X print2("Cracks open in the street, and a chasm engulfs the Order HQ!"); X print3("Flames lick across the sky and you hear wild laughter...."); X gain_experience(5000); X destroy_order(); X } X } X} X X X/* can only occur when player is in city, so OK to use Level */ Xvoid destroy_order() X{ X int i,j; X setgamestatus(DESTROYED_ORDER); X if (Level != City) print1("Zounds! A Serious Mistake!"); X else X for(i=35;i<46;i++) X for(j=61;j<64;j++) { X Level->site[i][j].locchar = RUBBLE; X Level->site[i][j].p_locf = L_RUBBLE; X if (Level->site[i][j].creature != NULL) X free((char *) Level->site[i][j].creature); X make_site_monster(i,j,ML2+6); X Level->site[i][j].creature->monstring = X salloc("ghost of a Paladin"); X m_status_set(Level->site[i][j].creature,HOSTILE); X } X} X X X Xint maneuvers() X{ X int m; X float times; X times = (Player.status[HASTED] ? 2.0 : 1.0); X times *= (Player.status[SLOWED] ? 0.5 : 1.0); X X m = 2 + Player.level/7; X if (Player.rank[ARENA]) m++; X m = ((int) (m*times)); X m = min(8,max(1,m)); X X return(m); X} X X/* for when haste runs out, etc. */ Xvoid default_maneuvers() X{ X int i; X morewait(); X clearmsg(); X print1("Warning, resetting your combat options to the default."); X print2("Use the 'F' command to select which options you prefer."); X morewait(); X for(i=0;i<maneuvers();i+=2) { X Player.meleestr[i*2]='A'; X Player.meleestr[(i+1)*2]='B'; X Player.meleestr[((i+1)*2)+1]='C'; X Player.meleestr[(i*2)+1]='C'; X } X Player.meleestr[maneuvers()*2]=0; X} END_OF_FILE if test 30108 -ne `wc -c <'oaux3.c'`; then echo shar: \"'oaux3.c'\" unpacked with wrong size! fi # end of 'oaux3.c' fi if test -f 'odate.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'odate.h'\" else echo shar: Extracting \"'odate.h'\" \(148 characters\) sed "s/^X//" >'odate.h' <<'END_OF_FILE' X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */ X/* odate.h */ X X#define LAST_OMEGA_EDIT_DATE "Thu May 4 14:38:33 EST 1989" X X END_OF_FILE if test 148 -ne `wc -c <'odate.h'`; then echo shar: \"'odate.h'\" unpacked with wrong size! fi # end of 'odate.h' fi if test -f 'osave.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'osave.c'\" else echo shar: Extracting \"'osave.c'\" \(20936 characters\) sed "s/^X//" >'osave.c' <<'END_OF_FILE' X/* omega copyright (c) 1987,1988,1989 by Laurence Raphael Brothers */ X/* osave.c */ X X#include "oglob.h" X X/*Various functions for doing game saves and restores */ X/*The game remembers various player information, the city level, Xthe country level, and the last or current dungeon level */ X X/**************** SAVE FUNCTIONS */ X X/* Checks to see if save file already exists. X Checks to see if save file can be opened for write. X The player, the city level, and the current dungeon level are saved. X*/ X Xint save_game(compress,savestr) Xint compress; Xchar *savestr; X{ X#ifdef MSDOS X int tmpdepth; X#endif X int i,writeok=TRUE; X char cmd[80]; X#ifndef MSDOS X FILE *fd =fopen(savestr,"r"); X#else X FILE *fd =fopen(savestr,"rb"); X#endif X if (fd != NULL) { X mprint(" Overwrite old file?"); X writeok = (ynq() == 'y'); X fclose(fd); X } X if (writeok) { X#ifndef MSDOS X fd=fopen(savestr,"w"); X#else X fd=fopen(savestr,"wb"); X#endif X if (fd == NULL) { X writeok = FALSE; X mprint(" Error opening file."); X } X } X if (! writeok) X print2("Save aborted."); X else { X X print1("Saving Game...."); X X /* write the version number */ X i = VERSION; X fwrite((char *)&i,sizeof(int),1,fd); X /* write game id to save file */ X X save_player(fd); X save_country(fd); X#ifdef MSDOS X tmpdepth = Level->depth; X City = msdos_changelevel(Level,E_CITY,0); X#endif X save_level(fd,City); X X if ((Current_Environment != E_CITY) && X (Current_Environment != E_COUNTRYSIDE)) { X i = TRUE; X fwrite((char *)&i,sizeof(int),1,fd); X#ifdef MSDOS X Level = msdos_changelevel(NULL,Current_Environment,tmpdepth); X#endif X save_level(fd,Level); X } X else { X i = FALSE; X fwrite((char *)&i,sizeof(int),1,fd); X } X fclose(fd); X print1("Game Saved."); X X#ifdef COMPRESS_SAVE_FILES X if (compress) { X print2("Compressing Save File...."); X strcpy(cmd,"compress "); X strcat(cmd,savestr); X system(cmd); X if (strlen(savestr) < 13) { X strcpy(cmd,"mv "); X strcat(cmd,savestr); X strcat(cmd,".Z "); X strcat(cmd,savestr); X system(cmd); X } X } X#endif X X morewait(); X clearmsg(); X } X return(writeok); X} X X X X X/* saves game on SIGHUP */ X/* no longer tries to compress, which hangs */ Xint signalsave() X{ X int i; X#ifndef MSDOS X FILE *fd=fopen("Omega.Sav","w"); X#else X FILE *fd=fopen("Omega.Sav","wb"); X#endif X if (fd != NULL) { X /* write the version number */ X i = VERSION; X fwrite((char *)&i,sizeof(int),1,fd); X /* write game id to save file */ X X save_player(fd); X save_country(fd); X save_level(fd,City); X X if ((Current_Environment != E_CITY) && X (Current_Environment != E_COUNTRYSIDE)) { X i = TRUE; X fwrite((char *)&i,sizeof(int),1,fd); X save_level(fd,Level); X } X else { X i = FALSE; X fwrite((char *)&i,sizeof(int),1,fd); X } X fclose(fd); X } X exit(0); X} X X X X X X X X X X X/* also saves some globals like Level->depth... */ X Xvoid save_player(fd) XFILE *fd; X{ X int i,twohand; X X twohand = X ((Player.possessions[O_READY_HAND] == Player.possessions[O_WEAPON_HAND]) X && (Player.possessions[O_READY_HAND] != NULL)); X X /* Save random global state information */ X X fwrite((char *)&Player,sizeof(Player),1,fd); X fprintf(fd,"%s\n",Password); X fprintf(fd,"%s\n",Player.name); X fwrite((char *)CitySiteList,sizeof(CitySiteList),1,fd); X fwrite((char *)&GameStatus,sizeof(long),1,fd); X fwrite((char *)&Current_Environment,sizeof(int),1,fd); X fwrite((char *)&Last_Environment,sizeof(int),1,fd); X fwrite((char *)&Current_Dungeon,sizeof(int),1,fd); X fwrite((char *)&Villagenum,sizeof(int),1,fd); X fwrite((char *)&Verbosity,sizeof(char),1,fd); X#ifndef MSDOS X fwrite((char *)&Time,sizeof(int),1,fd); X#else X fwrite((char *)&Time,sizeof(long),1,fd); X#endif X fwrite((char *)&Tick,sizeof(int),1,fd); X fwrite((char *)&Searchnum,sizeof(int),1,fd); X fwrite((char *)&Phase,sizeof(int),1,fd); X fwrite((char *)&Date,sizeof(int),1,fd); X fwrite((char *)&Spellsleft,sizeof(int),1,fd); X fwrite((char *)&SymbolUseHour,sizeof(int),1,fd); X fwrite((char *)&ViewHour,sizeof(int),1,fd); X fwrite((char *)&HelmHour,sizeof(int),1,fd); X fwrite((char *)&Constriction,sizeof(int),1,fd); X fwrite((char *)&Blessing,sizeof(int),1,fd); X fwrite((char *)&LastDay,sizeof(int),1,fd); X fwrite((char *)&RitualHour,sizeof(int),1,fd); X fwrite((char *)&Lawstone,sizeof(int),1,fd); X fwrite((char *)&Chaostone,sizeof(int),1,fd); X fwrite((char *)&Mindstone,sizeof(int),1,fd); X fwrite((char *)&Arena_Opponent,sizeof(int),1,fd); X fwrite((char *)&Imprisonment,sizeof(int),1,fd); X#ifndef MSDOS X fwrite((char *)&Gymcredit,sizeof(int),1,fd); X#else X fwrite((char *)&Gymcredit,sizeof(long),1,fd); X#endif X#ifndef MSDOS X fwrite((char *)&Balance,sizeof(int),1,fd); X#else X fwrite((char *)&Balance,sizeof(long),1,fd); X#endif X fwrite((char *)&StarGemUse,sizeof(int),1,fd); X fwrite((char *)&HiMagicUse,sizeof(int),1,fd); X fwrite((char *)&HiMagic,sizeof(int),1,fd); X#ifndef MSDOS X fwrite((char *)&FixedPoints,sizeof(int),1,fd); X#else X fwrite((char *)&FixedPoints,sizeof(long),1,fd); X#endif X fwrite((char *)&LastCountryLocX,sizeof(int),1,fd); X fwrite((char *)&LastCountryLocY,sizeof(int),1,fd); X fwrite((char *)&LastTownLocX,sizeof(int),1,fd); X fwrite((char *)&LastTownLocY,sizeof(int),1,fd); X fwrite((char *)&Pawndate,sizeof(int),1,fd); X X fwrite((char *)&twohand,sizeof(int),1,fd); X X fwrite((char *)Spells,sizeof(Spells),1,fd); X X fwrite((char *)&Command_Duration,sizeof(Command_Duration),1,fd); X fwrite((char *)&Precipitation,sizeof(Precipitation),1,fd); X fwrite((char *)&Lunarity,sizeof(Lunarity),1,fd); X fwrite((char *)&ZapHour,sizeof(ZapHour),1,fd); X fwrite((char *)&RitualRoom,sizeof(RitualRoom),1,fd); X X /* High score stuff */ X fwrite((char *)&Shadowlordbehavior,sizeof(Shadowlordbehavior),1,fd); X fwrite((char *)&Archmagebehavior,sizeof(Archmagebehavior),1,fd); X fwrite((char *)&Primebehavior,sizeof(Primebehavior),1,fd); X fwrite((char *)&Justiciarbehavior,sizeof(Justiciarbehavior),1,fd); X fwrite((char *)&Commandantbehavior,sizeof(Commandantbehavior),1,fd); X fwrite((char *)&Chaoslordbehavior,sizeof(Chaoslordbehavior),1,fd); X fwrite((char *)&Lawlordbehavior,sizeof(Lawlordbehavior),1,fd); X fwrite((char *)&Championbehavior,sizeof(Championbehavior),1,fd); X fwrite((char *)Priestbehavior,sizeof(Priestbehavior),1,fd); X fwrite((char *)&Hibehavior,sizeof(Hibehavior),1,fd); X fwrite((char *)&Dukebehavior,sizeof(Dukebehavior),1,fd); X fwrite((char *)Shadowlord,sizeof(Shadowlord),1,fd); X fwrite((char *)Archmage,sizeof(Archmage),1,fd); X fwrite((char *)Prime,sizeof(Prime),1,fd); X fwrite((char *)Commandant,sizeof(Commandant),1,fd); X fwrite((char *)Duke,sizeof(Duke),1,fd); X fwrite((char *)Champion,sizeof(Champion),1,fd); X fwrite((char *)Priest,sizeof(Priest),1,fd); X fwrite((char *)Hiscorer,sizeof(Hiscorer),1,fd); X fwrite((char *)Hidescrip,sizeof(Hidescrip),1,fd); X fwrite((char *)Chaoslord,sizeof(Chaoslord),1,fd); X fwrite((char *)Lawlord,sizeof(Lawlord),1,fd); X fwrite((char *)Justiciar,sizeof(Justiciar),1,fd); X fwrite((char *)&Shadowlordlevel,sizeof(Shadowlordlevel),1,fd); X fwrite((char *)&Archmagelevel,sizeof(Archmagelevel),1,fd); X fwrite((char *)&Primelevel,sizeof(Primelevel),1,fd); X fwrite((char *)&Commandantlevel,sizeof(Commandantlevel),1,fd); X fwrite((char *)&Dukelevel,sizeof(Dukelevel),1,fd); X fwrite((char *)&Championlevel,sizeof(Championlevel),1,fd); X fwrite((char *)Priestlevel,sizeof(Priestlevel),1,fd); X fwrite((char *)&Hiscore,sizeof(Hiscore),1,fd); X fwrite((char *)&Hilevel,sizeof(Hilevel),1,fd); X fwrite((char *)&Justiciarlevel,sizeof(Justiciarlevel),1,fd); X fwrite((char *)&Chaoslordlevel,sizeof(Chaoslordlevel),1,fd); X fwrite((char *)&Lawlordlevel,sizeof(Lawlordlevel),1,fd); X fwrite((char *)&Chaos,sizeof(Chaos),1,fd); X fwrite((char *)&Law,sizeof(Law),1,fd); X X /* stuff which used to be statics */ X fwrite((char *)&twiddle,sizeof(twiddle),1,fd); X fwrite((char *)&saved,sizeof(saved),1,fd); X fwrite((char *)&onewithchaos,sizeof(onewithchaos),1,fd); X fwrite((char *)&club_hinthour,sizeof(club_hinthour),1,fd); X fwrite((char *)&winnings,sizeof(winnings),1,fd); X fwrite((char *)&tavern_hinthour,sizeof(tavern_hinthour),1,fd); X fwrite((char *)scroll_ids,sizeof(scroll_ids),1,fd); X fwrite((char *)potion_ids,sizeof(potion_ids),1,fd); X fwrite((char *)stick_ids,sizeof(stick_ids),1,fd); X fwrite((char *)ring_ids,sizeof(ring_ids),1,fd); X fwrite((char *)cloak_ids,sizeof(cloak_ids),1,fd); X fwrite((char *)boot_ids,sizeof(boot_ids),1,fd); X fwrite((char *)deepest,sizeof(deepest),1,fd); X X /* Save player possessions */ X X for(i=0;i<MAXITEMS;i++) save_item(fd,Player.possessions[i]); X for(i=0;i<MAXPACK;i++) save_item(fd,Player.pack[i]); X for(i=0;i<PAWNITEMS;i++) save_item(fd,Pawnitems[i]); X X /* Save items in condo vault */ X save_itemlist(fd,Condoitems); X X /* Save player item knowledge */ X for (i=0;i<TOTALITEMS;i++) X fwrite((char *)&(Objects[i].known),sizeof(Objects[i].known),1,fd); X} X X X/* Save whatever is pointed to by level */ Xvoid save_level(fd,level) XFILE *fd; Xplv level; X{ X int i,j; X X fwrite((char *)level,sizeof(levtype),1,fd); X#ifdef MSDOS X for (i = 0; i < MAXWIDTH; i++) X fwrite((char *)level->site[i],MAXLENGTH * sizeof(loctype),1,fd); X#endif X save_monsters(fd,level->mlist); X for(i=0;i<MAXWIDTH;i++) X for(j=0;j<MAXLENGTH;j++) X save_itemlist(fd,level->site[i][j].things); X} X X Xvoid save_monsters(fd,ml) XFILE *fd; Xpml ml; X{ X pml tml; X int nummonsters=0; X X /* First count monsters */ X for(tml=ml;tml!=NULL;tml=tml->next) X if (tml->m->hp > 0) nummonsters++; X X fwrite((char *)&nummonsters,sizeof(int),1,fd); X X /* Now save monsters */ X for(tml=ml;tml!=NULL;tml=tml->next) { X if (tml->m->hp > 0) { X fwrite((char *)tml->m,sizeof(montype),1,fd); X fprintf(fd,"%s\n",tml->m->monstring); X save_itemlist(fd,tml->m->possessions); X } X } X} X X X/* Save o unless it's null, then save a null item instead */ Xvoid save_item(fd,o) XFILE *fd; Xpob o; X{ X objtype nullobject; X nullobject.id = -1; X if (o == NULL) { X fwrite((char *)&nullobject,sizeof(objtype),1,fd); X fprintf(fd,"Null Object. Report if you see this!\n"); X } X else { X fwrite((char *)o,sizeof(objtype),1,fd); X fprintf(fd,"%s\n",o->truename); X } X} X Xvoid save_itemlist(fd,ol) XFILE *fd; Xpol ol; X{ X int numitems = 0; X pol tol; X for(tol=ol;tol!=NULL;tol=tol->next) numitems++; X fwrite((char *)&numitems,sizeof(int),1,fd); X for(tol=ol;tol!=NULL;tol=tol->next) X save_item(fd,tol->thing); X} X X Xvoid save_country(fd) XFILE *fd; X{ X fwrite((char *)Country,sizeof(Country),1,fd); X} X X X X X/* read player data, city level, dungeon level, X check on validity of save file, etc. X return TRUE if game restored, FALSE otherwise */ X Xint restore_game(savestr) Xchar *savestr; X{ X int i,version; X char cmd[80]; X FILE *fd; X X X#ifdef COMPRESS_SAVE_FILES X print1("Uncompressing Save File...."); X if (strlen(savestr) < 13) { X strcpy(cmd,"mv "); X strcat(cmd,savestr); X strcat(cmd," "); X strcat(savestr,".Z"); X strcat(cmd,savestr); X system(cmd); X } X strcpy(cmd,"uncompress "); X strcat(cmd,savestr); X system(cmd); X print2("Save file uncompressed."); X morewait(); X if ((savestr[strlen(savestr)-1] == 'Z') && X (savestr[strlen(savestr)-2] == '.')) X savestr[strlen(savestr)-2] = 0; X#endif X X#ifndef MSDOS X fd = fopen(savestr,"r"); X#else X fd = fopen(savestr,"rb"); X#endif X X if (fd == NULL) { X print1("Error restoring game -- aborted."); X print2("File name was: "); X nprint2(savestr); X morewait(); X return(FALSE); X } X else { X print1("Restoring..."); X X fread((char *)&version,sizeof(int),1,fd); X X if (VERSION != version) { X print2(" Sorry, I can't restore an outdated save file!"); X morewait(); X return(FALSE); X } X restore_player(fd); X restore_country(fd); X restore_level(fd); /* the city level */ X fread((char *)&i,sizeof(int),1,fd); X if (i == TRUE) X#ifndef MSDOS X restore_level(fd); X#else X { X msdos_changelevel(Level,0,-1); X restore_level(fd); X } X#endif X print3("Restoration complete."); X ScreenOffset = -1000; X screencheck(Player.y); X drawvision(Player.x,Player.y); X setgamestatus(SKIP_MONSTERS); X dataprint(); X showflags(); X fclose(fd); X return(TRUE); X } X} X X X Xvoid restore_player(fd) XFILE *fd; X{ X int i,twohand; X fread((char *)&Player,sizeof(Player),1,fd); X filescanstring(fd,Password); X filescanstring(fd,Player.name); X fread((char *)CitySiteList,sizeof(CitySiteList),1,fd); X fread((char *)&GameStatus,sizeof(long),1,fd); X fread((char *)&Current_Environment,sizeof(int),1,fd); X fread((char *)&Last_Environment,sizeof(int),1,fd); X fread((char *)&Current_Dungeon,sizeof(int),1,fd); X fread((char *)&Villagenum,sizeof(int),1,fd); X switch(Current_Dungeon) { X case E_ASTRAL: MaxDungeonLevels = ASTRALLEVELS; break; X case E_SEWERS: MaxDungeonLevels = SEWERLEVELS; break; X case E_CASTLE: MaxDungeonLevels = CASTLELEVELS; break; X case E_CAVES: MaxDungeonLevels = CAVELEVELS; break; X case E_VOLCANO: MaxDungeonLevels = VOLCANOLEVELS; break; X } X fread((char *)&Verbosity,sizeof(char),1,fd); X#ifndef MSDOS X fread((char *)&Time,sizeof(int),1,fd); X#else X fread((char *)&Time,sizeof(long),1,fd); X#endif X fread((char *)&Tick,sizeof(int),1,fd); X fread((char *)&Searchnum,sizeof(int),1,fd); X fread((char *)&Phase,sizeof(int),1,fd); X fread((char *)&Date,sizeof(int),1,fd); X fread((char *)&Spellsleft,sizeof(int),1,fd); X fread((char *)&SymbolUseHour,sizeof(int),1,fd); X fread((char *)&ViewHour,sizeof(int),1,fd); X fread((char *)&HelmHour,sizeof(int),1,fd); X fread((char *)&Constriction,sizeof(int),1,fd); X fread((char *)&Blessing,sizeof(int),1,fd); X fread((char *)&LastDay,sizeof(int),1,fd); X fread((char *)&RitualHour,sizeof(int),1,fd); X fread((char *)&Lawstone,sizeof(int),1,fd); X fread((char *)&Chaostone,sizeof(int),1,fd); X fread((char *)&Mindstone,sizeof(int),1,fd); X fread((char *)&Arena_Opponent,sizeof(int),1,fd); X fread((char *)&Imprisonment,sizeof(int),1,fd); X#ifndef MSDOS X fread((char *)&Gymcredit,sizeof(int),1,fd); X#else X fread((char *)&Gymcredit,sizeof(long),1,fd); X#endif X#ifndef MSDOS X fread((char *)&Balance,sizeof(int),1,fd); X#else X fread((char *)&Balance,sizeof(long),1,fd); X#endif X fread((char *)&StarGemUse,sizeof(int),1,fd); X fread((char *)&HiMagicUse,sizeof(int),1,fd); X fread((char *)&HiMagic,sizeof(int),1,fd); X#ifndef MSDOS X fread((char *)&FixedPoints,sizeof(int),1,fd); X#else X fread((char *)&FixedPoints,sizeof(long),1,fd); X#endif X fread((char *)&LastCountryLocX,sizeof(int),1,fd); X fread((char *)&LastCountryLocY,sizeof(int),1,fd); X fread((char *)&LastTownLocX,sizeof(int),1,fd); X fread((char *)&LastTownLocY,sizeof(int),1,fd); X fread((char *)&Pawndate,sizeof(int),1,fd); X X fread((char *)&twohand,sizeof(int),1,fd); X X fread((char *)Spells,sizeof(Spells),1,fd); X X fread((char *)&Command_Duration,sizeof(Command_Duration),1,fd); X fread((char *)&Precipitation,sizeof(Precipitation),1,fd); X fread((char *)&Lunarity,sizeof(Lunarity),1,fd); X fread((char *)&ZapHour,sizeof(ZapHour),1,fd); X fread((char *)&RitualRoom,sizeof(RitualRoom),1,fd); X X /* High score stuff */ X fread((char *)&Shadowlordbehavior,sizeof(Shadowlordbehavior),1,fd); X fread((char *)&Archmagebehavior,sizeof(Archmagebehavior),1,fd); X fread((char *)&Primebehavior,sizeof(Primebehavior),1,fd); X fread((char *)&Justiciarbehavior,sizeof(Justiciarbehavior),1,fd); X fread((char *)&Commandantbehavior,sizeof(Commandantbehavior),1,fd); X fread((char *)&Chaoslordbehavior,sizeof(Chaoslordbehavior),1,fd); X fread((char *)&Lawlordbehavior,sizeof(Lawlordbehavior),1,fd); X fread((char *)&Championbehavior,sizeof(Championbehavior),1,fd); X fread((char *)Priestbehavior,sizeof(Priestbehavior),1,fd); X fread((char *)&Hibehavior,sizeof(Hibehavior),1,fd); X fread((char *)&Dukebehavior,sizeof(Dukebehavior),1,fd); X fread((char *)Shadowlord,sizeof(Shadowlord),1,fd); X fread((char *)Archmage,sizeof(Archmage),1,fd); X fread((char *)Prime,sizeof(Prime),1,fd); X fread((char *)Commandant,sizeof(Commandant),1,fd); X fread((char *)Duke,sizeof(Duke),1,fd); X fread((char *)Champion,sizeof(Champion),1,fd); X fread((char *)Priest,sizeof(Priest),1,fd); X fread((char *)Hiscorer,sizeof(Hiscorer),1,fd); X fread((char *)Hidescrip,sizeof(Hidescrip),1,fd); X fread((char *)Chaoslord,sizeof(Chaoslord),1,fd); X fread((char *)Lawlord,sizeof(Lawlord),1,fd); X fread((char *)Justiciar,sizeof(Justiciar),1,fd); X fread((char *)&Shadowlordlevel,sizeof(Shadowlordlevel),1,fd); X fread((char *)&Archmagelevel,sizeof(Archmagelevel),1,fd); X fread((char *)&Primelevel,sizeof(Primelevel),1,fd); X fread((char *)&Commandantlevel,sizeof(Commandantlevel),1,fd); X fread((char *)&Dukelevel,sizeof(Dukelevel),1,fd); X fread((char *)&Championlevel,sizeof(Championlevel),1,fd); X fread((char *)Priestlevel,sizeof(Priestlevel),1,fd); X fread((char *)&Hiscore,sizeof(Hiscore),1,fd); X fread((char *)&Hilevel,sizeof(Hilevel),1,fd); X fread((char *)&Justiciarlevel,sizeof(Justiciarlevel),1,fd); X fread((char *)&Chaoslordlevel,sizeof(Chaoslordlevel),1,fd); X fread((char *)&Lawlordlevel,sizeof(Lawlordlevel),1,fd); X fread((char *)&Chaos,sizeof(Chaos),1,fd); X fread((char *)&Law,sizeof(Law),1,fd); X X /* stuff which used to be statics */ X fread((char *)&twiddle,sizeof(twiddle),1,fd); X fread((char *)&saved,sizeof(saved),1,fd); X fread((char *)&onewithchaos,sizeof(onewithchaos),1,fd); X fread((char *)&club_hinthour,sizeof(club_hinthour),1,fd); X fread((char *)&winnings,sizeof(winnings),1,fd); X fread((char *)&tavern_hinthour,sizeof(tavern_hinthour),1,fd); X fread((char *)scroll_ids,sizeof(scroll_ids),1,fd); X fread((char *)potion_ids,sizeof(potion_ids),1,fd); X fread((char *)stick_ids,sizeof(stick_ids),1,fd); X fread((char *)ring_ids,sizeof(ring_ids),1,fd); X fread((char *)cloak_ids,sizeof(cloak_ids),1,fd); X fread((char *)boot_ids,sizeof(boot_ids),1,fd); X fread((char *)deepest,sizeof(deepest),1,fd); X X /* Set up the strings for the id's */ X inititem(0); X X for(i=0;i<MAXITEMS;i++) X Player.possessions[i] = restore_item(fd); X if (twohand) { X free((char *)Player.possessions[O_READY_HAND]); X Player.possessions[O_READY_HAND] = X Player.possessions[O_WEAPON_HAND]; X } X for(i=0;i<MAXPACK;i++) X Player.pack[i] = restore_item(fd); X for(i=0;i<PAWNITEMS;i++) X Pawnitems[i] = restore_item(fd); X Condoitems = restore_itemlist(fd); X for (i=0;i<TOTALITEMS;i++) X fread((char *)&(Objects[i].known),sizeof(Objects[i].known),1,fd); X calc_melee(); X} X X X Xpob restore_item(fd) XFILE *fd; X{ X char tempstr[80]; X pob obj = ((pob) malloc(sizeof(objtype))); X fread((char *)obj,sizeof(objtype),1,fd); X filescanstring(fd,tempstr); X obj->truename = salloc(tempstr); X if (obj->id < 0) { X free((char *) obj); X return(NULL); X } X else { X obj->objstr = Objects[obj->id].objstr; X obj->cursestr = Objects[obj->id].cursestr; X return(obj); X } X} X Xpol restore_itemlist(fd) XFILE *fd; X{ X pol ol=NULL,cur=NULL,new=NULL; X int i,numitems,firsttime=TRUE; X fread((char *)&numitems,sizeof(int),1,fd); X for(i=0;i<numitems;i++) { X new = ((pol) malloc(sizeof(oltype))); X new->thing = restore_item(fd); X new->next = NULL; X if (firsttime==TRUE) { X ol = cur = new; X firsttime = FALSE; X } X else { X cur->next = new; X cur = new; X } X } X return(ol); X} X X X X X X X X Xvoid restore_level(fd) XFILE *fd; X{ X int i,j; X X#ifndef MSDOS X Level = ((plv) malloc(sizeof(levtype))); X X fread((char *)Level,sizeof(levtype),1,fd); X#else X plc *tmp = (plc *)malloc(MAXWIDTH * sizeof(plc)); X X Level = &TheLevel; X for (i = 0; i < MAXWIDTH; i++) X tmp[i] = Level->site[i]; X fread((char *)Level,sizeof(levtype),1,fd); X for (i = 0; i < MAXWIDTH; i++) X fread((char *)(Level->site[i] = tmp[i]),MAXLENGTH * sizeof(loctype),1,fd); X free(tmp); X#endif X X Level->next = NULL; X X restore_monsters(fd,Level); X for(i=0;i<MAXWIDTH;i++) X for(j=0;j<MAXLENGTH;j++) X Level->site[i][j].things = restore_itemlist(fd); X if (Level->environment == E_CITY) City = Level; X else if (Level->environment == Current_Dungeon) Dungeon = Level; X} X X X X Xvoid restore_monsters(fd,level) XFILE *fd; Xplv level; X{ X pml ml=NULL; X int i,nummonsters; X char tempstr[80]; X X level->mlist = NULL; X X fread((char *)&nummonsters,sizeof(int),1,fd); X X for(i=0;i<nummonsters;i++) { X ml = ((pml) malloc(sizeof(mltype))); X ml->m = ((pmt) malloc(sizeof(montype))); X ml->next = NULL; X fread((char *)ml->m,sizeof(montype),1,fd); X filescanstring(fd,tempstr); X ml->m->monstring = salloc(tempstr); X ml->m->corpsestr = salloc(Monsters[ml->m->id].corpsestr); X ml->m->meleestr = salloc(Monsters[ml->m->id].meleestr); X level->site[ml->m->x][ml->m->y].creature = ml->m; X ml->m->possessions = restore_itemlist(fd); X ml->next = level->mlist; X level->mlist = ml; X } X} X X X Xvoid restore_country(fd) XFILE *fd; X{ X fread((char *)Country,sizeof(Country),1,fd); X} END_OF_FILE if test 20936 -ne `wc -c <'osave.c'`; then echo shar: \"'osave.c'\" unpacked with wrong size! fi # end of 'osave.c' fi echo shar: End of archive 6 \(of 20\). cp /dev/null ark6isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 20 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