diff --git a/src/main/java/com/comandante/creeper/managers/GameManager.java b/src/main/java/com/comandante/creeper/managers/GameManager.java index 6a3ab9d367601908c4b0b06e570cd3afc7e2e82c..8e8c91970cd0e752616cd5c2e1a932bec7246a40 100755 --- a/src/main/java/com/comandante/creeper/managers/GameManager.java +++ b/src/main/java/com/comandante/creeper/managers/GameManager.java @@ -383,7 +383,10 @@ public class GameManager { entityManager.saveItem(itemEntity); return true; } else { + Item itemEntity = entityManager.getItemEntity(itemId); channelUtils.write(player.getPlayerId(), "Your inventory is full, drop some items to free up room.\r\n"); + player.getCurrentRoom().addPresentItem(itemId); + roomSay(player.getCurrentRoom().getRoomId(), player.getPlayerName() + " dropped " + itemEntity.getItemName(), player.getPlayerId()); return false; } } diff --git a/src/main/java/com/comandante/creeper/npc/Npc.java b/src/main/java/com/comandante/creeper/npc/Npc.java index d3d9f9d33f9d3d2beb9393091db147976668dc90..c79b4912e183b01a27a12b0acc7c6285f9701b8f 100644 --- a/src/main/java/com/comandante/creeper/npc/Npc.java +++ b/src/main/java/com/comandante/creeper/npc/Npc.java @@ -7,10 +7,7 @@ import com.comandante.creeper.Items.Rarity; import com.comandante.creeper.entity.CreeperEntity; import com.comandante.creeper.managers.GameManager; import com.comandante.creeper.managers.SentryManager; -import com.comandante.creeper.player.CoolDown; -import com.comandante.creeper.player.CoolDownType; -import com.comandante.creeper.player.Levels; -import com.comandante.creeper.player.Player; +import com.comandante.creeper.player.*; import com.comandante.creeper.server.Color; import com.comandante.creeper.spawner.SpawnRule; import com.comandante.creeper.spells.Effect; @@ -60,6 +57,7 @@ public class Npc extends CreeperEntity { private Room currentRoom; private int effectsTickBucket = 0; private Set<CoolDown> coolDowns = Sets.newHashSet(); + private final ExperienceManager experienceManager = new ExperienceManager(); protected Npc(GameManager gameManager, String name, String colorName, long lastPhraseTimestamp, Stats stats, String dieMessage, Temperament temperament, Set<Area> roamAreas, Set<String> validTriggers, Loot loot, Set<SpawnRule> spawnRules) { @@ -136,36 +134,38 @@ public class Npc extends CreeperEntity { if (npcStatsChange.getPlayer().isActive(CoolDownType.DEATH) && !npcStatsChange.isItemDamage()) { return; } - if (isAlive.get()) { - if (npcStatsChange.getStats() != null) { - for (String message : npcStatsChange.getDamageStrings()) { - if (!npcStatsChange.getPlayer().isActive(CoolDownType.DEATH)) { - gameManager.getChannelUtils().write(npcStatsChange.getPlayer().getPlayerId(), message + "\r\n", true); - } - } - StatsHelper.combineStats(getStats(), npcStatsChange.getStats()); - long amt = npcStatsChange.getStats().getCurrentHealth(); - long damageReportAmt = -npcStatsChange.getStats().getCurrentHealth(); - if (getStats().getCurrentHealth() < 0) { - damageReportAmt = -amt + getStats().getCurrentHealth(); - getStats().setCurrentHealth(0); - } - long damage = 0; - if (getPlayerDamageMap().containsKey(npcStatsChange.getPlayer().getPlayerId())) { - damage = getPlayerDamageMap().get(npcStatsChange.getPlayer().getPlayerId()); - } - addDamageToMap(npcStatsChange.getPlayer().getPlayerId(), damage + damageReportAmt); - if (getStats().getCurrentHealth() == 0) { - killNpc(npcStatsChange.getPlayer()); - return; - } + if (!isAlive.get()) { + return; + } + if (npcStatsChange.getStats() == null) { + return; + } + for (String message : npcStatsChange.getDamageStrings()) { + if (!npcStatsChange.getPlayer().isActive(CoolDownType.DEATH)) { + gameManager.getChannelUtils().write(npcStatsChange.getPlayer().getPlayerId(), message + "\r\n", true); } - if (npcStatsChange.getPlayerStatsChange() != null) { - for (String message : npcStatsChange.getPlayerDamageStrings()) { - if (!npcStatsChange.getPlayer().isActive(CoolDownType.DEATH)) { - gameManager.getChannelUtils().write(npcStatsChange.getPlayer().getPlayerId(), message + "\r\n", true); - npcStatsChange.getPlayer().updatePlayerHealth(npcStatsChange.getPlayerStatsChange().getCurrentHealth(), this); - } + } + StatsHelper.combineStats(getStats(), npcStatsChange.getStats()); + long amt = npcStatsChange.getStats().getCurrentHealth(); + long damageReportAmt = -npcStatsChange.getStats().getCurrentHealth(); + if (getStats().getCurrentHealth() < 0) { + damageReportAmt = -amt + getStats().getCurrentHealth(); + getStats().setCurrentHealth(0); + } + long damage = 0; + if (getPlayerDamageMap().containsKey(npcStatsChange.getPlayer().getPlayerId())) { + damage = getPlayerDamageMap().get(npcStatsChange.getPlayer().getPlayerId()); + } + addDamageToMap(npcStatsChange.getPlayer().getPlayerId(), damage + damageReportAmt); + if (getStats().getCurrentHealth() == 0) { + killNpc(npcStatsChange.getPlayer()); + return; + } + if (npcStatsChange.getPlayerStatsChange() != null) { + for (String message : npcStatsChange.getPlayerDamageStrings()) { + if (!npcStatsChange.getPlayer().isActive(CoolDownType.DEATH)) { + gameManager.getChannelUtils().write(npcStatsChange.getPlayer().getPlayerId(), message + "\r\n", true); + npcStatsChange.getPlayer().updatePlayerHealth(npcStatsChange.getPlayerStatsChange().getCurrentHealth(), this); } } } @@ -242,7 +242,7 @@ public class Npc extends CreeperEntity { int playerLevel = (int) Levels.getLevel(gameManager.getStatsModifierFactory().getStatsModifier(player).getExperience()); int npcLevel = (int) Levels.getLevel(this.getStats().getExperience()); - long xpEarned = (long) (getNpcXp(playerLevel, npcLevel) * playerDamagePercentValue); + long xpEarned = (long) (experienceManager.calculateNpcXp(playerLevel, npcLevel) * playerDamagePercentValue); p.addExperience(xpEarned); p.addNpcKillLog(getName()); gameManager.getChannelUtils().write(p.getPlayerId(), getBattleReport(xpEarned) + "\r\n", true); @@ -265,23 +265,6 @@ public class Npc extends CreeperEntity { this.currentRoom = currentRoom; } - private int getNpcXp(int playerLevel, int npcLevel) { - if (npcLevel >= playerLevel) { - double temp = ((playerLevel * 5) + 45) * (1 + (0.05 * (npcLevel - playerLevel))); - double tempCap = ((playerLevel * 5) + 45) * 1.2; - if (temp > tempCap) { - return (int) Math.floor(tempCap); - } else { - return (int) Math.floor(temp); - } - } else { - if (getLevelColor(playerLevel).equals(NpcLevelColor.WHITE)) { - return 0; - } else { - return (int) (Math.floor((playerLevel * 5) + 45) * (1 - (playerLevel - npcLevel) / getZD(playerLevel))); - } - } - } private String getBattleReport(long xpEarned) { StringBuilder sb = new StringBuilder(); @@ -318,88 +301,7 @@ public class Npc extends CreeperEntity { return sb.toString(); } - public NpcLevelColor getLevelColor(int playerLevel) { - int npcLevel = (int) Levels.getLevel(this.getStats().getExperience()); - if (playerLevel + 5 <= npcLevel) { - return NpcLevelColor.RED; - } else { - switch (npcLevel - playerLevel) { - case 4: - case 3: - return NpcLevelColor.ORANGE; - case 2: - case 1: - case 0: - case -1: - case -3: - return NpcLevelColor.YELLOW; - default: - if (playerLevel <= 5) { - return NpcLevelColor.GREEN; - } else { - if (playerLevel <= 50) { - if (npcLevel <= (playerLevel - 5 - Math.floor(playerLevel / 10))) { - return NpcLevelColor.WHITE; - } else { - return NpcLevelColor.GREEN; - } - } else { - // Player is over level 50 - if (npcLevel <= (playerLevel - 1 - Math.floor(playerLevel / 5))) { - return NpcLevelColor.WHITE; - } else { - return NpcLevelColor.GREEN; - } - } - } - } - } - } - - private int getZD(int lvl) { - if (lvl <= 7) { - return 5; - } - if (lvl <= 9) { - return 6; - } - if (lvl <= 11) { - return 7; - } - if (lvl <= 15) { - return 8; - } - if (lvl <= 19) { - return 9; - } - if (lvl <= 29) { - return 11; - } - if (lvl <= 39) { - return 12; - } - if (lvl <= 49) { - return 13; - } - if (lvl <= 59) { - return 14; - } - if (lvl <= 69) { - return 15; - } - if (lvl <= 79) { - return 16; - } - if (lvl <= 89) { - return 17; - } - if (lvl <= 99) { - return 18; - } else { - return 19; - } - } public String getColorName() { return colorName; @@ -503,23 +405,27 @@ public class Npc extends CreeperEntity { this.coolDowns.add(coolDown); } + public NpcLevelColor getLevelColor(int playerLevel) { + return experienceManager.getLevelColor(playerLevel, (int) Levels.getLevel(this.getStats().getExperience())); + } + public enum NpcLevelColor { - RED(Color.RED + "Red"), - ORANGE(Color.CYAN + "Cyan"), - YELLOW(Color.YELLOW + "Yellow"), - GREEN(Color.GREEN + "Green"), - WHITE(Color.WHITE + "White"); + RED(Color.RED + "Red"), + ORANGE(Color.CYAN + "Cyan"), + YELLOW(Color.YELLOW + "Yellow"), + GREEN(Color.GREEN + "Green"), + WHITE(Color.WHITE + "White"); - private final String color; + private final String color; - NpcLevelColor(String color) { - this.color = color; - } + NpcLevelColor(String color) { + this.color = color; + } - public String getColor() { - return "(" + Color.BOLD_ON + color + Color.RESET + ")"; - } + public String getColor() { + return "(" + Color.BOLD_ON + color + Color.RESET + ")"; } +} } diff --git a/src/main/java/com/comandante/creeper/player/ExperienceManager.java b/src/main/java/com/comandante/creeper/player/ExperienceManager.java index 632f5c9d19cc1901e13bc7fa8c80faca536fad56..a87ec2dadb1ccf13ef77c1201ebded77a8cd23bf 100644 --- a/src/main/java/com/comandante/creeper/player/ExperienceManager.java +++ b/src/main/java/com/comandante/creeper/player/ExperienceManager.java @@ -1,5 +1,114 @@ package com.comandante.creeper.player; +import com.comandante.creeper.npc.Npc; + public class ExperienceManager { + public int calculateNpcXp(int playerLevel, int npcLevel) { + float xp = 0; + if (npcLevel == playerLevel) { + xp = (playerLevel * 5 + 45); + } + if (npcLevel > playerLevel) { + float i = playerLevel * 5 + 45; + float diff = npcLevel - playerLevel; + float modifier = 1 + .2f * (diff); + xp = i * modifier; + } + if (npcLevel < playerLevel) { + if (getLevelColor(playerLevel, npcLevel).equals(Npc.NpcLevelColor.WHITE)) { + xp = 0; + } else { + float levelDif = playerLevel - npcLevel; + xp = (playerLevel * 5 + 45) * (1 - (levelDif / getZD(playerLevel))); + } + } + if (xp == 0) { + return 0; + } + return (int) Math.floor(xp + 0.5); + } + + + public Npc.NpcLevelColor getLevelColor(int playerLevel, int npcLevel) { + if (playerLevel + 5 <= npcLevel) { + return Npc.NpcLevelColor.RED; + } else { + switch (npcLevel - playerLevel) { + case 4: + case 3: + return Npc.NpcLevelColor.ORANGE; + case 2: + case 1: + case 0: + case -1: + case -2: + return Npc.NpcLevelColor.YELLOW; + default: + if (playerLevel <= 5) { + return Npc.NpcLevelColor.GREEN; + } else { + if (playerLevel <= 50) { + if (npcLevel <= (playerLevel - 5 - Math.floor(playerLevel / 10))) { + return Npc.NpcLevelColor.WHITE; + } else { + return Npc.NpcLevelColor.GREEN; + } + } else { + // Player is over level 50 + if (npcLevel <= (playerLevel - 1 - Math.floor(playerLevel / 5))) { + return Npc.NpcLevelColor.WHITE; + } else { + return Npc.NpcLevelColor.GREEN; + } + } + } + } + } + } + + private int getZD(int lvl) { + if (lvl <= 7) { + return 5; + } + if (lvl <= 9) { + return 6; + } + if (lvl <= 11) { + return 7; + } + if (lvl <= 15) { + return 8; + } + if (lvl <= 19) { + return 9; + } + if (lvl <= 29) { + return 11; + } + if (lvl <= 39) { + return 12; + } + if (lvl <= 49) { + return 13; + } + if (lvl <= 59) { + return 14; + } + if (lvl <= 69) { + return 15; + } + if (lvl <= 79) { + return 16; + } + if (lvl <= 89) { + return 17; + } + if (lvl <= 99) { + return 18; + } else { + return 19; + } + } + } diff --git a/src/main/java/com/comandante/creeper/player/Player.java b/src/main/java/com/comandante/creeper/player/Player.java index 504166ab18360c9902ca7c85eeffa1e36f170bea..2f736a9bbbeee031dd1b35ccfdfd4e9073d78c06 100755 --- a/src/main/java/com/comandante/creeper/player/Player.java +++ b/src/main/java/com/comandante/creeper/player/Player.java @@ -104,13 +104,17 @@ public class Player extends CreeperEntity { synchronized (interner.intern(playerId)) { PlayerMetadata playerMetadata = gameManager.getPlayerManager().getPlayerMetadata(playerId); Stats stats = getPlayerStatsWithEquipmentAndLevel(); - if (!isActive(CoolDownType.DEATH)) { - if (playerMetadata.getStats().getCurrentHealth() < stats.getMaxHealth()) { - updatePlayerHealth((int) (stats.getMaxHealth() * .05), null); - } - if (playerMetadata.getStats().getCurrentMana() < stats.getMaxMana()) { - addMana((int) (stats.getMaxMana() * .03)); - } + if (isActive(CoolDownType.NPC_FIGHT)) { + return; + } + if (isActive(CoolDownType.DEATH)) { + return; + } + if (playerMetadata.getStats().getCurrentHealth() < stats.getMaxHealth()) { + updatePlayerHealth((int) (stats.getMaxHealth() * .05), null); + } + if (playerMetadata.getStats().getCurrentMana() < stats.getMaxMana()) { + addMana((int) (stats.getMaxMana() * .03)); } } } @@ -879,6 +883,7 @@ public class Player extends CreeperEntity { synchronized (interner.intern(playerId)) { if (gameManager.getEntityManager().getNpcEntity(npc.getEntityId()) != null) { if (!doesActiveFightExist(npc)) { + addCoolDown(new CoolDown(CoolDownType.NPC_FIGHT)); ActiveFight activeFight = new ActiveFight(npc.getEntityId(), false); activeFights.put(System.nanoTime(), activeFight); return true; @@ -982,8 +987,9 @@ public class Player extends CreeperEntity { } if (damageToVictim > 0) { if (randInt(0, 100) > 95) { - final String fightMsg = Color.BOLD_ON + Color.RED + "[attack] " + Color.RESET + Color.YELLOW + "The " + npc.getColorName() + " was caught off guard by the attack! " + "+" + NumberFormat.getNumberInstance(Locale.US).format(damageToVictim) + Color.RESET + Color.BOLD_ON + Color.RED + " DAMAGE" + Color.RESET + " done to " + npc.getColorName(); - npcStatsChangeBuilder.setStats(new StatsBuilder().setCurrentHealth(-(damageToVictim * 3)).createStats()); + long criticalDamage = damageToVictim * 3; + final String fightMsg = Color.BOLD_ON + Color.RED + "[attack] " + Color.RESET + Color.YELLOW + "The " + npc.getColorName() + " was caught off guard by the attack! " + "+" + NumberFormat.getNumberInstance(Locale.US).format(criticalDamage) + Color.RESET + Color.BOLD_ON + Color.RED + " DAMAGE" + Color.RESET + " done to " + npc.getColorName(); + npcStatsChangeBuilder.setStats(new StatsBuilder().setCurrentHealth(-(criticalDamage)).createStats()); npcStatsChangeBuilder.setDamageStrings(Collections.singletonList(fightMsg)); } else { final String fightMsg = Color.BOLD_ON + Color.RED + "[attack] " + Color.RESET + Color.YELLOW + "+" + NumberFormat.getNumberInstance(Locale.US).format(damageToVictim) + Color.RESET + Color.BOLD_ON + Color.RED + " DAMAGE" + Color.RESET + " done to " + npc.getColorName(); diff --git a/src/test/com/comandante/creeper/player/ExperienceManagerTest.java b/src/test/com/comandante/creeper/player/ExperienceManagerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..e97784c345acaee7104d4ebb7b6db35a2c375b11 --- /dev/null +++ b/src/test/com/comandante/creeper/player/ExperienceManagerTest.java @@ -0,0 +1,44 @@ +package com.comandante.creeper.player; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class ExperienceManagerTest { + + private ExperienceManager experienceManager; + + @Before + public void setUp() throws Exception { + experienceManager = new ExperienceManager(); + } + + @Test + public void testXp() throws Exception { + int playerLevel = 20; + Assert.assertEquals(0, experienceManager.calculateNpcXp(playerLevel, 13)); + Assert.assertEquals(0, experienceManager.calculateNpcXp(playerLevel, 12)); + Assert.assertEquals(232, experienceManager.calculateNpcXp(playerLevel, 23)); + Assert.assertEquals(203, experienceManager.calculateNpcXp(playerLevel, 22)); + Assert.assertEquals(174, experienceManager.calculateNpcXp(playerLevel, 21)); + Assert.assertEquals(145, experienceManager.calculateNpcXp(playerLevel, 20)); + Assert.assertEquals(132, experienceManager.calculateNpcXp(playerLevel, 19)); + Assert.assertEquals(119, experienceManager.calculateNpcXp(playerLevel, 18)); + int npcLevel = 3; + for (int i = 0; i < 10; i++) { + System.out.println("Player Level: " + i + " xp gained: " + experienceManager.calculateNpcXp(i, npcLevel)); + } + } + + + @Test + public void testSpread() throws Exception { + //System.out.println("Player Level: " + 28 + " " + experienceManager.getLevelColor(28, 25) + " " + experienceManager.calculateNpcXp(28, 25)); +// System.out.println("Player Level: " + 29 + " " + experienceManager.getLevelColor(29, 25) + " " + experienceManager.calculateNpcXp(29, 25)); + + for (int i = 15; i < 30; i++) { + System.out.println("Player Level: " + i + " " + experienceManager.getLevelColor(i, 25) + " " + experienceManager.calculateNpcXp(i, 25)); + } + } +} \ No newline at end of file diff --git a/src/test/com/comandante/creeper/player/NpcTestHarness.java b/src/test/com/comandante/creeper/player/NpcTestHarness.java index 03340228f1fa27a38b7a2e650dd03baff8db40e3..6594b564049a075c7b67769e402c08cf020b05e4 100644 --- a/src/test/com/comandante/creeper/player/NpcTestHarness.java +++ b/src/test/com/comandante/creeper/player/NpcTestHarness.java @@ -46,10 +46,14 @@ public class NpcTestHarness { public void setUp() throws Exception { ChannelCommunicationUtils channelUtils = new ChannelCommunicationUtils() { @Override - public void write(String playerId, String message) {} + public void write(String playerId, String message) { + //System.out.println(message); + } @Override - public void write(String playerId, String message, boolean leadingBlankLine) {} + public void write(String playerId, String message, boolean leadingBlankLine) { + // System.out.println(message); + } }; CreeperConfiguration creeperConfiguration = new CreeperConfiguration(new MapConfiguration(Maps.newHashMap())); DB db = DBMaker.newMemoryDB().closeOnJvmShutdown().make(); @@ -67,34 +71,57 @@ public class NpcTestHarness { } @Test - public void testCombat() throws Exception { + public void testAnotherCombat() throws Exception { + Set<Item> equipment = Sets.newHashSet(); + equipment.add(ItemType.BERSEKER_BOOTS.create()); + //equipment.add(ItemType.BERSERKER_BATON.create()); + equipment.add(ItemType.BERSERKER_CHEST.create()); + equipment.add(ItemType.BERSEKER_SHORTS.create()); + String username = UUID.randomUUID().toString(); + Player player = createRandomPlayer(username, 0); + equipArmor(player, equipment); List<Npc> npcsFromFile = NpcExporter.getNpcsFromFile(gameManager); Npc treeBerseker = npcsFromFile.stream().filter(npc -> npc.getName().equals("tree berserker")).collect(Collectors.toList()).get(0); + Npc npc = new NpcBuilder(treeBerseker).createNpc(); + gameManager.getEntityManager().addEntity(npc); + player.getCurrentRoom().addPresentNpc(npc.getEntityId()); + player.addActiveFight(npc); + conductFight(player, npc); + } + + @Test + public void testCombat() throws Exception { + List<Npc> npcsFromFile = NpcExporter.getNpcsFromFile(gameManager); + Npc treeBerseker = npcsFromFile.stream().filter(npc -> npc.getName().equals("swamp berserker")).collect(Collectors.toList()).get(0); int totalIterations = 100; Player player; Npc npc = null; - Table t = new Table(7, BorderStyle.BLANKS, + Table t = new Table(8, BorderStyle.BLANKS, ShownBorders.NONE); t.setColumnWidth(0, 20, 20); t.setColumnWidth(1, 15, 20); - t.setColumnWidth(2, 16, 16); - t.setColumnWidth(3, 16, 16); - t.setColumnWidth(4, 16, 16); - t.setColumnWidth(5, 16, 16); + t.setColumnWidth(2, 13, 16); + t.setColumnWidth(3, 10, 16); + t.setColumnWidth(4, 13, 16); + t.setColumnWidth(5, 10, 16); + t.setColumnWidth(6, 13, 16); //t.setColumnWidth(6, 16, 16); t.addCell("Npc"); t.addCell("Player Level"); - t.addCell("Player Win Pct"); - t.addCell("Npc Win Pct"); - t.addCell("Avg Rounds"); + t.addCell("Player Win"); + t.addCell("Npc Win"); + t.addCell("Avg Turns"); t.addCell("Avg Gold"); + t.addCell("XP Earned"); t.addCell("Drops"); Set<Item> equipment = Sets.newHashSet(); equipment.add(ItemType.BERSEKER_BOOTS.create()); - //equipment.add(ItemType.BERSERKER_BATON.create()); + equipment.add(ItemType.BERSERKER_BATON.create()); equipment.add(ItemType.BERSERKER_CHEST.create()); equipment.add(ItemType.BERSEKER_SHORTS.create()); + equipment.add(ItemType.BERSERKER_BRACERS.create()); + equipment.add(ItemType.BERSEKER_HELM.create()); for (int level = 0; level < 10; level++) { int playerWins = 0; @@ -107,6 +134,7 @@ public class NpcTestHarness { player = createRandomPlayer(username, level); equipArmor(player, equipment); npc = new NpcBuilder(treeBerseker).createNpc(); + npc.setCurrentRoom(player.getCurrentRoom()); gameManager.getEntityManager().addEntity(npc); player.getCurrentRoom().addPresentNpc(npc.getEntityId()); player.addActiveFight(npc); @@ -133,20 +161,26 @@ public class NpcTestHarness { float npcWinPercent = (npcWins * 100.0f) / totalIterations; t.addCell(npc.getName()); t.addCell(String.valueOf(level)); - t.addCell(String.valueOf(playerWinPercent)+"%"); - t.addCell(String.valueOf(npcWinPercent)+"%"); + t.addCell(String.valueOf(playerWinPercent) + "%"); + t.addCell(String.valueOf(npcWinPercent) + "%"); t.addCell(String.valueOf(totalFightRounds / totalIterations)); - t.addCell(String.valueOf(totalGold / playerWins)); + if (totalGold == 0 || playerWins == 0) { + t.addCell("0"); + } else { + t.addCell(String.valueOf(totalGold / playerWins)); + } + t.addCell(String.valueOf(new ExperienceManager().calculateNpcXp(level, (int) Levels.getLevel(npc.getStats().getExperience())))); StringBuilder sb = new StringBuilder(); drops.entrySet().stream().map(entry -> entry.getKey() + "(" + entry.getValue().get() + ")").forEach(s -> sb.append(s).append(",")); t.addCell(sb.toString()); } + System.out.println("#### 100 round fight simulation results ####"); System.out.println(t.render()); - // Stats difference = StatsHelper.getDifference(player.getPlayerStatsWithEquipmentAndLevel(), new PlayerStats().DEFAULT_PLAYER.createStats()); - // String player1 = gameManager.buildLookString("player", player.getPlayerStatsWithEquipmentAndLevel(),difference ); - // System.out.println(player1); - // System.out.println(""); + // Stats difference = StatsHelper.getDifference(player.getPlayerStatsWithEquipmentAndLevel(), new PlayerStats().DEFAULT_PLAYER.createStats()); + // String player1 = gameManager.buildLookString("player", player.getPlayerStatsWithEquipmentAndLevel(),difference ); + // System.out.println(player1); + // System.out.println(""); } @@ -195,5 +229,4 @@ public class NpcTestHarness { PlayerMetadata playerMetadata = new PlayerMetadata(username, password, Main.createPlayerId(username), PlayerStats.DEFAULT_PLAYER.createStats(), 0, Sets.newHashSet(PlayerRole.MORTAL), new String[0], 0, new String[0], Maps.newHashMap()); gameManager.getPlayerManager().savePlayerMetadata(playerMetadata); } - } diff --git a/world/npcs/swampberserker.json b/world/npcs/swampberserker.json new file mode 100644 index 0000000000000000000000000000000000000000..632c7224d21150c134ddc11092eb5d06349b75cf --- /dev/null +++ b/world/npcs/swampberserker.json @@ -0,0 +1,44 @@ +{ + "name": "swamp berserker", + "colorName": "swamp \u001B[1m\u001B[35mberserker\u001B[0m", + "dieMessage": "a swamp \u001B[1m\u001B[35mberserker\u001B[0m breathes his last breath in a pool of \u001B[1m\u001B[31mblood\u001B[0m", + "temperament": "passive", + "loot": { + "lootGoldMin": 7, + "lootGoldMax": 14, + "lootItems": [3] + }, + "roamAreas": [ + "north1_zone" + ], + "stats": { + "agile": 1, + "aim": 1, + "armorRating": 6, + "currentHealth": 105, + "currentMana": 105, + "experience": 22500, + "maxHealth": 105, + "maxMana": 105, + "meleSkill": 16, + "numberOfWeaponRolls": 1, + "strength": 10, + "weaponRatingMax": 15, + "weaponRatingMin": 9, + "willPower": 1 + }, + "spawnAreas": { + "north1_zone": { + "randomChance": 100, + "maxPerRoom": 6, + "spawnIntervalTicks": 600, + "maxInstances": 24 + } + }, + "validTriggers": [ + "s", + "swamp berserker", + "berserker", + "b" + ] +} diff --git a/world/npcs/treeberserker.json b/world/npcs/treeberserker.json index 5c1479b8e865c169bead77a6126b0299bff79b11..9f7926592374dcc771e0759a3a06754d823e4418 100755 --- a/world/npcs/treeberserker.json +++ b/world/npcs/treeberserker.json @@ -17,7 +17,7 @@ "armorRating": 3, "currentHealth": 90, "currentMana": 90, - "experience": 22600, + "experience": 2500, "maxHealth": 90, "maxMana": 90, "meleSkill": 12,