Ok this is the actual inital code... need to convert from mongo to sqlite...
This commit is contained in:
parent
8c856ce465
commit
8fa1664bcb
13 changed files with 1168 additions and 0 deletions
167
rpg_bets.rb
Normal file
167
rpg_bets.rb
Normal file
|
|
@ -0,0 +1,167 @@
|
|||
# I am not happy with most of this.
|
||||
|
||||
class RpgBets < MongoDocumentWrapper
|
||||
@bets = []
|
||||
|
||||
def initialize(mc)
|
||||
doc = mc.collection().find({"type" => :bets}).first
|
||||
|
||||
if doc == nil then
|
||||
@mc = mc
|
||||
self.create()
|
||||
else
|
||||
super(mc, doc)
|
||||
end
|
||||
|
||||
@bets = self.get("bets")
|
||||
end
|
||||
|
||||
# This needs so much cleanup
|
||||
# Call with 2 player names and an amount. Returns a string with the interaction output
|
||||
def place_bet(player, target, amount)
|
||||
# NO SELF BETS!
|
||||
if player == target then
|
||||
return "No self bets " + player + "!"
|
||||
end
|
||||
|
||||
# so this happened in the sim...
|
||||
if amount == 0 then
|
||||
return "Who bets 0?"
|
||||
end
|
||||
|
||||
possible_player = @mc.collection().find({"type" => :player, "name" => player}).first
|
||||
# This should never really happen, but just in case...
|
||||
if possible_player == nil then
|
||||
return "Who the heck are YOU " + player + "??"
|
||||
end
|
||||
|
||||
# Check to see if the target even exists...
|
||||
possible_target = @mc.collection().find({"type" => :player, "name" => target}).first
|
||||
|
||||
if possible_target == nil then
|
||||
return "Who the heck is " + target + "?"
|
||||
end
|
||||
|
||||
# if we get here we know we have both a valid player and target
|
||||
p = Player.new(@mc, possible_player)
|
||||
t = Player.new(@mc, possible_target)
|
||||
|
||||
# Make sure betting/calling player has enough xp to place the bet...
|
||||
if p.get("exp") < amount then
|
||||
return "Sorry " + p.get("name") + " but you only have " + p.get("exp").to_s + "xp to bet with!"
|
||||
end
|
||||
|
||||
bet = get_bet(p.get('name'), t.get('name'), amount)
|
||||
|
||||
response = ""
|
||||
|
||||
# Check the exp on the bet and see if the new amount is greater.
|
||||
# If greater, if it's from the same player who already owns the most
|
||||
# recent bet, do nothing. Otherwise, replace the old exp with the new one
|
||||
# and replace the last bet player with the current.
|
||||
if amount > bet['exp'] then
|
||||
if bet['last_bet'] == p.get('name') then
|
||||
response = "You already have the highest bet of " + bet['exp'].to_s + "xp!"
|
||||
else
|
||||
bet['exp'] = amount
|
||||
bet['last_bet'] = player
|
||||
response = player + " upped the ante to " + amount.to_s + "xp against " + target + "!"
|
||||
end
|
||||
# If amount is less than the current bet, don't return immediately but spit out
|
||||
# a message about how it's not enough
|
||||
elsif amount < bet['exp'] then
|
||||
response = player + " be real, yo. Current bet with " + target + " is at " + t.get('exp').to_s + "xp. "
|
||||
response = response + "Match to fight, or overbid them."
|
||||
# fight? This should prolly be refactored into some function.... it gets busy...
|
||||
else
|
||||
if bet['last_bet'] == player then
|
||||
response = "You have the highest bet already against " + target + " for "
|
||||
response = response + bet['exp'].to_s + "xp! They need to call you on it."
|
||||
else
|
||||
# this whole block needs cleaning. It's gross atm.
|
||||
p_attack = 1 + rand(amount)
|
||||
t_attack = 1 + rand(amount)
|
||||
|
||||
response = player + " and " + target + " fight over " + amount.to_s + "xp! "
|
||||
response = response + "[" + p_attack.to_s + "dmg vs " + t_attack.to_s + "dmg]! "
|
||||
|
||||
winner = loser = nil
|
||||
|
||||
if p_attack > t_attack then
|
||||
winner = p
|
||||
loser = t
|
||||
elsif t_attack > p_attack then
|
||||
winner = t
|
||||
loser = p
|
||||
# If it's a tie, persist the bet back down with no changes and return
|
||||
else
|
||||
@bets.push(bet)
|
||||
self.set({"bets" => @bets})
|
||||
response = "They tied! The crowd goes wild in anticipation! The bet remains unresolved!"
|
||||
return response
|
||||
end
|
||||
|
||||
response = response + winner.get("name") + " wins! They won " + amount.to_s + "xp "
|
||||
response = response + "from " + loser.get("name") + ", who respectfully hands it over! "
|
||||
|
||||
# update the players...
|
||||
winner.gain_exp(amount)
|
||||
loser.gain_exp(-amount)
|
||||
|
||||
if loser.get("exp") <= 0 then
|
||||
response = response + "Holy wow! " + loser.get("name") + " went negative! "
|
||||
response = response + "The Powers That Be resets them to 1xp!"
|
||||
loser.set_exp(1)
|
||||
puts response
|
||||
die
|
||||
end
|
||||
|
||||
return response
|
||||
end
|
||||
end
|
||||
|
||||
@bets.push(bet)
|
||||
self.set({"bets" => @bets})
|
||||
|
||||
return response
|
||||
end
|
||||
|
||||
def get_player_bets(player)
|
||||
found_bets = []
|
||||
|
||||
@bets.each do |b|
|
||||
if b['players'].include?(player) then
|
||||
found_bets.push(b)
|
||||
end
|
||||
end
|
||||
|
||||
return found_bets
|
||||
end
|
||||
|
||||
def get_bet(player, target, amount)
|
||||
found_bet = nil
|
||||
|
||||
@bets.each do |b|
|
||||
if b["players"].include?(player) and b["players"].include?(target) then
|
||||
found_bet = b
|
||||
end
|
||||
end
|
||||
|
||||
# This feels cludgy but deleting an element from inside an iterator (the .each above)
|
||||
# is apparently straight up disallowed in ruby. so need to nuke it here. It will either
|
||||
# resolve and disappear in the place_bet method or be updated and re-inserted there
|
||||
if found_bet != nil then
|
||||
@bets.delete_if{ |b| b["players"].include?(player) and b["players"].include?(target) }
|
||||
return found_bet
|
||||
end
|
||||
|
||||
return {"players" => [player, target], "last_bet" => player, "exp" => amount}
|
||||
end
|
||||
|
||||
def get_default_doc()
|
||||
return {
|
||||
"type" => :bets,
|
||||
"bets" => [],
|
||||
}
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue