private void talk(int p, final Thing t) { int subtype = getStat("SubType"); Thing h = Game.hero(); try { switch (p) { case CHATTER: t.incStat("ChatCount", 1); handleChatter(subtype, t.getStat("ChatCount"), t); return; case TEACHER: if (h.getStat(RPG.ST_SKILLPOINTS) > 0) { Game.message("\"I see you have potential\""); Game.message("\"I can teach you for a small fee...\""); } else { Game.message("\"There is nothing more I can teach you now.\""); } return; // added by ppirrip case BLACKSMITH: Game.message("\"I can repair your gear for a small fee...\""); return; default: Game.message("You get no response."); } } catch (Exception e) { e.printStackTrace(); Game.message("\"Mumble mumble mumble\""); } }
public static void init() { Thing t; // base monster template t = Lib.extend("base animal", "base being"); t.set("IsMonster", 0); t.set(RPG.ST_AIMODE, "Evade"); t.set("IsHostile", 0); t.set("IsAnimal", 1); t.set("Frequency", 50); t.set("IsIntelligent", 0); t.set("LevelMin", 1); t.set("LevelMax", 100); t.set("XPValue", 5); Lib.add(t); initWildLife(); }
private void handleChatter(final int subtype, final int chats, final Thing t) { final ChatterComment cc = chattercomments[subtype]; switch (chats) { case 1: // -this is first converstaion to Hero - try to say hello if (cc.hello.length != 0 && RPG.p(cc.helloProbability)) { Game.quotedMessage(RPG.pick(cc.hello)); break; } default: // say comment Game.message("\"" + RPG.pick(cc.comments) + "\""); t.set("ChatCount", 100); } }
private String getDeathString(Thing h) { if (h.getStat("HPS") <= 0) { Thing t = h.getThing("Killer"); if (t == null) { return "Killed by divine power"; } t.remove(); String killer = t.getAName(); if (t.getFlag("IsEffect")) killer = t.name(); if (killer.equals("you")) killer = "stupidity"; return "Killed by " + killer; } return "Defeated The Tyrant"; }
/** Check that random adds add Things to different squares assuming a free square is available */ public void testRandomAdds() { Map map = new Map(2, 1); map.fillArea(0, 0, 1, 0, Tile.CAVEFLOOR); Thing a = new Thing(); Thing b = new Thing(); map.addThing(a); map.addThing(b); assertTrue(a.getMap() == map); assertTrue(b.getMap() == map); assertTrue(a.y == 0); assertTrue(b.y == 0); assertTrue(a.x != b.x); Thing c = new Thing(); map.addThing(c); assertTrue(c.getMap() == map); }
// 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; } } }
public boolean handle(Thing t, Event ae) { Thing h = Game.hero(); // Game.warn("EncounterAction: "+time); encounter(h.getMap(), h.x, h.y); return false; }
public void gameOver() { Wish.makeWish("identification", 100); Game.message(""); Thing h = Game.hero(); String outcome = getDeathString(h); String story = null; getScreen().getMappanel().repaint(); String hresult = "No high score available in debug mode"; int sc = h.getStat("Score"); String score = Integer.toString(sc); String level = Integer.toString(h.getLevel()); String seed = Integer.toString(h.getStat("Seed")); String name = h.getString("HeroName"); String profession = h.getString("Profession"); String race = h.getString("Race"); try { String urldeath = URLEncoder.encode(outcome, fileEncoding); String urlname = URLEncoder.encode(name, fileEncoding); String check = Integer.toString((sc + name.length() * profession.length() * race.length()) ^ 12345678); String st = "&name=" + urlname + "&race=" + race + "&profession=" + profession + "&level=" + level + "&score=" + score + "&check=" + check + "&version=" + Game.VERSION + "&seed=" + seed + "&death=" + urldeath; String url = "http://tyrant.sourceforge.net/logscore.php?client=tyrant" + st; Game.warn((Game.isDebug() ? "NOT " : "") + "Sending data:"); Game.warn(st); if (!Game.isDebug()) { URL u = new URL(url); InputStream s = u.openStream(); String returnstring = ""; int b = s.read(); while (b >= 0) { returnstring = returnstring + (char) b; b = s.read(); } int ok = returnstring.indexOf("OK:"); if (ok >= 0) { hresult = "High score logged.\n"; hresult += "You are in position " + returnstring.substring(ok + 3).trim(); } else { hresult = "Failed to log high score"; Game.warn(returnstring); } } } catch (Exception e) { Game.warn(e.getMessage()); hresult = "High score feature not available"; } if ((!h.isDead())) { story = "You have defeated The Tyrant!\n" + "\n" + "Having saved the world from such malevolent evil, you are crowned as the new Emperor of Daedor, greatly beloved by all the people of the Earth.\n" + "\n" + "You rule an Empire of peace and prosperity, and enjoy a long and happy life.\n" + "\n" + "Hurrah for Emperor " + h.getString("HeroName") + "!!\n"; if (Game.isDebug()) { story = "You have defeated The Tyrant in Debug Mode.\n" + "\n" + "Now go and do it the hard way....\n"; } } else { story = "\n" + "It's all over...... " + outcome + "\n" + "\n" + "You have failed in your adventures and died a hideous death.\n" + "\n" + "You reached level " + level + "\n" + "Your score is " + score + "\n" + "\n" + hresult + "\n"; } Game.message("GAME OVER - " + outcome); Game.message("Would you like to see your final posessions? (y/n)"); char c = Game.getOption("yn"); if (c == 'y') { Game.selectItem("Your final posessions:", h); } // display the final story Game.scrollTextScreen(story); // display the final story String killData = Hero.reportKillData(); Game.scrollTextScreen(killData); Game.over = true; Lib.clear(); // recreate lib in background Game.asynchronousCreateLib(); }
// creates a hero according to specified parameters public Thing createHero(boolean prompts) { long start = System.currentTimeMillis(); String race = null; String profession = null; if (!prompts) { race = "human"; profession = "fighter"; Game.setDebug(true); } // get list of races String[] raceherostrings = Hero.heroRaces(); String[] racedescriptions = Hero.heroRaceDescriptions(); if (race == null) { DetailedListScreen ls = new DetailedListScreen("What race are you?", raceherostrings, racedescriptions); ls.setForeground(new Color(128, 128, 128)); ls.setBackground(new Color(0, 0, 0)); ls.bottomString = "Press a letter key to select your race"; switchScreen(ls); while (true) { race = (String) ls.getObject(); // Game.warn(race); if ((race != null) || Game.isDebug()) break; } } if (race == null) { // Debug mode only // have escaped, so choose randomly race = raceherostrings[Rand.r(raceherostrings.length)]; String[] herostrings = Hero.heroProfessions(race); profession = herostrings[Rand.r(herostrings.length)]; } // get list of possible prfessions String[] professionstrings = Hero.heroProfessions(race); String[] professiondescriptions = Hero.heroProfessionDescriptions(race); if (profession == null) { DetailedListScreen ls = new DetailedListScreen( "What is your profession?", professionstrings, professiondescriptions); ls.bottomString = "Press a letter key to select your profession"; ls.setForeground(new Color(128, 128, 128)); ls.setBackground(new Color(0, 0, 0)); switchScreen(ls); while (profession == null) { profession = (String) ls.getObject(); } } Thing h = Hero.createHero(prompts ? null : "QuickTester", race, profession); // hero name and history display String name = "QuickTester"; if (prompts) { // setup screen to get name Screen ss = new Screen(this); ss.setBackground(new Color(0, 0, 0)); ss.setLayout(new BorderLayout()); { InfoScreen ts = new InfoScreen(this, h.getString("HeroHistory")); ts.setBackground(new Color(0, 0, 0)); ss.add("Center", ts); } MessagePanel mp = new MessagePanel(this); Game.messagepanel = mp; ss.add("South", mp); switchScreen(ss); name = getHeroName(true); if (name == null) return null; } Hero.setHeroName(h, name); System.out.println((System.currentTimeMillis() - start) + "ms to createHero"); return h; }
public static void initWildLife() { Thing t; t = Lib.extend("rabbit", "base animal"); t.set("IsHostile", 0); t.set("Image", 285); t.set("IsOwned", 1); t.set("MoveSpeed", 140); Monster.stats(t, 3, 2, 15, 3, 1, 2, 1, 1); t.set("DeathDecoration", "piece of rabbit meat"); Lib.add(t); t = Lib.extend("hare", "rabbit"); t.set("MoveSpeed", 240); Monster.stats(t, 3, 2, 25, 3, 1, 2, 1, 1); t.set("DeathDecoration", "piece of hare meat"); Lib.add(t); t = Lib.extend("butterfly", "base animal"); t.set("IsHostile", 0); t.set("IsBlocking", 0); t.set("Image", 294); t.set("IsItem", 1); t.set("DeathDecoration", null); t.set("ItemWeight", 100); Monster.stats(t, 1, 1, 5, 1, 1, 1, 1, 1); Lib.add(t); t = Lib.extend("snail", "base animal"); t.set("IsHostile", 0); t.set("IsOwned", 1); t.set("Image", 387); t.set("MoveSpeed", 40); Monster.stats(t, 1, 1, 5, 1, 1, 1, 1, 1); t.set("DeathDecoration", "slime pool"); Lib.add(t); t = Lib.extend("escargot", "base animal"); t.set("IsHostile", 0); t.set("IsOwned", 1); t.set("Image", 387); t.set("MoveSpeed", 40); Monster.stats(t, 1, 1, 5, 1, 1, 1, 1, 1); t.set("DeathDecoration", "escargot steak"); t.set("ASCII", "e"); Lib.add(t); t = Lib.extend("slug", "base animal"); t.set("IsHostile", 0); t.set("Image", 386); t.set("MoveSpeed", 40); Monster.stats(t, 1, 1, 5, 1, 1, 1, 1, 1); t.set("DeathDecoration", "poison cloud"); Lib.add(t); t = Lib.extend("flutterby", "butterfly"); t.set("DecayRate", 1000); t.addHandler("OnAction", Scripts.decay()); Lib.add(t); }