diff --git a/attack.c b/attack.c index 6f9a7f1..d20f972 100644 --- a/attack.c +++ b/attack.c @@ -1212,6 +1212,19 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag) loreadd = slev; } dam[0] = (int) ( (float)dam[0] + loreadd ); + + // extra damage to fire-based lifeforms if they are cold. + if (lf->material->id == MT_FIRE) { + enum TEMPERATURE temp; + temp = getlftemp(lf); + switch (temp) { + case T_CHILLY: dam[0] = pctof(125, dam[0]); break; + case T_COLD: dam[0] = pctof(160, dam[0]); break; + case T_VCOLD: dam[0] = pctof(200, dam[0]); break; + default: break; + } + } + } if (lfhasflag(lf, F_PHANTASM)) { @@ -3190,6 +3203,7 @@ int rolltohit(lifeform_t *lf, lifeform_t *victim, object_t *wep, int *critical, *critical = 1; } else { int critroll; + int minroll = 1; critroll = rnd(1,100); // modify for lore level > pr_novice @@ -3198,7 +3212,15 @@ int rolltohit(lifeform_t *lf, lifeform_t *victim, object_t *wep, int *critical, lorebonus = ((lorelev-1)*5); // ie. up to 25% bonus critroll -= lorebonus; } - limit(&critroll, 1, 100); + + + if (isplayer(lf)) { + f = lfhasflag(lf, F_MINCRITCHANCE); + if (f) { + minroll = f->val[0]; + } + } + limit(&critroll, minroll, 100); if (critroll <= getcritchance(lf, wep,victim)) *critical = 1; } diff --git a/data.c b/data.c index 6cb147d..285ed6e 100644 --- a/data.c +++ b/data.c @@ -2020,6 +2020,7 @@ void initobjects(void) { addflag(lastmaterial->flags, F_CANGETWET, B_TRUE, NA, NA, NULL); addmaterial(MT_ACID, "acid", 7); addmaterial(MT_WATER, "water", 7); + addmaterial(MT_SNOW, "snow", 7); addmaterial(MT_BLOOD, "blood", 7); addmaterial(MT_SLIME, "slime", 9); addmaterial(MT_STONE, "stone", 10); @@ -2059,7 +2060,7 @@ void initobjects(void) { addflag(lastobjectclass->flags, F_SHOP, B_TRUE, NA, NA, NULL); addflag(lastobjectclass->flags, F_OPERABLE, B_TRUE, NA, NA, NULL); addoc(OC_DFEATURE, "Dungeon Features", "Doors, etc.", '\\', C_GREY, RR_RARE); - addoc(OC_FURNITURE, "Furniture", "Various kinds of mundane (or not so mundane) furnishings.", '\\', C_BROWN, RR_FREQUENT); + addoc(OC_FURNITURE, "Furniture", "Various kinds of mundane (or not so mundane) furnishings.", '\\', C_DARKYELLOW, RR_FREQUENT); addocnoun(lastobjectclass, "furniture"); addflag(lastobjectclass->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastobjectclass->flags, F_RARITY, H_CAVE, NA, RR_RARE, NULL); // override for habitat @@ -2140,7 +2141,7 @@ void initobjects(void) { addflag(lastobjectclass->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastobjectclass->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastobjectclass->flags, F_SMELLY, B_TRUE, NA, NA, NULL); - addoc(OC_GODSTONE, "Godstones", "Ancient artifacts, created by the elder gods.", '*', C_BOLDMAGENTA, RR_NEVER); + addoc(OC_GODSTONE, "Godstones", "Ancient artifacts, created by the elder gods.", '*', C_LIGHTMAGENTA, RR_NEVER); addflag(lastobjectclass->flags, F_UNIQUE, NA, NA, NA, NULL); addflag(lastobjectclass->flags, F_THE, NA, NA, NA, NULL); //addflag(lastobjectclass->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pulsating stone"); @@ -2249,7 +2250,7 @@ void initobjects(void) { // blocks movement, but you can see and fire through them. addot(OT_GATEIRON, "iron gate", "A gate comprised of a series of vertical iron bars, raised slightly above the floor.", MT_METAL, 500, OC_DFEATURE, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, C_GREY, '+', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_METAL, '+', NA, NULL); addflag(lastot->flags, F_DOOR, SZ_MEDIUM, SZ_MAX, NA, NULL); addflag(lastot->flags, F_DOORFALLOB, NA, NA, NA, "4-5 iron poles"); addflag(lastot->flags, F_IMPASSABLE, SZ_MEDIUM, SZ_MAX, NA, NULL); @@ -2266,7 +2267,7 @@ void initobjects(void) { addflag(lastot->flags, F_SHRINKSTO, OT_IRONSTAFF, VT_OB, NA, NULL); addot(OT_GATEBONE, "bone gate", "A grisly gate created from human bones.", MT_BONE, 60, OC_DFEATURE, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, C_GREY, '+', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_BONE, '+', NA, NULL); addflag(lastot->flags, F_DOOR, SZ_MIN, SZ_MAX, NA, NULL); addflag(lastot->flags, F_DOORFALLOB, NA, NA, NA, "50-100 bones"); addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_MAX, NA, NULL); @@ -2279,7 +2280,7 @@ void initobjects(void) { addflag(lastot->flags, F_SHRINKSTO, OT_BONE, VT_OB, NA, NULL); addot(OT_GATEWOOD, "wooden gate", "A gate comprised of a series of wooden slats.", MT_WOOD, 200, OC_DFEATURE, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, C_GREY, '+', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, '+', NA, NULL); addflag(lastot->flags, F_DOOR, SZ_MIN, SZ_MAX, NA, NULL); addflag(lastot->flags, F_DOORFALLOB, NA, NA, NA, "4-5 planks of wood"); addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_MAX, NA, NULL); @@ -2294,7 +2295,7 @@ void initobjects(void) { addflag(lastot->flags, F_SHRINKSTO, OT_BED, VT_OB, NA, NULL); addot(OT_FENCEBONE, "bone fence", "A tell fence created from what appear to be human bones.", MT_BONE, 150, OC_DFEATURE, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, C_GREY, '/', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_BONE, '/', NA, NULL); addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_MAX, NA, NULL); addflag(lastot->flags, F_CLIMBOBSTACLE, 90, NA, NA, NULL); addflag(lastot->flags, F_BLOCKSVIEW, B_TRUE, B_TRUE, NA, NULL); @@ -2320,7 +2321,7 @@ void initobjects(void) { // important: don't make these in a swamp. addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL); addflag(lastot->flags, F_MAKESNOISE, 33, 3, NA, "a slow drip."); - addflag(lastot->flags, F_GLYPH, C_GREY, '#', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_METAL, '#', NA, NULL); addflag(lastot->flags, F_CLIMBABLE, D_DOWN, NA, NA, "drainage grate"); addflag(lastot->flags, F_OPPOSITESTAIRS, OT_GRATINGROOF, NA, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); @@ -2333,7 +2334,7 @@ void initobjects(void) { addflag(lastot->flags, F_IMPORTANT, B_TRUE, NA, NA, NULL); addot(OT_GRATINGROOF, "drain in the roof", "An open draining grate set into the roof.", MT_NOTHING, 0, OC_DFEATURE, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, C_BLUE, '<', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_VDARKGREY, '<', NA, NULL); addflag(lastot->flags, F_CLIMBABLE, D_UP, NA, NA, "drainage grate"); addflag(lastot->flags, F_DONTSHOWDEST, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_PIT, D_UP, NA, NA, NULL); @@ -2348,7 +2349,7 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_UNCOMMON, NULL); - addflag(lastot->flags, F_GLYPH, C_BLUE, '^', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_VDARKGREY, '^', NA, NULL); addflag(lastot->flags, F_CLIMBABLE, D_DOWN, NA, NA, "hole"); addflag(lastot->flags, F_DONTSHOWDEST, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_PIT, D_DOWN, NA, NA, NULL); @@ -2359,7 +2360,7 @@ void initobjects(void) { addflag(lastot->flags, F_IMPORTANT, B_TRUE, NA, NA, NULL); addot(OT_HOLEINROOF, "hole in the roof", "A gaping hole in the roof.", MT_NOTHING, 0, OC_DFEATURE, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, C_BLUE, '<', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_VDARKGREY, '<', NA, NULL); addflag(lastot->flags, F_CLIMBABLE, D_UP, NA, NA, "hole"); addflag(lastot->flags, F_DONTSHOWDEST, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_PIT, D_UP, NA, NA, NULL); @@ -2371,7 +2372,7 @@ void initobjects(void) { addflag(lastot->flags, F_IMPORTANT, B_TRUE, NA, NA, NULL); addot(OT_TREEDOWN, "hollow tree leading down", "A huge hollow tree containing an ascending staircase.", MT_DRAGONWOOD, 3000, OC_DFEATURE, SZ_HUGE); - addflag(lastot->flags, F_GLYPH, C_GREEN, '>', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, '>', NA, NULL); addflag(lastot->flags, F_STAIRS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_CLIMBABLE, D_DOWN, NA, NA, "hollow tree"); addflag(lastot->flags, F_OPPOSITESTAIRS, OT_TREEUP, NA, NA, NULL); @@ -2382,7 +2383,7 @@ void initobjects(void) { addflag(lastot->flags, F_MAKESNOISE, 33, 1, NA, "birds chirping."); addflag(lastot->flags, F_IMPORTANT, B_TRUE, NA, NA, NULL); addot(OT_TREEUP, "hollow tree leading up", "A huge hollow tree containing an ascending staircase.", MT_DRAGONWOOD, 3000, OC_DFEATURE, SZ_HUGE); - addflag(lastot->flags, F_GLYPH, C_GREEN, '<', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, '<', NA, NULL); addflag(lastot->flags, F_STAIRS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_CLIMBABLE, D_UP, NA, NA, "hollow tree"); addflag(lastot->flags, F_OPPOSITESTAIRS, OT_TREEDOWN, NA, NA, NULL); @@ -2412,6 +2413,27 @@ void initobjects(void) { addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_IMPORTANT, B_TRUE, NA, NA, NULL); + addot(OT_ICESTAIRSDOWN, "icy passage leading down", "A cold metal passage leading downwards, encryusted with ice.", MT_METAL, 3000, OC_DFEATURE, SZ_HUGE); + addflag(lastot->flags, F_GLYPH, C_WHITE, '>', NA, NULL); + addflag(lastot->flags, F_STAIRS, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_CLIMBABLE, D_DOWN, NA, NA, "icy passage"); + addflag(lastot->flags, F_OPPOSITESTAIRS, OT_ICESTAIRSUP, NA, NA, NULL); + addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_ONEPERCELL, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_MAKESNOISE, 33, 1, NA, "cracking ice"); + addflag(lastot->flags, F_MAKESNOISE, 33, 1, NA, "howling winds"); + addflag(lastot->flags, F_IMPORTANT, B_TRUE, NA, NA, NULL); + addot(OT_ICESTAIRSUP, "icy passage leading up", "A cold metal passage leading upwards, encryusted with ice.", MT_METAL, 3000, OC_DFEATURE, SZ_HUGE); + addflag(lastot->flags, F_GLYPH, C_WHITE, '<', NA, NULL); + addflag(lastot->flags, F_STAIRS, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_CLIMBABLE, D_UP, NA, NA, "icy passage"); + addflag(lastot->flags, F_OPPOSITESTAIRS, OT_ICESTAIRSDOWN, NA, NA, NULL); + addflag(lastot->flags, F_ONEPERCELL, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_IMPORTANT, B_TRUE, NA, NA, NULL); + addot(OT_RUBBLE, "pile of rubble", "A massive pile of loose rock and debris. Possible to climb, but difficult.", MT_STONE, 200, OC_DFEATURE, SZ_ENORMOUS); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_UNCOMMON, NULL); @@ -2443,7 +2465,7 @@ void initobjects(void) { addflag(lastot->flags, F_IMPORTANT, B_TRUE, NA, NA, NULL); addot(OT_VSTAIRSDOWN, "metal hatch leading down", "A study metal hatchway set into the floor.", MT_METAL, 3000, OC_DFEATURE, SZ_HUGE); - addflag(lastot->flags, F_GLYPH, NA, '>', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_METAL, '>', NA, NULL); addflag(lastot->flags, F_STAIRS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_CLIMBABLE, D_DOWN, NA, NA, "staircase"); addflag(lastot->flags, F_OPPOSITESTAIRS, OT_VSTAIRSUP, NA, NA, NULL); @@ -2454,7 +2476,7 @@ void initobjects(void) { addflag(lastot->flags, F_IMPORTANT, B_TRUE, NA, NA, NULL); addot(OT_VSTAIRSUP, "metal ladder leading up", "A ladder of rigid metal, leading up to through roof.", MT_METAL, 3000, OC_DFEATURE, SZ_HUGE); - addflag(lastot->flags, F_GLYPH, NA, '<', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_METAL, '<', NA, NULL); addflag(lastot->flags, F_STAIRS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_CLIMBABLE, D_UP, NA, NA, "staircase"); addflag(lastot->flags, F_OPPOSITESTAIRS, OT_VSTAIRSDOWN, NA, NA, NULL); @@ -2463,16 +2485,16 @@ void initobjects(void) { addflag(lastot->flags, F_ONEPERCELL, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_IMPORTANT, B_TRUE, NA, NA, NULL); - // buildings - // baba yaga's hut addot(OT_BABAYAGAHUT, "wooden hut", "A small wooden cabin on the ground, two chicken's legs folded underneath it.", MT_DRAGONWOOD, 1000, OC_BUILDING, SZ_LARGE); + addflag(lastot->flags, F_NOKO, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_GETKILLEDVERB, NA, NA, NA, "defeat"); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOTAKECRITS, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_BROWN, '_', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, '_', NA, NULL); addflag(lastot->flags, F_CLIMBABLE, D_IN, NA, NA, "hut's door"); addflag(lastot->flags, F_OPPOSITESTAIRS, OT_BYHUTDOOR, NA, NA, NULL); addflag(lastot->flags, F_IMPORTANT, B_TRUE, NA, NA, NULL); @@ -2483,7 +2505,7 @@ void initobjects(void) { addot(OT_BYHUTDOOR, "hut's doorway", "The front door of Baba Yaga's hut.", MT_STONE, 3000, OC_DFEATURE, SZ_HUGE); addflag(lastot->flags, F_UNIQUE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THE, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_BROWN, '>', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, '>', NA, NULL); addflag(lastot->flags, F_CLIMBABLE, D_IN, NA, NA, "doorway"); addflag(lastot->flags, F_OPPOSITESTAIRS, OT_BABAYAGAHUT, NA, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); @@ -2647,7 +2669,7 @@ void initobjects(void) { addot(OT_HOLYCIRCLE, "holy circle", "A consecrated area imbued with holy power.", MT_NOTHING, 0, OC_DFEATURE, SZ_LARGE); addflag(lastot->flags, F_RARITY, H_ALL, 80, NA, ""); - addflag(lastot->flags, F_GLYPH, C_CYAN, '_', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTCYAN, '_', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, "."); @@ -2656,7 +2678,7 @@ void initobjects(void) { addot(OT_PENTAGRAM, "pentagram", "A area imbued with evil.", MT_NOTHING, 0, OC_DFEATURE, SZ_LARGE); addflag(lastot->flags, F_RARITY, H_ALL, 80, NA, ""); - addflag(lastot->flags, F_GLYPH, C_RED, '_', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKRED, '_', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, "."); @@ -2665,7 +2687,7 @@ void initobjects(void) { addot(OT_PORTAL, "magic portal", "A magical portal to a different place...", MT_MAGIC, 0, OC_EFFECT, SZ_LARGE); addflag(lastot->flags, F_RARITY, H_DUNGEON, 80, RR_VERYRARE, NULL); - addflag(lastot->flags, F_GLYPH, C_BOLDGREEN, '^', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTGREEN, '^', NA, NULL); addflag(lastot->flags, F_CLIMBABLE, D_IN, NA, NA, "portal"); addflag(lastot->flags, F_PORTAL, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); @@ -2674,7 +2696,7 @@ void initobjects(void) { addflag(lastot->flags, F_IMPORTANT, B_TRUE, NA, NA, NULL); addot(OT_LUNARGATE, "lunar gate", "A mystical portal said to open at the stroke of midnight.", MT_MAGIC, 0, OC_EFFECT, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, C_BOLDCYAN, '^', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTCYAN, '^', NA, NULL); addflag(lastot->flags, F_CLIMBABLE, D_IN, NA, NA, "lunar gate"); addflag(lastot->flags, F_PORTAL, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); @@ -2684,7 +2706,7 @@ void initobjects(void) { addflag(lastot->flags, F_IMPORTANT, B_TRUE, NA, NA, NULL); addot(OT_STOMACHEXIT, "gaping hole", "A gaping hole in an enormous creature.", MT_MAGIC, 0, OC_DFEATURE, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, C_GREY, '^', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKGREY, '^', NA, NULL); addflag(lastot->flags, F_DONTSHOWDEST, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_CLIMBABLE, D_IN, NA, NA, "hole"); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); @@ -2705,7 +2727,7 @@ void initobjects(void) { addot(OT_MAGICDARK, "unnatural darkness", "An unnattural area of pitch black darkness.", MT_MAGIC, 0, OC_EFFECT, SZ_HUGE); //addflag(lastot->flags, F_NOGLYPH, NA, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_BLUE, UNI_CLOUD, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_VDARKGREY, UNI_CLOUD, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOFEEL, B_TRUE, NA, NA, NULL); @@ -2718,7 +2740,7 @@ void initobjects(void) { addot(OT_WATERDEEP, "water", "Deep water.", MT_WATER, 300, OC_TERRAIN, SZ_HUGE); addflag(lastot->flags, F_NO_A, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_BLUE, UNI_SOLID, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKBLUE, UNI_SOLID, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DTCONVERT, DT_COLD, NA, NA, "sheet of ice"); addflag(lastot->flags, F_DTCREATEOB, DT_FIRE, 1, DT_COMPASS, "cloud of steam"); @@ -2734,7 +2756,7 @@ void initobjects(void) { addflag(lastot->flags, F_TRAP, 80, B_TRUE, NA, "ground"); addflag(lastot->flags, F_RARITY, H_DUNGEON, 76, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 76, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_GREY, '^', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_BROWN, '^', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, "."); @@ -2745,7 +2767,7 @@ void initobjects(void) { addflag(lastot->flags, F_TRAP, 85, B_TRUE, NA, "ground"); addflag(lastot->flags, F_RARITY, H_DUNGEON, 69, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 69, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_GREY, '^', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_BROWN, '^', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, "."); @@ -2776,6 +2798,7 @@ void initobjects(void) { addflag(lastot->flags, F_TRAP, 90, B_TRUE, NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 60, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 60, NA, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, NA, NULL); addflag(lastot->flags, F_GLYPH, C_GREEN, '^', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); @@ -2825,7 +2848,7 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 100, NA, NULL); addflag(lastot->flags, F_OBJECTTRAP, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_GREY, '^', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_YELLOW, '^', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, "."); @@ -2836,6 +2859,7 @@ void initobjects(void) { addflag(lastot->flags, F_TRAP, 70, B_TRUE, NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 75, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 75, NA, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, NA, NULL); addflag(lastot->flags, F_OBJECTTRAP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_GLYPH, C_MAGENTA, '^', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); @@ -2849,7 +2873,7 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_DUNGEON, 59, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 59, NA, NULL); addflag(lastot->flags, F_OBJECTTRAP, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_GREY, '^', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_RED, '^', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, "."); @@ -2860,7 +2884,7 @@ void initobjects(void) { addflag(lastot->flags, F_TRAP, 65, B_TRUE, NA, "ground"); addflag(lastot->flags, F_RARITY, H_DUNGEON, 59, NA, NULL); addflag(lastot->flags, F_OBJECTTRAP, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_GREY, '^', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_CYAN, '^', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, "."); @@ -2871,7 +2895,7 @@ void initobjects(void) { addflag(lastot->flags, F_TRAP, 70, B_TRUE, NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 69, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 69, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_GREY, '^', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTGREEN, '^', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, "."); @@ -2896,6 +2920,7 @@ void initobjects(void) { addflag(lastot->flags, F_TRAP, NA, B_TRUE, NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 80, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 80, NA, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, NA, NULL); addflag(lastot->flags, F_GLYPH, C_MAGENTA, '^', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); @@ -2935,6 +2960,7 @@ void initobjects(void) { addot(OT_ICICLE, "huge icicle", "A massive ice stalacmite.", MT_ICE, 200, OC_ROCK, SZ_LARGE); addflag(lastot->flags, F_GLYPH, C_CYAN, '\'', NA, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_LARGE, NA, NULL); addflag(lastot->flags, F_BLOCKSVIEW, B_TRUE, B_TRUE, NA, NULL); addflag(lastot->flags, F_BLOCKSLOF, B_TRUE, NA, NA, NULL); @@ -2944,7 +2970,7 @@ void initobjects(void) { addflag(lastot->flags, F_SHRINKSTO, OT_ICESHEET, VT_OB, NA, NULL); addot(OT_IRONBARS, "iron cage", "A series of vertical iron bars.", MT_METAL, 500, OC_DFEATURE, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, C_GREY, '|', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_METAL, '|', NA, NULL); addflag(lastot->flags, F_IMPASSABLE, SZ_SMALL, SZ_MAX, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); @@ -2961,6 +2987,7 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_VILLAGE, NA, RR_COMMON, ""); addflag(lastot->flags, F_RARITY, H_FOREST, NA, RR_RARE, ""); addflag(lastot->flags, F_RARITY, H_CAVE, NA, RR_COMMON, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastot->flags, F_GLYPH, NA, '\'', NA, NULL); addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_LARGE, NA, NULL); // will be overridden addflag(lastot->flags, F_PUSHABLE, B_TRUE, NA, NA, NULL); @@ -2980,7 +3007,7 @@ void initobjects(void) { addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "2"); - addot(OT_BRICK, "brick", "A heavy brick.", MT_STONE, 3, OC_ROCK, SZ_TINY); + addot(OT_BRICK, "brick", "A heavy brick.", MT_BRICK, 3, OC_ROCK, SZ_TINY); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, NA, RR_RARE, ""); addflag(lastot->flags, F_RARITY, H_CAVE, NA, RR_RARE, NULL); @@ -2994,12 +3021,13 @@ void initobjects(void) { // gems addot(OT_AQUAMARINE, "aquamarine stone", "An aqua-coloured gemstone.", MT_STONE, 0.2, OC_ROCK, SZ_TINY); addflag(lastot->flags, F_GEM, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_WHITE, '*', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_AQUA, '*', NA, NULL); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, ""); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_STOMACH, 100, RR_COMMON, ""); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, ""); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 250, NA, NA, NULL); addflag(lastot->flags, F_UNTOUCHED, B_TRUE, NA, NA, NULL); // for god of thieves @@ -3011,6 +3039,7 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_STOMACH, 100, RR_COMMON, ""); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, ""); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 15, NA, NA, NULL); addflag(lastot->flags, F_UNTOUCHED, B_TRUE, NA, NA, NULL); // for god of thieves @@ -3022,17 +3051,19 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_STOMACH, 100, RR_UNCOMMON, ""); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, ""); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 1000, NA, NA, NULL); addflag(lastot->flags, F_UNTOUCHED, B_TRUE, NA, NA, NULL); // for god of thieves addot(OT_EMERALD, "emerald", "A deep green gem.", MT_STONE, 0.2, OC_ROCK, SZ_TINY); addflag(lastot->flags, F_GEM, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_GREEN, '*', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKGREEN, '*', NA, NULL); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_VERYRARE, ""); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_STOMACH, 100, RR_UNCOMMON, ""); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, ""); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 650, NA, NA, NULL); addflag(lastot->flags, F_UNTOUCHED, B_TRUE, NA, NA, NULL); // for god of thieves @@ -3044,17 +3075,19 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_STOMACH, 100, RR_COMMON, ""); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, ""); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 70, NA, NA, NULL); addflag(lastot->flags, F_UNTOUCHED, B_TRUE, NA, NA, NULL); // for god of thieves addot(OT_PEARL, "pearl", "A small pinkish-white gem.", MT_STONE, 0.1, OC_ROCK, SZ_TINY); addflag(lastot->flags, F_GEM, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_WHITE, '*', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_FLESH, '*', NA, NULL); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, ""); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_STOMACH, 100, RR_COMMON, ""); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, ""); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 30, NA, NA, NULL); addflag(lastot->flags, F_UNTOUCHED, B_TRUE, NA, NA, NULL); // for god of thieves @@ -3066,17 +3099,19 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_STOMACH, 100, RR_COMMON, ""); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, ""); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 110, NA, NA, NULL); addflag(lastot->flags, F_UNTOUCHED, B_TRUE, NA, NA, NULL); // for god of thieves addot(OT_SAPPHIRE, "sapphire", "A brilliant blue gem.", MT_STONE, 0.2, OC_ROCK, SZ_TINY); addflag(lastot->flags, F_GEM, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_CYAN, '*', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKBLUE, '*', NA, NULL); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_VERYRARE, ""); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_STOMACH, 100, RR_UNCOMMON, ""); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, ""); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 850, NA, NA, NULL); addflag(lastot->flags, F_UNTOUCHED, B_TRUE, NA, NA, NULL); // for god of thieves @@ -3088,12 +3123,13 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_STOMACH, 100, RR_COMMON, ""); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, ""); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 60, NA, NA, NULL); addflag(lastot->flags, F_UNTOUCHED, B_TRUE, NA, NA, NULL); // for god of thieves addot(OT_ASH, "pile of ash", "A pile of ash.", MT_STONE, 0.1, OC_ROCK, SZ_TINY); - addflag(lastot->flags, F_GLYPH, NA, ',', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKGREY, ',', NA, NULL); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, ""); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_COMMON, NULL); @@ -3155,7 +3191,8 @@ void initobjects(void) { addflag(lastot->flags, F_HOLDCONFER, F_DETECTAURAS, B_TRUE, NA, NULL); addflag(lastot->flags, F_HOLDCONFER, F_DETECTMAGIC, B_TRUE, NA, NULL); addflag(lastot->flags, F_VALUE, 1000, NA, NA, NULL); - addflag(lastot->flags, F_RARITY, H_DUNGEON, 50, RR_VERYRARE, NULL); + addflag(lastot->flags, F_RARITY, H_DUNGEON, NA, RR_VERYRARE, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_VERYRARE, NULL); // godstones addot(OT_GODSTONE_DESTRUCTION, "Hammer of Destruction", "An ancient artifact representing the power of anger.", MT_STONE, 3, OC_GODSTONE, SZ_SMALL); addflag(lastot->flags, F_GLYPH, C_RED, ')', NA, NULL); @@ -3258,7 +3295,7 @@ void initobjects(void) { addot(OT_FLOWER, "flower", "A colourful woodland flower.", MT_PLANT, 0.01, OC_FLORA, SZ_TINY); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_FREQUENT, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); - addflag(lastot->flags, F_GLYPH, C_MAGENTA, ',', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_PINK, ',', NA, NULL); addflag(lastot->flags, F_NUMAPPEAR, 1, 10, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DTVULN, DT_FIRE, NA, NA, "3d6"); @@ -3267,7 +3304,7 @@ void initobjects(void) { addot(OT_LEAF, "leaf", "A fallen leaf from a tree.", MT_PLANT, 0.01, OC_FLORA, SZ_TINY); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_FREQUENT, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); - addflag(lastot->flags, F_GLYPH, C_BROWN, ',', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKGREEN, ',', NA, NULL); addflag(lastot->flags, F_NUMAPPEAR, 1, 10, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DTVULN, DT_FIRE, NA, NA, "3d6"); @@ -3325,7 +3362,7 @@ void initobjects(void) { // food addot(OT_APPLE, "apple", "A crunchy apple.", MT_FOOD, 0.5, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_GREEN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTGREEN, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 40, NA, ""); addflag(lastot->flags, F_BRUISABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_COMMON, NULL); @@ -3346,7 +3383,7 @@ void initobjects(void) { addflag(lastot->flags, F_SLIPPERY, 85, NA, NA, NULL); addflag(lastot->flags, F_SLIPMOVE, 15, NA, NA, NULL); addot(OT_BERRY, "berry", "Juicy, brightly coloured berries.", MT_FOOD, 0.1, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_ORANGE, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTRED, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 8, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 100, NA, NULL); @@ -3354,18 +3391,18 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, NULL); addflag(lastot->flags, F_NUMAPPEAR, 1, 15, NA, ""); addot(OT_BREADFRESH, "loaf of fresh bread", "A freshly-baked loaf of bread.", MT_FOOD, 0.5, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_BROWN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTBROWN, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 180, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, NULL); addflag(lastot->flags, F_DTCONVERT, DT_FIRE, NA, NA, "loaf of toast"); addflag(lastot->flags, F_FEELTEXT, NA, NA, NA, "some bread"); addot(OT_TOAST, "loaf of toast", "A freshly-toasted loaf of bread.", MT_FOOD, 0.5, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_BROWN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTBROWN, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 250, NA, ""); addflag(lastot->flags, F_FEELTEXT, NA, NA, NA, "some bread"); addot(OT_BREADGARLIC, "loaf of garlic bread", "A pungent loaf of garlic bread. Nauseates those around you and restores some health.", MT_FOOD, 0.5, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_BROWN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKYELLOW, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 100, NA, ""); addflag(lastot->flags, F_EATCONFER, F_STENCH, 1, 1, "100"); addflag(lastot->flags, F_FEELTEXT, NA, NA, NA, "some bread"); @@ -3379,12 +3416,12 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, NULL); addot(OT_CHOCOLATE, "block of chocolate", "An entire block of chocolate.", MT_FOOD, 0.5, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_BROWN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKBROWN, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 250, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, NULL); addot(OT_CLOVER, "four leafed clover", "A rare 4-leafed clover.", MT_FOOD, 0.1, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_GREEN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKGREEN, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 5, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_VERYRARE, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_VERYRARE, NULL); @@ -3393,12 +3430,12 @@ void initobjects(void) { addflag(lastot->flags, F_GROWSTO, OT_SHRUB, VT_OB, NA, NULL); killflagsofid(lastot->flags, F_STACKABLE); addot(OT_CURADOUGH, "loaf of curadough", "This very rare form of bread can magically heal whoever eats it, as well as lowering their metabolism for a short period afterwards.", MT_FOOD, 0.5, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_YELLOW, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTYELLOW, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 250, NA, ""); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_VERYRARE, NULL); addflag(lastot->flags, F_FEELTEXT, NA, NA, NA, "some bread"); addot(OT_BREADSTALE, "loaf of stale bread", "A small loaf of old, stale bread.", MT_FOOD, 0.5, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_BROWN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTBROWN, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 100, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, NULL); @@ -3416,7 +3453,7 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, NULL); addot(OT_GARLIC, "clove of garlic", "A very pungent clove of raw garlic. ", MT_FOOD, 0.1, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_BROWN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_FLESH, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 5, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL); @@ -3429,10 +3466,11 @@ void initobjects(void) { addflag(lastot->flags, F_EDIBLE, B_TRUE, 80, NA, ""); addflag(lastot->flags, F_ISMEAT, B_TRUE, 80, NA, ""); addot(OT_JERKY, "jerky", "Salted animal flesh. Lightweight and filling.", MT_FOOD, 0.5, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_BROWN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKBROWN, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 90, NA, ""); addflag(lastot->flags, F_ISMEAT, B_TRUE, 80, NA, ""); addot(OT_MUSHROOMSHI, "shiitake mushroom", "A large brown mushroom.", MT_FOOD, 0.05, OC_FOOD, SZ_TINY); + addflag(lastot->flags, F_GLYPH, C_BONE, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 30, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 90, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_FREQUENT, NULL); @@ -3442,6 +3480,7 @@ void initobjects(void) { addflag(lastot->flags, F_NUMAPPEAR, 1, 3, NA, ""); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "mushroom"); addot(OT_MUSHROOMTOAD, "toadstool", "A poisonous variety of mushroom.", MT_FOOD, 0.05, OC_FOOD, SZ_TINY); + addflag(lastot->flags, F_GLYPH, C_BONE, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 50, NA, NULL); addflag(lastot->flags, F_TAINTED, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 90, RR_COMMON, NULL); @@ -3453,8 +3492,8 @@ void initobjects(void) { addflag(lastot->flags, F_NUMAPPEAR, 1, 3, NA, ""); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "mushroom"); - addot(OT_MUSHROOMGREY, "greycap", "A strange mushroom with a greyish-white tip.", MT_FOOD, 0.05, OC_FOOD, SZ_TINY); + addflag(lastot->flags, F_GLYPH, C_BONE, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 50, NA, NULL); addflag(lastot->flags, F_TAINTED, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 90, RR_UNCOMMON, NULL); @@ -3467,8 +3506,10 @@ void initobjects(void) { addot(OT_MUSHROOMSTUFFED, "stuffed mushroom", "A large brown mushroom stuffed with breadcrumbs. This healthy food slightly increases your maximum hit points..", MT_FOOD, 0.1, OC_FOOD, SZ_TINY); addflag(lastot->flags, F_EDIBLE, B_TRUE, 30, NA, ""); + addflag(lastot->flags, F_GLYPH, C_BONE, '%', NA, NULL); + addot(OT_NUT, "peanut", "A species in the legume family.", MT_FOOD, 0.1, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_BROWN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKYELLOW, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 22, NA, ""); addflag(lastot->flags, F_RARITY, H_FOREST, 90, NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 90, NA, NULL); @@ -3476,7 +3517,7 @@ void initobjects(void) { addflag(lastot->flags, F_NUMAPPEAR, 1, 12, NA, ""); addflag(lastot->flags, F_GROWSTO, OT_TREE, VT_OB, NA, NULL); addot(OT_ONION, "onion", "An edible bulb, known for its irritant effects on the eyes.", MT_FOOD, 0.2, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_BROWN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WHITE, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 60, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_UNCOMMON, NULL); @@ -3502,17 +3543,17 @@ void initobjects(void) { addflag(lastot->flags, F_VENOMSAC, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, NULL); addot(OT_PSITRUFFLE, "psitruffle", "Psitruffles are extremely rare forms of truffle which can unlock potentials within a living brain. Eating one will double all experience earned for a short period thereafter.", MT_FOOD, 0.5, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_MAGENTA, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTMAGENTA, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 250, NA, ""); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_VERYRARE, NULL); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_RARE, NULL); addot(OT_ROASTMEAT, "chunk of roast meat", "A chunk of flame-roasted flesh.", MT_FLESH, 1, OC_FOOD, SZ_TINY); // weight normally comes from corpse type - addflag(lastot->flags, F_GLYPH, C_BROWN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKBROWN, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 100, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_ISMEAT, B_TRUE, 80, NA, ""); addot(OT_RUMBALL, "rum ball", "A rum-filled ball of chocolate. Cures pain and restores 5-10 hit points.", MT_FOOD, 0.1, OC_FOOD, SZ_TINY); // weight normally comes from corpse type - addflag(lastot->flags, F_GLYPH, C_BROWN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKBROWN, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 100, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, NULL); addot(OT_SALT, "pinch of salt", "A small measure of salt. Used for cooking.", MT_FOOD, 0.1, OC_FOOD, SZ_TINY); @@ -3523,10 +3564,10 @@ void initobjects(void) { addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_COMMON, NULL); addot(OT_SANDWICHCHEESE, "cheese sandwich", "A tasty cheese sandwich. Filling, and restores all stamina plus some health.", MT_FOOD, 0.1, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_WHITE, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTBROWN, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 100, NA, ""); addot(OT_SANDWICHPB, "peanut butter sandwich", "An extremely filling sandwich. Restores all stamina, boosts Fitness, and restores some health.", MT_FOOD, 0.1, OC_FOOD, SZ_TINY); - addflag(lastot->flags, F_GLYPH, C_WHITE, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTBROWN, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 200, NA, ""); addot(OT_SUGAR, "lump of sugar", "A small block of sugar. Used for cooking.", MT_FOOD, 0.1, OC_FOOD, SZ_TINY); addflag(lastot->flags, F_GLYPH, C_WHITE, '%', NA, NULL); @@ -3547,11 +3588,12 @@ void initobjects(void) { //addflag(lastot->flags, F_EDIBLE, B_TRUE, 1, NA, NULL); // will be overridden addflag(lastot->flags, F_ISMEAT, B_TRUE, 80, NA, ""); addot(OT_FLESHCHUNK, "chunk of flesh", "A chunk of flesh from something.", MT_FLESH, 1, OC_FOOD, SZ_SMALL); - addflag(lastot->flags, F_GLYPH, C_BROWN, '%', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_FLESH, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 25, NA, NULL); addflag(lastot->flags, F_ISMEAT, B_TRUE, 80, NA, ""); addflag(lastot->flags, F_RARITY, H_ANTNEST, 100, RR_COMMON, NULL); addot(OT_FINGER, "severed finger", "The severed finger from some kind of creature.", MT_FLESH, 0.02, OC_CORPSE, SZ_TINY); + addflag(lastot->flags, F_GLYPH, C_FLESH, '%', NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 1, NA, NULL); addflag(lastot->flags, F_ISMEAT, B_TRUE, 80, NA, ""); @@ -4421,17 +4463,13 @@ void initobjects(void) { addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_FALSE, LOF_NEED, NA, NULL); addflag(lastot->flags, F_PLEASESGOD, R_GODFIRE, 2, NA, NULL); - addot(OT_S_BURNINGFEET, "hotfoot", "Heats the soles of the target's feet to an uncomfortable level, dealing 1 fire damage each turn they remain still.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "If the target is wearing metal footwear, damage is inceased to 2 per turn."); - addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines its duration (maximum 6 turns)."); + addot(OT_S_HEATWAVE, "heatwave", "Creates an area of oppressive heat, the size of which is determined by the spell's power.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_SPELLSCHOOL, SS_FIRE, NA, NA, NULL); + addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); + addflag(lastot->flags, F_MAXPOWER, 4, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); - addflag(lastot->flags, F_RANGE, 3, NA, NA, NULL); - addflag(lastot->flags, F_SPELLLEVEL, 1, NA, NA, NULL); - addflag(lastot->flags, F_MAXPOWER, 3, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); - addflag(lastot->flags, F_PLEASESGOD, R_GODFIRE, 1, NA, NULL); addot(OT_S_IMMOLATE, "immolate", "If the caster can successfully touch the target, they are instantly engulfed in flames.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_SPELLSCHOOL, SS_FIRE, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); @@ -4457,6 +4495,17 @@ void initobjects(void) { addflag(lastot->flags, F_TARGETTEDSPELL, TT_ALLY, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); // l3 + addot(OT_S_BURNINGFEET, "hotfoot", "Heats the soles of the target's feet to an uncomfortable level, dealing 1 fire damage each turn they remain still.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "If the target is wearing metal footwear, damage is inceased to 2 per turn."); + addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines its duration (maximum 6 turns)."); + addflag(lastot->flags, F_SPELLSCHOOL, SS_FIRE, NA, NA, NULL); + addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); + addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); + addflag(lastot->flags, F_RANGE, 3, NA, NA, NULL); + addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL); + addflag(lastot->flags, F_MAXPOWER, 3, NA, NA, NULL); + addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); + addflag(lastot->flags, F_PLEASESGOD, R_GODFIRE, 1, NA, NULL); addot(OT_S_NEGATEFIRE, "negate fire", "Renders the caster immune to the damaging effects of fire.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL); addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); @@ -4542,7 +4591,7 @@ void initobjects(void) { addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); addot(OT_S_GLACIATE, "glaciate", "Slows down molecules in a given area, instantly freezing any water present. Has no effect on living creatures.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_SPELLSCHOOL, SS_COLD, NA, NA, NULL); - addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); + addflag(lastot->flags, F_MAXPOWER, 2, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 1, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); @@ -4633,6 +4682,13 @@ void initobjects(void) { addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOFLEE, ST_SELF, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); + addot(OT_S_COLDSNAP, "cold snap", "An enhanced version of Glaciate which creates a large area of coldness.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addflag(lastot->flags, F_SPELLSCHOOL, SS_COLD, NA, NA, NULL); + addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL); + addflag(lastot->flags, F_MAXPOWER, 4, NA, NA, NULL); + addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); + addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); + addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); // l4 addot(OT_S_FROSTBITE, "frostbite", "Deals 1d4 cold damage to target creature per exposed body part.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_SPELLSCHOOL, SS_COLD, NA, NA, NULL); @@ -5850,11 +5906,13 @@ void initobjects(void) { //addflag(lastot->flags, F_OPERNEEDTARGET, TT_NONE, NA, NA, NULL); addot(OT_WAND_COLD, "wand of cold", "A limited-use magical wand which casts the imbued spell.", MT_DRAGONWOOD, 0.5, OC_WAND, SZ_SMALL); addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_UNCOMMON, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastot->flags, F_LINKSPELL, OT_S_COLDRAY, NA, NA, NULL); addflag(lastot->flags, F_OPERNEEDTARGET, TT_MONSTER, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); addot(OT_WAND_FIRE, "wand of fire", "A limited-use magical wand which casts the imbued spell.", MT_DRAGONWOOD, 0.5, OC_WAND, SZ_SMALL); addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_UNCOMMON, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_VERYRARE, NULL); addflag(lastot->flags, F_LINKSPELL, OT_S_FIREDART, NA, NA, NULL); addflag(lastot->flags, F_OPERNEEDTARGET, TT_MONSTER, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); @@ -5885,6 +5943,7 @@ void initobjects(void) { addflag(lastot->flags, F_AIFLEEITEM, B_TRUE, NA, NA, NULL); addot(OT_WAND_FIREBALL, "wand of fireball", "A limited-use magical wand which casts the imbued spell.", MT_DRAGONWOOD, 0.5, OC_WAND, SZ_SMALL); addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_RARE, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_VERYRARE, NULL); addflag(lastot->flags, F_LINKSPELL, OT_S_FIREBALL, NA, NA, NULL); addflag(lastot->flags, F_OPERNEEDTARGET, TT_MONSTER, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); @@ -5906,7 +5965,7 @@ void initobjects(void) { // tools - unique addot(OT_ORBDUNGEONEXIT, "dungeon exit orb", "When operated, this magical key will disable the barriers around the dungeon exit stairs.", MT_STONE, 2, OC_TOOLS, SZ_SMALL); - addflag(lastot->flags, F_GLYPH, C_MAGENTA, '[', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTMAGENTA, '[', NA, NULL); addflag(lastot->flags, F_UNIQUE, NA, NA, NA, NULL); addflag(lastot->flags, F_THE, NA, NA, NA, NULL); addflag(lastot->flags, F_INVULNERABLE, B_TRUE, NA, NA, NULL); @@ -5914,14 +5973,14 @@ void initobjects(void) { addflag(lastot->flags, F_OPERWITHOUTHANDS, B_TRUE, NA, NA, NULL); addot(OT_KEYIRON, "ancient iron key", "An ancient key made from iron. It looks important.", MT_METAL, 2, OC_TOOLS, SZ_SMALL); - addflag(lastot->flags, F_GLYPH, C_GREY, '[', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_METAL, '[', NA, NULL); addflag(lastot->flags, F_UNIQUE, NA, NA, NA, NULL); addflag(lastot->flags, F_INVULNERABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_VAULTKEY, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL); addot(OT_KEYMOSS, "ancient mossy key", "An ancient key covered with moss. It looks important.", MT_METAL, 2, OC_TOOLS, SZ_SMALL); - addflag(lastot->flags, F_GLYPH, C_GREEN, '[', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_MOSS, '[', NA, NULL); addflag(lastot->flags, F_UNIQUE, NA, NA, NA, NULL); addflag(lastot->flags, F_INVULNERABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_VAULTKEY, B_TRUE, NA, NA, NULL); @@ -5944,6 +6003,7 @@ void initobjects(void) { addot(OT_BLANKET, "wool blanket", "A warm wool blanket for those cold winter nights.", MT_CLOTH, 2, OC_TOOLS, SZ_MEDIUM); addflag(lastot->flags, F_RARITY, H_ALL, 80, NA, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastot->flags, F_VALUE, 50, NA, NA, NULL); addflag(lastot->flags, F_HELPSREST, 15, NA, NA, NULL); @@ -6067,16 +6127,23 @@ void initobjects(void) { addot(OT_PICKAXE, "pickaxe", "A heavy tool for breaking rock.", MT_METAL, 8, OC_TOOLS, SZ_MEDIUM); addflag(lastot->flags, F_RARITY, H_DUNGEON, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, NA, RR_COMMON, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastot->flags, F_VALUE, 75, NA, NA, NULL); addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_HELPSDIG, 10, NA, NA, NULL); + addflag(lastot->flags, F_DIGCELLMAT, MT_DIRT, NA, NA, NULL); + addflag(lastot->flags, F_DIGCELLMAT, MT_STONE, NA, NA, NULL); + addflag(lastot->flags, F_DIGCELLMAT, MT_WOOD, NA, NA, NULL); + addflag(lastot->flags, F_DIGCELLMAT, MT_ICE, NA, NA, NULL); + addflag(lastot->flags, F_DIGCELLMAT, MT_PLANT, NA, NA, NULL); addflag(lastot->flags, F_OPERSOUND, SV_SHOUT, NA, NA, "the sound of digging"); addot(OT_ROPE, "nylon rope", "A long length of strong rope.", MT_CLOTH, 5, OC_TOOLS, SZ_MEDIUM); - addflag(lastot->flags, F_GLYPH, C_BROWN, ']', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKYELLOW, ']', NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 75, NA, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 75, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, NA, RR_UNCOMMON, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastot->flags, F_VALUE, 35, NA, NA, NULL); addflag(lastot->flags, F_HELPSCLIMB, 15, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_WAIST, NA, NA, NULL); // ie. can wear it as a belt @@ -6087,7 +6154,7 @@ void initobjects(void) { addot(OT_SACK, "sack", "A small cloth sack.", MT_CLOTH, 0.5, OC_TOOLS, SZ_SMALL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL); addflag(lastot->flags, F_VALUE, 25, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_YELLOW, '(', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_BROWN, '(', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); @@ -6102,7 +6169,7 @@ void initobjects(void) { addot(OT_SACKLARGE, "large sack", "A large cloth sack.", MT_CLOTH, 1, OC_TOOLS, SZ_MEDIUM); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_VALUE, 50, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_YELLOW, '(', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_BROWN, '(', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 50, 50, NA, NULL); @@ -6119,7 +6186,7 @@ void initobjects(void) { addot(OT_SACKHUGE, "huge sack", "An enormous cloth sack.", MT_CLOTH, 1, OC_TOOLS, SZ_LARGE); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_RARE, NULL); addflag(lastot->flags, F_VALUE, 85, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_YELLOW, '(', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_BROWN, '(', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 50, 50, NA, NULL); @@ -6140,7 +6207,7 @@ void initobjects(void) { addot(OT_BAGOFHOLDING, "bag of holding", "A magical sack which causes items placed inside it to become weightless.", MT_CLOTH, 0.5, OC_TOOLS, SZ_SMALL); addflag(lastot->flags, F_RARITY, H_ALL, 80, RR_RARE, NULL); addflag(lastot->flags, F_VALUE, 150, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_YELLOW, '(', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_BROWN, '(', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OPERWITHOUTID, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOTRIED, B_TRUE, NA, NA, NULL); @@ -6156,7 +6223,7 @@ void initobjects(void) { addot(OT_BAGOFHOLDINGLARGE, "large bag of holding", "A large magical sack which causes items placed inside it to become weightless.", MT_CLOTH, 0.5, OC_TOOLS, SZ_MEDIUM); addflag(lastot->flags, F_RARITY, H_ALL, 80, RR_RARE, NULL); addflag(lastot->flags, F_VALUE, 220, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_YELLOW, '(', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_BROWN, '(', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OPERWITHOUTID, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOTRIED, B_TRUE, NA, NA, NULL); @@ -6174,7 +6241,7 @@ void initobjects(void) { addot(OT_BAGOFHOLDINGHUGE, "huge bag of holding", "An enormous magical sack which causes items placed inside it to become weightless.", MT_CLOTH, 0.5, OC_TOOLS, SZ_LARGE); addflag(lastot->flags, F_RARITY, H_ALL, 80, RR_VERYRARE, NULL); addflag(lastot->flags, F_VALUE, 300, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_YELLOW, '(', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_BROWN, '(', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OPERWITHOUTID, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOTRIED, B_TRUE, NA, NA, NULL); @@ -6196,7 +6263,7 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_DUNGEON, 77, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_VALUE, 150, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_YELLOW, '(', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_METAL, '(', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOSTEAL, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); @@ -6216,6 +6283,7 @@ void initobjects(void) { addflag(lastot->flags, F_VALUE, 45, NA, NA, NULL); addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_HELPSDIG, 5, NA, NA, NULL); + addflag(lastot->flags, F_DIGCELLMAT, MT_DIRT, NA, NA, NULL); addflag(lastot->flags, F_OPERSOUND, SV_SHOUT, NA, NA, "the sound of digging"); addot(OT_TORCH, "torch", "A metre-long wooden rod with a flammable end.", MT_WOOD, 2, OC_TOOLS, SZ_SMALL); @@ -6288,12 +6356,14 @@ void initobjects(void) { addot(OT_SLEEPINGBAG, "sleeping bag", "An insulated bag for sleeping in. Very comfortable.", MT_CLOTH, 2, OC_TECH, SZ_MEDIUM); addflag(lastot->flags, F_RARITY, H_ALL, 70, NA, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastot->flags, F_VALUE, 75, NA, NA, NULL); addflag(lastot->flags, F_HELPSREST, 30, NA, NA, NULL); // tech - l1 addot(OT_BUTANETORCH, "butane torch", "A cooking tool which creates an intensely hot flame using butane gas.", MT_METAL, 0.5, OC_TECH, SZ_TINY); addflag(lastot->flags, F_RARITY, H_ALL, 85, RR_UNCOMMON, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastot->flags, F_VALUE, 75, NA, NA, NULL); addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OPERUSECHARGE, B_TRUE, NA, NA, NULL); @@ -6361,6 +6431,7 @@ void initobjects(void) { addflag(lastot->flags, F_REPLENISHABLE, B_TRUE, NA, NA, NULL); addot(OT_TENT, "tent", "A easy to use, portable shelter made of fabric.", MT_CLOTH, 10, OC_TECH, SZ_HUMAN); addflag(lastot->flags, F_RARITY, H_ALL, 70, RR_RARE, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_VALUE, 150, NA, NA, NULL); addflag(lastot->flags, F_HELPSREST, 50, 1, NA, NULL); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL); @@ -6419,6 +6490,7 @@ void initobjects(void) { addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL); addot(OT_GRENADEICE, "dry ice grenade", "A specialised grenade which explodes into a cloud of absolute coldness.", MT_METAL, 1, OC_TECH, SZ_TINY); addflag(lastot->flags, F_RARITY, H_ALL, 90, RR_UNCOMMON, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_VALUE, 60, NA, NA, NULL); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL); @@ -6488,6 +6560,13 @@ void initobjects(void) { addflag(lastot->flags, F_VALUE, 100, NA, NA, NULL); addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_HELPSDIG, 25, NA, NA, NULL); + addflag(lastot->flags, F_DIGCELLMAT, MT_DIRT, NA, NA, NULL); + addflag(lastot->flags, F_DIGCELLMAT, MT_STONE, NA, NA, NULL); + addflag(lastot->flags, F_DIGCELLMAT, MT_WOOD, NA, NA, NULL); + addflag(lastot->flags, F_DIGCELLMAT, MT_ICE, NA, NA, NULL); + addflag(lastot->flags, F_DIGCELLMAT, MT_PLANT, NA, NA, NULL); + addflag(lastot->flags, F_DIGCELLMAT, MT_BRICK, NA, NA, NULL); + addflag(lastot->flags, F_DIGCELLMAT, MT_CRYSTAL, NA, NA, NULL); addflag(lastot->flags, F_TECHLEVEL, PR_BEGINNER, NA, NA, NULL); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OPERSOUND, SV_CAR, NA, NA, "the roar of a jackhammer"); @@ -6708,7 +6787,7 @@ void initobjects(void) { addot(OT_BONE, "bone", "A bone from an unknown creature.", MT_BONE, 0.1, OC_MISC, SZ_SMALL); addflag(lastot->flags, F_RARITY, H_ALL, 75, NA, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 90, NA, NULL); - addflag(lastot->flags, F_GLYPH, NA, ',', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_BONE, ',', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL); addot(OT_CHEST, "chest", "An iron treasure chest.", MT_METAL, 40, OC_FURNITURE, SZ_MEDIUM); @@ -6730,7 +6809,7 @@ void initobjects(void) { addflag(lastot->flags, F_STARTOBRND, 50, 5, NA, NULL); addot(OT_CHESTORNATE, "ornate chest", "An ornate golden treasure chest.", MT_GOLD, 80, OC_FURNITURE, SZ_MEDIUM); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_RARE, NULL); - addflag(lastot->flags, F_GLYPH, C_YELLOW, '(', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTYELLOW, '(', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); @@ -6773,8 +6852,10 @@ void initobjects(void) { addflag(lastot->flags, F_NOSHATTER, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 1, NA, NA, NULL); addot(OT_ICESHEET, "sheet of ice", "A large sheet of slippery ice.", MT_ICE, 0.5, OC_MISC, SZ_MEDIUM); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_FREQUENT, NULL); addflag(lastot->flags, F_STACKABLE, NA, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_TEMPMOD, -5, NA, NA, NULL); addflag(lastot->flags, F_GLYPH, C_WHITE, '_', NA, NULL); addflag(lastot->flags, F_DTCONVERT, DT_FIRE, NA, NA, "large puddle of water"); addflag(lastot->flags, F_DIECONVERT, NA, NA, NA, "large puddle of water"); @@ -6788,7 +6869,9 @@ void initobjects(void) { addflag(lastot->flags, F_GROWSTO, OT_ICICLE, VT_OB, NA, NULL); addflag(lastot->flags, F_SHRINKSTO, OT_ICECHUNK, VT_OB, NA, NULL); addot(OT_ICECHUNK, "chunk of ice", "A chunk of ice.", MT_ICE, 0.5, OC_MISC, SZ_SMALL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_FREQUENT, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 3, NA, NULL); + addflag(lastot->flags, F_TEMPMOD, -1, NA, NA, NULL); addflag(lastot->flags, F_STACKABLE, NA, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_GLYPH, NA, ',', NA, NULL); @@ -6832,7 +6915,7 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_SEWER, 100, RR_FREQUENT, NULL); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_GREEN, ',', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTGREEN, ',', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_SLIPPERY, 15, NA, NA, NULL); addflag(lastot->flags, F_DRINKABLE, B_TRUE, 0, NA, NULL); @@ -6887,7 +6970,7 @@ void initobjects(void) { addot(OT_SLIMEPOOL, "pool of slime", "A deep pool of foul-smelling slime.", MT_SLIME, 300, OC_TERRAIN, SZ_HUGE); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_GREEN, UNI_SOLID, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKGREEN, UNI_SOLID, NA, NULL); addflag(lastot->flags, F_STENCH, B_TRUE, 2, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DEEPWATER, DP_MAX, NA, NA, NULL); @@ -6897,7 +6980,7 @@ void initobjects(void) { addot(OT_SLIMEPUDDLE, "puddle of slime", "A disgusting mass of foul-smelling slime.", MT_SLIME, 20, OC_MISC, SZ_MEDIUM); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, NA, ',', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKGREEN, ',', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_EDIBLE, B_TRUE, 2, NA, NULL); addflag(lastot->flags, F_PURIFIESTO, OT_PUDDLEWATER, NA, NA, NULL); @@ -6905,7 +6988,7 @@ void initobjects(void) { addot(OT_PUDDLEOIL, "puddle of oil", "A slippery puddle of oil.", MT_OIL, 15, OC_MISC, SZ_SMALL); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_GREY, ',', NA, NULL); // should really be dark grey + addflag(lastot->flags, F_GLYPH, C_VDARKGREY, ',', NA, NULL); // should really be dark grey addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 70, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); @@ -7006,7 +7089,7 @@ void initobjects(void) { addot(OT_BLOODSTAIN, "blood stain", "A dried stain of blood.", MT_BLOOD, 0, OC_MISC, SZ_MINI); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_RED, ',', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKRED, ',', NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 60, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 60, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); @@ -7018,7 +7101,7 @@ void initobjects(void) { addot(OT_BLOODSPLASH, "splash of blood", "A small pool of blood.", MT_BLOOD, 0, OC_MISC, SZ_MINI); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, NA, ',', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKRED, ',', NA, NULL); addflag(lastot->flags, F_RARITY, H_VILLAGE, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 75, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 75, NA, NULL); @@ -7040,7 +7123,7 @@ void initobjects(void) { addot(OT_BLOODPOOL, "pool of blood", "A large pool of blood.", MT_BLOOD, 0, OC_MISC, SZ_SMALL); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, NA, '~', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKRED, '~', NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 65, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 65, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); @@ -7060,7 +7143,7 @@ void initobjects(void) { addot(OT_WOODPLANK, "plank of wood", "A large plank of heavy wood.", MT_WOOD, 25, OC_MISC, SZ_MEDIUM); addflag(lastot->flags, F_STACKABLE, NA, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_BROWN, '_', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, '_', NA, NULL); addflag(lastot->flags, F_DTCONVERT, DT_FIRE, NA, NA, "pile of ash"); addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_DTVULN, DT_BASH, NA, NA, NULL); @@ -7076,7 +7159,7 @@ void initobjects(void) { addot(OT_WOODSHARD, "shard of wood", "A small shard of wood.", MT_WOOD, 4, OC_MISC, SZ_MEDIUM); addflag(lastot->flags, F_STACKABLE, NA, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_BROWN, ',', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, ',', NA, NULL); addflag(lastot->flags, F_DTCONVERT, DT_FIRE, NA, NA, "pile of ash"); addflag(lastot->flags, F_OBHP, 4, 4, NA, NULL); addflag(lastot->flags, F_DTVULN, DT_BASH, NA, NA, NULL); @@ -7094,13 +7177,13 @@ void initobjects(void) { addot(OT_METALSHEET, "sheet of metal", "A large sheet of heavy metal.", MT_WOOD, 150, OC_MISC, SZ_LARGE); addflag(lastot->flags, F_STACKABLE, NA, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_GREY, '_', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_METAL, '_', NA, NULL); addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_GROWSTO, OT_DOORIRON, VT_OB, NA, NULL); addflag(lastot->flags, F_SHRINKSTO, OT_BULLET, VT_OB, NA, NULL); addot(OT_SIGN, "sign", "A marker with something written on it.", MT_WOOD, 25, OC_MISC, SZ_MEDIUM); - addflag(lastot->flags, F_GLYPH, C_BROWN, '|', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, '|', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); @@ -7110,7 +7193,7 @@ void initobjects(void) { // furniture addot(OT_ARMOURRACK, "armour rack", "An upright metal rack made for armour storage.", MT_METAL, 150, OC_FURNITURE, SZ_HUMAN); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL); - addflag(lastot->flags, F_GLYPH, C_GREY, '\\', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_METAL, '\\', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL); @@ -7122,7 +7205,7 @@ void initobjects(void) { addot(OT_BED, "wooden bed", "Standard sleep-enhancing apparatus.", MT_WOOD, 150, OC_FURNITURE, SZ_HUMAN); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL); - addflag(lastot->flags, F_GLYPH, C_BROWN, '_', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, '_', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_HELPSREST, 20, 1, NA, NULL); @@ -7140,7 +7223,7 @@ void initobjects(void) { addot(OT_BOOKSHELF, "bookshelf", "A set of wooden shelves, sized for book storage.", MT_WOOD, 150, OC_FURNITURE, SZ_HUMAN); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL); - addflag(lastot->flags, F_GLYPH, C_BROWN, '\\', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, '\\', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL); @@ -7185,7 +7268,7 @@ void initobjects(void) { addot(OT_COFFIN, "coffin", "A wooden coffin, made for holding the dead.", MT_WOOD, 100, OC_FURNITURE, SZ_HUMAN); addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, NULL); - addflag(lastot->flags, F_GLYPH, C_GREY, '|', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, '|', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_CONTAINER, B_TRUE, NA, NA, NULL); @@ -7211,7 +7294,7 @@ void initobjects(void) { addot(OT_WEAPONRACK, "weapon rack", "A large matel frame, made to store weapons.", MT_METAL, 150, OC_FURNITURE, SZ_HUMAN); addflag(lastot->flags, F_RARITY, H_ALL, 80, RR_UNCOMMON, NULL); - addflag(lastot->flags, F_GLYPH, C_GREY, '\\', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_METAL, '\\', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL); @@ -7223,7 +7306,7 @@ void initobjects(void) { addot(OT_WOODENBARREL, "wooden barrel", "A solid wooden barrel.", MT_WOOD, 40, OC_FURNITURE, SZ_HUMAN); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL); - addflag(lastot->flags, F_GLYPH, NA, '(', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, '(', NA, NULL); addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_LARGE, NA, NULL); addflag(lastot->flags, F_CRUSHABLE, SZ_HUGE, NA, NA, NULL); addflag(lastot->flags, F_PUSHABLE, B_TRUE, NA, NA, NULL); @@ -7246,7 +7329,7 @@ void initobjects(void) { addot(OT_WOODENTABLE, "wooden table", "A waist-height wooden table.", MT_WOOD, 25, OC_FURNITURE, SZ_HUMAN); addflag(lastot->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); - addflag(lastot->flags, F_GLYPH, C_BROWN, '\\', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, '\\', NA, NULL); addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_HUMAN, NA, NULL); addflag(lastot->flags, F_CLIMBOBSTACLE, 25, NA, NA, NULL); addflag(lastot->flags, F_CRUSHABLE, SZ_LARGE, NA, NA, NULL); @@ -7262,7 +7345,7 @@ void initobjects(void) { addot(OT_WOODENSTOOL, "wooden footstool", "A small, wooden footstool.", MT_WOOD, 20, OC_FURNITURE, SZ_MEDIUM); addflag(lastot->flags, F_RARITY, H_ALL, 83, RR_COMMON, NULL); - addflag(lastot->flags, F_GLYPH, NA, '\\', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WOOD, '\\', NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 4, 4, NA, NULL); @@ -7273,7 +7356,7 @@ void initobjects(void) { addot(OT_BARRICADE, "barricade", "A short barricade constructed of metal. Looks like you might able to climb over it.", MT_METAL, 200, OC_DFEATURE, SZ_HUMAN); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_RARE, NULL); - addflag(lastot->flags, F_GLYPH, C_WHITE, '\\', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_METAL, '\\', NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_HUMAN, NA, NULL); @@ -7319,8 +7402,19 @@ void initobjects(void) { // NOTE: must add F_TRAIL when creating this object. // effects + addot(OT_COLDNESS, "unnatural coldness", "An area of unnaturally cold air.", MT_NOTHING, 0, OC_MISC, SZ_MINI); + addflag(lastot->flags, F_INVISOB, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_NOGLYPH, NA, NA, NA, NULL); + addflag(lastot->flags, F_NOFEEL, NA, NA, NA, NULL); + //addflag(lastot->flags, F_TEMPMOD, -15, NA, NA, NULL); // this flag added by spell + addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); // overridden by spell + addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); + addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); + addot(OT_DUSTCLOUD, "large dust cloud", "A very thick cloud of dust particles.", MT_GAS, 0, OC_EFFECT, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, C_BROWN, UNI_SHADELIGHT, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKYELLOW, UNI_SHADELIGHT, NA, NULL); addflag(lastot->flags, F_NODIECONVERTTEXT, NA, NA, NA, NULL); addflag(lastot->flags, F_DIECONVERT, 1, NA, NA, "small dust cloud"); addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); @@ -7333,7 +7427,7 @@ void initobjects(void) { addflag(lastot->flags, F_SHRINKSTO, OT_STONE, VT_OB, NA, NULL); addot(OT_DUSTPUFF, "small dust cloud", "A small cloud of dust particles.", MT_GAS, 0, OC_EFFECT, SZ_MEDIUM); - addflag(lastot->flags, F_GLYPH, C_BROWN, UNI_SHADELIGHT, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_DARKYELLOW, UNI_SHADELIGHT, NA, NULL); addflag(lastot->flags, F_OBDIETEXT, B_TRUE, NA, NA, "disperses"); addflag(lastot->flags, F_OBHP, 2, 2, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); @@ -7347,6 +7441,7 @@ void initobjects(void) { addflag(lastot->flags, F_GLYPH, C_ORANGE, '}', NA, NULL); addflag(lastot->flags, F_DIECONVERTTEXT, NA, NA, NA, "dies down a little"); addflag(lastot->flags, F_DIECONVERT, NA, NA, NA, "medium fire"); + addflag(lastot->flags, F_TEMPMOD, 15, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); @@ -7363,6 +7458,7 @@ void initobjects(void) { addflag(lastot->flags, F_GLYPH, C_RED, '}', NA, NULL); addflag(lastot->flags, F_DIECONVERT, NA, NA, NA, "small fire"); addflag(lastot->flags, F_DIECONVERTTEXT, NA, NA, NA, "dies down a little"); + addflag(lastot->flags, F_TEMPMOD, 10, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); @@ -7378,6 +7474,7 @@ void initobjects(void) { addot(OT_FIRESMALL, "small fire", "A small blaze.", MT_FIRE, 0, OC_EFFECT, SZ_SMALL); addflag(lastot->flags, F_GLYPH, C_RED, '}', NA, NULL); addflag(lastot->flags, F_OBDIETEXT, B_TRUE, NA, NA, "goes out"); + addflag(lastot->flags, F_TEMPMOD, 5, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); @@ -7389,10 +7486,22 @@ void initobjects(void) { addflag(lastot->flags, F_GROWSTO, OT_FIREMED, VT_OB, NA, NULL); addflag(lastot->flags, F_GENERATES, 50, 0, B_INADJCELL, "puff of smoke"); + addot(OT_HEAT, "unnatural heat", "An area of unnaturally hot air.", MT_NOTHING, 0, OC_MISC, SZ_MINI); + addflag(lastot->flags, F_INVISOB, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_NOGLYPH, NA, NA, NA, NULL); + addflag(lastot->flags, F_NOFEEL, NA, NA, NA, NULL); + //addflag(lastot->flags, F_TEMPMOD, -15, NA, NA, NULL); // this flag added by spell + addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); // overridden by spell + addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); + addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); + addot(OT_STEAMCLOUD, "cloud of steam", "A thick cloud of scalding steam.", MT_GAS, 0, OC_EFFECT, SZ_HUMAN); - addflag(lastot->flags, F_GLYPH, C_WHITE, UNI_SHADEMED, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_FOG, UNI_SHADEMED, NA, NULL); addflag(lastot->flags, F_NODIECONVERTTEXT, NA, NA, NA, NULL); addflag(lastot->flags, F_DIECONVERT, 1, DT_ORTH, NA, "puff of steam"); + addflag(lastot->flags, F_TEMPMOD, 10, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); @@ -7402,8 +7511,9 @@ void initobjects(void) { addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, "!"); addot(OT_STEAMPUFF, "puff of steam", "A small puff of scalding steam.", MT_GAS, 0, OC_EFFECT, SZ_MEDIUM); - addflag(lastot->flags, F_GLYPH, C_WHITE, UNI_SHADELIGHT, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_FOG, UNI_SHADELIGHT, NA, NULL); addflag(lastot->flags, F_OBDIETEXT, B_TRUE, NA, NA, "disperses"); + addflag(lastot->flags, F_TEMPMOD, 5, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 2, 2, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); @@ -7415,6 +7525,7 @@ void initobjects(void) { addot(OT_SLEETSTORM, "storm of sleet", "An intense storm of sleet. Hampers movement and deals minor cold damage.", MT_GAS, 0, OC_EFFECT, SZ_LARGE); addflag(lastot->flags, F_GLYPH, C_CYAN, UNI_SHADEMED, NA, NULL); addflag(lastot->flags, F_NODIECONVERTTEXT, NA, NA, NA, NULL); + addflag(lastot->flags, F_TEMPMOD, -10, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); @@ -7432,7 +7543,8 @@ void initobjects(void) { addflag(lastot->flags, F_WALKDAMBP, BP_FEET, DT_WATER, NA, "1d2"); addot(OT_MIST, "thick mist", "A thick cloud of obscuring mist.", MT_GAS, 0, OC_EFFECT, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, NA, UNI_SHADELIGHT, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_FOG, UNI_SHADELIGHT, NA, NULL); + addflag(lastot->flags, F_TEMPMOD, -5, NA, NA, NULL); addflag(lastot->flags, F_OBDIETEXT, B_TRUE, NA, NA, "clears"); addflag(lastot->flags, F_OBHP, 4, 4, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); @@ -7443,7 +7555,7 @@ void initobjects(void) { addot(OT_SMOKECLOUD, "cloud of smoke", "A thick cloud of black smoke.", MT_GAS, 0, OC_EFFECT, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, C_GREY, UNI_SHADEMED, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_SMOKE, UNI_SHADEMED, NA, NULL); addflag(lastot->flags, F_NODIECONVERTTEXT, NA, NA, NA, NULL); addflag(lastot->flags, F_DIECONVERT, 1, DT_COMPASS, NA, "puff of smoke"); addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); @@ -7456,7 +7568,7 @@ void initobjects(void) { addflag(lastot->flags, F_OBMOVESRANDOMLY, NA, NA, NA, NULL); addot(OT_SMOKEPUFF, "puff of smoke", "A small puff of black smoke.", MT_GAS, 0, OC_EFFECT, SZ_MEDIUM); - addflag(lastot->flags, F_GLYPH, C_GREY, UNI_SHADELIGHT, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_SMOKE, UNI_SHADELIGHT, NA, NULL); addflag(lastot->flags, F_OBDIETEXT, B_TRUE, NA, NA, "disperses"); addflag(lastot->flags, F_OBHP, 2, 2, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); @@ -7468,7 +7580,7 @@ void initobjects(void) { addflag(lastot->flags, F_OBMOVESRANDOMLY, NA, NA, NA, NULL); addot(OT_POISONCLOUD, "cloud of poison gas", "A thick cloud of poisonous gas.", MT_GAS, 0, OC_EFFECT, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, C_GREEN, UNI_SHADEMED, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTGREEN, UNI_SHADEMED, NA, NULL); addflag(lastot->flags, F_DIECONVERTTEXT, NA, NA, NA, "thins out a little"); addflag(lastot->flags, F_DIECONVERT, 1, DT_COMPASS, NA, "puff of gas"); addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); @@ -7480,7 +7592,7 @@ void initobjects(void) { addflag(lastot->flags, F_BLOCKSVIEW, 2, NA, NA, NULL); addot(OT_POISONPUFF, "puff of poison gas", "A small puff of poisonous gas.", MT_GAS, 0, OC_EFFECT, SZ_MEDIUM); - addflag(lastot->flags, F_GLYPH, C_GREEN, UNI_SHADELIGHT, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTGREEN, UNI_SHADELIGHT, NA, NULL); addflag(lastot->flags, F_OBHP, 4, 4, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL); @@ -7500,8 +7612,9 @@ void initobjects(void) { addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, "!"); addot(OT_HAILSTORM, "hail storm", "An intense storm of damaging hail.", MT_GAS, 0, OC_EFFECT, SZ_LARGE); - addflag(lastot->flags, F_GLYPH, C_BOLDBLUE, UNI_SHADEMED, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_WHITE, UNI_SHADEMED, NA, NULL); addflag(lastot->flags, F_NODIECONVERTTEXT, NA, NA, NA, NULL); + addflag(lastot->flags, F_TEMPMOD, -15, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); addflag(lastot->flags, F_BLOCKSVIEW, 5, NA, NA, NULL); @@ -7519,7 +7632,8 @@ void initobjects(void) { addflag(lastot->flags, F_WALKDAMBP, BP_FEET, DT_WATER, NA, "1d2"); addot(OT_HURRICANE, "hurricane", "A massive column of devestating air currents.", MT_GAS, 0, OC_EFFECT, SZ_HUMAN); - addflag(lastot->flags, F_GLYPH, C_GREY, UNI_SPIRAL, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_FOG, UNI_SPIRAL, NA, NULL); + addflag(lastot->flags, F_TEMPMOD, -10, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 12, 12, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL); @@ -7531,6 +7645,7 @@ void initobjects(void) { addot(OT_ICEWALL, "wall of ice", "A wall made of solid ice.", MT_ICE, 0, OC_EFFECT, SZ_LARGE); addflag(lastot->flags, F_GLYPH, C_CYAN, '#', NA, NULL); + addflag(lastot->flags, F_TEMPMOD, -15, NA, NA, NULL); addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_MAX, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 100, 100, NA, NULL); @@ -7548,9 +7663,10 @@ void initobjects(void) { addflag(lastot->flags, F_PRODUCESLIGHT, 3, NA, NA, NULL); addot(OT_TORNADO, "tornado", "A large column of incredibly fast spinning air.", MT_GAS, 0, OC_EFFECT, SZ_HUMAN); - addflag(lastot->flags, F_GLYPH, C_GREY, UNI_SPIRAL, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_FOG, UNI_SPIRAL, NA, NULL); addflag(lastot->flags, F_OBHP, 8, 8, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); + addflag(lastot->flags, F_TEMPMOD, -10, NA, NA, NULL); addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); @@ -7600,7 +7716,8 @@ void initobjects(void) { addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, "!"); addot(OT_WHIRLWIND, "whirlwind", "A large column of very rapidly spinning air.", MT_GAS, 0, OC_EFFECT, SZ_HUMAN); - addflag(lastot->flags, F_GLYPH, C_GREY, UNI_SPIRAL, NA, NULL); + addflag(lastot->flags, F_GLYPH, C_FOG, UNI_SPIRAL, NA, NULL); + addflag(lastot->flags, F_TEMPMOD, -10, NA, NA, NULL); addflag(lastot->flags, F_OBHP, 4, 4, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL); @@ -7790,6 +7907,7 @@ void initobjects(void) { addflag(lastot->flags, F_HELPSREST, 5, NA, NA, NULL); addot(OT_CLOAKFUR, "fur cloak", "A warm and lightweight fur cloak, great for winter camping trips.", MT_FLESH, 3, OC_ARMOUR, SZ_MEDIUM); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_SHOULDERS, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); @@ -7960,6 +8078,7 @@ void initobjects(void) { addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addot(OT_BALACLAVA, "balaclava", "A form of cloth headgear that covers the whole head, exposing only the eyes. While it does not give much protection, its cloth will filter out poisonous particles.", MT_CLOTH, 1, OC_ARMOUR, SZ_SMALL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); @@ -8301,6 +8420,7 @@ void initobjects(void) { addflag(lastot->flags, F_VALUE, 350, NA, NA, NULL); addot(OT_RING_PROTCOLD, "ring of cold immunity", "Grants the caster complete immunity to cold.", MT_METAL, 0.1, OC_RING, SZ_MINI); addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, ""); + addflag(lastot->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_DTIMMUNE, DT_COLD, NA, NULL); addflag(lastot->flags, F_VALUE, 350, NA, NA, NULL); @@ -9418,7 +9538,7 @@ void initobjects(void) { addot(OT_WIZARDSTAFF, "neophyte staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN); addflag(lastot->flags, F_WIZSTAFF, NA, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_BROWN, ')', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTBROWN, ')', NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_RARE, NULL); addflag(lastot->flags, F_DAM, DT_BASH, 3, NA, NULL); @@ -9432,7 +9552,7 @@ void initobjects(void) { addot(OT_WIZARDSTAFF2, "enchanter staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN); addflag(lastot->flags, F_WIZSTAFF, NA, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_BROWN, ')', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTBROWN, ')', NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_RARE, NULL); addflag(lastot->flags, F_DAM, DT_BASH, 3, NA, NULL); @@ -9447,7 +9567,7 @@ void initobjects(void) { addot(OT_WIZARDSTAFF3, "sorcerer staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN); addflag(lastot->flags, F_WIZSTAFF, NA, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_BROWN, ')', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTBROWN, ')', NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_RARE, NULL); addflag(lastot->flags, F_DAM, DT_BASH, 3, NA, NULL); @@ -9461,7 +9581,7 @@ void initobjects(void) { addot(OT_WIZARDSTAFF4, "spellbinder staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN); addflag(lastot->flags, F_WIZSTAFF, NA, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_BROWN, ')', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTBROWN, ')', NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_VERYRARE, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_VERYRARE, NULL); addflag(lastot->flags, F_DAM, DT_BASH, 3, NA, NULL); @@ -9476,7 +9596,7 @@ void initobjects(void) { addot(OT_WIZARDSTAFF5, "warlock staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN); addflag(lastot->flags, F_WIZSTAFF, NA, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_BROWN, ')', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTBROWN, ')', NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_VERYRARE, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_VERYRARE, NULL); addflag(lastot->flags, F_DAM, DT_BASH, 3, NA, NULL); @@ -9491,7 +9611,7 @@ void initobjects(void) { addot(OT_WIZARDSTAFF6, "archmagi staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN); addflag(lastot->flags, F_WIZSTAFF, NA, NA, NA, NULL); - addflag(lastot->flags, F_GLYPH, C_BROWN, ')', NA, NULL); + addflag(lastot->flags, F_GLYPH, C_LIGHTBROWN, ')', NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_VERYRARE, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 100, RR_VERYRARE, NULL); addflag(lastot->flags, F_DAM, DT_BASH, 3, NA, NULL); @@ -9971,7 +10091,7 @@ void initrace(void) { // givebehaviour() will modify maxhp // unique monsters / bosses - addrace(R_CLANK, "Clank", 200, '@', C_GREY, MT_METAL, RC_ROBOT, "An oversized humanoid mech with razor sharp metal teeth."); + addrace(R_CLANK, "Clank", 200, '@', C_METAL, MT_METAL, RC_ROBOT, "An oversized humanoid mech with razor sharp metal teeth."); setbodytype(lastrace, BT_HUMANOID); setbodypartname(lastrace, BP_EARS, "audio sensors"); setbodypartname(lastrace, BP_EYES, "video sensors"); @@ -10189,7 +10309,7 @@ void initrace(void) { addflag(lastrace->flags, F_ABSORBKINETIC, 3, 5, DT_BASH, NULL); addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); - addrace(R_BABAYAGAHUT, "walking hut", 1000, '_', C_BROWN, MT_DRAGONWOOD, RC_MAGIC, "A small wooden cabin which walks around upon enormous chicken legs. It has a single doorway, lined with razor-sharp teeth."); + addrace(R_BABAYAGAHUT, "walking hut", 1000, '_', C_DARKBROWN, MT_DRAGONWOOD, RC_MAGIC, "A small wooden cabin which walks around upon enormous chicken legs. It has a single doorway, lined with razor-sharp teeth."); addbodypart(lastrace, BP_BODY, "walls"); addbodypart(lastrace, BP_LEGS, "legs"); addbodypart(lastrace, BP_FEET, "feet"); @@ -10225,7 +10345,7 @@ void initrace(void) { // races / monsters // playable races - addrace(R_HUMAN, "human", 75, '@', C_BROWN, MT_FLESH, RC_HUMANOID, "Your average example of the Homo Sapiens species."); + addrace(R_HUMAN, "human", 75, '@', C_FLESH, MT_FLESH, RC_HUMANOID, "Your average example of the Homo Sapiens species."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_PLAYABLE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_AVERAGE, NA, NULL); @@ -10295,7 +10415,7 @@ void initrace(void) { addflag(lastrace->flags, F_AVIAN, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_NONE, NA, NA, "gne"); - addrace(R_CYBORG, "cyborg", 150, '@', C_GREY, MT_FLESH, RC_HUMANOID, "A cyborg is a human with cybernetic implants grafted throughout their body. In most cases their body has been partially reconstructed from metal, with a thin later of skin outside to maintain a human appearance. Cyborgs are exceptionaly good with technology due to their computer-enhanced brain, but completely unable to use magic (for much the same reason)."); + addrace(R_CYBORG, "cyborg", 150, '@', C_METAL, MT_FLESH, RC_HUMANOID, "A cyborg is a human with cybernetic implants grafted throughout their body. In most cases their body has been partially reconstructed from metal, with a thin later of skin outside to maintain a human appearance. Cyborgs are exceptionaly good with technology due to their computer-enhanced brain, but completely unable to use magic (for much the same reason)."); setbodytype(lastrace, BT_HUMANOID); setbodypartname(lastrace, BP_EARS, "audio inputs"); setbodypartname(lastrace, BP_EYES, "video inputs"); @@ -10401,7 +10521,7 @@ void initrace(void) { addflag(lastrace->flags, F_ALIGNMENT, AL_NONE, NA, NA, "gne"); - addrace(R_DWARF, "delver", 60, 'h', C_BROWN, MT_FLESH, RC_HUMANOID, "Delvers are short, hardy creatures who generally spend their entire lives mining underground. As such they have great fitness and enhanced low-light vision, but generally lack great reasoning skills and magical ability."); + addrace(R_DWARF, "delver", 60, 'h', C_DARKYELLOW, MT_FLESH, RC_HUMANOID, "Delvers are short, hardy creatures who generally spend their entire lives mining underground. As such they have great fitness and enhanced low-light vision, but generally lack great reasoning skills and magical ability."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_PLAYABLE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_GTAVERAGE, NA, NULL); @@ -10439,7 +10559,7 @@ void initrace(void) { addflag(lastrace->flags, F_WANTSOBFLAG, F_GEM, NA, NA, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_NONE, NA, NA, "gne"); - addrace(R_FISHFOLK, "fishfolk", 75, 'h', C_BOLDBLUE, MT_FLESH, RC_HUMANOID, "Water-dwelling humanoids capable of breathing normally in both water and air."); + addrace(R_FISHFOLK, "fishfolk", 75, 'h', C_LIGHTBLUE, MT_FLESH, RC_HUMANOID, "Water-dwelling humanoids capable of breathing normally in both water and air."); setbodytype(lastrace, BT_HUMANOID); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_PLAYABLE, B_TRUE, NA, NA, NULL); @@ -10477,7 +10597,7 @@ void initrace(void) { f = addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 100); - addrace(R_LAVAX, "lavax", 90, 'h', C_RED, MT_FLESH, RC_HUMANOID, "The Lavax are a race of humanoid creatures who dwell in volcanic regions. Their skin has hardened into a clay-like substance, and is completely immune to the effects of heat or fire."); + addrace(R_LAVAX, "lavax", 90, 'h', C_LIGHTRED, MT_FLESH, RC_HUMANOID, "The Lavax are a race of humanoid creatures who dwell in volcanic regions. Their skin has hardened into a clay-like substance, and is completely immune to the effects of heat or fire."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_PLAYABLE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_RANDOM, NA, NULL); @@ -10511,7 +10631,7 @@ void initrace(void) { f = addflag(lastrace->flags, F_TR, 5, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 100); f = addflag(lastrace->flags, F_ARMOURRATING, 6, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 100); - addrace(R_ELF, "selnor", 60, '@', C_GREEN, MT_FLESH, RC_HUMANOID, "The Selnor race are slender, graceful beings around human-sized but far nimbler. They have high intelligence and magical affinity, but lack physical strength. The Selnor meditate instead of sleeping, thus maintaining basic awareness."); + addrace(R_ELF, "selnor", 60, '@', C_LIGHTGREEN, MT_FLESH, RC_HUMANOID, "The Selnor race are slender, graceful beings around human-sized but far nimbler. They have high intelligence and magical affinity, but lack physical strength. The Selnor meditate instead of sleeping, thus maintaining basic awareness."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_PLAYABLE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_LTAVERAGE, NA, NULL); @@ -10553,7 +10673,7 @@ void initrace(void) { addflag(lastrace->flags, F_TAMABLE, 125, NA, NA, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_NONE, NA, NA, "gne"); - addrace(R_ELFDARK, "vell", 70, '@', C_BLUE, MT_FLESH, RC_HUMANOID, "Vell are a dark subspecies of Selnor, exiled for their usage of death magic. The Vell reliance on necromantic arts has given them an aversion to all metals, but also rendered them stronger than their Selnor cousins."); + addrace(R_ELFDARK, "vell", 70, '@', C_DARKGREEN, MT_FLESH, RC_HUMANOID, "Vell are a dark subspecies of Selnor, exiled for their usage of death magic. The Vell reliance on necromantic arts has given them an aversion to all metals, but also rendered them stronger than their Selnor cousins."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_PLAYABLE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_AVERAGE, NA, NULL); @@ -10685,7 +10805,7 @@ void initrace(void) { // robots - addrace(R_ANDROID, "android", 150, 'R', C_GREEN, MT_METAL, RC_ROBOT, "Androids are robots contructed in the likeness of a human. Unlike cyborgs they contain no living tissue at all outside the brain."); + addrace(R_ANDROID, "android", 150, 'R', C_METAL, MT_METAL, RC_ROBOT, "Androids are robots contructed in the likeness of a human. Unlike cyborgs they contain no living tissue at all outside the brain."); setbodytype(lastrace, BT_HUMANOID); setbodypartname(lastrace, BP_EARS, "audio sensors"); setbodypartname(lastrace, BP_EYES, "video sensors"); @@ -10721,7 +10841,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTOBCLASS, 50, OC_TECH, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); - addrace(R_BOTRIOT, "riot bot", 90, 'b', C_BOLDBLUE, MT_METAL, RC_ROBOT, "Riot bots were created as unmanned crowd-control devices. They use water cannons, gas and electricity to repel violent protestors, and can protect themselves."); + addrace(R_BOTRIOT, "riot bot", 90, 'b', C_LIGHTBLUE, MT_METAL, RC_ROBOT, "Riot bots were created as unmanned crowd-control devices. They use water cannons, gas and electricity to repel violent protestors, and can protect themselves."); addbodypart(lastrace, BP_BODY, "central core"); addbodypart(lastrace, BP_EARS, "aural sensors"); addbodypart(lastrace, BP_EYES, "video sensors"); @@ -10755,7 +10875,7 @@ void initrace(void) { addflag(lastrace->flags, F_SKILLCHECKMOD, SC_SLIP, -30, NA, NULL); addflag(lastrace->flags, F_SKILLCHECKMOD, SC_FALL, -30, NA, NULL); - addrace(R_BOTSECURITY, "security bot", 90, 'b', C_BROWN, MT_METAL, RC_ROBOT, "One step up from droids, security bots are basic robotic constructs equipped with razor-sharp sawblades, and a protective force field."); + addrace(R_BOTSECURITY, "security bot", 90, 'b', C_LIGHTBLUE, MT_METAL, RC_ROBOT, "One step up from droids, security bots are basic robotic constructs equipped with razor-sharp sawblades, and a protective force field."); addbodypart(lastrace, BP_BODY, "central core"); addbodypart(lastrace, BP_EARS, "aural sensors"); addbodypart(lastrace, BP_EYES, "video sensors"); @@ -10817,7 +10937,7 @@ void initrace(void) { addflag(lastrace->flags, F_SKILLCHECKMOD, SC_SLIP, -30, NA, NULL); addflag(lastrace->flags, F_SKILLCHECKMOD, SC_FALL, -30, NA, NULL); - addrace(R_FLAMETURRET, "flame turret", 100, 'R', C_RED, MT_METAL, RC_ROBOT, "A motorised flamethrower mounted on an automated turntable."); + addrace(R_FLAMETURRET, "flame turret", 100, 'R', C_LIGHTRED, MT_METAL, RC_ROBOT, "A motorised flamethrower mounted on an automated turntable."); addbodypart(lastrace, BP_BODY, "central core"); addbodypart(lastrace, BP_EYES, "sensors"); addbodypart(lastrace, BP_FEET, "turntable"); @@ -10848,7 +10968,7 @@ void initrace(void) { addflag(lastrace->flags, F_SKILLCHECKMOD, SC_SLIP, -30, NA, NULL); addflag(lastrace->flags, F_SKILLCHECKMOD, SC_FALL, -30, NA, NULL); - addrace(R_HOVERSCOUT, "hoverscout", 100, 'b', C_CYAN, MT_METAL, RC_ROBOT, "An airborne drone constantly on the lookout for intruders. Hoverscouts are equipped with technology allowing them to teleport in backup units."); + addrace(R_HOVERSCOUT, "hoverscout", 100, 'b', C_LIGHTCYAN, MT_METAL, RC_ROBOT, "An airborne drone constantly on the lookout for intruders. Hoverscouts are equipped with technology allowing them to teleport in backup units."); addbodypart(lastrace, BP_BODY, "central core"); addbodypart(lastrace, BP_EARS, "aural sensors"); addbodypart(lastrace, BP_EYES, "video sensors"); @@ -10882,7 +11002,7 @@ void initrace(void) { addflag(lastrace->flags, F_SKILLCHECKMOD, SC_FALL, -30, NA, NULL); // human monsters... - addrace(R_BANDITLDR, "bandit leader", 75, '@', C_GREY, MT_FLESH, RC_HUMANOID, "Like a regular bandit, but bigger and stronger. Enough so to bully their followers into submission anyway."); + addrace(R_BANDITLDR, "bandit leader", 75, '@', C_FLESH, MT_FLESH, RC_HUMANOID, "Like a regular bandit, but bigger and stronger. Enough so to bully their followers into submission anyway."); lastrace->baseid = R_BANDIT; setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -10917,7 +11037,7 @@ void initrace(void) { addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MINIONS, 100, 1, 3, "bandit"); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_SKILLED, NA, NULL); - addrace(R_BANDIT, "bandit", 75, '@', C_GREY, MT_FLESH, RC_HUMANOID, "Bandits prey on travellers, demanding cash in exchange for not beating them to a pulp."); + addrace(R_BANDIT, "bandit", 75, '@', C_FLESH, MT_FLESH, RC_HUMANOID, "Bandits prey on travellers, demanding cash in exchange for not beating them to a pulp."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_UNCOMMON, NULL); @@ -10953,7 +11073,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTJOB, 15, J_WILDMAGE, NA, NULL); addflag(lastrace->flags, F_STARTJOB, 50, J_ROGUE, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_ADEPT, NA, NULL); - addrace(R_BEGGAR, "beggar", 50, '@', C_BROWN, MT_FLESH, RC_HUMANOID, "Beggar roam the streets of towns, pleading for any spare cash."); + addrace(R_BEGGAR, "beggar", 50, '@', C_DARKYELLOW, MT_FLESH, RC_HUMANOID, "Beggar roam the streets of towns, pleading for any spare cash."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_VERYRARE, NULL); addflag(lastrace->flags, F_RARITY, H_VILLAGE, NA, RR_UNCOMMON, NULL); @@ -10975,7 +11095,7 @@ void initrace(void) { addflag(lastrace->flags, F_RANDOMTALK, SP_BEG, SV_WHISPER, SV_TALK, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_DIURNAL, B_TRUE, NA, NA, NULL); - addrace(R_DRUNK, "drunkard", 90, '@', C_GREY, MT_FLESH, RC_HUMANOID, "A humon who has become hopelessly addicated to alcohol. They exist in a permenant state of inebriation."); + addrace(R_DRUNK, "drunkard", 90, '@', C_FLESH, MT_FLESH, RC_HUMANOID, "A humon who has become hopelessly addicated to alcohol. They exist in a permenant state of inebriation."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_RARITY, H_VILLAGE, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_UNCOMMON, NULL); @@ -11004,7 +11124,7 @@ void initrace(void) { addcondition(f, FC_NOCONDITION, 30); addaltval(f, F_DRUNK, 3, NA, NA, NULL); - addrace(R_PRISONER, "prisoner", 60, '@', C_GREY, MT_FLESH, RC_HUMANOID, "Somebody who has been improsioned."); + addrace(R_PRISONER, "prisoner", 60, '@', C_FLESH, MT_FLESH, RC_HUMANOID, "Somebody who has been improsioned."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_VARLEVEL, NA, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_LTAVERAGE, NA, NULL); @@ -11062,7 +11182,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_BEGINNER, NA, NULL); // gods - kep sorted alphabetically - addrace(R_GODPURITY, "Amberon", 90, '@', C_BOLDMAGENTA, MT_FLESH, RC_GOD, "Amberon appears as a shining statuesque humanoid with gold-hued skin. He represents Purity, Law and Justice."); + addrace(R_GODPURITY, "Amberon", 90, '@', C_LIGHTMAGENTA, MT_FLESH, RC_GOD, "Amberon appears as a shining statuesque humanoid with gold-hued skin. He represents Purity, Law and Justice."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_GOOD, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, NA, NA, "100"); @@ -11135,7 +11255,7 @@ void initrace(void) { addflag(lastrace->flags, F_GODTEXTAPPEAR, NA, NA, NA, "appears in a flash of power!"); addflag(lastrace->flags, F_GODDECLINE, NA, NA, NA, "So be it."); - addrace(R_GODBATTLE, "Bjorn", 300, '@', C_BOLDMAGENTA, MT_FLESH, RC_GOD, "Bjorn the Battlelord is the god of honourable combat. He appears as a heavily built, bearded warrior clad in well-used armour."); + addrace(R_GODBATTLE, "Bjorn", 300, '@', C_LIGHTMAGENTA, MT_FLESH, RC_GOD, "Bjorn the Battlelord is the god of honourable combat. He appears as a heavily built, bearded warrior clad in well-used armour."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_GOOD, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 95, NA, NA, ""); @@ -11198,7 +11318,7 @@ void initrace(void) { addflag(lastrace->flags, F_GODBONUS, PL_DELIGHTED, GB_FLAG, F_ACCURACYMOD, "15,NA,NA"); sprintf(buf, "%d,%d,3", DT_DIRECT, B_FALSE); addflag(lastrace->flags, F_GODBONUS, PL_DELIGHTED, GB_FLAG, F_EXTRADAM, buf); - addflag(lastrace->flags, F_GODBONUS, PL_ECSTATIC, GB_FLAG, F_HEAVYBLOW, "1,0,0"); + addflag(lastrace->flags, F_GODBONUS, PL_ECSTATIC, GB_FLAG, F_MINCRITCHANCE, "25,0,0"); addflag(lastrace->flags, F_GODBATTLE, NA, NA, NA, "restoring stamina"); addflag(lastrace->flags, F_GODBATTLE, NA, NA, NA, "enraging you"); @@ -11217,7 +11337,7 @@ void initrace(void) { addflag(lastrace->flags, F_GODTEXTAPPEAR, NA, NA, NA, "appears in a shower of blood!"); addflag(lastrace->flags, F_GODDECLINE, NA, NA, NA, "Coward!"); - addrace(R_GODNATURE, "Ekrub", 200, '@', C_BOLDMAGENTA, MT_FLESH, RC_GOD, "Ekrub is goddess of nature and creation. She appears as a female figure dressed in farming clothes. Ekrub has a burning hatred of all dragonkind, who she views as abhorrent due to their destructive nature."); + addrace(R_GODNATURE, "Ekrub", 200, '@', C_LIGHTMAGENTA, MT_FLESH, RC_GOD, "Ekrub is goddess of nature and creation. She appears as a female figure dressed in farming clothes. Ekrub has a burning hatred of all dragonkind, who she views as abhorrent due to their destructive nature."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_NEUTRAL, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 95, NA, NA, ""); @@ -11298,7 +11418,7 @@ void initrace(void) { addflag(lastrace->flags, F_GODTEXTAPPEAR, NA, NA, NA, "coalesces out of twisting air currents!"); addflag(lastrace->flags, F_GODDECLINE, NA, NA, NA, "Your choice is disappointing."); - addrace(R_GODTHIEVES, "Felix", 300, '@', C_BOLDMAGENTA, MT_FLESH, RC_GOD, "Felix is the god of Thieves, Revenge and Greed. He generally appears as an overweight glutton carrying his contraband loot around in huge sacks. Despite this, he is amazingly agile and is said to be able to steal one's soul right out of their body."); + addrace(R_GODTHIEVES, "Felix", 300, '@', C_LIGHTMAGENTA, MT_FLESH, RC_GOD, "Felix is the god of Thieves, Revenge and Greed. He generally appears as an overweight glutton carrying his contraband loot around in huge sacks. Despite this, he is amazingly agile and is said to be able to steal one's soul right out of their body."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_NEUTRAL, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, NA, NA, "75"); @@ -11373,7 +11493,7 @@ void initrace(void) { addflag(lastrace->flags, F_GODTEXTAPPEAR, NA, NA, NA, "steps out of the shadows."); addflag(lastrace->flags, F_GODDECLINE, NA, NA, NA, "You will come to your senses soon enough..."); - addrace(R_GODLIFE, "Glorana", 2, '@', C_BOLDMAGENTA, MT_FLESH, RC_GOD, "Glorana is the goddess of life. She appears as a pulsating orb of holy energy."); + addrace(R_GODLIFE, "Glorana", 2, '@', C_LIGHTMAGENTA, MT_FLESH, RC_GOD, "Glorana is the goddess of life. She appears as a pulsating orb of holy energy."); addbodypart(lastrace, BP_BODY, "life energy"); addflag(lastrace->flags, F_ALIGNMENT, AL_NEUTRAL, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 95, NA, NA, ""); @@ -11440,7 +11560,7 @@ void initrace(void) { addflag(lastrace->flags, F_GODTEXTAPPEAR, NA, NA, NA, "appears in a shaft of holy light."); addflag(lastrace->flags, F_GODDECLINE, NA, NA, NA, "I will, of course, respect your decision."); - addrace(R_GODDEATH, "Hecta", 100, '@', C_BOLDMAGENTA, MT_BONE, RC_GOD, "The skeletal god of Death is garbed in a cloak made of pure shadow. and weilds an enormous scythe."); + addrace(R_GODDEATH, "Hecta", 100, '@', C_LIGHTMAGENTA, MT_BONE, RC_GOD, "The skeletal god of Death is garbed in a cloak made of pure shadow. and weilds an enormous scythe."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, NA, NA, "80"); @@ -11507,7 +11627,7 @@ void initrace(void) { addflag(lastrace->flags, F_GODTEXTAPPEAR, NA, NA, NA, "rises up from the underworld!"); addflag(lastrace->flags, F_GODDECLINE, NA, NA, NA, "Foolish mortal!"); - addrace(R_GODFIRE, "Klikirak", 2, '@', C_BOLDMAGENTA, MT_FLESH, RC_GOD, "Klikirak is the burning god of Fire and Destruction. He is visible only as a raging inferno of fire, destroying anything in his path."); + addrace(R_GODFIRE, "Klikirak", 2, '@', C_LIGHTMAGENTA, MT_FLESH, RC_GOD, "Klikirak is the burning god of Fire and Destruction. He is visible only as a raging inferno of fire, destroying anything in his path."); addbodypart(lastrace, BP_BODY, "flames"); addflag(lastrace->flags, F_ALIGNMENT, AL_NEUTRAL, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 95, NA, NA, ""); @@ -11562,7 +11682,7 @@ void initrace(void) { addflag(lastrace->flags, F_GODTEXTAPPEAR, NA, NA, NA, "appears in a burst of white-hot fire!"); addflag(lastrace->flags, F_GODDECLINE, NA, NA, NA, "BURN ALONE THEN!"); - addrace(R_GODMAGIC, "Lumara", 55, '@', C_BOLDMAGENTA, MT_FLESH, RC_GOD, "Lumara is the goddess of magic. She appears as a slender elderly woman, her expression wise with age."); + addrace(R_GODMAGIC, "Lumara", 55, '@', C_LIGHTMAGENTA, MT_FLESH, RC_GOD, "Lumara is the goddess of magic. She appears as a slender elderly woman, her expression wise with age."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_GOOD, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 95, NA, NA, ""); @@ -11630,7 +11750,7 @@ void initrace(void) { addflag(lastrace->flags, F_GODTEXTAPPEAR, NA, NA, NA, "appears in a swirl of multicoloured lights!"); addflag(lastrace->flags, F_GODDECLINE, NA, NA, NA, "One will find arcane learning a difficult task on One's own."); - addrace(R_GODMERCY, "Yumi", 300, '@', C_BOLDMAGENTA, MT_FLESH, RC_GOD, "Yumi is the goddess of Mercy and Forgiveness. She has a calm, serene face and wears simple clothing."); + addrace(R_GODMERCY, "Yumi", 300, '@', C_LIGHTMAGENTA, MT_FLESH, RC_GOD, "Yumi is the goddess of Mercy and Forgiveness. She has a calm, serene face and wears simple clothing."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_GOOD, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 95, NA, NA, ""); @@ -11734,7 +11854,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_FILLPOT, OT_POT_LEVITATION, BLOODFORPOT, NA, NULL); - addrace(R_BOGGART, "bogle", 15, 'n', C_BROWN, MT_WOOD, RC_MAGIC, "An evil household fairy made of wood. They delight in sowing disease and misfortune."); + addrace(R_BOGGART, "bogle", 15, 'n', C_WOOD, MT_WOOD, RC_MAGIC, "An evil household fairy made of wood. They delight in sowing disease and misfortune."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_LOW, NA, NULL); @@ -11765,7 +11885,7 @@ void initrace(void) { addflag(lastrace->flags, F_AVOIDOBTYPE, OT_SALT, B_TRUE, NA, NULL); addflag(lastrace->flags, F_DEMANDSBRIBE, NA, NA, NA, "Give me gold!"); - addrace(R_BUGBEAR, "bugbear", 120, 'G', C_BROWN, MT_FLESH, RC_HUMANOID, "A huge goblinoid creature, similar to a hobgoblin but larger again, with a temperament to match."); + addrace(R_BUGBEAR, "bugbear", 120, 'G', C_DARKYELLOW, MT_FLESH, RC_HUMANOID, "A huge goblinoid creature, similar to a hobgoblin but larger again, with a temperament to match."); setbodytype(lastrace, BT_HUMANOID); setbodypartname(lastrace, BP_HANDS, "paws"); setbodypartname(lastrace, BP_RIGHTFINGER, "right foreclaw"); @@ -11804,7 +11924,7 @@ void initrace(void) { addflag(lastrace->flags, F_MINIONS, 20, 1, 3, "goblin warrior"); addflag(lastrace->flags, F_MORALE, 10, NA, NA, NULL); - addrace(R_CHIMERA, "chimera", 300, 'm', C_MAGENTA, MT_FLESH, RC_MAGIC, "A monstrous hybrid where a goat's rear has been magically attached to a lion's front. It has three heads - a goat's, a lion's and a wyrm's - and a pair of bat-like wings."); + addrace(R_CHIMERA, "chimera", 300, 'm', C_DARKMAGENTA, MT_FLESH, RC_MAGIC, "A monstrous hybrid where a goat's rear has been magically attached to a lion's front. It has three heads - a goat's, a lion's and a wyrm's - and a pair of bat-like wings."); setbodytype(lastrace, BT_QUADRAPED); setbodypartname(lastrace, BP_HEAD, "lion's head"); addbodypart(lastrace, BP_HEAD2, "dragon's head"); @@ -11855,7 +11975,7 @@ void initrace(void) { addflag(lastrace->flags, F_AVIAN, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_EATCONFER, F_MUTABLE, B_TRUE, NA, "100"); - addrace(R_CENTAUR, "centaur", 500, 'u', C_GREY, MT_FLESH, RC_ANIMAL, "Centaurs look like horses with their neck upwards replaced by a human torso and arms."); + addrace(R_CENTAUR, "centaur", 500, 'u', C_BROWN, MT_FLESH, RC_ANIMAL, "Centaurs look like horses with their neck upwards replaced by a human torso and arms."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_NEUTRAL, NA, NA, NULL); @@ -11924,7 +12044,7 @@ void initrace(void) { addflag(lastrace->flags, F_EATMUTATE, F_DTIMMUNE, DT_PETRIFY, NA, "50"); // special attack handled in attack.c - addrace(R_CREEPINGCLAW, "creeping claw", 3, 'x', C_YELLOW, MT_FLESH, RC_MAGIC, "A disembodied hand, animated by magic. Its favourite pastime is to leap onto unsuspecting victims and crush the life out of them."); + addrace(R_CREEPINGCLAW, "creeping claw", 3, 'x', C_FLESH, MT_FLESH, RC_MAGIC, "A disembodied hand, animated by magic. Its favourite pastime is to leap onto unsuspecting victims and crush the life out of them."); addbodypart(lastrace, BP_BODY, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -11950,7 +12070,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOFLEE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); - addrace(R_DARKMANTLE, "darklurk", 70, 'U', C_BLUE, MT_FLESH, RC_MAGIC, "A floating squid-like creature, rarely seen due to its ability to cloak itself in a magical darkness. They use their huge tentacles to grab then crush their unsuspecting prey."); + addrace(R_DARKMANTLE, "darklurk", 70, 'U', C_DARKBLUE, MT_FLESH, RC_MAGIC, "A floating squid-like creature, rarely seen due to its ability to cloak itself in a magical darkness. They use their huge tentacles to grab then crush their unsuspecting prey."); addbodypart(lastrace, BP_BODY, NULL); addbodypart(lastrace, BP_LEGS, "tentacles"); addflag(lastrace->flags, F_EXTRACORPSE, 100, NA, NA, "blue venom sac"); @@ -11991,7 +12111,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_NIGHTVISRANGEMOD, 1, NA, "75"); - addrace(R_DRYAD, "dryad", 65, 'p', C_BROWN, MT_WOOD, RC_MAGIC, "Dryads are gentle forest spirits. These peaceful creatures prefer the tranquility of nature, and will avoid fighting if possible."); + addrace(R_DRYAD, "dryad", 65, 'p', C_WOOD, MT_WOOD, RC_MAGIC, "Dryads are gentle forest spirits. These peaceful creatures prefer the tranquility of nature, and will avoid fighting if possible."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_GOOD, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -12153,7 +12273,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_FILLPOT, OT_POT_LEVITATION, BLOODFORPOT, NA, NULL); - addrace(R_TRICLOPS, "triclops", 160, 'H', C_BROWN, MT_FLESH, RC_HUMANOID, "The three-eyes triclops race are blessed with extraordiny perceptive and are nearly impossible to surprise. They commonly use their third eye to stun enemies, then finish them off with their huge weapons."); + addrace(R_TRICLOPS, "triclops", 160, 'H', C_DARKYELLOW, MT_FLESH, RC_HUMANOID, "The three-eyes triclops race are blessed with extraordiny perceptive and are nearly impossible to surprise. They commonly use their third eye to stun enemies, then finish them off with their huge weapons."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_UNCOMMON, NULL); @@ -12188,7 +12308,7 @@ void initrace(void) { addflag(lastrace->flags, F_MORALE, 10, NA, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_VISRANGEMOD, 1, NA, "50"); - addrace(R_TREANTYOUNG, "treant youngling", 500, 'T', C_BROWN, MT_WOOD, RC_HUMANOID, "Treants are huge living trees, with humanoid facial features visible on their trunks."); + addrace(R_TREANTYOUNG, "treant youngling", 500, 'T', C_WOOD, MT_WOOD, RC_HUMANOID, "Treants are huge living trees, with humanoid facial features visible on their trunks."); setbodytype(lastrace, BT_HUMANOID); setbodypartname(lastrace, BP_HEAD, "face"); setbodypartname(lastrace, BP_BODY, "trunk"); @@ -12272,7 +12392,7 @@ void initrace(void) { addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 20, NA, NA, NULL); - addrace(R_TREANTOLD, "treant elder", 900, 'T', C_BOLDGREEN, MT_WOOD, RC_HUMANOID, "Treants are huge living trees, with humanoid facial features visible on their trunks."); + addrace(R_TREANTOLD, "treant elder", 900, 'T', C_LIGHTGREEN, MT_WOOD, RC_HUMANOID, "Treants are huge living trees, with humanoid facial features visible on their trunks."); setbodytype(lastrace, BT_HUMANOID); setbodypartname(lastrace, BP_HEAD, "face"); setbodypartname(lastrace, BP_BODY, "trunk"); @@ -12496,7 +12616,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTJOB, 33, J_WARRIOR, NA, NULL); addflag(lastrace->flags, F_STARTJOB, 10, J_BERZERKER, NA, NULL); - addrace(R_GOBLIN, "goblin", 25, 'g', C_BROWN, MT_FLESH, RC_HUMANOID, "Small humanoids with flat faces, broad noses, pointed ears, and small, sharp fangs."); + addrace(R_GOBLIN, "goblin", 25, 'g', C_DARKYELLOW, MT_FLESH, RC_HUMANOID, "Small humanoids with flat faces, broad noses, pointed ears, and small, sharp fangs."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_FEIGNDEATH, NA, NA, NULL); @@ -12537,7 +12657,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTJOB, 5, J_NECROMANCER, NA, NULL); addflag(lastrace->flags, F_STARTJOB, 5, J_DEMONOLOGIST, NA, NULL); - addrace(R_GOBLINR, "froglin", 25, 'g', C_GREEN, MT_FLESH, RC_HUMANOID, "River goblins (more commonly known as 'froglins') are blueish goblins with sleek, leathery skin. They seems constantly wet, and can leap like a frog."); + addrace(R_GOBLINR, "froglin", 25, 'g', C_MOSS, MT_FLESH, RC_HUMANOID, "River goblins (more commonly known as 'froglins') are blueish goblins with sleek, leathery skin. They seems constantly wet, and can leap like a frog."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -12545,6 +12665,7 @@ void initrace(void) { addflag(lastrace->flags, F_RARITY, H_CAVE, 100, RR_COMMON, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, 80, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_RARITY, H_SWAMP, 100, RR_COMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, 100, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_BREATHWATER, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_AQUATIC, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SIZE, SZ_MEDIUM, NA, NA, NULL); @@ -12582,7 +12703,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 3, NA, NA, NULL); - addrace(R_GOBLINS, "dusur", 25, 'g', C_RED, MT_FLESH, RC_HUMANOID, "The red-skinned Dusur (or 'sand goblins') are tribal goblins commonly found in deserts or other sandy regions. They possess an uncanny level of stealth, seemingly able to meld into the very earth itself."); + addrace(R_GOBLINS, "dusur", 25, 'g', C_LIGHTRED, MT_FLESH, RC_HUMANOID, "The red-skinned Dusur (or 'sand goblins') are tribal goblins commonly found in deserts or other sandy regions. They possess an uncanny level of stealth, seemingly able to meld into the very earth itself."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -12626,7 +12747,7 @@ void initrace(void) { addflag(lastrace->flags, F_MORALE, 3, NA, NA, NULL); - addrace(R_GOBLINWAR, "goblin warlord", 30, 'g', C_BROWN, MT_FLESH, RC_HUMANOID, "Goblin Warriors are uncommon goblins with sufficient mental control to ungergo formal combat training (rather than just hack away mindlessly at their foes)."); + addrace(R_GOBLINWAR, "goblin warlord", 30, 'g', C_MAGENTA, MT_FLESH, RC_HUMANOID, "Goblin Warriors are uncommon goblins with sufficient mental control to ungergo formal combat training (rather than just hack away mindlessly at their foes)."); setbodytype(lastrace, BT_HUMANOID); lastrace->baseid = R_GOBLIN; addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -12663,7 +12784,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 5, NA, NA, NULL); - addrace(R_GOBLINSHOOTER, "goblin archer", 20, 'g', C_BROWN, MT_FLESH, RC_HUMANOID, "Deformed goblins born without claws become archers for their communities, pelting their enemies from afar with barrages of arrows."); + addrace(R_GOBLINSHOOTER, "goblin archer", 20, 'g', C_DARKYELLOW, MT_FLESH, RC_HUMANOID, "Deformed goblins born without claws become archers for their communities, pelting their enemies from afar with barrages of arrows."); setbodytype(lastrace, BT_HUMANOID); lastrace->baseid = R_GOBLIN; addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -12702,7 +12823,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 2, NA, NA, NULL); - addrace(R_GOBLINHEXER, "goblin witchdoctor", 20, 'g', C_BROWN, MT_FLESH, RC_HUMANOID, "When a goblin develops an affinity for magic, they become known as witchdoctor. Shamans aim to weaken their foes with hexs, providing easy kills for their comrades."); + addrace(R_GOBLINHEXER, "goblin witchdoctor", 20, 'g', C_DARKYELLOW, MT_FLESH, RC_HUMANOID, "When a goblin develops an affinity for magic, they become known as witchdoctor. Shamans aim to weaken their foes with hexs, providing easy kills for their comrades."); setbodytype(lastrace, BT_HUMANOID); lastrace->baseid = R_GOBLIN; addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -12742,7 +12863,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 0, NA, NA, NULL); - addrace(R_GOBLINKING, "goblin king", 40, 'g', C_MAGENTA, MT_FLESH, RC_HUMANOID, "On rare occasion a goblin becomes powerful enough to command respect from almost all their peers. Far from standard cowardly goblins, these self-crowned 'kings' are a force to be reckoned with."); + addrace(R_GOBLINKING, "goblin king", 40, 'g', C_LIGHTMAGENTA, MT_FLESH, RC_HUMANOID, "On rare occasion a goblin becomes powerful enough to command respect from almost all their peers. Far from standard cowardly goblins, these self-crowned 'kings' are a force to be reckoned with."); setbodytype(lastrace, BT_HUMANOID); lastrace->baseid = R_GOBLIN; addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -12779,7 +12900,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 10, NA, NA, NULL); - addrace(R_GREMLIN, "gremlin", 20, 'g', C_BOLDGREEN, MT_FLESH, RC_DEMON, "Small mischievous imps known for their love of sabotage."); + addrace(R_GREMLIN, "gremlin", 20, 'g', C_LIGHTGREEN, MT_FLESH, RC_DEMON, "Small mischievous imps known for their love of sabotage."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -12809,7 +12930,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANCAST, OT_S_GASEOUSFORM, NA, NA, "pw:1;"); // gremlins also cause tech to fail around them. - addrace(R_GRIFFON, "griffon", 220, 'f', C_YELLOW, MT_FLESH, RC_ANIMAL, "Griffons have a lion's body and the head, torso and forelegs of an eagle."); + addrace(R_GRIFFON, "griffon", 220, 'f', C_WHITE, MT_FLESH, RC_ANIMAL, "Griffons have a lion's body and the head, torso and forelegs of an eagle."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addbodypart(lastrace, BP_WINGS, NULL); @@ -12934,7 +13055,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTJOB, 33, J_GUARD, NA, NULL); addflag(lastrace->flags, F_STARTJOB, 15, J_BERZERKER, NA, NULL); - addrace(R_HOBGOBLINWAR, "hobgoblin elite", 90, 'g', C_BOLDCYAN, MT_FLESH, RC_HUMANOID, "An exceptional hobgoblin commander who has achieved command of its own unit."); + addrace(R_HOBGOBLINWAR, "hobgoblin elite", 90, 'g', C_LIGHTCYAN, MT_FLESH, RC_HUMANOID, "An exceptional hobgoblin commander who has achieved command of its own unit."); setbodytype(lastrace, BT_HUMANOID); lastrace->baseid = R_HOBGOBLIN; addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -12978,7 +13099,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 7, NA, NA, NULL); - addrace(R_HYDRA, "hydra", 300, 'W', C_BLUE, MT_FLESH, RC_DRAGON, "A four legged serpentine reptile, resembling a wyrm except for its many extra heads."); + addrace(R_HYDRA, "hydra", 300, 'W', C_LIGHTGREEN, MT_FLESH, RC_DRAGON, "A four legged serpentine reptile, resembling a wyrm except for its many extra heads."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -13060,7 +13181,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_FATALFOOD, OT_CHOCOLATE, NA, NA, NULL); - addrace(R_TROGLODYTE, "troglodyte", 20, 'z', C_GREY, MT_FLESH, RC_HUMANOID, "Troglodytes are smaller, stunted lizardmen who at outcast at birth. They linger on the outskirts of society, scavenging garbage and living in their own filth."); + addrace(R_TROGLODYTE, "troglodyte", 20, 'z', C_LIGHTGREEN, MT_FLESH, RC_HUMANOID, "Troglodytes are smaller, stunted lizardmen who at outcast at birth. They linger on the outskirts of society, scavenging garbage and living in their own filth."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_COLDBLOOD, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_POISONCORPSE, B_TRUE, NA, NA, NULL); @@ -13095,7 +13216,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_FILLPOT, OT_POT_POISON, BLOODFORPOT, NA, NULL); - addrace(R_LEPRECHAUN, "leprechaun", 35, 'n', C_BOLDGREEN, MT_FLESH, RC_HUMANOID, "Leprechauns are tiny Irish humans, with a love for gold and practical jokes. Known for their supernatural luck."); + addrace(R_LEPRECHAUN, "leprechaun", 35, 'n', C_GREEN, MT_FLESH, RC_HUMANOID, "Leprechauns are tiny Irish humans, with a love for gold and practical jokes. Known for their supernatural luck."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SIZE, SZ_SMALL, NA, NA, NULL); @@ -13126,7 +13247,7 @@ void initrace(void) { addflag(lastrace->flags, F_MORALE, 0, NA, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_EXTRALUCK, 5, NA, NULL); - addrace(R_LESHY, "leshy", 35, 'h', C_GREEN, MT_PLANT, RC_HUMANOID, "Human-like figures with leaves (and the occasional fruit) covering their bodies."); + addrace(R_LESHY, "leshy", 35, 'h', C_LIGHTGREEN, MT_PLANT, RC_HUMANOID, "Human-like figures with leaves (and the occasional fruit) covering their bodies."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SIZE, SZ_HUMAN, NA, NA, NULL); @@ -13154,7 +13275,7 @@ void initrace(void) { addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_DODGES, B_TRUE, NA, NA, NULL); - addrace(R_LIZARDMAN, "lizardman", 100, 'z', C_GREEN, MT_LEATHER, RC_HUMANOID, "Lizardmen are as they sound - a cross between a human and a lizard. Their leathery skin helps protect them from pummeling blows, and their tails give them enhanced stability."); + addrace(R_LIZARDMAN, "lizardman", 100, 'z', C_DARKGREEN, MT_LEATHER, RC_HUMANOID, "Lizardmen are as they sound - a cross between a human and a lizard. Their leathery skin helps protect them from pummeling blows, and their tails give them enhanced stability."); setbodytype(lastrace, BT_HUMANOID); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_COLDBLOOD, B_TRUE, NA, NA, NULL); @@ -13194,7 +13315,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTJOB, 15, J_DRUID, NA, NULL); addflag(lastrace->flags, F_STARTJOB, 15, J_GUARD, NA, NULL); - addrace(R_MALIK, "malik", 5, 'n', C_YELLOW, MT_FLESH, RC_MAGIC, "An evil fairy who thrives on murder. They delight in teleporting behind their victims for a quick backstab."); + addrace(R_MALIK, "malik", 5, 'n', C_DARKRED, MT_FLESH, RC_MAGIC, "An evil fairy who thrives on murder. They delight in teleporting behind their victims for a quick backstab."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_NOCORPSE, NA, NA, NA, NULL); @@ -13231,7 +13352,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, UNLIMITED, NA, NA, NULL); - addrace(R_MANTICORE, "manticore", 80, 'm', C_RED, MT_FLESH, RC_MAGIC, "Horrific beasts with the body of a lion, bat-like winds and a human head. The tip of their tail contains a mass of iron spikes."); + addrace(R_MANTICORE, "manticore", 80, 'm', C_LIGHTRED, MT_FLESH, RC_MAGIC, "Horrific beasts with the body of a lion, bat-like winds and a human head. The tip of their tail contains a mass of iron spikes."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addbodypart(lastrace, BP_WINGS, NULL); @@ -13272,7 +13393,7 @@ void initrace(void) { addflag(lastrace->flags, F_WANTSOBFLAG, F_GEM, NA, NA, NULL); addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, NA, NA, NULL); - addrace(R_MINOTAUR, "minotaur", 130, 'H', C_BROWN, MT_FLESH, RC_HUMANOID, "Legendary creatures with the head of a bull, with a strength and temperament to match."); + addrace(R_MINOTAUR, "minotaur", 130, 'H', C_LIGHTBROWN, MT_FLESH, RC_HUMANOID, "Legendary creatures with the head of a bull, with a strength and temperament to match."); setbodytype(lastrace, BT_HUMANOID); noarmouron(lastrace, BP_HEAD); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -13310,7 +13431,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); - addrace(R_OGRE, "ogre", 160, 'O', C_BROWN, MT_FLESH, RC_HUMANOID, "Large, cruel, monstrous and hideous humanoid monsters. Ogres have a raging temper and hunger for flesh."); + addrace(R_OGRE, "ogre", 160, 'O', C_LIGHTBROWN, MT_FLESH, RC_HUMANOID, "Large, cruel, monstrous and hideous humanoid monsters. Ogres have a raging temper and hunger for flesh."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -13362,6 +13483,7 @@ void initrace(void) { addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_RARITY, H_CAVE, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_FREQUENT, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, 100, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_SIZE, SZ_MEDIUM, NA, NA, NULL); addflag(lastrace->flags, F_AQUATIC, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_BREATHWATER, B_TRUE, NA, NA, NULL); @@ -13390,7 +13512,7 @@ void initrace(void) { addflag(lastrace->flags, F_DTVULN, DT_FIRE, NA, NA, NULL); addflag(lastrace->flags, F_WANTSOBFLAG, F_GEM, B_COVETS, NA, NULL); - addrace(R_OGRA, "ogra", 160, 'O', C_BROWN, MT_FLESH, RC_HUMANOID, "Female ogres (known as 'ogras' are no less angry or hungry than the males of the species. They are however slightly faster and weaker."); + addrace(R_OGRA, "ogra", 160, 'O', C_LIGHTBROWN, MT_FLESH, RC_HUMANOID, "Female ogres (known as 'ogras' are no less angry or hungry than the males of the species. They are however slightly faster and weaker."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -13428,7 +13550,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTJOB, 20, J_ICEMAGE, NA, NULL); - addrace(R_OGREWARHULK, "warhulk", 160, 'O', C_BROWN, MT_FLESH, RC_HUMANOID, "Warhulks are huge ogres, even angrier than their comrades."); + addrace(R_OGREWARHULK, "warhulk", 160, 'O', C_MAGENTA, MT_FLESH, RC_HUMANOID, "Warhulks are huge ogres, even angrier than their comrades."); setbodytype(lastrace, BT_HUMANOID); lastrace->baseid = R_OGRE; addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -13468,7 +13590,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_EATCONFER, F_ATTRMOD, A_STR, 5, "75"); - addrace(R_ORC, "orc", 90, 'o', C_BROWN, MT_FLESH, RC_HUMANOID, "Orcs are fierce humanoid monsters with green skin and grotesque features."); + addrace(R_ORC, "orc", 90, 'o', C_LIGHTGREEN, MT_FLESH, RC_HUMANOID, "Orcs are fierce humanoid monsters with green skin and grotesque features."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -13554,7 +13676,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTJOB, 20, J_DEMONOLOGIST, NA, NULL); addflag(lastrace->flags, F_STARTJOB, 20, J_SHAMAN, NA, NULL); - addrace(R_ORCN, "night orc", 90, 'o', C_BLUE, MT_FLESH, RC_HUMANOID, "While all orcs prefer the darkness, night orcs (or 'norcs') can actually _create_ it, spewing darkness from their bodies and blotting out all that is good and holy."); + addrace(R_ORCN, "night orc", 90, 'o', C_DARKBLUE, MT_FLESH, RC_HUMANOID, "While all orcs prefer the darkness, night orcs (or 'norcs') can actually _create_ it, spewing darkness from their bodies and blotting out all that is good and holy."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -13622,7 +13744,7 @@ void initrace(void) { addflag(lastrace->flags, F_DIURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 5, NA, NA, NULL); - addrace(R_ORCB, "blood orc", 90, 'o', C_RED, MT_FLESH, RC_HUMANOID, "Blood orcs (or 'borcs') are larger and more muscled than standard orcs. When they enter a state of blood rage, they are feared even by their own kind."); + addrace(R_ORCB, "blood orc", 90, 'o', C_DARKRED, MT_FLESH, RC_HUMANOID, "Blood orcs (or 'borcs') are larger and more muscled than standard orcs. When they enter a state of blood rage, they are feared even by their own kind."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -13692,6 +13814,7 @@ void initrace(void) { addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_RARITY, H_MASTERVAULTS, NA, RR_UNCOMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_SIZE, SZ_SMALL, NA, NA, NULL); addflag(lastrace->flags, F_HITDICE, 5, NA, NA, NULL); addflag(lastrace->flags, F_TR, 5, NA, NA, NULL); @@ -13950,10 +14073,7 @@ void initrace(void) { addflag(lastrace->flags, F_UNSUMMONOB, NA, NA, NA, "boulder"); addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); - - - - addrace(R_PRIMALSTORM, "storm primality", 50, 'E', C_CYAN, MT_GAS, RC_MAGIC, "A living storm of seething winds and electricity, animated by powerful magic."); + addrace(R_PRIMALSTORM, "storm primality", 50, 'E', C_LIGHTCYAN, MT_GAS, RC_MAGIC, "A living storm of seething winds and electricity, animated by powerful magic."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_NONE, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_AVERAGE, NA, NULL); @@ -13991,7 +14111,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_AWARENESS, B_TRUE, NA, NA, NULL); - addrace(R_PRIMALSTORML, "lesser storm primality", 50, 'E', C_CYAN, MT_GAS, RC_MAGIC, "A living storm of seething winds and electricity, animated by powerful magic."); + addrace(R_PRIMALSTORML, "lesser storm primality", 50, 'E', C_LIGHTCYAN, MT_GAS, RC_MAGIC, "A living storm of seething winds and electricity, animated by powerful magic."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_NONE, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_AVERAGE, NA, NULL); @@ -14029,8 +14149,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_AWARENESS, B_TRUE, NA, NA, NULL); - - addrace(R_SANDMAN, "sandman", 10, 'y', C_BROWN, MT_DIRT, RC_OTHER, "A whirling tornado of sand, with a humanoid figure dimly visible within."); + addrace(R_SANDMAN, "sandman", 10, 'y', C_DARKYELLOW, MT_DIRT, RC_OTHER, "A whirling tornado of sand, with a humanoid figure dimly visible within."); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_BLOODOB, NA, NA, NA, "small dust cloud"); @@ -14064,7 +14183,6 @@ void initrace(void) { addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); - addrace(R_SASQUATCH, "sasquatch", 90, 'h', C_CYAN, MT_FLESH, RC_HUMANOID, "Over the years, humans dwelling in cold climates have evolved into sasquatches, their skin now covered with fur to protect against the elements."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_NONE, NA, NA, "gne"); @@ -14090,8 +14208,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_BEGINNER, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL); - - addrace(R_SATYR, "satyr", 80, 'h', C_YELLOW, MT_FLESH, RC_HUMANOID, "A goat-like humanoid equipped with a set of magical panpipes."); + addrace(R_SATYR, "satyr", 80, 'h', C_BROWN, MT_FLESH, RC_HUMANOID, "A goat-like humanoid equipped with a set of magical panpipes."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -14131,7 +14248,6 @@ void initrace(void) { addflag(lastrace->flags, F_CASTCHANCE, 30, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 8, NA, NA, NULL); - addrace(R_SKOOB, "skoob", 40, 'g', C_WHITE, MT_WATER, RC_MAGIC, "Your typical snowman right down to the carrot nose, with just a two key differences: it is alive, and it is homocidal."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_CORPSETYPE, NA, NA, NA, "carrot"); @@ -14144,6 +14260,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTATT, A_CHA, AT_AVERAGE, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_UNCOMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_SIZE, SZ_MEDIUM, NA, NA, NULL); addflag(lastrace->flags, F_HITDICE, 2, NA, NA, NULL); addflag(lastrace->flags, F_TR, 2, NA, NA, NULL); @@ -14162,8 +14279,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_DTRESIST, DT_COLD, NA, "50"); - - addrace(R_OOZEGREY, "sizzling slime", 10, 'j', C_GREEN, MT_SLIME, RC_SLIME, "Exactly what it sounds like - a small lump of green ooze. Green, acidic ooze."); + addrace(R_OOZEGREY, "sizzling slime", 10, 'j', C_DARKGREEN, MT_SLIME, RC_SLIME, "Exactly what it sounds like - a small lump of green ooze. Green, acidic ooze."); addflag(lastrace->flags, F_CORPSETYPE, NA, NA, NA, "puddle of slime"); addflag(lastrace->flags, F_NOSTAIRS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -14221,7 +14337,7 @@ void initrace(void) { addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "pounds its drills into the ground"); addflag(lastrace->flags, F_EATCONFER, F_MUTABLE, B_TRUE, NA, "100"); - addrace(R_SPRIGGAN, "spriggan", 10, 'n', C_GREEN, MT_FLESH, RC_MAGIC, "Small, grotesque, and green. All words used to describe the diminuative spriggan race."); + addrace(R_SPRIGGAN, "spriggan", 10, 'n', C_LIGHTGREEN, MT_FLESH, RC_MAGIC, "Small, grotesque, and green. All words used to describe the diminuative spriggan race."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_AVERAGE, NA, NULL); @@ -14262,7 +14378,6 @@ void initrace(void) { addflag(lastrace->flags, F_WANTSBETTERWEP, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_WANTSBETTERARM, B_TRUE, NA, NA, NULL); - addrace(R_SPRITEFIRE, "fire sprite", 5, 'n', C_RED, MT_FIRE, RC_MAGIC, "A small magical creature surrounded by crackling flames."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_EXTRACORPSE, NA, NA, NA, "small fire"); @@ -14358,6 +14473,7 @@ void initrace(void) { addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_FREQUENT, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_SIZE, SZ_SMALL, NA, NA, NULL); addflag(lastrace->flags, F_HITDICE, 2, NA, NA, NULL); addflag(lastrace->flags, F_TR, 3, NA, NA, NULL); @@ -14388,7 +14504,7 @@ void initrace(void) { addflag(lastrace->flags, F_WANTSOBFLAG, F_GEM, B_COVETS, NA, NULL); addflag(lastrace->flags, F_FILLPOT, OT_POT_ELEMENTIMMUNE, BLOODFORPOT, NA, NULL); - addrace(R_SPRITEWEED, "weed sprite", 5, 'n', C_ORANGE, MT_FLESH, RC_MAGIC, "The bright colour of weed sprites belies their evil nature."); + addrace(R_SPRITEWEED, "weed sprite", 5, 'n', C_DARKGREEN, MT_FLESH, RC_MAGIC, "The bright colour of weed sprites belies their evil nature."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_LOW, NA, NULL); @@ -14465,7 +14581,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANWILL, OT_A_SNATCH, NA, NA, "range:1;"); addflag(lastrace->flags, F_REVIVETIMER, 0, 25, R_TROLL, "comes to life!"); - addrace(R_TROLLKIN, "trollkin", 100, 't', C_GREY, MT_FLESH, RC_HUMANOID, "Trollkins are the horrific offspring of a troll and a human. While they lack the regenerative abilities of a standard troll, their human genes grant them a greater level of intelligence."); + addrace(R_TROLLKIN, "trollkin", 100, 't', C_LIGHTGREEN, MT_FLESH, RC_HUMANOID, "Trollkins are the horrific offspring of a troll and a human. While they lack the regenerative abilities of a standard troll, their human genes grant them a greater level of intelligence."); setbodytype(lastrace, BT_HUMANOID); setbodypartname(lastrace, BP_HANDS, "claws"); setbodypartname(lastrace, BP_RIGHTFINGER, "right foreclaw"); @@ -14517,6 +14633,7 @@ void initrace(void) { addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_RARITY, H_CAVE, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_RARITY, H_SWAMP, NA, RR_COMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_HITDICE, 6, NA, NA, NULL); addflag(lastrace->flags, F_TR, 6, NA, NA, NULL); addflag(lastrace->flags, F_EVASION, 10, NA, NA, NULL); @@ -14546,7 +14663,7 @@ void initrace(void) { addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, B_COVETS, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_SNATCH, NA, NA, "range:1;"); - addrace(R_TROLLSWAMP, "swamp troll", 100, 't', C_BOLDGREEN, MT_FLESH, RC_HUMANOID, "Twisted trolls who roam the swamplands, their claws infected with a lethal poison."); + addrace(R_TROLLSWAMP, "swamp troll", 100, 't', C_MOSS, MT_FLESH, RC_HUMANOID, "Twisted trolls who roam the swamplands, their claws infected with a lethal poison."); setbodytype(lastrace, BT_HUMANOID); setbodypartname(lastrace, BP_HANDS, "claws"); setbodypartname(lastrace, BP_RIGHTFINGER, "right foreclaw"); @@ -14631,8 +14748,7 @@ void initrace(void) { addflag(lastrace->flags, F_HATESRACECLASS, RC_DRAGON, NA, NA, NULL); addflag(lastrace->flags, F_EXTRACORPSE, 100, NA, NA, "unicorn horn"); - - addrace(R_XAT, "xat", 2, 'x', C_BROWN, MT_FLESH, RC_ANIMAL, "Xats are wild pigs with the claws of a dog."); + addrace(R_XAT, "xat", 2, 'x', C_PINK, MT_FLESH, RC_ANIMAL, "Xats are wild pigs with the claws of a dog."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -14678,7 +14794,6 @@ void initrace(void) { addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, 8, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_GRAB, NA, NA, NULL); - addrace(R_MERLOCH, "merloch", 250, 'm', C_ORANGE, MT_FLESH, RC_AQUATIC, "Merlochs are bipedal, fishlike beings. Equally at home in the water or on land, they use their sonic scream to disable foes."); setbodytype(lastrace, BT_HUMANOID); noarmouron(lastrace, BP_RIGHTFINGER); @@ -14716,7 +14831,7 @@ void initrace(void) { addflag(lastrace->flags, F_EATCONFER, F_MUTABLE, B_TRUE, NA, "100"); addflag(lastrace->flags, F_FILLPOT, OT_POT_FISHLUNG, BLOODFORPOT, NA, NULL); - addrace(R_PIRANHA, "piranha", 0.5, ';', C_GREEN, MT_FLESH, RC_AQUATIC, "A vicious, flesh-eating fish"); + addrace(R_PIRANHA, "piranha", 0.5, ';', C_AQUA, MT_FLESH, RC_AQUATIC, "A vicious, flesh-eating fish"); setbodytype(lastrace, BT_FISH); addflag(lastrace->flags, F_NEEDSWATER, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_AWARENESS, B_TRUE, NA, NA, NULL); @@ -14818,7 +14933,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANWILL, OT_A_CRUSH, NA, NA, "dam:2d6;"); addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); // plants - addrace(R_BINGEBARK, "bingebark", 30, 'T', C_ORANGE, MT_WOOD, RC_PLANT, "A dry, withered tree with many leafless branches, its dead bark stained by blood."); + addrace(R_BINGEBARK, "bingebark", 30, 'T', C_DARKRED, MT_WOOD, RC_PLANT, "A dry, withered tree with many leafless branches, its dead bark stained by blood."); addbodypart(lastrace, BP_BODY, "trunk"); addbodypart(lastrace, BP_HANDS, "branches"); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_UNCOMMON, NULL); @@ -14872,7 +14987,7 @@ void initrace(void) { addflag(lastrace->flags, F_AWARENESS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); - addrace(R_CACTUS, "cactus", 30, 'F', C_BOLDGREEN, MT_PLANT, RC_PLANT, "A wide upright plant coated with sharp spines. Said to sprout delicious fruit."); + addrace(R_CACTUS, "cactus", 30, 'F', C_LIGHTGREEN, MT_PLANT, RC_PLANT, "A wide upright plant coated with sharp spines. Said to sprout delicious fruit."); addbodypart(lastrace, BP_BODY, "stalk"); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_HARMLESS, B_TRUE, NA, NA, NULL); @@ -14997,7 +15112,6 @@ void initrace(void) { addflag(lastrace->flags, F_TREMORSENSE, 10, NA, NA, NULL); addflag(lastrace->flags, F_ADHESIVE, 100, NA, NA, NULL); - addrace(R_IVYRAPID, "rapid ivy", 1, 'F', C_CYAN, MT_PLANT, RC_PLANT, "A strain of ivy which reproduces with incredible speed. Farmers find it difficult to remove due to its sharp spines."); addbodypart(lastrace, BP_BODY, "stalk"); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_RARE, NULL); @@ -15058,7 +15172,7 @@ void initrace(void) { addflag(lastrace->flags, F_TR, 2, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); - addrace(R_SAWGRASS, "sawgrass", 1, 'F', C_GREY, MT_METAL, RC_PLANT, "Razor sharp metallic grass with serrated edges. This plant senses vibrations in the air around it and lashes out with its sharp fronds."); + addrace(R_SAWGRASS, "sawgrass", 1, 'F', C_METAL, MT_METAL, RC_PLANT, "Razor sharp metallic grass with serrated edges. This plant senses vibrations in the air around it and lashes out with its sharp fronds."); addbodypart(lastrace, BP_BODY, "stalk"); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_COMMON, NULL); @@ -15084,7 +15198,6 @@ void initrace(void) { addflag(lastrace->flags, F_TREMORSENSE, 10, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_ELECTRIC, NA, NA, NULL); - addrace(R_UNYON, "unyon", 0.5, 'F', C_WHITE, MT_PLANT, RC_PLANT, "This genetically engineered onion plant has developed its stinging fumes into a self-defense mechanism."); addbodypart(lastrace, BP_BODY, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); @@ -15112,7 +15225,7 @@ void initrace(void) { // end plants // animals - addrace(R_BAT, "giant bat", 3, 'B', C_BROWN, MT_FLESH, RC_ANIMAL, "A larger (and more savage) version of your average household bat."); + addrace(R_BAT, "giant bat", 3, 'B', C_DARKGREY, MT_FLESH, RC_ANIMAL, "A larger (and more savage) version of your average household bat."); setbodytype(lastrace, BT_BIRD); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_RARITY, H_CAVE, NA, RR_COMMON, NULL); @@ -15172,7 +15285,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_FLY, SV_TALK, NA, "^flapping wings"); addflag(lastrace->flags, F_NOFLEE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_EATCONFER, F_MUTABLE, B_TRUE, NA, "100"); - addrace(R_BATBRAIN, "brain bat", 6, 'B', C_RED, MT_FLESH, RC_ANIMAL, "Rare bats, said to exhibit strange psionic behaviour."); + addrace(R_BATBRAIN, "brain bat", 6, 'B', C_PINK, MT_FLESH, RC_ANIMAL, "Rare bats, said to exhibit strange psionic behaviour."); setbodytype(lastrace, BT_BIRD); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_RARE, NULL); addflag(lastrace->flags, F_RARITY, H_CAVE, NA, RR_RARE, NULL); @@ -15235,8 +15348,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 5, NA, NA, NULL); - - addrace(R_CATCHEETAH, "cheetah", 250, 'f', C_BROWN, MT_FLESH, RC_ANIMAL, "A large cat capable of amazing running speeds. It also has unique paws which do not allow for gripping."); + addrace(R_CATCHEETAH, "cheetah", 250, 'f', C_DARKYELLOW, MT_FLESH, RC_ANIMAL, "A large cat capable of amazing running speeds. It also has unique paws which do not allow for gripping."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_RNDHOSTILE, 30, NA, NA, NULL); @@ -15280,7 +15392,7 @@ void initrace(void) { addflag(lastrace->flags, F_FELINE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HATESRACEWITHFLAG, F_CANINE, NA, NA, NULL); - addrace(R_CATLION, "lion", 275, 'f', C_ORANGE, MT_FLESH, RC_ANIMAL, "The \'King of the Jungle\' is the most powerful large cat, its neck rings by a great mane of fur. Lions lack leaping or jumping abilites of other cats, but make up for this in raw power."); + addrace(R_CATLION, "lion", 275, 'f', C_YELLOW, MT_FLESH, RC_ANIMAL, "The \'King of the Jungle\' is the most powerful large cat, its neck rings by a great mane of fur. Lions lack leaping or jumping abilites of other cats, but make up for this in raw power."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_NEUTRAL, NA, NA, NULL); @@ -15365,7 +15477,7 @@ void initrace(void) { addflag(lastrace->flags, F_HATESRACEWITHFLAG, F_CANINE, NA, NA, NULL); - addrace(R_CATTIGER, "tiger", 50, 'f', C_RED, MT_FLESH, RC_ANIMAL, "One of the largest of the natural cats, tigers are known for their combination of power and agility."); + addrace(R_CATTIGER, "tiger", 50, 'f', C_ORANGE, MT_FLESH, RC_ANIMAL, "One of the largest of the natural cats, tigers are known for their combination of power and agility."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_NEUTRAL, NA, NA, NULL); @@ -15406,7 +15518,7 @@ void initrace(void) { addflag(lastrace->flags, F_FELINE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HATESRACEWITHFLAG, F_CANINE, NA, NA, NULL); - addrace(R_CATSHADOW, "shadowcat", 5, 'f', C_BLUE, MT_FLESH, RC_MAGIC, "A huge, feral black cat, surrounded by clouds of black smoke."); + addrace(R_CATSHADOW, "shadowcat", 5, 'f', C_DARKGREY, MT_FLESH, RC_MAGIC, "A huge, feral black cat, surrounded by clouds of black smoke."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -15441,12 +15553,13 @@ void initrace(void) { addflag(lastrace->flags, F_FELINE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HATESRACEWITHFLAG, F_CANINE, NA, NA, NULL); - addrace(R_BEAR, "black bear", 150, 'Q', C_BLUE, MT_FLESH, RC_ANIMAL, "A medium sized omnivorous bear."); + addrace(R_BEAR, "black bear", 150, 'Q', C_DARKGREY, MT_FLESH, RC_ANIMAL, "A medium sized omnivorous bear."); setbodytype(lastrace, BT_QUADRAPED); addflag(lastrace->flags, F_TERRITORIAL, 2, NA , NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_RARITY, H_CAVE, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_COMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_SIZE, SZ_HUMAN, NA, NA, NULL); addflag(lastrace->flags, F_STARTASLEEPPCT, 80, NA, NA, NULL); // hibernating addflag(lastrace->flags, F_HITDICE, 6, NA, NA, NULL); @@ -15467,6 +15580,7 @@ void initrace(void) { addflag(lastrace->flags, F_VEGETARIAN, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, B_COVETS, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_SNATCH, NA, NA, "range:1;"); + addflag(lastrace->flags, F_DTRESIST, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_NOISETEXT, N_TOOCLOSE, 3, NA, "growls threateningly^a threatening growl"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roar"); addflag(lastrace->flags, F_SEEINDARK, 3, NA, NA, NULL); @@ -15475,13 +15589,14 @@ void initrace(void) { addflag(lastrace->flags, F_MINIONS, 25, 1, 2, "bear cub"); addflag(lastrace->flags, F_MORALE, 5, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); - addrace(R_BEARGRIZZLY, "grizzly bear", 200, 'Q', C_YELLOW, MT_FLESH, RC_ANIMAL, "A large angry bear."); + addrace(R_BEARGRIZZLY, "grizzly bear", 200, 'Q', C_BROWN, MT_FLESH, RC_ANIMAL, "A large angry bear."); setbodytype(lastrace, BT_QUADRAPED); lastrace->baseid = R_BEAR; addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_RARITY, H_CAVE, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_COMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_SIZE, SZ_LARGE, NA, NA, NULL); addflag(lastrace->flags, F_STARTASLEEPPCT, 80, NA, NA, NULL); // hibernating addflag(lastrace->flags, F_HITDICE, 7, NA, NA, NULL); @@ -15502,6 +15617,7 @@ void initrace(void) { addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, NA, NA, NULL); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roar"); addflag(lastrace->flags, F_SEEINDARK, 5, NA, NA, NULL); + addflag(lastrace->flags, F_DTRESIST, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_GRAB, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_CRUSH, NA, NA, "dam:2d6;"); addflag(lastrace->flags, F_CRITKNOCKDOWN, B_TRUE, NA, NA, NULL); @@ -15532,13 +15648,14 @@ void initrace(void) { addflag(lastrace->flags, F_STARTATT, A_CON, AT_RANDOM, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_WIS, AT_LOW, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CHA, AT_AVERAGE, NA, NULL); + addflag(lastrace->flags, F_DTRESIST, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roar"); addflag(lastrace->flags, F_SEEINDARK, 4, NA, NA, NULL); addflag(lastrace->flags, F_CRITKNOCKDOWN, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, ""); addflag(lastrace->flags, F_TAMABLE, 175, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); - addrace(R_ANT, "giant ant", 20, 'a', C_BROWN, MT_FLESH, RC_ANIMAL, "Giant ants are enormous (for an ant, anyway), and keen to take avenge their smaller ancestors who were crushed by small children."); + addrace(R_ANT, "giant ant", 20, 'a', C_DARKYELLOW, MT_FLESH, RC_ANIMAL, "Giant ants are enormous (for an ant, anyway), and keen to take avenge their smaller ancestors who were crushed by small children."); setbodytype(lastrace, BT_QUADRAPED); lastrace->baseid = R_ANT; addflag(lastrace->flags, F_TERRITORIAL, 3, NA , NA, NULL); @@ -15664,7 +15781,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANWILL, OT_S_SUMMONANIMALSSM, 6, 6, "pw:10;race:giant ant;count:10;"); - addrace(R_BILCO, "bilco", 25, ';', C_BOLDCYAN, MT_FLESH, RC_ANIMAL, "Bilcos appear to be abnormally large frogs with a strange blue tinge. Seasoned travellers know to beware the bilco's gurgle, which portends them belching out a massive torrent of water."); + addrace(R_BILCO, "bilco", 25, ';', C_MOSS, MT_FLESH, RC_ANIMAL, "Bilcos appear to be abnormally large frogs with a strange blue tinge. Seasoned travellers know to beware the bilco's gurgle, which portends them belching out a massive torrent of water."); setbodytype(lastrace, BT_QUADRAPED); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_VULNTOSALT, B_TRUE, NA, NA, NULL); @@ -15700,7 +15817,7 @@ void initrace(void) { addflag(lastrace->flags, F_EATMUTATE, F_BREATHWATER, B_TRUE, NA, "50"); - addrace(R_CHICKEN, "chicken", 0.5, 'c', C_BROWN, MT_FLESH, RC_ANIMAL, "A common farm-yard chicken."); + addrace(R_CHICKEN, "chicken", 0.5, 'c', C_DARKYELLOW, MT_FLESH, RC_ANIMAL, "A common farm-yard chicken."); setbodytype(lastrace, BT_BIRD); addflag(lastrace->flags, F_STARTATT, A_STR, AT_AVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL); @@ -15833,7 +15950,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANINE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_FATALFOOD, OT_CHOCOLATE, NA, NA, NULL); - addrace(R_DOGWAR, "war hound", 40, 'd', C_BROWN, MT_FLESH, RC_ANIMAL, "Canines bred for war."); + addrace(R_DOGWAR, "war hound", 40, 'd', C_DARKYELLOW, MT_FLESH, RC_ANIMAL, "Canines bred for war."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -15865,7 +15982,6 @@ void initrace(void) { addflag(lastrace->flags, F_CANINE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); - addrace(R_HORSE, "horse", 500, 'u', C_BROWN, MT_FLESH, RC_ANIMAL, "Large quadrapeds with many purposes: transport, moving goods, pulling ploughs to name but a few."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); @@ -15891,7 +16007,7 @@ void initrace(void) { addflag(lastrace->flags, F_FLEEONHPPCT, 80, NA, NA, ""); addflag(lastrace->flags, F_EQUINE, B_TRUE, NA, NA, NULL); - addrace(R_FROG, "impaler frog", 10, ';', C_BOLDGREEN, MT_FLESH, RC_ANIMAL, "As their name implies, impaler frogs are dangerous frogs whose tongues end in a very sharp point. They use this to spear their enemies from afar, often while hiding underwater."); + addrace(R_FROG, "impaler frog", 10, ';', C_LIGHTGREEN, MT_FLESH, RC_ANIMAL, "As their name implies, impaler frogs are dangerous frogs whose tongues end in a very sharp point. They use this to spear their enemies from afar, often while hiding underwater."); setbodytype(lastrace, BT_QUADRAPED); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_VULNTOSALT, B_TRUE, NA, NA, NULL); @@ -16037,7 +16153,7 @@ void initrace(void) { addflag(lastrace->flags, F_AVIAN, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); - addrace(R_HAWKBLOOD, "trained hawk", 1, 'A', C_RED, MT_FLESH, RC_ANIMAL, "Once ordinary hawk, these creatures have been battle-hardened through regular combat."); // 'A' for Avian + addrace(R_HAWKBLOOD, "trained hawk", 1, 'A', C_LIGHTRED, MT_FLESH, RC_ANIMAL, "Once ordinary hawk, these creatures have been battle-hardened through regular combat."); // 'A' for Avian setbodytype(lastrace, BT_BIRD); lastrace->baseid = R_HAWK; addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); @@ -16071,9 +16187,10 @@ void initrace(void) { addflag(lastrace->flags, F_MORALE, 8, NA, NA, NULL); addflag(lastrace->flags, F_AVIAN, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); - addrace(R_HAWKFROST, "frost hawk", 1, 'A', C_CYAN, MT_FLESH, RC_ANIMAL, "A hawk imbued with the power of ice. Frost hawks can release a powerufl blast of freezing air when threatened."); // 'A' for Avian + addrace(R_HAWKFROST, "frost hawk", 1, 'A', C_LIGHTCYAN, MT_FLESH, RC_ANIMAL, "A hawk imbued with the power of ice. Frost hawks can release a powerufl blast of freezing air when threatened."); // 'A' for Avian setbodytype(lastrace, BT_BIRD); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_TERRITORIAL, 6, NA , NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_GTAVERAGE, NA, NULL); @@ -16184,6 +16301,7 @@ void initrace(void) { addrace(R_GYRFALCON, "gyrfalcon", 1, 'A', C_WHITE, MT_FLESH, RC_ANIMAL, "An enormous falcon, commonly found in arctic climates."); // 'A' for Avian setbodytype(lastrace, BT_BIRD); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_UNCOMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_RARE, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL); @@ -16214,6 +16332,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_DTRESIST, DT_COLD, B_TRUE, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_DTRESIST, DT_COLD, NA, "20"); + addrace(R_LEECH, "giant leech", 10, 'j', C_MAGENTA, MT_FLESH, RC_ANIMAL, "A boneless blood-sucking creature. Quite dangerous until it eats it becomes satiated with blood, at which point it will slither off and fall asleep."); addbodypart(lastrace, BP_BODY, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -16249,7 +16368,7 @@ void initrace(void) { addflag(lastrace->flags, F_ENHANCESMELL, 5, NA, NA, NULL); addflag(lastrace->flags, F_WALKVERB, NA, NA, NA, "slither"); - addrace(R_MAMMOTH, "mammoth", 6000, 'Q', C_BROWN, MT_LEATHER, RC_ANIMAL, "A massive ancenstor of the elephant, mammoths are covered with fur, slightly larger and more dangerous."); + addrace(R_MAMMOTH, "mammoth", 6000, 'Q', C_DARKYELLOW, MT_LEATHER, RC_ANIMAL, "A massive ancenstor of the elephant, mammoths are covered with fur, slightly larger and more dangerous."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_EXTRACORPSE, 50, NA, NA, "ivory tusk"); @@ -16257,6 +16376,7 @@ void initrace(void) { addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_VERYRARE, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_COMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_RARE, NULL); addflag(lastrace->flags, F_SIZE, SZ_HUGE, NA, NA, NULL); addflag(lastrace->flags, F_DIURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HITDICE, 13, NA, NA, NULL); @@ -16281,7 +16401,7 @@ void initrace(void) { addflag(lastrace->flags, F_DTVULN, DT_SONIC, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_FIRE, NA, NA, NULL); - addrace(R_NEWT, "giant newt", 4, ':', C_BROWN, MT_FLESH, RC_ANIMAL, "An abnormally large example of the lizard family."); + addrace(R_NEWT, "giant newt", 4, ':', C_DARKYELLOW, MT_FLESH, RC_ANIMAL, "An abnormally large example of the lizard family."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); @@ -16306,6 +16426,7 @@ void initrace(void) { addflag(lastrace->flags, F_DTRESIST, DT_FIRE, B_TRUE, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_COLD, B_TRUE, NA, NULL); addflag(lastrace->flags, F_DIURNAL, B_TRUE, NA, NA, NULL); + addrace(R_PORCUPINE, "giant porcupine", 10, 'r', C_GREY, MT_FLESH, RC_ANIMAL, "A large four legged creature covered with sharp spines."); setbodytype(lastrace, BT_QUADRAPED); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -16357,6 +16478,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANWILL, OT_A_SNATCH, NA, NA, "range:1;"); addflag(lastrace->flags, F_SEEINDARK, 4, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_POISONGAS, NA, NA, NULL); + addflag(lastrace->flags, F_DTRESIST, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_WALKVERB, NA, NA, NA, "scuttle"); addflag(lastrace->flags, F_NOISETEXT, N_WALK, 1, NA, "^squeaking"); @@ -16391,6 +16513,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANWILL, OT_A_SNATCH, NA, NA, "range:1;"); addflag(lastrace->flags, F_SEEINDARK, 4, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_POISONGAS, NA, NA, NULL); + addflag(lastrace->flags, F_DTRESIST, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 4, NA, NA, NULL); addflag(lastrace->flags, F_WALKVERB, NA, NA, NA, "scuttle"); addflag(lastrace->flags, F_NOISETEXT, N_WALK, 1, NA, "^squeaking"); @@ -16426,6 +16549,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANWILL, OT_A_SNATCH, NA, NA, "range:1;"); addflag(lastrace->flags, F_SEEINDARK, 4, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_POISONGAS, NA, NA, NULL); + addflag(lastrace->flags, F_DTRESIST, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_WALKVERB, NA, NA, NA, "scuttle"); addflag(lastrace->flags, F_NOISETEXT, N_WALK, 1, NA, "^squeaking"); @@ -16434,7 +16558,7 @@ void initrace(void) { addflag(lastrace->flags, F_FILLPOT, OT_POT_POISON, BLOODFORPOT, NA, NULL); addflag(lastrace->flags, F_GERMS, NA, NA, NA, NULL); - addrace(R_ROC, "roc", 1, 'A', C_MAGENTA, MT_FLESH, RC_ANIMAL, "Rocs are unbelievably gargantuan birds or prey, large enough to carry a fully-grown elephant. They are generally peaceful, but deadly once provoked."); // 'A' for Avian + addrace(R_ROC, "roc", 1, 'A', C_LIGHTMAGENTA, MT_FLESH, RC_ANIMAL, "Rocs are unbelievably gargantuan birds or prey, large enough to carry a fully-grown elephant. They are generally peaceful, but deadly once provoked."); // 'A' for Avian setbodytype(lastrace, BT_BIRD); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_VERYRARE, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_VERYRARE, NULL); @@ -16465,6 +16589,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_LOWHP, 5, NA, "screeches in pain^screeches of pain"); addflag(lastrace->flags, F_AVIAN, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); + addflag(lastrace->flags, F_DTRESIST, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_CANWILL, OT_S_FLIGHT, NA, "90"); addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, NA, NA, NULL); addflag(lastrace->flags, F_CARNIVORE, B_TRUE, NA, NA, NULL); @@ -16506,7 +16631,7 @@ void initrace(void) { addflag(lastrace->flags, F_BREATHWATER, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); - addrace(R_SNAIL, "mottled snail", 150, 'P', C_BROWN, MT_FLESH, RC_ANIMAL, "An enormous snail, protected by a hard, scaled shell and gifted with long, sharp fangs."); + addrace(R_SNAIL, "mottled snail", 150, 'P', C_DARKYELLOW, MT_FLESH, RC_ANIMAL, "An enormous snail, protected by a hard, scaled shell and gifted with long, sharp fangs."); addbodypart(lastrace, BP_BODY, NULL); addbodypart(lastrace, BP_HEAD, NULL); addbodypart(lastrace, BP_EYES, NULL); @@ -16574,7 +16699,8 @@ void initrace(void) { addflag(lastrace->flags, F_DIURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOFLEE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_DTRESIST, DT_POISON, NA, "10"); - addrace(R_SNAKECARPET, "carpet snake", 3, 's', C_GREY, MT_FLESH, RC_ANIMAL, "Non-venemous (but not quite harmless) snakes."); + + addrace(R_SNAKECARPET, "carpet snake", 3, 's', C_CARPET1, MT_FLESH, RC_ANIMAL, "Non-venemous (but not quite harmless) snakes."); setbodytype(lastrace, BT_SNAKE); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_COLDBLOOD, B_TRUE, NA, NA, NULL); @@ -16776,7 +16902,8 @@ void initrace(void) { addflag(lastrace->flags, F_ENHANCESMELL, 4, NA, NA, NULL); addflag(lastrace->flags, F_DIURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOFLEE, B_TRUE, NA, NA, NULL); - addrace(R_SPIDER, "giant spider", 5, 'S', C_GREY, MT_FLESH, RC_ANIMAL, "An eight legged beast which features prominently in many nightmares."); + + addrace(R_SPIDER, "giant spider", 5, 'S', C_DARKGREY, MT_FLESH, RC_ANIMAL, "An eight legged beast which features prominently in many nightmares."); setbodytype(lastrace, BT_SPIDER); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -16810,6 +16937,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 25, NA, NA, ""); addflag(lastrace->flags, F_WALKVERB, NA, NA, NA, "creep"); + addrace(R_SPIDERFUNNELWEB, "giant funnelweb", 5, 'S', C_MAGENTA, MT_FLESH, RC_ANIMAL, "Like a giant spider... but extremely venomous."); setbodytype(lastrace, BT_SPIDER); lastrace->baseid = R_SPIDER; @@ -16850,6 +16978,7 @@ void initrace(void) { addflag(lastrace->flags, F_EATMUTATE, F_DTRESIST, DT_POISON, NA, "15"); addflag(lastrace->flags, F_WALKVERB, NA, NA, NA, "creep"); addflag(lastrace->flags, F_FILLPOT, OT_POT_POISON, BLOODFORPOT, NA, NULL); + addrace(R_SPIDERREDBACK, "giant redback", 5, 'S', C_RED, MT_FLESH, RC_ANIMAL, "A version of a giant spider with a highly painful bite."); setbodytype(lastrace, BT_SPIDER); lastrace->baseid = R_SPIDER; @@ -16890,7 +17019,8 @@ void initrace(void) { addflag(lastrace->flags, F_EATMUTATE, F_DTRESIST, DT_POISON, NA, "10"); addflag(lastrace->flags, F_WALKVERB, NA, NA, NA, "creep"); addflag(lastrace->flags, F_FILLPOT, OT_POT_POISON, BLOODFORPOT, NA, NULL); - addrace(R_SPIDERTOMB, "tomb spider", 5, 'S', C_BLUE, MT_FLESH, RC_ANIMAL, "Tomb spiders are truly nightmarish beings. Their skin can absorb light itself, and they can boost their own life force by consuming the flesh of their victims."); + + addrace(R_SPIDERTOMB, "tomb spider", 5, 'S', C_DARKBLUE, MT_FLESH, RC_ANIMAL, "Tomb spiders are truly nightmarish beings. Their skin can absorb light itself, and they can boost their own life force by consuming the flesh of their victims."); setbodytype(lastrace, BT_SPIDER); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_RARE, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -17005,6 +17135,7 @@ void initrace(void) { addflag(lastrace->flags, F_ENHANCESMELL, 6, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_FREQUENT, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_RARE, NULL); addflag(lastrace->flags, F_HITDICE, 4, NA, NA, NULL); addflag(lastrace->flags, F_TR, 4, NA, NA, NULL); addflag(lastrace->flags, F_HASATTACK, OT_TEETH, 5, NA, NULL); @@ -17020,6 +17151,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_TOOCLOSE, 2, NA, "growls menacingly^a menacing growl"); addflag(lastrace->flags, F_NOISETEXT, N_LOWHP, 2, NA, "whines in pain^whining"); addflag(lastrace->flags, F_NOISETEXT, N_FRUSTRATED, 3, NA, "growls^growling"); + addflag(lastrace->flags, F_DTRESIST, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, ""); addflag(lastrace->flags, F_HASSKILL, SK_SWIMMING, PR_BEGINNER, NA, NULL); addflag(lastrace->flags, F_MORALE, 6, NA, NA, NULL); @@ -17042,6 +17174,7 @@ void initrace(void) { addflag(lastrace->flags, F_ENHANCESMELL, 6, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_UNCOMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_RARE, NULL); addflag(lastrace->flags, F_HITDICE, 5, NA, NA, NULL); addflag(lastrace->flags, F_TR, 5, NA, NA, NULL); addflag(lastrace->flags, F_HASATTACK, OT_TEETH, 7, NA, NULL); @@ -17051,6 +17184,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CARNIVORE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, NA, NA, NULL); // can't fool it with food + addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 5, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_SPRINT, NA, NA, NULL); addflag(lastrace->flags, F_NOISETEXT, N_LOWHP, 2, NA, "whines in pain^whining"); @@ -17061,7 +17195,8 @@ void initrace(void) { addflag(lastrace->flags, F_CANINE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_FATALFOOD, OT_CHOCOLATE, NA, NA, NULL); - addrace(R_WOLFWINTER, "winter wolf", 25, 'd', C_CYAN, MT_FLESH, RC_ANIMAL, "Wolves which have lived in close proximity to the undead sometimes mutate into these frosty beasts. While their claws have become less sharp, they instead deal unnatural cold damage."); + + addrace(R_WOLFWINTER, "winter wolf", 25, 'd', C_WHITE, MT_FLESH, RC_ANIMAL, "Wolves which have lived in close proximity to the undead sometimes mutate into these frosty beasts. While their claws have become less sharp, they instead deal unnatural cold damage."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_AVERAGE, NA, NULL); @@ -17074,6 +17209,7 @@ void initrace(void) { addflag(lastrace->flags, F_MOVESPEED, SP_FAST, NA, NA, ""); addflag(lastrace->flags, F_ENHANCESMELL, 6, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_HITDICE, 5, NA, NA, NULL); addflag(lastrace->flags, F_TR, 6, NA, NA, NULL); addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, 3, NA, NULL); @@ -17099,7 +17235,7 @@ void initrace(void) { addflag(lastrace->flags, F_FATALFOOD, OT_CHOCOLATE, NA, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_DTRESIST, DT_COLD, NA, "25"); - addrace(R_CRYSTALCUR, "crystal cur", 60, 'd', C_WHITE, MT_CRYSTAL, RC_ANIMAL, "Crystal Curs are magical hounds, imbued with magical defenses by over-protective owners."); + addrace(R_CRYSTALCUR, "crystal cur", 60, 'd', C_CYAN, MT_CRYSTAL, RC_ANIMAL, "Crystal Curs are magical hounds, imbued with magical defenses by over-protective owners."); setbodytype(lastrace, BT_QUADRAPED); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_GOOD, NA, NA, NULL); @@ -17118,6 +17254,7 @@ void initrace(void) { addflag(lastrace->flags, F_MOVESPEED, SP_FAST, NA, NA, ""); addflag(lastrace->flags, F_ENHANCESMELL, 6, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_RARE, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_HITDICE, 5, NA, NA, NULL); addflag(lastrace->flags, F_TR, 6, NA, NA, NULL); addflag(lastrace->flags, F_MAXATTACKS, 1, 1, NA, NULL); @@ -17126,6 +17263,7 @@ void initrace(void) { addflag(lastrace->flags, F_EVASION, 10, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CARNIVORE, B_TRUE, NA, NA, NULL); + addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 5, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_SPRINT, NA, NA, NULL); addflag(lastrace->flags, F_NOISETEXT, N_LOWHP, 2, NA, "whines in pain^whining"); @@ -17138,7 +17276,7 @@ void initrace(void) { // end animals // dragons / wyrms - addrace(R_WORMGLUT, "glutwyrm", 2500, 'W', C_MAGENTA, MT_FLESH, RC_DRAGON, "Gigantic wyrms who have become so obese over the centuries that they have evolved to be wingless. They swallow their prey whole, slowly digesting their still living bodies."); + addrace(R_WORMGLUT, "glutwyrm", 2500, 'W', C_LIGHTMAGENTA, MT_FLESH, RC_DRAGON, "Gigantic wyrms who have become so obese over the centuries that they have evolved to be wingless. They swallow their prey whole, slowly digesting their still living bodies."); addbodypart(lastrace, BP_HEAD, NULL); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -17167,7 +17305,7 @@ void initrace(void) { addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); - addrace(R_EARTHWYRM, "earthwyrm", 25, 'w', C_BROWN, MT_FLESH, RC_DRAGON, "Giant scaled wormlike creatures. Their large mouths are ringed with hundreds of sharp teeth."); + addrace(R_EARTHWYRM, "earthwyrm", 25, 'w', C_DARKYELLOW, MT_FLESH, RC_DRAGON, "Giant scaled wormlike creatures. Their large mouths are ringed with hundreds of sharp teeth."); addbodypart(lastrace, BP_HEAD, NULL); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -17231,7 +17369,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CARNIVORE, B_TRUE, NA, NA, NULL); - addrace(R_DRAGONBLUE, "blue wyrm", 400, 'W', C_CYAN, MT_FLESH, RC_DRAGON, "Blue wyrms are massive reptilian creatures who can (and will) consume almost any living creature."); + addrace(R_DRAGONBLUE, "blue wyrm", 400, 'W', C_BLUE, MT_FLESH, RC_DRAGON, "Blue wyrms are massive reptilian creatures who can (and will) consume almost any living creature."); setbodytype(lastrace, BT_HUMANOID); addbodypart(lastrace, BP_WINGS, NULL); addbodypart(lastrace, BP_TAIL, NULL); @@ -17284,7 +17422,7 @@ void initrace(void) { addflag(lastrace->flags, F_CARNIVORE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_DTRESIST, DT_ELECTRIC, NA, "100"); - addrace(R_DRAGONBLUEY, "blue wyrmling", 150, 'w', C_CYAN, MT_FLESH, RC_DRAGON, "Blue wyrms are massive reptilian creatures who can (and will) consume almost any living creature."); + addrace(R_DRAGONBLUEY, "blue wyrmling", 150, 'w', C_DARKBLUE, MT_FLESH, RC_DRAGON, "Blue wyrms are massive reptilian creatures who can (and will) consume almost any living creature."); setbodytype(lastrace, BT_HUMANOID); addbodypart(lastrace, BP_WINGS, NULL); addbodypart(lastrace, BP_TAIL, NULL); @@ -17338,7 +17476,7 @@ void initrace(void) { addflag(lastrace->flags, F_CARNIVORE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_DTRESIST, DT_ELECTRIC, NA, "50"); addflag(lastrace->flags, F_EATMUTATE, F_ATTRMOD, A_STR, 5, "25"); - addrace(R_DRAGONBLUEA, "ancient blue wyrm", 600, 'W', C_CYAN, MT_FLESH, RC_DRAGON, "Blue wyrms are massive reptilian creatures who can (and will) consume almost any living creature."); + addrace(R_DRAGONBLUEA, "ancient blue wyrm", 600, 'W', C_LIGHTBLUE, MT_FLESH, RC_DRAGON, "Blue wyrms are massive reptilian creatures who can (and will) consume almost any living creature."); setbodytype(lastrace, BT_HUMANOID); addbodypart(lastrace, BP_WINGS, NULL); addbodypart(lastrace, BP_TAIL, NULL); @@ -17454,7 +17592,7 @@ void initrace(void) { addflag(lastrace->flags, F_CARNIVORE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_DTRESIST, DT_FIRE, NA, "100"); addflag(lastrace->flags, F_EATMUTATE, F_ATTRMOD, A_STR, 5, "50"); - addrace(R_DRAGONREDY, "red wyrmling", 150, 'w', C_RED, MT_FLESH, RC_DRAGON, "Red wyrms are massive evil reptilians who thrive on destruction, especially by means of fire."); + addrace(R_DRAGONREDY, "red wyrmling", 150, 'w', C_DARKRED, MT_FLESH, RC_DRAGON, "Red wyrms are massive evil reptilians who thrive on destruction, especially by means of fire."); setbodytype(lastrace, BT_HUMANOID); addbodypart(lastrace, BP_WINGS, NULL); addbodypart(lastrace, BP_TAIL, NULL); @@ -17504,7 +17642,7 @@ void initrace(void) { addflag(lastrace->flags, F_CARNIVORE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_DTRESIST, DT_FIRE, NA, "50"); addflag(lastrace->flags, F_EATMUTATE, F_ATTRMOD, A_STR, 5, "25"); - addrace(R_DRAGONREDA, "ancient red wyrm", 600, 'W', C_RED, MT_FLESH, RC_DRAGON, "Red wyrms are massive evil reptilians who thrive on destruction, especially by means of fire."); + addrace(R_DRAGONREDA, "ancient red wyrm", 600, 'W', C_LIGHTRED, MT_FLESH, RC_DRAGON, "Red wyrms are massive evil reptilians who thrive on destruction, especially by means of fire."); setbodytype(lastrace, BT_HUMANOID); addbodypart(lastrace, BP_WINGS, NULL); addbodypart(lastrace, BP_TAIL, NULL); @@ -17561,13 +17699,14 @@ void initrace(void) { addflag(lastrace->flags, F_EATMUTATE, F_DTRESIST, DT_FIRE, NA, "100"); addflag(lastrace->flags, F_EATMUTATE, F_ATTRMOD, A_STR, 5, "100"); - addrace(R_DRAGONWHITE, "white wyrm", 400, 'W', C_WHITE, MT_FLESH, RC_DRAGON, "Although white wyrms are smaller than other varieties, their icy breath still makes them a formidable threat."); + addrace(R_DRAGONWHITE, "white wyrm", 400, 'W', C_GREY, MT_FLESH, RC_DRAGON, "Although white wyrms are smaller than other varieties, their icy breath still makes them a formidable threat."); setbodytype(lastrace, BT_HUMANOID); addbodypart(lastrace, BP_WINGS, NULL); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_VERYRARE, NULL); addflag(lastrace->flags, F_RARITY, H_MASTERVAULTS, NA, RR_UNCOMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_VERYRARE, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SIZE, SZ_HUGE, NA, NA, NULL); addflag(lastrace->flags, F_NATURALFLIGHT, B_TRUE, NA, NA, ""); @@ -17614,13 +17753,14 @@ void initrace(void) { addflag(lastrace->flags, F_CARNIVORE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_DTRESIST, DT_COLD, NA, "100"); addflag(lastrace->flags, F_EATMUTATE, F_ATTRMOD, A_STR, 5, "50"); - addrace(R_DRAGONWHITEY, "white wyrmling", 150, 'w', C_WHITE, MT_FLESH, RC_DRAGON, "Although white wyrms are smaller than other varieties, their icy breath still makes them a formidable threat."); + addrace(R_DRAGONWHITEY, "white wyrmling", 150, 'w', C_DARKGREY, MT_FLESH, RC_DRAGON, "Although white wyrms are smaller than other varieties, their icy breath still makes them a formidable threat."); setbodytype(lastrace, BT_HUMANOID); addbodypart(lastrace, BP_WINGS, NULL); addbodypart(lastrace, BP_TAIL, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_VERYRARE, NULL); addflag(lastrace->flags, F_RARITY, H_MASTERVAULTS, NA, RR_COMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_VERYRARE, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SIZE, SZ_HUGE, NA, NA, NULL); addflag(lastrace->flags, F_NATURALFLIGHT, B_TRUE, NA, NA, ""); @@ -17669,6 +17809,7 @@ void initrace(void) { addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_VERYRARE, NULL); addflag(lastrace->flags, F_RARITY, H_MASTERVAULTS, NA, RR_RARE, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_VERYRARE, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SIZE, SZ_HUGE, NA, NA, NULL); addflag(lastrace->flags, F_NATURALFLIGHT, B_TRUE, NA, NA, ""); @@ -17874,7 +18015,7 @@ void initrace(void) { addflag(lastrace->flags, F_AWARENESS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CARNIVORE, B_TRUE, NA, NA, NULL); - addrace(R_STIRGE, "mosquitoid", 10, 'i', C_BROWN, MT_FLESH, RC_INSECT, "Mosquitoids look like giant dog-sized mosquitoes but are equipped with human-like arms and clawed hands."); + addrace(R_STIRGE, "mosquitoid", 10, 'i', C_DARKYELLOW, MT_FLESH, RC_INSECT, "Mosquitoids look like giant dog-sized mosquitoes but are equipped with human-like arms and clawed hands."); setbodytype(lastrace, BT_BIRD); addflag(lastrace->flags, F_INSECT, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -17940,7 +18081,7 @@ void initrace(void) { addflag(lastrace->flags, F_TREMORSENSE, 3, NA, NA, NULL); addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOFLEE, B_TRUE, NA, NA, NULL); - addrace(R_COCKROACH, "giant cockroach", 1, 'x', C_BLUE, MT_FLESH, RC_INSECT, "An overgrown cockroach, protected by hard scales."); + addrace(R_COCKROACH, "giant cockroach", 1, 'x', C_DARKBLUE, MT_FLESH, RC_INSECT, "An overgrown cockroach, protected by hard scales."); setbodytype(lastrace, BT_QUADRAPED); addflag(lastrace->flags, F_INSECT, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -17985,7 +18126,7 @@ void initrace(void) { addflag(lastrace->flags, F_DAMAGEGROUNDOBS, 2, DT_FIRE, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_EATMUTATE, F_DTRESIST, DT_FIRE, NA, "10"); - addrace(R_GLOWBUG, "glowbug", 1, 'i', C_WHITE, MT_FLESH, RC_INSECT, "Glowbugs are tiny flying creatures, magically producing light from their bodies."); + addrace(R_GLOWBUG, "glowbug", 1, 'i', C_GREY, MT_FLESH, RC_INSECT, "Glowbugs are tiny flying creatures, magically producing light from their bodies."); setbodytype(lastrace, BT_BIRD); addflag(lastrace->flags, F_INSECT, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_LTAVERAGE, NA, NULL); @@ -18051,7 +18192,7 @@ void initrace(void) { // demons - addrace(R_BALROG, "balrog", 300, '&', C_ORANGE, MT_FLESH, RC_DEMON, "Towering winged humanoids with bright red skin, surrounded by a roaring inferno."); + addrace(R_BALROG, "balrog", 300, '&', C_LIGHTRED, MT_FLESH, RC_DEMON, "Towering winged humanoids with bright red skin, surrounded by a roaring inferno."); setbodytype(lastrace, BT_HUMANOID); addbodypart(lastrace, BP_TAIL, NULL); addbodypart(lastrace, BP_WINGS, NULL); @@ -18163,13 +18304,14 @@ void initrace(void) { addflag(lastrace->flags, F_NEEDOBFORSPELLS, OT_TRIDENT, NA, NA, "trident"); addflag(lastrace->flags, F_RESISTMAG, 10, NA, NA, NULL); - addrace(R_ICEDEMON, "ice demon", 80, '&', C_WHITE, MT_ICE, RC_DEMON, "A dense, humanoid demon comprised of solid ice and covered with sharp icicles."); + addrace(R_ICEDEMON, "ice demon", 80, '&', C_CYAN, MT_ICE, RC_DEMON, "A dense, humanoid demon comprised of solid ice and covered with sharp icicles."); setbodytype(lastrace, BT_HUMANOID); addbodypart(lastrace, BP_TAIL, NULL); addbodypart(lastrace, BP_WINGS, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_HEAVEN, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_RARITY, H_ALL, NA, RR_RARE, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_RARE, NULL); addflag(lastrace->flags, F_RARITY, H_MASTERVAULTS, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SIZE, SZ_MEDIUM, NA, NA, NULL); @@ -18198,7 +18340,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 2, NA, "roars^an other-wordly roar"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 2, NA, "roars^an other-wordly roar"); - addrace(R_IMP, "imp", 4, '&', C_BROWN, MT_FLESH, RC_DEMON, "A tiny, bald humanoid with small spiked horns running down the middle of its scalp, leathery bat-like wings and of course sharp claws..."); + addrace(R_IMP, "imp", 4, '&', C_DARKYELLOW, MT_FLESH, RC_DEMON, "A tiny, bald humanoid with small spiked horns running down the middle of its scalp, leathery bat-like wings and of course sharp claws..."); setbodytype(lastrace, BT_HUMANOID); addbodypart(lastrace, BP_TAIL, NULL); addbodypart(lastrace, BP_WINGS, NULL); @@ -18397,6 +18539,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTATT, A_WIS, AT_EXLOW, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CHA, AT_VLOW, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_RARE, NULL); addflag(lastrace->flags, F_RARITY, H_SWAMP, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_NOSTAIRS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOCORPSE, B_TRUE, NA, NA, NULL); @@ -18428,7 +18571,7 @@ void initrace(void) { addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, B_COVETS, NA, NULL); addflag(lastrace->flags, F_FOLLOWTIME, 0, NA, NA, NULL); - addrace(R_SKELETON, "skeleton", 20, 'Z', C_GREY, MT_BONE, RC_UNDEAD, "A walking set of bones, animated through the use of necromancy. Due to their lack of soft flesh, they have little to fear from edged weapons."); + addrace(R_SKELETON, "skeleton", 20, 'Z', C_BONE, MT_BONE, RC_UNDEAD, "A walking set of bones, animated through the use of necromancy. Due to their lack of soft flesh, they have little to fear from edged weapons."); setbodytype(lastrace, BT_HUMANOID); setbodypartname(lastrace, BP_WEAPON, "right metacarpals"); setbodypartname(lastrace, BP_SECWEAPON, "left metacarpals"); @@ -18471,7 +18614,7 @@ void initrace(void) { addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); addflag(lastrace->flags, F_FOLLOWTIME, 0, NA, NA, NULL); - addrace(R_SKELETONFIRE, "fire skeleton", 20, 'Z', C_RED, MT_BONE, RC_UNDEAD, "A walking set of flaming bones, imbued with the power of fire. They have all the advantages of normal skeletons but tend to burn victims with their flame rather than use weapons."); + addrace(R_SKELETONFIRE, "fire skeleton", 20, 'Z', C_LIGHTRED, MT_BONE, RC_UNDEAD, "A walking set of flaming bones, imbued with the power of fire. They have all the advantages of normal skeletons but tend to burn victims with their flame rather than use weapons."); setbodytype(lastrace, BT_HUMANOID); setbodypartname(lastrace, BP_WEAPON, "right metacarpals"); setbodypartname(lastrace, BP_SECWEAPON, "left metacarpals"); @@ -18586,6 +18729,7 @@ void initrace(void) { addflag(lastrace->flags, F_RARITY, H_CAVE, NA, RR_COMMON, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_RARITY, H_SWAMP, NA, RR_UNCOMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_AVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_IQ, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_AGI, AT_AVERAGE, NA, NULL); @@ -18626,6 +18770,7 @@ void initrace(void) { addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_VERYRARE, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_VERYRARE, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_VERYRARE, NULL); addflag(lastrace->flags, F_SIZE, SZ_HUMAN, NA, NA, NULL); addflag(lastrace->flags, F_HITDICE, 7, NA, NA, NULL); addflag(lastrace->flags, F_TR, 7, NA, NA, NULL); @@ -18643,7 +18788,7 @@ void initrace(void) { addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); addflag(lastrace->flags, F_NONCORPOREAL, B_TRUE, NA, NA, NULL); - addrace(R_GHAST, "ghast", 50, 'Z', C_BOLDGREEN, MT_FLESH, RC_UNDEAD, "A more slender and ghost-like form of ghoul. Ghasts are cunning and deadly, and possess a paralyzing touch."); + addrace(R_GHAST, "ghast", 50, 'Z', C_LIGHTGREEN, MT_FLESH, RC_UNDEAD, "A more slender and ghost-like form of ghoul. Ghasts are cunning and deadly, and possess a paralyzing touch."); setbodytype(lastrace, BT_HUMANOID); setbodypartname(lastrace, BP_HANDS, "claws"); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -18692,6 +18837,7 @@ void initrace(void) { addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_RARE, NULL); addflag(lastrace->flags, F_RARITY, H_CAVE, NA, RR_RARE, NULL); addflag(lastrace->flags, F_RARITY, H_SWAMP, NA, RR_RARE, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_RARE, NULL); addflag(lastrace->flags, F_SIZE, SZ_HUMAN, NA, NA, NULL); addflag(lastrace->flags, F_HASATTACK, OT_TOUCHCHILL, 4, NA, NULL); addflag(lastrace->flags, F_HITDICE, 5, NA, NA, NULL); @@ -18755,6 +18901,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTATT, A_WIS, AT_HIGH, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CHA, AT_LOW, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_VERYRARE, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_VERYRARE, NULL); addflag(lastrace->flags, F_INDUCEFEAR, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOCORPSE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_BLOODOB, NA, NA, NA, NULL); @@ -18854,7 +19001,7 @@ void initrace(void) { addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); addflag(lastrace->flags, F_FOLLOWTIME, 50, NA, NA, NULL); - addrace(R_REVENANT, "revenant", 60, 'Z', C_BOLDBLUE, MT_FLESH, RC_UNDEAD, "A powerful zombie which retains full memory of its former life and abilities."); + addrace(R_REVENANT, "revenant", 60, 'Z', C_LIGHTBLUE, MT_FLESH, RC_UNDEAD, "A powerful zombie which retains full memory of its former life and abilities."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_HIGH, NA, NULL); @@ -18934,7 +19081,7 @@ void initrace(void) { addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); addflag(lastrace->flags, F_FOLLOWTIME, 50, NA, NA, NULL); - addrace(R_WEREBEAR, "werebear", 90, '@', C_BROWN, MT_FLESH, RC_HUMANOID, "Stout, well-muscled humans with large, thick beards."); + addrace(R_WEREBEAR, "werebear", 90, '@', C_DARKBROWN, MT_FLESH, RC_HUMANOID, "Stout, well-muscled humans with large, thick beards."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_GOOD, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_GTAVERAGE, NA, NULL); @@ -18945,6 +19092,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTATT, A_CHA, AT_LOW, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_RARE, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_UNCOMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_RARE, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SIZE, SZ_HUMAN, NA, NA, NULL); @@ -19023,7 +19171,7 @@ void initrace(void) { addflag(lastrace->flags, F_HITCONFERVALS, P_LYCANTHROPY, -1, PERMENANT, "10^dire rat"); addflag(lastrace->flags, F_FILLPOT, OT_POT_LYCANTHROPY, BLOODFORPOT, NA, NULL); - addrace(R_WEREWOLF, "werewolf", 100, '@', C_BROWN, MT_FLESH, RC_HUMANOID, "Shaggy humans with the uncanny ability to shapeshift into a ferocious wolf."); + addrace(R_WEREWOLF, "werewolf", 100, '@', C_DARKGREY, MT_FLESH, RC_HUMANOID, "Shaggy humans with the uncanny ability to shapeshift into a ferocious wolf."); setbodytype(lastrace, BT_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_HIGH, NA, NULL); @@ -19034,6 +19182,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTATT, A_CHA, AT_LOW, NA, NULL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_UNCOMMON, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, NA, RR_UNCOMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_ICECAVE, NA, RR_RARE, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SIZE, SZ_HUMAN, NA, NA, NULL); @@ -19128,6 +19277,8 @@ void initrace(void) { addflag(lastrace->flags, F_XPVAL, 0, NA, NA, NULL); addrace(R_DANCINGWEAPON, "dancing weapon", 0, ')', C_GREY, MT_METAL, RC_OTHER, "A magically animated weapon."); + addflag(lastrace->flags, F_NOKO, B_TRUE, NA, NA, NULL); + addflag(lastrace->flags, F_GETKILLEDVERB, NA, NA, NA, "destroy"); addflag(lastrace->flags, F_SIZE, SZ_SMALL, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_HIGH, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_AGI, AT_GTAVERAGE, NA, NULL); @@ -19152,7 +19303,7 @@ void initrace(void) { addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); - addrace(R_FLOATINGDISC, "floating disc", 0, '_', C_BOLDGREEN, MT_METAL, RC_OTHER, "A magically created disc of energy which floats in the air."); + addrace(R_FLOATINGDISC, "floating disc", 0, '_', C_LIGHTGREEN, MT_METAL, RC_OTHER, "A magically created disc of energy which floats in the air."); addflag(lastrace->flags, F_SIZE, SZ_MEDIUM, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_EXHIGH, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_AGI, AT_VLOW, NA, NULL); @@ -19176,7 +19327,7 @@ void initrace(void) { addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); - addrace(R_TOOTH, "tooth", 20, '^', C_WHITE, MT_BONE, RC_OTHER, "The sharp tooth of an enormous creature."); + addrace(R_TOOTH, "tooth", 20, '^', C_BONE, MT_BONE, RC_OTHER, "The sharp tooth of an enormous creature."); addbodypart(lastrace, BP_WEAPON, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_NEUTRAL, NA, NA, NULL); addflag(lastrace->flags, F_AWARENESS, B_TRUE, NA, NA, NULL); @@ -19254,6 +19405,8 @@ void initrace(void) { addflag(r->flags, F_DISEASEIMMUNE, B_TRUE, NA, NA, NULL); addflag(r->flags, F_NOSTAM, B_TRUE, NA, NA, NULL); } else if (r->raceclass->id == RC_PLANT) { + addflag(r->flags, F_NOKO, B_TRUE, NA, NA, NULL); + addflag(r->flags, F_GETKILLEDVERB, NA, NA, NA, "destroy"); addflag(r->flags, F_NOBREATH, B_TRUE, NA, NA, NULL); addflag(r->flags, F_DISEASEIMMUNE, B_TRUE, NA, NA, NULL); addflag(r->flags, F_DTRESIST, DT_BASH, NA, NA, NULL); @@ -19273,6 +19426,8 @@ void initrace(void) { addflag(r->flags, F_NOINJURIES, B_TRUE, NA, NA, NULL); addflag(r->flags, F_NOSTAM, B_TRUE, NA, NA, NULL); } else if (r->raceclass->id == RC_ROBOT) { + addflag(r->flags, F_NOKO, B_TRUE, NA, NA, NULL); + addflag(r->flags, F_GETKILLEDVERB, NA, NA, NA, "destroy"); addflag(r->flags, F_NOFLEE, B_TRUE, NA, NA, NULL); addflag(r->flags, F_NOBREATH, B_TRUE, NA, NA, NULL); addflag(r->flags, F_DISEASEIMMUNE, B_TRUE, NA, NA, NULL); diff --git a/data/hiscores.db b/data/hiscores.db index 2d6a543..18c9a83 100644 Binary files a/data/hiscores.db and b/data/hiscores.db differ diff --git a/data/vaults/monsterzoo.vlt b/data/vaults/monsterzoo.vlt index 64c4c2a..73cb007 100644 --- a/data/vaults/monsterzoo.vlt +++ b/data/vaults/monsterzoo.vlt @@ -11,7 +11,7 @@ random(3,3,5,5) autodoors:100 goesin:dungeon ! every cell in here has 1-3 objects and a monster -scatter(1,1,-2,-2) mon:random:100% +scatter(1,1,-2,-2) mon:single random:100% scatter(1,1,-2,-2) ob:random:100% scatter(1,1,-2,-2) ob:random:100% scatter(1,1,-2,-2) ob:random:100%:50 diff --git a/defs.h b/defs.h index ddf6cb0..eec89d7 100644 --- a/defs.h +++ b/defs.h @@ -96,6 +96,9 @@ #define B_TRUE (-1) #define B_MAYBE (-2) +#define B_ADD 1 +#define B_REMOVE -1 + #define B_INADJCELL (-1) #define B_DODAM (-1) @@ -289,6 +292,9 @@ #define MAX_ROOMW (MAX_MAPW / 3) #define MAX_ROOMH (MAX_MAPH / 3) +#define MIN_TEMPERATURE -10 +#define MAX_TEMPERATURE 45 + // askobject options #define AO_NONE 0 #define AO_INCLUDENOTHING 1 @@ -393,6 +399,16 @@ #define MAXDIR_MAP 15 +enum TEMPERATURE { + T_VCOLD = -3, + T_COLD = -2, + T_CHILLY = -1, + T_NORMAL = 0, + T_WARM = 1, + T_HOT = 2, + T_VHOT = 3, +}; + enum CONTAINERCONTENTS { CC_AMMO, CC_FOOD, @@ -611,36 +627,74 @@ enum SHOPACTION { -// ncurses colours +// additional colours +/* +enum ADCOLOR { + COLOR_DARKBROWN = 500, +}; +*/ + +// ncurses colourpairs #define C_NONE (-1) enum COLOUR { - C_RANDOM = -1, - C_BLACK = 0, - C_RED = 1, - C_GREEN = 2, - C_BROWN = 3, - C_BLUE = 4, - C_MAGENTA = 5, - C_CYAN = 6, - C_GREY = 7, - // bolded colours - C_YELLOW = 8, - C_WHITE = 9, - C_BOLDCYAN = 10, - C_BOLDBLUE = 11, - C_BOLDMAGENTA = 12, - C_ORANGE = 13, - C_BOLDGREEN = 14, - C_DARKGREY = 15, + C_RANDOM = -1, + // regular colours + C_BLACK = 0, + C_RED = 1, + C_AQUA, + C_GREEN, + C_BROWN, + C_BLUE, + C_INDIGO, + C_MAGENTA, + C_PINK, + C_CYAN, + C_GREY, + C_YELLOW, + C_WHITE, + // specific colours + C_BONE, + C_BRICK, + C_METAL, + C_MOSS, + C_FLESH, + C_FOG, + C_CARPET1, + C_CARPET2, + C_SMOKE, + C_WOOD, + // dark colours + C_DARKCYAN, + C_DARKBLUE, + C_DARKMAGENTA, + C_DARKYELLOW, + C_ORANGE, + C_DARKGREEN, + C_DARKGREY, + C_DARKBROWN, + C_DARKRED, + C_VDARKGREY, + // light colours + C_LIGHTBLUE, + C_LIGHTBROWN, + C_LIGHTCYAN, + C_LIGHTGREEN, + C_LIGHTMAGENTA, + C_LIGHTRED, + C_LIGHTYELLOW, + C_LAST }; #define C_FIRST C_RED -#define C_LAST C_DARKGREY + +#define COLBASE 64 + +#define BGGAP (C_LAST+1) #define BLACKBG 0 -#define BLUEBG 16 -#define GREENBG 32 -#define REDBG 48 +#define BLUEBG (BGGAP) +#define GREENBG ((BGGAP*2)) +#define REDBG ((BGGAP*3)) enum CASTTYPE { CT_NORMAL = 0, @@ -973,6 +1027,7 @@ enum CELLTYPE { CT_FLOORCARPET, CT_FLOORDURANITE, CT_FLOORSHOP, + CT_FLOORSNOW, CT_FLOORTILE, CT_FLOORWOOD, CT_GRASS, @@ -1519,6 +1574,7 @@ enum MATERIAL { MT_CRYSTAL = 31, MT_DURANITE = 32, MT_BRICK = 33, + MT_SNOW = 34, }; // Object Types @@ -1553,6 +1609,8 @@ enum OBTYPE { OT_VSTAIRSUP, OT_TREEDOWN, OT_TREEUP, + OT_ICESTAIRSDOWN, + OT_ICESTAIRSUP, OT_TUNNELDOWN, OT_TUNNELUP, OT_LUNARGATE, @@ -1823,6 +1881,7 @@ enum OBTYPE { OT_S_FLAMEPILLAR, OT_S_FLAMEBURST, OT_S_GATHERFLAME, + OT_S_HEATWAVE, OT_S_IMMOLATE, OT_S_METEOR, OT_S_NEGATEFIRE, @@ -1836,6 +1895,7 @@ enum OBTYPE { OT_S_CHILL, OT_S_COLDBURST, OT_S_COLDRAY, + OT_S_COLDSNAP, OT_S_CRYSTALARM, OT_S_CRYSTALSHIELD, OT_S_ENDURECOLD, @@ -2210,11 +2270,13 @@ enum OBTYPE { OT_FOOTPRINT, OT_SCENT, // effects + OT_COLDNESS, OT_DUSTCLOUD, OT_DUSTPUFF, OT_FIRELARGE, OT_FIREMED, OT_FIRESMALL, + OT_HEAT, OT_HAILSTORM, OT_HURRICANE, OT_ICEWALL, @@ -2740,6 +2802,8 @@ enum FLAG { // should only be used for SCENT, not footprints. F_NOFEEL, // when blind, don't show "you can feel xxx" F_FEELTEXT, // when blind, show "you can feel"+f->text + F_TEMPMOD, // this object will change its cell's temperature by + // v0. // for items in shops F_VENDITEM, // causes vending machine to show this item as identified //F_SHOPITEM, // v0 is object value. @@ -3098,9 +3162,10 @@ enum FLAG { // if v0/v1 are set, only use this text if dam AMOUNT (not pct) is // between v0 and v1. // should always be singular - F_KILLVERB, // text=verb for a fatal attacking. ie. "kill" "behead" - // if v0/v1 are set, only use this text if dam PCT (not amount) is - // between v0 and v1. + F_KILLVERB, // text=verb this weapon uses for a fatal attacking. + // ie. "kill" "behead" + // if v0/v1 are set, only use this text if + // dam PCT (not amount) is between v0 and v1. // should always be singular F_OBATTACKDELAY, // how long weapon takes to attack F_USESSKILL, // weapon needs skill sk_v0 @@ -3397,6 +3462,8 @@ enum FLAG { F_ARMOURPENALTY, // lower your acc/ev by val0 due to cumbersome // armour. lowered by sk_armour skill. // v0 is accuracy penalty, v1 is evasion penalty. + F_MINCRITCHANCE, // minimum critical hit chance % for this lf + // is v0. F_MINDSHIELD, // lf is immune to psionic attacks F_MISCASTCHANCE, // lf has +v0% chance of spell failure F_LEVRACE, // at level v0, this race is promoted to race v1 @@ -3745,10 +3812,14 @@ enum FLAG { F_SACRIFICEOBMAGIC, // can sacrifice obs which are magical. // v2 = piety per ob + F_GETKILLEDVERB, // text = verb describing how this lf dies. + // NOTE: overrides F_KILLVERB on weapons! F_NAME, // text = lf's name. ie. lfname = "Fred" // also used for names of OT_GRIMOIRE objects F_NAMED, // text = lf's name. ie. lfname = "xat named Fred" + F_NOKO, // this lf cannot be knocked unconscious F_XPMOD, // add/subtract this much from calculated xpval + // for killing this monster. F_BLOODOB, // text = type of object to drop for blood // corpses will inherit the FIRST one of these only. F_UNSUMMONOB, // text = type of object to drop when this creature @@ -4521,6 +4592,7 @@ enum BRANCH { BH_WOODS, BH_BABAYAGAHUT, BH_MASTERVAULTS, + BH_ICECAVERNS, }; enum HABITAT { @@ -4536,6 +4608,7 @@ enum HABITAT { H_BYHUT = 10, H_ANTNEST = 11, H_MASTERVAULTS = 12, + H_ICECAVE = 13, H_ALL = 999 }; @@ -4607,6 +4680,7 @@ typedef struct habitat_s { int randobpct; // % chance that 'something' is an ob rather than monster int randvaultpct; // % chance that a room will be a vault //int maxvisrange; + int temperature; // base temperature. roughly corresponds to celcius enum OBTYPE upstairtype, downstairtype; int stairsinrooms; enum CELLTYPE emptycelltype,solidcelltype; @@ -4778,6 +4852,7 @@ typedef struct cell_s { //int origlittimer; //int littimer; int hp; + int temperature; char *reason; char *lockedreason; diff --git a/god.c b/god.c index d706f99..3049382 100644 --- a/god.c +++ b/god.c @@ -562,6 +562,7 @@ void checkgodbonus(enum RACE rid, enum PIETYLEV newlev, enum PIETYLEV oldlev) { int nretflags,i; enum PIETYLEV plev; lifeform_t *god; + int first = B_TRUE; if (!godprayedto(rid)) return; if (newlev == oldlev) return; god = findgod(rid); @@ -570,12 +571,14 @@ void checkgodbonus(enum RACE rid, enum PIETYLEV newlev, enum PIETYLEV oldlev) { for (i = 0; i < nretflags; i++) { if (newlev < oldlev) { if ((retflag[i]->val[0] > newlev) && (retflag[i]->val[0] <= oldlev)) { - removegodbonus(rid, retflag[i]); + removegodbonus(rid, retflag[i], first); + first = B_FALSE; } } else if (newlev > oldlev) { // piety increased if ((retflag[i]->val[0] <= newlev) && (retflag[i]->val[0] > oldlev)) { - givegodbonus(rid, retflag[i]); + givegodbonus(rid, retflag[i], first); + first = B_FALSE; } } } @@ -867,7 +870,7 @@ enum PIETYLEV getpietylev(enum RACE rid, enum COLOUR *col, char *happiness) { if (happiness) strcpy(happiness, "Angry"); return PL_ANGRY; } else if (piety <= 99) { // 0 - 99 - if (col) *col = C_BROWN; + if (col) *col = C_DARKYELLOW; if (happiness) strcpy(happiness, "Tolerated"); return PL_TOLERATED; } else if (piety <= 199) { // 100 - 199 @@ -879,11 +882,11 @@ enum PIETYLEV getpietylev(enum RACE rid, enum COLOUR *col, char *happiness) { if (happiness) strcpy(happiness, "Pleased"); return PL_PLEASED; } else if (piety <= 399) { // 300 - 399 - if (col) *col = C_BOLDGREEN; + if (col) *col = C_LIGHTGREEN; if (happiness) strcpy(happiness, "Delighted"); return PL_DELIGHTED; } else { // 400+ - if (col) *col = C_BOLDCYAN; + if (col) *col = C_LIGHTCYAN; if (happiness) strcpy(happiness, "Ecstatic"); return PL_ECSTATIC; } @@ -930,7 +933,7 @@ enum OBTYPE getrelatedgodstone(enum RACE rid) { return OT_NONE; } -void givegodbonus(enum RACE rid, flag_t *bf) { +void givegodbonus(enum RACE rid, flag_t *bf, int announce) { flag_t *f; lifeform_t *god; int targ[3], arg = NA; @@ -941,8 +944,10 @@ void givegodbonus(enum RACE rid, flag_t *bf) { if (!god) return; // god announcement. - godsay(rid, B_TRUE, getflagtext(god->flags, F_GODBONUSTEXT)); - more(); + if (announce) { + godsay(rid, B_TRUE, getflagtext(god->flags, F_GODBONUSTEXT)); + more(); + } // increment piety so that it doesn't keep bouncing around the border. modpiety(rid, PIETYPRAYLOSS); @@ -977,8 +982,8 @@ void givegodbonus(enum RACE rid, flag_t *bf) { case SC_SEARCH: godsay(rid, B_FALSE, "That which is hidden shall be revealed!"); break; default: break; } - } else if (arg == F_HEAVYBLOW) { - godsay(rid, B_FALSE, "Foes shall be driven away by your blows!"); break; + } else if (arg == F_MINCRITCHANCE) { + godsay(rid, B_FALSE, "You shall inflict grevious injuries on your foes!"); break; } } break; @@ -1012,7 +1017,7 @@ int prayedtoany(void) { return B_FALSE; } -void removegodbonus(enum RACE rid, flag_t *bf) { +void removegodbonus(enum RACE rid, flag_t *bf, int announce) { int targ[3], arg = NA; enum PIETYLEV bonuslev; enum GODBONUS bonusid; @@ -1022,8 +1027,10 @@ void removegodbonus(enum RACE rid, flag_t *bf) { if (!god) return; // god announcement. - godsay(rid, B_TRUE, getflagtext(god->flags, F_GODNOBONUSTEXT)); - more(); + if (announce) { + godsay(rid, B_TRUE, getflagtext(god->flags, F_GODNOBONUSTEXT)); + more(); + } // parse regular rags parsegodbonusargs(bf, &bonuslev, &bonusid, &arg, targ); @@ -2171,8 +2178,10 @@ int prayto(lifeform_t *lf, lifeform_t *god) { if (changealign != AL_NONE) { setalignment(player, changealign); - msg("^gYour alignment has changed to %s!", getalignmentname(changealign)); + msg("^BYour alignment has changed to %s!", getalignmentname(changealign)); more(); + msg("^B(you will receive -15%% XP for the next 1001 turns)"); + addtempflag(player->flags, F_LEARNBOOST, -15, NA, NA, NULL, 1001); } diff --git a/god.h b/god.h index b2fda13..70b112f 100644 --- a/god.h +++ b/god.h @@ -15,7 +15,7 @@ int getprayedgods(lifeform_t **retgod, int *nretgods); lifeform_t *getrandomgod(void); lifeform_t *getrandomprayedgod(void); enum OBTYPE getrelatedgodstone(enum RACE rid); -void givegodbonus(enum RACE rid, flag_t *bf); +void givegodbonus(enum RACE rid, flag_t *bf, int announce); lifeform_t *godappears(enum RACE rid, cell_t *where); void god_usepoison_response(void); int godblocked(enum RACE rid); @@ -30,6 +30,6 @@ void pleasegod(enum RACE rid, int amt); void pleasegodmaybe(enum RACE rid, int amt); int prayto(lifeform_t *lf, lifeform_t *god); int prayedtoany(void); -void removegodbonus(enum RACE rid, flag_t *bf); +void removegodbonus(enum RACE rid, flag_t *bf, int announce); void setpiety(enum RACE rid, int amt); int uncurse_one_equipped(lifeform_t *lf, char *text); diff --git a/io.c b/io.c index 6106c64..8e3dde3 100644 --- a/io.c +++ b/io.c @@ -1793,7 +1793,7 @@ int announceflaggain(lifeform_t *lf, flag_t *f) { if (lf2) { getlfname(lf2, buf); if ((f->lifetime == PERMENANT) || (f->lifetime >= 4)) { - msg("^%d%s turn%s to flee from %s!", getlfcol(lf, CC_BAD), + msg("^%c%s turn%s to flee from %s!", getlfcol(lf, CC_BAD), lfname, isplayer(lf) ? "" : "s", (cansee(player, lf2) || isplayer(lf2)) ? buf : "something"); } else { // jsut scared a little bit @@ -1926,7 +1926,11 @@ int announceflaggain(lifeform_t *lf, flag_t *f) { break; case F_LEARNBOOST: if (isplayer(lf)) { - msg("You feel more receptive to new knowledge!"); + if (f->val[0] > 0) { + msg("^gYou feel more receptive to new knowledge!"); + } else { + msg("^bYou feel less receptive to new knowledge!"); + } donesomething = B_TRUE; } break; @@ -2703,7 +2707,11 @@ int announceflagloss(lifeform_t *lf, flag_t *f) { break; case F_LEARNBOOST: if (isplayer(lf)) { - msg("You no longer feel receptive to new knowledge."); + if (f->val[0] > 0) { + msg("You no longer feel receptive to new knowledge."); + } else { + msg("You no longer feel opposed to new knowledge."); + } donesomething = B_TRUE; } break; @@ -3338,9 +3346,9 @@ void listobs(WINDOW *win, object_t **mylist, int *sellist, int *selcount, int fi setobcolour(win, mylist[i], B_FALSE); if (strlen(equipbuf)) { - setcol(win, C_BROWN); + setcol(win, C_DARKYELLOW); wprintw(win, "%s", equipbuf); - unsetcol(win, C_BROWN); + unsetcol(win, C_DARKYELLOW); } if (strlen(pointsbuf)) { @@ -7397,7 +7405,7 @@ char *makedesc_ob(object_t *o, char *retbuf) { (f->val[0] == A_AGI) ? "" : "%"); } sprintf(buf, "^%dYour low %s will decrease your %s with this weapon %s.^n\n", - C_BROWN, + C_DARKYELLOW, getattrname(f->val[0]), (f->val[0] == A_AGI) ? "accuracy" : "damage", howmuch); @@ -7572,7 +7580,7 @@ char *makedesc_race(enum RACE rid, char *retbuf, int showextra, int forplayersel case AT_GTAVERAGE: sprintf(ch, "%-4s", "+"); col = C_GREEN; break; case AT_HIGH: sprintf(ch, "%-4s", "++"); col = C_GREEN; break; case AT_VHIGH: sprintf(ch, "%-4s", "+++"); col = C_GREEN; break; - case AT_EXHIGH: sprintf(ch, "%-4s", "++++"); col = C_BOLDBLUE; break; + case AT_EXHIGH: sprintf(ch, "%-4s", "++++"); col = C_LIGHTBLUE; break; default: case AT_AVERAGE: sprintf(ch, "%-4s", "-"); col = C_GREY; break; } @@ -9563,9 +9571,31 @@ void doheadingsmall(WINDOW *win, int y, int x, char *format, char *heading) { unsetcol(win, C_WHITE); } +// wrapper for ncurses init_color +void initcol(short c, short r, short g, short b) { + int rv; + rv = init_color(COLBASE+c, r, g, b); + if (rv == ERR) { + dblog("ERROR setting colour %d to { %d,%d,%d }",c,r,g,b); + exit(1); + } +} + +// wrapper for init_pair +void initcolpair(int pairidx, enum COLOUR fg, enum COLOUR bg ) { + int rv; + rv = init_pair(pairidx, COLBASE+fg, COLBASE+bg); + if (rv == ERR) { + dblog("ERROR setting colourpair %d to fg=%s bg=%s",pairidx,getcolname(fg),getcolname(bg)); + exit(1); + } +} + void initgfx(void) { int msgwinh = 2; int statwinh = 3; + int i; + short r,g,b; setlocale(LC_CTYPE, ""); @@ -9573,83 +9603,74 @@ void initgfx(void) { // colour setup if (!has_colors()) { - printf("Terminal does not support colour.\n"); + wprintw(mainwin,"Terminal does not support colour.\n"); hascolour = B_FALSE; exit(1); } - start_color(); + if (!can_change_color()){ + wprintw(mainwin,"Terminal does not support changes to colours.\n"); + exit(1); + } + start_color(); + dblog("colour pairs = %d", COLOR_PAIRS); + dblog("colours = %d", COLORS); + // init extra colours + initcol(C_BLACK, 0, 0, 0); + initcol(C_AQUA, 12, 672, 632); + initcol(C_RED, 1000, 0, 0); + initcol(C_GREEN, 0, 1000, 0); + initcol(C_BLUE, 0, 0, 1000); + initcol(C_INDIGO, 300, 0, 520); + initcol(C_MAGENTA, 1000, 0, 1000); + initcol(C_PINK, 820, 368, 368); + initcol(C_CYAN, 0, 1000, 1000); + initcol(C_GREY, 800, 800, 800); + initcol(C_YELLOW, 1000, 1000, 0); + initcol(C_BROWN, 584, 444, 264); + initcol(C_WHITE, 1000, 1000, 1000); + // specific colours + initcol(C_BONE, 556, 548, 448); + initcol(C_BRICK, 568, 140, 140); + initcol(C_METAL, 500, 500, 500); + initcol(C_FLESH, 952, 612, 408); + initcol(C_FOG, 812, 808, 728); + initcol(C_MOSS, 0, 748, 428); + initcol(C_CARPET1, 560, 480, 336); + initcol(C_CARPET2, 0, 556, 468); + initcol(C_SMOKE, 250, 250, 300); + initcol(C_WOOD, 384, 244, 64); + // dark cols + initcol(C_DARKCYAN, 0, 500, 500); + initcol(C_DARKBLUE, 0, 0, 500); + initcol(C_DARKMAGENTA, 500, 0, 500); + initcol(C_DARKGREEN, 0, 500, 0); + initcol(C_ORANGE, 992, 468, 196); + initcol(C_DARKGREY, 360, 360, 360); + initcol(C_VDARKGREY, 150, 150, 150); + initcol(C_DARKBROWN, 384, 244, 64); + initcol(C_DARKYELLOW, 650, 650, 0); + initcol(C_DARKRED, 500, 0, 0); + // light cols + initcol(C_LIGHTRED, 1000, 500, 500); + initcol(C_LIGHTBLUE, 500, 500, 1000); + initcol(C_LIGHTBROWN, 784, 644, 464); + initcol(C_LIGHTCYAN, 500, 1000, 1000); + initcol(C_LIGHTGREEN, 500, 1000, 500); + initcol(C_LIGHTMAGENTA, 1000, 500, 1000); + initcol(C_LIGHTYELLOW, 1000, 1000, 500); - // 0 through 15 - init_pair(C_BLACK, COLOR_BLACK, COLOR_BLACK); - init_pair(C_RED, COLOR_RED, COLOR_BLACK); - init_pair(C_GREEN, COLOR_GREEN, COLOR_BLACK); - init_pair(C_BROWN, COLOR_YELLOW, COLOR_BLACK); - init_pair(C_YELLOW, COLOR_YELLOW, COLOR_BLACK); - init_pair(C_BLUE, COLOR_BLUE, COLOR_BLACK); - init_pair(C_MAGENTA, COLOR_MAGENTA, COLOR_BLACK); - init_pair(C_CYAN, COLOR_CYAN, COLOR_BLACK); - init_pair(C_GREY, COLOR_WHITE, COLOR_BLACK); - init_pair(C_YELLOW, COLOR_YELLOW, COLOR_BLACK); - init_pair(C_WHITE, COLOR_WHITE, COLOR_BLACK); - init_pair(C_BOLDCYAN, COLOR_CYAN, COLOR_BLACK); - init_pair(C_BOLDBLUE, COLOR_BLUE, COLOR_BLACK); - init_pair(C_BOLDMAGENTA, COLOR_MAGENTA, COLOR_BLACK); - init_pair(C_BOLDGREEN, COLOR_GREEN, COLOR_BLACK); - init_pair(C_ORANGE, COLOR_RED, COLOR_BLACK); - init_pair(C_DARKGREY, COLOR_BLACK, COLOR_BLACK); + // placeholder + initcol(C_LAST, 0, 0, 0); - // 16 through 31 - init_pair(BLUEBG+C_BLACK, COLOR_BLACK, COLOR_BLUE); - init_pair(BLUEBG+C_RED, COLOR_RED, COLOR_BLUE); - init_pair(BLUEBG+C_GREEN, COLOR_GREEN, COLOR_BLUE); - init_pair(BLUEBG+C_BROWN, COLOR_YELLOW, COLOR_BLUE); - init_pair(BLUEBG+C_YELLOW, COLOR_YELLOW, COLOR_BLUE); - init_pair(BLUEBG+C_BLUE, COLOR_BLUE, COLOR_BLUE); - init_pair(BLUEBG+C_MAGENTA, COLOR_MAGENTA, COLOR_BLUE); - init_pair(BLUEBG+C_CYAN, COLOR_CYAN, COLOR_BLUE); - init_pair(BLUEBG+C_GREY, COLOR_WHITE, COLOR_BLUE); - init_pair(BLUEBG+C_YELLOW, COLOR_YELLOW, COLOR_BLUE); - init_pair(BLUEBG+C_WHITE, COLOR_WHITE, COLOR_BLUE); - init_pair(BLUEBG+C_BOLDCYAN, COLOR_CYAN, COLOR_BLUE); - init_pair(BLUEBG+C_BOLDBLUE, COLOR_BLUE, COLOR_BLUE); - init_pair(BLUEBG+C_BOLDMAGENTA, COLOR_MAGENTA, COLOR_BLUE); - init_pair(BLUEBG+C_BOLDGREEN, COLOR_GREEN, COLOR_BLUE); - init_pair(BLUEBG+C_ORANGE, COLOR_RED, COLOR_BLUE); + for (i = C_RED; i <= C_LAST; i++) { + initcolpair(i, i, C_BLACK); + init_pair(i+BLUEBG, i, COLOR_BLUE); + init_pair(i+GREENBG, i, COLOR_GREEN); + init_pair(i+REDBG, i, COLOR_RED); + } - // 32 through 47 - init_pair(GREENBG+C_BLACK, COLOR_BLACK, COLOR_GREEN); - init_pair(GREENBG+C_RED, COLOR_RED, COLOR_GREEN); - init_pair(GREENBG+C_GREEN, COLOR_GREEN, COLOR_GREEN); - init_pair(GREENBG+C_BROWN, COLOR_YELLOW, COLOR_GREEN); - init_pair(GREENBG+C_YELLOW, COLOR_YELLOW, COLOR_GREEN); - init_pair(GREENBG+C_BLUE, COLOR_BLUE, COLOR_GREEN); - init_pair(GREENBG+C_MAGENTA, COLOR_MAGENTA, COLOR_GREEN); - init_pair(GREENBG+C_CYAN, COLOR_CYAN, COLOR_GREEN); - init_pair(GREENBG+C_GREY, COLOR_WHITE, COLOR_GREEN); - init_pair(GREENBG+C_YELLOW, COLOR_YELLOW, COLOR_GREEN); - init_pair(GREENBG+C_WHITE, COLOR_WHITE, COLOR_GREEN); - init_pair(GREENBG+C_BOLDCYAN, COLOR_CYAN, COLOR_GREEN); - init_pair(GREENBG+C_BOLDBLUE, COLOR_BLUE, COLOR_GREEN); - init_pair(GREENBG+C_BOLDMAGENTA, COLOR_MAGENTA, COLOR_GREEN); - init_pair(GREENBG+C_BOLDGREEN, COLOR_GREEN, COLOR_GREEN); - init_pair(GREENBG+C_ORANGE, COLOR_RED, COLOR_GREEN); - // 48 through 63 - init_pair(REDBG+C_BLACK, COLOR_BLACK, COLOR_RED); - init_pair(REDBG+C_RED, COLOR_RED, COLOR_RED); - init_pair(REDBG+C_GREEN, COLOR_GREEN, COLOR_RED); - init_pair(REDBG+C_BROWN, COLOR_YELLOW, COLOR_RED); - init_pair(REDBG+C_YELLOW, COLOR_YELLOW, COLOR_RED); - init_pair(REDBG+C_BLUE, COLOR_BLUE, COLOR_RED); - init_pair(REDBG+C_MAGENTA, COLOR_MAGENTA, COLOR_RED); - init_pair(REDBG+C_CYAN, COLOR_CYAN, COLOR_RED); - init_pair(REDBG+C_GREY, COLOR_WHITE, COLOR_RED); - init_pair(REDBG+C_YELLOW, COLOR_YELLOW, COLOR_RED); - init_pair(REDBG+C_WHITE, COLOR_WHITE, COLOR_RED); - init_pair(REDBG+C_BOLDCYAN, COLOR_CYAN, COLOR_RED); - init_pair(REDBG+C_BOLDBLUE, COLOR_BLUE, COLOR_RED); - init_pair(REDBG+C_BOLDMAGENTA, COLOR_MAGENTA, COLOR_RED); - init_pair(REDBG+C_BOLDGREEN, COLOR_GREEN, COLOR_RED); - init_pair(REDBG+C_ORANGE, COLOR_RED, COLOR_RED); + color_content(C_WHITE,&r,&g,&b); + dblog("white is %d,%d,%d",r,g,b); noecho(); // TODO: change back to raw mode, or make this a switch @@ -9763,6 +9784,28 @@ int drop(object_t *o, int count) { return B_FALSE; } +void dumpcols(void) { + int i; + int margin = 0; + int x = 0,y = 0; + char buf[BUFLEN]; + cls(); + for (i = C_BLACK; i < C_LAST; i++) { + wmove(mainwin, y, x); + sprintf(buf, "^%d %d. This is %s^n\n",i,i,getcolname(i)); + textwithcol(mainwin, buf); + y++; x = margin; + + if (y >= 18) { + y = 0; + margin = 40; + x = margin; + } + } + getch(); + restoregamewindows(); +} + void dumpskills(void) { skill_t *sk; char buf[BUFLEN],thisline[BUFLEN]; @@ -9884,15 +9927,15 @@ void forceredraw(void) { enum COLOUR getattrcolour(enum ATTRBRACKET brack) { switch (brack) { - case AT_EXLOW: return C_BOLDMAGENTA; + case AT_EXLOW: return C_LIGHTMAGENTA; case AT_VLOW: return C_MAGENTA; case AT_LOW: return C_RED; - case AT_LTAVERAGE: return C_BROWN; + case AT_LTAVERAGE: return C_DARKYELLOW; case AT_AVERAGE: return C_GREY; case AT_GTAVERAGE: return C_GREEN; case AT_HIGH: return C_BLUE; case AT_VHIGH: return C_CYAN; - case AT_EXHIGH: return C_BOLDCYAN; + case AT_EXHIGH: return C_LIGHTCYAN; default: break; } @@ -10149,10 +10192,10 @@ char getchoicestr(prompt_t *prompt, int useshortcuts, int showallatstart) { } // only print if we're not off the bottom if ((i >= first) && !atbottom) { - if (nvalid && !foundfirstvalid) setcol(mainwin, C_BOLDGREEN); + if (nvalid && !foundfirstvalid) setcol(mainwin, C_LIGHTGREEN); mvwprintw(mainwin, y, 0, "%s%s", indenttext, prompt->choice[i].desc); y++; - if (nvalid && !foundfirstvalid) unsetcol(mainwin, C_BOLDGREEN); + if (nvalid && !foundfirstvalid) unsetcol(mainwin, C_LIGHTGREEN); foundfirstvalid = B_TRUE; } @@ -11074,10 +11117,10 @@ int needsbold(enum COLOUR col) { switch (col) { case C_YELLOW: case C_WHITE: - case C_BOLDCYAN: - case C_BOLDBLUE: - case C_BOLDMAGENTA: - case C_BOLDGREEN: + case C_LIGHTCYAN: + case C_LIGHTBLUE: + case C_LIGHTMAGENTA: + case C_LIGHTGREEN: case C_ORANGE: case C_DARKGREY: return B_TRUE; @@ -11190,18 +11233,18 @@ void drawstatus(void) { if (lfhasflag(player, F_HASNEWLEVEL)) { wattron(statwin, A_BOLD); wprintw(statwin, "/"); wattroff(statwin, A_BOLD); - setcol(statwin, C_BOLDGREEN); + setcol(statwin, C_LIGHTGREEN); wprintw(statwin, "LevUp",xpleft); - unsetcol(statwin, C_BOLDGREEN); + unsetcol(statwin, C_LIGHTGREEN); } else { wattron(statwin, A_BOLD); wprintw(statwin, "/"); wattroff(statwin, A_BOLD); wprintw(statwin, "%d%%",xpleft); } wattron(statwin, A_BOLD); wprintw(statwin, " Trn:"); wattroff(statwin, A_BOLD); - if (player->skillpoints > 0) setcol(statwin, C_BOLDGREEN); + if (player->skillpoints > 0) setcol(statwin, C_LIGHTGREEN); wprintw(statwin, "%d", player->skillpoints); - if (player->skillpoints > 0) unsetcol(statwin, C_BOLDGREEN); + if (player->skillpoints > 0) unsetcol(statwin, C_LIGHTGREEN); wprintw(statwin, "/%d%% ", (int) ((float)player->skillxp / (float)getspforpoint(player) * 100.0) ); @@ -11223,9 +11266,9 @@ void drawstatus(void) { unsetcol(statwin, C_RED); } if (lfhasflag(player, F_GRAVLESSENED)) { - setcol(statwin, C_BOLDBLUE); + setcol(statwin, C_LIGHTBLUE); wprintw(statwin, " LoGrv"); - unsetcol(statwin, C_BOLDBLUE); + unsetcol(statwin, C_LIGHTBLUE); } if (lfhasflag(player, F_RAGE)) { @@ -11235,29 +11278,29 @@ void drawstatus(void) { } if (isswimming(player)) { - setcol(statwin, C_BOLDBLUE); + setcol(statwin, C_LIGHTBLUE); wprintw(statwin, " Swim"); - unsetcol(statwin, C_BOLDBLUE); + unsetcol(statwin, C_LIGHTBLUE); } if (isclimbing(player)) { - setcol(statwin, C_BOLDBLUE); + setcol(statwin, C_LIGHTBLUE); wprintw(statwin, " Climb"); - unsetcol(statwin, C_BOLDBLUE); + unsetcol(statwin, C_LIGHTBLUE); } if (isairborne(player, &height)) { if (lfhasflag(player, F_FLYING)) { - setcol(statwin, C_BOLDBLUE); + setcol(statwin, C_LIGHTBLUE); wprintw(statwin, " Fly:%d",height); - unsetcol(statwin, C_BOLDBLUE); + unsetcol(statwin, C_LIGHTBLUE); } else if (lfhasflag(player, F_LEVITATING)) { - setcol(statwin, C_BOLDBLUE); + setcol(statwin, C_LIGHTBLUE); wprintw(statwin, " Lev"); - unsetcol(statwin, C_BOLDBLUE); + unsetcol(statwin, C_LIGHTBLUE); } else { - setcol(statwin, C_BOLDBLUE); + setcol(statwin, C_LIGHTBLUE); wprintw(statwin, " Hov"); // "hov"ering - unsetcol(statwin, C_BOLDBLUE); + unsetcol(statwin, C_LIGHTBLUE); } } @@ -11347,13 +11390,12 @@ void drawstatus(void) { } } - // burdened somehow? switch (isburdened(player)) { case BR_BURDENED: - setcol(statwin, C_BROWN); + setcol(statwin, C_DARKYELLOW); wprintw(statwin, " Burdened"); - unsetcol(statwin, C_BROWN); + unsetcol(statwin, C_DARKYELLOW); break; case BR_STRAINED: setcol(statwin, C_RED); @@ -11369,7 +11411,6 @@ void drawstatus(void) { break; } - if (lfhasflag(player, F_PAIN)) { setcol(statwin, C_YELLOW); wprintw(statwin, " Pain"); @@ -11383,10 +11424,10 @@ void drawstatus(void) { strcpy(dstring, getdrunktext(f)); capitalise(dstring); - setcol(statwin, C_BROWN); + setcol(statwin, C_DARKYELLOW); //wprintw(statwin, " %s(%d)", dstring,f->lifetime); wprintw(statwin, " %s", dstring); - unsetcol(statwin, C_BROWN); + unsetcol(statwin, C_DARKYELLOW); } f = ispoisoned(player); @@ -11404,9 +11445,9 @@ void drawstatus(void) { wprintw(statwin, " %s(bad)", pt->desc); unsetcol(statwin, C_RED); } else { - setcol(statwin, C_BROWN); + setcol(statwin, C_DARKYELLOW); wprintw(statwin, " %s(mild)", pt->desc); - unsetcol(statwin, C_BROWN); + unsetcol(statwin, C_DARKYELLOW); } } else { setcol(statwin, C_RED); @@ -11428,10 +11469,10 @@ void drawstatus(void) { capitalise(buf2); } if (hlev == H_STARVING) setcol(statwin, C_RED); - else setcol(statwin, C_BROWN); + else setcol(statwin, C_DARKYELLOW); wprintw(statwin, " %s", buf2); if (hlev == H_STARVING) unsetcol(statwin, C_RED); - else unsetcol(statwin, C_BROWN); + else unsetcol(statwin, C_DARKYELLOW); } @@ -11465,6 +11506,29 @@ void drawstatus(void) { */ + switch (getlftemp(player)) { + case T_VCOLD: + setcol(statwin, C_MAGENTA); wprintw(statwin, " V.Cold"); unsetcol(statwin, C_MAGENTA); + break; + case T_COLD: + setcol(statwin, C_RED); wprintw(statwin, " Cold"); unsetcol(statwin, C_RED); + break; + case T_CHILLY: + setcol(statwin, C_YELLOW); wprintw(statwin, " Chilly"); unsetcol(statwin, C_YELLOW); + break; + case T_NORMAL: + break; + case T_WARM: + setcol(statwin, C_YELLOW); wprintw(statwin, " Warm"); unsetcol(statwin, C_YELLOW); + break; + case T_HOT: + setcol(statwin, C_YELLOW); wprintw(statwin, " Hot"); unsetcol(statwin, C_YELLOW); + break; + case T_VHOT: + setcol(statwin, C_MAGENTA); wprintw(statwin, " V.Hot"); unsetcol(statwin, C_MAGENTA); + break; + } + f = hasflag(player->flags, F_AUTOCMD); if (f) { if (strlen(waitbuf)) strcat(waitbuf, ", "); @@ -11503,11 +11567,14 @@ void drawstatus(void) { } //wprintw(statwin, "DLev:%d", player->cell->map->depth); - setcol(statwin, C_BROWN); + //setcol(statwin, C_DARKYELLOW); + // ooooooooooooo fix. + setcol(statwin, C_WHITE); getregionname(buf, player->cell->map, NULL, RF_WITHLEVEL); capitalise(buf); wprintw(statwin, "%s", buf); - unsetcol(statwin, C_BROWN); + //unsetcol(statwin, C_DARKYELLOW); + unsetcol(statwin, C_WHITE); } @@ -11616,19 +11683,23 @@ void select_new_spell(enum SPELLSCHOOL ss) { } void setcol(WINDOW *win, enum COLOUR col) { + /* if (needsbold(col)) { wattron(win, A_BOLD); } else { wattroff(win, A_BOLD); } + */ wattron(win, COLOR_PAIR(col)); } void unsetcol(WINDOW *win, enum COLOUR col) { wattroff(win, COLOR_PAIR(col)); + /* if (needsbold(col)) { wattroff(win, A_BOLD); } + */ } void setobcolour(WINDOW *win, object_t *o, int set) { @@ -11669,7 +11740,7 @@ void setobcolour(WINDOW *win, object_t *o, int set) { return; } if (lfhasflag(player, F_DETECTMAGIC) && ismagical(o)) { - funcptr(win, C_BOLDGREEN); + funcptr(win, C_LIGHTGREEN); return; } @@ -11686,7 +11757,7 @@ int showhiscoreline(void *hilitescore, int ncols, char **argv, char **colname) { else if (streq(colname[i], "job")) job = strdup(argv[i]); else if (streq(colname[i], "killedby")) killer = strdup(argv[i]); } - if (streq(score, (char *)hilitescore)) setcol(mainwin, C_BOLDGREEN); + if (streq(score, (char *)hilitescore)) setcol(mainwin, C_LIGHTGREEN); wprintw(mainwin, HISCOREFORMAT, rank, score, name, job); // last field should be wrapped with lines 2+ indented @@ -11694,7 +11765,7 @@ int showhiscoreline(void *hilitescore, int ncols, char **argv, char **colname) { origy = y; wrapprint(mainwin, &y, &x, x, "%s", killer); - if (streq(score, (char *)hilitescore)) unsetcol(mainwin, C_BOLDGREEN); + if (streq(score, (char *)hilitescore)) unsetcol(mainwin, C_LIGHTGREEN); if (y == origy) { wprintw(mainwin, "\n\n"); @@ -11869,7 +11940,7 @@ void showlfstats(lifeform_t *lf, int showall) { } else if (lorelev == PR_MASTER) { lorecol = C_GREY; // ie. no colour } else { - lorecol = C_BROWN; + lorecol = C_DARKYELLOW; } // override showall sometimes... @@ -11909,6 +11980,9 @@ void showlfstats(lifeform_t *lf, int showall) { y = 0; ch = '\0'; if (mode == '@') { + int temp,ctemp; + getcelltemp(lf->cell, &ctemp); + temp = getlftemp(lf); wattron(mainwin, A_UNDERLINE); if (isplayer(lf)) { centre(mainwin, C_WHITE, 0, "CHARACTER DETAILS"); @@ -12822,6 +12896,14 @@ void showlfstats(lifeform_t *lf, int showall) { wrapprint(mainwin, &y, &x, 0, "%s %s made out of %s. ",you(lf), is(lf), mt->name); } + if (temp != T_NORMAL) { + if (isplayer(lf)) { + wrapprint(mainwin, &y, &x, 0, "You are feeling %s (%d degrees).", gettemperaturename(temp),ctemp); + } else if (lorelev >= PR_BEGINNER) { + wrapprint(mainwin, &y, &x, 0, "%s looks %s.", gettemperaturename(temp)); + } + } + if ((y == starty) && (x == startx)) { wrapprint(mainwin, &y, &x, 0, "Nothing obvious."); } @@ -13674,9 +13756,18 @@ void showlfstats(lifeform_t *lf, int showall) { } f = hasflag_real(lf->flags, F_DODGES, B_TRUE, NULL, FROMRACE); if (f) { - mvwprintw(mainwin, y, 0, "%s will automatically use your remaining stamina to dodge fatal attacks.", you(lf)); + mvwprintw(mainwin, y, 0, "%s will automatically use %s remaining stamina to dodge fatal attacks.", you(lf), your(lf)); y++; } + getflags(lf->flags, retflag, &nretflags, F_LEARNBOOST, F_NONE); + for (i = 0; i < nretflags; i++) { + f = retflag[i]; + if (f && f->known) { + mvwprintw(mainwin, y, 0, "%s have a %d%% %s to earned experience points.", you(lf), + f->val[0], (f->val[0] > 0) ? "bonus" : "penalty"); + y++; + } + } f = lfhasknownflag(lf, F_MAGICARMOUR); if (f && (f->known)) { @@ -13705,6 +13796,12 @@ void showlfstats(lifeform_t *lf, int showall) { isplayer(lf) ? "your" : "its", boost); y++; } + f = lfhasknownflag(lf, F_MINCRITCHANCE); + if (f && (f->known)) { + mvwprintw(mainwin, y, 0, "%s attacks are guided by the gods, granting a minimum %d%% criticial hit chance.", + your(lf), f->val[0]); + y++; + } f = lfhasknownflag(lf, F_MINDSHIELD); if (f && (f->known)) { mvwprintw(mainwin, y, 0, "%s are protected from psionic attacks.", you(lf)); @@ -14204,10 +14301,10 @@ void showlfstats(lifeform_t *lf, int showall) { case C_ORANGE: strcpy(colbuf, "^T"); break; case C_RED: strcpy(colbuf, "^B"); break; case C_YELLOW: strcpy(colbuf, "^w"); break; - case C_BROWN: strcpy(colbuf, "^b"); break; + case C_DARKYELLOW: strcpy(colbuf, "^b"); break; case C_GREEN: strcpy(colbuf, "^g"); break; - case C_BOLDGREEN: strcpy(colbuf, "^G"); break; - case C_BOLDCYAN: strcpy(colbuf, "^E"); break; + case C_LIGHTGREEN: strcpy(colbuf, "^G"); break; + case C_LIGHTCYAN: strcpy(colbuf, "^E"); break; default: case C_GREY: strcpy(colbuf, "^n"); break; } @@ -14457,9 +14554,9 @@ void tombstone(lifeform_t *lf) { minrank = 1; maxrank = 10; } else { - setcol(mainwin, C_BOLDGREEN); + setcol(mainwin, C_LIGHTGREEN); mvwprintw(mainwin, y, 0, "You made rank #%d on the high score table!", rank); y++; - unsetcol(mainwin, C_BOLDGREEN); + unsetcol(mainwin, C_LIGHTGREEN); minrank = rank - 4; maxrank = rank + 4; limit(&minrank, 0, NA); diff --git a/io.h b/io.h index 71b038c..73876cd 100644 --- a/io.h +++ b/io.h @@ -94,6 +94,7 @@ void drawstatus(void); int drop(object_t *o, int count); void dumpbuildingusage(void); void dumpoc(void); +void dumpcols(void); void dumpskills(void); void dumpspells(void); void dumpweps(void); @@ -109,6 +110,8 @@ int haschoice(prompt_t *p, char ch); choice_t *haschoicedata(prompt_t *p, void *data); void doheading(WINDOW *win, int *y, int x, char *what); void doheadingsmall(WINDOW *win, int y, int x, char *format, char *heading); +void initcol(short c, short r, short g, short b); +void initcolpair(int pairidx, enum COLOUR fg, enum COLOUR bg ); void initgfx(void); void initprompt(prompt_t *p, char *q1); int keycodetokey(int keycode, int escseqok); diff --git a/lf.c b/lf.c index 2c8de19..55588a3 100644 --- a/lf.c +++ b/lf.c @@ -8331,11 +8331,11 @@ int gethppct(lifeform_t *lf) { enum COLOUR gethungercol(enum HUNGER hlev) { enum COLOUR col = C_GREY; switch (hlev) { - case H_STUFFED: col = C_BOLDBLUE; break; - case H_FULL: col = C_BOLDGREEN; break; + case H_STUFFED: col = C_LIGHTBLUE; break; + case H_FULL: col = C_LIGHTGREEN; break; case H_NONE: col = C_GREEN; break; case H_PECKISH: col = C_GREY; break; - case H_HUNGRY: col = C_BROWN; break; + case H_HUNGRY: col = C_DARKYELLOW; break; case H_VHUNGRY: col = C_YELLOW; break; default: case H_STARVING: col = C_RED; break; } @@ -8510,6 +8510,7 @@ int getlfaccuracy(lifeform_t *lf, object_t *wep) { flag_t *retflag[MAXCANDIDATES]; int nretflags; int unarmed = B_FALSE; + enum TEMPERATURE temp; // get weapon if (wep) { @@ -8605,6 +8606,22 @@ int getlfaccuracy(lifeform_t *lf, object_t *wep) { } } + // cold = less accuracy + temp = getlftemp(lf); + switch (temp) { + case T_CHILLY: + acc -= (getexposedlimbs(lf)*2); + break; + case T_COLD: + acc -= (getexposedlimbs(lf)*3); + break; + case T_VCOLD: + acc -= (getexposedlimbs(lf)*4); + break; + default: break; + } + + // day/night boosts if (isnighttime()) { f = lfhasflag(lf, F_NIGHTBOOST); @@ -8736,6 +8753,38 @@ enum LFCONDITION getlfcondition(lifeform_t *lf) { return C_DEAD; } +enum TEMPERATURE getlftemp(lifeform_t *lf) { + int temp; + enum TEMPERATURE brack; + // start with cell temperature + brack = getcelltemp(lf->cell, &temp); + // cold? + if (brack < T_NORMAL) { + // adjust for warm/cold blood + if (lfhasflag(lf, F_COLDBLOOD)) { + brack = T_NORMAL; + } else if (isimmuneto(lf->flags, DT_COLD, B_FALSE)) { + brack = T_NORMAL; + } else if (isresistantto(lf->flags, DT_COLD, B_FALSE)) { + brack++; // one bracket higher + } else if (isvulnto(lf->flags, DT_COLD, B_FALSE) && (brack > T_VCOLD)) { + brack--; // one bracket lower + } + } else if (brack > T_NORMAL) { + // adjust for warm/cold blood + if (lfhasflag(lf, F_COLDBLOOD) && (brack < T_VHOT)) { + brack++; + } else if (isimmuneto(lf->flags, DT_FIRE, B_FALSE)) { + brack = T_NORMAL; + } else if (isresistantto(lf->flags, DT_FIRE, B_FALSE)) { + brack--; // one bracket lower + } else if (isvulnto(lf->flags, DT_FIRE, B_FALSE) && (brack < T_VHOT)) { + brack++; // one bracket higher + } + } + return brack; +} + // returns a value representing 'lf's height off the ground. // higher value means higher int getfeetheight(lifeform_t *lf) { @@ -13230,7 +13279,6 @@ int injure(lifeform_t *lf, enum BODYPART where, enum DAMTYPE damtype, enum INJUR } } - return B_FALSE; } @@ -13253,6 +13301,9 @@ int lfcanbekod(lifeform_t *lf) { if (isdead(lf)) { return B_FALSE; } + if (lfhasflag(lf, F_NOKO)) { + return B_FALSE; + } // note: not checking whether they are already unconscious // because merciful weapons CAN still KO them in this case. return B_TRUE; @@ -16439,7 +16490,7 @@ int losehp_real(lifeform_t *lf, int amt, enum DAMTYPE damtype, lifeform_t *froml killflagsofid(lf->flags, F_HIDING); // methods of knocking unconscious - if (!lfcanbekod(lf)) { + if (lfcanbekod(lf)) { // merciful weapons - these will ALWAYS ko, even if // they are already unconscious. if (!ko && fromob) { @@ -17600,6 +17651,7 @@ void modmorale(lifeform_t *lf, int howmuch) { void modstamina(lifeform_t *lf, float howmuch) { float orig; + enum TEMPERATURE temp; if (howmuch == 0) return; @@ -17613,6 +17665,15 @@ void modstamina(lifeform_t *lf, float howmuch) { if (lfhasflag(lf, F_RAGE) && (howmuch < 0)) return; if (lfhasflag(lf, F_CAFFEINATED) && (howmuch < 0)) return; + // hot = use stamina more quickly + temp = getlftemp(lf); + switch (temp) { + case T_WARM: howmuch = pctof(150,howmuch); break; + case T_HOT: howmuch = pctof(200,howmuch); break; + case T_VHOT: howmuch = pctof(250,howmuch); break; + default: break; + } + if (isplayer(lf)) { if (howmuch < 0) { if (lf->bartimer == 2) { @@ -17629,26 +17690,28 @@ void modstamina(lifeform_t *lf, float howmuch) { orig = getstamina(lf); lf->stamina += howmuch; limitf(&(lf->stamina), 0, getmaxstamina(lf)); - if (getstamina(lf) != orig) { - if (isplayer(lf)) { - statdirty = B_TRUE; - drawstatus(); - updatestatus(); - if (isexhausted(lf)) { - msg("^BYou are exhausted."); - } else if (orig == 0) { - msg("You feel less exhausted now."); + if (gamemode == GM_GAMESTARTED) { + if (getstamina(lf) != orig) { + if (isplayer(lf)) { + statdirty = B_TRUE; + drawstatus(); + updatestatus(); + if (isexhausted(lf)) { + msg("^BYou are exhausted."); + } else if (orig == 0) { + msg("You feel less exhausted now."); + } + } else if (cansee(player, lf)) { + if (isexhausted(lf)) { + char lfname[BUFLEN]; + char *p; + getlfname(lf, lfname); + p = strdup(lfname); + strrep(&p, "exhausted ","", NULL); + msg("%s looks exhausted.", p); + free(p); + } } - } else if (cansee(player, lf)) { - if (isexhausted(lf)) { - char lfname[BUFLEN]; - char *p; - getlfname(lf, lfname); - p = strdup(lfname); - strrep(&p, "exhausted ","", NULL); - msg("%s looks exhausted.", p); - free(p); - } } } @@ -20829,6 +20892,24 @@ int canshoot(lifeform_t *lf, enum ERROR *why) { return B_TRUE; } +void shiver(lifeform_t *lf) { + object_t *wep; + if (isplayer(lf)) { + msg("^bYou shiver uncontrollably."); + } else if (cansee(player, lf)) { + char lfname[BUFLEN]; + getlfname(lf, lfname); + msg("^%c%s shivers.", getlfcol(lf, CC_BAD), lfname); + } + wep = getweapon(lf); + if (wep) { + char wname[BUFLEN]; + getobname(wep, wname, 1); + drop(wep, wep->amt); + } + loseconcentration(lf); +} + int shoot(lifeform_t *lf) { object_t *gun,*ammo; lifeform_t *targ; @@ -21665,6 +21746,9 @@ void startlfturn(lifeform_t *lf) { object_t *bloodamu = NULL; enum TIMEPHASE tp; enum FLAG inair = F_NONE; + enum TEMPERATURE temp; + int meltchance = 25,meltdam = 1; + tp = gettimephase(); map = lf->cell->map; @@ -22617,6 +22701,7 @@ void startlfturn(lifeform_t *lf) { } } + // poison effects if (!stasis) { getflags(lf->flags, retflag, &nretflags, F_POISONED, F_NONE); for (i = 0; i < nretflags; i++) { @@ -22757,21 +22842,7 @@ void startlfturn(lifeform_t *lf) { // extra effects if (!ko && (f->val[0] == P_COLD)) { if (rnd(1,100) <= 10) { - object_t *wep; - if (isplayer(lf)) { - msg("^bYou shiver uncontrollably."); - } else if (cansee(player, lf)) { - char lfname[BUFLEN]; - getlfname(lf, lfname); - msg("^%c%s shivers.", getlfcol(lf, CC_BAD), lfname); - } - wep = getweapon(lf); - if (wep) { - char wname[BUFLEN]; - getobname(wep, wname, 1); - drop(wep, wep->amt); - } - loseconcentration(lf); + shiver(lf); } } else if (f->val[0] == P_MIGRAINE) { // sleeping will avoid all migraine effects @@ -22819,26 +22890,65 @@ void startlfturn(lifeform_t *lf) { } } // end if !statis - if (lfhasflag(lf, F_FROZEN)) { - int willmelt = B_FALSE; - if (hasobofmaterial(lf->cell->obpile, MT_FIRE)) { - willmelt = B_TRUE; - } else if (onein(4) && !hasobofmaterial(lf->cell->obpile, MT_ICE)) { - willmelt = B_TRUE; + if (isdead(lf)) return; + + // temperature effects + temp = getlftemp(lf); + if (temp != T_NORMAL) { + int shivermult = 0, coldmult = 0; + int exlimbs,coldtime = 0; + exlimbs = getexposedlimbs(lf); + switch (temp) { + case T_VCOLD: + shivermult = 30; + coldmult = 20; + coldtime = 30 + rnd(10,30); + break; + case T_COLD: + shivermult = 20; + coldmult = 15; + coldtime = 20 + rnd(10,20); + break; + case T_CHILLY: + shivermult = 10; + coldmult = 0; + break; + case T_NORMAL: break; + case T_WARM: + meltchance += 25; + meltdam = roll("1d6"); + break; + case T_HOT: + meltchance += 50; + meltdam = roll("2d6"); + break; + case T_VHOT: + meltchance += 100; + meltdam = roll("2d6"); + break; } - // melt... - if (willmelt) { - losehp(lf, 1, DT_MELT, NULL, "melting"); - addob(lf->cell->obpile, "small puddle of water"); - if (isplayer(lf)) { - msg("^BYou are melting!"); - } else if (cansee(player, lf)) { - char lfname[BUFLEN]; - getlfname(lf, lfname); - msg("^%c%s melts a little.",getlfcol(lf, CC_BAD), lfname); + if (!skillcheck(lf, SC_CON, (exlimbs*coldmult), 0)) { + poison(lf, coldtime, P_COLD, 0, "the cold", R_NONE, B_FALSE); + } else if (!skillcheck(lf, SC_CON, (exlimbs*shivermult), 0)) { + shiver(lf); + } + + // chance to melt if you are frozen or made of ice + if (lfhasflag(lf, F_FROZEN) || (lf->material->id == MT_ICE)) { + if (pctchance(meltchance)) { + losehp(lf, meltdam, DT_MELT, NULL, "melting"); + addob(lf->cell->obpile, "small puddle of water"); + if (isplayer(lf)) { + msg("^BYou are melting!"); + } else if (cansee(player, lf)) { + char lfname[BUFLEN]; + getlfname(lf, lfname); + msg("^%c%s melts a little.",getlfcol(lf, CC_BAD), lfname); + } } } } + if (isdead(lf)) return; if (!movedlastturn) { diff --git a/lf.h b/lf.h index fbc5265..fe7c371 100644 --- a/lf.h +++ b/lf.h @@ -207,6 +207,7 @@ int getleftrightwalls(lifeform_t *lf); int getlfaccuracy(lifeform_t *lf, object_t *wep); char getlfcol(lifeform_t *lf, enum MSGCHARCOL cc); enum LFCONDITION getlfcondition(lifeform_t *lf); +enum TEMPERATURE getlftemp(lifeform_t *lf); int getfeetheight(lifeform_t *lf); int getlistendetectrange(lifeform_t *lf); int getmasterid(lifeform_t *lf); @@ -500,6 +501,7 @@ void setlastdam(lifeform_t *lf, char *buf); int setlfmaterial(lifeform_t *lf, enum MATERIAL id, int wantannounce); void setlosdirty(lifeform_t *lf); void setstamina(lifeform_t *lf, float howmuch); +void shiver(lifeform_t *lf); int shoot(lifeform_t *lf); int getskillcheckchance(lifeform_t *lf, enum CHECKTYPE ct, int diff, int mod) ; int skillcheck(lifeform_t *lf, enum CHECKTYPE ct, int diff, int mod); diff --git a/map.c b/map.c index be32730..68bef30 100644 --- a/map.c +++ b/map.c @@ -74,6 +74,7 @@ cell_t *addcell(map_t *m, int x, int y) { cell->x = x; cell->y = y; cell->habitat = m->habitat; + cell->temperature = m->habitat->temperature; cell->obpile = addobpile(NOOWNER, cell, NOOB); cell->type = NULL; setcelltype(cell, cell->habitat->solidcelltype); @@ -98,7 +99,7 @@ cell_t *addcell(map_t *m, int x, int y) { return cell; } -habitat_t *addhabitat(enum HABITAT id, char *name, enum CELLTYPE emptycell, enum CELLTYPE solidcell, int thingchance, int obchance, int vaultchance, int maxvisrange, enum OBTYPE upstairtype, enum OBTYPE downstairtype, int stairsinrooms) { +habitat_t *addhabitat(enum HABITAT id, char *name, enum CELLTYPE emptycell, enum CELLTYPE solidcell, int thingchance, int obchance, int vaultchance, int maxvisrange, enum OBTYPE upstairtype, enum OBTYPE downstairtype, int stairsinrooms, enum TEMPERATURE temp) { habitat_t *a; // add to the end of the list if (firsthabitat == NULL) { @@ -127,6 +128,7 @@ habitat_t *addhabitat(enum HABITAT id, char *name, enum CELLTYPE emptycell, enum a->upstairtype = upstairtype; a->downstairtype = downstairtype; a->stairsinrooms = stairsinrooms; + a->temperature = getmidtemp(temp); return a; } @@ -2146,36 +2148,46 @@ int doelementspread(cell_t *c) { fireob = hasobofmaterial(c->obpile, MT_FIRE); if (fireob && (fireob->birthtime != curtime) && !isdeadob(fireob)) { cell_t *retcell[MAXRETCELLS]; + flag_t *damflag; int nretcells,i,nspread = 0; - object_t *oo; + object_t *oo,*nextoo; + + damflag = hasflagval(fireob->flags, F_WALKDAM, DT_FIRE, NA, NA, NULL); // check adjacent cells (and this one) for flammable stuff getradiuscells(c, 1, DT_COMPASS, B_FALSE, LOF_DONTNEED, B_TRUE, retcell, &nretcells, B_FALSE); for (i = 0; i < nretcells; i++) { int celldone = B_FALSE; - for (oo = retcell[i]->obpile->first ; oo ; oo = oo->next) { + object_t *hasfire; + hasfire = hasobofmaterial(retcell[i]->obpile, MT_FIRE); + + for (oo = retcell[i]->obpile->first ; oo ; oo = nextoo) { flag_t *f; - if (hasobofmaterial(retcell[i]->obpile, MT_FIRE)) { - // there's already a fire here. - // f_onfire flags won't expire if there is fire there. + nextoo = oo->next; + + // there's already a fire here. + // f_onfire flags won't expire if there is fire there. + if (hasfire) { f = hasflag(oo->flags, F_ONFIRE); if (f && (f->lifetime > 0)) { f->lifetime++; } - } else if (isflammable(oo)) { - // no fire here already. if there is a flammable object here, the fire - // will spread. - ignite(oo); - // if object didn't ignite into a fire, add one. - if (!hasobofmaterial(retcell[i]->obpile, MT_FIRE)) { - addobfast(retcell[i]->obpile, fireob->type->id); - } - // now we regain our full hp - f = hasflag(fireob->flags, F_OBHP); - if (f) f->val[0] = f->val[1]; + } else { + if (isflammable(oo)) { + // no fire here already. if there is a flammable object here, the fire + // will spread. + ignite(oo); + // if object didn't ignite into a fire, add one. + if (!hasobofmaterial(retcell[i]->obpile, MT_FIRE)) { + addobfast(retcell[i]->obpile, fireob->type->id); + } + // now we regain our full hp + f = hasflag(fireob->flags, F_OBHP); + if (f) f->val[0] = f->val[1]; - nspread++; - celldone = B_TRUE; + nspread++; + celldone = B_TRUE; + } } } // lifeforms made out of something flammable? ie. plants @@ -2199,6 +2211,13 @@ int doelementspread(cell_t *c) { celldone = B_TRUE; } } + } else if (issolid(retcell[i]) && damflag) { + int dam; + dam = (roll(damflag->text) / 2); + if (dam) { + // cell takes fire damage + damagecell(retcell[i], dam, DT_FIRE, NULL); + } } } } @@ -2717,8 +2736,8 @@ void getcellglyph(glyph_t *g, cell_t *c, lifeform_t *viewer) { g->ch = ' '; } // out of LOS - show as dark - // TODO: if terminal supports it, use C_GREY instead. - g->colour = C_BLUE; + //g->colour = C_BLUE; + g->colour = C_VDARKGREY; } break; } @@ -2771,6 +2790,12 @@ enum CELLTYPE getmapsolid(map_t *m) { return m->habitat->solidcelltype; } +int getmidtemp(enum TEMPERATURE temp) { + int min,max; + gettemprange(temp,&min,&max); + return ((min+max)/2); +} + enum DEPTH getcellwaterdepth(cell_t *c, lifeform_t *lf) { object_t *o; o = hasobwithflag(c->obpile, F_DEEPWATER); @@ -3628,6 +3653,10 @@ void createdungeon(map_t *map, int depth, map_t *parentmap, int exitdir, object_ int minrooms = MINROOMS_DUN; int maxrooms = MAXROOMS_DUN; enum CORRIDORTYPE corridortype = CDT_NORMAL; + int minroomw = NA; + int minroomh = NA; + int maxroomw = NA; + int maxroomh = NA; int moved = 0; @@ -3635,6 +3664,19 @@ void createdungeon(map_t *map, int depth, map_t *parentmap, int exitdir, object_ //char buf[BUFLEN]; dbtimestart("Creating dungeon"); + + // override parameters + if (map->habitat->id == H_ICECAVE) { + // small rooms + minroomw = NA; + minroomh = NA; + maxroomw = minroomw + 4; + maxroomh = minroomh + 4; + // slightly more twisty + turnpct += rnd(5,10); + // less sparse. + sparseness -= 10; + } // select dungeon shape. dbtime("Starting shape selection."); @@ -4019,7 +4061,8 @@ void createdungeon(map_t *map, int depth, map_t *parentmap, int exitdir, object_ } } // just do a normal room - calcposandmakeroom(map, map->nrooms, NA, NA, NA, NA, DEF_VAULTMARGIN, DEF_VAULTMARGIN, NULL, NULL, NULL, NULL, 50, 25, B_FALSE, 0); + calcposandmakeroom(map, map->nrooms, minroomw, minroomh, maxroomw, maxroomh, + DEF_VAULTMARGIN, DEF_VAULTMARGIN, NULL, NULL, NULL, NULL, 50, 25, B_FALSE, 0); //roomvault[i] = B_FALSE; } } @@ -4286,6 +4329,9 @@ void createhabitat(map_t *map, int depth, map_t *parentmap, int exitdir, object_ case H_HEAVEN: createheaven(map, depth, parentmap, exitdir, entryob); break; + case H_ICECAVE: + createicecave(map, depth, parentmap, exitdir, entryob); + break; case H_MASTERVAULTS: createmastervaults(map, depth, parentmap, exitdir, entryob); break; @@ -4371,6 +4417,37 @@ void createheaven(map_t *map, int depth, map_t *parentmap, int exitdir, object_t } } +void createicecave(map_t *map, int depth, map_t *parentmap, int exitdir, object_t *entryob) { + int x,y; + cell_t *c; + object_t *o, *nexto; + + // first create a normal dungeon + createdungeon(map, depth, parentmap, exitdir, entryob); + + // remove all doors and grates + for (y = 0; y < map->h; y++) { + for (x = 0; x < map->w; x++) { + c = getcellat(map, x, y); + for (o = c->obpile->first ; o ; o = nexto) { + int willkill = B_FALSE; + nexto = o->next; + if (isdoor(o, NULL) ) { + willkill = B_TRUE; + } else if (hasflagval(o->flags, F_PIT, D_DOWN, NA, NA, NULL)) { + willkill = B_TRUE; + } else if (o->type->id == OT_GRATINGFLOOR) { + willkill = B_TRUE; + } + if (willkill) { + killob(o); + } + } + } + } + + // finalisemap() will replace all walls with ice. +} /* seed = random number seed @@ -7324,6 +7401,8 @@ int finalisemap(map_t *map, object_t *entryob, int exitdir) { } } } + //} else if (map->habitat->id == H_ICECAVE) { + // in ice caves, replace all walls with ice } return B_FALSE; @@ -7856,6 +7935,18 @@ cell_t *getcellindir(cell_t *cell, int dir) { return newcell; } +enum TEMPERATURE getcelltemp(cell_t *c, int *actualtemp) { + enum TEMPERATURE temp; + if (!c || (gamemode != GM_GAMESTARTED)) { + if (actualtemp) *actualtemp = getmidtemp(T_NORMAL); + return T_NORMAL; + } + temp = c->temperature; + limit(&temp, MIN_TEMPERATURE, MAX_TEMPERATURE); + if (actualtemp) *actualtemp = temp; + return gettempbracket(temp); +} + vault_t *getcellvault(cell_t *c) { if (c->room) { return c->room->vault; @@ -8106,8 +8197,6 @@ cell_t *getrandomcelloftype(map_t *map, enum CELLTYPE id) { return cell; } - - int compassdir(int orthdir) { switch (orthdir) { case D_N: @@ -8220,10 +8309,14 @@ int getslipperyness(cell_t *c, object_t **slipob) { addition = 15; pctmod += 50; break; - case CT_FLOORTILE: + case CT_FLOORSNOW: addition = 10; pctmod += 50; break; + case CT_FLOORTILE: + addition = 5; + pctmod += 25; + break; case CT_FLOORCARPET: addition = -10; pctmod -= 50; @@ -8446,47 +8539,50 @@ object_t *hastrailof(obpile_t *op, lifeform_t *lf, enum OBTYPE oid, flag_t **tfl void initmap(void) { // habitats - // thingchance, obchance, vaultchance, maxvisrange, upstiartype, downstairtype, stairs_in_rooms - addhabitat(H_DUNGEON, "dungeon", CT_CORRIDOR, CT_WALL, 5, 60, 30, 6, OT_STAIRSUP, OT_STAIRSDOWN, B_TRUE); - addhabitat(H_CAVE, "cave", CT_DIRT, CT_WALLDIRT, 10, 45, 20, 6, OT_TUNNELUP, OT_TUNNELDOWN, B_FALSE); - addhabitat(H_FOREST, "forest", CT_GRASS, CT_WALLTREE, 5, 75, 0, MAXVISRANGE, OT_TREEUP, OT_TREEDOWN, B_FALSE); - addhabitat(H_HEAVEN, "heaven", CT_CORRIDOR, CT_WALLGLASS, 5, 0, 0, MAXVISRANGE, OT_NONE, OT_NONE, B_FALSE); - addhabitat(H_PIT, "pit", CT_CORRIDOR, CT_WALL, 0, 0, 0, 5, OT_NONE, OT_NONE, B_FALSE); - addhabitat(H_VILLAGE, "village", CT_GRASS, CT_WALL, 5, 70, 0, MAXVISRANGE, OT_NONE, OT_NONE, B_FALSE); - addhabitat(H_SEWER, "sewer", CT_MOSSROCK, CT_WALL, 10, 50, 0, MAXVISRANGE, OT_GRATINGROOF, OT_NONE, B_FALSE); - addhabitat(H_STOMACH, "stomach", CT_FLOORFLESH, CT_WALLFLESH, 5, 80, 0, MAXVISRANGE, OT_NONE, OT_NONE, B_FALSE); - addhabitat(H_SWAMP, "swamp", CT_CORRIDOR, CT_WALL, 5, 50, 0, MAXVISRANGE, OT_STAIRSUP, OT_STAIRSDOWN, B_FALSE); - addhabitat(H_BYHUT, "babayaga's hut", CT_FLOORWOOD, CT_WALLDWOOD, 0, 0, 0, MAXVISRANGE, OT_BYHUTDOOR, OT_NONE, B_FALSE); - addhabitat(H_ANTNEST, "ant nest", CT_DIRT, CT_WALLDIRT, 10, 40, 0, MAXVISRANGE, OT_STAIRSUP, OT_STAIRSDOWN, B_FALSE); - addhabitat(H_MASTERVAULTS, "master vaults", CT_FLOORDURANITE, CT_WALLDURANITE, 10, 0, 0, MAXVISRANGE, OT_VSTAIRSUP, OT_VSTAIRSDOWN, B_FALSE); + // thingchance, obchance, vaultchance, maxvisrange, upstiartype, downstairtype, stairs_in_rooms,temp + addhabitat(H_DUNGEON, "dungeon", CT_CORRIDOR, CT_WALL, 5, 60, 30, 6, OT_STAIRSUP, OT_STAIRSDOWN, B_TRUE, T_NORMAL); + addhabitat(H_ICECAVE, "ice cavern", CT_CORRIDOR, CT_WALLICE, 10, 45, 20, 6, OT_ICESTAIRSUP, OT_ICESTAIRSDOWN, B_FALSE, T_COLD); + addhabitat(H_CAVE, "cave", CT_DIRT, CT_WALLDIRT, 10, 45, 20, 6, OT_TUNNELUP, OT_TUNNELDOWN, B_FALSE, T_NORMAL); + addhabitat(H_FOREST, "forest", CT_GRASS, CT_WALLTREE, 5, 75, 0, MAXVISRANGE, OT_TREEUP, OT_TREEDOWN, B_FALSE, T_NORMAL); + addhabitat(H_HEAVEN, "heaven", CT_CORRIDOR, CT_WALLGLASS, 5, 0, 0, MAXVISRANGE, OT_NONE, OT_NONE, B_FALSE, T_NORMAL); + addhabitat(H_PIT, "pit", CT_CORRIDOR, CT_WALL, 0, 0, 0, 5, OT_NONE, OT_NONE, B_FALSE, T_NORMAL); + addhabitat(H_VILLAGE, "village", CT_GRASS, CT_WALL, 5, 70, 0, MAXVISRANGE, OT_NONE, OT_NONE, B_FALSE, T_NORMAL); + addhabitat(H_SEWER, "sewer", CT_MOSSROCK, CT_WALL, 10, 50, 0, MAXVISRANGE, OT_GRATINGROOF, OT_NONE, B_FALSE, T_CHILLY); + addhabitat(H_STOMACH, "stomach", CT_FLOORFLESH, CT_WALLFLESH, 5, 80, 0, MAXVISRANGE, OT_NONE, OT_NONE, B_FALSE, T_WARM); + addhabitat(H_SWAMP, "swamp", CT_CORRIDOR, CT_WALL, 5, 50, 0, MAXVISRANGE, OT_STAIRSUP, OT_STAIRSDOWN, B_FALSE, T_WARM); // "hot+humid" + addhabitat(H_BYHUT, "babayaga's hut", CT_FLOORWOOD, CT_WALLDWOOD, 0, 0, 0, MAXVISRANGE, OT_BYHUTDOOR, OT_NONE, B_FALSE, T_NORMAL); + addhabitat(H_ANTNEST, "ant nest", CT_DIRT, CT_WALLDIRT, 10, 40, 0, MAXVISRANGE, OT_STAIRSUP, OT_STAIRSDOWN, B_FALSE, T_NORMAL); + addhabitat(H_MASTERVAULTS, "master vaults", CT_FLOORDURANITE, CT_WALLDURANITE, 10, 0, 0, MAXVISRANGE, OT_VSTAIRSUP, OT_VSTAIRSDOWN, B_FALSE, + T_NORMAL); // cell types - solid // floorheight, hp, volmod, absorbant addcelltype(CT_WALL, "rock wall", UNI_SHADEDARK, C_GREY, NA, B_SOLID, B_OPAQUE, MT_STONE, 0, 50, 0, B_NOABSORB); - addcelltype(CT_WALLBRICK, "brick wall", UNI_SHADEDARK, C_ORANGE, NA, B_SOLID, B_OPAQUE, MT_BRICK, 0, 40, 0, B_NOABSORB); + addcelltype(CT_WALLBRICK, "brick wall", UNI_SHADEDARK, C_BRICK, NA, B_SOLID, B_OPAQUE, MT_BRICK, 0, 40, 0, B_NOABSORB); addcelltype(CT_WALLDIRT, "dirt wall", UNI_SHADEMED, C_BROWN, NA, B_SOLID, B_OPAQUE, MT_STONE, 0, 20, 0, B_NOABSORB); addcelltype(CT_WALLDURANITE, "duranite wall", UNI_SHADEDARK, C_MAGENTA, NA, B_SOLID, B_OPAQUE, MT_DURANITE, 0, 20000, 0, B_NOABSORB); - addcelltype(CT_WALLWOOD, "wooden wall", UNI_SOLID, C_BROWN, NA, B_SOLID, B_OPAQUE, MT_WOOD, 0, 30, 0, B_NOABSORB); - addcelltype(CT_WALLDWOOD, "wyrmwood wall", UNI_SOLID, C_BROWN, NA, B_SOLID, B_OPAQUE, MT_DRAGONWOOD, 0, 100, 0, B_NOABSORB); - addcelltype(CT_WALLFLESH, "flesh wall", UNI_SOLID, C_RED, NA, B_SOLID, B_OPAQUE, MT_FLESH, 0, 25, 0, B_NOABSORB); + addcelltype(CT_WALLWOOD, "wooden wall", UNI_SOLID, C_DARKBROWN, NA, B_SOLID, B_OPAQUE, MT_WOOD, 0, 30, 0, B_NOABSORB); + addcelltype(CT_WALLDWOOD, "wyrmwood wall", UNI_SOLID, C_DARKBROWN, NA, B_SOLID, B_OPAQUE, MT_DRAGONWOOD, 0, 100, 0, B_NOABSORB); + addcelltype(CT_WALLFLESH, "flesh wall", UNI_SOLID, C_FLESH, NA, B_SOLID, B_OPAQUE, MT_FLESH, 0, 25, 0, B_NOABSORB); addcelltype(CT_WALLGLASS, "glass wall", UNI_SOLID, C_CYAN, NA, B_SOLID, B_TRANS, MT_GLASS, 0, 20, 0, B_NOABSORB); - addcelltype(CT_WALLICE, "ice wall", UNI_SHADEDARK, C_CYAN, NA, B_SOLID, B_TRANS, MT_ICE, 0, 30, 0, B_NOABSORB); + addcelltype(CT_WALLICE, "ice wall", UNI_SHADEDARK, C_LIGHTCYAN, NA, B_SOLID, B_TRANS, MT_ICE, 0, 30, 0, B_NOABSORB); //addcelltype(CT_WALLTREE, "dense bushland", UNI_SHADEDARK, C_GREEN, B_SOLID, B_OPAQUE, MT_PLANT, 0, 100); - addcelltype(CT_WALLTREE, "dense bushland", UNI_TREELOTS, C_GREEN, NA, B_SOLID, B_OPAQUE, MT_PLANT, 0, 100, 0, B_NOABSORB); - addcelltype(CT_WALLMETAL, "metal wall", UNI_SOLID, C_WHITE, NA, B_SOLID, B_OPAQUE, MT_METAL, 0, 75, 0, B_NOABSORB); + addcelltype(CT_WALLTREE, "dense bushland", UNI_TREELOTS, C_LIGHTGREEN, NA, B_SOLID, B_OPAQUE, MT_PLANT, 0, 100, 0, B_NOABSORB); + addcelltype(CT_WALLMETAL, "metal wall", UNI_SOLID, C_METAL, NA, B_SOLID, B_OPAQUE, MT_METAL, 0, 75, 0, B_NOABSORB); // cell types - non-solid addcelltype(CT_FAKE, "fake cell", '.', C_GREEN, NA, B_EMPTY, B_TRANS, MT_STONE, 0, -1, 0, B_NOABSORB); - addcelltype(CT_MOSSROCK, "mossy rock floor", '.', C_GREEN, NA, B_EMPTY, B_TRANS, MT_STONE, 0, -1, 0, B_NOABSORB); + addcelltype(CT_MOSSROCK, "mossy rock floor", '.', C_MOSS, NA, B_EMPTY, B_TRANS, MT_STONE, 0, -1, 0, B_NOABSORB); addcelltype(CT_CORRIDOR, "rock floor", '.', C_GREY, NA, B_EMPTY, B_TRANS, MT_STONE, 0, -1, 0, B_NOABSORB); addcelltype(CT_LOOPCORRIDOR, "rock floor", 'L', C_GREY, NA, B_EMPTY, B_TRANS, MT_STONE, 0, -1, 0, B_NOABSORB); - addcelltype(CT_FLOORCARPET, "carpetted floor", '.', C_RED, C_ORANGE, B_EMPTY, B_TRANS, MT_CLOTH, 0, -1, -1, B_ABSORB); + addcelltype(CT_FLOORCARPET, "carpetted floor", '.', C_CARPET1, C_CARPET2, B_EMPTY, B_TRANS, MT_CLOTH, 0, -1, -1, B_ABSORB); addcelltype(CT_FLOORDURANITE, "duranite floor", '.', C_MAGENTA, NA, B_EMPTY, B_TRANS, MT_DURANITE, 0, -1, 1, B_NOABSORB); - addcelltype(CT_FLOORWOOD, "wood floor", '.', C_BROWN, NA, B_EMPTY, B_TRANS, MT_WOOD, 0, -1, 1, B_NOABSORB); - addcelltype(CT_FLOORFLESH, "flesh floor", '.', C_RED, NA, B_EMPTY, B_TRANS, MT_FLESH, 0, -1, -2, B_NOABSORB); - addcelltype(CT_FLOORSHOP, "shop floor", '.', C_BROWN, NA, B_EMPTY, B_TRANS, MT_WOOD, 0, -1, 0, B_NOABSORB); + addcelltype(CT_FLOORWOOD, "wood floor", '.', C_DARKBROWN, NA, B_EMPTY, B_TRANS, MT_WOOD, 0, -1, 1, B_NOABSORB); + addcelltype(CT_FLOORFLESH, "flesh floor", '.', C_FLESH, NA, B_EMPTY, B_TRANS, MT_FLESH, 0, -1, -2, B_NOABSORB); + addcelltype(CT_FLOORSHOP, "shop floor", '.', C_DARKBROWN, NA, B_EMPTY, B_TRANS, MT_WOOD, 0, -1, 0, B_NOABSORB); + addcelltype(CT_FLOORSNOW, "snow", '.', C_WHITE, NA, B_EMPTY, B_TRANS, MT_SNOW, 0, -1, 0, B_ABSORB); addcelltype(CT_FLOORTILE, "tiled floor", '.', C_CYAN, C_WHITE, B_EMPTY, B_TRANS, MT_METAL, 0, -1, 2, B_NOABSORB); addcelltype(CT_GRASS, "grass", '.', C_GREEN, NA, B_EMPTY, B_TRANS, MT_PLANT, 0, -1, -1, B_ABSORB); - addcelltype(CT_DIRT, "dirt", '.', C_BROWN, C_YELLOW, B_EMPTY, B_TRANS, MT_STONE, 0, -1, -1, B_NOABSORB /* mud instead */); + addcelltype(CT_DIRT, "dirt", '.', C_DARKYELLOW, C_BROWN, B_EMPTY, B_TRANS, MT_STONE, 0, -1, -1, B_NOABSORB /* mud instead */); addcelltype(CT_LOWFLOOR, "low rock floor", '.', C_GREY, NA, B_EMPTY, B_TRANS, MT_STONE, -1, -1, 0, B_NOABSORB); addcelltype(CT_VLOWFLOOR, "very low rock floor", '.', C_GREY, NA, B_EMPTY, B_TRANS, MT_STONE, -2, -1, 0, B_NOABSORB); @@ -8503,6 +8599,7 @@ void initmap(void) { addbranch(BH_CAVE, "The Goblin Caves", B_TRUE, H_CAVE, 5, 1, D_DOWN, B_TRUE, 2, B_FALSE); addbranch(BH_WOODS, "The Sylvan Woods", B_TRUE, H_FOREST, 5, 3, D_DOWN, B_TRUE, 1, B_FALSE); addbranch(BH_MASTERVAULTS, "The Master Vaults", B_TRUE, H_MASTERVAULTS, 3, 1, D_DOWN, B_TRUE, 5, B_TRUE); + addbranch(BH_ICECAVERNS, "The Ice Caverns", B_TRUE, H_ICECAVE, 1, 1, D_DOWN, B_TRUE, 10, B_FALSE); // minor branches addbranch(BH_PIT, "A Pit", B_FALSE, H_PIT, 1, 1, D_DOWN, B_FALSE, 0, B_TRUE); addbranch(BH_SEWER, "A Sewer", B_FALSE, H_SEWER, 1, 0, D_NONE, B_FALSE, 2, B_TRUE); @@ -8573,6 +8670,8 @@ void initmaplayout(void) { addregionthing(lastregionoutline, rnd(2,4), NA, NA, RT_BRANCHLINK, BH_WOODS, "hollow tree leading down"); // l2-5: goblin caves addregionthing(lastregionoutline, rnd(2,4), NA, NA, RT_BRANCHLINK, BH_CAVE, "tunnel leading down"); + // l3-7: ice caverns + addregionthing(lastregionoutline, rnd(3,7), NA, NA, RT_BRANCHLINK, BH_ICECAVERNS, "icy passage leading down"); // l6: jimbo's lair addregionthing(lastregionoutline, 6, NA, NA, RT_VAULT, NA, "jimbos_lair"); // l7 - 10: ants nest @@ -8868,7 +8967,7 @@ int isinscanrange(cell_t *c, void **thing, char *desc, glyph_t *glyph) { *thing = o; if (glyph) { glyph->ch = '*'; - glyph->colour = C_BOLDGREEN; + glyph->colour = C_LIGHTGREEN; } if (desc) { if (f->val[1] == NA) { @@ -8983,6 +9082,58 @@ cell_t *getroommidcell(map_t *m, int roomid) { return c; } +void gettemprange(enum TEMPERATURE temp, int *min, int *max) { + if (min) *min = -1; + if (max) *max = -1; + switch (temp) { + case T_VCOLD: + if (min) *min = MIN_TEMPERATURE; + if (max) *max = 0; + break; + case T_COLD: + if (min) *min = 1; + if (max) *max = 11; + break; + case T_CHILLY: + if (min) *min = 12; + if (max) *max = 18; + break; + case T_NORMAL: + if (min) *min = 19; + if (max) *max = 22; + break; + case T_WARM: + if (min) *min = 23; + if (max) *max = 29; + break; + case T_HOT: + if (min) *min = 30; + if (max) *max = 35; + break; + case T_VHOT: + if (min) *min = 36; + if (max) *max = MAX_TEMPERATURE; + break; + } +} + +enum TEMPERATURE gettempbracket(int temp) { + enum TEMPERATURE brack; + for (brack = T_VCOLD; brack <= T_VHOT; brack++) { + int min,max; + gettemprange(brack, &min, &max); + if ((temp >= min) && (temp <= max)) return brack; + // outside of normal range... + if ((brack == T_VCOLD) && (temp < min)) { + return brack; + } else if ((brack == T_VHOT) && (temp > max)) { + return brack; + } + } + // default + return T_NORMAL; +} + enum TIMEPHASE gettimephase(void) { int h,m,s; splittime(&h, &m, &s); @@ -9554,6 +9705,10 @@ void mapentereffects(map_t *m) { } } +void modcelltemp(cell_t *c, int howmuch) { + c->temperature += howmuch; +} + void modillumination(map_t *m, int dir) { int donesomething = B_FALSE; if (dir > 0) { @@ -9638,6 +9793,13 @@ enum RACE parserace(char *name, flagpile_t *wantflags, condset_t *cs, enum JOB * p = localname; while (donesomething) { donesomething = B_FALSE; + if (strstarts(p, "single ")) { + p += strlen("single "); + // only ONE monster - no groups/minions. + addcond(cs, CC_HASFLAG, B_FALSE, F_MINIONS); + addcond(cs, CC_HASFLAG, B_FALSE, F_NUMAPPEAR); + donesomething = B_TRUE; + } if (strstarts(p, "sleeping ")) { p += strlen("sleeping "); if (wantflags) addflag(wantflags, F_ASLEEP, NA, ST_ASLEEP, NA, NULL); diff --git a/map.h b/map.h index 9969870..f41099b 100644 --- a/map.h +++ b/map.h @@ -1,7 +1,7 @@ #include "defs.h" cell_t *addcell(map_t *map, int x, int y); -habitat_t *addhabitat(enum HABITAT id, char *name, enum CELLTYPE emptycell, enum CELLTYPE solidcell, int thingchance, int obchance, int vaultchance, int maxvisrange, enum OBTYPE upstairtype, enum OBTYPE downstairtype, int stairsinrooms); +habitat_t *addhabitat(enum HABITAT id, char *name, enum CELLTYPE emptycell, enum CELLTYPE solidcell, int thingchance, int obchance, int vaultchance, int maxvisrange, enum OBTYPE upstairtype, enum OBTYPE downstairtype, int stairsinrooms, enum TEMPERATURE temp); void addhomeobs(lifeform_t *lf, int dolevelobs); map_t *addmap(void); lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int randomjobok, int amt, int autogen, int *nadded); @@ -49,6 +49,7 @@ enum CELLTYPE getcellempty(cell_t *c); enum CELLTYPE getcellsolid(cell_t *c); enum CELLTYPE getmapempty(map_t *m); enum CELLTYPE getmapsolid(map_t *m); +int getmidtemp(enum TEMPERATURE temp); enum DEPTH getcellwaterdepth(cell_t *c, lifeform_t *lf); int getconnectedwatercells(cell_t *c, cell_t **retcell, int *ncells); cell_t *get_closest_adjcell(cell_t *src, cell_t *dst); @@ -62,6 +63,8 @@ void getradiuscells(cell_t *centre, int radius, int dirtype, int outsideonly, en int getroomid(cell_t *c); void getroomedge(map_t *m, int roomid, int minx, int miny, int maxx, int maxy, int whichside, cell_t **retcell, int *ncells, int onlywantsolid, int includefixed); cell_t *getroommidcell(map_t *m, int roomid); +void gettemprange(enum TEMPERATURE temp, int *min, int *max); +enum TEMPERATURE gettempbracket(int temp); enum TIMEPHASE gettimephase(void); object_t *gettopobject(cell_t *where, int forglyph); //void calclight(map_t *map); @@ -87,6 +90,7 @@ void createfakes(map_t *map, cell_t *cell); void createforest(map_t *map, int depth, map_t *parentmap, int exitdir, object_t *entryob, int nclearings); void createhabitat(map_t *map, int depth, map_t *parentmap, int exitdir, object_t *entryob); void createheaven(map_t *map, int depth, map_t *parentmap, int exitdir, object_t *entryob); +void createicecave(map_t *map, int depth, map_t *parentmap, int exitdir, object_t *entryob); void createmap(map_t *map, int depth, region_t *region, map_t *parentmap, int exitdir, object_t *entryob); void createmastervaults(map_t *map, int depth, map_t *parentmap, int exitdir, object_t *entryob); void createpit(map_t *map, int depth, map_t *parentmap, int exitdir, object_t *entryob); @@ -135,6 +139,7 @@ room_t *findroom(map_t *m, int roomid); map_t *findsurfaceexitmap(map_t *m); void forgetcells(map_t *map, int amt); cell_t *getcellindir(cell_t *cell, int dir); +enum TEMPERATURE getcelltemp(cell_t *c, int *actualtemp); vault_t *getcellvault(cell_t *c); cell_t *getclosestroomcell(lifeform_t *lf, int roomid); int getnewdigdir(cell_t *cell, int lastdir, int turnpct, int *moved); @@ -193,6 +198,7 @@ void makelit(cell_t *c, enum OBTYPE how, int howlong, int power); void makelitradius(cell_t *c, int radius, enum OBTYPE how, int howlong, int power); void markroomwalls(map_t *m, room_t *r); void mapentereffects(map_t *m); +void modcelltemp(cell_t *c, int howmuch); void modillumination(map_t *m, int dir); void moveobtoclearcell(object_t *o); int orthdir(int compassdir); diff --git a/move.c b/move.c index 847de43..a2e7318 100644 --- a/move.c +++ b/move.c @@ -1215,6 +1215,7 @@ int moveeffects(lifeform_t *lf, int moved) { int movelf(lifeform_t *lf, cell_t *newcell, int onpurpose) { object_t *o,*nexto; cell_t *precell; + enum TEMPERATURE pretemp,posttemp; char obname[BUFLEN],lfname[BUFLEN],buf[BUFLEN]; lifeform_t *l; int didmsg = B_FALSE; @@ -1240,6 +1241,8 @@ int movelf(lifeform_t *lf, cell_t *newcell, int onpurpose) { needredraw = B_TRUE; } + pretemp = getlftemp(lf); + if (newcell->map != lf->cell->map) { changedlev = B_TRUE; lf->changinglev = B_TRUE; @@ -1340,6 +1343,7 @@ int movelf(lifeform_t *lf, cell_t *newcell, int onpurpose) { if (gamemode == GM_GAMESTARTED) { postroom = lf->cell->room; postspeed = getmovespeed(lf); + posttemp = getlftemp(lf); } // update new cell @@ -1723,6 +1727,43 @@ int movelf(lifeform_t *lf, cell_t *newcell, int onpurpose) { } } + if (pretemp != posttemp) { + char colchar; + char punc; + switch (posttemp) { + case T_VCOLD: + case T_VHOT: + colchar = 'B'; + punc = '!'; + break; + case T_COLD: + case T_HOT: + colchar = 'w'; + punc = '!'; + break; + case T_WARM: + case T_CHILLY: + case T_NORMAL: + colchar = 'n'; + punc = '.'; + break; + } + if (isplayer(lf)) { + if (posttemp == T_NORMAL) { + msg("^%cThe temperature is now more comfortable%c", colchar, punc); + didmsg = B_TRUE; + } else { + msg("^%cYou feel %s%c", colchar, gettemperaturename(posttemp), punc); + didmsg = B_TRUE; + } + } else if (cansee(player, lf) && (getlorelevel(player, getraceclass(lf)) >= PR_BEGINNER)) { + if (posttemp != T_NORMAL) { + msg("%s looks %s%c", lfname, gettemperaturename(posttemp), punc); + didmsg = B_TRUE; + } + } + } + getflags(lf->flags, retflag, &nretflags, F_DAMAGEGROUNDOBS, F_NONE); for (i = 0; i < nretflags; i++) { f = retflag[i]; @@ -1733,8 +1774,10 @@ int movelf(lifeform_t *lf, cell_t *newcell, int onpurpose) { } // status bar - if ((prespeed != postspeed) && isplayer(lf)) { - statdirty = B_TRUE; + if (isplayer(lf)) { + if ((prespeed != postspeed) || (pretemp != posttemp)) { + statdirty = B_TRUE; + } } } // end if gamestarted diff --git a/nexus.c b/nexus.c index 31248ca..b46ca9c 100644 --- a/nexus.c +++ b/nexus.c @@ -1430,13 +1430,13 @@ enum COLOUR getpctcol(float num, float max) { float pct; pct = (num / max) * 100; if (pct > 100) { - return C_BOLDBLUE; + return C_LIGHTBLUE; } else if (pct == 100) { - return C_BOLDGREEN; + return C_LIGHTGREEN; } else if (pct >= 75) { return C_GREEN; } else if (pct >= 50) { - return C_BROWN; + return C_DARKYELLOW; } else if (pct >= 25) { return C_YELLOW; } else { // ie. < 25% diff --git a/objects.c b/objects.c index 8f6b7df..0d53331 100644 --- a/objects.c +++ b/objects.c @@ -176,18 +176,18 @@ char *potadjective[] = { }; hiddennamewithcol_t colour[] = { - { "aqua", C_CYAN, }, - { "azure",C_BOLDBLUE }, - { "black",C_BLUE }, + { "aqua", C_AQUA, }, + { "azure",C_LIGHTCYAN }, + { "black",C_VDARKGREY }, { "blue",C_BLUE }, { "brown",C_BROWN }, { "cyan",C_CYAN }, { "green",C_GREEN }, { "indigo",C_MAGENTA }, - { "magenta",C_BOLDMAGENTA }, - { "night-black",C_BLUE }, + { "magenta",C_LIGHTMAGENTA }, + { "night-black",C_VDARKGREY }, { "orange",C_ORANGE }, - { "pink",C_MAGENTA }, + { "pink",C_PINK }, { "rainbow-coloured",C_ORANGE }, { "red",C_RED }, { "violet",C_MAGENTA }, @@ -197,26 +197,26 @@ hiddennamewithcol_t colour[] = { hiddennamewithcol_t gemtype[] = { { "agate", C_MAGENTA, }, - { "amethyst", C_MAGENTA, }, // should be purple - { "brass",C_BROWN }, - { "bronze",C_BROWN }, - { "copper",C_BROWN }, - { "diamond",C_BOLDCYAN }, - { "emerald",C_GREEN }, - { "flourite",C_RED }, + { "amethyst", C_INDIGO, }, + { "brass",C_LIGHTYELLOW }, + { "bronze",C_DARKYELLOW }, + { "copper",C_DARKYELLOW }, + { "diamond",C_WHITE }, + { "emerald",C_DARKGREEN }, + { "flourite",C_LIGHTRED }, { "garnet",C_ORANGE }, { "gold",C_YELLOW }, { "iridium",C_WHITE }, { "jade",C_GREEN }, { "jasper",C_RED }, - { "lapis lazuli",C_BOLDBLUE }, - { "malachite",C_BOLDCYAN }, - { "onyx",C_BLUE }, + { "lapis lazuli",C_LIGHTBLUE }, + { "malachite",C_LIGHTCYAN }, + { "onyx",C_VDARKGREY }, { "opal",C_CYAN }, - { "pearl",C_WHITE }, + { "pearl",C_FLESH }, { "quartz",C_GREY }, - { "ruby",C_RED }, - { "sapphire",C_BLUE }, + { "ruby",C_DARKRED }, + { "sapphire",C_DARKBLUE }, { "topaz", C_YELLOW }, { "zinc",C_GREY }, { "zircon",C_CYAN }, @@ -1889,6 +1889,9 @@ object_t *addobject(obpile_t *where, char *name, int canstack, int dolinks, enum } } + // adjust nearby temperature + affect_temperature(o, B_ADD); + // other special changes we need to make based on what was // asked for if (o) { @@ -2827,6 +2830,35 @@ int adjustshieldpenalty(lifeform_t *lf, float amt) { return amt; } +void affect_temperature(object_t *o, int action) { + flag_t *f; + int dir,howmuch; + cell_t *c,*c2; + + f = hasflag(o->flags, F_TEMPMOD); + if (f) { + howmuch = f->val[0]; + } else { + return; + } + + if (action == B_REMOVE) { + // reverse + howmuch *= -1; + } + + c = getoblocation(o); + if (!c) return; + + // adjust this cell + modcelltemp(c, howmuch); + // adjust surrounding cells + for (dir = DC_N; dir <= DC_NW; dir++) { + c2 = getcellindir(c, dir); + if (c2) modcelltemp(c2, howmuch); + } +} + void appendinscription(object_t *o, char *text) { if (o->inscription) { int len; @@ -2863,10 +2895,10 @@ void applyobmod(object_t *o, obmod_t *om) { if (om->id == OM_FROZEN) { // frozen things don't decay... - f = hasflagval(o->flags, F_OBHPDRAIN, NA, DT_DECAY, NA, NULL); - if (f) { - killflag(f); - } + //f = hasflagval(o->flags, F_OBHPDRAIN, NA, DT_DECAY, NA, NULL); + //if (f) { + // killflag(f); + //} // ...but they do melt! f = addtempflag(o->flags, F_OBHPDRAIN, 1, DT_MELT, NA, NULL, FROMOBMOD); @@ -3942,7 +3974,7 @@ glyph_t *getglyph(object_t *o) { /* if (getcellwaterdepth(loc, player) >= DP_HEAD) { - col = C_BOLDBLUE; + col = C_LIGHTBLUE; } else { col = C_BLUE; } @@ -5165,6 +5197,7 @@ int getmaterialvalue(enum MATERIAL mat) { case MT_BRICK: return 1; case MT_WATER: + case MT_SNOW: return 1; case MT_FLESH: case MT_BONE: @@ -8349,6 +8382,8 @@ void killob(object_t *o) { } */ + affect_temperature(o, B_REMOVE); + o->dying = B_TRUE; // remove flags conferred by this object @@ -12988,6 +13023,8 @@ object_t *relinkob(object_t *src, obpile_t *dst) { } } + affect_temperature(src, B_REMOVE); + // unweild killflagsofid(src->flags, F_EQUIPPED); @@ -13067,6 +13104,8 @@ object_t *relinkob(object_t *src, obpile_t *dst) { } } + affect_temperature(src, B_ADD); + return src; } @@ -13318,7 +13357,7 @@ int shatter(object_t *o, int hitlf, char *damstring, lifeform_t *fromlf) { if (shatterdam && !isdead(target)) { // extra glass damage if (seen) { - msg("^%d%s %s showered in %s shards!", getlfcol(target, CC_BAD), + msg("^%c%s %s showered in %s shards!", getlfcol(target, CC_BAD), targetname, is(target), o->material->name); } losehp(target, shatterdam, DT_SLASH, fromlf, damstring); @@ -13417,7 +13456,7 @@ int shatter(object_t *o, int hitlf, char *damstring, lifeform_t *fromlf) { case OT_POT_OIL: if (seen) { makeknown(o->type->id); - msg("^%d%s %s covered with oil!", getlfcol(target, CC_BAD), + msg("^%c%s %s covered with oil!", getlfcol(target, CC_BAD), targetname, is(target)); } // target is temporarily vulnerable to fire. @@ -15232,6 +15271,21 @@ void timeeffectsob(object_t *o) { } if (location && onground) { + enum TEMPERATURE temp; + temp = getcelltemp(location, NULL); + if (temp <= T_VCOLD) { + // stuff freezes + if ((o->type->material->id == MT_WATER) || (o->type->id == OT_SPLASHWATER) || (o->type->id == OT_FOUNTAIN)) { + if (hasflagval(o->flags, F_DTCONVERT, DT_COLD, NA, NA, NULL)) { + takedamage(o, 1, DT_COLD, NULL); + } else { + changemat(o, MT_ICE); + } + if (haslos(player, location)) { + msg("%s freeze%s!", obname, OB1(o, "s","")); + } + } + } if ((o->type->material->id == MT_WATER) || (o->type->id == OT_SPLASHWATER)) { if (location->type->absorbent) { if (haslos(player, location)) { @@ -15449,6 +15503,7 @@ void timeeffectsob(object_t *o) { if (f->id == F_OBHPDRAIN) { enum DAMTYPE damtype; + int damamt; int doit = B_TRUE; //takedamage(o, f->val[0] * firstlftime, DT_DIRECT); if (f->val[1] == NA) { @@ -15456,12 +15511,37 @@ void timeeffectsob(object_t *o) { } else { damtype = f->val[1]; } + damamt = f->val[0]; // special case - corpses don't decay when on ice or on fire. if (o->type->id == OT_CORPSE) { if (hasflag(o->flags, F_ONFIRE)) { doit = B_FALSE; - } else if (hasobofmaterial(o->pile, MT_ICE)) { + //} else if (hasobofmaterial(o->pile, MT_ICE)) { + } else if (location) { + enum TEMPERATURE ct; + ct = getcelltemp(location, NULL); + if (ct <= T_COLD) { + doit = B_FALSE; + } else if (ct >= T_WARM) { + // ie. warm = +3 dam + // ie. hot = +6 dam + // ie. vhot = +9 dam + damamt += ((ct - T_NORMAL)*3); + } + } + } + // stuff doesn't melt in cold cells + if ((damtype == DT_MELT) && location) { + enum TEMPERATURE ct; + ct = getcelltemp(location, NULL); + + if (ct <= T_CHILLY) { doit = B_FALSE; + } else if (ct >= T_WARM) { + // ie. warm = +3 dam + // ie. hot = +6 dam + // ie. vhot = +9 dam + damamt += ((ct - T_NORMAL)*3); } } // special case - fire doesn't naturally die down @@ -15842,6 +15922,7 @@ void trapeffects(object_t *trapob, enum OBTYPE oid, cell_t *c, object_t *trapped } if (!avoided) { losehp(lf, roll("2d4"), DT_CRUSH, NULL, "a falling door trap"); + fall(lf, NULL, B_FALSE); } } else { if (haslos(player, c)) { @@ -16791,14 +16872,24 @@ objecttype_t *getlinkspell(object_t *o) { enum COLOUR getmaterialcolour(enum MATERIAL mat) { enum COLOUR col; switch (mat) { + case MT_BRICK: + col = C_BRICK; + break; + case MT_METAL: + col = C_METAL; + break; case MT_WOOD: + col = C_DARKBROWN; + break; case MT_LEATHER: col = C_BROWN; break; case MT_FIRE: - case MT_BLOOD: col = C_RED; break; + case MT_BLOOD: + col = C_DARKRED; + break; case MT_GLASS: case MT_MAGIC: col = C_CYAN; @@ -16813,6 +16904,8 @@ enum COLOUR getmaterialcolour(enum MATERIAL mat) { col = C_BLUE; break; case MT_SLIME: + col = C_DARKGREEN; + break; case MT_ACID: col = C_GREEN; break; diff --git a/objects.h b/objects.h index 6dc5d96..8ecd295 100644 --- a/objects.h +++ b/objects.h @@ -25,6 +25,7 @@ void adjustdamob(object_t *o, int *dam, enum DAMTYPE damtype); int adjustarmourpenalty(lifeform_t *lf, float amt); int adjustshieldpenalty(lifeform_t *lf, float amt); //void adjustprice(objecttype_t *ot, float *price ); +void affect_temperature(object_t *o, int action); void appendinscription(object_t *o, char *text); void applyobmod(object_t *o, obmod_t *om); int blessob(object_t *o); diff --git a/save.c b/save.c index 5e56b2f..590a0c3 100644 --- a/save.c +++ b/save.c @@ -388,8 +388,8 @@ map_t *loadmap(FILE *f) { c = addcell(m, x, y); // cell info - fscanf(f, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", - &roomid, &celltypeid, &c->known, &c->knowntime, &c->knownglyph.ch, &c->knownglyph.colour, &c->visited, &c->locked, &temphab, &c->isroomwall); + fscanf(f, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", + &roomid, &celltypeid, &c->known, &c->knowntime, &c->knownglyph.ch, &c->knownglyph.colour, &c->visited, &c->locked, &temphab, &c->isroomwall, &c->temperature); c->habitat = findhabitat(temphab); c->room = findroom(m, roomid); @@ -1107,8 +1107,8 @@ int savemap(FILE *f, map_t *m) { cell_t *c; c = getcellat(m, x, y); // cell info - fprintf(f, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", - c->room ? c->room->id : -1, c->type->id, c->known, c->knowntime, c->knownglyph.ch, c->knownglyph.colour, c->visited,c->locked, c->habitat->id, c->isroomwall ); + fprintf(f, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", + c->room ? c->room->id : -1, c->type->id, c->known, c->knowntime, c->knownglyph.ch, c->knownglyph.colour, c->visited,c->locked, c->habitat->id, c->isroomwall, c->temperature ); // cell objects for (o = c->obpile->first ; o ; o = o->next) { fprintf(f, "ob:%ld\n",o->id); diff --git a/spell.c b/spell.c index d5bfb1b..071d149 100644 --- a/spell.c +++ b/spell.c @@ -4967,6 +4967,49 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_ howlong = getspellduration(20,30,blessed) + (power*10); addtempflag(caster->flags, F_ENHANCESMELL, 4, NA, NA, NULL, howlong); } + } else if ((spellid == OT_S_COLDSNAP) || (spellid == OT_S_HEATWAVE)) { + object_t *retob[MAXCANDIDATES]; + int nretobs,radius,tempmod; + char obname[BUFLEN]; + + if (spellid == OT_S_COLDSNAP) { + sprintf(obname, "unnatural coldness"); + tempmod = -30; + radius = power+1; + } else { + sprintf(obname, "unnatural heat"); + tempmod = 30; + radius = power-1; + } + + addobsinradius(targcell, radius, DT_ORTH, obname, B_FALSE, B_TRUE, caster, retob, NULL, &nretobs); + + if (nretobs) { + int i,donemsg = B_FALSE; + for (i = 0; i < nretobs; i++) { + flag_t *f; + object_t *o; + if (!donemsg && haslos(player, targcell)) { + if (spellid == OT_S_COLDSNAP) { + msg("A large cloud of vapour appears."); + } else { + msg("A shimmering haze of heat appears."); + } + if (seenbyplayer) *seenbyplayer = B_TRUE; + donemsg = B_TRUE; + } + o = retob[i]; + addflag(o->flags, F_TEMPMOD, tempmod, NA, NA, NULL); + f = hasflag(o->flags, F_OBHP); + if (f) { + f->val[1] = 40; + f->val[0] = f->val[1]; + } + affect_temperature(o, B_ADD); + } + } else { + fizzle(caster); + } } else if (spellid == OT_S_CONFISCATE) { char ch = 'a'; char obname[BUFLEN]; @@ -7592,17 +7635,24 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_ return B_TRUE; } } else if (spellid == OT_S_GLACIATE) { - object_t *o,*nexto; - int donesomething = B_FALSE; - if (haslos(player, targcell)) { - msg("A puff of vapour appears."); - if (seenbyplayer) *seenbyplayer = B_TRUE; - } + object_t *o; - for (o = targcell->obpile->first ; o ; o = nexto) { - nexto = o->next; - takedamage(o, 1, DT_COLD, caster); - donesomething = B_TRUE; + o = addobfast(targcell->obpile, OT_COLDNESS); + if (o) { + flag_t *f; + if (haslos(player, targcell)) { + msg("A puff of vapour appears."); + if (seenbyplayer) *seenbyplayer = B_TRUE; + } + addflag(o->flags, F_TEMPMOD, (power == 2) ? -25 : -15, NA, NA, NULL); + f = hasflag(o->flags, F_OBHP); + if (f) { + f->val[1] = power*20; + f->val[0] = f->val[1]; + } + affect_temperature(o, B_ADD); + } else { + fizzle(caster); } } else if ((spellid == OT_S_GREASE) || (spellid == OT_S_CREATEWATER)) { int radius; diff --git a/text.c b/text.c index da7c6ff..5590b69 100644 --- a/text.c +++ b/text.c @@ -161,9 +161,9 @@ enum COLOUR chartocol(char ch) { case 'w': // warning return C_YELLOW; case 'W': // extra warning - return C_BOLDMAGENTA; + return C_MAGENTA; case 'b': // bad - return C_BROWN; + return C_DARKYELLOW; case 'B': // v.bad return C_RED; case 'T': // terrible @@ -173,7 +173,7 @@ enum COLOUR chartocol(char ch) { case 'G': // v.good return C_CYAN; case 'E': // excllent - return C_BOLDCYAN; + return C_LIGHTCYAN; case 'h': // 'hilite' return C_WHITE; case 'l': // 'bLue' @@ -279,7 +279,7 @@ char *construct_hit_string(lifeform_t *lf, lifeform_t *victim, char *attackernam } else if (fatal) { col = C_GREEN; } else { - col = C_BROWN; // normal hit + col = C_LIGHTGREEN; // normal hit } strcpy(adjective, ""); @@ -984,6 +984,54 @@ char *getattrname(enum ATTRIB att) { return "?badattrib?"; } +char *getcolname(enum COLOUR c) { + switch (c) { + case C_RANDOM: return "__randomcolour__"; + case C_BLACK: return "black"; + case C_AQUA: return "aqua"; + case C_RED: return "red"; + case C_GREEN: return "green"; + case C_BROWN: return "brown"; + case C_BLUE: return "blue"; + case C_MAGENTA: return "magenta"; + case C_INDIGO: return "indigo"; + case C_PINK: return "pink"; + case C_CYAN: return "cyan"; + case C_GREY: return "grey"; + case C_YELLOW: return "yellow"; + case C_WHITE: return "white"; + case C_BONE: return "bone"; + case C_BRICK: return "brick"; + case C_MOSS: return "moss"; + case C_FLESH: return "flesh"; + case C_FOG: return "fog"; + case C_CARPET1: return "carpet1"; + case C_CARPET2: return "carpet2"; + case C_METAL: return "metal"; + case C_SMOKE: return "smoke"; + case C_WOOD: return "wood"; + case C_DARKCYAN: return "darkcyan"; + case C_DARKBLUE: return "darkblue"; + case C_DARKMAGENTA: return "darkmagenta"; + case C_DARKYELLOW: return "darkyellow"; + case C_ORANGE: return "orange"; + case C_DARKGREEN: return "darkgreen"; + case C_DARKGREY: return "darkgrey"; + case C_DARKBROWN: return "darkbrown"; + case C_DARKRED: return "darkred"; + case C_VDARKGREY: return "vdarkgrey"; + case C_LIGHTRED: return "lightred"; + case C_LIGHTBLUE: return "lightblue"; + case C_LIGHTBROWN: return "lightbrown"; + case C_LIGHTCYAN: return "lightcyan"; + case C_LIGHTGREEN: return "lightgreen"; + case C_LIGHTMAGENTA: return "lightmagenta"; + case C_LIGHTYELLOW: return "lightyellow"; + case C_LAST: return "last_colour"; + } + return "?unknowncolour?"; +} + char *getdamname(enum DAMTYPE damtype) { switch (damtype) { case DT_ALL: return "all damage"; @@ -1266,9 +1314,15 @@ char *getjobcatname(enum JOBCATEGORY jc) { char *getkillverb(lifeform_t *victim, object_t *wep, enum DAMTYPE damtype, int dam, int maxhp) { float pct; + flag_t *f; pct = (int)(((float) dam / (float) maxhp) * 100.0); - if (!isunconscious(victim)) { + f = lfhasflag(victim, F_GETKILLEDVERB); + if (f) { + return f->text; + } + + if (!isunconscious(victim) && lfcanbekod(victim)) { if (wep && hasflag(wep->flags, F_MERCIFUL)) { return "knock out"; } @@ -1276,13 +1330,6 @@ char *getkillverb(lifeform_t *victim, object_t *wep, enum DAMTYPE damtype, int d return "knock out"; } } - if (victim->race->id == R_DANCINGWEAPON) { - return "defeat"; - } - - if (getraceclass(victim) == RC_PLANT) { - return "destroy"; - } if (wep) { flag_t *f; @@ -1704,6 +1751,9 @@ char *getregionname(char *buf, map_t *m, region_t *r, enum REGIONNAMEFORMAT how) case BH_CAVE: snprintf(buf, BUFLEN, "goblin caves L%d", m->depth); break; + case BH_ICECAVERNS: + snprintf(buf, BUFLEN, "ice caverns L%d", m->depth); + break; case BH_WOODS: snprintf(buf, BUFLEN, "sylvan woods L%d", m->depth); break; @@ -1743,6 +1793,9 @@ char *getregionname(char *buf, map_t *m, region_t *r, enum REGIONNAMEFORMAT how) case BH_CAVE: snprintf(buf, BUFLEN, "on level %d of the goblin caves", m->depth); break; + case BH_ICECAVERNS: + snprintf(buf, BUFLEN, "on level %d of the ice caverns", m->depth); + break; case BH_WOODS: snprintf(buf, BUFLEN, "on level %d of the sylvan woods", m->depth); break; @@ -1782,6 +1835,9 @@ char *getregionname(char *buf, map_t *m, region_t *r, enum REGIONNAMEFORMAT how) case BH_CAVE: strcpy(buf, "the goblin caves"); break; + case BH_ICECAVERNS: + strcpy(buf, "the ice caverns"); + break; case BH_WOODS: strcpy(buf, "the sylvan woods"); break; @@ -1974,6 +2030,19 @@ char *gettimephasename(enum TIMEPHASE tp) { return "unknown_timephase"; } +char *gettemperaturename(enum TEMPERATURE temp) { + switch (temp) { + case T_VCOLD: return "extremely cold"; + case T_COLD: return "cold"; + case T_CHILLY: return "a bit chilly"; + case T_NORMAL: return "comfortable"; + case T_WARM: return "a bit warm"; + case T_HOT: return "hot"; + case T_VHOT: return "extremely hot"; + } + return "?unknowntemp?"; +} + char *gettimetext(char *retbuf) { int hours,mins,secs; splittime(&hours, &mins, &secs); diff --git a/text.h b/text.h index 8b1573c..9a111ca 100644 --- a/text.h +++ b/text.h @@ -18,6 +18,7 @@ char *getattrabbrev(enum ATTRIB att); char *getattrbracketname(enum ATTRIB whichatt, enum ATTRBRACKET brack); char getattrletter(enum ATTRIB att); char *getattrname(enum ATTRIB att); +char *getcolname(enum COLOUR c); char *getdamname(enum DAMTYPE damtype); char *getdamnamenoun(enum DAMTYPE damtype); char *getdirname(int dir); @@ -49,6 +50,7 @@ char *getsizetext(enum LFSIZE sz); char *getschoolname(enum SPELLSCHOOL sch); char *getschoolnameshort(enum SPELLSCHOOL sch); char *getskillcheckname(enum CHECKTYPE ct); +char *gettemperaturename(enum TEMPERATURE temp); char *gettimephasename(enum TIMEPHASE tp); char *gettimetext(char *retbuf); char *gettimetextfuzzy(char *retbuf, int wantpm);