Downloads containing jtrack.j2as

Downloads
Name Author Game Mode Rating
TSF with JJ2+ Only: JazzTrackFeatured Download szmol96 Custom / Concept 8.9 Download file

File preview

#pragma name "JazzTrack"
#pragma require "jtrack.j2a"

//Script by szmol96

uint customAnimID = 0;

const array<SOUND::Sample> samples = {SOUND::AMMO_BLUB1, SOUND::AMMO_BLUB1, SOUND::AMMO_BLUB2, SOUND::AMMO_BMP1, SOUND::AMMO_BMP2, SOUND::AMMO_BMP3, SOUND::AMMO_BMP4, SOUND::AMMO_BMP5, SOUND::AMMO_BMP6, SOUND::AMMO_BOEM1, SOUND::AMMO_BUL1, SOUND::AMMO_BULFL1, SOUND::AMMO_BULFL2, SOUND::AMMO_BULFL3, SOUND::AMMO_FIREGUN1A, SOUND::AMMO_FIREGUN2A, SOUND::AMMO_FUMP, SOUND::AMMO_GUN1, SOUND::AMMO_GUN2, SOUND::AMMO_GUN3PLOP, SOUND::AMMO_GUNFLP, SOUND::AMMO_GUNFLP1, SOUND::AMMO_GUNFLP2, SOUND::AMMO_GUNFLP3, SOUND::AMMO_GUNFLP4, SOUND::AMMO_GUNFLPL, SOUND::AMMO_GUNJAZZ, SOUND::AMMO_GUNVELOCITY, SOUND::AMMO_ICEGUN, SOUND::AMMO_ICEGUN2, SOUND::AMMO_ICEGUNPU, SOUND::AMMO_ICEPU1, SOUND::AMMO_ICEPU2, SOUND::AMMO_ICEPU3, SOUND::AMMO_ICEPU4, SOUND::AMMO_LASER, SOUND::AMMO_LASER2, SOUND::AMMO_LASER3, SOUND::AMMO_LAZRAYS, SOUND::AMMO_MISSILE, SOUND::AMMO_SPZBL1, SOUND::AMMO_SPZBL2, SOUND::AMMO_SPZBL3, SOUND::BAT_BATFLY1, SOUND::BILSBOSS_BILLAPPEAR, SOUND::BILSBOSS_FINGERSNAP, SOUND::BILSBOSS_FIRE, SOUND::BILSBOSS_FIRESTART, SOUND::BILSBOSS_SCARY3, SOUND::BILSBOSS_THUNDER, SOUND::BILSBOSS_ZIP, SOUND::BONUS_BONUS1, SOUND::BONUS_BONUSBLUB, SOUND::BUBBA_BUBBABOUNCE1, SOUND::BUBBA_BUBBABOUNCE2, SOUND::BUBBA_BUBBAEXPLO, SOUND::BUBBA_FROG2, SOUND::BUBBA_FROG3, SOUND::BUBBA_FROG4, SOUND::BUBBA_FROG5, SOUND::BUBBA_SNEEZE2, SOUND::BUBBA_TORNADOATTACK2, SOUND::BUMBEE_BEELOOP, SOUND::CATERPIL_RIDOE, SOUND::COMMON_AIRBOARD, SOUND::COMMON_AIRBTURN, SOUND::COMMON_AIRBTURN2, SOUND::COMMON_BASE1, SOUND::COMMON_BELL_FIRE, SOUND::COMMON_BELL_FIRE2, SOUND::COMMON_BENZIN1, SOUND::COMMON_BIRDFLY, SOUND::COMMON_BIRDFLY2, SOUND::COMMON_BLOKPLOP, SOUND::COMMON_BLUB1, SOUND::COMMON_BUBBLGN1, SOUND::COMMON_BURN, SOUND::COMMON_BURNIN, SOUND::COMMON_CANSPS, SOUND::COMMON_CLOCK, SOUND::COMMON_COIN, SOUND::COMMON_COLLAPS, SOUND::COMMON_CUP, SOUND::COMMON_DAMPED1, SOUND::COMMON_DOWN, SOUND::COMMON_DOWNFL2, SOUND::COMMON_DRINKSPAZZ1, SOUND::COMMON_DRINKSPAZZ2, SOUND::COMMON_DRINKSPAZZ3, SOUND::COMMON_DRINKSPAZZ4, SOUND::COMMON_EAT1, SOUND::COMMON_EAT2, SOUND::COMMON_EAT3, SOUND::COMMON_EAT4, SOUND::COMMON_ELECTRIC1, SOUND::COMMON_ELECTRIC2, SOUND::COMMON_ELECTRICHIT, SOUND::COMMON_EXPL_TNT, SOUND::COMMON_EXPSM1, SOUND::COMMON_FLAMER, SOUND::COMMON_FLAP, SOUND::COMMON_FOEW1, SOUND::COMMON_FOEW2, SOUND::COMMON_FOEW3, SOUND::COMMON_FOEW4, SOUND::COMMON_FOEW5, SOUND::COMMON_GEMSMSH1, SOUND::COMMON_GLASS2, SOUND::COMMON_GUNSM1, SOUND::COMMON_HARP1, SOUND::COMMON_HEAD, SOUND::COMMON_HELI1, SOUND::COMMON_HIBELL, SOUND::COMMON_HOLYFLUT, SOUND::COMMON_HORN1, SOUND::COMMON_ICECRUSH, SOUND::COMMON_IMPACT1, SOUND::COMMON_IMPACT2, SOUND::COMMON_IMPACT3, SOUND::COMMON_IMPACT4, SOUND::COMMON_IMPACT5, SOUND::COMMON_IMPACT6, SOUND::COMMON_IMPACT7, SOUND::COMMON_IMPACT8, SOUND::COMMON_IMPACT9, SOUND::COMMON_ITEMTRE, SOUND::COMMON_JUMP, SOUND::COMMON_JUMP2, SOUND::COMMON_LAND, SOUND::COMMON_LAND1, SOUND::COMMON_LAND2, SOUND::COMMON_LANDCAN1, SOUND::COMMON_LANDCAN2, SOUND::COMMON_LANDPOP, SOUND::COMMON_LOADJAZZ, SOUND::COMMON_LOADSPAZ, SOUND::COMMON_METALHIT, SOUND::COMMON_MONITOR, SOUND::COMMON_NOCOIN, SOUND::COMMON_PICKUP1, SOUND::COMMON_PICKUPW1, SOUND::COMMON_PISTOL1, SOUND::COMMON_PLOOP1, SOUND::COMMON_PLOP1, SOUND::COMMON_PLOP2, SOUND::COMMON_PLOP3, SOUND::COMMON_PLOP4, SOUND::COMMON_PLOPKORK, SOUND::COMMON_PREEXPL1, SOUND::COMMON_PREHELI, SOUND::COMMON_REVUP, SOUND::COMMON_RINGGUN, SOUND::COMMON_RINGGUN2, SOUND::COMMON_SHIELD1, SOUND::COMMON_SHIELD4, SOUND::COMMON_SHIELD_ELEC, SOUND::COMMON_SHLDOF3, SOUND::COMMON_SLIP, SOUND::COMMON_SMASH, SOUND::COMMON_SPLAT1, SOUND::COMMON_SPLAT2, SOUND::COMMON_SPLAT3, SOUND::COMMON_SPLAT4, SOUND::COMMON_SPLUT, SOUND::COMMON_SPRING1, SOUND::COMMON_STEAM, SOUND::COMMON_STEP, SOUND::COMMON_STRETCH, SOUND::COMMON_SWISH1, SOUND::COMMON_SWISH2, SOUND::COMMON_SWISH3, SOUND::COMMON_SWISH4, SOUND::COMMON_SWISH5, SOUND::COMMON_SWISH6, SOUND::COMMON_SWISH7, SOUND::COMMON_SWISH8, SOUND::COMMON_TELPORT1, SOUND::COMMON_TELPORT2, SOUND::COMMON_UP, SOUND::COMMON_WATER, SOUND::COMMON_WOOD1, SOUND::DEMON_RUN, SOUND::DEVILDEVAN_DRAGONFIRE, SOUND::DEVILDEVAN_FLAP, SOUND::DEVILDEVAN_FROG4, SOUND::DEVILDEVAN_JUMPUP, SOUND::DEVILDEVAN_LAUGH, SOUND::DEVILDEVAN_PHASER2, SOUND::DEVILDEVAN_STRECH2, SOUND::DEVILDEVAN_STRECHTAIL, SOUND::DEVILDEVAN_STRETCH1, SOUND::DEVILDEVAN_STRETCH3, SOUND::DEVILDEVAN_VANISH1, SOUND::DEVILDEVAN_WHISTLEDESCENDING2, SOUND::DEVILDEVAN_WINGSOUT, SOUND::DOG_AGRESSIV, SOUND::DOG_SNIF1, SOUND::DOG_WAF1, SOUND::DOG_WAF2, SOUND::DOG_WAF3, SOUND::DRAGFLY_BEELOOP, SOUND::ENDING_OHTHANK, SOUND::ENDTUNEJAZZ_TUNE, SOUND::ENDTUNELORI_CAKE, SOUND::ENDTUNESPAZ_TUNE, SOUND::EPICLOGO_EPIC1, SOUND::EPICLOGO_EPIC2, SOUND::EVA_KISS1, SOUND::EVA_KISS2, SOUND::EVA_KISS3, SOUND::EVA_KISS4, SOUND::FAN_FAN, SOUND::FATCHK_HIT1, SOUND::FATCHK_HIT2, SOUND::FATCHK_HIT3, SOUND::FENCER_FENCE1, SOUND::FROG_FROG, SOUND::FROG_FROG1, SOUND::FROG_FROG2, SOUND::FROG_FROG3, SOUND::FROG_FROG4, SOUND::FROG_FROG5, SOUND::FROG_JAZZ2FROG, SOUND::FROG_TONG, SOUND::GLOVE_HIT, SOUND::HATTER_CUP, SOUND::HATTER_HAT, SOUND::HATTER_PTOEI, SOUND::HATTER_SPLIN, SOUND::HATTER_SPLOUT, SOUND::INTRO_BLOW, SOUND::INTRO_BOEM1, SOUND::INTRO_BOEM2, SOUND::INTRO_BRAKE, SOUND::INTRO_END, SOUND::INTRO_GRAB, SOUND::INTRO_GREN1, SOUND::INTRO_GREN2, SOUND::INTRO_GREN3, SOUND::INTRO_GUNM0, SOUND::INTRO_GUNM1, SOUND::INTRO_GUNM2, SOUND::INTRO_HELI, SOUND::INTRO_HITSPAZ, SOUND::INTRO_HITTURT, SOUND::INTRO_IFEEL, SOUND::INTRO_INHALE, SOUND::INTRO_INSECT, SOUND::INTRO_KATROL, SOUND::INTRO_LAND, SOUND::INTRO_MONSTER, SOUND::INTRO_MONSTER2, SOUND::INTRO_ROCK, SOUND::INTRO_ROPE1, SOUND::INTRO_ROPE2, SOUND::INTRO_RUN, SOUND::INTRO_SHOT1, SOUND::INTRO_SHOTGRN, SOUND::INTRO_SKI, SOUND::INTRO_STRING, SOUND::INTRO_SWISH1, SOUND::INTRO_SWISH2, SOUND::INTRO_SWISH3, SOUND::INTRO_SWISH4, SOUND::INTRO_UHTURT, SOUND::INTRO_UP1, SOUND::INTRO_UP2, SOUND::INTRO_WIND_01, SOUND::JAZZSOUNDS_BALANCE, SOUND::JAZZSOUNDS_HEY1, SOUND::JAZZSOUNDS_HEY2, SOUND::JAZZSOUNDS_HEY3, SOUND::JAZZSOUNDS_HEY4, SOUND::JAZZSOUNDS_IDLE, SOUND::JAZZSOUNDS_JAZZV1, SOUND::JAZZSOUNDS_JAZZV2, SOUND::JAZZSOUNDS_JAZZV3, SOUND::JAZZSOUNDS_JAZZV4, SOUND::JAZZSOUNDS_JUMMY, SOUND::JAZZSOUNDS_PFOE, SOUND::LABRAT_BITE, SOUND::LABRAT_EYE2, SOUND::LABRAT_EYE3, SOUND::LABRAT_MOUSE1, SOUND::LABRAT_MOUSE2, SOUND::LABRAT_MOUSE3, SOUND::LIZARD_LIZ1, SOUND::LIZARD_LIZ2, SOUND::LIZARD_LIZ4, SOUND::LIZARD_LIZ6, SOUND::LORISOUNDS_DIE1, SOUND::LORISOUNDS_HURT0, SOUND::LORISOUNDS_HURT1, SOUND::LORISOUNDS_HURT2, SOUND::LORISOUNDS_HURT3, SOUND::LORISOUNDS_HURT4, SOUND::LORISOUNDS_HURT5, SOUND::LORISOUNDS_HURT6, SOUND::LORISOUNDS_HURT7, SOUND::LORISOUNDS_LORI1, SOUND::LORISOUNDS_LORI2, SOUND::LORISOUNDS_LORIBOOM, SOUND::LORISOUNDS_LORIFALL, SOUND::LORISOUNDS_LORIJUMP, SOUND::LORISOUNDS_LORIJUMP2, SOUND::LORISOUNDS_LORIJUMP3, SOUND::LORISOUNDS_LORIJUMP4, SOUND::LORISOUNDS_TOUCH, SOUND::LORISOUNDS_WEHOO, SOUND::MENUSOUNDS_SELECT0, SOUND::MENUSOUNDS_SELECT1, SOUND::MENUSOUNDS_SELECT2, SOUND::MENUSOUNDS_SELECT3, SOUND::MENUSOUNDS_SELECT4, SOUND::MENUSOUNDS_SELECT5, SOUND::MENUSOUNDS_SELECT6, SOUND::MENUSOUNDS_TYPE, SOUND::MENUSOUNDS_TYPEENTER, SOUND::MONKEY_SPLUT, SOUND::MONKEY_THROW, SOUND::MOTH_FLAPMOTH, SOUND::ORANGE_BOEML, SOUND::ORANGE_BOEMR, SOUND::ORANGE_BUBBELSL, SOUND::ORANGE_BUBBELSR, SOUND::ORANGE_GLAS1L, SOUND::ORANGE_GLAS1R, SOUND::ORANGE_GLAS2L, SOUND::ORANGE_GLAS2R, SOUND::ORANGE_MERGE, SOUND::ORANGE_SWEEP0L, SOUND::ORANGE_SWEEP0R, SOUND::ORANGE_SWEEP1L, SOUND::ORANGE_SWEEP1R, SOUND::ORANGE_SWEEP2L, SOUND::ORANGE_SWEEP2R, SOUND::P2_CRUNCH, SOUND::P2_FART, SOUND::P2_FOEW1, SOUND::P2_FOEW4, SOUND::P2_FOEW5, SOUND::P2_FROG1, SOUND::P2_FROG2, SOUND::P2_FROG3, SOUND::P2_FROG4, SOUND::P2_FROG5, SOUND::P2_KISS4, SOUND::P2_OPEN, SOUND::P2_PINCH1, SOUND::P2_PINCH2, SOUND::P2_PLOPSEQ1, SOUND::P2_PLOPSEQ2, SOUND::P2_PLOPSEQ3, SOUND::P2_PLOPSEQ4, SOUND::P2_POEP, SOUND::P2_PTOEI, SOUND::P2_SPLOUT, SOUND::P2_SPLUT, SOUND::P2_THROW, SOUND::P2_TONG, SOUND::PICKUPS_BOING_CHECK, SOUND::PICKUPS_HELI2, SOUND::PICKUPS_STRETCH1A, SOUND::PINBALL_BELL, SOUND::PINBALL_FLIP1, SOUND::PINBALL_FLIP2, SOUND::PINBALL_FLIP3, SOUND::PINBALL_FLIP4, SOUND::QUEEN_LADYUP, SOUND::QUEEN_SCREAM, SOUND::RAPIER_GOSTDIE, SOUND::RAPIER_GOSTLOOP, SOUND::RAPIER_GOSTOOOH, SOUND::RAPIER_GOSTRIP, SOUND::RAPIER_HITCHAR, SOUND::ROBOT_BIG1, SOUND::ROBOT_BIG2, SOUND::ROBOT_CAN1, SOUND::ROBOT_CAN2, SOUND::ROBOT_HYDRO, SOUND::ROBOT_HYDRO2, SOUND::ROBOT_HYDROFIL, SOUND::ROBOT_HYDROPUF, SOUND::ROBOT_IDLE1, SOUND::ROBOT_IDLE2, SOUND::ROBOT_JMPCAN1, SOUND::ROBOT_JMPCAN10, SOUND::ROBOT_JMPCAN2, SOUND::ROBOT_JMPCAN3, SOUND::ROBOT_JMPCAN4, SOUND::ROBOT_JMPCAN5, SOUND::ROBOT_JMPCAN6, SOUND::ROBOT_JMPCAN7, SOUND::ROBOT_JMPCAN8, SOUND::ROBOT_JMPCAN9, SOUND::ROBOT_METAL1, SOUND::ROBOT_METAL2, SOUND::ROBOT_METAL3, SOUND::ROBOT_METAL4, SOUND::ROBOT_METAL5, SOUND::ROBOT_OPEN, SOUND::ROBOT_OUT, SOUND::ROBOT_POEP, SOUND::ROBOT_POLE, SOUND::ROBOT_SHOOT, SOUND::ROBOT_STEP1, SOUND::ROBOT_STEP2, SOUND::ROBOT_STEP3, SOUND::ROCK_ROCK1, SOUND::RUSH_RUSH, SOUND::SCIENCE_PLOPKAOS, SOUND::SKELETON_BONE1, SOUND::SKELETON_BONE2, SOUND::SKELETON_BONE3, SOUND::SKELETON_BONE5, SOUND::SKELETON_BONE6, SOUND::SKELETON_BONE7, SOUND::SMALTREE_FALL, SOUND::SMALTREE_GROUND, SOUND::SMALTREE_HEAD, SOUND::SONCSHIP_METAL1, SOUND::SONCSHIP_MISSILE2, SOUND::SONCSHIP_SCRAPE, SOUND::SONCSHIP_SHIPLOOP, SOUND::SONCSHIP_TARGETLOCK, SOUND::SPAZSOUNDS_AUTSCH1, SOUND::SPAZSOUNDS_AUTSCH2, SOUND::SPAZSOUNDS_BIRDSIT, SOUND::SPAZSOUNDS_BURP, SOUND::SPAZSOUNDS_CHIRP, SOUND::SPAZSOUNDS_EATBIRD, SOUND::SPAZSOUNDS_HAHAHA, SOUND::SPAZSOUNDS_HAHAHA2, SOUND::SPAZSOUNDS_HAPPY, SOUND::SPAZSOUNDS_HIHI, SOUND::SPAZSOUNDS_HOHOHO1, SOUND::SPAZSOUNDS_HOOO, SOUND::SPAZSOUNDS_KARATE7, SOUND::SPAZSOUNDS_KARATE8, SOUND::SPAZSOUNDS_OHOH, SOUND::SPAZSOUNDS_OOOH, SOUND::SPAZSOUNDS_WOOHOO, SOUND::SPAZSOUNDS_YAHOO, SOUND::SPAZSOUNDS_YAHOO2, SOUND::SPRING_BOING_DOWN, SOUND::SPRING_SPRING1, SOUND::STEAM_STEAM, SOUND::STONED_STONED, SOUND::SUCKER_FART, SOUND::SUCKER_PINCH1, SOUND::SUCKER_PINCH2, SOUND::SUCKER_PINCH3, SOUND::SUCKER_PLOPSEQ1, SOUND::SUCKER_PLOPSEQ2, SOUND::SUCKER_PLOPSEQ3, SOUND::SUCKER_PLOPSEQ4, SOUND::SUCKER_UP, SOUND::TUFBOSS_CATCH, SOUND::TUFBOSS_RELEASE, SOUND::TUFBOSS_SWING, SOUND::TURTLE_BITE3, SOUND::TURTLE_HIDE, SOUND::TURTLE_HITSHELL, SOUND::TURTLE_IDLE1, SOUND::TURTLE_IDLE2, SOUND::TURTLE_NECK, SOUND::TURTLE_SPK1TURT, SOUND::TURTLE_SPK2TURT, SOUND::TURTLE_SPK3TURT, SOUND::TURTLE_SPK4TURT, SOUND::TURTLE_TURN, SOUND::UTERUS_CRABCLOSE, SOUND::UTERUS_CRABOPEN2, SOUND::UTERUS_SCISSORS1, SOUND::UTERUS_SCISSORS2, SOUND::UTERUS_SCISSORS3, SOUND::UTERUS_SCISSORS4, SOUND::UTERUS_SCISSORS5, SOUND::UTERUS_SCISSORS6, SOUND::UTERUS_SCISSORS7, SOUND::UTERUS_SCISSORS8, SOUND::UTERUS_SCREAM1, SOUND::UTERUS_STEP1, SOUND::UTERUS_STEP2, SOUND::WIND_WIND2A, SOUND::WITCH_LAUGH, SOUND::WITCH_MAGIC, SOUND::XBILSY_BILLAPPEAR, SOUND::XBILSY_FINGERSNAP, SOUND::XBILSY_FIRE, SOUND::XBILSY_FIRESTART, SOUND::XBILSY_SCARY3, SOUND::XBILSY_THUNDER, SOUND::XBILSY_ZIP, SOUND::XLIZARD_LIZ1, SOUND::XLIZARD_LIZ2, SOUND::XLIZARD_LIZ4, SOUND::XLIZARD_LIZ6, SOUND::XTURTLE_BITE3, SOUND::XTURTLE_HIDE, SOUND::XTURTLE_HITSHELL, SOUND::XTURTLE_IDLE1, SOUND::XTURTLE_IDLE2, SOUND::XTURTLE_NECK, SOUND::XTURTLE_SPK1TURT, SOUND::XTURTLE_SPK2TURT, SOUND::XTURTLE_SPK3TURT, SOUND::XTURTLE_SPK4TURT, SOUND::XTURTLE_TURN, SOUND::ZDOG_AGRESSIV, SOUND::ZDOG_SNIF1, SOUND::ZDOG_WAF1, SOUND::ZDOG_WAF2, SOUND::ZDOG_WAF3};
const array<string> sampleNames = {"NONE", "AMMO_BLUB1", "AMMO_BLUB2", "AMMO_BMP1", "AMMO_BMP2", "AMMO_BMP3", "AMMO_BMP4", "AMMO_BMP5", "AMMO_BMP6", "AMMO_BOEM1", "AMMO_BUL1", "AMMO_BULFL1", "AMMO_BULFL2", "AMMO_BULFL3", "AMMO_FIREGUN1A", "AMMO_FIREGUN2A", "AMMO_FUMP", "AMMO_GUN1", "AMMO_GUN2", "AMMO_GUN3PLOP", "AMMO_GUNFLP", "AMMO_GUNFLP1", "AMMO_GUNFLP2", "AMMO_GUNFLP3", "AMMO_GUNFLP4", "AMMO_GUNFLPL", "AMMO_GUNJAZZ", "AMMO_GUNVELOCITY", "AMMO_ICEGUN", "AMMO_ICEGUN2", "AMMO_ICEGUNPU", "AMMO_ICEPU1", "AMMO_ICEPU2", "AMMO_ICEPU3", "AMMO_ICEPU4", "AMMO_LASER", "AMMO_LASER2", "AMMO_LASER3", "AMMO_LAZRAYS", "AMMO_MISSILE", "AMMO_SPZBL1", "AMMO_SPZBL2", "AMMO_SPZBL3", "BAT_BATFLY1 (loops, don't use)", "BILSBOSS_BILLAPPEAR", "BILSBOSS_FINGERSNAP", "BILSBOSS_FIRE", "BILSBOSS_FIRESTART", "BILSBOSS_SCARY3", "BILSBOSS_THUNDER", "BILSBOSS_ZIP", "BONUS_BONUS1", "BONUS_BONUSBLUB (loops, don't use)", "BUBBA_BUBBABOUNCE1", "BUBBA_BUBBABOUNCE2", "BUBBA_BUBBAEXPLO", "BUBBA_FROG2", "BUBBA_FROG3", "BUBBA_FROG4", "BUBBA_FROG5", "BUBBA_SNEEZE2", "BUBBA_TORNADOATTACK2 (loops, don't use)", "BUMBEE_BEELOOP", "CATERPIL_RIDOE", "COMMON_AIRBOARD", "COMMON_AIRBTURN", "COMMON_AIRBTURN2", "COMMON_BASE1", "COMMON_BELL_FIRE", "COMMON_BELL_FIRE2", "COMMON_BENZIN1", "COMMON_BIRDFLY", "COMMON_BIRDFLY2", "COMMON_BLOKPLOP", "COMMON_BLUB1", "COMMON_BUBBLGN1", "COMMON_BURN", "COMMON_BURNIN (loops, don't use)", "COMMON_CANSPS", "COMMON_CLOCK (loops, don't use)", "COMMON_COIN", "COMMON_COLLAPS", "COMMON_CUP", "COMMON_DAMPED1", "COMMON_DOWN", "COMMON_DOWNFL2", "COMMON_DRINKSPAZZ1", "COMMON_DRINKSPAZZ2", "COMMON_DRINKSPAZZ3", "COMMON_DRINKSPAZZ4", "COMMON_EAT1", "COMMON_EAT2", "COMMON_EAT3", "COMMON_EAT4", "COMMON_ELECTRIC1", "COMMON_ELECTRIC2", "COMMON_ELECTRICHIT", "COMMON_EXPL_TNT", "COMMON_EXPSM1", "COMMON_FLAMER", "COMMON_FLAP", "COMMON_FOEW1", "COMMON_FOEW2", "COMMON_FOEW3", "COMMON_FOEW4", "COMMON_FOEW5", "COMMON_GEMSMSH1", "COMMON_GLASS2", "COMMON_GUNSM1", "COMMON_HARP1", "COMMON_HEAD", "COMMON_HELI1 (loops, don't use)", "COMMON_HIBELL", "COMMON_HOLYFLUT", "COMMON_HORN1", "COMMON_ICECRUSH", "COMMON_IMPACT1", "COMMON_IMPACT2", "COMMON_IMPACT3", "COMMON_IMPACT4", "COMMON_IMPACT5", "COMMON_IMPACT6", "COMMON_IMPACT7", "COMMON_IMPACT8", "COMMON_IMPACT9", "COMMON_ITEMTRE", "COMMON_JUMP", "COMMON_JUMP2", "COMMON_LAND", "COMMON_LAND1", "COMMON_LAND2", "COMMON_LANDCAN1", "COMMON_LANDCAN2", "COMMON_LANDPOP", "COMMON_LOADJAZZ", "COMMON_LOADSPAZ", "COMMON_METALHIT", "COMMON_MONITOR", "COMMON_NOCOIN", "COMMON_PICKUP1", "COMMON_PICKUPW1", "COMMON_PISTOL1", "COMMON_PLOOP1", "COMMON_PLOP1", "COMMON_PLOP2", "COMMON_PLOP3", "COMMON_PLOP4", "COMMON_PLOPKORK", "COMMON_PREEXPL1", "COMMON_PREHELI", "COMMON_REVUP", "COMMON_RINGGUN", "COMMON_RINGGUN2 (loops, don't use)", "COMMON_SHIELD1", "COMMON_SHIELD4 (loops, don't use)", "COMMON_SHIELD_ELEC (loops, don't use)", "COMMON_SHLDOF3", "COMMON_SLIP (loops, don't use)", "COMMON_SMASH", "COMMON_SPLAT1", "COMMON_SPLAT2", "COMMON_SPLAT3", "COMMON_SPLAT4", "COMMON_SPLUT", "COMMON_SPRING1", "COMMON_STEAM", "COMMON_STEP", "COMMON_STRETCH", "COMMON_SWISH1", "COMMON_SWISH2", "COMMON_SWISH3", "COMMON_SWISH4", "COMMON_SWISH5", "COMMON_SWISH6", "COMMON_SWISH7", "COMMON_SWISH8", "COMMON_TELPORT1", "COMMON_TELPORT2", "COMMON_UP", "COMMON_WATER", "COMMON_WOOD1", "DEMON_RUN", "DEVILDEVAN_DRAGONFIRE", "DEVILDEVAN_FLAP", "DEVILDEVAN_FROG4", "DEVILDEVAN_JUMPUP", "DEVILDEVAN_LAUGH", "DEVILDEVAN_PHASER2", "DEVILDEVAN_STRECH2", "DEVILDEVAN_STRECHTAIL", "DEVILDEVAN_STRETCH1", "DEVILDEVAN_STRETCH3", "DEVILDEVAN_VANISH1", "DEVILDEVAN_WHISTLEDESCENDING2", "DEVILDEVAN_WINGSOUT", "DOG_AGRESSIV", "DOG_SNIF1", "DOG_WAF1", "DOG_WAF2", "DOG_WAF3", "DRAGFLY_BEELOOP", "ENDING_OHTHANK", "ENDTUNEJAZZ_TUNE", "ENDTUNELORI_CAKE", "ENDTUNESPAZ_TUNE", "EPICLOGO_EPIC1", "EPICLOGO_EPIC2", "EVA_KISS1", "EVA_KISS2", "EVA_KISS3", "EVA_KISS4", "FAN_FAN (loops, don't use)", "FATCHK_HIT1", "FATCHK_HIT2", "FATCHK_HIT3", "FENCER_FENCE1", "FROG_FROG", "FROG_FROG1", "FROG_FROG2", "FROG_FROG3", "FROG_FROG4", "FROG_FROG5", "FROG_JAZZ2FROG", "FROG_TONG", "GLOVE_HIT", "HATTER_CUP", "HATTER_HAT", "HATTER_PTOEI", "HATTER_SPLIN", "HATTER_SPLOUT", "INTRO_BLOW", "INTRO_BOEM1", "INTRO_BOEM2", "INTRO_BRAKE", "INTRO_END", "INTRO_GRAB", "INTRO_GREN1", "INTRO_GREN2", "INTRO_GREN3", "INTRO_GUNM0", "INTRO_GUNM1", "INTRO_GUNM2", "INTRO_HELI", "INTRO_HITSPAZ", "INTRO_HITTURT", "INTRO_IFEEL", "INTRO_INHALE", "INTRO_INSECT", "INTRO_KATROL", "INTRO_LAND", "INTRO_MONSTER", "INTRO_MONSTER2", "INTRO_ROCK", "INTRO_ROPE1", "INTRO_ROPE2", "INTRO_RUN", "INTRO_SHOT1", "INTRO_SHOTGRN", "INTRO_SKI", "INTRO_STRING", "INTRO_SWISH1", "INTRO_SWISH2", "INTRO_SWISH3", "INTRO_SWISH4", "INTRO_UHTURT", "INTRO_UP1", "INTRO_UP2", "INTRO_WIND_01", "JAZZSOUNDS_BALANCE", "JAZZSOUNDS_HEY1", "JAZZSOUNDS_HEY2", "JAZZSOUNDS_HEY3", "JAZZSOUNDS_HEY4", "JAZZSOUNDS_IDLE", "JAZZSOUNDS_JAZZV1", "JAZZSOUNDS_JAZZV2", "JAZZSOUNDS_JAZZV3", "JAZZSOUNDS_JAZZV4", "JAZZSOUNDS_JUMMY", "JAZZSOUNDS_PFOE", "LABRAT_BITE", "LABRAT_EYE2", "LABRAT_EYE3", "LABRAT_MOUSE1", "LABRAT_MOUSE2", "LABRAT_MOUSE3", "LIZARD_LIZ1", "LIZARD_LIZ2", "LIZARD_LIZ4", "LIZARD_LIZ6", "LORISOUNDS_DIE1", "LORISOUNDS_HURT0", "LORISOUNDS_HURT1", "LORISOUNDS_HURT2", "LORISOUNDS_HURT3", "LORISOUNDS_HURT4", "LORISOUNDS_HURT5", "LORISOUNDS_HURT6", "LORISOUNDS_HURT7", "LORISOUNDS_LORI1", "LORISOUNDS_LORI2", "LORISOUNDS_LORIBOOM", "LORISOUNDS_LORIFALL", "LORISOUNDS_LORIJUMP", "LORISOUNDS_LORIJUMP2", "LORISOUNDS_LORIJUMP3", "LORISOUNDS_LORIJUMP4", "LORISOUNDS_TOUCH", "LORISOUNDS_WEHOO", "MENUSOUNDS_SELECT0", "MENUSOUNDS_SELECT1", "MENUSOUNDS_SELECT2", "MENUSOUNDS_SELECT3", "MENUSOUNDS_SELECT4", "MENUSOUNDS_SELECT5", "MENUSOUNDS_SELECT6", "MENUSOUNDS_TYPE", "MENUSOUNDS_TYPEENTER", "MONKEY_SPLUT", "MONKEY_THROW (loops, don't use)", "MOTH_FLAPMOTH", "ORANGE_BOEML", "ORANGE_BOEMR", "ORANGE_BUBBELSL", "ORANGE_BUBBELSR", "ORANGE_GLAS1L", "ORANGE_GLAS1R", "ORANGE_GLAS2L", "ORANGE_GLAS2R", "ORANGE_MERGE", "ORANGE_SWEEP0L", "ORANGE_SWEEP0R", "ORANGE_SWEEP1L", "ORANGE_SWEEP1R", "ORANGE_SWEEP2L", "ORANGE_SWEEP2R", "P2_CRUNCH", "P2_FART", "P2_FOEW1", "P2_FOEW4", "P2_FOEW5", "P2_FROG1", "P2_FROG2", "P2_FROG3", "P2_FROG4", "P2_FROG5", "P2_KISS4", "P2_OPEN", "P2_PINCH1", "P2_PINCH2", "P2_PLOPSEQ1", "P2_PLOPSEQ2", "P2_PLOPSEQ3", "P2_PLOPSEQ4", "P2_POEP", "P2_PTOEI", "P2_SPLOUT", "P2_SPLUT", "P2_THROW", "P2_TONG", "PICKUPS_BOING_CHECK", "PICKUPS_HELI2 (loops, don't use)", "PICKUPS_STRETCH1A", "PINBALL_BELL", "PINBALL_FLIP1", "PINBALL_FLIP2", "PINBALL_FLIP3", "PINBALL_FLIP4", "QUEEN_LADYUP", "QUEEN_SCREAM", "RAPIER_GOSTDIE", "RAPIER_GOSTLOOP (loops, don't use)", "RAPIER_GOSTOOOH", "RAPIER_GOSTRIP", "RAPIER_HITCHAR", "ROBOT_BIG1", "ROBOT_BIG2", "ROBOT_CAN1", "ROBOT_CAN2", "ROBOT_HYDRO", "ROBOT_HYDRO2", "ROBOT_HYDROFIL", "ROBOT_HYDROPUF", "ROBOT_IDLE1", "ROBOT_IDLE2", "ROBOT_JMPCAN1", "ROBOT_JMPCAN10", "ROBOT_JMPCAN2", "ROBOT_JMPCAN3", "ROBOT_JMPCAN4", "ROBOT_JMPCAN5", "ROBOT_JMPCAN6", "ROBOT_JMPCAN7", "ROBOT_JMPCAN8", "ROBOT_JMPCAN9", "ROBOT_METAL1", "ROBOT_METAL2", "ROBOT_METAL3", "ROBOT_METAL4", "ROBOT_METAL5", "ROBOT_OPEN", "ROBOT_OUT", "ROBOT_POEP", "ROBOT_POLE", "ROBOT_SHOOT", "ROBOT_STEP1", "ROBOT_STEP2", "ROBOT_STEP3", "ROCK_ROCK1", "RUSH_RUSH", "SCIENCE_PLOPKAOS", "SKELETON_BONE1", "SKELETON_BONE2", "SKELETON_BONE3", "SKELETON_BONE5", "SKELETON_BONE6", "SKELETON_BONE7", "SMALTREE_FALL", "SMALTREE_GROUND", "SMALTREE_HEAD", "SONCSHIP_METAL1", "SONCSHIP_MISSILE2", "SONCSHIP_SCRAPE", "SONCSHIP_SHIPLOOP (loops, don't use)", "SONCSHIP_TARGETLOCK", "SPAZSOUNDS_AUTSCH1", "SPAZSOUNDS_AUTSCH2", "SPAZSOUNDS_BIRDSIT", "SPAZSOUNDS_BURP", "SPAZSOUNDS_CHIRP", "SPAZSOUNDS_EATBIRD", "SPAZSOUNDS_HAHAHA", "SPAZSOUNDS_HAHAHA2", "SPAZSOUNDS_HAPPY", "SPAZSOUNDS_HIHI", "SPAZSOUNDS_HOHOHO1", "SPAZSOUNDS_HOOO", "SPAZSOUNDS_KARATE7", "SPAZSOUNDS_KARATE8", "SPAZSOUNDS_OHOH", "SPAZSOUNDS_OOOH", "SPAZSOUNDS_WOOHOO", "SPAZSOUNDS_YAHOO", "SPAZSOUNDS_YAHOO2", "SPRING_BOING_DOWN", "SPRING_SPRING1", "STEAM_STEAM", "STONED_STONED (loops, don't use)", "SUCKER_FART", "SUCKER_PINCH1", "SUCKER_PINCH2", "SUCKER_PINCH3", "SUCKER_PLOPSEQ1", "SUCKER_PLOPSEQ2", "SUCKER_PLOPSEQ3", "SUCKER_PLOPSEQ4", "SUCKER_UP", "TUFBOSS_CATCH", "TUFBOSS_RELEASE", "TUFBOSS_SWING (loops, don't use)", "TURTLE_BITE3", "TURTLE_HIDE", "TURTLE_HITSHELL", "TURTLE_IDLE1", "TURTLE_IDLE2", "TURTLE_NECK", "TURTLE_SPK1TURT", "TURTLE_SPK2TURT", "TURTLE_SPK3TURT", "TURTLE_SPK4TURT", "TURTLE_TURN", "UTERUS_CRABCLOSE", "UTERUS_CRABOPEN2", "UTERUS_SCISSORS1", "UTERUS_SCISSORS2", "UTERUS_SCISSORS3", "UTERUS_SCISSORS4", "UTERUS_SCISSORS5", "UTERUS_SCISSORS6", "UTERUS_SCISSORS7", "UTERUS_SCISSORS8", "UTERUS_SCREAM1", "UTERUS_STEP1", "UTERUS_STEP2", "WIND_WIND2A (loops, don't use)", "WITCH_LAUGH", "WITCH_MAGIC", "XBILSY_BILLAPPEAR", "XBILSY_FINGERSNAP", "XBILSY_FIRE", "XBILSY_FIRESTART", "XBILSY_SCARY3", "XBILSY_THUNDER", "XBILSY_ZIP", "XLIZARD_LIZ1", "XLIZARD_LIZ2", "XLIZARD_LIZ4", "XLIZARD_LIZ6", "XTURTLE_BITE3", "XTURTLE_HIDE", "XTURTLE_HITSHELL", "XTURTLE_IDLE1", "XTURTLE_IDLE2", "XTURTLE_NECK", "XTURTLE_SPK1TURT", "XTURTLE_SPK2TURT", "XTURTLE_SPK3TURT", "XTURTLE_SPK4TURT", "XTURTLE_TURN", "ZDOG_AGRESSIV", "ZDOG_SNIF1", "ZDOG_WAF1", "ZDOG_WAF2", "ZDOG_WAF3"};
const array<string> availableNotes = {"DEF", "C-1", "C#1", "D-1", "D#1", "E-1", "F-1", "F#1", "G-1", "G#1", "A-1", "A#1", "B-1", "C-2", "C#2", "D-2", "D#2", "E-2", "F-2", "F#2", "G-2", "G#2", "A-2", "A#2", "B-2", "C-3", "C#3", "D-3", "D#3", "E-3", "F-3", "F#3", "G-3", "G#3", "A-3", "A#3", "B-3", "C-4", "C#4", "D-4", "D#4", "E-4", "F-4", "F#4", "G-4", "G#4", "A-4", "A#4", "B-4", "C-5", "C#5", "D-5", "D#5", "E-5", "F-5", "F#5", "G-5", "G#5", "A-5", "A#5", "B-5", "C-6", "C#6", "D-6", "D#6", "E-6", "F-6", "F#6", "G-6", "G#6", "A-6", "A#6", "B-6", "C-7", "C#7", "D-7", "D#7", "E-7", "F-7", "F#7", "G-7", "G#7", "A-7", "A#7", "B-7", "C-8", "C#8", "D-8", "D#8", "E-8", "F-8", "F#8", "G-8", "G#8", "A-8", "A#8", "B-8", "C-9", "C#9", "D-9", "D#9", "E-9", "F-9", "F#9", "G-9", "G#9", "A-9", "A#9", "B-9", "C-10", "C#10", "D-10", "D#10", "E-10", "F-10", "F#10", "G-10", "G#10", "A-10", "A#10", "B-10"};
const array<uint> availableFrequencies = {0, 523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 987, 1046, 1108, 1174, 1244, 1318, 1396, 1479, 1567, 1660, 1759, 1864, 1975, 2092, 2216, 2348, 2488, 2636, 2793, 2959, 3135, 3321, 3518, 3727, 3949, 4184, 4433, 4697, 4976, 5272, 5585, 5917, 6269, 6642, 7037, 7455, 7898, 8368, 8866, 9393, 9952, 10544, 11171, 11835, 12539, 13285, 14075, 14912, 15799, 16738, 17733, 18787, 19904, 21088, 22342, 23671, 25079, 26570, 28150, 29824, 31597, 33476, 35467, 37576, 39810, 42177, 44685, 47342, 50157, 53139, 56299, 59647, 63194, 66952, 70933, 75151, 79620, 84354, 89370, 94684, 100314, 106279, 112599, 119294, 126388, 133903, 141865, 150301, 159238, 168707, 178739, 189367, 200627, 212557, 225196, 238587, 252774, 267805, 283730, 300601, 318476, 337414, 357478, 378735, 401256, 425116, 450395, 477177, 505551};

/*****************************0A****1S****2D****3F****4G****5H****6J****7K****8L****9;:**10'"**11\|**12U***13I**14left*15up*16right*17down*18Q**19O*20bkspc*/
const array<int> keyCodes = {0x41, 0x53, 0x44, 0x46, 0x47, 0x48, 0x4A, 0x4B, 0x4C, 0xBA, 0xDE, 0xDC, 0x55, 0x49, 0x25, 0x26, 0x27, 0x28, 0x51, 0x4F, 0x08};

array<array<uint>> channelSamples(4, array<uint>(256, 0)); // 4 channels, each having 256 rows
array<array<uint8>> channelNotes(4, array<uint8>(256, 0));
array<array<uint8>> channelVolumes(4, array<uint8>(256, 63));

bool songPlaying = false;
bool playNewNotes = true;
uint8 currentRow = 0;
uint8 curEditRow = 0;
uint8 curPlayRow = 0;
int8 curChannel = 0;
uint8 curOctave = 4;
uint16 curSample = 0;
uint8 curVolume = 63;
uint8 rowDelay = 8;

uint keyCounter = 0;
bool keyHeld;

void findCustomAnimID() { //This function is copied from Bunny Must Die! guns
	while (jjAnimSets[ANIM::CUSTOM[customAnimID]].firstAnim != 0) ++customAnimID;
	
	jjAnimSets[ANIM::CUSTOM[customAnimID]].load(0, "jtrack.j2a");
}

array<string> items;

bool saveSong(string filename) {
	jjSTREAM file;
	string stuff = "validJazzTrackSong";
	file.push(stuff);
	for (uint i = 0; i < 4; i++) { //push the data of the song channel by channel,
		for (uint j = 0; j < 256; j++) { //row by row
			file.push(channelSamples[i][j]);
			file.push(channelNotes[i][j]);
			file.push(channelVolumes[i][j]);
		}
	}
	return file.save(filename + ".jts.asdat");
}

bool loadSong(string filename) {
	jjSTREAM file(filename + ".jts.asdat");
	string poppedStuff = "";
	if (file.pop(poppedStuff) && poppedStuff == "validJazzTrackSong") {
		poppedStuff = "";
		bool success = true;
		for (uint i = 0; i < 4; i++) {
			for (uint j = 0; j < 256 && success; j++) {
				success = file.pop(channelSamples[i][j]);
				success = file.pop(channelNotes[i][j]);
				success = file.pop(channelVolumes[i][j]);
			}
		}
		return success;
	}
	return false;
}

void onLevelLoad() {
	findCustomAnimID();
}

void onPlayer(jjPLAYER@ p) {
	if (songPlaying) {
		if (jjGameTicks % rowDelay == 0) {
			for (uint i = 0; i < 4; i++) {
				if (channelSamples[i][currentRow] != 0) jjSample(p.xPos, p.yPos, samples[channelSamples[i][currentRow]], channelVolumes[i][currentRow], availableFrequencies[channelNotes[i][currentRow]]);
			}
			curPlayRow++;
		}
		currentRow = curPlayRow;
	} else {
		currentRow = curEditRow;
	}
	
	p.ballTime = 3;
}

void onPlayerInput(jjPLAYER@ p) {
	if (jjKey[keyCodes[17]] && !jjKey[keyCodes[15]]) {
		if (keyCounter % 5 == 0) curEditRow++;
		keyCounter++;
	} else if (jjKey[keyCodes[15]] && !jjKey[keyCodes[17]]) {
		if (keyCounter % 5 == 0) curEditRow--;
		keyCounter++;
	} else {
		keyCounter = 0;
	}
	
	if (jjKey[keyCodes[14]] && curChannel > 0 && !keyHeld) {
		curChannel--;
	} else if (jjKey[keyCodes[16]] && curChannel < 3 && !keyHeld) {
		curChannel++;
	}
	
	if (jjKey[keyCodes[12]] && curSample > 0 && !keyHeld) {
		curSample--;
	} else if (jjKey[keyCodes[13]] && curSample < 513 && !keyHeld) {
		curSample++;
	}
	
	if (jjKey[keyCodes[19]] && !keyHeld && curSample > 0) jjSample(p.xPos, p.yPos, samples[curSample], 63, 0);
	
	for (int i = 0; i < 12; i++) {
		if (i < 4) {
			if (jjMouseX > 96 + i * 128 && jjMouseX < 96 + (i * 128) + 127 && jjMouseY > 128 && jjMouseY < jjResolutionHeight - 32 && jjKey[1] && !keyHeld) curChannel = i;
		}
		if (jjKey[keyCodes[i]] && !keyHeld) {
			channelNotes[curChannel][curEditRow] = (curOctave * 12 + 1) + i;
			channelSamples[curChannel][curEditRow] = curSample;
			channelVolumes[curChannel][curEditRow] = curVolume;
			if (playNewNotes && curSample != 0) jjSample(p.xPos, p.yPos, samples[curSample], curVolume, availableFrequencies[(curOctave * 12 + 1) + i]);
		}
	}
	if (jjKey[keyCodes[18]] && !keyHeld) {
		channelNotes[curChannel][curEditRow] = 0;
		channelSamples[curChannel][curEditRow] = curSample;
		channelVolumes[curChannel][curEditRow] = curVolume;
		if (playNewNotes && curSample != 0) jjSample(p.xPos, p.yPos, samples[curSample], curVolume, 0);
	}
	
	if (jjKey[keyCodes[20]] && !keyHeld) {
		channelNotes[curChannel][curEditRow] = 0;
		channelSamples[curChannel][curEditRow] = 0;
		channelVolumes[curChannel][curEditRow] = 63;
	}
	
	for (int j = -9; j < 9; j++) {
			if (jjMouseY > 296 + j * 16 && jjMouseY < 312 + j * 16 && jjKey[1] && !keyHeld && !songPlaying) curEditRow += j;
		}
	
	if (jjMouseX > 48 && jjMouseX < 112 && jjMouseY > 48 && jjMouseY < 112 && jjKey[1] && !keyHeld) songPlaying = true;
	if (jjMouseX > 120 && jjMouseX < 184 && jjMouseY > 48 && jjMouseY < 112 && jjKey[1] && !keyHeld) {
		songPlaying = false;
		curPlayRow = 0;
	}
	
	if (jjMouseX > 352 && jjMouseX < 368 && jjMouseY > 104 && jjMouseY < 120 && jjKey[1] && !keyHeld) {
		if (playNewNotes) {
			playNewNotes = false;
		} else {
			playNewNotes = true;
		}
	}
	
	if (jjMouseX > 212 && jjMouseX < 338 && jjMouseY > 72 && jjMouseY < 96 && jjKey[1]) {
		curOctave = ((jjMouseX - 212) / 12.6);
	}
	
	if (jjMouseX > 372 && jjMouseX < 498 && jjMouseY > 72 && jjMouseY < 96 && jjKey[1]) {
		curVolume = ((jjMouseX - 372) / 2) + 1;
	}
	
	keyHeld = jjKey[1] || jjKey[keyCodes[0]] || jjKey[keyCodes[1]] || jjKey[keyCodes[2]] || jjKey[keyCodes[3]] || jjKey[keyCodes[4]] || jjKey[keyCodes[5]] || jjKey[keyCodes[6]] || jjKey[keyCodes[7]] || jjKey[keyCodes[8]] || jjKey[keyCodes[9]] || jjKey[keyCodes[10]] || jjKey[keyCodes[11]] || jjKey[keyCodes[12]] || jjKey[keyCodes[13]] || jjKey[keyCodes[14]] || jjKey[keyCodes[15]] || jjKey[keyCodes[16]] || jjKey[keyCodes[17]] || jjKey[keyCodes[18]] || jjKey[keyCodes[19]];
	
	p.keyUp = false;
	p.keyDown = false;
	p.keyLeft = false;
	p.keyRight = false;
	p.keyJump = false;
	p.keySelect = false;
	p.keyRun = false;
}

bool onLocalChat(string &in stringReceived, CHAT::Type chatType) {
	array<string> results;
	
	if (jjRegexIsValid(stringReceived) && jjRegexMatch(stringReceived, "!setsamp\\s+(\\d+)\\s*", results, true)) { //!setsamp <sample number>
		if (parseInt(results[1]) >= 0 && parseInt(results[1]) < 514) curSample = parseInt(results[1]);
		return true;
	} else 	if (jjRegexIsValid(stringReceived) && jjRegexMatch(stringReceived, "!setsamp\\s+(.+?)\\s*", results, true)) { //!setsamp <sample name>
		for (uint i = 0; i < 514; i++) {
			if (results[1] == sampleNames[i]) curSample = i;
		}
		return true;
	}
	
	if (jjRegexIsValid(stringReceived) && jjRegexMatch(stringReceived, "!clearsong", results, true)) {
		for (uint i = 0; i < 4; i++) {
			for (uint j = 0; j < 256; j++) {
				channelSamples[i][j] = 0;
				channelNotes[i][j] = 0;
				channelVolumes[i][j] = 63;
			}
		}
		jjAlert("Rows cleared.");
		return true;
	}
	
	if (jjRegexIsValid(stringReceived) && jjRegexMatch(stringReceived, "!savesong\\s+(.+?)\\s*", results, true)) {
		if (saveSong(results[1])) {
			jjAlert("File " + results[1] + ".jts.asdat saved successfully.");
		} else {
			jjAlert("File couldn't be saved.");
		}
		return true;
	}
	
	if (jjRegexIsValid(stringReceived) && jjRegexMatch(stringReceived, "!loadsong\\s+(.+?)\\s*", results, true)) {
		if (loadSong(results[1])) {
			jjAlert("File " + results[1] + ".jts.asdat loaded successfully.");
		} else {
			jjAlert("File couldn't be loaded.");
		}
		return true;
	}
	
	return false;
}

bool onDrawHealth(jjPLAYER@ p, jjCANVAS@ canvas) {
	canvas.drawRectangle(32, 32, jjResolutionWidth - 64, jjResolutionHeight - 64, 68, SPRITE::NORMAL, 0);
	canvas.drawRectangle(96 + curChannel * 128, 128, 122, jjResolutionHeight - 160, 42, SPRITE::ALPHAMAP, 72);
	canvas.drawRectangle(32, 293, jjResolutionWidth - 64, 16, 42, SPRITE::NORMAL, 0);
	canvas.drawRectangle(93, 128, 3, jjResolutionHeight - 160, 69, SPRITE::NORMAL, 0);
	canvas.drawRectangle(32, 125, jjResolutionWidth - 64, 3, 69, SPRITE::NORMAL, 0);
	canvas.drawString(200, 48, "Sample " + curSample + ": " + sampleNames[curSample], STRING::SMALL, STRING::NORMAL);
	canvas.drawString(228, 64, "Octave: " + (curOctave + 1), STRING::SMALL, STRING::NORMAL);
	canvas.drawString(384, 64, "Volume: " + curVolume, STRING::SMALL, STRING::NORMAL);
	canvas.drawString(200, 114, "Play new notes", STRING::SMALL, STRING::NORMAL);
	if (playNewNotes) {
		canvas.drawSprite(360, 112, ANIM::CUSTOM[customAnimID], 1, 1, 0, SPRITE::NORMAL, 0);
	} else {
		canvas.drawSprite(360, 112, ANIM::CUSTOM[customAnimID], 1, 0, 0, SPRITE::NORMAL, 0);
	}
	
	canvas.drawSprite(212, 84, ANIM::CUSTOM[customAnimID], 2, 0, 0, SPRITE::NORMAL, 0);
	canvas.drawSprite(212 + curOctave * 13.8, 84, ANIM::CUSTOM[customAnimID], 2, 1, 0, SPRITE::NORMAL, 0);
	
	canvas.drawSprite(372, 84, ANIM::CUSTOM[customAnimID], 2, 0, 0, SPRITE::NORMAL, 0);
	canvas.drawSprite(372 + curVolume * 2, 84, ANIM::CUSTOM[customAnimID], 2, 1, 0, SPRITE::NORMAL, 0);
	
	for (int i = 0; i < 4; i++) {
		if (i < 2) {
			canvas.drawSprite(48 + i * 72, 48, ANIM::CUSTOM[customAnimID], 0, i, 0, SPRITE::NORMAL, 0);
		}
		
		for (int j = -9; j < 9; j++) {
			if (currentRow + j > -1 && currentRow + j < 256) {
				if (channelSamples[i][currentRow + j] != 0) {
					canvas.drawString(96 + i * 128, 304 + j * 16, "" + channelSamples[i][currentRow + j], STRING::SMALL, STRING::NORMAL);
					canvas.drawString(128 + i * 128, 304 + j * 16, "|||" + availableNotes[channelNotes[i][currentRow + j]], STRING::SMALL, STRING::NORMAL);
					canvas.drawString(176 + i * 128, 304 + j * 16, "|v" + channelVolumes[i][currentRow + j], STRING::SMALL, STRING::NORMAL);
					canvas.drawString(48, 304 + j * 16, "" + (currentRow + j), STRING::SMALL, STRING::NORMAL);
				} else {
					canvas.drawString(96 + i * 128, 304 + j * 16, "-", STRING::SMALL, STRING::NORMAL);
					canvas.drawString(128 + i * 128, 304 + j * 16, "|||---", STRING::SMALL, STRING::NORMAL);
					canvas.drawString(176 + i * 128, 304 + j * 16, "|---", STRING::SMALL, STRING::NORMAL);
					canvas.drawString(48, 304 + j * 16, "" + (currentRow + j), STRING::SMALL, STRING::NORMAL);
				}
				canvas.drawString(48, 142, "Row", STRING::SMALL, STRING::NORMAL);
				if (i == curChannel) {
					canvas.drawString(106 + i * 128, 142, "|||||||Channel " + (i + 1), STRING::SMALL, STRING::NORMAL);
				} else {
					canvas.drawString(106 + i * 128, 142, "Channel " + (i + 1), STRING::SMALL, STRING::DARK);
				}
			}
		}
	}
	return true;
}

bool onDrawScore(jjPLAYER@ p, jjCANVAS@ canvas) {
	return true;
}

bool onDrawAmmo(jjPLAYER@ p, jjCANVAS@ canvas) {
	return true;
}

bool onDrawLives(jjPLAYER@ p, jjCANVAS@ canvas) {
	return true;
}