diff --git a/src/commands/CommandEightBall.java b/src/commands/CommandEightBall.java new file mode 100644 index 0000000..642e943 --- /dev/null +++ b/src/commands/CommandEightBall.java @@ -0,0 +1,25 @@ +package commands; + +import core.Command; +import dataStructures.*; + +public class CommandEightBall extends Command +{ + String [] answers = {"It is certain.", "It is decidedly so.", "Without a doubt.", "Yes - definitely.", "You may rely on it.", "As I see it, yes.", "Most likely.", + "Outlook good.", "Yes.", "Signs point to yes.", "Reply hazy, try again.", "Ask again later.", "Better not tell you now.", "Cannot predict now.", + "Concentrate and ask again.", "Don't count on it.", "My reply is no.", "My sources say no.", "Outlook not so good.", "Very doubtful."}; + public CommandEightBall(KittyRole level, KittyRating rating) + { + super(level, rating); + } + + @Override + public String HelpText() { return "Answers a yes or no question! Warning: Kitty can not actually tell the future," + + " she claims no responsibility for any lion mauling, lack of lottery wins, or felony charges."; } + + @Override + public void OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) + { + res.Call(answers[(int) (Math.random()*answers.length)]); + } +} diff --git a/src/commands/CommandRoll.java b/src/commands/CommandRoll.java index 488d570..d2f11b2 100644 --- a/src/commands/CommandRoll.java +++ b/src/commands/CommandRoll.java @@ -1,5 +1,7 @@ package commands; +import java.util.Stack; + import core.*; import dataStructures.KittyChannel; import dataStructures.KittyGuild; @@ -19,71 +21,157 @@ public class CommandRoll extends Command @Override public void OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) { - int dice; - int sides; - String dicenum [] = input.args.split("d"); - try { - dice = Integer.parseInt(dicenum[0]); - sides = Integer.parseInt(dicenum[1]); + res.Call(rollDice(input.args)); } - catch (NumberFormatException e) + catch(Exception e) { - res.Call("Rude."); - return; + res.Call("Didn't work ;3;"); } - - res.Call(rollDice(dice,sides)); } - private String rollDice(int dice, int sides) + private String rollDice(String thing) + { + Stack values = new Stack(); + Stack operators = new Stack(); + for(int i = 0; i < thing.length(); i ++) + { + char current = thing.charAt(i); + + switch(current) + { + case '+': + case '-': + case '*': + case '/': + if(operators.isEmpty() || !hasPrecendence(operators.peek(), current) || operators.peek() == '(') + operators.add(current); + else + { + calculate(values, operators); + operators.add(current); + } + + continue; + + case '(': + operators.add(current); + continue; + + case ')': + if(operators.peek() == '(') + operators.pop(); + else + { + i --; + calculate(values, operators); + } + continue; + + case 'd': + if(operators.isEmpty() || operators.peek() == '(' || !hasPrecendence(operators.peek(), current)) + operators.add(current); + else + calculate(values, operators); + continue; + + case ' ': + continue; + + default: + try + { + // Accumulate valid characters + String accumulated = ""; + for(int j = i; j < thing.length(); ++j) + { + char parse = thing.charAt(j); + if(Character.isDigit(parse)) + { + accumulated += parse; // Keep tabs on our character + ++i; // Offset overall loop + continue; + } + + // Default leave + break; + } + + if(accumulated.length() <= 0) + throw new Exception("Error! Invalid character!"); + + values.add(Integer.parseInt(accumulated)); + i--; + } + catch (Exception e) + { + System.out.print("Something went wrong"); + i = thing.length(); + } + } + } + + while(operators.size() > 0) + { + calculate(values, operators); + } + + return "" + values.pop(); + } + + private void calculate(Stack nums, Stack operators) + { + int second = nums.pop(); + int first = nums.pop(); + int value = 0; + + switch(operators.pop()) + { + case '+': + value = first + second; + break; + case '-': + value = first - second; + break; + case '*': + value = first * second; + break; + case '/': + value = first / second; + break; + case 'd': + value = roll(first, second); + } + + nums.add(value); + } + + private int roll(int first, int second) { int total = 0; int roll = 0; - String nums = ""; - - //checks for lower than 1 dice or dice size - if(dice > 100 || sides > 100) - { - return ("*drowns in dice*"); - } - - if(dice < 1 || sides < 1) - { - return("I can't do that!"); - } + int dice = first; + int sides = second; + if(dice < 1) + return 0; for(int i = 0; dice > i; i ++) { roll = (int)(Math.random() * sides) + 1; - nums += roll + " "; total += roll; } - - //makes output look nicer - String prettyNums = ""; - String[] splitNums = nums.split(" "); - if(splitNums.length > 10) - { - final int len = 5; - for(int i = 0; i < splitNums.length; i += len) - { - prettyNums += "\n"; - for(int j = 0; j < len; ++j) - { - if(j != 0) - prettyNums += " "; - - prettyNums += splitNums[i + j]; - } - } - } - else - { - prettyNums = nums; - } - - return ("Rolls are\n" + prettyNums + "\n" + "Total is: " + total); + return total; + } + + private boolean hasPrecendence(char op1, char op2) + { + if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-')) + return false; + else + if ((op2 == 'd') && (op1 == '+' || op1 == '-' || op1 == '*' || op1 == '/')) + return false; + else + return true; } } diff --git a/src/core/ObjectBuilderFactory.java b/src/core/ObjectBuilderFactory.java index c4455c0..e63323f 100644 --- a/src/core/ObjectBuilderFactory.java +++ b/src/core/ObjectBuilderFactory.java @@ -325,6 +325,7 @@ public class ObjectBuilderFactory manager.Register("rpend", new CommandRPEnd(KittyRole.General, KittyRating.Safe)); manager.Register(new String[] {"tony", "stark", "dontfeelgood", "dontfeelsogood"}, new CommandStark(KittyRole.General, KittyRating.Safe)); manager.Register("blur", new CommandBlurry(KittyRole.General, KittyRating.Safe)); + manager.Register(new String [] {"eightball", "8ball"}, new CommandEightBall(KittyRole.General, KittyRating.Safe)); return manager; }