omega-rpg/effect2.c

661 lines
18 KiB
C

/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
/* effect2.c */
#include "glob.h"
void knowledge(int blessing)
{
if (blessing < 0)
mprint("You feel ignorant.");
else {
mprint("You feel knowledgeable!");
menuclear();
menuprint("Current Point Total: ");
menulongprint(calc_points());
menuprint("\nAlignment:");
if (Player.alignment == 0)
menuprint("Neutral, embodying the Cosmic Balance");
else if (abs(Player.alignment) < 10)
menuprint("Neutral, tending toward ");
else if (abs(Player.alignment) < 50)
menuprint("Neutral-");
else if (abs(Player.alignment) < 100) ;
else if (abs(Player.alignment) < 200)
menuprint("Servant of ");
else if (abs(Player.alignment) < 400)
menuprint("Master of ");
else if (abs(Player.alignment) < 800)
menuprint("The Essence of ");
else menuprint("The Ultimate Avatar of ");
if (Player.alignment < 0) menuprint("Chaos\n");
else if (Player.alignment > 0) menuprint("Law\n");
showmenu();
morewait();
menuclear();
menuprint("Current stati:\n");
if (Player.status[BLINDED])
menuprint("Blinded\n");
if (Player.status[SLOWED])
menuprint("Slowed\n");
#ifdef DEBUG
if (Player.status[SLOWED])
fprintf(DG_debug_log, "Slowed is %d\n", Player.status[SLOWED] );
#endif
if (Player.status[HASTED])
menuprint("Hasted\n");
if (Player.status[DISPLACED])
menuprint("Displaced\n");
if (Player.status[SLEPT])
menuprint("Slept\n");
if (Player.status[DISEASED])
menuprint("Diseased\n");
if (Player.status[POISONED])
menuprint("Poisoned\n");
if (Player.status[BREATHING])
menuprint("Breathing\n");
if (Player.status[INVISIBLE])
menuprint("Invisible\n");
if (Player.status[REGENERATING])
menuprint("Regenerating\n");
if (Player.status[VULNERABLE])
menuprint("Vulnerable\n");
if (Player.status[BERSERK])
menuprint("Berserk\n");
if (Player.status[IMMOBILE])
menuprint("Immobile\n");
if (Player.status[ALERT])
menuprint("Alert\n");
if (Player.status[AFRAID])
menuprint("Afraid\n");
if (Player.status[ACCURATE])
menuprint("Accurate\n");
if (Player.status[HERO])
menuprint("Heroic\n");
if (Player.status[LEVITATING])
menuprint("Levitating\n");
if (Player.status[TRUESIGHT]) /* FIXED! 12/30/98 DG */
menuprint("Sharp\n");
if (Player.status[SHADOWFORM])
menuprint("Shadowy\n");
if (Player.status[ILLUMINATION])
menuprint("Glowing\n");
if (Player.status[DEFLECTION])
menuprint("Buffered\n");
if (Player.status[RETURNING])
menuprint("Returning\n");
showmenu();
morewait();
menuclear();
menuprint("Immunities:\n");
if (p_immune(NORMAL_DAMAGE))
menuprint("Normal Damage\n");
if (p_immune(FLAME))
menuprint("Flame\n");
if (p_immune(ELECTRICITY))
menuprint("Electricity\n");
if (p_immune(COLD))
menuprint("Cold\n");
if (p_immune(POISON))
menuprint("Poison\n");
if (p_immune(ACID))
menuprint("Acid\n");
if (p_immune(FEAR))
menuprint("Fear\n");
if (p_immune(SLEEP))
menuprint("Sleep\n");
if (p_immune(NEGENERGY))
menuprint("Negative Energies\n");
if (p_immune(THEFT))
menuprint("Theft\n");
if (p_immune(GAZE))
menuprint("Gaze\n");
if (p_immune(INFECTION))
menuprint("Infection\n");
showmenu();
morewait();
menuclear();
menuprint("Ranks:\n");
switch(Player.rank[LEGION]) {
case COMMANDANT:
menuprint("Commandant of the Legion");
break;
case COLONEL:
menuprint("Colonel of the Legion");
break;
case FORCE_LEADER:
menuprint("Force Leader of the Legion");
break;
case CENTURION:
menuprint("Centurion of the Legion");
break;
case LEGIONAIRE:
menuprint("Legionaire");
break;
}
if (Player.rank[LEGION] > 0) {
menuprint(" (");
menunumprint(Player.guildxp[LEGION]);
menuprint(" XP).\n");
}
switch(Player.rank[ARENA]) {
case -1:
menuprint("Ex-gladiator\n");
break;
case CHAMPION:
menuprint("Gladiator Champion");
break;
case GLADIATOR:
menuprint("Gladiator of the Arena");
break;
case RETIARIUS:
menuprint("Retiarius of the Arena");
break;
case BESTIARIUS:
menuprint("Bestiarius of the Arena");
break;
case TRAINEE:
menuprint("Gladiator Trainee of the Arena");
break;
}
if (Player.rank[ARENA] > 0) {
menuprint(" (Opponent ");
menunumprint(Arena_Opponent);
menuprint(")\n");
}
switch(Player.rank[COLLEGE]) {
case ARCHMAGE:
menuprint("Archmage of the Collegium Magii");
break;
case MAGE:
menuprint("Collegium Magii: Mage");
break;
case PRECEPTOR:
menuprint("Collegium Magii: Preceptor");
break;
case STUDENT:
menuprint("Collegium Magii: Student");
break;
case NOVICE:
menuprint("Collegium Magii: Novice");
break;
}
if (Player.rank[COLLEGE] > 0) {
menuprint(" (");
menunumprint(Player.guildxp[COLLEGE]);
menuprint(" XP).\n");
}
switch(Player.rank[NOBILITY]) {
case DUKE:
menuprint("Duke of Rampart");
break;
case LORD:
menuprint("Peer of the Realm");
break;
case KNIGHT:
menuprint("Order of the Knights of Rampart");
break;
case ESQUIRE:
menuprint("Squire of Rampart");
break;
case COMMONER:
menuprint("Commoner");
break;
default:
menuprint("Lowly Commoner\n");
break;
}
if (Player.rank[NOBILITY] > 1) {
menuprint(" (");
menunumprint(Player.rank[NOBILITY] - 1);
menuprint(ordinal(Player.rank[NOBILITY] - 1));
menuprint(" Quest Completed)\n");
}
else if (Player.rank[NOBILITY] == 1) {
menuprint(" (1st Quest Undertaken)\n");
}
switch(Player.rank[CIRCLE]) {
case -1:
menuprint("Former member of the Circle.\n");
break;
case PRIME:
menuprint("Prime Sorceror of the Inner Circle");
break;
case HIGHSORCEROR:
menuprint("High Sorceror of the Inner Circle");
break;
case SORCEROR:
menuprint("Member of the Circle of Sorcerors");
break;
case ENCHANTER:
menuprint("Member of the Circle of Enchanters");
break;
case INITIATE:
menuprint("Member of the Circle of Initiates");
break;
}
if (Player.rank[CIRCLE] > 0) {
menuprint(" (");
menunumprint(Player.guildxp[CIRCLE]);
menuprint(" XP).\n");
}
switch(Player.rank[ORDER]) {
case -1:
menuprint("Washout from the Order of Paladins\n");
break;
case JUSTICIAR:
menuprint("Justiciar of the Order of Paladins");
break;
case PALADIN:
menuprint("Paladin of the Order");
break;
case CHEVALIER:
menuprint("Chevalier of the Order");
break;
case GUARDIAN:
menuprint("Guardian of the Order");
break;
case GALLANT:
menuprint("Gallant of the Order");
break;
}
if (Player.rank[ORDER] > 0) {
menuprint(" (");
menunumprint(Player.guildxp[ORDER]);
menuprint(" XP).\n");
}
switch(Player.rank[THIEVES]) {
case SHADOWLORD:
menuprint("Guild of Thieves: Shadowlord");
break;
case TMASTER:
menuprint("Guild of Thieves: Master Thief");
break;
case THIEF:
menuprint("Guild of Thieves: Thief");
break;
case ATHIEF:
menuprint("Guild of Thieves: Apprentice Thief");
break;
case TMEMBER:
menuprint("Guild of Thieves: Candidate Member");
break;
}
if (Player.rank[THIEVES] > 0) {
menuprint(" (");
menunumprint(Player.guildxp[THIEVES]);
menuprint(" XP).\n");
}
switch(Player.rank[PRIESTHOOD]) {
case LAY:
menuprint("A lay devotee of ");
break;
case ACOLYTE:
menuprint("An Acolyte of ");
break;
case PRIEST:
menuprint("A Priest of ");
break;
case SPRIEST:
menuprint("A Senior Priest of ");
break;
case HIGHPRIEST:
menuprint("The High Priest of ");
break;
}
switch(Player.patron) {
case ODIN:
menuprint("Odin");
break;
case SET:
menuprint("Set");
break;
case ATHENA:
menuprint("Athena");
break;
case HECATE:
menuprint("Hecate");
break;
case DRUID:
menuprint("Druidism");
break;
case DESTINY:
menuprint("the Lords of Destiny");
break;
}
if (Player.rank[PRIESTHOOD] > 0) {
menuprint(" (");
menunumprint(Player.guildxp[PRIESTHOOD]);
menuprint(" XP).\n");
}
#ifdef INCLUDE_MONKS
switch(Player.rank[MONKS]) {
case MONK_GRANDMASTER:
menuprint("Tholian Monks: Grandmaster");
break;
case MONK_MASTER_TEARS:
menuprint("Tholian Monks: Master of Tears");
break;
case MONK_MASTER_PAINS:
menuprint("Tholian Monks: Master of Pain");
break;
case MONK_MASTER_SIGHS:
menuprint("Tholian Monks: Master of Sighs");
break;
case MONK_MASTER:
menuprint("Tholian Monks: Master");
break;
case MONK_MONK:
menuprint("Tholian Monks: Monk");
break;
case MONK_TRAINEE:
menuprint("Tholian Monks: Trainee");
break;
}
if (Player.rank[MONKS] > 0) {
menuprint(" (");
menunumprint(Player.guildxp[MONKS]);
menuprint(" XP).\n");
}
#endif
if (Player.rank[ADEPT] > 0)
menuprint("**************\n*Omegan Adept*\n**************\n");
showmenu();
morewait();
xredraw();
}
}
/* Recreates the current level */
void flux(int blessing)
{
mprint("The universe warps around you!");
if (Current_Environment == E_CITY) {
mprint("Sensing dangerous high order magic, the Collegium Magii");
mprint("and the Circle of Sorcerors join forces to negate the spell.");
mprint("You are zapped by an antimagic ray!!!");
dispel(-1);
mprint("The universe unwarps itself....");
}
else if (Current_Environment != Current_Dungeon)
mprint("Odd.... No effect!");
else {
mprint("You stagger as the very nature of reality warps!");
erase_level();
Level->generated = FALSE;
mprint("The fabric of spacetime reknits....");
change_level(Level->depth-1,Level->depth,TRUE);
}
}
/*Turns on displacement status for the player */
void displace(int blessing)
{
if (blessing > -1) {
mprint("You feel a sense of dislocation.");
Player.status[DISPLACED] = blessing + random_range(6);
}
else {
mprint("You feel vulnerable");
Player.status[VULNERABLE] += random_range(6) - blessing;
}
}
void invisible(int blessing)
{
if (blessing > -1) {
mprint("You feel transparent!");
Player.status[INVISIBLE]+= 2+5*blessing;
}
else {
#ifdef NEW_QUOTES
mprint("You feel endangered!");
#else
mprint("You feel dangerous!");
#endif
Player.status[VULNERABLE] +=
random_range(10)+1;
}
}
void warp(int blessing)
{
int newlevel;
if (Current_Environment != Current_Dungeon)
mprint("How strange! No effect....");
else {
newlevel = (int) parsenum("Warp to which level? ");
if (newlevel >= MaxDungeonLevels || blessing < 0 || newlevel < 1) {
mprint("You have been deflected!");
newlevel=random_range(MaxDungeonLevels - 1) + 1;
}
mprint("You dematerialize...");
change_level(Level->depth,newlevel,FALSE);
}
roomcheck();
}
void alert(int blessing)
{
if (blessing > -1) {
mprint("You feel on-the-ball.");
Player.status[ALERT]+= 4+(5*blessing);
}
else sleep_player(abs(blessing)+3);
}
void regenerate(int blessing)
{
if (blessing < 0)
heal(blessing * 10);
else {
mprint("You feel abnormally healthy.");
Player.status[REGENERATING] += (blessing+1)*50;
}
}
void haste(int blessing)
{
if (blessing > -1) {
if (! Player.status[HASTED])
mprint("The world slows down!");
else mprint("Nothing much happens.");
if (Player.status[SLOWED])
Player.status[SLOWED] = 0;
/* DAG -- this seems too long */
/* WDT -- I agree. Next version we'll fiddle it a bit. I suspect
* that the author of haste/slow didn't really understand the time
* system (or perhaps the time system's been changed since). */
Player.status[HASTED] += (blessing*100)+random_range(250);
}
else {
mprint("You feel slower.");
if (Player.status[HASTED] > 0) mprint("...but the feeling quickly fades.");
/* DAG don't add, so it can't be come permanent. Also, reduce duration. */
else Player.status[SLOWED] = max( random_range(100)+50, Player.status[SLOWED] );
/* was: else Player.status[SLOWED] += random_range(250)+250; */
}
}
void recover_stat(int blessing)
{
if (blessing < 0) {
mprint("You feel a cold surge!");
switch(random_range(6)) {
case 0: Player.str = min(Player.str-1,Player.maxstr-1); break;
case 1: Player.con = min(Player.con-1,Player.maxcon-1); break;
case 2: Player.dex = min(Player.dex-1,Player.maxdex-1); break;
case 3: Player.agi = min(Player.agi-1,Player.maxagi-1); break;
case 4: Player.iq = min(Player.iq-1,Player.maxiq-1); break;
case 5: Player.pow = min(Player.pow-1,Player.maxpow-1); break;
}
}
else {
mprint("You feel a warm tingle!");
Player.str = max(Player.str,Player.maxstr);
Player.con = max(Player.con,Player.maxcon);
Player.dex = max(Player.dex,Player.maxdex);
Player.agi = max(Player.agi,Player.maxagi);
Player.iq = max(Player.iq,Player.maxiq);
Player.pow = max(Player.pow,Player.maxpow);
}
calc_melee();
}
void augment(int blessing)
{
if (blessing < 0) {
mprint("You feel a cold surge!");
switch(random_range(6)) {
case 0: Player.str = min(Player.str-1,Player.maxstr-1); break;
case 1: Player.con = min(Player.con-1,Player.maxcon-1); break;
case 2: Player.dex = min(Player.dex-1,Player.maxdex-1); break;
case 3: Player.agi = min(Player.agi-1,Player.maxagi-1); break;
case 4: Player.iq = min(Player.iq-1,Player.maxiq-1); break;
case 5: Player.pow = min(Player.pow-1,Player.maxpow-1); break;
}
}
else if (blessing == 0) {
mprint("You feel a warm tingle!");
switch(random_range(6)) {
case 0: Player.str = max(Player.str+1,Player.maxstr+1); break;
case 1: Player.con = max(Player.con+1,Player.maxcon+1); break;
case 2: Player.dex = max(Player.dex+1,Player.maxdex+1); break;
case 3: Player.agi = max(Player.agi+1,Player.maxagi+1); break;
case 4: Player.iq = max(Player.iq+1,Player.maxiq+1); break;
case 5: Player.pow = max(Player.pow+1,Player.maxpow+1); break;
}
}
else {
mprint("You feel a hot flash!");
Player.str = max(Player.str+1,Player.maxstr+1);
Player.con = max(Player.con+1,Player.maxcon+1);
Player.dex = max(Player.dex+1,Player.maxdex+1);
Player.agi = max(Player.agi+1,Player.maxagi+1);
Player.iq = max(Player.iq+1,Player.maxiq+1);
Player.pow = max(Player.pow+1,Player.maxpow+1);
}
calc_melee();
}
void breathe(int blessing)
{
if (blessing > -1) {
mprint("Your breath is energized!");
Player.status[BREATHING] += 6+blessing;
}
else {
mprint("You choke as your lungs fill with water!");
p_damage(50,UNSTOPPABLE,"drowning");
}
}
void i_chaos(pob o)
{
if (Player.alignment < 0) {
Player.alignment -= random_range(20);
mprint("You feel deliciously chaotic!");
gain_experience(abs(Player.alignment)*10);
}
else {
mprint("You feel a sense of inner turmoil!");
}
/* Potion of Chaos always makes player more chaotic. PGM */
Player.alignment -= random_range(20);
}
void i_law(pob o)
{
if (Player.alignment > 0) {
Player.alignment += random_range(20);
mprint("You feel wonderfully lawful!");
gain_experience(Player.alignment*10);
}
else {
mprint("You feel a sense of inner constraint!");
}
/* Potion of Law always makes player more lawful. PGM */
Player.alignment += random_range(20);
}
void sanctify(int blessing)
{
if (blessing > -1) {
if (Level->environment == E_TEMPLE)
mprint("Odd, the spell has no effect. I wonder why.");
else if (Level->site[Player.x][Player.y].locchar == ALTAR)
mprint("This site can't get any holier!");
else if (Player.patron == 0) {
mprint("The gods are angered!");
Level->site[Player.x][Player.y].locchar = LAVA;
Level->site[Player.x][Player.y].p_locf = L_LAVA;
lset(Player.x, Player.y, CHANGED);
p_movefunction(L_LAVA);
}
else {
Level->site[Player.x][Player.y].locchar = ALTAR;
Level->site[Player.x][Player.y].aux = Player.patron;
Level->site[Player.x][Player.y].p_locf = L_ALTAR;
lset(Player.x, Player.y, CHANGED);
mprint("You are standing on sacred ground!");
}
}
else {
if (Level->site[Player.x][Player.y].locchar == ALTAR) {
mprint("The altar crumbles before your unholy blast....");
Level->site[Player.x][Player.y].locchar = FLOOR;
Level->site[Player.x][Player.y].p_locf = L_NO_OP;
lset(Player.x, Player.y, CHANGED);
if (Level->site[Player.x][Player.y].aux == Player.patron) {
mprint("Your deity is not amused....");
p_damage(Player.hp-1,UNSTOPPABLE,"Divine Wrath");
}
else if ((Player.patron == ATHENA) || (Player.patron == ODIN)) {
if ((Level->site[Player.x][Player.y].aux == SET) ||
(Level->site[Player.x][Player.y].aux == HECATE)) {
mprint("Your deity applauds the eradication of Chaos' taint");
gain_experience(1000);
}
else {
mprint("Your deity approves of your action.");
gain_experience(100);
}
}
else if ((Player.patron == SET) || (Player.patron == HECATE)) {
if ((Level->site[Player.x][Player.y].aux == ODIN) ||
(Level->site[Player.x][Player.y].aux == ATHENA)) {
mprint("Your deity applauds the obliteration of Law");
gain_experience(1000);
}
else {
mprint("Your deity approves of your action.");
gain_experience(100);
}
}
else if (Player.patron == DRUID) {
mprint("Your attempt to maintain the Balance is applauded....");
gain_experience(250);
}
else mprint("Nothing much happens");
}
else mprint("You feel an aura of unholiness arising from this spot....");
}
}
void accuracy(int blessing)
{
if (blessing > -1) {
mprint("Everything seems covered in bullseyes!");
Player.status[ACCURACY] += random_range(5)+1+blessing*5;
calc_melee();
}
else {
Player.status[ACCURACY]=0;
calc_melee();
mprint("Your vision blurs...");
}
}