From mipos3!omepd!littlei!reed!tektronix!tekgen!tekred!games-request Fri Jan 22 20:30:06 PST 1988 Article 164 of comp.sources.games: Path: td2cad!mipos3!omepd!littlei!reed!tektronix!tekgen!tekred!games-request From: games-request@tekred.TEK.COM Newsgroups: comp.sources.games Subject: v03i061: omega - rogue like dungeon exploration, Part14/15 Message-ID: <2085@tekred.TEK.COM> Date: 20 Jan 88 16:06:55 GMT Sender: billr@tekred.TEK.COM Lines: 1980 Approved: billr@tekred.TEK.COM Submitted by: "Laurence R. Brothers" Comp.sources.games: Volume 3, Issue 61 Archive-name: omega/Part14 #! /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 oeffect2.c <<'END_OF_oeffect2.c' X/* omega copyright (C) by Laurence Raphael Brothers, 1987 */ X/* oeffect2.c */ X X#include X#include "oglob.h" X X X/* from oaux */ Xextern void setspot(),levelchange(),gain_experience(); Xextern void calc_melee(),p_death(),darkenroom(),lightroom(); Xextern void p_damage(),hour_status_check(); Xextern int p_immune(); Xextern char *spellid(); X X/* from oinv */ Xextern void drop_at(),pickup_at(),add_item_to_pack(); Xextern int getitem(); Xextern char *itemid(); X X/* from oitem */ Xextern int i_nothing(); Xextern void make_potion(), make_scroll(), make_ring(), make_stick(); Xextern void make_armor(), make_shield(), make_weapon(), make_boots(); Xextern void make_cloak(),make_food(),make_artifact(),make_thing(); Xextern void item_use(); X X/* from omovef */ Xextern void p_movefunction(); X X X/* from omon */ Xextern void m_damage(),m_status_set(),m_status_reset(),m_death(); Xextern struct monster *make_creature(),*m_create(); Xextern int m_immunityp(); X X/* from outil */ Xextern int random_range(),inbounds(),hitp(),cursed(); Xextern void do_los(),findspace(); X X X/* from ogen */ Xextern void clear_level(),create_level(); X X/* from oscr */ Xextern void mprint(),printm(),morewait(),drawvision(); Xextern void draw_explosion(),erase_level(),plotmon(),menuprintitem(); Xextern void levelrefresh(),menuclear(),menumorewait(),showflags(); Xextern void show_screen(),putspot(),menuprint(); Xextern void clearmsg(),xredraw(); Xextern char mgetc(); X X/* from oeffect1 */ Xextern void heal(),level_drain(),sleep_player(); X X/* oeffect2 functions */ Xvoid knowledge(),flux(),displace(),breathe(),invisible(),warp(),alert(); Xvoid haste(),regenerate(),recover_stat(),augment(),truesight(); Xvoid i_chaos(),i_law(),sanctify(),hero(),level_return(),cure(),dispel(); Xvoid polymorph(),hellfire(),illuminate(); X X X Xvoid knowledge(blessing) Xint blessing; X{ X if (blessing < 0) X mprint("You feel ignorant."); X else { X mprint("You feel knowledgeable!"); X menuclear(); X menuprint("Alignment:\n"); X if (Player.alignment == 0) X menuprint("Neutral: embodying the Cosmic Balance"); X else if (abs(Player.alignment) < 5) X menuprint("Neutral, tending toward "); X else if (abs(Player.alignment) < 20) X menuprint("Neutral-"); X else if (abs(Player.alignment) > 100) X menuprint("The essence of "); X else if (abs(Player.alignment) > 200) X menuprint("The Ultimate Avatar of "); X if (Player.alignment < 0) menuprint("Chaos\n"); X else if (Player.alignment > 0) menuprint("Law\n"); X menumorewait(); X menuclear(); X menuprint("Current stati:\n"); X if (Player.status[BLINDED]) X menuprint("Blinded\n"); X if (Player.status[SLOWED]) X menuprint("Slowed\n"); X if (Player.status[HASTED]) X menuprint("Hasted\n"); X if (Player.status[DISPLACED]) X menuprint("Displaced\n"); X if (Player.status[SLEPT]) X menuprint("Slept\n"); X if (Player.status[DISEASED]) X menuprint("Diseased\n"); X if (Player.status[POISONED]) X menuprint("Poisoned\n"); X if (Player.status[BREATHING]) X menuprint("Breathing\n"); X if (Player.status[INVISIBLE]) X menuprint("Invisible\n"); X if (Player.status[REGENERATING]) X menuprint("Regenerating\n"); X if (Player.status[VULNERABLE]) X menuprint("Vulnerable\n"); X if (Player.status[BERSERK]) X menuprint("Berserk\n"); X if (Player.status[IMMOBILE]) X menuprint("Immobile\n"); X if (Player.status[ALERT]) X menuprint("Alert\n"); X if (Player.status[AFRAID]) X menuprint("Afraid\n"); X if (Player.status[ACCURATE]) X menuprint("Accurate\n"); X if (Player.status[HERO]) X menuprint("Heroic\n"); X if (Player.status[LEVITATING]) X menuprint("Levitating\n"); X menumorewait(); X menuclear(); X menuprint("Immunities:\n"); X if (p_immune(NORMAL_DAMAGE)) X menuprint("Normal Damage\n"); X if (p_immune(FLAME)) X menuprint("Flame\n"); X if (p_immune(ELECTRICITY)) X menuprint("Electricity\n"); X if (p_immune(COLD)) X menuprint("Cold\n"); X if (p_immune(POISON)) X menuprint("Poison\n"); X if (p_immune(ACID)) X menuprint("Acid\n"); X if (p_immune(FEAR)) X menuprint("Fear\n"); X if (p_immune(SLEEP)) X menuprint("Sleep\n"); X if (p_immune(NEGENERGY)) X menuprint("Negative Energies\n"); X if (p_immune(THEFT)) X menuprint("Theft\n"); X if (p_immune(GAZE)) X menuprint("Gaze\n"); X if (p_immune(INFECTION)) X menuprint("Infection\n"); X menumorewait(); X menuclear(); X menuprint("Ranks:\n"); X switch(Player.rank[LEGION]) { X case COMMANDANT: X menuprint("Commandant of the Legion.\n"); X break; X case COLONEL: X menuprint("Colonel of the Legion.\n"); X break; X case FORCE_LEADER: X menuprint("Force Leader of the Legion.\n"); X break; X case CENTURION: X menuprint("Centurion of the Legion.\n"); X break; X case LEGIONAIRE: X menuprint("Legionaire.\n"); X break; X } X switch(Player.rank[ARENA]) { X case -1: X menuprint("Ex-gladiator\n"); X case CHAMPION: X menuprint("Gladiator Champion.\n"); X break; X case GLADIATOR: X menuprint("Gladiator of the Arena.\n"); X break; X case RETIARIUS: X menuprint("Retiarius of the Arena.\n"); X break; X case BESTIARIUS: X menuprint("Bestiarius of the Arena.\n"); X break; X case TRAINEE: X menuprint("Gladiator Trainee of the Arena.\n"); X break; X } X switch(Player.rank[COLLEGE]) { X case ARCHMAGE: X menuprint("Archmage of the Collegium Magii\n"); X break; X case MAGE: X menuprint("Collegium Magii: Mage\n"); X break; X case PRECEPTOR: X menuprint("Collegium Magii: Preceptor\n"); X break; X case STUDENT: X menuprint("Collegium Magii: Student\n"); X break; X case NOVICE: X menuprint("Collegium Magii: Novice\n"); X break; X } X switch(Player.rank[NOBILITY]) { X case DUKE: X menuprint("Duke of Rampart\n"); X break; X case LORD: X menuprint("Peer of the Realm\n"); X break; X case KNIGHT: X menuprint("Order of the Knights of Rampart\n"); X break; X case ESQUIRE: X menuprint("Squire of Rampart\n"); X break; X case COMMONER: X menuprint("Commoner\n"); X break; X default: X menuprint("Lowly Commoner\n"); X break; X } X switch(Player.rank[CIRCLE]) { X case PRIME: X menuprint("Prime Sorceror of the Inner Circle\n"); X break; X case HIGHSORCEROR: X menuprint("High Sorceror of the Inner Circle\n"); X break; X case SORCEROR: X menuprint("Member of the Circle of Sorcerors\n"); X break; X case ENCHANTER: X menuprint("Member of the Circle of Enchanters\n"); X break; X case INITIATE: X menuprint("Member of the Circle of Initiates\n"); X break; X } X switch(Player.rank[THIEVES]) { X case SHADOWLORD: X menuprint("Guild of Thieves: Shadowlord\n"); X break; X case TMASTER: X menuprint("Guild of Thieves: Master Thief\n"); X break; X case THIEF: X menuprint("Guild of Thieves: Thief\n"); X break; X case ATHIEF: X menuprint("Guild of Thieves: Apprentice Thief\n"); X break; X case TMEMBER: X menuprint("Guild of Thieves: Candidate Member\n"); X break; X } X switch(Player.rank[PRIESTHOOD]) { X case LAY: X menuprint("A lay devotee of "); X break; X case ACOLYTE: X menuprint("An Acolyte of "); X break; X case PRIEST: X menuprint("A Priest of "); X break; X case SPRIEST: X menuprint("A Senior Priest of "); X break; X case HIGHPRIEST: X menuprint("The High Priest of "); X break; X } X switch(Player.patron) { X case ODIN: X menuprint("Odin.\n"); X break; X case SET: X menuprint("Set.\n"); X break; X case ATHENA: X menuprint("Athena.\n"); X break; X case HECATE: X menuprint("Hecate.\n"); X break; X case DRUID: X menuprint("Druidism.\n"); X break; X case DESTINY: X menuprint("the Lords of Destiny.\n"); X break; X } X if (Player.rank[ADEPT] > 0) X menuprint("**************\n*Omegan Adept*\n**************\n"); X menumorewait(); X xredraw(); X } X} X X X/* Recreates the current level */ Xvoid flux(blessing) Xint blessing; X{ X mprint("The universe warps around you!"); X if (Dlevel == 0) { X mprint("Sensing dangerous high order magic, the Collegium Magii"); X mprint("and the Circle of Sorcerors join forces to negate the spell."); X mprint("You are zapped by an antimagic ray!!!"); X dispel(-1); X mprint("The universe unwarps itself...."); X } X else { X mprint("You stagger as the very nature of reality warps!"); X erase_level(); X clear_level(Dlevel); X mprint("The fabric of spacetime reknits...."); X create_level(Dlevel-1,Dlevel,'<'); X } X} X X/*Turns on displacement status for the player */ Xvoid displace(blessing) Xint blessing; X{ X if (blessing > -1) { X mprint("You feel a sense of dislocation."); X Player.status[DISPLACED] = blessing + random_range(6); X } X else { X mprint("You feel vulnerable"); X Player.status[VULNERABLE] += random_range(6) - blessing; X } X} X X X Xvoid invisible(blessing) Xint blessing; X{ X if (blessing > -1) { X mprint("You feel transparent!"); X Player.status[INVISIBLE]+= 2+5*blessing; X } X else { X mprint("You feel dangerous!"); X Player.status[VULNERABLE] += X random_range(10)+1; X } X} X X Xvoid warp(blessing) Xint blessing; X{ X int newlevel,ok=FALSE; X if (blessing > -1) { X mprint("Warp to which level? "); X newlevel = parsenum(); X if ((newlevel > NUMLEVELS-10) && X (newlevel < NUMLEVELS) && X (Player.patron != DESTINY)) X mprint("Some mysterious force alters your destination."); X else ok = TRUE; X } X if (! ok) { X do newlevel=random_range(NUMLEVELS+20)-10; X while ((newlevel>NUMLEVELS-10) && (newlevel < NUMLEVELS)); X } X mprint("You dematerialize..."); X levelchange(newlevel,Dungeon[Dlevel][Player.x][Player.y].locchar); X if (newlevel > 0) X mprint("You feel homesick."); X} X Xvoid alert(blessing) X int blessing; X{ X if (blessing > -1) { X mprint("You feel a sense of insomnia."); X Player.status[ALERT]+= 4+(5*blessing); X } X else sleep_player(abs(blessing)+3); X} X Xvoid regenerate(blessing) Xint blessing; X{ X if (blessing < 0) X heal(blessing * 10); X else { X mprint("You feel abnormally healthy."); X Player.status[REGENERATING] += (blessing+1)*50; X } X} X Xvoid haste(blessing) Xint blessing; X{ X if (blessing > -1) { X if (! Player.status[HASTED]) X mprint("The world slows down!"); X else mprint("Nothing much happens."); X if (Player.status[SLOWED]) X Player.status[SLOWED] = 0; X Player.status[HASTED] += (blessing*100)+random_range(250); X } X else { X mprint("You feel slower."); X if (Player.status[HASTED] > 0) mprint("...but the feeling quickly fades."); X else X Player.status[SLOWED] += random_range(250)+250; X } X} X X Xvoid recover_stat(blessing) Xint blessing; X{ X if (blessing < 0) { X mprint("You feel a cold surge!"); X switch(random_range(6)) { X case 0: Player.str = min(Player.str-1,Player.maxstr-1); break; X case 1: Player.con = min(Player.con-1,Player.maxcon-1); break; X case 2: Player.dex = min(Player.dex-1,Player.maxdex-1); break; X case 3: Player.agi = min(Player.agi-1,Player.maxagi-1); break; X case 4: Player.iq = min(Player.iq-1,Player.maxiq-1); break; X case 5: Player.pow = min(Player.pow-1,Player.maxpow-1); break; X } X } X else { X mprint("You feel a warm tingle!"); X Player.str = max(Player.str,Player.maxstr); X Player.con = max(Player.con,Player.maxcon); X Player.dex = max(Player.dex,Player.maxdex); X Player.agi = max(Player.agi,Player.maxagi); X Player.iq = max(Player.iq,Player.maxiq); X Player.pow = max(Player.pow,Player.maxpow); X } X calc_melee(); X} X Xvoid augment(blessing) Xint blessing; X{ X if (blessing < 0) { X mprint("You feel a cold surge!"); X switch(random_range(6)) { X case 0: Player.str = min(Player.str-1,Player.maxstr-1); break; X case 1: Player.con = min(Player.con-1,Player.maxcon-1); break; X case 2: Player.dex = min(Player.dex-1,Player.maxdex-1); break; X case 3: Player.agi = min(Player.agi-1,Player.maxagi-1); break; X case 4: Player.iq = min(Player.iq-1,Player.maxiq-1); break; X case 5: Player.pow = min(Player.pow-1,Player.maxpow-1); break; X } X } X else if (blessing == 0) { X mprint("You feel a warm tingle!"); X switch(random_range(6)) { X case 0: Player.str = max(Player.str+1,Player.maxstr+1); break; X case 1: Player.con = max(Player.con+1,Player.maxcon+1); break; X case 2: Player.dex = max(Player.dex+1,Player.maxdex+1); break; X case 3: Player.agi = max(Player.agi+1,Player.maxagi+1); break; X case 4: Player.iq = max(Player.iq+1,Player.maxiq+1); break; X case 5: Player.pow = max(Player.pow+1,Player.maxpow+1); break; X } X } X else { X mprint("You feel a hot flash!"); X Player.str = max(Player.str+1,Player.maxstr+1); X Player.con = max(Player.con+1,Player.maxcon+1); X Player.dex = max(Player.dex+1,Player.maxdex+1); X Player.agi = max(Player.agi+1,Player.maxagi+1); X Player.iq = max(Player.iq+1,Player.maxiq+1); X Player.pow = max(Player.pow+1,Player.maxpow+1); X } X calc_melee(); X} X Xvoid breathe(blessing) Xint blessing; X{ X if (blessing > -1) { X mprint("Your breath is energized!"); X Player.status[BREATHING] += 6+blessing; X } X else { X mprint("You choke as your lungs fill with water!"); X p_damage(50,UNSTOPPABLE,"drowning"); X } X} X X Xvoid i_chaos(o) Xpob o; X{ X if (Player.alignment < 0) { X Player.alignment -= random_range(20); X mprint("You feel deliciously chaotic!"); X gain_experience(abs(Player.alignment)*10); X } X else { X mprint("You feel a sense of inner turmoil!"); X Player.alignment -= random_range(20); X } X} X Xvoid i_law(o) Xpob o; X{ X if (Player.alignment > 0) { X Player.alignment += random_range(20); X mprint("You feel wonderfully lawful!"); X gain_experience(Player.alignment*10); X } X else { X mprint("You feel a sense of inner constraint!"); X Player.alignment += random_range(20); X } X} X Xvoid sanctify(blessing) Xint blessing; X{ X if (blessing > -1) { X if (Dungeon[Dlevel][Player.x][Player.y].locchar == ALTAR) X mprint("This site can't get any holier!"); X else if (Player.patron == 0) { X mprint("The gods are angered!"); X Dungeon[Dlevel][Player.x][Player.y].locchar = LAVA; X Dungeon[Dlevel][Player.x][Player.y].p_locf = L_LAVA; X p_movefunction(L_LAVA); X } X else { X Dungeon[Dlevel][Player.x][Player.y].locchar = ALTAR; X Dungeon[Dlevel][Player.x][Player.y].aux = Player.patron; X Dungeon[Dlevel][Player.x][Player.y].p_locf = L_ALTAR; X mprint("You are standing on sacred ground!"); X } X } X else { X if (Dungeon[Dlevel][Player.x][Player.y].locchar == ALTAR) { X mprint("The altar crumbles before your unholy blast...."); X Dungeon[Dlevel][Player.x][Player.y].locchar = FLOOR; X Dungeon[Dlevel][Player.x][Player.y].p_locf = L_NO_OP; X if (Dungeon[Dlevel][Player.x][Player.y].aux == Player.patron) { X mprint("Your deity is not amused...."); X p_damage(Player.hp-1,UNSTOPPABLE,"Divine Wrath"); X } X else if ((Player.patron == ATHENA) || (Player.patron == ODIN)) { X if ((Dungeon[Dlevel][Player.x][Player.y].aux == SET) || X (Dungeon[Dlevel][Player.x][Player.y].aux == HECATE)) { X mprint("Your deity applauds the eradication of Chaos' taint"); X gain_experience(1000); X } X else { X mprint("Your deity approves of your action."); X gain_experience(100); X } X } X if ((Player.patron == SET) || (Player.patron == HECATE)) { X if ((Dungeon[Dlevel][Player.x][Player.y].aux == ODIN) || X (Dungeon[Dlevel][Player.x][Player.y].aux == ATHENA)) { X mprint("Your deity applauds the obliteration of Law"); X gain_experience(1000); X } X else { X mprint("Your deity approves of your action."); X gain_experience(100); X } X } X else if (Player.patron == DRUID) { X mprint("Your attempt to maintain the Balance is applauded...."); X gain_experience(250); X } X else mprint("Nothing much happens"); X } X else mprint("You feel an aura of unholiness arising from this spot...."); X } X} X Xvoid accuracy(blessing) Xint blessing; X{ X if (blessing > -1) { X mprint("Everything seems covered in bullseyes!"); X Player.status[ACCURACY] += random_range(5)+1+blessing*5; X calc_melee(); X } X else { X Player.status[ACCURACY]=0; X calc_melee(); X mprint("Your vision blurs..."); X } X} X Xvoid hero(blessing) Xint blessing; X{ X if (blessing > -1) { X mprint("You feel super!"); X Player.status[HERO] += random_range(5)+1+blessing; X calc_melee(); X } X else { X Player.status[HERO]=0; X calc_melee(); X mprint("You feel cowardly."); X level_drain(abs(blessing),"a potion of cowardice"); X } X} X X Xvoid levitate(blessing) Xint blessing; X{ X if (blessing > -1) { X mprint("You start to float a few inches above the floor."); X mprint("You discover you can easily control your altitude..."); X Player.status[LEVITATING] += random_range(5)+1+blessing; X } X else mprint("Nothing much happens."); X} X X X/* has effect of switching between city and lowest level attained */ Xvoid level_return() X{ X if (Dlevel > 0) X levelchange(0,Dungeon[Dlevel][Player.x][Player.y].locchar); X else levelchange(Deepest,Dungeon[Dlevel][Player.x][Player.y].locchar); X} X X Xvoid cure(blessing) Xint blessing; X{ X if (blessing > -1) { X if (Player.status[DISEASED]) { X Player.status[DISEASED]=0; X mprint("You feel hygienic!"); X } X else mprint("Nothing much happens."); X } X else if (! Player.immunity[INFECTION]) { X mprint("You feel tainted."); X Player.status[DISEASED]+=random_range(10)+1; X } X else mprint("Nothing much happens."); X showflags(); X} X X Xvoid truesight(blessing) Xint blessing; X{ X if (blessing > -1) { X Player.status[TRUESIGHT]+=random_range(10)+1; X mprint("You feel sharp."); X } X else { X Player.status[BLINDED]+=random_range(10)+1; X mprint("You've been blinded!"); X } X} X X X Xvoid dispel(blessing) Xint blessing; X{ X int i,x=Player.x,y=Player.y; X if (blessing > -1) { X setspot(&x,&y); X if ((x==Player.x)&&(y==Player.y)) { X for(i=0;iused) && X (Player.possessions[i]->blessing < 0)) { X if (blessing+1 + Player.possessions[i]->blessing >=0) { X mprint("You hear a sighing sound from"); X mprint(itemid(Player.possessions[i])); X Player.possessions[i]->blessing = 0; X } X else { X mprint("You hear dark laughter from"); X mprint(itemid(Player.possessions[i])); X } X } X } X } X else if (Dungeon[Dlevel][x][y].creature != NULL) { X if (Dungeon[Dlevel][x][y].creature->level < blessing * 3) { X Dungeon[Dlevel][x][y].creature->specialf = M_NO_OP; X if (Dungeon[Dlevel][x][y].creature->meleef != M_NO_OP) X Dungeon[Dlevel][x][y].creature->meleef = M_MELEE_NORMAL; X Dungeon[Dlevel][x][y].creature->strikef = M_NO_OP; X Dungeon[Dlevel][x][y].creature->immunity=0; X m_status_reset(Dungeon[Dlevel][x][y].creature,M_INVISIBLE); X m_status_reset(Dungeon[Dlevel][x][y].creature,INTANGIBLE); X } X else mprint("The monster ignores the effect!"); X } X else if ((Dungeon[Dlevel][x][y].p_locf == L_TRAP_FIRE) || X (Dungeon[Dlevel][x][y].p_locf == L_STATUE_WAKE) || X (Dungeon[Dlevel][x][y].p_locf == L_TRAP_TELEPORT) || X (Dungeon[Dlevel][x][y].p_locf == L_TRAP_DISINTEGRATE)) { X Dungeon[Dlevel][x][y].p_locf == L_NO_OP; X if (Dungeon[Dlevel][x][y].locchar == TRAP) X Dungeon[Dlevel][x][y].locchar = FLOOR; X } X else if (Dungeon[Dlevel][x][y].p_locf == L_MAGIC_POOL) X Dungeon[Dlevel][x][y].p_locf = L_WATER; X else mprint("Nothing much seems to happen."); X } X else { X mprint("A smell of ozone and positive ions fills the air.."); X if (Player.status[ACCURACY] && (Player.status[ACCURACY] < 1000)) X Player.status[ACCURACY]=1; X if (Player.status[DISPLACED]&&(Player.status[DISPLACED] < 1000)) X Player.status[DISPLACED]=1; X if (Player.status[HASTED]&&(Player.status[HASTED] < 1000)) X Player.status[HASTED]=1; X if (Player.status[BREATHING]&&(Player.status[BREATHING] < 1000)) X Player.status[BREATHING]=1; X if (Player.status[INVISIBLE]&&(Player.status[INVISIBLE] < 1000)) X Player.status[INVISIBLE]=1; X if (Player.status[REGENERATING]&&(Player.status[REGENERATING] < 1000)) X Player.status[REGENERATING]=1; X if (Player.status[ALERT]&&(Player.status[ALERT] < 1000)) X Player.status[ALERT]=1; X if (Player.status[HERO]&&(Player.status[HERO] < 1000)) X Player.status[HERO]=1; X if (Player.status[LEVITATING]&&(Player.status[LEVITATING] < 1000)) X Player.status[LEVITATING]=1; X if (Player.status[ACCURATE]&&(Player.status[ACCURATE] < 1000)) X Player.status[ACCURATE]=1; X if (Player.status[TRUESIGHT]&&(Player.status[TRUESIGHT] < 1000)) X Player.status[TRUESIGHT]=1; X hour_status_check(); X } X} X X Xvoid polymorph(blessing) Xint blessing; X{ X int i,x=Player.x,y=Player.y,newmonster; X struct monster *m; X setspot(&x,&y); X if ((x==Player.x)&&(y==Player.y)) { X mprint("You enjoy your new life as a"); X mprint(Monsters[random_range(NUMMONSTERS)].monstring); X mprint("But your game is over...."); X p_death("polymorphing oneself"); X } X else if ((m=Dungeon[Dlevel][x][y].creature) == NULL) X mprint("Nothing happens."); X else { X if (m_immunityp(m,OTHER_MAGIC) || (m->level > random_range(12))) { X strcpy(Str1,"The "); X strcat(Str1,m->monstring); X strcat(Str1," resists the change!"); X m_status_set(m,HOSTILE); X } X else { X if (blessing < 0) { X do newmonster = random_range(NUMMONSTERS); X while ((newmonster == ML0+4) || X (newmonster == ML7+3) || X (Monsters[newmonster].level < m->level) || X (Monsters[newmonster].uniqueness != COMMON)); X } X else { X do newmonster = random_range(NUMMONSTERS); X while ((newmonster == ML0+4) || X (newmonster == ML7+3) || X (Monsters[newmonster].uniqueness != COMMON)); X } X *m = Monsters[newmonster]; X m_status_set(m,HOSTILE); X } X } X} X X X X Xvoid hellfire(x,y,blessing) Xint x,y,blessing; X{ X int i; X struct monster *m; X if ((x==Player.x)&&(y==Player.y)) { X mprint("You have been completely annihilated. Congratulations."); X p_death("hellfire"); X } X else if ((m=Dungeon[Dlevel][x][y].creature) == NULL) { X mprint("The gods are angry over your waste of power..."); X level_drain(5,"indiscriminate use of hellfire"); X } X else { X mprint("The monster writhes in the flames..."); X if (blessing < 0) { X mprint("...and appears stronger."); X morewait(); X mprint("Much stronger."); X m->hp += 1000; X m->hit +=20; X m->dmg += 100; X m->actions += 4; X m_status_set(m,HOSTILE); X } X else { X mprint("and is utterly annihilated. Only a greasy spot remains..."); X strcpy(m->corpsestr,"a greasy spot"); X m->corpsevalue = 0; X m->possessions = NULL; /* it happens that that transformid is -1 */ X m_death(m); X } X } X} X X Xvoid drain(blessing) Xint blessing; X{ X int i,x=Player.x,y=Player.y; X struct monster *m; X setspot(&x,&y); X mprint("You begin to drain energy..."); X if ((x==Player.x)&&(y==Player.y)) { X mprint("You drain your own energy...."); X mprint("Uh, oh, positive feedback...."); X level_drain(Player.level,"self-vampirism"); X } X else if ((m=Dungeon[Dlevel][x][y].creature) != NULL) { X if ((blessing > -1) && (! m_immunityp(m,NEGENERGY))) { X mprint("The monster seems weaker..."); X m_damage(m,NEGENERGY,m->level*m->level); X m->hit -= m->level; X m->dmg -= m->level*m->level; X m->ac -= m->level; X m->level--; X mprint("You feel stronger..."); X gain_experience(m->level*5); X Player.hp+=(m->level*m->level / 2); X } X else { X mprint("The effect reverses itself!"); X mprint("The monster seems stronger..."); X m->hp+=Player.level*Player.level; X m->hit += Player.level; X m->dmg += Player.level*Player.level; X m->ac += Player.level; X m->level++; X mprint("You feel weaker..."); X Player.mana = min(0,Player.level*Player.level); X level_drain(m->level,"negative energy conflict."); X } X } X else if (blessing < 1) { X mprint("You seem to lose energy, instead of gaining it!"); X level_drain(3,"reversed energy drain"); X } X else if (Dungeon[Dlevel][x][y].locchar == WHIRLWIND) { X Dungeon[Dlevel][x][y].locchar = FLOOR; X Dungeon[Dlevel][x][y].p_locf = L_NO_OP; X if (p_immune(ELECTRICITY)) { X mprint("You transform some electrical energy."); X gain_experience(20); X Player.hp += 20; X Player.str++; X Player.con++; X } X else { X mprint("The storm's lightning zaps you as you try to drain it!"); X p_damage(40,UNSTOPPABLE,"an attempt to drain energy from a whirlwind"); X } X } X else if (Dungeon[Dlevel][x][y].locchar == ALTAR) { X mprint("The altar collapses in on itself...."); X Dungeon[Dlevel][x][y].locchar = ABYSS; X Dungeon[Dlevel][x][y].p_locf = L_ABYSS; X if (! Player.patron) { X mprint("You drain some theurgic energy from the altar...."); X gain_experience(40); X Player.hp += 20; X Player.pow+=2; X } X if (Dungeon[Dlevel][x][y].aux == Player.patron) { X mprint("Your deity is enraged."); X mprint("You are struck by godsfire."); X p_damage(Player.hp-1,UNSTOPPABLE,"godsfire"); X mprint("You feel atheistic."); X Player.patron = -1; X Player.rank[PRIESTHOOD] = 0; X } X else { X mprint("You feel the wrath of a god...."); X p_damage(random_range(Player.level*10),UNSTOPPABLE,"divine wrath"); X mprint("Your deity doesn't seem to mind your action, though."); X gain_experience(100); X } X } X else { X mprint("You drain some energy from the ambient megaflow."); X Player.hp++; X } X} X Xvoid sanctuary() X{ X mprint("You're standing on sacred ground!"); X Player.sx = Player.x; X Player.sy = Player.y; X Player.slevel = Dlevel; X} X Xvoid invulnerable() X{ X int i; X mprint("You feel invincible."); X for(i=0;i -1) { X if (r =Dungeon[Dlevel][Player.x][Player.y].roomnumber > 0) { X if (Leveldata[Dlevel].rooms[r].lighted) X mprint("Nothing much happens."); X else { X mprint("The room lights up!"); X Leveldata[Dlevel].rooms[r].lighted = TRUE; X lightroom(r); X } X } X else mprint("You see a faint glimmer of light which quickly fades."); X } X else { X if (r = Dungeon[Dlevel][Player.x][Player.y].roomnumber > 0) { X if (! Leveldata[Dlevel].rooms[r].lighted) X mprint("Nothing much happens."); X else { X mprint("The room darkens!"); X Leveldata[Dlevel].rooms[r].lighted = FALSE; X darkenroom(r); X } X } X else mprint("The gloom thickens for a moment."); X } X} END_OF_oeffect2.c if test 27353 -ne `wc -c ogen.c <<'END_OF_ogen.c' X/* omega copyright (c) 1987 by Laurence Raphael Brothers */ X/* ogen.c */ X/* level generator functions */ X X#include X#include "oglob.h" X X X/* from outil */ Xextern int random_range(),inbounds(),sign(); X X/* from olev */ Xextern void populate_level(),stock_level(),load_city(); Xextern pmt make_creature(),m_create(),make_hiscore_npc(); X X/* from odepths */ Xextern void load_depths(); X X/* from oitem */ Xextern pob make_weapon(),create_object(); X X/* from omon */ Xextern void m_pickup(); X X/* from oscr */ Xextern void erase_level(),locprint(),drawvision(); X Xvoid clear_level(),create_level(),graph_wheel(),build_wheel(),wheel_level(); Xvoid connect_room(),corridor_crawl(),build_room(),roomcenter(); Xvoid clear_dungeon(),init_dungeon(),install_traps(),straggle_corridor(); Xvoid room_connect_corridor(),make_central_room(),make_spoke_room(); Xvoid change_level(),cavern_level(),makedoor(),grid_level(); Xvoid install_specials(),make_stairs(),pond_level(),room_level(); X Xint connected(); Xchar *roomname(); X Xvoid init_dungeon() X{ X clear_level(0); X Dlevel = 0; X erase_level(); X load_city(); X locprint("The City of Rampart."); X} X Xvoid clear_dungeon() X{ X int i; X for(i=0;i level*2); X X for(i=Leveldata[level].rooms[room].left+1; X i<=Leveldata[level].rooms[room].right-1; X i++) X for (j=Leveldata[level].rooms[room].top+1; X j<=Leveldata[level].rooms[room].bottom-1; X j++) X Dungeon[level][i][j].locchar = FLOOR; X for(i=Leveldata[level].rooms[room].left; X i<=Leveldata[level].rooms[room].right; X i++) X for (j=Leveldata[level].rooms[room].top; X j<=Leveldata[level].rooms[room].bottom; X j++) X Dungeon[level][i][j].roomnumber = room+ROOMBASE; X X /* party room */ X if ((random_range(1000) < 2*level) && X ((Leveldata[level].rooms[room].right - X Leveldata[level].rooms[room].left) < 11) && X ((Leveldata[level].rooms[room].bottom - X Leveldata[level].rooms[room].top) < 11)) { X head = tml = ((pml) (malloc(sizeof(mltype)))); X for(i=Leveldata[level].rooms[room].left+1; X i<=Leveldata[level].rooms[room].right-1; X i++) X for (j=Leveldata[level].rooms[room].top+1; X j<=Leveldata[level].rooms[room].bottom-1; X j++) X if ((Dungeon[level][i][j].locchar == FLOOR) && X (Dungeon[level][i][j].creature == NULL)) { X Dungeon[level][i][j].things = ((pol) malloc(sizeof(oltype))); X Dungeon[level][i][j].things->thing = ((pob) create_object()); X Dungeon[level][i][j].things->next = NULL; X X Dungeon[level][i][j].creature = (pmt) m_create(i,j,WANDERING,Dlevel); X Dungeon[level][i][j].creature->x = i; X Dungeon[level][i][j].creature->y = j; X X tml->next = ((pml) malloc(sizeof(mltype))); X tml->next->m = Dungeon[level][i][j].creature; X tml=tml->next; X } X X if (Mlist[level] == NULL) { X Mlist[level] = head->next; X tml->next = NULL; X } X else { X tml->next = Mlist[level]; X Mlist[level] = head->next; X } X } X} X X X/* keep going in one orthogonal direction or another until we hit our */ X/* destination */ X Xvoid straggle_corridor(fx,fy,tx,ty,level,loc) Xint fx,fy,tx,ty,level; Xchar loc; X{ X int dx,dy; X while ((fx != tx) || (fy != ty)) { X dx = tx - fx; X dy = ty - fy; X if (random_range(abs(dx)+abs(dy)) < abs(dx)) X corridor_crawl(&fx,&fy,sign(dx),0,random_range(abs(dx))+1,level,loc); X else corridor_crawl(&fx,&fy,0,sign(dy),random_range(abs(dy))+1,level,loc); X } X} X X/* now assumes rectangular rooms */ Xvoid room_connect_corridor(fromroom,toroom,level) Xint fromroom,toroom,level; X{ X int fx,fy,tx,ty,sx,sy,fromdoor=FALSE,todoor=FALSE; X roomcenter(fromroom,&fx,&fy,level); X roomcenter(toroom,&tx,&ty,level); X while ((! todoor) && ((tx != fx) || (ty != fy))) { X sx = sign(tx - fx); X sy = sign(ty - fy); X fx += sx; X fy += sy; X if ((! fromdoor) && (Dungeon[level][fx][fy].locchar == WALL)) { X makedoor(fx,fy,level); X fromdoor = TRUE; X } X else if ((! todoor) && X (Dungeon[level][fx][fy].roomnumber-ROOMBASE == toroom)) { X makedoor(fx,fy,level); X todoor = TRUE; X } X else { X Dungeon[level][fx][fy].locchar = FLOOR; X if(Dungeon[level][fx][fy].roomnumber < ROOMBASE) X Dungeon[level][fx][fy].roomnumber = RS_CORRIDOR; X } X } X} X X Xvoid makedoor(x,y,level) Xint x,y,level; X{ X if (random_range(20) <= level/10) { X Dungeon[level][x][y].locchar = FLOOR; X Dungeon[level][x][y].secret = TRUE; X } X else if (random_range(20)<=level/2) { X Dungeon[level][x][y].locchar = CLOSED_DOOR; X if (random_range(20) <= level/10) X Dungeon[level][x][y].secret = TRUE; X if (random_range(40) <= level) X Dungeon[level][x][y].aux = LOCKED; X else Dungeon[level][x][y].aux = UNLOCKED; X } X else { X Dungeon[level][x][y].locchar = OPEN_DOOR; X Dungeon[level][x][y].aux = UNLOCKED; X } X if (! Dungeon[level][x][y].secret) { X Dungeon[level][x][y+1].stopsrun = TRUE; X Dungeon[level][x+1][y].stopsrun = TRUE; X Dungeon[level][x-1][y].stopsrun = TRUE; X Dungeon[level][x][y-1].stopsrun = TRUE; X } X} X X Xvoid corridor_crawl(fx,fy,sx,sy,n,level,loc) Xint *fx,*fy,sx,sy,n,level; Xchar loc; X{ X int i; X for (i=0;im = X Dungeon[level][tx][ty].creature = X ((pmt) make_creature(ML3+5)); X Mlist[level]->m->x = tx; X Mlist[level]->m->y = ty; X } X else if (special_level==2) { /* dragonslair */ X populate_level(level,ML8+3); /* dragon */ X do { X tx = random_range(WIDTH); X ty = random_range(LENGTH); X } while (Dungeon[level][tx][ty].locchar != FLOOR); X Mlist[level]->m = X Dungeon[level][tx][ty].creature = X ((pmt) make_creature(ML10+3)); /*dragonlord*/ X Mlist[level]->m->x = tx; X Mlist[level]->m->y =ty; X } X else populate_level(level,-1); X stock_level(level); X} X X X X X X X X X Xvoid install_specials(level) Xint level; X{ X int i,j,x,y; X X for(x=0;x= level - 1) { X do { X i = random_range(WIDTH); X j = random_range(LENGTH); X } while (Dungeon[level][i][j].locchar != FLOOR); X Dungeon[level][i][j].locchar = UP; X Dungeon[level][i][j].stopsrun = TRUE; X Dungeon[level][i][j].aux = max(0,level - (random_range(3)+2)); X } X X if (fromlevel <= level + 1) { X do { X i = random_range(WIDTH); X j = random_range(LENGTH); X } while (Dungeon[level][i][j].locchar != FLOOR); X Dungeon[level][i][j].locchar = DOWN; X Dungeon[level][i][j].stopsrun = TRUE; X Dungeon[level][i][j].aux = level + (random_range(3)+2); X if (Dungeon[level][i][j].aux > NUMLEVELS -10) X Dungeon[level][i][j].aux = level+1; X if (level == NUMLEVELS-2) X Dungeon[level][i][j].p_locf = L_WARNING; X } X} X X X Xvoid pond_level(level,special_level) Xint level; Xint special_level; X{ X int i,l,r,t,b,k,j,fx,fy,tx,ty,rsi; X pob tob; X X if (special_level==1) X rsi = RS_OCEAN; X else if (special_level==2) X rsi = RS_WYRM; X else rsi = RS_PONDS; X X X for(i=1;im = X Dungeon[level][i][j].creature = X ((pmt) make_creature(ML6+6)); /* triton */ X Mlist[level]->m->x = i; X Mlist[level]->m->y = j; X } X else if (special_level==2) { X populate_level(level,ML8+6); /* tigershark */ X do { X i = random_range(WIDTH); X j = random_range(LENGTH); X }while (Dungeon[level][i][j].locchar != WATER); X Mlist[level]->m = X Dungeon[level][i][j].creature = X ((pmt) make_creature(ML9+6)); /*great wyrm*/ X Mlist[level]->m->x = i; X Mlist[level]->m->y = j; X } X else populate_level(level,-1); X stock_level(level); X X} X X X/* draw a bunch of random non-intersecting rooms and draw corridors between X them */ Xvoid room_level(level,special_level) Xint level,special_level; X{ X int roomsmade[30][30]; /* 30 is an arbitrary large enough number.... */ X int i,j,k,l,x,y,templetype,left,right,top,bottom; X pml ml; X X if (special_level) Leveldata[level].numrooms = 23; X else Leveldata[level].numrooms = 10+random_range(20); X for(i=0;i<30;i++) X for(j=0;j<30;j++) X roomsmade[i][j] = FALSE; X for (i=0;inext = NULL; X ml->m = X Dungeon[level][x][y].creature = X ((pmt) make_hiscore_npc(special_level)); X ml->m->x = x; X ml->m->y = y; X Mlist[level] = ml; X populate_level(level,ML8+9); X left = X Leveldata[level].rooms[Dungeon[level][x][y].roomnumber-ROOMBASE].left; X right = X Leveldata[level].rooms[Dungeon[level][x][y].roomnumber-ROOMBASE].right; X top = X Leveldata[level].rooms[Dungeon[level][x][y].roomnumber-ROOMBASE].top; X bottom = X Leveldata[level].rooms[Dungeon[level][x][y].roomnumber-ROOMBASE].bottom; X switch(special_level) { X case ODIN: templetype = RS_ODIN; break; X case ATHENA: templetype = RS_ATHENA; break; X case SET: templetype = RS_SET; break; X case HECATE: templetype = RS_HECATE; break; X case DRUID: templetype = RS_DRUID; break; X case DESTINY: templetype = RS_DESTINY; break; X } X for(k=left;k<=right;k++) X for(l=top;loscroll2.txt <<'END_OF_oscroll2.txt' XWelcome to Rampart! A guidebook of the Rampart Tourist Association. X XRampart is the sole city in this area of LOCUS, a bastion which the Xwild forces of both Law and Chaos cannot breach. Within the town there Xis a truce between the followers of Law and Chaos which is hardly ever Xbroken. X XThe visitor to Rampart will enjoy a wide range of divertissements, Xfrom shopping at Rampart's diverse assortment of shops, to attending Xgames at the Rampart Coliseum, to a relaxing picnic at the Botanical XGardens. Distinguished visitors may apply for an audience with the XDuke, who is said to be the greatest courtier on LOCUS. Others spend Xtheir nights (and days) gambling at the Rampart Casino. X XThe traveller who intends a longer stay in Rampart should check out the Xvarious guilds, societies, and clubs which protect and employ almost Xall the citizenry. The Commandant of the Mercenary Guild is always Xhiring, just for example. Many travellers are attracted to the XCollegium Magii -- scholarships are available to the qualified. X XA few cautions should be offered to the unwary. Rampart's sewer system Xis dangerous, and while there is ABSOLUTELY NO TRUTH to the rumors of Xtreasure-filled dungeons and caverns beneath the city, many Xdisappearances each year are attributed to unauthorized excursions Xbeneath the city. For the larcenous-minded, be warned that Rampart's XCity Guard is uncorruptible. It is just a matter of time, promises XMorgon the Justiciar, until the secret hideout of the Thieve's Guild Xis uncovered.... X XBut these warnings are surely unnecessary for the vast majority of our Xvisitors who will be perfectly safe if they act with reasonable caution.... END_OF_oscroll2.txt if test 1662 -ne `wc -c