#!/usr/bin/env python
#This file is part of ASC.
#    ASC is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.

#    ASC is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.

#    You should have received a copy of the GNU General Public License
#    along with ASC.  If not, see <http://www.gnu.org/licenses/>.

# This will be exec()ed by the python interpreter at runtime.

# Documentation for writing this table was taken from Jambo51's tool
# [(a[0][0] if a else (), [l[0] for l in b], [l[0] for l in c]) for a,b,c in
#  [(list(c.execute('SELECT name FROM commands where id=%d' % i)),
#    list(c.execute('SELECT length FROM parameterlengths where id=%d' % i)),
#    list(c.execute('SELECT name FROM parameternames where id=%d' % i))) for i in range(238)]]

({name.lower(): (lambda e, offset: dict({'offset': [(offset.index(True), "script")]}, **e)
         if True in offset else e)(
    {"hex": num, "args": (', '.join(desc), tuple(lens))},
    [arg.lower().find('addr') != -1 for arg in desc]) for
 num, (name, lens, desc) in enumerate(
[('attackcanceler', [], []),
 ('accuracycheck', [4, 2], ['rom address', 'unknown']),
 ('attackstring', [], []),
 ('ppreduce', [], []),
 ('critcalc', [], []),
 ('cmd5', [], []),
 ('cmd6', [], []),
 ('cmd7', [], []),
 ('cmd8', [], []),
 ('attackanimation', [], []),
 ('waitanimation', [], []),
 ('graphicalhpupdate', [1], ['bank']),
 ('datahpupdate', [1], ['bank']),
 ('critmessage', [], []),
 ('missmessage', [], []),
 ('resultmessage', [], []),
 ('printstring', [2], ['message id']),
 ('printstring2', [2], ['message id']),
 ('waitmessage', [2], ['wait duration (0x40 = 1 second)']),
 ('printfromtable', [4], ['table location']),
 ('printfromtable2', [4], ['table location']),
 ('seteffectwithchancetarget', [], []),
 ('seteffecttarget', [], []),
 ('seteffectuser', [], []),
 ('clearstatus', [1], ['bank']),
 ('faintpokemon', [1, 1, 4], ['unknown', 'unknown', 'add_ress']), # not to decompile
 ('cmd1a', [1], ['unknown']),
 ((), [], []),
 ('jumpifstatus', [1, 4, 4], ['bank', 'status', 'rom address']),
 ('jumpifsecondarystatus', [1, 4, 4], ['bank', 'status', 'rom address']),
 ('jumpifability', [1, 1, 4], ['bank', 'ability', 'rom address']),
 ('jumpifhalverset', [1, 2, 4], ['bank', 'status', 'rom address']),
 ('jumpifstat',
  [1, 1, 1, 1, 4],
  ['bank', 'if flag', 'quantity', 'stat id', 'rom address']),
 ('jumpifspecialstatusflag',
  [1, 4, 1, 4],
  ['bank', 'word to and', 'set status', 'rom address']),
 ('JUMPIFTYPE', [1, 1, 4], ['Bank', 'Type', 'ROM Address to jump to if true']),
 ((), [], []),
 ((), [], []),
 ('CMD25', [], []),
 ((), [], []),
 ('CMD27', [4], ['ROM Address']),
 ('GOTO', [4], ['ROM Address']),
 ('JUMPIFBYTE',
  [1, 4, 1, 4],
  ['If Flag',
   'Address to check',
   'Byte to compare',
   'ROM Address to jump to if true']),
 ('JUMPIFHALFWORD',
  [1, 4, 2, 4],
  ['If Flag',
   'Address to check',
   'Half-Word to Compare',
   'ROM Address to jump to if true']),
 ('JUMPIFWORD',
  [1, 4, 4, 4],
  ['If Flag',
   'Address to check',
   'Word to Compare',
   'ROM Address to jump to if true']),
 ('JUMPIFARRAYEQUAL',
  [4, 4, 1, 4],
  ['Memory Pointer 1',
   'Memory Pointer 2',
   'Size of Array',
   'ROM Address to Jump to if true']),
 ('JUMPIFARRAYNOTEQUAL',
  [4, 4, 1, 4],
  ['Memory Pointer 1',
   'Memory Pointer 2',
   'Size of Array',
   'ROM Address to Jump to if true']),
 ('SETBYTE', [4, 1], ['Memory Pointer', 'Value']),
 ('ADDBYTE', [4, 1], ['Memory Pointer', 'Value']),
 ('SUBTRACTBYTE', [4, 1], ['Memory Pointer', 'Value']),
 ('COPYARRAY',
  [4, 4, 1],
  ['Memory Pointer (Destination)',
   'Memory Pointer (Source)',
   'Size of Array']),
 ((), [], []),
 ('ORBYTE', [4, 1], ['Memory Pointer', 'Value']),
 ('ORHALFWORD', [4, 2], ['Memory Pointer', 'Value']),
 ('ORWORD', [4, 4], ['Memory Pointer', 'Value']),
 ('BICBYTE', [4, 1], ['Memory Pointer', 'Value']),
 ('BICHALFWORD', [4, 2], ['Memory Pointer', 'Value']),
 ('BICWORD', [4, 4], ['Memory Pointer', 'Value']),
 ('PAUSE', [2], ['Wait Duration (0x40 = 1 Second)']),
 ('WAITSTATE', [], []),
 ((), [], []),
 ('RETURN', [], []),
 ('END', [], []),
 ('END2', [], []),
 ('END3', [], []),
 ((), [], []),
 ('CALL', [4], ['ROM Address']),
 ('JUMPIFTYPE2',
  [1, 1, 4],
  ['Bank', 'Type', 'ROM Address to jump to if true']),
 ('JUMPIFABILITYPRESENT',
  [1, 4],
  ['Ability', 'ROM Address to jump to if true']),
 ((), [], []),
 ('PLAYANIMATION', [1, 1, 4], ['Bank', 'Animation', 'Word']),
 ('CMD46', [], []),
 ('CMD47', [], []),
 ('PLAYSTATCHANGEANIMATION', [1, 1, 1], ['Bank', 'Colour', 'Byte']),
 ('CMD49', [1, 1], ['Byte', 'Byte']),
 ('DAMAGECALC2', [], []),
 ('CMD4B', [], []),
 ('SWITCH1', [1], ['Bank']),
 ('SWITCH2', [1], ['Bank']),
 ('SWITCH3', [1, 1], ['Bank', 'Unknown Byte']),
 ('JUMPIFCANNOTSWITCH', [1, 4], ['Bank', 'ROM Address To Jump To']),
 ('OPENPARTYSCREEN', [1, 4], ['Bank', 'ROM Address to Jump to']),
 ('CMD51', [1, 1], ['Bank', 'Unknown Byte']),
 ('CMD52', [1], ['Bank']),
 ('CMD53', [1], ['Bank']),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ('CMD58', [1], ['Bank']),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ('CMD5C', [1], ['Bank']),
 ('CMD5D', [4], ['ROM Address']),
 ((), [], []),
 ((), [], []),
 ('CMD60', [1], ['Unknown Byte']),
 ((), [], []),
 ((), [], []),
 ('JUMPTOATTACK', [1], ['Bank']),
 ('STATUSANIMATION', [1], ['Bank']),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ((), [], []),
 ('CMD73', [1], ['Bank']),
 ((), [], []),
 ((), [], []),
 ('CMD76', [1, 1], ['Bank', 'Unknown Parameter']),
 ('SETPROTECT', [], []),
 ('FAINTIFABILITYNOTDAMP', [], []),
 ('SETUSERHPTOZERO', [], []),
 ('JUMPWHILETARGETVALID', [4], ['ROM Address']),
 ('SETDAMAGEASRESTOREHALFMAXHP', [4, 1], ['ROM Address', 'Byte']),
 ('JUMPTOLASTUSEDATTACK', [], []),
 ('SETRAIN', [], []),
 ('SETREFLECT', [], []),
 ('SETLEECHSEED', [], []),
 ('MANIPULATEDAMAGE', [1], ['Effect ID']),
 ('SETREST', [4], ['ROM Address']),
 ('JUMPIFNOTFIRSTTURN', [4], ['ROM Address']),
 ((), [], []),
 ('JUMPIFCANNOTSLEEP', [4], ['ROM Address']),
 ('STOCKPILE', [], []),
 ('STOCKPILETOBASEDAMAGE', [4], ['ROM Address']),
 ('STOCKPILETOHPRECOVERY', [4], ['ROM Address']),
 ('NEGATIVEDAMAGE', [], []),
 ('STATBUFFCHANGE', [1, 1, 4], ['Target', 'Can Fail', 'ROM Address']),
 ('NORMALISEBUFFS', [], []),
 ('SETBIDE', [], []),
 ('CONFUSEIFREPEATINGATTACKENDS', [], []),
 ('SETLOOPCOUNTER', [1], ['Number of Loops']),
 ('CMD8E', [], []),
 ('FORCERANDOMSWITCH', [4], ['ROM Address']),
 ('CHANGETYPESTOENEMYATTACKTYPE', [4], ['ROM Address']),
 ('GIVEMONEY', [], []),
 ('SETLIGHTSCREEN', [], []),
 ((), [], []),
 ('GETHALFCURRENTENEMYHP', [], []),
 ('SETSANDSTORM', [], []),
 ('WEATHERDAMAGE', [], []),
 ('TRYINFATUATETARGET', [4], ['ROM Address']),
 ((), [], []),
 ('SETMISTEFFECT', [], []),
 ('SETINCREASEDCRITICALCHANCE', [], []),
 ('TRANSFORMDATAEXECUTION', [], []),
 ('SETSUBSTITUTEEFFECT', [], []),
 ('COPYATTACK', [4], ['ROM Address']),
 ('METRONOMEEFFECT', [], []),
 ('NIGHTSHADEDAMAGEEFFECT', [], []),
 ('PSYWAVEDAMAGEEFFECT', [], []),
 ('COUNTERDAMAGECALCULATOR', [4], ['ROM Address']),
 ('MIRRORCOATDAMAGECALCULATOR', [4], ['ROM Address']),
 ('DISABLELASTUSEDATTACK', [4], ['ROM Address']),
 ('SETENCORE', [4], ['ROM Address']),
 ('PAINSPLITDAMAGECALCULATOR', [4], ['ROM Address']),
 ('SETTYPETORANDOMRESISTANCE', [4], ['ROM Address']),
 ('SETALWAYSHITFLAG', [], []),
 ('COPYMOVEPERMANENTLY', [4], ['ROM Address']),
 ('SELECTRANDOMMOVEFROMUSERMOVES', [4], ['ROM Address']),
 ('DESTINYBONDEFFECT', [], []),
 ((), [], []),
 ('REMAININGHPTOPOWER', [], []),
 ('REDUCEPPRANDOM', [4], ['ROM Address']),
 ('CLEARSTATUSIFNOTSOUNDPROOFED', [], []),
 ('CURSETARGET', [4], ['ROM Address']),
 ('SETSPIKES', [4], ['ROM Address']),
 ('SETFORESIGHT', [], []),
 ('SETPERISHSONG', [4], ['ROM Address']),
 ('ROLLOUTDAMAGECALCULATION', [], []),
 ('JUMPIFCONFUSEDANDATTACKMAXED', [1, 4], ['Bank', 'ROM Address if true']),
 ('FURYCUTTERDAMAGECALCULATION', [], []),
 ('HAPPINESSTODAMAGECALCULATION', [], []),
 ('PRESENTDAMAGECALCULATION', [], []),
 ('SETSAFEGUARD', [], []),
 ('MAGNITUDEDAMAGECALCULATION', [], []),
 ((), [], []),
 ('SETSUNNY', [], []),
 ('MAXATTACKHALVEHP', [4], ['ROM Address']),
 ('COPYFOESTATS', [4], ['ROM Address']),
 ('BREAKFREE', [], []),
 ('SETCURLED', [], []),
 ('RECOVERBASEDONSUNLIGHT', [], []),
 ('HIDDENPOWERDAMAGECALCULATION', [], []),
 ('SELECTNEXTTARGET', [], []),
 ('SETFUTUREATTACK', [4], ['ROM Address']),
 ((), [], []),
 ('HIDEPREATTACK', [], []),
 ('UNHIDEPOSTATTACK', [], []),
 ('SETMINIMIZE', [], []),
 ('SETHAIL', [], []),
 ('JUMPIFATTACKANDSPECIALATTACKCANNOTFALL', [4], ['ROM Address']),
 ('SETFORCEDTARGET', [], []),
 ('SETCHARGE', [], []),
 ('CALLTERRAINATTACK', [], []),
 ('CUREIFBURNEDPARALYSEDORPOISONED', [4], ['ROM Address']),
 ('SETTORMENT', [4], ['ROM Address']),
 ('JUMPIFNODAMAGE', [4], ['ROM Address']),
 ('SETTAUNT', [4], ['ROM Address']),
 ('SETHELPINGHAND', [4], ['ROM Address if failed']),
 ('ITEMSWAP', [4], ['ROM Address']),
 ('COPYABILITY', [4], ['ROM Address']),
 ((), [], []),
 ('SETROOTS', [4], ['ROM Address']),
 ('DOUBLEDAMAGEDEALTIFDAMAGED', [], []),
 ('SETYAWN', [4], ['ROM Address']),
 ('SETDAMAGETOHEALTHDIFFERENCE', [4], ['ROM Address']),
 ('SCALEDAMAGEBYHEALTHRATIO', [], []),
 ('ABILITYSWAP', [4], ['ROM Address']),
 ('IMPRISONEFFECT', [4], ['ROM Address']),
 ('SETGRUDGE', [4], ['ROM Address']),
 ('WEIGHTDAMAGECALCULATION', [], []),
 ('ASISTATTACKSELECT', [4], ['ROM Address']),
 ('SETMAGICCOAT', [4], ['ROM Address']),
 ('SETSTEALSTATCHANGE', [4], ['ROM Address']),
 ((), [], []),
 ('CMDE2', [1], ['Bank']),
 ('JUMPIFFAINTED', [1, 4], ['Bank', 'ROM Address if true']),
 ((), [], []),
 ('PICKUPITEMCALCULATION', [], []),
 ((), [], []),
 ((), [], []),
 ('SETTYPEBASEDHALVERS', [4], ['ROM Address']),
 ('SETEFFECTBYWEATHER', [], []),
 ('RECYCLEITEM', [4], ['ROM Address']),
 ('SETTYPETOTERRAIN', [4], ['ROM Address']),
 ((), [], []),
 ((), [], [])]
 ) if name},
{'jump': 'goto'},
('goto',
 'return',
 'end',
 'end2',
 'end3',
 'forcerandomswitch'))
