From 776d008a343da9b2eea16c44713ee349b00dbe09 Mon Sep 17 00:00:00 2001 From: Francesco Camilletti Date: Wed, 25 Nov 2020 01:20:41 +0100 Subject: [PATCH] Add files via upload --- core/Characters/__init__.py | 563 +------------ .../__pycache__/__init__.cpython-38.pyc | Bin 15650 -> 3106 bytes core/Errors/__init__.py | 6 +- .../__pycache__/__init__.cpython-38.pyc | Bin 3247 -> 3551 bytes core/Utils/__init__.py | 1 + .../Utils/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 203 bytes core/Utils/__pycache__/colors.cpython-38.pyc | Bin 0 -> 855 bytes core/Utils/__pycache__/map.cpython-38.pyc | Bin 0 -> 1196 bytes core/Utils/colors.py | 20 + core/Utils/map.py | 57 ++ core/commands.json | 17 +- main.py | 770 +++++------------- 12 files changed, 344 insertions(+), 1090 deletions(-) create mode 100644 core/Utils/__init__.py create mode 100644 core/Utils/__pycache__/__init__.cpython-38.pyc create mode 100644 core/Utils/__pycache__/colors.cpython-38.pyc create mode 100644 core/Utils/__pycache__/map.cpython-38.pyc create mode 100644 core/Utils/colors.py create mode 100644 core/Utils/map.py diff --git a/core/Characters/__init__.py b/core/Characters/__init__.py index 7d5c35a..823d9fb 100644 --- a/core/Characters/__init__.py +++ b/core/Characters/__init__.py @@ -1,187 +1,11 @@ import base64 -import json import random import time -import xml.etree.ElementTree as ET -from functools import reduce -import core.Errors as errs -from core.utils import list_splice -from core.utils.Colors import bcolors as css +import arcade random.seed(time.time()) -tips=[ - "one number is correct and well placed", - "nothing is correct", - 'two numbers are correct but wrong placed', - 'one number is correct but wrong placed', - 'one number is correct but wrong placed' -] - -sequences=[[], [], [], [], []] - -numbers=[i for i in range(0,10)] - -def shuffle(matrix): - for i in range(0, len(matrix)-1): - j=int(random.random()*(i+1)) - x=matrix[i] - matrix[i]=matrix[j] - matrix[j]=x - return matrix - -def spliceRandNumber(array=None): - if not array: - array=numbers - return (list_splice(array,int(random.random()*len(array)), 1))[0] - -def newCode(): - global sequences - global numbers - code=[None,None,None] - sequences=[[], [], [], [], []] - numbers=[i for i in range(0,10)] - codeNumbers=[spliceRandNumber() for _ in range(3)] - - sequences[0] = [codeNumbers[0], spliceRandNumber(), spliceRandNumber()] - sequences[1] = [sequences[0][1], spliceRandNumber(), spliceRandNumber()] - sequences[2] = [codeNumbers[1], codeNumbers[2], sequences[1][1]] - sequences[3] = [codeNumbers[0], sequences[1][2], spliceRandNumber()] - fifthSequenceNId = int(random.random()*2)+1 - sequences[4] = [codeNumbers[fifthSequenceNId], spliceRandNumber(), spliceRandNumber()] - - for s in sequences: - s=shuffle(s) - - places = [sequences[0].index(codeNumbers[0]),None,None] - - code[places[0]] = codeNumbers[0] - - for i in range(0,3): - if not code[i]: - if not codeNumbers[1] in code: # code.index(codeNumbers[1]) < 0: - code[i] = codeNumbers[1] - places[1]=i - else: - code[i] = codeNumbers[2] - places[2]=i - - fixThirdSequence(codeNumbers, places) - fixFourthSequence(codeNumbers, places) - fixFifthSequence(fifthSequenceNId, codeNumbers, places) - - i=0 - for s in sequences: - print(s, tips[i]) - i+=1 - - return code - -#adjust last sequences -def fixThirdSequence(codeNumbers, places): - global sequences - index1=sequences[2].index(codeNumbers[1]) - index2=sequences[2].index(codeNumbers[2]) - if not index1==places[1] and not index2==places[2]: return - sequences[2][index1] = codeNumbers[2] - sequences[2][index2] = codeNumbers[1] - -def fixFourthSequence(codeNumbers,places): - global sequences - index=sequences[3].index(codeNumbers[0]) - for i in range(0,3): - if not sequences[3][i]==codeNumbers[0] and sequences[3][i] in sequences[3]: - sequences[3][i]=random.choice(sequences[1]) - if not index==places[0]: return - if index>1: - change=sequences[3][index-1] - sequences[3][index - 1] = codeNumbers[0] - sequences[3][index] = change - else: - change = sequences[3][index + 1] - sequences[3][index + 1] = codeNumbers[0] - sequences[3][index] = change - -def fixFifthSequence(nId, codeNumbers, places): - index=sequences[4].index(codeNumbers[nId]) - seqTwoIndex = sequences[2].index(codeNumbers[nId]) - if (index==places[nId] or type(index)==type(places[nId])) or (seqTwoIndex==index or type(seqTwoIndex)==type(index)): - newIndex= reduce(lambda acc, cur: acc+([cur if not cur==seqTwoIndex and not cur==places[nId] else 0][0]), [0,1,2], 0) - change= sequences[4][newIndex] - sequences[4][newIndex] = codeNumbers[nId] - sequences[4][index]= change - - -class Player(): - def __init__(self, col, rows, engine): - self.id=random.randint(10,100) - self.pos=[random.randint(0,4),random.randint(0,3)] - self.Engine=engine - self.selected=None - self.img='P' - self.action_range=1 # it means center+1, so 3*3 grid - - def move(self, pos): - newx=int(pos.split(',')[0]); x=self.pos[0] - newy=int(pos.split(',')[1]); y=self.pos[1] - skip=None - if x in [0,5]: - if newx>x: - if x==4: - skip='x' - else: - if x==0: - skip='x' - if y in [0,4]: - if newy>y: - if y==3: - skip='y' - else: - if y==0: - skip='y' - if not skip: - for bot in self.Engine.robots: - if bot.pos==[newx, newy]: - if not bot.id==self.id: - print(css.FAIL+'[ERR]'+css.ENDC+' ID:',bot.id,'already in',newx,',',newy,'!') - return - if newx<=self.pos[0]+self.action_range and newx>=self.pos[0]-self.action_range: - if newy<=self.pos[1]+self.action_range and newy>=self.pos[1]-self.action_range: - self.pos=[newx, newy] - else: - print(errs.ActionRangeError(pos=[newx,newy])); return - else: - print(errs.ActionRangeError(pos=[newx,newy])); return - else: - if skip=='y': - for bot in self.Engine.robots: - if bot.pos==[newx, y]: - if not bot.id==self.id: - print(css.FAIL+'[ERR]'+css.ENDC+' ID:',bot.id,'already in',newx,',',newy,'!') - return - # newpos=[newx, y] - if newx<=self.pos[0]+self.action_range and newx>=self.pos[0]-self.action_range: - if y<=self.pos[1]+self.action_range and y>=self.pos[1]-self.action_range: - self.pos=[newx, y] - else: - print(errs.ActionRangeError(pos=[newx, y])); return - else: - print(errs.ActionRangeError(pos=[newx, y])); return - else: - for bot in self.Engine.robots: - if bot.pos==[x, newy]: - if not bot.id==self.id: - print(css.FAIL+'[ERR]'+css.ENDC+' ID:',bot.id,'already in',newx,',',newy,'!') - return - if x<=self.pos[0]+self.action_range and x>=self.pos[0]-self.action_range: - if newy<=self.pos[1]+self.action_range and newy>=self.pos[1]-self.action_range: - self.pos=[x, newy] - else: - print(errs.ActionRangeError(pos=[x,newy])); return - else: - print(errs.ActionRangeError(pos=[x,newy])); return - class Kernel(): def __init__(self): self.islocked=True @@ -190,352 +14,47 @@ def __init__(self): self.hashes={} [self.hashes.update({port:base64.b64encode(''.join([chr(random.randint(97,122)) for _ in range(5)]).encode()).decode()}) for port in self.ports.keys()] -class Robot(): - def __init__(self, Engine, img='R'): - self.id=random.randint(10,100) - self.pos=[random.randint(0,5),random.randint(0,4)] - self.img=css.FAIL+img+css.ENDC - self.color=css.FAIL - self.level=2 - # -- - self.commands=json.loads(open('core/Characters/commands.json').read())['commands'] - self.state=css.FAIL+'locked'+css.ENDC - self.kernel=Kernel() - self.Engine=Engine - - def parser(self, x): - cmd=x.split()[0].lower() - params=x.split()[1:] - if '-h' in params: - self.docs(cmd) - return - - # HELP - if cmd=='help': - print(css.HEADER+'[H]'+css.ENDC+' List of commands:'); [print('-',cmd) for cmd in self.commands] - print(css.HEADER+'[H]'+css.ENDC+' Type "cmd -h" for info about cmd.') - - # HACK - elif cmd=='hack': - port=str(params[params.index('-port')+1]) - if self.kernel.ports[port]==1: - raise errs.HackError() - else: - print(css.OKCYAN+'[..]'+css.ENDC+' Hacking on port:',params[0]) - self.kernel.islocked=False - self.state=css.OKGREEN+'unlocked'+css.ENDC - self.img=css.OKGREEN+(self.img.replace(css.FAIL, '')) - self.color=css.OKGREEN - time.sleep(0.5) - print(css.OKCYAN+'[*]'+css.ENDC+css.OKGREEN+' Successfully hacked.'+css.ENDC) - - # SCAN - elif cmd=='scan': - print(css.OKCYAN+'[..]'+css.ENDC+' Scanning...') - print('[*] Found ports:') - for port in self.kernel.ports.keys(): - if self.kernel.ports[port] in ['1',1]: - print('-',css.HEADER+port,css.ENDC+' status:'+css.FAIL,self.kernel.ports[port],css.ENDC) - else: - print('-',port,' status:'+css.OKGREEN,self.kernel.ports[port], css.ENDC) - - # SHUTDOWN - elif cmd in ['destroy', 'shutdown']: - if self.kernel.islocked: raise errs.HackError(css.OKCYAN+'\n[INFO]'+css.ENDC+' Unlock kernel first.'); return - print(css.FAIL+'[..]'+css.ENDC+' Self-Destruction Enabled..') - self.kernel.is_active=False - self.Engine.robots.remove(self) - time.sleep(0.4) - self.Engine.gamepoints+=1 - print(css.HEADER+'[*]'+css.ENDC+' Bot killed.') - self.Engine.player.selected=None - # dump the score - tree=ET.parse('core/PC/config.xml') - root=tree.getroot() - for ch in root.iter('points'): - ch.text=str(self.Engine.gamepoints) - tree.write('core/PC/config.xml') - - # BSHELL - elif cmd=='bshell': - if self.kernel.islocked: raise errs.HackError(css.OKCYAN+'\n[INFO]'+css.ENDC+' Unlock kernel first.'); return - if self.kernel.is_active: raise errs.HackError(css.OKCYAN+'\n[INFO]'+css.ENDC+' Disable kernel first.'); return - print(css.OKGREEN+'[CMD]'+css.ENDC+' Entering BrainShell...') - if self.level<=1: - print(css.FAIL+'[ERR][#51]'+css.ENDC+' BShell unreacheable, this robot hasnt a BShell interface.') - else: - if len(params): - self.BShell(' '.join(params)) - else: - self.Engine.inbshell=True - - # INFO - elif cmd=='info': - [print(k,'->',self.kernel.__dict__[k]) for k in self.kernel.__dict__ if not k.startswith('__')] - - # HASH - elif cmd=='hash': - if not len(params): params.append('-port') - if params[0]=='-port': - # show mode, mostra la cifratura della porta - try: - print(css.OKCYAN+'[HASH]'+css.ENDC,params[1],self.kernel.hashes[str(params[1])]) - except Exception: - [print(css.OKCYAN+'[HASH]'+css.ENDC,key,self.kernel.hashes[key]) for key in self.kernel.hashes.keys()] - elif params[0]=='-res': - # map commands like: {param:val} - mappedparams={} - for p in params: - if not p.startswith('-'): continue - try: - mappedparams.update({p:params[params.index(p)+1]}) - except: break - if mappedparams['-res']==base64.b64decode(self.kernel.hashes[mappedparams['-port']]).decode(): - self.kernel.ports[mappedparams['-port']]=0 - print(css.HEADER+'[*]'+css.ENDC+' Port {p} Successfully bypassed.'.format(p=mappedparams['-port'])) - else: - print(css.FAIL+'[!!] Failed.'+css.ENDC) - else: - print(css.WARNING+'[WARN]'+' Unrecognized param {p}, using "-port" instead.'.format(p=params[0])) - try: - print(css.OKGREEN+'[HASH]'+css.ENDC,params[1],self.kernel.hashes[str(params[1])]) - except Exception: - [print(css.OKGREEN+'[HASH]'+css.ENDC,key,self.kernel.hashes[key]) for key in self.kernel.hashes.keys()] - - # TRANSLATER - elif cmd in ['translater', 'encoder', 'decoder']: - if cmd=='encoder': - s=params[params.index('-text')+1] - print(css.HEADER+'[*]'+css.ENDC+' Encoded text: '+css.OKBLUE, base64.b64encode(s).decode(),css.ENDC) - elif cmd=='decoder': - s=params[params.index('-text')+1] - print(css.HEADER+'[*]'+css.ENDC+' Decoded text: '+css.OKBLUE, base64.b64decode(s).decode(),css.ENDC) - elif cmd=='translater': - if not '-mode' in params: - if 'encode' in params or 'decode' in params: - if 'encode' in params: - s=params[params.index('-text')+1] - print(css.HEADER+'[*]'+css.ENDC+' Encoded text: ', base64.b64encode(s).decode()) - else: - s=params[params.index('-text')+1] - print(css.HEADER+'[*]'+css.ENDC+' Decoded text: ', base64.b64decode(s).decode()) - - # CRACK - # TODO aggiungi che se non è comprato non si esegue!! (controlla i file json per vedere se comprato) - elif cmd=='crack': - if '-port' in params: - p=params[params.index('-port')+1] - else: - p=params[0] - if self.kernel.islocked: raise errs.HackError(css.OKCYAN+'\n[INFO]'+css.ENDC+' Unlock kernel first.'); return - if not self.kernel.is_active: raise errs.HackError(css.OKCYAN+'\n[INFO]'+css.ENDC+' Kernel already disabled.'); return - # resolve pattern - print(css.HEADER+'[PATTERN]'+css.ENDC+' Resolve:') - code=newCode() - print(css.OKCYAN+'[INFO]'+css.ENDC+' Code: XXX') - rep=input(css.OKBLUE+'[SOLUTION]'+css.ENDC+' >> ') - if rep==''.join([str(i) for i in code]): - self.kernel.is_active=False - print(css.OKGREEN+'[OK]'+css.ENDC+css.OKCYAN+' Kernel Successfully disabled!'+css.ENDC) - else: - print(css.FAIL+'[ERR]'+css.ENDC+' Verification Failed.') - - # BSHELL - elif cmd=='bshell': - if self.kernel.islocked: raise errs.HackError(css.OKCYAN+'\n[INFO]'+css.ENDC+' Unlock kernel first.'); return - if self.kernel.is_active: raise errs.HackError(css.OKCYAN+'\n[INFO]'+css.ENDC+' Disable kernel first.'); return - print(css.OKGREEN+'[CMD]'+css.ENDC+' Entering BrainShell...') - if self.level<=1: - print(css.FAIL+'[ERR][#51]'+css.ENDC+' BShell unreacheable, this robot hasnt a BShell interface.') - else: - if len(params): - self.BShell(' '.join(params)) - else: - self.Engine.inbshell=True - - # EXIT - elif cmd in ['exit', 'bye']: - print('exiting') - self.Engine.player.selected=None - +class Player(arcade.SpriteSolidColor): + def __init__(self): + super().__init__(30, 30, arcade.color.BLUE) - def BShell(self, x=None): - comms=json.loads(open('core/Characters/commands.json').read())['bscommands'] - cmd=x.split()[0].lower() - params=x.split()[1:] - if '-h' in params: self.BSHdocs(cmd); return - if not cmd in comms: - if cmd=='bshell' or not cmd: - # start a serial communication - self.Engine.inbshell=True - if params[0] in comms: - cmd=params[0] - params.remove(params[0]) - else: return - else: - print(css.FAIL+'[ERR]'+css.ENDC+' Unrecognized command:', cmd) - return - # exec live commands - - # MOVE - if cmd=='move': - if '-pos' in params: - self.move(params[params.index('-pos')+1]) - else: - self.move(params[0]) - - # ATTACK - elif cmd in ['atk', 'attack']: - if '-h' in params: - self.BSHdocs(cmd) - bot=None - #if not '-pos' in params: and not '-id' in params: - # print(css.FAIL+'[ERR]'+css.ENDC+' Invalid syntax, check "atk -h" for help.'); return - #if self.selected and not '-bot' in params: - #bot=self.selected - #if not '-bot' in params: - # find the bot - # default method = id - if not '-pos' in params: # if doesnt override selecting mode - for obj in self.Engine.robots: - try: - if str(obj.id)==str(params[params.index('-id')+1]): - bot=obj; break - except: - if str(obj.id)==str(params[0]): - bot=obj; break - if not bot: - print(css.FAIL+'[ERR]'+css.ENDC+' Invalid id.') - return - else: - # use position - for obj in self.Engine.robots: - if str(obj.pos)==str(params[params.index('-pos')+1]): - bot=obj; break - if not bot: - print(css.FAIL+'[ERR]'+css.ENDC+' Invalid position.') - if not self.inrange(bot): print(css.FAIL+'[ERR][#78]'+css.ENDC+' Bot unreachable, too far.'); return - print('[*] Decoded hashes:') - if not '-port' in params: - [print('- port',port,'\b:',base64.b64decode(bot.kernel.hashes[port]).decode()) for port in bot.kernel.hashes.keys()] - else: - print('- port',port,'\b:',base64.b64decode(bot.kernel.hashes[params[params.index('-port')+1]]).decode()) - - # RETRIEVE - elif cmd=='retrieve': - # qualsiasi pos va bene - if not '-pos' in params: # if doesnt override selecting mode - for obj in self.Engine.robots: - if str(obj.id)==str(params[params.index('-id')+1]): - bot=obj; break - if not bot: - print(css.FAIL+'[ERR]'+css.ENDC+' Invalid id.') - else: - # use position - for obj in self.Engine.robots: - if str(obj.pos)==str(params[params.index('-pos')+1]): - bot=obj; break - if not bot: - print(css.FAIL+'[ERR]'+css.ENDC+' Invalid position.') - print('[*] Retrieved data:') - [print('[BOTDATA]',k,'->',bot.__dict__[k]) for k in bot.__dict__ if not k.startswith('__')] - print() - [print('[KERNEL]',k,'->',bot.kernel.__dict__[k]) for k in bot.kernel.__dict__ if not k.startswith('__')] - - # DMG && FIRE - elif cmd in ['dmg', 'fire']: - if not '-pos' in params: # if doesnt override selecting mode - for obj in self.Engine.robots: - if str(obj.id)==str(params[params.index('-id')+1]): - bot=obj; break - if not bot: - print(css.FAIL+'[ERR]'+css.ENDC+' Invalid id.') - else: - # use position - for obj in self.Engine.robots: - if str(obj.pos)==str(params[params.index('-pos')+1]): - bot=obj; break - if not bot: - print(css.FAIL+'[ERR]'+css.ENDC+' Invalid position.') - if bot.kernel.islocked: raise errs.HackError(css.OKCYAN+'\n[INFO]'+css.ENDC+' Unlock kernel first.'); return - print(css.FAIL+'[..]'+css.ENDC+' Self-Destruction Enabled..') - bot.kernel.is_active=False - self.Engine.robots.remove(bot) - time.sleep(0.4) - self.Engine.gamepoints+=1 - print(css.HEADER+'[*]'+css.ENDC+' Bot killed.') - - # REMOTEHACK - elif cmd in ['remotehack', 'rmh']: - bot=None - if not '-pos' in params: # if doesnt override selecting mode - for obj in self.Engine.robots: - try: - if str(obj.id)==str(params[params.index('-id')+1]): - bot=obj; break - except: - if str(obj.id)==str(params[0]): - bot=obj; break - if not bot: - print(css.FAIL+'[ERR]'+css.ENDC+' Invalid id.') - else: - # use position - for obj in self.Engine.robots: - if str(obj.pos)==str(params[params.index('-pos')+1]): - bot=obj; break - if not bot: - print(css.FAIL+'[ERR]'+css.ENDC+' Invalid position.'); return - print(css.OKCYAN+'[..]'+css.ENDC+' Hacking bot',bot.id) - bot.kernel.islocked=False - bot.state=css.OKGREEN+'unlocked'+css.ENDC - time.sleep(0.5) - print(css.OKCYAN+'[*]'+css.ENDC+css.OKGREEN+' Successfully hacked.'+css.ENDC) - - # EXIT - elif cmd in ['bye', 'exit']: - self.Engine.inbshell=False + def on_tap(self): + return 'cant select urself!' - # HELP - elif cmd=='help': - print(css.HEADER+'[H]'+css.ENDC+' List of commands:'); [print('-',cmd) for cmd in comms] - print(css.HEADER+'[H]'+css.ENDC+' Type "cmd -h" for info about cmd.') - - # MAP - elif cmd=='map': - if not len(params): - md='std' - else: - if '-mode' in params: - md=params[params.index('-mode')+1] - elif '-m' in params: - md=params[params.index('-m')+1] - else: - md=params[0] - if md in ['std', 'default', 'rapid', 'rmap']: - # rapid map - for bot in self.Engine.robots: - if bot.id==self.id: continue - try: - print('- bot'+css.OKBLUE,bot.id,css.ENDC+'at'+css.OKBLUE,bot.pos,css.ENDC+'state:'+bot.state) - except: continue # is player - elif md in ['org', 'orig', 'original', 'general', 'main']: - # main map - if '-set' in params: - var=params[params.index('-set')+1]; val=params[params.index('-set')+2] - print(var,val) - if var in ['showids','showpos']: - exec('self.Engine.'+var+'='+str(bool(val))) - self.Engine.show_map(self.Engine.update_map()) - else: - print(css.FAIL+'[ERR]'+css.ENDC+' Unknown mode:', md) - return +class Robot(arcade.SpriteSolidColor): + def __init__(self): + super().__init__(30, 30, arcade.color.RED) + self.id=random.randint(10, 1000) + self.kernel=Kernel() + + def on_tap(self): + return 'helo im'+str(self.id) - def BSHdocs(self, man): - data=json.loads(open('core/Characters/commands.json').read()) - for key in data['BSSheet'][man]: - print(key,'->',data['BSSheet'][man][key]) - def docs(self, man): - data=json.loads(open('core/Characters/commands.json').read()) - for key in data['cheatsheet'][man]: - print(key,'->',data['cheatsheet'][man][key]) +class Tile(arcade.SpriteSolidColor): + def __init__(self): + super().__init__(30, 30, arcade.color.WHITE) + self.isplayer=False + self.isrobot=False + + def to_robot(self): + self.id=random.randint(10, 1000) + self.color=arcade.color.RED + self.kernel=Kernel() + self.isrobot=True + self.isplayer=False + + def to_player(self): + self.color=arcade.color.GREEN + self.isplayer=True + self.isrobot=False + + def on_tap(self): + if self.isrobot: + print('helo im '+str(self.id)) + elif self.isplayer: + print('cant select yourself') + + def parser(self, cmd, params): + # TODO add the bot parser + print('bot parser w/:',cmd,params) diff --git a/core/Characters/__pycache__/__init__.cpython-38.pyc b/core/Characters/__pycache__/__init__.cpython-38.pyc index 5520a41a415c062efd26742f6e2e8c2bb72a473d..88a5844afca94b7d388b28c2cca20774471e0717 100644 GIT binary patch literal 3106 zcmb_eTW=dh6rS0e*KXpLHmFc>Nhv}#m$Zctl`4uVk`xfgpe7ZP6|~y!Y@2n~UUz0w z6f1plrS_F~9&FzFBlsip$_xGrJn@~`wd0Tk@xWSpJoj_?zH@dS%+J>to)^FU9!QU| zKd3YNIOyEPtDZs#CV0wP#XoOx)3;id`L|nk%!f{F4XqIyan8PC!V>m#ChURLa?x{y zi=G?XZEs+=Dj4xZ1tXPm#K(v)su-!3BUQn-Sfe(EZq|%Q&OR18ck!wPh?tQ*u!Rfj zIcwR%#!g3j-^Q{VrxC}J$wO_seAOK^1b@kbLSi>r{i}r$D`AlK3-*W`+x?fUZ4I3f z+h7CuCm1w%&FwLr*FYF<-)z~-%by+7MK;diy@Xe-K|E%M?5CAy(AZ`}e#mocXbU!U z3cGU`(c*Oehz~uA}t#ODY z<32>g)^@ZjwI{=_$U3@0|4BD*SlU{;sd?~z-d?)36J;{qS>Fw180EA+2$F7+2f8+i|sfu{z zF^lz=3V@cTi&xVu3RAVVbhKlpId;i*UwgZu+KrX=_Io1CW9>Z*RlKsSs}EO}<8G9R zSUc@3>1r2#J;r=F=!uvn8O3-y|gz-l9c1wLb{~S*A={au2^by#4e4P~QZ%v7sAw z;vmqqAn0UbKc)6u5Iorr(_%&vB??7Gn-RuCB4(8oQN!nw{!U~VWeGj%eTYehnS7uu z^C`=OgKTqNFo(5V@YB`a4{3N1%VR913?bm?JoN@d&IVvVI1m1}?Y1+r%Y3q$<99HR zb6mCGi=}Zud!dX%KS8R2w!2;lw~KZ zBMaAQ0}<0y9jn>D6ouV<5!8sId~shAN3PDGc08im%ep}x_Fkt`O11N)+G6IFC*Q`T zBnRcYBn&#&(bDs!7g3z16Hm8s70jG_WjKb=~I{3 zsI5d8Dr#@f6z(EFOc0K^OJSo7Quty4-34Cf{kn1CY=B`w0WhUDXa`H%e84YL5eL+j z-8jt_lMc$Ct#T=EVAV{P9_c2u2*3%%bA{dlVcDQr( zI=N@KR}nUPzHp{Iber;H?315BY~KS3r(7#ACSwc}C6U~4Pm&_}If-QwN5y(d1MTNo zV7w$gl*PKvYuu+|T{tvZaRLG=4#uG?Xyl+_n?jCS2x*(ZJ7wTuuq&q)YWJ)Ao14wT zC}ZAfmQ|s*K!P}2#<@mj)lHnI(|Y=s&KVzyY>RA~ zDIaQ29iT65jx0aqht|NJep>o<&~mXCqLRzSpKsi0aQOvRHf%{q;6Bt5+QW3%Q8P(w zKF&0ZU36P4GT$mqDaISsQ%m~_mdo2D$QwyXEk7i2T8a1+6I3A$n^50fzv8>TCutnK zrO%lmuXggJ6B}C4y(KOS=7lYUHjlTmG!g6cnKYjVQ)bK&GdgEzyjt8F)~GZn3Y!lK P`<8Fjt-61)anA?eXz`T`hW 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 diff --git a/core/Errors/__init__.py b/core/Errors/__init__.py index e79b71b..5e0b117 100644 --- a/core/Errors/__init__.py +++ b/core/Errors/__init__.py @@ -46,4 +46,8 @@ def __str__(self): if self.b: return "[ERR] Object w/ id: "+repr(self.b.id)+" is too far." else: - return "[ERR] "+repr(self.pos)+" is too far." \ No newline at end of file + return "[ERR] "+repr(self.pos)+" is too far." + +class DeprecationError(DeprecationWarning, Exception): + def __str__(self): + return 'porco d10 fermete' \ No newline at end of file diff --git a/core/Errors/__pycache__/__init__.cpython-38.pyc b/core/Errors/__pycache__/__init__.cpython-38.pyc index aa23cf953f3bef75ab2fda433756aa1cfc1b9e6b..3e7cb3026dd9ce82e8b61cfef40775a35eba6801 100644 GIT binary patch delta 432 zcmZ24d0$#Pl$V!_0SJyR+#CO&je+4Yh=UARfgA@QE-ss>oh;$bkiwI~+rp5-o64Tb z(99CWk-`_upvgbkkxOdgx>Jk}lPeh&*a{L$k~1te&t*(y=efmPQc+UG2{fUIYqB7R z@McBMhm4G>lOx#`C#!Jp0J03&WG4UQcCJ?es?h-1!~!HZ7=>7hKqARNi~^W|JO>~y z76B5e3{i|J3{gxej44bl3{lJ}%s|($+!Am}EhtJ&PAtjH&vPv*$}dW01S*CB5F3P@ zff#IA3L{XLIFnzMU;$8RzCwzjfkIkpQEqBUY7sBUeI_O#r68Lb7^@`E4cCj0FD@yH zkN4ALDFQjFNEAefP3Gg06;}r`je!`fnS-$i#P`$WoE*xdDh2Z1Eg>Y+!V`<~GV{`l Y)F)T-s0r`@r3E+y*nyBkfKz}Q0G2*hvj6}9 delta 170 zcmcaFye8K_kQq#a}q2cr;65lF;O rlYMd)uPPgeUBo*%kx5vF!zMRBr8FnijuE69g`k0`K{I<5hw5V-N=!FabFZKwK;UBvKes7;_kM8KW2(8B&;n88n$+0!0}# z8E>j7noK&Gr@C}IXuVB(j3vQ-qY%|9I literal 0 HcmV?d00001 diff --git a/core/Utils/__pycache__/colors.cpython-38.pyc b/core/Utils/__pycache__/colors.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..275fce0a1873e4f2c83c0c463e0adf5fdbb17f1d GIT binary patch literal 855 zcmb7C-EPw`6n5IAY11F3UBE@3pc1NDTG&_tEp1F!HMmk)Rn3hQb#VmKnx;4{61{~7 z;g*NsMSRO6aK{zL@sw@A4UWz^pHGhceaH5!TD1_2-q-K`qZ~p%$al5Bx|7b6fAlCUy?zbwLiQO*SuT?*Y9||TQkYk>UEBKU0}~JXv{DO&9Ks@ z>Y=$T53ObR=ng)PNTV!@zQ0~Zq3;XJ_oJBYRuWfy|HE#%y7`lzVn-OmDaJ$;F0kuP z=0fkgGc3$E_7IbETj+xen+RimHaf?`=)3k{{0;Fc97F1Uy$nvgSrYQZ3&J3Xy~#Rs z_|?bIbHe0$8*jYLavQuqZnnK3=Ak#+Uag=sy{+cvldx_Nr6SMw09;Yi?|u9MBuS&j z;rSshUk}&8iNYDS9XzFl$yjQZQHrJJWUN{;=k}D0$dKxDL`xDopr5S;x v?ucM+$_*vOZC47_WKQ0^wB#YUKb0w+X$@&;Y5dnFqWD5xz$>}aPcZZwBN@6y literal 0 HcmV?d00001 diff --git a/core/Utils/__pycache__/map.cpython-38.pyc b/core/Utils/__pycache__/map.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94edb5b6584758ddf5bd90b0816ae7bbd8948e9f GIT binary patch literal 1196 zcmYjQJ#5@I6ecN3r^sj5KS^yb#-S(*Twq_4B?t_|NZ@mj0D)W7bq7_3A&aanpF}Do zoz{o*QhV&sE}eZ#fo|D@0v$4C?Z&A9HR6$MC@I8*why{$EqqN1yHtL3d!565DZEL@f zl~j7GaAa2liXmqkVEPjbc+z40 zJ)82epCA^%9xB$^2R`#NoA#O45Dg$p#m8*MXMSU|KJ(6J+&2kSX^-$2L!G%%Frp)J zK(`TSxD6Wq77qd40rZbp2K3<|`T;8>I)LW~1n{guXHNALL>7Fu<4(cQ0fx3NZVk!G zp{0ksYKFmAcXx-gofoAx9r<;qkae94rdJE-=l{cXoq}zH>D%BAK+A6X6dUBa`y+V? z>V9!I6*j6Arb{g8-M6jxY|4G>-M_2FYPO@f(pkZaLS~-|-dE)-p7psN7};b^Zi>T4 zy$4w#70-4|S?R3Kn_hEbleG#|0%x;6<%Bra2oW?~f(?63u7J0>l-^g4j6&BIy8 zb?@qEy(2A!jjxuL>O=X>Q)o&4g(W2$1}i1AK_m5$u7I~x99PvaTyayHxXs56%MG`Y z<`plDrL}y;yCeoj_{`J})3c}h38`Wu#d$zdgP26|+}g$3rEK{chco$m7nO5~=L;*u@- zELVB$aW@3Un%M{%l-D|KgIJ|X#@$KMmh&akmjI4?eOD@WYLe^TI(51a4v`qsAjUCX zz#oywBMK{ur@^9|o+P*pdEzaBIl(a)C29$Hx^X(=?xyGOxp(=KEBD%zdu4XQC;c(B ljV@=k=+bwba}+o9`d8*f$7{7@#}!|9k61_G+PIBl@*hJ+INtyO literal 0 HcmV?d00001 diff --git a/core/Utils/colors.py b/core/Utils/colors.py new file mode 100644 index 0000000..abfc340 --- /dev/null +++ b/core/Utils/colors.py @@ -0,0 +1,20 @@ +class bcolors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKCYAN = '\033[96m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + YELLOW = '\033[1;33;40m' + class background: + RED='\033[0;37;41m' + GREEN='\033[0;37;42m' + YELLOW='\033[0;37;43m' + BLUE='\033[0;37;44m' + MAGENTA='\033[0;37;45m' + CYAN='\033[0;37;46m' + WHITE='\033[0;37;47m' + BLACK='\033[0;37;48m' \ No newline at end of file diff --git a/core/Utils/map.py b/core/Utils/map.py new file mode 100644 index 0000000..116a416 --- /dev/null +++ b/core/Utils/map.py @@ -0,0 +1,57 @@ +from core.Utils.colors import bcolors as css +import core.Errors as errs +import json + +def map_parser(cmd, params): + # TODO add funcs to this parser + if '-h' in params: + raise NotImplementedError + + # HELP + if cmd=='help': + if not len(params): + print(css.HEADER+'[*]'+css.ENDC+' List of commands:') + [print(command) for command in json.loads(open('core/commands.json').read())['commands']] + else: + raise NotImplementedError + + # SHOW + elif cmd=='show': + raise errs.DeprecationError() + overrideshow=False + if '-a' in params: + overrideshow=True + if 'id' in params or '-id' in params: + showids=True + showpos=False + elif 'pos' in params or '-pos' in params: + showids=False + showpos=True + elif 'null' in params or '-null' in params: + showids=False + showpos=False + else: + raise errs.ParamError(params) + return ['showupdate', showids, showpos, overrideshow] + + # SELECT + elif cmd=='select': + pass # now mouse click + + # MOVE + elif cmd=='move': + pass # now mouse drag + + # EXIT && BYE + elif cmd in ['bye', 'exit']: + pass # now ESC key + + # SHOP + elif cmd=='shop': + raise NotImplementedError() + + # RECO + elif cmd in ['reco', 'recognitors']: + raise NotImplementedError + + return [None] \ No newline at end of file diff --git a/core/commands.json b/core/commands.json index a5a946e..986e18a 100644 --- a/core/commands.json +++ b/core/commands.json @@ -8,16 +8,17 @@ "reset", "shop", "reco", - "recognitors" + "recognitors", + "smtp", "email" ], "cheatsheet": { "select": { "params": [ - "-m", - "--method" + "-id", + "-pos" ], "output": "seleziona un oggetto usando un metodo specifico", - "notes": "puoi selezionare per id o pos, id->botID, pos->x,y" + "notes": "puoi fra id, pos o null, scrittura: select -id ID oppure select -pos X,Y" }, "show": { "params": [ @@ -73,6 +74,14 @@ "params": [], "output": "entra nella base della reco squad", "notes": "scrivendo ad esempio 'reco call alex' reco resituir\u00c3\u00a0 l'output di call alex uscendo immediatamente dalla reco base" + }, + "smtp":{ + "params":[], + "output":"open the mailbox" + }, + "email":{ + "params":[], + "output":"open the mailbox" } } } \ No newline at end of file diff --git a/main.py b/main.py index 250c798..25ced4f 100644 --- a/main.py +++ b/main.py @@ -1,576 +1,220 @@ -import base64 import json -import os import random -import sys import time -import xml.etree.ElementTree as ET - -import core.Errors as errs -import core.PC -from core.Characters import Player, Robot -from core.PC import computer -from core.Recognition.botdata.graph import arts as botskins -from core.Recognition.botdata.graph import specs as botgraphs -from core.Shop import Shop -from core.utils import * -from core.utils.Colors import bcolors as css -import core.Recognition as reco -import core.Smtp as smtp + +import arcade +import arcade.gui +from arcade.gui import UIManager +from arcade.gui.ui_style import UIStyle + +from core.Characters import * +from core.Errors import * +from core.Utils import map_parser random.seed(time.time()) -# load screens -# no non me va piu bruh - -points={ - "win":10, - "kill":1 -} - -Box=smtp.MailBox() - -class Engine(): - def __init__(self, col=4, rows=5, enems=1, img='U', clr=css.OKBLUE): - tree=ET.parse('core/PC/config.xml') - root=tree.getroot() - for child in root[1]: - if child.tag=='points': - self.gamepoints=int(child.text); break - # map setup - self.columns=col - self.rows=rows - self.map=[['_' for _ in range(rows+1)] for _ in range(col+1)] - self.u=clr+img+css.ENDC - # match maker setup - self.robots=[Robot(self) for _ in range(enems)] - self.player=Player(col, rows, self) - self.robots.append(self.player) - # external objs setup - self.shop=Shop(self) - self.Team=reco.RecoSquad(self) - # graphic settings - self.showids=False - self.showpos=False - self.overrideshow=False - self.inbshell=False - self.inshop=False - self.inreco=False - - def run(self): - while True: - if not len(self.robots) or (len(self.robots)==1 and self.robots[0]==self.player): - self.win(); break - self.update_map() - # BSHELL LOOP - while self.inbshell: - try: - self.player.selected.BShell(input(css.OKCYAN+'[CMD]'+css.ENDC+css.OKGREEN+'[BSH]'+css.ENDC+' >> ')) - except IndexError: - print(css.FAIL+'[ERR]'+css.ENDC+' Missing a parameter.') - except Exception as e: - print(css.FAIL+'[ERR]'+css.ENDC,str(e)) - # SHOP LOOP - while self.inshop: - try: - self.shop.parser(self.gamepoints) - except IndexError: - print(css.FAIL+'[ERR]'+css.ENDC+' Missing a parameter') - # RECO LOOP - while self.inreco: - self.Team.parser(input(css.HEADER+'[RECO]'+css.ENDC+'>> '), self.player) - try: - if self.player.selected: - # BOT LOOP - self.player.selected.parser(input(css.OKGREEN+'[BOT]'+css.ENDC+css.OKCYAN+'[SCORE:{}]'.format(self.gamepoints)+css.ENDC+' -state:{}- >> '.format(self.player.selected.state))) - else: - # MAP LOOP - self.show_map() - self.parser(input(css.OKGREEN+'[MAP]'+css.ENDC+css.OKCYAN+'[SCORE:{}]'.format(self.gamepoints)+css.ENDC+' >> ')) # map parser - except errs.ParamError as e: - print(str(e)) - except errs.SameObjError as e: - print(str(e)) - except Exception as e: - print(str(e)); continue - - def parser(self, x): - cmd=x.split()[0].casefold() - params=x.split()[1:] - if '-h' in params: - self.docs(cmd) - return - - # HELP - if cmd=='help': - if not len(params): - print(css.HEADER+'[*]'+css.ENDC+' List of commands:') - [print(command) for command in json.loads(open('core/commands.json').read())['commands']] - else: - self.docs(params[0].casefold()) - - # SHOW - elif cmd=='show': - if '-a' in params: - self.overrideshow=True - if 'id' in params or '-id' in params: - self.showids=True - self.showpos=False - elif 'pos' in params or '-pos' in params: - self.showids=False - self.showpos=True - elif 'null' in params or '-null' in params: - self.showids=False - self.showpos=False - else: - raise errs.ParamError(params) - - # SELECT - elif cmd=='select': - if '-id' in params: - v=int(params[params.index('-id')+1]) - for bot in self.robots: - if bot.id==v: - if bot==self.player: - raise errs.SameObjError(bot, self.player) - return - if int(bot.pos[0])>=(int(self.player.pos[0])-self.player.action_range) and int(bot.pos[0])<=(int(self.player.pos[0])+self.player.action_range): - if int(bot.pos[1])>=(int(self.player.pos[1])-self.player.action_range) and int(bot.pos[1])<=(int(self.player.pos[1])+self.player.action_range): - self.player.selected=bot - else: - raise errs.ActionRangeError(bot) - else: - raise errs.ActionRangeError(bot) - elif '-pos' in params: - v=params[params.index('-pos')+1] - for bot in self.robots: - if bot.pos==[int(i) for i in v.split(',')]: - if int(bot.pos[0])>=(int(self.player.pos[0])-self.player.action_range) and int(bot.pos[0])<=(int(self.player.pos[0])+self.player.action_range): - if int(bot.pos[1])>=(int(self.player.pos[1])-self.player.action_range) and int(bot.pos[1])<=(int(self.player.pos[1])+self.player.action_range): - self.player.selected=bot - else: - raise errs.ActionRangeError(bot) - else: - raise errs.ActionRangeError(bot) - else: - raise errs.ParamError(params) - - # MOVE - elif cmd=='move': - self.player.move(params[0]) - - # EXIT && BYE - elif cmd in ['bye', 'exit']: - print('[?] Are you sure?') - c=getch() - if c in ['y','s']: - # accredita - #globals()['srcdata']['score']+=self.gamepoints - main() - elif c=='n': +ROW_COUNT = 15 +COLUMN_COUNT = 15 + +# This sets the WIDTH and HEIGHT of each grid location +WIDTH = 30 +HEIGHT = 30 + +# This sets the margin between each cell +# and on the edges of the screen. +MARGIN = 5 + +# Do the math to figure out our screen dimensions +SCREEN_WIDTH = (WIDTH + MARGIN) * COLUMN_COUNT + MARGIN +SCREEN_HEIGHT = (HEIGHT + MARGIN) * ROW_COUNT + MARGIN +SCREEN_TITLE = "Array Backed Grid Buffered Example" +SCREEN_WIDTH+=250 + +# Game settings r actually consts :( +enemiesNum=5 + +# DEFINE SOME COLORS +lockedRobotColor=arcade.color.RED +unlockedRobotColor=arcade.color.GREEN +PlayerColor=arcade.color.CYAN + +selectedbot=None + +# load commands +map_commands=json.loads(open('core/commands.json').read()) +bot_commands=json.loads(open('core/Characters/commands.json').read()) + +class MyGhostFlatButton(arcade.gui.UIGhostFlatButton): + """ + For this subclass, we create a custom init, that takes in another + parameter, the UI text box. We use that parameter and print the contents + of the text entry box when the ghost button is clicked. + """ + + def __init__(self, center_x, center_y, input_box): + super().__init__( + 'Send', + center_x=center_x, + center_y=center_y, + width=150, + height=51 + ) + self.input_box = input_box + + def on_click(self): + """ Called when user lets off button """ + print(f"Click ghost flat button. {self.input_box.text}") + if not self.input_box.text: return + cmd=self.input_box.text.split()[0].casefold() + params=self.input_box.text.split()[1:] + # TODO aggiungi dei catch generici per gestire gli errori che raisa. + if selectedbot: + if not cmd in bot_commands['commands']: + print(CommandNotFoundError(cmd)) return - else: - print(css.FAIL+'[ERR]'+css.ENDC+' Unrecognized key, back to game.') - - # SHOP - elif cmd=='shop': - self.inshop=True - if '-s' in params or '--show' in params: - pass - - # RECO - elif cmd in ['reco', 'recognitors']: - if not len(params): - self.Team.parser('',self.player) - else: - self.Team.parser(' '.join(params), self.player) - - # NOT FOUND + selectedbot.parser(cmd, params) else: - raise errs.CommandNotFoundError(cmd) + if not cmd in map_commands['commands']: + print(CommandNotFoundError(cmd)) + return + map_parser(cmd, params) + + +class GameView(arcade.View): + def __init__(self): + super().__init__() + + self.ui_manager = UIManager() + + # One dimensional list of all sprites in the two-dimensional sprite list + self.grid_sprite_list = arcade.SpriteList() + + # This will be a two-dimensional grid of sprites to mirror the two + # dimensional grid of numbers. This points to the SAME sprites that are + # in grid_sprite_list, just in a 2d manner. + self.grid_sprites = [] + # Create a list of solid-color sprites to represent each grid location + for row in range(COLUMN_COUNT): + self.grid_sprites.append([]) + for column in range(ROW_COUNT): + x = column * (WIDTH + MARGIN) + (WIDTH / 2 + MARGIN) + y = row * (HEIGHT + MARGIN) + (HEIGHT / 2 + MARGIN) + sprite = Tile() + sprite.center_x = x + sprite.center_y = y + self.grid_sprite_list.append(sprite) + self.grid_sprites[row].append(sprite) + # spawn bots + for _ in range(enemiesNum+1): + self.grid_sprites[random.randint(0,ROW_COUNT-1)][random.randint(0,COLUMN_COUNT-1)].to_robot() + self.grid_sprites[random.randint(0,ROW_COUNT-1)][random.randint(0,COLUMN_COUNT-1)].to_player() + + def setup(self): + self.ui_manager.purge_ui_elements() + + y_slot = self.window.height // 4 + left_column_x = self.window.width // 4 + right_column_x = 3 * self.window.width // 4 + + ui_input_box = arcade.gui.UIInputBox( + center_x=right_column_x+65, + center_y=y_slot * 3, + width=240 + ) + ui_input_box.text = 'type here.' + ui_input_box.cursor_index = len(ui_input_box.text) + self.ui_manager.add_ui_element(ui_input_box) + + self.button = MyGhostFlatButton( + center_x=right_column_x+65, + center_y=(y_slot * 2)+50, + input_box=ui_input_box + ) + self.button.set_style_attrs( + font_color=arcade.color.WHITE, + font_color_hover=arcade.color.WHITE, + font_color_press=arcade.color.WHITE, + bg_color=(51, 139, 57), + bg_color_hover=(51, 139, 57), + bg_color_press=(28, 71, 32), + border_color=(51, 139, 57), + border_color_hover=arcade.color.WHITE, + border_color_press=arcade.color.WHITE + ) + self.ui_manager.add_ui_element(self.button) + + self.OutputLabel= arcade.gui.UILabel( + '', + center_x=right_column_x+65, + center_y=(y_slot * 2)-25, + ) + self.ui_manager.add_ui_element(self.OutputLabel) + + def on_show(self): + arcade.set_background_color(arcade.color.BLACK) + + def on_draw(self): + arcade.start_render() + self.grid_sprite_list.draw() - def win(self): - self.gamepoints+=10 - cls_() - titles=[ - '__ _____ _ _ __ _____ _ _ \n\\ \\ / / _ \\| | | | \\ \\ / /_ _| \\ | |\n \\ V / | | | | | | \\ \\ /\\ / / | || \\| |\n | || |_| | |_| | \\ V V / | || |\\ |\n |_| \\___/ \\___/ \\_/\\_/ |___|_| \\_|\n \n', - ' \n# # # # # # # ### ### \n# # # # # # # # # # # \n # # # # # ### # # # \n # # # # # ### # # # \n # # ### # # ### # # \n' - ] - tree=ET.parse('core/PC/config.xml') - root=tree.getroot() - root[1][1]=int(root[1][1])+self.gamepoints - tree.write('core/PC/config.xml') - print(css.OKGREEN+random.choice(titles)+css.ENDC) - while True: - print('Do you want to start a new game? (y\\n)') - r=getch() - if r.lower()=='y': - main() - elif r.lower()=='n': - print('Exiting...') - time.sleep(1); exit(code=0) + def on_show_view(self): + self.setup() + arcade.set_background_color(arcade.color.BLACK) + + def on_mouse_press(self, x, y, button, modifiers): + """ + Called when the user presses a mouse button. + """ + # Change the x/y screen coordinates to grid coordinates + column = int(x // (WIDTH + MARGIN)) + row = int(y // (HEIGHT + MARGIN)) + + #print(f"Click coordinates: ({x}, {y}). Grid coordinates: ({row}, {column})") + + # Make sure we are on-grid. It is possible to click in the upper right + # corner in the margin and go to a grid location that doesn't exist + if row < ROW_COUNT and column < COLUMN_COUNT: + + # Flip the location between 1 and 0. + if self.grid_sprites[row][column].color == arcade.color.WHITE: + self.OutputLabel.text='no robot here!' + self.OutputLabel.color=arcade.color.RED + pass + #self.grid_sprites[row][column].color = arcade.color.GREEN else: - print('[ERR] Invalid Key',r,'.') - continue - - def update_map(self): - for y in range(len(self.map)): - for x in range(len(self.map[y])): - pos=[x,y]; done=False - for bot in self.robots: - if bot.pos==pos: - if bot.img=='P': - if self.overrideshow: - if self.showids: - self.map[y][x]=bot.id; done=True - elif self.showpos: - self.map[y][x]=','.join([str(p) for p in bot.pos]); done=True - else: - self.map[y][x]=bot.img; done=True - else: - self.map[y][x]=css.OKBLUE+self.u+css.ENDC; done=True - elif self.showids: - self.map[y][x]=bot.color+str(bot.id)+css.ENDC; done=True - elif self.showpos: - self.map[y][x]=bot.color+','.join([str(p) for p in bot.pos])+css.ENDC; done=True - else: - self.map[y][x]=bot.img; done=True - if not done: - self.map[y][x]='_' - self.overrideshow=False - return self.map + self.grid_sprites[row][column].on_tap() + if self.grid_sprites[row][column].isplayer: return + self.OutputLabel.text='' + globals()['selectedbot']=self.grid_sprites[row][column] + self.window.show_view(RobotView()) - def show_map(self): - for y in self.map: - for x in y: - print(x, end=' ') - print() + def on_key_press(self, symbol, modifiers): + if symbol == arcade.key.ENTER: + self.button.on_click() + +class RobotView(arcade.View): + def on_show(self): + arcade.set_background_color(arcade.color.BLACK) - def docs(self, man): - data=json.loads(open('core/commands.json').read()) - for key in data['cheatsheet'][man]: - print(key,'->',data['cheatsheet'][man][key]) - -def loadconfig(): - tree=ET.parse('core/PC/config.xml') - root=tree.getroot() - # game=0, account=1 - res={} - for child in root[0]: - if 'kwarg' in child.attrib.keys(): - if child.attrib['kwarg']=='clr': - res.update({child.attrib['kwarg']:css.__dict__[child.text.upper()]}) - continue - elif child.attrib['kwarg']=='img': - res.update({child.attrib['kwarg']:child.text}) - continue - res.update({child.attrib['kwarg']:int(child.text)}) - return res - - -def main(*oth): - if not oth: - print(" _____ _ _ \n| ___| |____ _____| | __\n| |_ | '_ \\ \\ / / __| |/ /\n| _| | | | \\ V / (__| < \n|_| |_| |_|\\_/ \\___|_|\\_\\\n version: 0.1alpha \n") - print('\n\t'+css.OKGREEN+'NEW GAME [1]'+css.ENDC+'\n\t'+css.WARNING+'CUSTOMIZE [2]'+css.ENDC+'\n\t'+css.FAIL+'EXIT [0]'+css.ENDC) - ch=getch() - if ch=='1': - cls_() - game=Engine(**loadconfig()) - game.run() - elif ch=='2': - pass - elif ch in ['3','0']: - print('[*] Exiting...') - exit() - else: - print(*oth) - - x=input('\n\n$[MAIN] >> ') - if not x: main('no command given.') - cmd=x.split()[0].casefold() - params=x.split()[1:] - cls_() - if cmd in ['.start','start']: - game=Engine() - game.run() - - elif cmd in ['./mypc', 'pc', '.pc', 'mypc', '.mypc']: - computer().run() - cls_(); main() - - elif cmd in ['exit', 'bye']: - print('[*] Exiting...') - main() + def on_draw(self): + global selectedbot + arcade.start_render() + for name, val in selectedbot.kernel.__dict__.items(): + if len(str(val))>6: continue + arcade.draw_text(name+': '+str(val), (SCREEN_WIDTH/6)-30, SCREEN_HEIGHT-(60+(35*list(selectedbot.kernel.__dict__.keys()).index(name))), + arcade.color.YELLOW, font_size=18, anchor_x="center") # variable - elif cmd=='help': - main('startup info utility [v-0.1alpha]\ncommands:\n\nstart -> launch the game\nmypc -> read or change settings\nbye -> exit the game\n\n') - - else: - main('[ERR] Unrecognized command:',cmd) - -def intro(): - print('Hey, looks like u r new here! choose a language:\n[1] IT - italian\n[2] EN - english\n') - c=getch() - if c=='1': - lang='it' - elif c=='2': - print('metto comunque ita perchè non ho sbatti di tradurre tutto :o') - lang='it' - else: - print('invalid choose.') - intro() - if lang=='it': - cls_() - print("Benvenuto, io sono l'ex comandante di questa base. da adesso comanderai tu questo posto, ma prima dimmi, come ti chiami?\n") - usrname=input() - print('\nPerfetto, dammi un attimo di tempo per sistemare il tuo chip') - chargebar('updating...') - chargebar('checking...') - chargebar('installing...') - print('Fantastico! adesso il tuo chip personale è settato per te. grazie a questo chip potrai comprare dal negozio ed essere riconosciuto online.') - print('non puoi leggere il chip direttamente ma il tuo computer può farlo, ti porto subito a vedere come.') - print('premi un tasto qualsiasi per continuare.'); getch() - chargebar('Entering the pc...') - cls_() - spaces={ - 's1':' '*37, - 's2':' '*37, - 's3':' '*37, - 's4':' '*37 - } - print(core.PC.emptyscreen.format(' ',' ',' ',' ', **spaces, main='C:\> your pc!', mainspace=' '*26)) - print('\nQuesto è il tuo computer, da qui puoi vedere tutte le cose che sono scritte nel tuo chip e anche modificarne alcune.') - print('il tuo computer puo anche modificare le impostazioni della partita come ad esempio le dimensioni della mappa') - print('ovviamente il computer accetta dei comandi per poter compiere lazione richiesta ma quali? andiamo a vederlo ora.') - print('premi un tasto qualsiasi per continuare.'); getch() - chargebar('getting back...') - cls_() - print('qualsiasi comando qui segue una sintassi di base chiamata STDSYX o comunemente SYX, questo nome significa STANDARD SYNTAX.') - print('avendo un certo comando "cmd" per lanciarlo (eseguirlo) scriviamo\n'+css.BOLD+'cmd'+css.ENDC+'\nquesto eseguira cmd.') - print('prendiamo come esempio il comando "show" che mostra qualcosa sulla mappa e ammettiamo di voler mostrare gli id, come facciamo a dire') - print('a show di mostrare proprio gli id? show ha una scrittura semplificata per cui basterà scrivere:\n'+css.BOLD+'show id'+css.ENDC) - print('ma se volessimo seguire la syx scriveremmo:\n'+css.BOLD+'show -e id'+css.ENDC+'\n'+"cos'è cambiato? la syx prevede questo tipo di scrittura:") - print(css.BOLD+'cmd -var val'+css.ENDC+'\nper eseguire cmd con var=val, prima infatti abbiamo eseguito show con e=id (e sta per element)') - print('premi un tasto per continuare..') - getch() - chargebar('Exiting base...') - chargebar('Entering fight camp...') - cls_() - print('purtroppo la pace è finita e siamo costretti a respingere i Robot che tentano di distruggere la base, per fermarli cè un solo modo, distruggerli') - print('tutti, uno per uno. la tua base ha una squadra di ricognizione che da tempo studia questi Robot assalitori e ha scoperto delle cose di vitale importanza.') - print('ti mostro subito lo schema di un robot:') - chargebar('gaining informations...') - bot_introspection=ET.parse('core/Recognition/botdata/bot.xml').getroot() - def goto1(): - cls_() - print(botskins[0]) - print("\nQuesta è la struttura di un Robot standard, premi il numero corrispondente per effettuare l'introspezione di quel punto, 0 per continuare") - r=getch() - if r=='0': - return - elif r=='1': - # head - cls_() - print(botgraphs['head']) - print('\nDa qui il robot può osservare i tuoi spostamenti sulla mappa, al suo interno ci sono i convertitori che andranno a contattare la scheda') - print("all'interno del body. quando hackeri un robot vai a disabilitare queste connessioni così da spegnere i suoi sistemi di sicurezza.") - print('press any key.'); getch() - goto1() - elif r=='2': - # body - cls_() - print(botgraphs['body']) - print('\nQuesta è la scheda che viene contattata dalla head quando un qualsiasi comando sta per essere eseguito. se questo comando viene giudicato') - print('pericoloso viene inviato un segnale alla head ordinando di bloccare il comando, interrompendo quindi lesecuzione di comandi come shutdown. ') - print('qui sono presenti le porte da cui il Robot contatta gli altri bot e il suo stesso sistema di sicurezza, e questo il punto che devi colpire per primo.') - print('press any key.'); getch() - goto1() - elif r=='3': - # legs - cls_() - print(botgraphs['legs']) - print('\nQuesto sistema è usato dal Robot per spostarsi sulla mappa, il range di spostamento del robot dipende dalla lunghezza delle gambe,') - print('più le gambe sono corte e minore sarà il range di azione, puoi controllare questo sistema solo dalla bshell.'); getch() - goto1() - elif r=='4': - # cannons - cls_() - print(botgraphs['cannons']) - print('\niI nostri ricognitori sono riusciti a disabilitare questo sistema di attacco su tutti i Robot ma si vocifera la costruzione di alcuni robot') - print('capaci di ignorare il nostro blocco e attaccare ugualmente, ma attualmente è solo una voce.') - print('press any key.'); getch() - goto1() - else: - print('Invalid value.') - print('press any key.'); getch() - goto1() - goto1() - cls_() - print('Bene, ora che hai un idea sul funzionamento dei Robot possiamo vedere COME attaccarne uno.') - print('press any key.'); getch() - cls_() - def goto2(text=None): - cls_() - fmap=lambda x: print() if x==5 else print('_', end=' ') - [[fmap(i) for i in range(0,6)] for _ in range(0,5)] - print('\nQuesta è la mappa, qui puoi vedere te, i robot e i punti in cui entrambi potete spostarvi. ogni posizione è chiamata "tile"') - print('un tile vuoto viene indicato con un underscore ("_") mentre un tile occupato prende di norma limmagine del carattere che la occupa.') - print('un robot ha la lettera R come immagine, rossa se il robot è bloccato, verde se è gia sbloccato o stato hackerato. tu sei rappresentato con una U blu.') - print('in questa schermata come in qualsiasi altra abbiamo SICURAMENTE disponibile il comando help, quindi proviamo a scrivere "help":') - if text: print(text) - x=input(css.OKGREEN+'[MAP]'+css.ENDC+css.OKCYAN+'[SCORE:{}]'.format('0')+css.ENDC+' >> ') - if not x.casefold()=='help': - goto2(str(errs.CommandNotFoundError(x))) - print(css.HEADER+'[*]'+css.ENDC+' List of commands:') - [print(command) for command in json.loads(open('core/commands.json').read())['commands']] - print("\nCome vedi help restituisce una lista dei comandi ma senza spiegarne la sintassi ne l'utilizzo, come facciamo?") - print("grazie alla syx sappiamo che ogni comando ha (fortunatamente) il parametro -h che se specificato mostra la documentazione del comando.") - print('senza leggere tutte le documentazioni possiamo farci un idea di come funzioni un comando solo dal nome, ad esempio show.') - print('show serve a modificare la vista della mappa, la sua sintassi è:\n'+css.OKGREEN+'>'+css.ENDC+css.BOLD+' show id||pos -a'+css.ENDC) - print('id||pos significa id OR pos, quindi una delle due possibilità (in realtà possiamo scrivere show null per tornare ala vista di default)') - print('se -a (a sta per "all") viene specificato allora mostra anche i dati del player (i tuoi) oltre che dei nemici.') - print('un altro comando importantissimo è select che serve, come suggerisce il nome, a selezionare un robot dalla mappa. questo comando ci mette') - print('in comunicazione con la head, la parte che credo tu abbia visto durante l introspezione di un robot. vediamo la sintassi di select.') - print(css.OKGREEN+'> '+css.ENDC+css.BOLD+'select -id||-pos value'+css.ENDC+'\n-id or -pos serve a dichiarare quale tipo di valore stiamo per inserire e value') - print('è proprio questo valore. se vogliamo selezionare il bot con id=52 scriveremo "select -id 52", se invece vogliamo usare la posizione di un robot con x=3 e y=4 scriviamo') - print('"select -pos 3,4". la cosa importante da notare è che x,y vada scritto senza spazi altrimenti non verrà riconosciuto.') - print('la domanda che viene spontanea è dove prendiamo i valori di cui necessitiamo? sarà la mappa a fornirceli, con show id vediamo tutti gli id, ne scegliamo uno e poi') - print('con "select -id IDSCELTO" usiamo IDSCELTO per far capire alla mappa quale bot intendiamo.','\npress any key'); getch() - cls_() - print('adesso con select abbiamo selezionato un Robot e siamo nella sua head. cosa fare? per vincere un combattimento dobbiamo distruggere tutti i robot quindi') - print('spegniamoli tutti. attualmente non hai tanti strumenti a disposizione, puoi comprarli dallo shop ma fino a quel momento dovrai farti bastare questi che hai già.') - print('tornando a noi, lo schema da seguire per distruggere un Robot è:\n1. bypassare una porta\n2. usare la porta per hackerarlo\n3. spegnerlo') - print("andiamo in ordine, per bypassare una porta dobbiamo:\n1. ottenere il suo hash\n2. decodificarlo\n3. usare l'hash decodificato per bypassarla") - print('quindi prima di tutto otteniamo il suo hash, come? il comando hash serve proprio a questo. scrivi "hash" per vedere tutte le porte con il relativo hash:') - def goto3(): - x=input(css.OKGREEN+'[MAP]'+css.ENDC+css.OKCYAN+'[SCORE:{}]'.format('0')+css.ENDC+' >> ') - if not x.casefold()=='hash': - print(str(errs.CommandNotFoundError(x))) - goto3() - hashes={'80':'aGFzaDE=','443':'Mmhhc2g='} - print(css.HEADER+'hashes:'+css.ENDC) - [print(css.OKCYAN+'[HASH]'+css.ENDC,key,hashes[key]) for key in hashes.keys()] # FIXME scrive tre volte "hashes:\nport hash\nport hash" # si è fixato da solo wtf - goto3() - print('\nQui trovi gli hash scritti "porta hash", copiane uno ("=" incluso) e passiamo al prossimo step.'); getch() - cls_() - def goto4(): - choosedport='80' - print('adesso che abbiamo un hash dobbiamo decodificarlo. per farlo usiamo decoder. la sua sintassi è:\n'+css.OKGREEN+'> '+css.ENDC+'decoder -text testo') - print("questo decodificherà 'testo' quindi andiamo a sostituire testo con il nostro hash. ora"+' "decoder -text incolla_qui"') - print("P.S. se ti fossi dimenticato di copiare il valore o lo avessi perso puoi usare questo:\naGFzaDE=\nche è l'hash della porta 80.") - x=input(css.OKGREEN+'[MAP]'+css.ENDC+css.OKCYAN+'[SCORE:{}]'.format('0')+css.ENDC+' >> ') - if x.casefold().split()[0]=='decoder' and x.casefold().split()[1]=='-text' and x.split()[2] in ['aGFzaDE=','Mmhhc2g=']: - if x.split()[2]=='aGFzaDE=': - choosedport='80' - else: - choosedport='443' - print(css.HEADER+'[*]'+css.ENDC+' Decoded text: '+css.OKBLUE, base64.b64decode(x.split()[2]).decode(),css.ENDC) - return choosedport - else: - print('Invalid syntax.'); return goto4() - choosedport=goto4() - print('\nDecoder ha restituito la versione decifrata del tuo testo. adesso usa questa versione decifrata per bypassare una porta.') - print('usiamo lo stesso comando di prima, hash. la sua sintassi è\n'+css.OKGREEN+'> '+css.ENDC+'hash -port p -res decodedhash\nnoi prima abbiamo scritto hash e basta,') - print('questo mostra tutte le porte con relativi hash, se avessimo specificato una porta avrebbe mostrato solo quella porta specificata.') - print('-res è opzionale come port, se specificato invece di mostrare gli hash ne usa uno per sbloccare una porta specificata. esempio:') - print("hash -res abcde -port 80\nusa abcde per sbloccare la porta 80, al posto di abcde dobbiamo inserire la versione decifrata dell'hash della porta 80") - print("se hai decifrato l'hash della porta 80 scrivi:\nhash -res incolla_qui -port 80\nse quello della 443:\nhash -res incolla_qui -port 443") - print('non dimenticare di sostituire incolla_qui con il risultato di decoder! proviamo:') - def goto5(): - x=input(css.OKGREEN+'[MAP]'+css.ENDC+css.OKCYAN+'[SCORE:{}]'.format('0')+css.ENDC+' >> ') - ths=x.casefold().split() - if ths[0]=='hash' and ths[1]=='-res' and ths[2] in ['hash1', '2hash'] and ths[3]=='-port' and ths[4] in ['80', '443']: - if (ths[2]=='hash1' and ths[4]=='80') or (ths[2]=='2hash' and ths[2]=='443'): - print(css.HEADER+'[*]'+css.ENDC+' Port {p} Successfully bypassed.'.format(p=ths[4])) - else: - print('cannot bypass, hash incorrect for this port.'); goto5() - else: - print('Invalid syntax.'); goto5() - goto5(); getch() - cls_() - print('Perfetto! hai appena bypassato una porta per la prima volta, adesso hai fatto il 90%% del lavoro. il nostro obiettivo è quello di spegnere un robot quindi procediamo.') - print('il prossimo comando da usare è hack. questo usa una porta sbloccata per disabilitare i sistemi di sicurezza del robot. la sua sintassi è:\nhack -port p') - print('ammettendo che p sia il numero di una porta sbloccata. adesso usiamolo per disabilitare i sistemi di questo bot, scrivi:\nhack -port portascelta') - print('sostituendo portascelta con la porta dalla quale avevi copiato gli hash, nel nostro caso {}'.format(choosedport)) - print('proviamo quindi ad hackerare il robot usando la porta sbloccata:') - def goto6(): - x=input(css.OKGREEN+'[MAP]'+css.ENDC+css.OKCYAN+'[SCORE:{}]'.format('0')+css.ENDC+' >> ') - try: - if x.split()[0].casefold()=='hack' and x.split()[1]=='-port' and x.split()[2] in ['80','443']: - if not str(x.split()[2])==str(choosedport): - print(errs.HackError()); goto6() - else: - print(css.OKCYAN+'[..]'+css.ENDC+' Hacking on port:',choosedport) - time.sleep(0.5) - print(css.OKCYAN+'[*]'+css.ENDC+css.OKGREEN+' Successfully hacked.'+css.ENDC) - else: - print('command or syntax r invalid, or maybe the port is incorrect!') - goto6() - except: - print('an error has occured.') - goto6() - goto6() - print('\nhai correttamente hackerato il robot! adesso non ha più i sistemi di sicurezza abilitati e nulla ci impedirà di distruggerlo.') - print('il prossimo comando è destroy che non ha parametri ne nulla, basta scrivere destroy (o shutdown, stesso comando ma diverso nome)') - print('proviamo:') - def goto7(): - x=input(css.OKGREEN+'[MAP]'+css.ENDC+css.OKCYAN+'[SCORE:{}]'.format('0')+css.ENDC+' >> ') - if x.casefold() in ['destroy', 'shutdown']: - print(css.FAIL+'[..]'+css.ENDC+' Self-Destruction Enabled..') - time.sleep(0.4) - print(css.HEADER+'[*]'+css.ENDC+' Bot killed.') - else: - print('puoi scrivere solo shutdown o destroy.') - goto7() - goto7() - print('\nWOOOOHOOOO, hai ucciso il tuo primo robot, come crescono in fretta *lacrimuccia*.') - print('da adesso le cose si faranno più difficili, a differenza di adesso avrai carta bianca e potrai eseguire ogni comando quando vorrai') - print('sempre ammesso che funzionerà :)') - print('potrai ripetere il tutorial quando vorrai, basta scrivere "tutorial -repeat" nella schermata home.') - - goto2() - - - return { - "username":usrname, - "points":"0", - "wins":"0", - "kills":"0" - } - - -# check if is the first launch -if not 'config.xml' in os.listdir('core/PC/'): - root=ET.Element('SETTINGS') - # game settings - game=ET.SubElement(root,'game') - # enemies number - enems=ET.SubElement(game, 'lvl1_enemies') - enems.attrib['kwarg']='enems'; enems.text='3' - # skin img - skimg=ET.SubElement(game, 'skin_img') - skimg.attrib['kwarg']='img'; skimg.text='U' - # skin clr - skclr=ET.SubElement(game, 'skin_clr') - skclr.attrib['kwarg']='clr'; skclr.text='okblue' - # columns - cols=ET.SubElement(game, 'map_columns') - cols.attrib['kwarg']='col'; cols.text='4' - # rows - rws=ET.SubElement(game, 'map_rows') - rws.attrib['kwarg']='rows'; rws.text='5' - # GET INFO FROM THE INTRO - data=intro() # FIXME wtf dopo un introduzione non scrive il file xml e ricomincia. - # boh eseguita nella shell di debug funziona, non so proprio cosa dire.. - account=ET.SubElement(root, 'account') - for k, v in data.items(): - nsv=ET.SubElement(account, k) - nsv.text=v - # write - tree = ET.ElementTree(root) - tree.write('core/PC/config.xml') - -#main() -Box.render('*') -Box.new_mail('sto cazzo', 'greatings', 'how r you bro?') -Box.render('*') \ No newline at end of file + def on_mouse_press(self, x, y, button, modifiers): + #self.window.show_view(game) + pass + + def on_key_press(self, symbol, modifiers): + if symbol == arcade.key.ESCAPE: + self.window.show_view(game) + elif symbol == arcade.key.ENTER: + game.button.on_click() + +window=arcade.Window(SCREEN_WIDTH, SCREEN_HEIGHT, 'Camillettss') +game=GameView() +window.show_view(game) +arcade.run()