You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
661 lines
21 KiB
661 lines
21 KiB
import getpass
|
|
import telnetlib
|
|
import re
|
|
import time
|
|
import keyboard
|
|
import random
|
|
|
|
HOST = "telnet.goldenunicorn.net"
|
|
user = "epilectrik"
|
|
password = "gupass"
|
|
tn = telnetlib.Telnet()
|
|
tn.open(HOST,23)
|
|
|
|
#static lists
|
|
convert_list = ["Ion-Pack","Ion-Decay","Cheese","Nuclear-thong","Skull","Bottle-Cap","Cigarette-Butt","Knife","Gas-Grenade",
|
|
"Light-Spear","Silver-Potion","Bastard-Sword","Invisible-Knife","Great-Club","Spear","Blizzard-Staff","Devil_Key","Grey-Dagger","Bone","Axe","BlackJack",
|
|
"Golden-Key","Crystal-Key","Trident","Ice-Knife","Iron-Sickle","Gold-Spear","Fang-Dagger","Hound-Fang","Pink-Potion","Small-Dagger","Mage-Stick","Purple-Potion",
|
|
"Tree-Branch","Poker","Bronze Knife","Small-Club","Wonderous-Sword","Spell-Potion","Long-Sword","Ion-Gauntlet","Sling-Sword","Green-Vial","Small-Spear",
|
|
"Tree-Stump","Saphire","Flame-Sword","Rock-Club","Lava-Dagger","Bloody-Arm","Golden-Needle"]
|
|
|
|
farm_list = ["Gold-Chunck","Nuclear-Rock","Nuclear-Decay","Invisible-Cloth","Troll-Skin","Nuclear-Waste"]
|
|
|
|
friend_list = ["Epilectrik","ImBait","Mtron","Im"]
|
|
|
|
help_list = ["$ - Key listener on/off",
|
|
"8 - North",
|
|
"2 - South",
|
|
"6 - East",
|
|
"4 - West",
|
|
"5 - Look direction",
|
|
"c - Combat",
|
|
"w - Wield weapon",
|
|
"a - Auto combat on/off",
|
|
"f - Auto farm on/off",
|
|
"i - Auto Ion on/off",
|
|
"t - time travel",
|
|
"d - drop item",
|
|
"k - keyboard input",
|
|
"v - status",
|
|
"m - meander"
|
|
]
|
|
|
|
#dynamic lists
|
|
local_items = []
|
|
local_monsters = []
|
|
|
|
#modes
|
|
heal = False
|
|
wander = False
|
|
auto_combat = False
|
|
auto_ion = False
|
|
auto_farm = False
|
|
key_detect = True
|
|
#states
|
|
time_steps = 0
|
|
in_combat = False
|
|
hits = 0
|
|
lock_key="$"
|
|
direction_list = []
|
|
sell_list = []
|
|
previous_dir = ""
|
|
|
|
opposite_dir = {
|
|
"north":"south",
|
|
"south":"north",
|
|
"east":"west",
|
|
"west":"east",
|
|
}
|
|
|
|
#search a list
|
|
def search(list, platform):
|
|
for i in range(len(list)):
|
|
if list[i] == platform:
|
|
return True
|
|
return False
|
|
|
|
#Reup Ions
|
|
def convert_items():
|
|
global local_items
|
|
global convert_list
|
|
for item_l in local_items:
|
|
for item in convert_list:
|
|
if item_l == item:
|
|
tn.write(b"get "+item.encode('ascii')+b"\r\n")
|
|
tn.write(b"con "+item.encode('ascii')+b"\r\n")
|
|
local_items.remove(item_l)
|
|
|
|
#Farms valuable stuff
|
|
def farm_items():
|
|
global local_items
|
|
global farm_list
|
|
global sell_list
|
|
|
|
for item_l in local_items:
|
|
for item in farm_list:
|
|
if item_l == item:
|
|
tn.write(b"get "+item.encode('ascii')+b"\r\n")
|
|
local_items.remove(item_l)
|
|
sell_list.append(item_l)
|
|
|
|
#Sell items
|
|
def sell_items():
|
|
global sell_list
|
|
print(sell_list)
|
|
while len(sell_list) > 0:
|
|
item_l=sell_list[0]
|
|
sell_list.pop(0)
|
|
if item_l != "Nuclear-Decay":
|
|
tn.write(b"sell "+item_l.encode('ascii')+b"\r\n")
|
|
time.sleep(.25)
|
|
|
|
|
|
#Remove friends from monster list
|
|
def remove_friends():
|
|
global local_monsters
|
|
for friend in friend_list:
|
|
try:
|
|
local_monsters.remove(friend)
|
|
except:
|
|
pass
|
|
|
|
#Flushes keyboard
|
|
def flush_input():
|
|
|
|
try:
|
|
import msvcrt
|
|
while msvcrt.kbhit():
|
|
msvcrt.getch()
|
|
except ImportError:
|
|
import sys, termios
|
|
termios.tcflush(sys.stdin, termios.TCIOFLUSH)
|
|
|
|
def decode_line(line):
|
|
result = ""
|
|
if line.decode('cp1252') != "":
|
|
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
|
|
result = ansi_escape.sub('', line.decode('cp1252').strip('\n'))
|
|
print(result)
|
|
return result
|
|
|
|
#initiate combat
|
|
def combat_start():
|
|
global local_monsters
|
|
global in_combat
|
|
|
|
tn.write(b"combat " + local_monsters[0].encode('ascii')+b"\r\n")
|
|
in_combat = True
|
|
heal = True
|
|
|
|
#process wander
|
|
def wander_process(result,wander_trigger):
|
|
global heal
|
|
global direction_list
|
|
global previous_dir
|
|
global local_monsters
|
|
global local_items
|
|
|
|
#area clear
|
|
if result.find("north - area continues.") != -1 or result.find("north - open gate.") != -1:
|
|
direction_list.append("north")
|
|
if result.find("south - area continues.") != -1 or result.find("south - open gate.") != -1:
|
|
direction_list.append("south")
|
|
if result.find("east - area continues.") != -1 or result.find("east - open gate.") != -1:
|
|
direction_list.append("east")
|
|
if result.find("west - area continues.") != -1 or result.find("west - open gate.") != -1:
|
|
direction_list.append("west")
|
|
|
|
#print(direction_list)
|
|
#are there monsters
|
|
if result.find("You see shadows to the") != -1:
|
|
try:
|
|
if result.find("north") != -1:
|
|
direction_list.remove("north")
|
|
if result.find("south") != -1:
|
|
direction_list.remove("south")
|
|
if result.find("east") != -1:
|
|
direction_list.remove("east")
|
|
if result.find("west") != -1:
|
|
direction_list.remove("west")
|
|
except:
|
|
pass
|
|
|
|
if wander_trigger == 0:
|
|
print("wander triggered")
|
|
if len(direction_list) == 0:
|
|
tn.write(b"look\r\n")
|
|
local_monsters = []
|
|
local_items = []
|
|
|
|
#pick randomly
|
|
if len(direction_list) > 0 and wander_trigger == 0:
|
|
if len(direction_list) > 1:
|
|
try:
|
|
direction_list.remove(previous_dir)
|
|
except:
|
|
pass
|
|
print(direction_list)
|
|
dir_choice = random.choice(direction_list)
|
|
tn.write(dir_choice.encode('ascii')+b"\r\n")
|
|
direction_list = []
|
|
previous_dir = opposite_dir[dir_choice]
|
|
|
|
#process combat per loop
|
|
def combat_process(result):
|
|
global heal
|
|
global hits
|
|
global time_steps
|
|
global local_monsters
|
|
global in_combat
|
|
|
|
if result.find("You suffer") != -1:
|
|
hits = hits + 1
|
|
if hits == 2:
|
|
tn.write(b"heal\r\n")
|
|
tn.write(b"heal\r\n")
|
|
hits = 0
|
|
|
|
if result.find("have slain") != -1 or result.find("has just left") != -1 or result.find("isn't around here!") != -1 or result.find("You're not ready") != -1:
|
|
try:
|
|
local_monsters.pop(0)
|
|
except:
|
|
pass
|
|
if len(local_monsters) > 0:
|
|
tn.write(b"combat " + local_monsters[0].encode('ascii')+b"\r\n")
|
|
else:
|
|
print("Area cleared")
|
|
in_combat = False
|
|
|
|
wield = time_steps % 10
|
|
|
|
if wield == 0:
|
|
tn.write(b"wie nuclear-decay\r\n")
|
|
|
|
def parse_stat():
|
|
global farm_list
|
|
global sell_list
|
|
sell_list = []
|
|
line = tn.read_until(b">",0) # Read one line
|
|
result = decode_line(line)
|
|
for item_l in farm_list:
|
|
x = line.decode('ascii').count(item_l)
|
|
for i in range(x):
|
|
sell_list.append(item_l)
|
|
print(sell_list)
|
|
|
|
def index_area():
|
|
global local_items
|
|
global local_monsters
|
|
end_index = 0
|
|
line = tn.read_until(b">",0) # Read one line
|
|
result = decode_line(line)
|
|
#Index items
|
|
if result.find("On the ground lies:") != -1:
|
|
start_index = result.index('On the ground lies:')
|
|
item_str = result[start_index:]
|
|
try:
|
|
end_index = item_str.index('***')
|
|
except:
|
|
try:
|
|
end_index = item_str.index('>')
|
|
except:
|
|
pass
|
|
item_str = item_str[:end_index]
|
|
item_str = item_str.replace("On the ground lies:","")
|
|
item_str = item_str.replace("0","")
|
|
item_str = item_str.replace("1","")
|
|
item_str = item_str.replace("2","")
|
|
item_str = item_str.replace("3","")
|
|
item_str = item_str.replace("4","")
|
|
item_str = item_str.replace("5","")
|
|
item_str = item_str.replace("6","")
|
|
item_str = item_str.replace("7","")
|
|
item_str = item_str.replace("8","")
|
|
item_str = item_str.replace("9","")
|
|
item_str = item_str.replace("(","")
|
|
item_str = item_str.replace(")","")
|
|
item_str = item_str.replace("A ","")
|
|
item_str = item_str.replace("An ","")
|
|
item_str = item_str.replace(" ","")
|
|
item_str = item_str.replace(".","")
|
|
item_str = item_str.replace("\r\n","")
|
|
item_str = item_str.replace("***","")
|
|
local_items = list(item_str.split(","))
|
|
print(local_items)
|
|
|
|
if result.find("here") != -1:
|
|
end_index = result.index('here')
|
|
monster_str = result[:end_index]
|
|
start_index = monster_str.rindex('***')
|
|
monster_str = monster_str[start_index:]
|
|
monster_str = monster_str.replace("\r\n","")
|
|
monster_str = monster_str.replace(" and ","")
|
|
monster_str = monster_str.replace(" are ","")
|
|
monster_str = monster_str.replace(" is ","")
|
|
monster_str = monster_str.replace(" ","")
|
|
monster_str = monster_str.replace(".","")
|
|
monster_str = monster_str.replace("***","")
|
|
local_monsters = list(monster_str.split(","))
|
|
remove_friends()
|
|
print(local_monsters)
|
|
|
|
def mutants():
|
|
global time_steps
|
|
global local_items
|
|
global local_monsters
|
|
global heal
|
|
global wander
|
|
global in_combat
|
|
global key_detect
|
|
global auto_combat
|
|
global auto_farm
|
|
global auto_ion
|
|
global lock_key
|
|
global direction_list
|
|
|
|
area_indexed = False
|
|
while True:
|
|
#print(local_items)
|
|
time.sleep(.1)
|
|
time_steps = time_steps + 1
|
|
#data decode
|
|
result = ""
|
|
line = None
|
|
line = tn.read_until(b"\n",0) # Read one line
|
|
result = decode_line(line)
|
|
|
|
stat_trigger = time_steps % 600
|
|
if stat_trigger == 0 and not in_combat:
|
|
tn.write(b"stat\r\n")
|
|
|
|
heal_trigger = time_steps % 20
|
|
if heal_trigger == 0:
|
|
if heal:
|
|
tn.write(b"heal\r\n")
|
|
|
|
#auto farm if sold items
|
|
if len(sell_list) == 0 and wander:
|
|
auto_farm = True
|
|
|
|
#process wander[[
|
|
wander_trigger = time_steps % 30
|
|
if wander and not in_combat:
|
|
if wander_trigger == 0:
|
|
area_indexed = False
|
|
#print("wander triggered")
|
|
wander_process(result,wander_trigger)
|
|
|
|
if time_steps == 1000:
|
|
time_steps = 0
|
|
|
|
#process combat
|
|
if in_combat:
|
|
combat_process(result)
|
|
|
|
#scrapers
|
|
if result == "(N)onstop, (Q)uit, or (C)ontinue?":
|
|
tn.write(b"N\r\n")
|
|
|
|
if result.find("You're starving for IONS!") != -1:
|
|
tn.write(b"con gold-chunck\r\n")
|
|
auto_ion = True
|
|
heal = True
|
|
|
|
if wander and result.find("The weight of all your items forces you to the ground.") != -1:
|
|
wander = False
|
|
tn.write(b"X\r\n")
|
|
|
|
if auto_farm and result.find("The Nuclear-Decay fell out of your sack!") != -1:
|
|
time_steps = 0
|
|
tn.write(b"con gold-chunck\r\n")
|
|
tn.write(b"get nuclear-decay\r\n")
|
|
|
|
if auto_farm and result.find("You're not carrying a gold-chunck.") != -1:
|
|
auto_farm = False
|
|
|
|
if result.find("The Monster-Bait fell out of your sack!") != -1:
|
|
time_steps = 0
|
|
tn.write(b"con gold-chunck\r\n")
|
|
tn.write(b"get monster-bait\r\n")
|
|
|
|
#if wander and result.find("fell out of your sack!") != -1:
|
|
#wander = False
|
|
#auto_farm = False
|
|
|
|
if wander and (result.find("It's too dark to see anything!") != -1 or result.find("You're blocked!") != -1):
|
|
direction_list = ["north","south","east","west"]
|
|
|
|
if result.find("travel") != -1:
|
|
local_monsters = []
|
|
|
|
if result.find("City Trading Centre") != -1:
|
|
#print("Sell trigger")
|
|
if len(sell_list) > 0:
|
|
sell_items()
|
|
|
|
if result.find("Compass:") != -1 and area_indexed == False:
|
|
index_area()
|
|
if wander:
|
|
tn.write(b"look\r\n")
|
|
area_indexed = True
|
|
|
|
if result.find("stat") != -1:
|
|
parse_stat()
|
|
|
|
if result.find("Nothing happens!") != -1 or result.find("You don't have enough ions to heal!") != -1:
|
|
heal = False
|
|
|
|
if result.find("You suffer") != -1 or result.find("You are poisoned!") != -1:
|
|
heal = True
|
|
|
|
#monster list related
|
|
if (result.find("yells: Gimmie") != -1 or
|
|
result.find("just arrived from") != -1 or
|
|
result.find("has hit") != -1 or
|
|
result.find("body is glowing") != -1 or
|
|
result.find("Get away from me") != -1 or
|
|
result.find("has magically appeared") != -1):
|
|
m = result.index(' ')
|
|
monster = result[:m]
|
|
if not search(local_monsters, monster):
|
|
local_monsters.append(monster)
|
|
remove_friends()
|
|
print(local_monsters)
|
|
if len(local_monsters) > 0 and auto_combat and not in_combat:
|
|
combat_start()
|
|
|
|
if result.find("has just left") != -1:
|
|
end_index = result.index(' has')
|
|
mon_str = result[:end_index]
|
|
mon_str = mon_str.replace(" ","")
|
|
try:
|
|
local_monsters.remove(mon_str)
|
|
except:
|
|
pass
|
|
print(mon_str)
|
|
print(local_monsters)
|
|
|
|
if result.find("is crumbling to dust") != -1:
|
|
end_index = result.index(' is')
|
|
mon_str = result[:end_index]
|
|
mon_str = mon_str.replace(" ","")
|
|
try:
|
|
local_monsters.remove(mon_str)
|
|
except:
|
|
pass
|
|
print(mon_str)
|
|
print(local_monsters)
|
|
|
|
if result.find("picked up the") != -1:
|
|
start_index = result.index('the') + 4
|
|
item_str = result[start_index:]
|
|
end_index = item_str.index('.')
|
|
item_str = item_str[:end_index]
|
|
item_str = item_str.replace(" ","")
|
|
try:
|
|
local_items.remove(item_str)
|
|
except:
|
|
pass
|
|
print(item_str)
|
|
print(local_items)
|
|
|
|
if result.find("is falling from") != -1:
|
|
start_index = result.index('A')
|
|
item_str = result[start_index:]
|
|
end_index = item_str.index('is')
|
|
item_str = item_str[:end_index]
|
|
item_str = item_str.replace(" ","")
|
|
item_str = item_str.replace("is","")
|
|
item_str = item_str.replace("An","")
|
|
item_str = item_str.replace("A","")
|
|
local_items.append(item_str)
|
|
print(local_items)
|
|
|
|
if result.find("Select (Bury, 1-5, ?)") != -1:
|
|
in_combat=False
|
|
heal = False
|
|
wander = False
|
|
auto_farm = False
|
|
auto_ion = False
|
|
|
|
#farm items
|
|
if len(local_items) > 0 and not in_combat:
|
|
if auto_farm:
|
|
farm_items()
|
|
if auto_ion:
|
|
convert_items()
|
|
#print("convert")
|
|
|
|
#functions
|
|
if keyboard.is_pressed(lock_key):
|
|
time.sleep(.5)
|
|
if key_detect:
|
|
key_detect = False
|
|
print("Key detect off")
|
|
else:
|
|
key_detect = True
|
|
print("Key detect on")
|
|
|
|
if key_detect:
|
|
if keyboard.is_pressed("?"):
|
|
time.sleep(.5)
|
|
for help in help_list:
|
|
print(help)
|
|
#directions
|
|
if keyboard.is_pressed("8"):
|
|
local_monsters = []
|
|
local_items = []
|
|
tn.write(b"north\r\n")
|
|
area_indexed = False
|
|
time.sleep(.25)
|
|
if keyboard.is_pressed("2"):
|
|
local_monsters = []
|
|
local_items = []
|
|
tn.write(b"south\r\n")
|
|
area_indexed = False
|
|
time.sleep(.25)
|
|
if keyboard.is_pressed("4"):
|
|
local_monsters = []
|
|
local_items = []
|
|
tn.write(b"west\r\n")
|
|
area_indexed = False
|
|
time.sleep(.25)
|
|
if keyboard.is_pressed("6"):
|
|
local_monsters = []
|
|
local_items = []
|
|
tn.write(b"east\r\n")
|
|
area_indexed = False
|
|
time.sleep(.25)
|
|
#functions
|
|
if keyboard.is_pressed("a"):
|
|
time.sleep(.5)
|
|
if auto_combat:
|
|
auto_combat = False
|
|
print("Auto combat off")
|
|
else:
|
|
auto_combat = True
|
|
print("Auto combat on")
|
|
#Auto Ion
|
|
if keyboard.is_pressed("i"):
|
|
time.sleep(.5)
|
|
if auto_ion:
|
|
auto_ion = False
|
|
print("Auto ion off")
|
|
else:
|
|
auto_ion = True
|
|
print("Auto ion on")
|
|
#Auto farm
|
|
if keyboard.is_pressed("f"):
|
|
time.sleep(.5)
|
|
if auto_farm:
|
|
auto_farm = False
|
|
print("Auto farm off")
|
|
else:
|
|
auto_farm = True
|
|
print("Auto farm on")
|
|
|
|
if keyboard.is_pressed("c"):
|
|
if len(local_monsters) > 0:
|
|
combat_start()
|
|
time.sleep(.25)
|
|
if keyboard.is_pressed("5"):
|
|
tn.write(b"look ")
|
|
time.sleep(.25)
|
|
|
|
if keyboard.is_pressed("m"):
|
|
time.sleep(.5)
|
|
if wander:
|
|
wander = False
|
|
print("Meander off")
|
|
else:
|
|
wander = True
|
|
print("Meander on")
|
|
tn.write(b"look\r\n")
|
|
|
|
if keyboard.is_pressed("h"):
|
|
tn.write(b"heal\r\n")
|
|
heal = True
|
|
time.sleep(.25)
|
|
if keyboard.is_pressed("l"):
|
|
area_indexed == False
|
|
tn.write(b"look\r\n")
|
|
time.sleep(.25)
|
|
if keyboard.is_pressed("m"):
|
|
wander = True
|
|
if keyboard.is_pressed("v"):
|
|
tn.write(b"stat\r\n")
|
|
time.sleep(.25)
|
|
if keyboard.is_pressed("s"):
|
|
sell_items()
|
|
time.sleep(.25)
|
|
if keyboard.is_pressed("k") and not in_combat:
|
|
time.sleep(.25)
|
|
flush_input()
|
|
#toss = keyboard.read_key()
|
|
st = input("Keyboard input: ")
|
|
tn.write(st.encode('ascii')+b"\r\n")
|
|
flush_input()
|
|
|
|
if keyboard.is_pressed("w"):
|
|
time.sleep(.25)
|
|
tn.write(b"wie nuclear-decay\r\n")
|
|
|
|
if keyboard.is_pressed("d"):
|
|
time.sleep(.25)
|
|
flush_input()
|
|
#toss = keyboard.read_key()
|
|
st = input("drop item: ")
|
|
drop_item = "drop " + st
|
|
tn.write(drop_item.encode('ascii')+b"\r\n")
|
|
|
|
if keyboard.is_pressed("t") and not in_combat:
|
|
monster_list = []
|
|
time.sleep(.25)
|
|
flush_input()
|
|
#toss = keyboard.read_key()
|
|
st = input("year: ")
|
|
year = "travel " + st
|
|
tn.write(year.encode('ascii')+b"\r\n")
|
|
|
|
if keyboard.is_pressed("x"):
|
|
break
|
|
|
|
user = input("User name:")
|
|
password = input("Password:")
|
|
lock_key = input("Lock key:")
|
|
|
|
while True:
|
|
line = None
|
|
line = tn.read_until(b"\n",1) # Read one line
|
|
if line.decode('cp1252') == "":
|
|
#print("break")
|
|
#break
|
|
pass
|
|
else:
|
|
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
|
|
result = ansi_escape.sub('', line.decode('cp1252').strip('\n'))
|
|
print(result)
|
|
if result == "Otherwise type \"new\": ":
|
|
tn.write(user.encode('ascii')+b"\r\n")
|
|
|
|
if result == "Enter your password: ":
|
|
tn.write(password.encode('ascii')+b"\r\n")
|
|
|
|
if result == "(N)onstop, (Q)uit, or (C)ontinue?":
|
|
tn.write(b"Q\r\n")
|
|
|
|
if result == "Make your selection (G,T,F,M,S,? for help, or X to exit): ":
|
|
tn.write(b"G\r\n")
|
|
|
|
if result == "help, or X to exit): ":
|
|
tn.write(b"C\r\n")
|
|
|
|
if result == "Select (P,I,H,S,W,X,?): ":
|
|
tn.write(b"P\r\n")
|
|
|
|
if result == "Select (Bury, 1-5, ?) ":
|
|
tn.write(b"4\r\n")
|
|
mutants()
|
|
break
|
|
|
|
|