treasurehunting2/code/old_functions.py

580 lines
19 KiB
Python
Executable File

"""
This is a file for functions, which were used in the pre-pySDL2 game version.
They are no longer in use, so ignore warnings.
currently game is imported totally, so everything in here resolves.
"""
from game import *
def levelup(player):
""" raise player level
tested, whenever experience ist earned
:param player: object
:return: object
"""
if "learning software" in player.aug:
lvlup = player.experience > player.level * 10 - 15
else:
lvlup = player.experience > player.level * 10
if lvlup:
player.level += 1
print("You gained one level! You can now raise an attribute.")
choice = 0
while choice == 0: # can this be optimized?
print("(0) Show character")
print("(1) Intelligence")
print("(2) Constitution")
print("(3) Strength")
print("(4) Agility")
print("(5) Mobility")
try:
choice = int(raw_input("What do you want to raise? "))
except NameError:
choice = 0
if choice == 0:
player.print_char()
elif choice == 1:
player.int += 1
elif choice == 2:
player.con += 1
elif choice == 3:
player.str += 1
elif choice == 4:
player.agi += 1
elif choice == 5:
player.mob += 1
else:
print("ERROR: Enter a number between 0 and 5.")
choice = 0
player.update_max_hp()
return player
def near(char):
""" tests if someone is on the 8 fields surrounding char.
:param char: Char object
:return: list of char objects
"""
return [] # for now.
def dead(player, mission):
""" test, if someone died.
is executed in start_level(). if the player died, level is ended, going
back to profile menu
:param player: Individuum object
:param mission: Mission object
:return object, object, boolean
"""
level_running = True
for i in mission.current_room.foelist:
if i.hp < 1:
player.experience += i.experience
player = levelup(player)
try:
if i.target == True:
pass # mission.target_enemy -= 1
except AttributeError:
pass
if player.hp < 1:
print("You died.")
level_running = False
return player, mission, level_running
def shoot(char, victim):
""" if the shot hits, the damage is dealt.
all parameters and returns are character objects.
char always means the acting character object, not only the player.
"""
print char.name, " shoots at ", victim.name, " with a ", char.gun.name, "."
if randint(1, 100) > 100 - (char.agi * 7 + char.int * 3):
victim.hp -= char.gun.damage
print("The shot hits and does " + str(char.gun.damage) + " damage.")
else:
print("The shot doesn't hit.")
return char, victim
def choose_gun(char):
""" equip a gun.
weapon change. is necessary for current game mechanics.
maybe we could do that... differently? GUI ftw
char always means the acting character object, not only the player.
:param char: object
:return: object
"""
print "Name - Damage - Range - AP"
for i in char.inventory:
if i.type == "gun":
print i.name, " ", str(i.damage), " ", str(i.grange), " ", str(i.ap)
choice = 0
while choice == 0:
choice = raw_input("You currently have " + char.gun.name +
" equipped. Which one do you choose? (a)bort\n")
if choice == "a":
print("Aborted.")
return char
for i in char.inventory:
if choice == i.name and i.type == "gun":
char.gun = i
print("Don't hurt anyone with that.")
return char
print("ERROR: incorrect input.")
choice = 0
def aim(char, mission):
""" who do i shoot?
from a list of characters in sight (and range?) of char, a victim is
chosen. for now every character is in sight, changes with GUI.
char always means the acting character object, not only the player.
:param char: object
:param mission: object.
:return: object, object
"""
print("0: Abort")
for i in mission.current_room.foelist:
print(str(i.id) + ": " + str(i.name))
victim = 0
while victim == 0:
try:
victim = int(raw_input(char.name + ", who do you want to shoot?"))
except ValueError:
print("ERROR: Enter a number.")
victim = 0
if victim == 0:
return mission, None
for i in mission.current_room.foelist:
if i.id == victim:
victim = i
break
return mission, victim
def act(char, icdifference, mission):
""" choose action for turn, calculate AP.
This function handles each turn. The action is chosen.
then it adds the AP to the acting char.
char always means the acting character object, not only the player.
:param char: object
:param icdifference: integer
:param mission: object.
:return: mission: object
"""
if "reflex chip" in char.augmentations:
char.ic -= 10
if char == mission.current_room.foelist[0]: # if char == player
choice = 0
while choice == 0: # can this be optimized?
print("(0) Show character")
print("(1) Walk: " + str(char.walk_ap()) + " AP")
print("(2) Choose gun: 0 AP")
print("(3) Choose sword: 0 AP")
print("(4) Shoot: " + str(char.gun.ap) + " AP")
print("(5) Fight: " + str(char.sword.ap) + " AP")
print("(6) Wait and give away " + str(icdifference) + " AP")
if char.morph:
print("(7) Morph: " + str(130 / ((char.mob * 3 + char.int * 5) / 10)))
try:
choice = int(raw_input("What do you want to do? "))
except ValueError:
print("ERROR: Enter a number.")
choice = 0
if choice == 0:
char.print_char()
elif choice == 1:
# walk()
print("You walk somewhere.") # debug
char.ic += char.walk_ap()
return mission
elif choice == 2:
choose_gun(char)
return mission
elif choice == 3:
# choose_sword()
print("Swords are not implemented yet.") # debug
return mission
elif choice == 4:
if "fear blocker" not in char.augmentations:
if near(char) != []:
return mission
if char.morphed:
print("You cannot attack while morphed.")
return mission
# choose a target
mission, victim = aim(char, mission)
if victim is not None:
char, victim = shoot(char, victim) # does the damage
char.ic += char.gun.ap / ((char.mob * 3 + char.int * 5) / 10)
return mission
elif choice == 5:
# near() # returns a list with characters near you
# melee() # does the damage
print("You aren't near anyone.") # debug
# if you hit someone, do this:
char.ic += char.sword.ap / ((char.mob * 3 + char.int * 5) / 10)
return mission
elif choice == 6:
print("You wait.")
char.ic += icdifference + 1
return mission
elif choice == 7:
if char.morph:
if char.morphed:
char.morphed = False
char.ic += 130 / ((char.mob * 3 + char.int * 5) / 10)
elif not char.morphed:
char.morphed = True
char.ic += 130 / ((char.mob * 3 + char.int * 5) / 10)
return mission
else:
print("ERROR: Enter a number between 1 and 6.")
else:
print("ERROR: Enter a number between 1 and 6.")
choice = 0
else:
# aiturn()
char.ic += 1 # debug
return mission
pass
def initiative(player, mission):
""" who has the lowest initiative and can act?
:param player: object
:param mission: object
:param foelist: list of objects
:return player: object
:return mission: object
:return foelist: list of character objects
"""
lowest_ic = player
for i in mission.room.foelist:
if i.ic <= lowest_ic.ic:
icdifference = lowest_ic.ic - i.ic
lowest_ic = i
mission = act(lowest_ic, icdifference, mission)
return player, mission
def start_level(player, mission):
""" choose level and loop through it.
choose a level. there will be level description and choosing soon.
calls build_battlefield to start the level, and uses while-loop
to keep it running.
:param player: object
:return player: object
"""
print(mission.description)
mission = build_battlefield(player, mission)
# returns a list of lists of the fields, a dict with enemy types,
# and a list with every enemy in the level and his IC.
level_running = True
while level_running:
player, mission = initiative(player, mission)
player, mission, level_running = dead(player, mission)
mission.success_func(player, mission.room)
return player
def choose_level():
""" Choose mission function
if function returns 0, it goes back to main menu.
:return: player: object
"""
all_missions = os.listdir("../missions")
if all_missions:
choice = -1
while choice == -1: # can this be optimized?
print("(0) Abort")
for i in range(len(all_missions)):
print("(%s) " + all_missions[i]) % str(i + 1)
try:
choice = int(raw_input("Which mission do you want to start?"))
except ValueError:
print("ERROR: Enter a number.")
choice = -1
if choice == 0:
print("Choosing aborted.")
return 0
elif choice - 1 < len(all_missions) and choice > 0:
with open("../missions/" + all_missions[choice - 1], "rb", ) as file:
mission = pickle.load(file)
return mission
else:
print("ERROR: Invalid choice.")
choice = -1
else:
print("ERROR: No available missions.")
return 0
def buy_gun(player):
""" choose item and pay for it.
choose an item. add it to player.inventory, reduce player.bitcoins.
items.allguns: list of guns
:param player: object
:return: player: object
"""
with open("../resources/guns", "rb") as file:
guns = pickle.load(file)
for i in guns:
print "Item: " + i[0],
leftspace = 20 - len(i[0])
print leftspace * "_",
if "cosmetic surgery" in player.augmentations:
cost = i[1] - 10
else:
cost = i[1]
print "Price: " + str(cost) + " BTC"
choice = 0
while choice == 0:
print("You have " + str(player.bitcoins) + " BTC.")
try:
choice = raw_input("Which gun do you want to buy? (a)bort ")
except SyntaxError:
choice = 0
print("ERROR: Incorrect input.")
if choice == "a":
return player
for i in guns:
if choice == i[0]:
if "cosmetic surgery" in player.augmentations:
cost = i[1] - 10
else:
cost = i[1]
if cost > player.bitcoins:
print("Gun is too expensive.")
return player
else:
player.bitcoins -= cost
player.inventory.append(build_gun(i))
print("Don't hurt anyone with that.")
return player
print("ERROR: Incorrect input.")
choice = 0
def sell(player):
""" not yet implemented. maybe when the GUI is coming? """
print("You have:")
for i in player.inventory:
print i.name
print("I won't buy your shit.")
def get_augments(player):
choice = 0
while choice == 0:
print("Your augmentations:")
for i in player.augmentations:
print i
print(" 0: Abort")
print(" 1: Get rid of augmentation")
for i in range(len(augmentations.all_augmentations)):
if i < 8: # nice output
print "",
print (str(i + 2) + ": " + augmentations.all_augmentations[i])
try:
choice = int(raw_input("Which augmentation do you want to get? (costs 100 BTC) "))
except ValueError:
print("ERROR: Enter a number.")
if choice == 0:
return player
if choice == 1:
while choice == 1:
print("0: Abort")
for i in range(len(player.augmentations)):
print (str(i + 1) + ": " + player.augmentations[i])
try:
choice = int(raw_input("Which augmentation do you want to get rid of? "))
except ValueError:
print("ERROR: Enter a number.")
if choice == 0:
return player
elif choice > 0 and choice <= len(player.augmentations):
player = augmentations.deaugment(player, player.augmentations[choice - 1])
return player
else:
print("ERROR: Incorrect input.")
choice = 1
elif choice <= i and choice > 0:
player = augmentations.augment(player, augmentations.all_augmentations[choice - 2])
return player
else:
print("ERROR: Incorrect input.")
def merchant(player):
""" choose merchant option.
needs to be reworked when there is an engine
:param player: object
:return: player: object
"""
choice = 0
while choice == 0:
print "(0) Show character"
print "(1) Buy a gun"
print "(2) Sell an item"
print "(3) Get an augmentation"
print "(4) Back to profile"
try:
choice = int(raw_input("What do you want to do? "))
except ValueError:
choice = 0
if choice == 0:
player.print_char()
elif choice == 1: # if clicked on buyable item,
buy_gun(player)
elif choice == 2:
if len(player.inventory) == 0:
print("You have nothing to sell.")
else:
sell(player)
elif choice == 3:
get_augments(player)
elif choice == 4:
return player
choice = 0
def profile(player):
""" This is the profile menu. from here you can buy stuff or start levels. """
choice = 0
while choice == 0: # can this be optimized?
print "(0) Show character"
print "(1) Visit the merchant"
print "(2) Take a job offer"
print "(3) Main Menu"
try:
choice = int(raw_input("What do you want to do? "))
except NameError:
choice = 0
if choice == 0:
player.print_char()
elif choice == 1:
player = merchant(player)
player.save_profile()
elif choice == 2:
mission = choose_mission()
if mission != 0:
player = start_level(player, mission)
player.save_profile()
elif choice == 3:
return
else:
print("ERROR: Enter a number between 1 and 4.")
choice = 0
def load_game():
""" Loading game function
if function returns 0, it goes back to main menu.
:return: player: object
"""
saved_games = os.listdir("../saves")
if saved_games:
choice = -1
while choice == -1: # can this be optimized?
print("(0) Abort")
for i in range(len(saved_games)):
print("(%s) " + saved_games[i]) % str(i + 1)
try:
choice = int(raw_input("Which character do you want to load? "))
except ValueError:
print("ERROR: Enter a number.")
choice = -1
if choice == 0:
print("Loading aborted.")
return 0
elif choice - 1 < len(saved_games) and choice > 0:
with open("../saves/" + saved_games[choice - 1], "rb", ) as file:
player = pickle.load(file)
return player
else:
print("ERROR: Invalid choice.")
choice = -1
else:
print("ERROR: No saved games.")
return 0
def create_character():
""" returns player object, prints the character """
name = ""
while name == "":
name = raw_input("What's your name? ")
choice = 0
while choice == 0: # can this be optimized?
print("(1) Vampire\n(2) Angel\n(3) Werewolf\n(4) Golem")
try:
choice = int(raw_input("What are you? "))
except ValueError:
choice = 0
if choice == 0:
print("ERROR: Enter a number.")
elif choice == 1:
player = Vampire(name)
elif choice == 2:
player = Angel(name)
elif choice == 3:
player = Werewolf(name)
elif choice == 4:
player = Golem(name)
else:
print("ERROR: Enter a number between 1 and 4.")
choice = 0
print("Your new character:")
player.print_char()
player.save_profile()
return player
def main_menu():
""" Main Menu, from here the other functions are started. """
choice = 0
while choice == 0: # can this be optimized?
print("(1) New game\n(2) Load game\n(3) Options\n(4) Exit")
try:
choice = int(raw_input("What do you want to do? "))
except ValueError:
choice = 0
if choice == 0:
print("ERROR: Enter a number.")
elif choice == 1:
player = create_character()
profile(player)
elif choice == 2:
player = load_game()
if player == 0:
pass
else:
profile(player)
elif choice == 3:
pass # options
elif choice == 4:
print("Good Bye.")
exit()
else:
print("ERROR: Enter a number between 1 and 4.")
choice = 0
def main():
main_menu()