Advertisement
konalisp

Bar Fight 1.5

Jun 21st, 2013
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #  Copyright 2013 SuperHitler Von McStalinPants Esquire
  2.  
  3. #  This program is free software; you can redistribute it and/or modify
  4. #  it under the terms of the GNU General Public License as published by
  5. #  the Free Software Foundation; either version 3 of the License, or
  6. #  (at your option) any later version.
  7. #  
  8. #  This program is distributed in the hope that it will be useful,
  9. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. #  GNU General Public License for more details.
  12. #  
  13. #  You should have received a copy of the GNU General Public License
  14. #  along with this program; if not, write to the Free Software
  15. #  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  16. #  MA 02110-1301, USA.
  17. #  Or you could, you know, read it online.
  18.  
  19. #Bar Fight v1.5
  20.  
  21. ver = 1.5
  22.  
  23. #This is awful but has potential. But I don't care because I'm done with it.
  24. #I did some weird stuff in this I'm not sure why. I don't care though.
  25.  
  26. import time
  27. import sys
  28. import os
  29. import subprocess
  30. import platform
  31. import copy
  32. from random import randint
  33.  
  34. #---VARIABLES---#
  35.  
  36. hp1 = 300
  37. hp2 = 300
  38. mp1 = 100
  39. mp2 = 100
  40. inv1 = ["dig", "sword"]
  41. inv2 = ["dig", "sword", "steak"]
  42. status1 = []
  43. status2 = []
  44. hp = [hp1, hp2]
  45. mp = [mp1, mp2]
  46. inv = [inv1, inv2]
  47. status = [status1, status2]
  48. player1 = 0
  49. player2 = 1
  50.  
  51. players = [] #Add the names of all the AI players here and pass their names to the checkuse function.
  52. ename = "Drugbot"
  53. AIEXPHP = copy.copy(hp[1])
  54. togglespeech = 1
  55.  
  56. GREETING = "Welcome to Bar Fight %s. After 9 days in development, \n\
  57. hopefully it will have been worth the wait.\n\
  58. Use the command \"help\" for a list of commands." % ver
  59. HISTORY = []
  60. HELP = [
  61. "\"use itemname\": Use an item in your inventory.",
  62. "\"status\": Display the current state of the game.",
  63. "\"inventory\": Display your inventory.",
  64. "\"history\": Display the console history.",
  65. "\"info itemname\": Display information about any item in the game.",
  66. "\"ts\": Toggle the annoying speech synthesis.",
  67. "\"quit\": Quit the game."
  68. ]
  69.  
  70. #---UTILITY FUNCTIONS---#
  71.  
  72. def clear():
  73.     subprocess.Popen("cls" if platform.system() == "Windows" else "clear", shell=True).wait()
  74.  
  75. def hist(x='nil', y=HISTORY, z="TERMINAL HISTORY:"):
  76.     if not x == 'nil':
  77.         y.append(x)
  78.     else:
  79.         print z
  80.         for a in y:
  81.             time.sleep(0.08)
  82.             print "--" + a
  83.         niceprt("Press ENTER to continue. Screen will be cleared.", 0, 0, 1, 0.03)
  84.         clear()
  85.  
  86. def speak(x):
  87.     subprocess.Popen("espeak \"%s\"" % x, stderr=subprocess.PIPE, shell=True)
  88.  
  89. def niceprt(x, inp=1, clr=1, log=0, sleeptime=0.05, opt='CONTINUE->'):
  90.     if togglespeech == 1:
  91.         speak(x)
  92.     for a in x:
  93.         sys.stdout.write( '%s' % a )
  94.         sys.stdout.flush()
  95.         time.sleep(sleeptime)
  96.     print " "
  97.     if inp == 0:
  98.         raw_input(opt)
  99.     if log == 0:
  100.         hist(x)
  101.     if clr == 0:
  102.         clear()
  103.  
  104. def findi(f, seq):
  105.     for item in seq:
  106.         if f == item:
  107.             return item
  108.  
  109. def leave():
  110.     niceprt("Do you really want to quit?", 1, 1, 1)
  111.     if raw_input("y/N? ").lower() == "y":
  112.         niceprt("It was fun having you!", 0, 1, 0, 0.04, 'Goodbye...')
  113.         quit()
  114.     else:
  115.         niceprt("The fun never ends!", 1, 1, 1)
  116.         term()
  117.  
  118. def confuzzled_prompt(x):
  119.     a = [
  120.     "I'm not sure what \'%s\' means!",
  121.     "I'm sorry, but \'%s\' confuzzles me.",
  122.     "404: \'%s\' not found.",
  123.     "There is no \'%s\' here, only Gankutsuou.",
  124.     "I'm sorry, Dave, I'm afraid I can't do \'%s\'.",
  125.     "I'm not sure why you would think there would be a \'%s\' command.",
  126.     "AH! You think you're doing some damage!? 2 plus 2 equals \'%s\'.",
  127.     "This is my original character \'%s\', do not steal.",
  128.     "What is the DEAL with \'%s\'!?",
  129.     "If it don't make \'%s\', it don't make cents.",
  130.     "That wasn't very \'%s\' of you.",
  131.     "I told you about the \'%s\' dog, I warned you.",
  132.     "I can do no \'%s\', for I do not know what it is...",
  133.     "You told me you would take me to our \'%s\' place, but you never did...",
  134.     "It is pitch black. You are likely to be eaten by a \'%s\'.",
  135.     "Does a set of all sets contain \'%s\'?",
  136.     "Omg \'%s\' is so moe!"
  137.     ]
  138.     b = [
  139.     "No input detected.",
  140.     "Input missing.",
  141.     "I cannot process your request without input.",
  142.     "I need input, first.",
  143.     "I can't do anything without input.",
  144.     "Please provide input.",
  145.     "Error: Input not detected.",
  146.     "No input discovered.",
  147.     "That is too little input for processing."
  148.     ]
  149.     if len(x) == x.count(" "):
  150.         niceprt(b[randint(0, len(b) - 1)], 1, 1, 1, 0.03)
  151.     else:
  152.         niceprt(a[randint(0, len(a) - 1)] % x, 1, 1, 0, 0.03)
  153.     term()
  154.  
  155. def term():
  156.     a = raw_input("PROMPT-> ").lower()
  157.     if a == "history":
  158.         clear()
  159.         hist()
  160.         term()
  161.     elif a == "help":
  162.         clear()
  163.         hist('nil', HELP, "HELP SCREEN/COMMANDS")
  164.         term()
  165.     elif a == "status":
  166.         clear()
  167.         niceprt("GAME STATUS:")
  168.         print("-- Drugbot has %s HP" % hp[1])
  169.         print("-- You have %s HP" % hp[0])
  170.         print("-- Drugbot has %s MP" % mp[1])
  171.         print("-- You have %s MP" % mp[0])
  172.         print("-- Your Items: %s" % inv[0])
  173.         niceprt("Press ENTER to continue.", 0, 0)
  174.         term()
  175.     elif a == "quit":
  176.         leave()
  177.     elif a == "ts":
  178.         global togglespeech
  179.         if togglespeech == 0:
  180.             togglespeech = 1
  181.         else: togglespeech = 0
  182.         niceprt("Speech synthesis toggled.", 1, 1, 0, 0.01)
  183.         term()
  184.     elif a == "inventory":
  185.         niceprt("Your current inventory: ", 1, 1, 1)
  186.         for name in inv[0]:
  187.             print("-- {!s}".format(name.title()))
  188.         term()
  189.     elif a[:3] == "say":
  190.         niceprt(a.upper()[4:])
  191.         term()
  192.     elif a[:3] == "use":
  193.         checkuse(a[4:], player1)
  194.     elif a[:4] == "info":
  195.         if a[5:] in iteminfo:
  196.             niceprt(iteminfo[a[5:]])
  197.         else: niceprt("No such item in vocabulary.")
  198.         term()
  199.     elif a == "pass":
  200.         pass
  201.     elif a == "sodoku":
  202.         hp[0] = 0
  203.     else:
  204.         confuzzled_prompt(a)
  205.  
  206. def announceuse(x, player):
  207.     niceprt("{!s} used {!s}.".format("You" if player is player1 else ename, x.title()))
  208.  
  209. def otherplayer(player):
  210.     if player is 1:
  211.         return 0
  212.     elif player is 0:
  213.         return 1
  214.  
  215. def statcheck(stat, targ, prt='nil'):
  216.     if stat < targ:
  217.         if prt is not 'nil':
  218.             niceprt(prt)
  219.         return 1
  220.     else: return 0
  221.  
  222. def miss(player, ext1, ext2):
  223.     MISS = randint(0, ext1)
  224.     if player == 0:
  225.         if MISS < ext2:
  226.             niceprt("But you missed.")
  227.             return 1
  228.     else:
  229.         if MISS < ext2:
  230.             niceprt("But he missed.")
  231.             return 1
  232.  
  233. #---ITEMS---#
  234.  
  235. #Yes, I know this looks redundant. Yes, I know exactly what kind of functions I could write
  236. #to make this less redundant. No, I don't care. This is fine IMO. And hard-coding all this
  237. #gives me a little more freedom to make each item do specific things.
  238.  
  239. def rawitem(player):
  240.     name = "rawitem"
  241.     announceuse(name, player)
  242.     hp[otherplayer(player)] -= 50
  243.     inv[player].remove(name)
  244.     niceprt("{!s} lost 50 HP.".format(ename if player is player1 else "You"))
  245.  
  246. def sword(player):
  247.     name = "sword"
  248.     rand = randint(20, 40)
  249.     announceuse(name, player)
  250.     if miss(player, 10, 4) == 1:
  251.         pass
  252.     else:
  253.         hp[otherplayer(player)] -= rand
  254.         niceprt("{!s} lost {!s} HP.".format(ename if player is player1 else "You", rand))
  255.  
  256. def katana(player):
  257.     name = "katana"
  258.     rand = randint(30, 50)
  259.     announceuse(name, player)
  260.     if miss(player, 10, 2) == 1:
  261.         pass
  262.     else:
  263.         hp[otherplayer(player)] -= rand
  264.         niceprt("{!s} lost {!s} HP.".format(ename if player is player1 else "You", rand))
  265.  
  266. def magicdart(player):
  267.     if player == 1 and statcheck(mp[1], 20) == 1:
  268.         drugbot()
  269.         pass
  270.     elif player == 0 and statcheck(mp[0], 20, "You don't have enough MP") == 1:
  271.         pass
  272.     else:
  273.         name = "magic dart"
  274.         rand = randint(40, 70)
  275.         announceuse(name, player)
  276.         if miss(player, 20, 10) == 1:
  277.             pass
  278.         else:
  279.             hp[otherplayer(player)] -= rand
  280.             niceprt("{!s} lost {!s} HP.".format(ename if player is player1 else "You", rand))
  281.         mp[player] -= 20
  282.         inv[player].remove(name)
  283.         niceprt("{!s} lost {!s} MP.".format("You" if player is player1 else ename, 20))
  284.  
  285. def steak(player):
  286.     name = "steak"
  287.     announceuse(name, player)
  288.     hp[player] += 20
  289.     inv[player].remove(name)
  290.     niceprt("{!s} gained 20 HP.".format("You" if player is player1 else ename))
  291.  
  292. def pocky(player):
  293.     name = "pocky"
  294.     announceuse(name, player)
  295.     hp[player] += 10
  296.     inv[player].remove(name)
  297.     niceprt("{!s} gained 10 HP.".format("You" if player is player1 else ename))
  298.  
  299. def manapot(player):
  300.     name = "mana pot"
  301.     announceuse(name, player)
  302.     mp[player] += 50
  303.     inv[player].remove(name)
  304.     niceprt("{!s} gained 50 MP.".format("You" if player is player1 else ename))
  305.  
  306. def dig(player):
  307.     name = "dig"
  308.     il = ["rawitem", "magic dart", "steak", "katana", "pocky", "mana pot"] #Add items to this list if you want the player to get them with "dig".
  309.     infitems = ["katana"] #Put items with infinite uses here, so they don't clog the inventory by staying there forever.
  310.     rand1 = randint(0, 20)
  311.     rand2 = il[randint(0, len(il) - 1)]
  312.     announceuse(name, player)
  313.     if rand1 < 5:
  314.         niceprt("{!s} didn't find anything, though.".format("You" if player is player1 else ename))
  315.     else:
  316.         niceprt("{!s} found a {!s}".format("You" if player is player1 else ename, rand2.title()))
  317.         if rand2 == findi(rand2, infitems) and findi(rand2, inv[player]):
  318.             niceprt("But it's not nessisary for {!s} to have more than one.".format("You" if player is player1 else ename))
  319.         else:
  320.             inv[player].append(rand2)
  321.  
  322. #Not items but item-specific stuff.
  323.  
  324. def checkuse(x, player):
  325.     if findi(x, inv[player]):
  326.         use(x, player)
  327.     else:
  328.         if player == player1:
  329.             niceprt("You don't have that item.")
  330.             term()
  331.         else: niceprt("ERROR: AI tried to use item it doesn't have.")
  332.  
  333. def use(x, player):
  334.     itemlist[x](player)
  335.  
  336. itemlist = { #shit, it's better than elif elif elif. This is what I call "variety".
  337. "dig":dig,
  338. "sword":sword,
  339. "rawitem":rawitem,
  340. "magic dart":magicdart,
  341. "steak":steak,
  342. "pocky":pocky,
  343. "katana":katana,
  344. "mana pot":manapot
  345. }
  346.  
  347. iteminfo = {
  348. "dig":"If you're low on items, dig around for some more. Infinite uses.",
  349. "sword":"Deal 20 to 40 HP to that land lubber. Infinite uses.",
  350. "rawitem":"Genuine item, raw. Deals 50 HP.",
  351. "magic dart":"If you're willing to give up 20 MP, deals 40 to 70 HP.",
  352. "steak":"Steak made of real artificial chicken. Heals 20 HP.",
  353. "pocky":"Raw sewage commonly consumed by beached whales. Heals 10 HP.",
  354. "katana":"Deals 30 to 50 HP. Contradicting real life, it never breaks.",
  355. "mana pot":"Gives 50 MP. That's it."
  356. }
  357.  
  358. #---DRUGBOT HIMSELF---#
  359.  
  360. def filteritems(lst, x=0):
  361.     tempinv = []
  362.     for it1 in inv[1]:
  363.         if it1 == findi(it1, lst):
  364.             tempinv.append(it1)
  365.     return tempinv
  366.  
  367. def robotattack(): #I appear today to announce my retirement.
  368.     atkitems = ["magic dart", "rawitem", "sword", "katana", "mana pot"]
  369.     tempinv = filteritems(atkitems)
  370.     randinv = tempinv[randint(0, len(tempinv) - 1)]
  371.     if tempinv == []:
  372.         checkuse("dig", player2)
  373.     elif randint(0, 20) >= 16:
  374.         checkuse("dig", player2)
  375.     else:
  376.         checkuse(randinv, player2)
  377.  
  378. def drugbot():
  379.     weed = ["steak", "pocky"]
  380.     tempinv = filteritems(weed)
  381.     if tempinv == []:
  382.         if randint(0, 50) <= 20:
  383.             checkuse("dig", player2)
  384.         else:
  385.             robotattack()
  386.     else:
  387.         randinv = tempinv[randint(0, len(tempinv) - 1)]
  388.         if hp[1] <= AIEXPHP/2:
  389.             if randint(0, 30) <= 10:
  390.                 robotattack()
  391.             else:
  392.                 checkuse(randinv, player2)
  393.         elif hp[1] <= AIEXPHP/3:
  394.             checkuse(randinv, player2)
  395.         else:
  396.             robotattack()
  397.     mainloop()
  398.  
  399. #---GAME LOGIC---#
  400.  
  401. def this_will_be_the_sixth_time_we_have_destroyed_it_and_we_have_become_exceedingly_efficient_at_it():
  402.     global HISTORY
  403.     hp[0] = 500
  404.     hp[1] = 500
  405.     mp[0] = 100
  406.     mp[1] = 100
  407.     inv[0] = ["dig", "sword"]
  408.     inv[1] = ["dig", "sword", "steak"]
  409.     status[0] = []
  410.     status[1] = []
  411.     HISTORY=[]
  412.     clear()
  413.     niceprt("New game initiated.")
  414.     mainloop()
  415.  
  416. def playagain():
  417.     niceprt("Would you like to play again?", 1, 1, 1)
  418.     a = raw_input("y/n? ->").lower()
  419.     if a == "y":
  420.         this_will_be_the_sixth_time_we_have_destroyed_it_and_we_have_become_exceedingly_efficient_at_it()
  421.     elif a == "n":
  422.         niceprt("That was a great game. Goodbye.", 0)
  423.         quit()
  424.     else:
  425.         niceprt("I'm sorry, I didn't quite get that.", 1, 1, 1)
  426.         playagain()
  427.  
  428. def deathcheck():
  429.     if hp[0] <= 0:
  430.         niceprt("You have lost.")
  431.         playagain()
  432.     elif hp[1] <= 0:
  433.         niceprt("You have won!")
  434.         playagain()
  435.  
  436. def mainloop():
  437.     deathcheck()
  438.     term()
  439.     deathcheck()
  440.     drugbot()
  441.  
  442. niceprt(GREETING)
  443. mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement