diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index 51d76e68c9389cd7221adcb2c6f9332663c0512a..5c1e203739236dd53dd5a57d9c7c4fbfb525537c 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.comandante</groupId> <artifactId>creeper</artifactId> diff --git a/src/main/java/com/comandante/creeper/RandomMOTD.java b/src/main/java/com/comandante/creeper/RandomMOTD.java new file mode 100644 index 0000000000000000000000000000000000000000..aa23748fd1c137a25050437f02cc965eb7095625 --- /dev/null +++ b/src/main/java/com/comandante/creeper/RandomMOTD.java @@ -0,0 +1,7 @@ +package com.comandante.creeper; + + +public class RandomMOTD { + + +} diff --git a/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java b/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java index 079d690d398cb915a27e442ec96e591832cdd727..e7c3cd9d4719b1955999e3b05d59e94465d31dcb 100644 --- a/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java +++ b/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java @@ -4,6 +4,8 @@ package com.comandante.creeper.command; import com.comandante.creeper.command.commands.DropCommand; import com.comandante.creeper.command.commands.GossipCommand; import com.comandante.creeper.command.commands.InventoryCommand; +import com.comandante.creeper.command.commands.KillCommand; +import com.comandante.creeper.command.commands.LookCommand; import com.comandante.creeper.command.commands.MovementCommand; import com.comandante.creeper.command.commands.PickUpCommand; import com.comandante.creeper.command.commands.SayCommand; @@ -62,11 +64,16 @@ public class DefaultCommandHandler { } else if (DropCommand.validTriggers.contains(rootCommand)) { DropCommand dropCommand = new DropCommand(playerId, gameManager, originalMessage, creeperSession); commandService.processCommand(dropCommand); + } else if (LookCommand.validTriggers.contains(rootCommand)) { + LookCommand lookCommand = new LookCommand(playerId, gameManager, originalMessage); + commandService.processCommand(lookCommand); + } else if (KillCommand.validTriggers.contains(rootCommand)) { + KillCommand killCommand = new KillCommand(playerId, gameManager, originalMessage, gameManager.getFightManager()); + commandService.processCommand(killCommand); } else { UnknownCommand unknownCommand = new UnknownCommand(playerId, gameManager, originalMessage); commandService.processCommand(unknownCommand); } - } } diff --git a/src/main/java/com/comandante/creeper/command/commands/KillCommand.java b/src/main/java/com/comandante/creeper/command/commands/KillCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..e19a4b9cce4feb74f332846fae83b1612133d05b --- /dev/null +++ b/src/main/java/com/comandante/creeper/command/commands/KillCommand.java @@ -0,0 +1,51 @@ +package com.comandante.creeper.command.commands; + +import com.comandante.creeper.managers.GameManager; +import com.comandante.creeper.model.FightManager; +import com.comandante.creeper.model.Player; +import com.comandante.creeper.model.Room; +import com.comandante.creeper.npc.Npc; +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableList; + +import java.util.ArrayList; +import java.util.Set; + +public class KillCommand extends Command { + + private final static String helpDescription = "Kill a NPC."; + public final static ImmutableList validTriggers = new ImmutableList.Builder<String>().add( + "kill".toLowerCase(), + "k".toLowerCase() + ).build(); + private final static boolean isCaseSensitiveTriggers = false; + private final FightManager fightManager; + + public KillCommand(String playerId, GameManager gameManager, String originalMessage, FightManager fightManager) { + super(playerId, gameManager, helpDescription, validTriggers, isCaseSensitiveTriggers, originalMessage); + this.fightManager = fightManager; + } + + @Override + public void run() { + + Player player = getGameManager().getPlayerManager().getPlayer(getPlayerId()); + ArrayList<String> originalMessageParts = getOriginalMessageParts(); + if (originalMessageParts.size() == 1) { + commandWrite("You need to specify who you want to kill."); + return; + } + originalMessageParts.remove(0); + String target = Joiner.on(" ").join(originalMessageParts); + Room playerCurrentRoom = getGameManager().getRoomManager().getPlayerCurrentRoom(player).get(); + Set<String> npcIds = playerCurrentRoom.getNpcIds(); + for (String npcId: npcIds) { + Npc npcEntity = getGameManager().getEntityManager().getNpcEntity(npcId); + if (npcEntity.getName().equals(target)) { + fightManager.fight(player, npcEntity); + return; + } + } + commandWrite("There's no NPC here to kill by that name."); + } +} diff --git a/src/main/java/com/comandante/creeper/command/commands/LookCommand.java b/src/main/java/com/comandante/creeper/command/commands/LookCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..ee286d437633125ddcb4b2a7939f16fec2285b2b --- /dev/null +++ b/src/main/java/com/comandante/creeper/command/commands/LookCommand.java @@ -0,0 +1,45 @@ +package com.comandante.creeper.command.commands; + +import com.comandante.creeper.managers.GameManager; +import com.comandante.creeper.model.Player; +import com.comandante.creeper.model.Room; +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableList; + +import java.util.ArrayList; +import java.util.Set; + +public class LookCommand extends Command { + + private final static String helpDescription = "Examine an item or other entity."; + public final static ImmutableList validTriggers = new ImmutableList.Builder<String>().add( + "look".toLowerCase(), + "l".toLowerCase() + ).build(); + private final static boolean isCaseSensitiveTriggers = false; + + public LookCommand(String playerId, GameManager gameManager, String originalMessage) { + super(playerId, gameManager, helpDescription, validTriggers, isCaseSensitiveTriggers, originalMessage); + } + + @Override + public void run() { + ArrayList<String> originalMessageParts = getOriginalMessageParts(); + if (originalMessageParts.size() == 1) { + getGameManager().currentRoomLogic(getPlayerId()); + return; + } + originalMessageParts.remove(0); + String target = Joiner.on(" ").join(originalMessageParts); + //Players + Player player = getGameManager().getPlayerManager().getPlayer(getPlayerId()); + Room playerCurrentRoom = getGameManager().getRoomManager().getPlayerCurrentRoom(player).get(); + Set<String> presentPlayerIds = playerCurrentRoom.getPresentPlayerIds(); + for (String presentPlayerId: presentPlayerIds) { + Player presentPlayer = getGameManager().getPlayerManager().getPlayer(presentPlayerId); + if (presentPlayer.getPlayerName().equals(target)) { + commandWrite(getGameManager().getPlayerManager().getLookString(player)); + } + } + } +} diff --git a/src/main/java/com/comandante/creeper/command/commands/UnknownCommand.java b/src/main/java/com/comandante/creeper/command/commands/UnknownCommand.java index b92ad687b86777f705850491f1538e73e078c5de..bf75b972607110f1613868a289ef693d6568d2b6 100644 --- a/src/main/java/com/comandante/creeper/command/commands/UnknownCommand.java +++ b/src/main/java/com/comandante/creeper/command/commands/UnknownCommand.java @@ -16,6 +16,6 @@ public class UnknownCommand extends Command { @Override public void run() { - getGameManager().currentRoomLogic(getPlayerId()); + getGameManager().getChannelUtils().writeOnlyPrompt(getPlayerId()); } } diff --git a/src/main/java/com/comandante/creeper/managers/GameManager.java b/src/main/java/com/comandante/creeper/managers/GameManager.java index 90e38c77530c5ba49e3aa6451b50e1257e39e8b2..7fdc731ac3a1d19b15d912af19f31efbf5a0298a 100644 --- a/src/main/java/com/comandante/creeper/managers/GameManager.java +++ b/src/main/java/com/comandante/creeper/managers/GameManager.java @@ -3,6 +3,7 @@ package com.comandante.creeper.managers; import com.comandante.creeper.Items.Item; import com.comandante.creeper.Items.ItemDecayManager; +import com.comandante.creeper.model.FightManager; import com.comandante.creeper.model.Movement; import com.comandante.creeper.model.Player; import com.comandante.creeper.model.Room; @@ -19,7 +20,9 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; -import static com.comandante.creeper.model.Color.*; +import static com.comandante.creeper.model.Color.BRIGHT_GREEN; +import static com.comandante.creeper.model.Color.GREEN; +import static com.comandante.creeper.model.Color.RESET; public class GameManager { @@ -61,6 +64,7 @@ public class GameManager { private final NewUserRegistrationManager newUserRegistrationManager; private final EntityManager entityManager; private final ItemDecayManager itemDecayManager; + private final FightManager fightManager; public GameManager(RoomManager roomManager, PlayerManager playerManager, EntityManager entityManager) { this.roomManager = roomManager; @@ -70,7 +74,11 @@ public class GameManager { this.entityManager.addEntity(itemDecayManager); this.newUserRegistrationManager = new NewUserRegistrationManager(playerManager); this.channelUtils = new ChannelUtils(getPlayerManager(), getRoomManager()); + this.fightManager = new FightManager(channelUtils, entityManager, roomManager, playerManager); + } + public FightManager getFightManager() { + return fightManager; } public NewUserRegistrationManager getNewUserRegistrationManager() { diff --git a/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java b/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java index a21ff3918e79151becb87de22f8d659f091098e8..7e188150ee47f8c8002daac12ae878e699da1e05 100644 --- a/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java +++ b/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java @@ -3,7 +3,7 @@ package com.comandante.creeper.managers; import com.comandante.creeper.model.Player; import com.comandante.creeper.model.PlayerMetadata; -import com.comandante.creeper.model.StatsBuilder; +import com.comandante.creeper.model.PlayerStats; import com.comandante.creeper.server.CreeperSession; import com.google.common.base.Optional; import org.jboss.netty.channel.MessageEvent; @@ -58,7 +58,7 @@ public class NewUserRegistrationManager { return; } session.setPassword(Optional.of(password)); - PlayerMetadata playerMetadata = new PlayerMetadata(session.getUsername().get(), session.getPassword().get(), new Player(session.getUsername().get()).getPlayerId(), new StatsBuilder().setStrength(7).setWillpower(8).setAim(6).setAgile(5).setArmorRating(4).setMeleSkill(10).setHealth(100).setWeaponRatingMin(10).setWeaponRatingMax(20).setNumberweaponOfRolls(1).createStats()); + PlayerMetadata playerMetadata = new PlayerMetadata(session.getUsername().get(), session.getPassword().get(), new Player(session.getUsername().get()).getPlayerId(), PlayerStats.DEFAULT_PLAYER.createStats()); playerManager.savePlayerMetadata(playerMetadata); e.getChannel().write("User created.\r\n"); session.setState(CreeperSession.State.newUserRegCompleted); diff --git a/src/main/java/com/comandante/creeper/managers/PlayerManager.java b/src/main/java/com/comandante/creeper/managers/PlayerManager.java index 6a7e32c35000bc3fa21b4c1c3b101dc7cd83e970..6d8e92bb11a583c00ae3ada4a4ebfdef3a5e5e3d 100644 --- a/src/main/java/com/comandante/creeper/managers/PlayerManager.java +++ b/src/main/java/com/comandante/creeper/managers/PlayerManager.java @@ -1,10 +1,11 @@ package com.comandante.creeper.managers; -import com.comandante.creeper.model.PlayerMetadataSerializer; import com.comandante.creeper.model.Player; import com.comandante.creeper.model.PlayerMetadata; +import com.comandante.creeper.model.PlayerMetadataSerializer; import com.comandante.creeper.model.Room; +import com.comandante.creeper.model.Stats; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import org.apache.commons.codec.binary.Base64; @@ -111,4 +112,10 @@ public class PlayerManager { return players.containsKey(new String(Base64.encodeBase64(username.getBytes()))); } + public String getLookString(Player player) { + PlayerMetadata playerMetadata = getPlayerMetadata(player.getPlayerId()); + Stats playerStats = playerMetadata.getStats(); + return playerStats.toString(); + } + } diff --git a/src/main/java/com/comandante/creeper/model/FightManager.java b/src/main/java/com/comandante/creeper/model/FightManager.java new file mode 100644 index 0000000000000000000000000000000000000000..7fe1f3cd1626d7a4db5fff2ec81dc947e61fd407 --- /dev/null +++ b/src/main/java/com/comandante/creeper/model/FightManager.java @@ -0,0 +1,108 @@ +package com.comandante.creeper.model; + +import com.comandante.creeper.managers.EntityManager; +import com.comandante.creeper.managers.PlayerManager; +import com.comandante.creeper.managers.RoomManager; +import com.comandante.creeper.npc.Npc; +import com.comandante.creeper.server.ChannelUtils; + +import java.util.Random; + +public class FightManager { + + private final PlayerManager playerManager; + private final RoomManager roomManager; + private final EntityManager entityManager; + private final ChannelUtils channelUtils; + private static final Random random = new Random(); + + public FightManager(ChannelUtils channelUtils, EntityManager entityManager, RoomManager roomManager, PlayerManager playerManager) { + this.channelUtils = channelUtils; + this.entityManager = entityManager; + this.roomManager = roomManager; + this.playerManager = playerManager; + } + + public void fight(Player player, Npc npc) { + PlayerMetadata playerMetadata = playerManager.getPlayerMetadata(player.getPlayerId()); + Stats npcStats = npc.getStats(); + Stats playerStats = playerMetadata.getStats(); + + while (npcStats.getHealth() > 0) { + if (playerStats.getHealth() <= 0) { + break; + } + fightTurn(playerStats, npcStats, 3, player, npc); + } + + playerManager.savePlayerMetadata(playerMetadata); + + if (playerStats.getHealth() <= 0) { + channelUtils.write(player.getPlayerId(), "You died."); + return; + } + + if (npcStats.getHealth() <= 0) { + channelUtils.write(player.getPlayerId(), "You killed " + npc.getName()); + return; + } + } + + public void fightTurn(Stats challenger, Stats victim, int numRoundsPerTurns, Player player, Npc npc) { + for (int i = 0; i < numRoundsPerTurns; i++) { + if (challenger.getHealth() <= 0 || victim.getHealth() <= 0) { + return; + } + fightRound(challenger, victim, player, npc); + } + } + + public void fightRound(Stats challenger, Stats victim, Player player, Npc npc) { + int chanceToHit = getChanceToHit(challenger, victim); + int damageToVictim = 0; + if (randInt(0, 100) < chanceToHit) { + damageToVictim = getAttack(challenger, victim); + } + if (damageToVictim > 0) { + doDamage(victim, damageToVictim); + channelUtils.writeNoPrompt(player.getPlayerId(), damageToVictim + " damage done to " + npc.getName()); + } else { + channelUtils.writeNoPrompt(player.getPlayerId(), "You miss " + npc.getName()); + } + if (victim.getHealth() <= 0) { + return; + } + int chanceToHitBack = getChanceToHit(victim, challenger); + int damageBack = getAttack(victim, challenger); + if (randInt(0, 100) < chanceToHitBack) { + doDamage(challenger, damageBack); + channelUtils.writeNoPrompt(player.getPlayerId(), npc.getName() + " damages you for " + damageBack); + } else { + channelUtils.writeNoPrompt(player.getPlayerId(), npc.getName() + " misses you"); + } + } + + private static void doDamage(Stats stats, int damageAmount) { + stats.setHealth(stats.getHealth() - damageAmount); + } + + private static int getChanceToHit(Stats challenger, Stats victim) { + return (challenger.getStrength() + challenger.getMeleSkill()) * 5 - victim.getAgile() * 5; + } + + private static int getAttack(Stats challenger, Stats victim) { + int rolls = 0; + int totDamage = 0; + while (rolls <= challenger.getNumberweaponOfRolls()) { + rolls++; + totDamage = totDamage + randInt(challenger.getWeaponRatingMin(), challenger.getWeaponRatingMax()); + } + return challenger.getStrength() + totDamage - victim.getArmorRating(); + } + + private static int randInt(int min, int max) { + return random.nextInt((max - min) + 1) + min; + } + +} + diff --git a/src/main/java/com/comandante/creeper/model/FightResults.java b/src/main/java/com/comandante/creeper/model/FightResults.java new file mode 100644 index 0000000000000000000000000000000000000000..67c32351a39d9f019220fbc9fe623c00bf0290b6 --- /dev/null +++ b/src/main/java/com/comandante/creeper/model/FightResults.java @@ -0,0 +1,11 @@ +package com.comandante.creeper.model; + +public class FightResults { + private final Stats challenger; + private final Stats victim; + + public FightResults(Stats challenger, Stats victim) { + this.challenger = challenger; + this.victim = victim; + } +} diff --git a/src/main/java/com/comandante/creeper/model/NpcStats.java b/src/main/java/com/comandante/creeper/model/NpcStats.java index 8bf763beab28d569c34771363cfaac5731a23ac6..3e5925755f1e6cd896dd693e97ae0b9927511e21 100644 --- a/src/main/java/com/comandante/creeper/model/NpcStats.java +++ b/src/main/java/com/comandante/creeper/model/NpcStats.java @@ -1,7 +1,7 @@ package com.comandante.creeper.model; public class NpcStats { - public final static Stats JOE_NPC = new StatsBuilder() + public final static StatsBuilder JOE_NPC = new StatsBuilder() .setStrength(5) .setWillpower(1) .setAim(1) @@ -11,17 +11,5 @@ public class NpcStats { .setHealth(100) .setWeaponRatingMin(5) .setWeaponRatingMax(10) - .setNumberweaponOfRolls(1).createStats(); - - public final static Stats ANOTHER_DOUCHER = new StatsBuilder() - .setStrength(5) - .setWillpower(1) - .setAim(1) - .setAgile(1) - .setArmorRating(5) - .setMeleSkill(5) - .setHealth(100) - .setWeaponRatingMin(5) - .setWeaponRatingMax(10) - .setNumberweaponOfRolls(1).createStats(); + .setNumberweaponOfRolls(1); } diff --git a/src/main/java/com/comandante/creeper/model/PlayerMetadata.java b/src/main/java/com/comandante/creeper/model/PlayerMetadata.java index 63065166c55f2478b6309506cbad4ba4f2bc6c74..95aedbc6d175f3b0bcadb3934da0f8c50a681e23 100644 --- a/src/main/java/com/comandante/creeper/model/PlayerMetadata.java +++ b/src/main/java/com/comandante/creeper/model/PlayerMetadata.java @@ -8,26 +8,12 @@ import java.util.List; public class PlayerMetadata implements Serializable { - String playerName; - String password; - String playerId; + private String playerName; + private String password; + private String playerId; Stats stats; String[] inventory; - /*STRENGTH - -WILLPOWER - HEALTH REGENATION HOW EFFECTIVE HEALING DEVICES ARE - - INCREASES CHANCE OF CRITICAL -ENDURANCE - INCREASE TOTAL HEALTH - -RATE AT WHICH NATURAL TICK HEALTH REGENATION WORKS - - RATE OF MOVEMENT -AIM - CHANCE TO HIT - AND DAMAGE PER HIT INCREASE -AGILE - CRITICAL CHANCE INCREASE - - FLEE INCREASE - - DODGE/PARRY INCREASE - -*/ - public PlayerMetadata(String playerName, String password, String playerId, Stats stats) { this.playerName = playerName; this.password = password; @@ -87,4 +73,8 @@ AGILE - CRITICAL CHANCE INCREASE public void setPlayerId(String playerId) { this.playerId = playerId; } + + public Stats getStats() { + return stats; + } } diff --git a/src/main/java/com/comandante/creeper/model/PlayerStats.java b/src/main/java/com/comandante/creeper/model/PlayerStats.java new file mode 100644 index 0000000000000000000000000000000000000000..627298acf0484024a2f238ebccb1b3df9016434a --- /dev/null +++ b/src/main/java/com/comandante/creeper/model/PlayerStats.java @@ -0,0 +1,17 @@ +package com.comandante.creeper.model; + + +public class PlayerStats { + + public final static StatsBuilder DEFAULT_PLAYER = new StatsBuilder() + .setStrength(10) + .setWillpower(1) + .setAim(1) + .setAgile(1) + .setArmorRating(2) + .setMeleSkill(10) + .setHealth(100) + .setWeaponRatingMin(10) + .setWeaponRatingMax(20) + .setNumberweaponOfRolls(1); +} diff --git a/src/main/java/com/comandante/creeper/model/Stats.java b/src/main/java/com/comandante/creeper/model/Stats.java index 5f75aae1d5e76c5ac1598a67fd8b15f401a9b9d9..48843191f78f256786ebeccfe1c909f4e2d0c37b 100644 --- a/src/main/java/com/comandante/creeper/model/Stats.java +++ b/src/main/java/com/comandante/creeper/model/Stats.java @@ -1,29 +1,29 @@ package com.comandante.creeper.model; import java.io.Serializable; -import java.util.Random; public class Stats implements Serializable { - int strength; - int willpower; - int aim; - int agile; - int armorRating; - int meleSkill; - int health; - int weaponRatingMax; - int weaponRatingMin; - int numberweaponOfRolls; - - public static int NO_TURNS = 0; - public static int NO_HITS_CHALLENGER = 0; - public static int NO_HITS_VICTIM = 0; - public static int NO_MISSES_CHALLENGER = 0; - public static int NO_MISSES_VICTIM = 0; - public static int TOTAL_DAMAGE_CHALLENGER = 0; - public static int TOTAL_DAMAGE_VICTIM = 0; - - public Stats(int strength, int willpower, int aim, int agile, int armorRating, int meleSkill, int health, int weaponRatingMin, int weaponRatingMax, int numberweaponOfRolls) { + private int strength; + private int willpower; + private int aim; + private int agile; + private int armorRating; + private int meleSkill; + private int health; + private int weaponRatingMax; + private int weaponRatingMin; + private int numberweaponOfRolls; + + public Stats(int strength, + int willpower, + int aim, + int agile, + int armorRating, + int meleSkill, + int health, + int weaponRatingMax, + int weaponRatingMin, + int numberweaponOfRolls) { this.strength = strength; this.willpower = willpower; this.aim = aim; @@ -36,9 +36,6 @@ public class Stats implements Serializable { this.numberweaponOfRolls = numberweaponOfRolls; } - public Stats() { - } - public int getStrength() { return strength; } @@ -119,119 +116,19 @@ public class Stats implements Serializable { this.numberweaponOfRolls = numberweaponOfRolls; } - public static void main(String[] args) throws InterruptedException { - int totalChallengerWin = 0; - int totalVictimWin = 0; - int NUM_EXECUTION = 30000; - for (int i = 0; i < NUM_EXECUTION; i++) { - boolean results = fight( - new StatsBuilder() - .setStrength(10) - .setWillpower(1) - .setAim(1) - .setAgile(1) - .setArmorRating(2) - .setMeleSkill(10) - .setHealth(100) - .setWeaponRatingMin(10) - .setWeaponRatingMax(20) - .setNumberweaponOfRolls(1).createStats(), - new StatsBuilder() - .setStrength(5) - .setWillpower(1) - .setAim(1) - .setAgile(1) - .setArmorRating(5) - .setMeleSkill(5) - .setHealth(100) - .setWeaponRatingMin(5) - .setWeaponRatingMax(10) - .setNumberweaponOfRolls(1).createStats()); - //strength, willpower, aim, agile, armorRating, meleSkill, health, weaponRatingMin, weaponRatingMax, numberweaponOfRolls - if (results) { - totalChallengerWin++; - } else { - totalVictimWin++; - } - } - System.out.println("Challenger: " + totalChallengerWin + " wins."); - System.out.println("Victim: " + totalVictimWin + " wins."); - System.out.println("AVERAGE TURNS: " + NO_TURNS / NUM_EXECUTION); - System.out.println("AVERAGE HITS CHALLENGER: " + NO_HITS_CHALLENGER / NUM_EXECUTION); - System.out.println("AVERAGE MISSES CHALLENGER: " + NO_MISSES_CHALLENGER / NUM_EXECUTION); - System.out.println("AVERAGE DAMAGE CHALLENGER: " + TOTAL_DAMAGE_CHALLENGER / NUM_EXECUTION); - System.out.println("AVERAGE HITS VICTIM: " + NO_HITS_VICTIM / NUM_EXECUTION); - System.out.println("AVERAGE MISSES VICTIM: " + NO_MISSES_VICTIM / NUM_EXECUTION); - System.out.println("AVERAGE DAMAGE VICTIM: " + TOTAL_DAMAGE_VICTIM / NUM_EXECUTION); - - } - - public static boolean fight(Stats challenger, Stats victim) { - int damageToVictim = 0; - int chanceToHitVictim = 0; - - - int damageToChallenger = 0; - int chanceToHitChallenger = 0; - - - int turns = 0; - while (true) { - if (challenger.getHealth() <= 0 || victim.getHealth() <= 0) { - break; - } - NO_TURNS++; - damageToVictim = getAttack(challenger, victim); - chanceToHitVictim = (challenger.getStrength() + challenger.getMeleSkill()) * 5 - victim.getAgile() * 5; - if (randInt(0, 100) < chanceToHitVictim) { - victim.setHealth(victim.getHealth() - damageToVictim); - TOTAL_DAMAGE_CHALLENGER = TOTAL_DAMAGE_CHALLENGER + damageToVictim; - NO_HITS_CHALLENGER++; - } else { - NO_MISSES_CHALLENGER++; - } - damageToChallenger = getAttack(victim, challenger); - chanceToHitChallenger = (victim.getStrength() + victim.getMeleSkill()) * 5 - (challenger.getAgile() * 5); - - if (randInt(0, 100) < chanceToHitChallenger) { - challenger.setHealth(challenger.getHealth() - damageToChallenger); - TOTAL_DAMAGE_VICTIM = TOTAL_DAMAGE_VICTIM + damageToVictim; - NO_HITS_VICTIM++; - } else { - NO_MISSES_VICTIM++; - } - } - - if (challenger.getHealth() > victim.getHealth()) { - return true; - } else { - return false; - - } - } - - private static int getAttack(Stats challenger, Stats victim) { - int rolls = 0; - int totDamage = 0; - while (rolls <= challenger.getNumberweaponOfRolls()) { - rolls++; - totDamage = totDamage + randInt(challenger.getWeaponRatingMin(), challenger.getWeaponRatingMax()); - } - return challenger.getStrength() + totDamage - victim.getArmorRating(); - } - - public static int randInt(int min, int max) { - - // NOTE: Usually this should be a field rather than a method - // variable so that it is not re-seeded every call. - Random rand = new Random(); - - // nextInt is normally exclusive of the top value, - // so add 1 to make it inclusive - int randomNum = rand.nextInt((max - min) + 1) + min; - - return randomNum; + @Override + public String toString() { + return "Stats{" + + "strength=" + strength + + ", willpower=" + willpower + + ", aim=" + aim + + ", agile=" + agile + + ", armorRating=" + armorRating + + ", meleSkill=" + meleSkill + + ", health=" + health + + ", weaponRatingMax=" + weaponRatingMax + + ", weaponRatingMin=" + weaponRatingMin + + ", numberweaponOfRolls=" + numberweaponOfRolls + + '}'; } - - } diff --git a/src/main/java/com/comandante/creeper/model/StatsBuilder.java b/src/main/java/com/comandante/creeper/model/StatsBuilder.java index 4e5cf483ae6f3489572833ec92db037998cacf98..8794d21515996a9240376663588b0f20d62f1cd0 100644 --- a/src/main/java/com/comandante/creeper/model/StatsBuilder.java +++ b/src/main/java/com/comandante/creeper/model/StatsBuilder.java @@ -8,8 +8,8 @@ public class StatsBuilder { private int armorRating; private int meleSkill; private int health; - private int weaponRatingMin; private int weaponRatingMax; + private int weaponRatingMin; private int numberweaponOfRolls; public StatsBuilder setStrength(int strength) { @@ -47,13 +47,13 @@ public class StatsBuilder { return this; } - public StatsBuilder setWeaponRatingMin(int weaponRatingMin) { - this.weaponRatingMin = weaponRatingMin; + public StatsBuilder setWeaponRatingMax(int weaponRatingMax) { + this.weaponRatingMax = weaponRatingMax; return this; } - public StatsBuilder setWeaponRatingMax(int weaponRatingMax) { - this.weaponRatingMax = weaponRatingMax; + public StatsBuilder setWeaponRatingMin(int weaponRatingMin) { + this.weaponRatingMin = weaponRatingMin; return this; } @@ -63,6 +63,6 @@ public class StatsBuilder { } public Stats createStats() { - return new Stats(strength, willpower, aim, agile, armorRating, meleSkill, health, weaponRatingMin, weaponRatingMax, numberweaponOfRolls); + return new Stats(strength, willpower, aim, agile, armorRating, meleSkill, health, weaponRatingMax, weaponRatingMin, numberweaponOfRolls); } } \ No newline at end of file diff --git a/src/main/java/com/comandante/creeper/model/StatsTester.java b/src/main/java/com/comandante/creeper/model/StatsTester.java new file mode 100644 index 0000000000000000000000000000000000000000..7713d30fe338b8759993303a46f08bc81270c905 --- /dev/null +++ b/src/main/java/com/comandante/creeper/model/StatsTester.java @@ -0,0 +1,109 @@ +package com.comandante.creeper.model; + +import java.util.Random; + +public class StatsTester { + + public static int NO_TURNS = 0; + public static int NO_HITS_CHALLENGER = 0; + public static int NO_HITS_VICTIM = 0; + public static int NO_MISSES_CHALLENGER = 0; + public static int NO_MISSES_VICTIM = 0; + public static int TOTAL_DAMAGE_CHALLENGER = 0; + public static int TOTAL_DAMAGE_VICTIM = 0; + + + public static void main(String[] args) throws InterruptedException { + int totalChallengerWin = 0; + int totalVictimWin = 0; + int NUM_EXECUTION = 60000; + for (int i = 0; i < NUM_EXECUTION; i++) { + boolean results = fight( + PlayerStats.DEFAULT_PLAYER.createStats(), + NpcStats.JOE_NPC.createStats()); + //strength, willpower, aim, agile, armorRating, meleSkill, health, weaponRatingMin, weaponRatingMax, numberweaponOfRolls + if (results) { + totalChallengerWin++; + } else { + totalVictimWin++; + } + } + System.out.println("Challenger: " + totalChallengerWin + " wins."); + System.out.println("Victim: " + totalVictimWin + " wins."); + System.out.println("AVERAGE TURNS: " + NO_TURNS / NUM_EXECUTION); + System.out.println("AVERAGE HITS CHALLENGER: " + NO_HITS_CHALLENGER / NUM_EXECUTION); + System.out.println("AVERAGE MISSES CHALLENGER: " + NO_MISSES_CHALLENGER / NUM_EXECUTION); + System.out.println("AVERAGE DAMAGE CHALLENGER: " + TOTAL_DAMAGE_CHALLENGER / NUM_EXECUTION); + System.out.println("AVERAGE HITS VICTIM: " + NO_HITS_VICTIM / NUM_EXECUTION); + System.out.println("AVERAGE MISSES VICTIM: " + NO_MISSES_VICTIM / NUM_EXECUTION); + System.out.println("AVERAGE DAMAGE VICTIM: " + TOTAL_DAMAGE_VICTIM / NUM_EXECUTION); + + } + + public static boolean fight(Stats challenger, Stats victim) { + int damageToVictim = 0; + int chanceToHitVictim = 0; + + + int damageToChallenger = 0; + int chanceToHitChallenger = 0; + + + int turns = 0; + while (true) { + if (challenger.getHealth() <= 0 || victim.getHealth() <= 0) { + break; + } + NO_TURNS++; + damageToVictim = getAttack(challenger, victim); + chanceToHitVictim = (challenger.getStrength() + challenger.getMeleSkill()) * 5 - victim.getAgile() * 5; + if (randInt(0, 100) < chanceToHitVictim) { + victim.setHealth(victim.getHealth() - damageToVictim); + TOTAL_DAMAGE_CHALLENGER = TOTAL_DAMAGE_CHALLENGER + damageToVictim; + NO_HITS_CHALLENGER++; + } else { + NO_MISSES_CHALLENGER++; + } + damageToChallenger = getAttack(victim, challenger); + chanceToHitChallenger = (victim.getStrength() + victim.getMeleSkill()) * 5 - (challenger.getAgile() * 5); + + if (randInt(0, 100) < chanceToHitChallenger) { + challenger.setHealth(challenger.getHealth() - damageToChallenger); + TOTAL_DAMAGE_VICTIM = TOTAL_DAMAGE_VICTIM + damageToVictim; + NO_HITS_VICTIM++; + } else { + NO_MISSES_VICTIM++; + } + } + + if (challenger.getHealth() > victim.getHealth()) { + return true; + } else { + return false; + + } + } + + private static int getAttack(Stats challenger, Stats victim) { + int rolls = 0; + int totDamage = 0; + while (rolls <= challenger.getNumberweaponOfRolls()) { + rolls++; + totDamage = totDamage + randInt(challenger.getWeaponRatingMin(), challenger.getWeaponRatingMax()); + } + return challenger.getStrength() + totDamage - victim.getArmorRating(); + } + + public static int randInt(int min, int max) { + + // NOTE: Usually this should be a field rather than a method + // variable so that it is not re-seeded every call. + Random rand = new Random(); + + // nextInt is normally exclusive of the top value, + // so add 1 to make it inclusive + int randomNum = rand.nextInt((max - min) + 1) + min; + + return randomNum; + } +} diff --git a/src/main/java/com/comandante/creeper/npc/Derper.java b/src/main/java/com/comandante/creeper/npc/Derper.java index d698d10b72311d5abe91056eab51d22b86306a2d..29c67c93a4deab8fca0a8b9588c7096a3b09feb3 100644 --- a/src/main/java/com/comandante/creeper/npc/Derper.java +++ b/src/main/java/com/comandante/creeper/npc/Derper.java @@ -2,7 +2,7 @@ package com.comandante.creeper.npc; import com.comandante.creeper.managers.GameManager; -import com.comandante.creeper.model.StatsBuilder; +import com.comandante.creeper.model.NpcStats; import java.util.Arrays; import java.util.List; @@ -22,7 +22,7 @@ public class Derper extends Npc { .append(RESET).toString(); public Derper(GameManager gameManager, Integer roomId) { - super(gameManager, roomId, NAME, colorName, 0, new StatsBuilder().setStrength(7).setWillpower(8).setAim(6).setAgile(5).setArmorRating(4).setMeleSkill(10).setHealth(100).setWeaponRatingMin(10).setWeaponRatingMax(20).setNumberweaponOfRolls(1).createStats()); + super(gameManager, roomId, NAME, colorName, 0, NpcStats.JOE_NPC.createStats()); this.random = new Random(); } diff --git a/src/main/java/com/comandante/creeper/npc/Npc.java b/src/main/java/com/comandante/creeper/npc/Npc.java index 515efc0ca4feb93083dec50efe24f313953dbd2f..696aa76dcaa2f75ad4f998264557624209762c32 100644 --- a/src/main/java/com/comandante/creeper/npc/Npc.java +++ b/src/main/java/com/comandante/creeper/npc/Npc.java @@ -40,6 +40,10 @@ public abstract class Npc extends CreeperEntity { this.stats = stats; } + public Stats getStats() { + return stats; + } + public GameManager getGameManager() { return gameManager; } diff --git a/src/main/java/com/comandante/creeper/server/ChannelUtils.java b/src/main/java/com/comandante/creeper/server/ChannelUtils.java index b1c1821f70d1c6504c5c0bd5f560a9d690d54236..ed4085e3c75597f1ec8747d1942cb3cc0f73ad4b 100644 --- a/src/main/java/com/comandante/creeper/server/ChannelUtils.java +++ b/src/main/java/com/comandante/creeper/server/ChannelUtils.java @@ -19,6 +19,12 @@ public class ChannelUtils { write(playerId, message, false); } + public void writeOnlyPrompt(String playerId) { + Player player = playerManager.getPlayer(playerId); + Room playerCurrentRoom = roomManager.getPlayerCurrentRoom(player).get(); + player.getChannel().write(playerManager.getPrompt(playerId, playerCurrentRoom.getRoomId())); + } + public void write(String playerId, String message) { write(playerId, message, true); }