// can't do anything in monster action phase // but allow for hunger effects public static void action(Thing h, int t) { // hunger int hunger = h.getStat(RPG.ST_HUNGER); int hungerThreshold = h.getStat("HungerThreshold"); hunger = RPG.min(hungerThreshold * 3, hunger + (t * 6) / (6 + h.getStat(Skill.SURVIVAL))); h.set(RPG.ST_HUNGER, hunger); // bad things int hl = hunger / hungerThreshold; switch (hl) { case 0: case 1: // OK break; case 2: for (int i = RPG.po(t, 10000); i > 0; i--) { Game.message("You feel weak with hunger!"); String stat = RPG.pick(hungerDecayStats); int sv = h.getBaseStat(stat); if (!h.getFlag("IsImmortal")) h.set(stat, RPG.max(sv - 1, 1)); } break; case 3: // dying of hunger int loss = RPG.po(t / 1000.0); if (loss > 0) Game.message("You are dying of hunger!!"); if (!h.getFlag("IsImmortal")) h.incStat("HPSMAX", -loss); if (!h.getFlag("IsImmortal")) h.incStat("HPS", -loss * 2); break; } // SPECIAL ABILITIES // thief searches for (int i = RPG.po(t * h.getStat(Skill.ALERTNESS) * h.getStat(RPG.ST_CR), 10000); i > 0; i--) { Secret.search(); } }
// called to check for random encounters public static void encounter(Map map, int x, int y) { if (Rand.d(20) > 1) return; Thing h = Game.hero(); // don't have encounters on location squares Thing[] ts = map.getPortals(x, y); if (ts.length > 0) return; int tile = map.getTile(x, y); if (tile == Tile.SEA) { return; } switch (Rand.d(8)) { case 1: { Game.message("You see somebody in the distance"); break; } case 2: { Thing c = Lib.createType("IsHostile", Game.hero().getStat(RPG.ST_LEVEL) + Rand.r(6)); Game.message("You see " + c.getAName() + " waiting to ambush travellers"); Game.message("Do you want to attack? (y/n)"); if (Game.getOption("yn") == 'y') { Game.message(""); // create location map Map nm = createArea(map, x, y); nm.addThing(Game.hero(), 32, 32); nm.addThing(c, 32, 25); // companions if (Rand.d(2) == 1) { for (int i = Rand.d(6); i > 0; i--) { int gx = 28 + Rand.r(9); int gy = 18 + Rand.r(7); if (!nm.isBlocked(gx, gy)) { nm.addThing(c.cloneType(), gx, gy); } } if ((Rand.d(2) == 1) && (!nm.isBlocked(32, 20))) { nm.addThing(Lib.createFoe(Game.hero().getStat(RPG.ST_LEVEL) + 1), 32, 20); } } } else { Game.message("You avoid the encounter"); } break; } case 3: { Thing c = Lib.createFoe(Game.hero().getStat(RPG.ST_LEVEL) + 2); Game.message("You see some villagers being attacked by " + c.getPluralName()); Game.message("Do you want to aid them? (y/n)"); if (Game.getOption("yn") == 'y') { // create location map Map nm = createArea(map, x, y); nm.addThing(Game.hero(), 32, 32); // villages for (int i = Rand.d(2, 3); i > 0; i--) { int gx = 29 + Rand.r(7); int gy = 28 + Rand.r(7); if (!nm.isBlocked(gx, gy)) switch (Rand.d(3)) { case 1: nm.addThing(Lib.create("farmer"), gx, gy); break; case 2: nm.addThing(Lib.create("village girl"), gx, gy); break; case 3: nm.addThing(Lib.create("townswoman"), gx, gy); break; } } // critters for (int i = Rand.d(2, 6); i > 0; i--) { int gx = 28 + Rand.r(9); int gy = 21 + Rand.r(7); if (!nm.isBlocked(gx, gy)) { nm.addThing(c.cloneType(), gx, gy); } } // boss critter nm.addThing(Lib.createFoe(Game.hero().getStat(RPG.ST_LEVEL) + 4), 32, 20); } else { Game.message("You leave them to their fate"); } break; } case 4: { Game.message("You are slowed by bad weather conditions."); h.incStat("APS", -1000); break; } case 5: { int level = h.getLevel(); if (level <= 2) break; Game.message("You are ambushed by a horde of fearsome monsters!"); Game.message("[Press space to continue]"); Game.getOption(" "); Map nm = createArea(map, x, y); nm.set("IsHostile", 1); nm.addThing(Game.hero(), 32, 32); for (int i = 0; i < 40 + 3 * level; i++) { nm.addThing(Lib.createType("IsMonster", level)); } break; } case 6: { Thing[] its = h.getItems(); Thing it = (its.length > 0) ? its[Rand.r(its.length)] : null; if ((it != null) && !it.getFlag("IsCursed") && (Item.value(it) > 0)) { Game.message("You encounter a band of nasty goblinoids!"); Game.message("They demand " + it.getYourName() + " as 'tax'"); Game.message("Do you want to fight them? (y/n)"); char c = Game.getOption("yn"); while (!((c == 'y') || (c == 'n'))) c = Game.getOption("yn"); if (c == 'n') { it.remove(); if (Rand.d(50) <= h.getLevel()) { Game.message("They decide to attack you anyway!"); c = 'y'; } else { Game.message("They take " + it.getYourName() + " and run away gleefully"); } } else { // don't lose an item it = null; } if (c == 'y') { Map nm = createArea(map, x, y); nm.set("IsHostile", 1); nm.addThing(Game.hero(), 32, 32); nm.addThing(it, 32, 36); int level = h.getLevel(); for (int i = 0; i < (2 + level); i++) { nm.addThing( Lib.createType("IsGoblinoid", level), h.x - 3, h.y + 1, h.x + 3, h.y + 4); } } } break; } } }