Skip to content
This repository has been archived by the owner on Mar 23, 2024. It is now read-only.

Commit

Permalink
Imported scroll of elementalism (from splice).
Browse files Browse the repository at this point in the history
  • Loading branch information
elunna committed Oct 3, 2022
1 parent e886a46 commit c140941
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 1 deletion.
1 change: 1 addition & 0 deletions include/extern.h
Expand Up @@ -1367,6 +1367,7 @@ E long FDECL(attack_contact_slots, (struct monst *, int));
E void FDECL(newemin, (struct monst *));
E void FDECL(free_emin, (struct monst *));
E int FDECL(monster_census, (BOOLEAN_P));
E int rand_elemental(void);
E int FDECL(msummon, (struct monst *));
E struct monst *FDECL(summon_minion, (ALIGNTYP_P, BOOLEAN_P));
E int FDECL(demon_talk, (struct monst *));
Expand Down
6 changes: 6 additions & 0 deletions src/minion.c
Expand Up @@ -46,6 +46,12 @@ boolean spotted; /* seen|sensed vs all */
return count;
}

/* returns a basic elemental */
int
rand_elemental() {
return PM_AIR_ELEMENTAL + rn2(PM_WATER_ELEMENTAL - PM_AIR_ELEMENTAL);
}

/* mon summons a monster */
int
msummon(mon)
Expand Down
1 change: 1 addition & 0 deletions src/objects.c
Expand Up @@ -1035,6 +1035,7 @@ SCROLL("enchant weapon", "DAIYEN FOOELS", 1, 80, 60),
SCROLL("create monster", "LEP GEX VEN ZEA", 1, 45, 200),
SCROLL("taming", "PRIRUTSENIE", 1, 15, 200),
SCROLL("genocide", "ELBIB YLOH", 1, 15, 300),
SCROLL("elementalism", "4OFAE OF9 SCC9", 1, 10, 300), /* Voynich */
SCROLL("light", "VERR YED HORRE", 1, 90, 50),
SCROLL("teleportation", "VENZAR BORGAVVE", 1, 55, 100),
SCROLL("gold detection", "THARR", 1, 34, 100),
Expand Down
80 changes: 79 additions & 1 deletion src/read.c
Expand Up @@ -15,6 +15,11 @@
#define Your_Own_Race(mndx) \
((mndx) == urace.malenum \
|| (urace.femalenum != NON_PM && (mndx) == urace.femalenum))
/* For create_critters and demonology... */
#define MAKE_EM_NATURAL 0 /* Create monsters... */
#define MAKE_EM_HOSTILE 1 /* Create hostile monsters... */
#define MAKE_EM_PEACEFUL 2 /* Create peaceful monsters... */
#define MAKE_EM_TAME 3 /* Create tamed monsters... */

boolean known;

Expand Down Expand Up @@ -1684,7 +1689,80 @@ struct obj *sobj; /* sobj - scroll or fake spellbook for spell */
* monsters are not visible
*/
break;

case SCR_ELEMENTALISM: {
struct permonst *critter = (struct permonst *) 0;
boolean confused = (Confusion != 0);
int i = 0;
int n = 1;
int state = MAKE_EM_HOSTILE;
struct monst *mtmp;
/* struct obj *sobj = *sobjp; */
/* find the number of critters */
if (sblessed) {
if (confused) {
n = 3 + rn2(10);
state = MAKE_EM_TAME;
} else if (!rn2(3)) {
state = MAKE_EM_HOSTILE; /* 1 in 3 */
} else {
state = MAKE_EM_TAME;
}
} else if (scursed) {
if (!confused) {
n = 2 + rn2(3);
}
} else {
if (confused) {
n = 3 + rn2(10);
} else if (!rn2(2)) {
state = MAKE_EM_PEACEFUL;
}
}
/* create the critter */
if (confused) {
/* Normally you get an elemental... */
switch (rn2(4)) {
case 0: /* Air */
critter = &mons[PM_GAS_SPORE];
break;
case 1: /* Fire */
critter = &mons[PM_FLAMING_SPHERE];
break;
case 2: /* Water */
critter = &mons[PM_FREEZING_SPHERE];
break;
default:
case 3: /* Earth */
critter = &mons[PM_SHOCKING_SPHERE];
break;
}
} else {
critter = &mons[rand_elemental()];
}
/* Summoning demons is a chaotic thing... */
for (i = 0; i < n; i++) {
mtmp = makemon(critter, u.ux, u.uy,
state == MAKE_EM_TAME
? MM_EDOG | MM_IGNOREWATER | NO_MINVENT
: MM_IGNOREWATER | NO_MINVENT);
if (!mtmp) {
break;
} else if (state == MAKE_EM_TAME) {
initedog(mtmp);
} else if (state == MAKE_EM_PEACEFUL) {
mtmp->mpeaceful = 1;
} else if (state == MAKE_EM_HOSTILE) {
mtmp->mpeaceful = 0;
}
}
known = TRUE;
if (Hallucination) {
You_feel("you have experienced something fundamental.");
} else {
pline("The elements swirl around you.");
}
break;
}
case SPE_SUMMON_UNDEAD: {
int cnt = 1, oldmulti = multi;
multi = 0;
Expand Down

0 comments on commit c140941

Please sign in to comment.