From 9c5ce53a4cc84afd85dbba0ea8a9a8b0361cb914 Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Tue, 28 Jan 2020 05:40:54 +0100 Subject: [PATCH 01/24] updated to cc65 V2.18. --- Makefile | 10 +++++----- nrom.cfg | 30 +++++++++++++++--------------- runtime.lib | Bin 107045 -> 0 bytes 3 files changed, 20 insertions(+), 20 deletions(-) delete mode 100644 runtime.lib diff --git a/Makefile b/Makefile index e75dc72..8dfdad9 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ ROM_CONFIG = nrom.cfg CRT_OBJ = crt0.o GAME_OBJ = game.o -RUNTIME_LIB = runtime.lib - +RUNTIME_LIB = nes.lib +CC65_HOME = /usr/share/cc65 EXECUTABLE = splatood.nes ASM = ca65 @@ -18,10 +18,10 @@ crt0.o: *.s *.chr $(CC) -Oi $< --add-source %.o: %.s - $(ASM) $< + CC65_HOME=$(CC65_HOME) $(ASM) $< -$(EXECUTABLE): $(GAME_OBJ) $(ROM_CONFIG) $(CRT_OBJ) $(RUNTIME_LIB) - $(LD) -C $(ROM_CONFIG) -o $(EXECUTABLE) $(CRT_OBJ) $(GAME_OBJ) $(RUNTIME_LIB) +$(EXECUTABLE): $(GAME_OBJ) $(ROM_CONFIG) $(CRT_OBJ) + CC65_HOME=$(CC65_HOME) $(LD) -C $(ROM_CONFIG) -o $(EXECUTABLE) $(CRT_OBJ) $(GAME_OBJ) $(RUNTIME_LIB) clean: rm -f game.s *.o *.nes diff --git a/nrom.cfg b/nrom.cfg index 4a67b7c..1e59c84 100644 --- a/nrom.cfg +++ b/nrom.cfg @@ -2,9 +2,9 @@ MEMORY { ZP: start = $0000, size = $0100, type = rw, define = yes; HEADER: start = $0000, size = $0010, file = %O ,fill = yes; - PRG: start = $8000, size = $7fc0, file = %O ,fill = yes, define = yes; - DMC: start = $ffc0, size = $003a, file = %O, fill = yes; - VECTORS: start = $fffa, size = $0006, file = %O, fill = yes; + PRG: start = $8000, size = $7fc0, file = %O ,fill = yes, define = yes; + DMC: start = $ffc0, size = $003a, file = %O, fill = yes; + VECTORS: start = $fffa, size = $0006, file = %O, fill = yes; CHR: start = $0000, size = $2000, file = %O, fill = yes; RAM: start = $0300, size = $0500, define = yes; @@ -16,14 +16,14 @@ SEGMENTS { HEADER: load = HEADER, type = ro; STARTUP: load = PRG, type = ro, define = yes; - LOWCODE: load = PRG, type = ro, optional = yes; - INIT: load = PRG, type = ro, define = yes, optional = yes; + LOWCODE: load = PRG, type = ro, optional = yes; + ONCE: load = PRG, type = ro, optional = yes; CODE: load = PRG, type = ro, define = yes; RODATA: load = PRG, type = ro, define = yes; DATA: load = PRG, run = RAM, type = rw, define = yes; - VECTORS: load = VECTORS, type = rw; - SAMPLES: load = DMC, type = rw; - CHARS: load = CHR, type = rw; + VECTORS: load = VECTORS, type = ro; + SAMPLES: load = DMC, type = ro; + CHARS: load = CHR, type = ro; BSS: load = RAM, type = bss, define = yes; HEAP: load = RAM, type = bss, optional = yes; ZEROPAGE: load = ZP, type = zp; @@ -32,7 +32,7 @@ SEGMENTS { FEATURES { - CONDES: segment = INIT, + CONDES: segment = ONCE, type = constructor, label = __CONSTRUCTOR_TABLE__, count = __CONSTRUCTOR_COUNT__; @@ -49,11 +49,11 @@ FEATURES { SYMBOLS { - __STACKSIZE__ = $0500; # 5 pages stack - - NES_MAPPER = 0; # mapper number - NES_PRG_BANKS = 2; # number of 16K PRG banks, change to 2 for NROM256 - NES_CHR_BANKS = 1; # number of 8K CHR banks - NES_MIRRORING = 0; # 0 horizontal, 1 vertical, 8 four screen + __STACKSIZE__: type = weak, value = $0500; # 5 pages stack + + NES_MAPPER: type = weak, value = 0; # mapper number + NES_PRG_BANKS: type = weak, value = 2; # number of 16K PRG banks, change to 2 for NROM256 + NES_CHR_BANKS: type = weak, value = 1; # number of 8K CHR banks + NES_MIRRORING: type = weak, value = 0; # 0 horizontal, 1 vertical, 8 four screen } diff --git a/runtime.lib b/runtime.lib deleted file mode 100644 index fa9a1129ef0aa5b108195d3c96ea441caef8b425..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107045 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 Date: Tue, 28 Jan 2020 05:44:18 +0100 Subject: [PATCH 02/24] fixed typo. --- game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game.c b/game.c index 8493b8b..fd460d6 100644 --- a/game.c +++ b/game.c @@ -1065,7 +1065,7 @@ void game_loop(void) { case DIR_UP: spr_dir = SPR_UP; break; } oam_meta_spr( - px, py, spr, SprPlayers[i][player_wpn[i]][spr_dir][anim_frame], + px, py, spr, SprPlayers[i][player_wpn[i]][spr_dir][anim_frame] ); spr-=16; } From 263f1ae341d264c43f6b736fd21d4e43b277d879 Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Tue, 28 Jan 2020 05:45:58 +0100 Subject: [PATCH 03/24] updated to cc65 V2.18. --- game.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game.c b/game.c index fd460d6..60bf538 100644 --- a/game.c +++ b/game.c @@ -174,8 +174,8 @@ static unsigned char palette_state[64]; /* All the globals after this end up in the zeropage. */ -#pragma bssseg (push,"ZEROPAGE") -#pragma dataseg(push,"ZEROPAGE") +#pragma bss-name (push,"ZEROPAGE") +#pragma data-name (push,"ZEROPAGE") static unsigned char i,j; static unsigned char ptr,spr; From d5691ca8bc6324b0624d9d1255f45e56a22dba37 Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Tue, 28 Jan 2020 08:58:10 +0100 Subject: [PATCH 04/24] added ai enemy. --- game.c | 130 ++++++++++++++++++++++++++++++++++++++++++++------- splatood.nes | Bin 40976 -> 40976 bytes 2 files changed, 113 insertions(+), 17 deletions(-) diff --git a/game.c b/game.c index 60bf538..993f832 100644 --- a/game.c +++ b/game.c @@ -57,6 +57,7 @@ extern const unsigned char music_music_data[]; #define NUM_WPNS 2 #define WPN_ROLLER 0 #define WPN_CHARGER 1 +//#define WPN_AI 2 /* Tuneable gameplay parameters */ #define RESPAWN_TIME 64 @@ -177,7 +178,7 @@ static unsigned char palette_state[64]; #pragma bss-name (push,"ZEROPAGE") #pragma data-name (push,"ZEROPAGE") -static unsigned char i,j; +static unsigned char i,j,k; static unsigned char ptr,spr; static unsigned char px,py; static unsigned char wait; @@ -193,6 +194,7 @@ static unsigned int player_y_spawn [PLAYER_MAX]; static unsigned int player_x [PLAYER_MAX]; static unsigned int player_y [PLAYER_MAX]; +static unsigned char player_dir_index [PLAYER_MAX]; static unsigned char player_dir [PLAYER_MAX]; static int player_cnt [PLAYER_MAX]; static unsigned int player_speed [PLAYER_MAX]; @@ -203,6 +205,9 @@ static unsigned char player_diag_flip[PLAYER_MAX]; static unsigned char player_wpn [PLAYER_MAX]; static unsigned char player_charge [PLAYER_MAX]; +static unsigned char player_ai [PLAYER_MAX]; +const unsigned char dirs[4]={ DIR_LEFT,DIR_UP,DIR_RIGHT,DIR_DOWN }; //basic maze strategy: always turn right + static unsigned int projectile_x [PLAYER_MAX]; static unsigned int projectile_y [PLAYER_MAX]; static unsigned char projectile_dir [PLAYER_MAX]; @@ -248,7 +253,20 @@ void clear_update_list() { /** - * Set the pallete for a tile in the attribute table. + * Get the palette value for a tile in the attribute table. + */ +unsigned char get_tile_palette(unsigned char x_idx, unsigned char y_idx) { + unsigned char palette_mask; + unsigned char palette_address; + unsigned char palette_shift_val; + palette_address = (y_idx / 2) * 8 + x_idx / 2; + palette_shift_val = (y_idx % 2)*4 + (x_idx % 2)*2; + palette_mask = (0x03 << palette_shift_val); + return (palette_state[palette_address]&palette_mask)>>palette_shift_val; +} + +/** + * Set the palette value for a tile in the attribute table. */ void set_tile_palette(unsigned char x_idx, unsigned char y_idx, unsigned char value) { unsigned char palette_mask; @@ -552,6 +570,10 @@ void show_select_weapon(void) { anim_frame = 0; + //default ai for player 2 + player_ai[0]=0; + player_ai[1]=1; + while (1) { next: @@ -583,6 +605,7 @@ void show_select_weapon(void) { i++; for (player_id = 0; player_id < 2; player_id++) { j = pad_trigger(player_id); + if((j!=0)&&(player_id==1)) player_ai[player_id]=0; //disable ai if player 2 presses any key at weapon select screen /* Start - Select weapon */ if (j & PAD_START) return; /* Up - move cursor up */ @@ -773,7 +796,7 @@ void show_endgame(void) { } /* - * Move a projectile if the is no wall + * Move a projectile if there is no wall */ void projectile_move(unsigned char id) { unsigned char map_type = 0; @@ -829,20 +852,78 @@ void projectile_move(unsigned char id) { } +/** + * Player movement test. + * + * Allows AI to test movement directions without actual movement. + */ +unsigned char player_move_test(unsigned char id,unsigned char dir_index) { + unsigned char map_type = 0; + /*if (player_cooldown[id]) { + return 0; + }*/ + + px=player_x[id]>>(TILE_SIZE_BIT+FP_BITS); + py=player_y[id]>>(TILE_SIZE_BIT+FP_BITS); + + switch (dir_index%4) { + case 0: --px; break; + case 2: ++px; break; + case 1: --py; break; + case 3: ++py; break; + } + + + if (px > MAP_WDT-1) { + return 0; + } + + if (py > MAP_HGT-1) { + return 0; + } + + /* + * Wall tiles: + * 0x22~0x29 + * 0x32~0x39 + */ + map_type = map[MAP_ADR(px, py)]; + + //inkable + if((can_ink(map_type)) && (get_tile_palette(px,py)!=id+1)){ + //set_tile_palette(2,2,id); + return 2; + } + + //wall + if ((map_type >= 0x22 && map_type <= 0x29) || (map_type >= 0x32 && map_type <= 0x39)) { + return 0; + } + + //water + if (map_type == 0x2c || map_type == 0x2d || map_type == 0x3c || map_type == 0x3d) { + return 0; + } + + return 1; +} + + /** * Player movement. * * Player movement is tile-by-tile with an animation between * tiles that we need to initialize. */ -void player_move(unsigned char id,unsigned char dir) { +void player_move(unsigned char id,unsigned char dir_index) { unsigned char map_type = 0; if (player_cooldown[id]) { return; } /* We always set direction so sprites update facing */ - player_dir[id]=dir; + player_dir_index[id]=dir_index; + player_dir[id]=dirs[dir_index]; /* A pad direction is being held, so animate */ player_anim_cnt[id] += 1; @@ -857,11 +938,11 @@ void player_move(unsigned char id,unsigned char dir) { px=player_x[id]>>(TILE_SIZE_BIT+FP_BITS); py=player_y[id]>>(TILE_SIZE_BIT+FP_BITS); - switch (dir) { - case DIR_LEFT: --px; break; - case DIR_RIGHT: ++px; break; - case DIR_UP: --py; break; - case DIR_DOWN: ++py; break; + switch (dir_index) { + case 0: --px; break; + case 2: ++px; break; + case 1: --py; break; + case 3: ++py; break; } @@ -941,6 +1022,7 @@ void player_die(unsigned char id) { */ void game_loop(void) { unsigned char map_type; + unsigned char diri; ppu_off(); @@ -1170,8 +1252,22 @@ void game_loop(void) { /* No current movement, accept input. */ if (!player_cnt[i]) { - /* Read pad state. */ - j = pad_state(i); + if(player_ai[i]==1){ + // AI + if(player_dir[i]==DIR_NONE) j=rand8()%4; //random start direction + else j=player_dir_index[i]; //prefer movements in the same direction + diri=255; + for(k=0;k<8;k++){ + if(player_move_test(i,j+k)==2){ diri=j+k; break;} //prefer inkable uninked directions + if((diri==255)&&(player_move_test(i,j+k)==1)) diri=j+k; //prefer movement over walls/water + } + if(diri==255) j=PAD_A; //if no movement is possible just fire weapon + else j=dirs[diri%4]; + if(rand8()<16) j=PAD_A; //random weapon usage as ai is not aware of enemy positions yet + }else{ + /* Read pad state if ai is disabled. */ + j = pad_state(i); + } if (player_cooldown[i]) { player_cooldown[i] -= 1; @@ -1181,13 +1277,13 @@ void game_loop(void) { /* Give priority new new direction (useful for cornering) */ j &= ~player_dir[i]; player_diag_flip[i] = 0; - player_move(i, player_dir[i]); + player_move(i, player_dir_index[i]); } - if (j&PAD_LEFT) player_move(i,DIR_LEFT); - if (j&PAD_RIGHT) player_move(i,DIR_RIGHT); - if (j&PAD_UP) player_move(i,DIR_UP); - if (j&PAD_DOWN) player_move(i,DIR_DOWN); + if (j&PAD_LEFT) player_move(i,0); + if (j&PAD_RIGHT) player_move(i,2); + if (j&PAD_UP) player_move(i,1); + if (j&PAD_DOWN) player_move(i,3); if (j&PAD_A) player_make_projectile(i); else player_charge[i] = 0; } diff --git a/splatood.nes b/splatood.nes index 5502bcc2b916c0c2cb53371de459107b7332cd09..87df04f703d339b928c7f4a2b5b0552fccc9af22 100644 GIT binary patch delta 11736 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 R$8SUM!Qahlh%bm0{tqsIwT=J) From 83896c11fdc978b84d37a36f835e579c286b111f Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Tue, 28 Jan 2020 09:37:58 +0100 Subject: [PATCH 05/24] updated credits. --- game.c | 12 +++++++----- splatood.nes | Bin 40976 -> 40976 bytes 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/game.c b/game.c index 993f832..950c932 100644 --- a/game.c +++ b/game.c @@ -127,11 +127,13 @@ const unsigned char credits_10[] = " Graphics"; const unsigned char credits_11[] = " Squid Meier"; const unsigned char credits_12[] = " Game Mechanics"; const unsigned char credits_13[] = " American McGill"; -const unsigned char credits_14[] = " Splatoon (C) 2015"; -const unsigned char credits_15[] = " Nintendo"; -const unsigned char credits_16[] = "Thanks for playing!"; +const unsigned char credits_14[] = " AI Programming"; +const unsigned char credits_15[] = " Simon U. Richter"; +const unsigned char credits_16[] = " Splatoon (C) 2015"; +const unsigned char credits_17[] = " Nintendo"; +const unsigned char credits_18[] = "Thanks for playing!"; -const unsigned char * credits[] = { credits_0, credits_1, credits_2, credits_3, credits_4, credits_5, credits_6, credits_7, credits_8, credits_9, credits_10, credits_11, credits_12, credits_13, credits_14, credits_15, credits_16, zero, zero, zero }; +const unsigned char * credits[] = { credits_0, credits_1, credits_2, credits_3, credits_4, credits_5, credits_6, credits_7, credits_8, credits_9, credits_10, credits_11, credits_12, credits_13, credits_14, credits_15, credits_16, credits_17, credits_18, zero, zero, zero }; const unsigned char select_map[] = "Select Map"; const unsigned char level_kelpdome[] = "Kelp Dome"; @@ -652,7 +654,7 @@ void show_credits() { sum = NAMETABLE_C; - while (i < 17) { /* 4 6 A C */ + while (i < 19) { /* 4 6 A C */ ppu_wait_nmi(); ppu_off(); vram_adr(sum); diff --git a/splatood.nes b/splatood.nes index 87df04f703d339b928c7f4a2b5b0552fccc9af22..2ab478ae4266110c269fbd8091eabcf374bcb922 100644 GIT binary patch delta 423 zcmbPmfN8=3rVY-#j5?cLc%>K_9Vf^0l?pp9V(E}5JU)T(MeD`3OB;``*y%X=IiHQR zBa4DruaDjqg(aI;GOU<*{G`JML7?nPhMA6&?fBgo9XGe~?__2Soop{`!`Q#MMp%-O zasB3LB41e;g*W#|9%E(;+<1Ng^1U_7!OYF zS6In-c(SEpC}ZH}ennPB#{S7um6U)k+o5CzWWQHZ2O2G|9Ki_GQJ}Ji@#tn<)&C$> z5SdW*Da?$=HowyHW@6ksxl31ea;(XX}z$Lq4nZQ=GIG#)@`0?Y|R8zb=A~NO<6&~(NiIyC_lX@F*i3eFP%X_ zAviNPKTjc4Pa!BXIin=CXfkI^xn#nfpT}n1I&~}S&d*aIy5i2yb0E5H^2``NEuK5_ wcZ}{h-r>3pg1uJEeb&sqj?8^d%pE)b|L^sNP+rVEzMFYtuPANiYG6|U0I4Od3;+NC delta 396 zcmbPmfN8=3rVY-#j2fF=c%>K_Z70X`l?vM~V(E}5JU)T(MeD`3OB;``*l9cYIiHQR zEsKI#uaDjqg(aI;GOU<*{G`JML7?nPhMBgL?fBgoZ8x{_?__2)m~1a>!VJ?b zh)k&Z6lTVSn_p>pGcnGX+@&i!Iat>W%yI^j=XBk{q~vCOz0W`sHY*#%GE44UbjL@7 zIbr3_*7Gaxv|d=r(0XwtbL*u=n>Nohwq^pVx@u~sHrXJiRMPs+&ttQ0ox0_E=jSO9 z9en5KIS`#Vd0&j5KJOiwJ6yLxu-A;a&z!l}mbuT4xnt-5|Gn-I%8j|llUd>a{{{aq VyhzyW7<*D_azL#1X08S{1pv*cqk{kd From dc29e6c233ddde70b6c164e44764a11ae0c835c0 Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Tue, 28 Jan 2020 10:15:16 +0100 Subject: [PATCH 06/24] fixed typo. --- game.c | 2 +- splatood.nes | Bin 40976 -> 40976 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/game.c b/game.c index 950c932..bccce16 100644 --- a/game.c +++ b/game.c @@ -1259,7 +1259,7 @@ void game_loop(void) { if(player_dir[i]==DIR_NONE) j=rand8()%4; //random start direction else j=player_dir_index[i]; //prefer movements in the same direction diri=255; - for(k=0;k<8;k++){ + for(k=0;k<4;k++){ if(player_move_test(i,j+k)==2){ diri=j+k; break;} //prefer inkable uninked directions if((diri==255)&&(player_move_test(i,j+k)==1)) diri=j+k; //prefer movement over walls/water } diff --git a/splatood.nes b/splatood.nes index 2ab478ae4266110c269fbd8091eabcf374bcb922..510594ba2decf5ccc2819012dbf7e63f9033c831 100644 GIT binary patch delta 16 XcmbPmfN8=3rVSlhj4Ycwwc1MoIgJKx delta 16 XcmbPmfN8=3rVSlhj2xRgwc1MoIi&`2 From e3ee431517aec0b31fa9e8996d9a689dbbc357ab Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Tue, 28 Jan 2020 13:00:03 +0100 Subject: [PATCH 07/24] improved movement evaluation. --- game.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/game.c b/game.c index bccce16..410bd2f 100644 --- a/game.c +++ b/game.c @@ -861,6 +861,8 @@ void projectile_move(unsigned char id) { */ unsigned char player_move_test(unsigned char id,unsigned char dir_index) { unsigned char map_type = 0; + unsigned char tile_palette; + unsigned char is_wall=0; /*if (player_cooldown[id]) { return 0; }*/ @@ -891,23 +893,22 @@ unsigned char player_move_test(unsigned char id,unsigned char dir_index) { */ map_type = map[MAP_ADR(px, py)]; + //water + if(map_type == 0x2c || map_type == 0x2d || map_type == 0x3c || map_type == 0x3d) return 0; + + if((map_type >= 0x22 && map_type <= 0x29) || (map_type >= 0x32 && map_type <= 0x39)) is_wall=1; + //inkable - if((can_ink(map_type)) && (get_tile_palette(px,py)!=id+1)){ - //set_tile_palette(2,2,id); - return 2; - } + if(can_ink(map_type)){ - //wall - if ((map_type >= 0x22 && map_type <= 0x29) || (map_type >= 0x32 && map_type <= 0x39)) { - return 0; - } + tile_palette=get_tile_palette(px,py); - //water - if (map_type == 0x2c || map_type == 0x2d || map_type == 0x3c || map_type == 0x3d) { - return 0; + if(tile_palette==id+1) return 1-is_wall; //already inked + if(tile_palette==2-id) return 4; //enemy ink + else return 3-is_wall; //uninked } - - return 1; + + return 0; } @@ -1024,7 +1025,7 @@ void player_die(unsigned char id) { */ void game_loop(void) { unsigned char map_type; - unsigned char diri; + unsigned char diri,dirv,dirtest; ppu_off(); @@ -1254,16 +1255,17 @@ void game_loop(void) { /* No current movement, accept input. */ if (!player_cnt[i]) { - if(player_ai[i]==1){ + if(player_ai[i]!=0){ // AI if(player_dir[i]==DIR_NONE) j=rand8()%4; //random start direction else j=player_dir_index[i]; //prefer movements in the same direction - diri=255; + diri=255; dirv=0; for(k=0;k<4;k++){ - if(player_move_test(i,j+k)==2){ diri=j+k; break;} //prefer inkable uninked directions - if((diri==255)&&(player_move_test(i,j+k)==1)) diri=j+k; //prefer movement over walls/water + dirtest=player_move_test(i,j+k); + if(dirtest>dirv){dirv=dirtest; diri=j+k; if(dirtest==4) break;} + else if((dirtest==dirv)&&(dirv==1)&&(rand8()<8)){dirv=dirtest; diri=j+k;} } - if(diri==255) j=PAD_A; //if no movement is possible just fire weapon + if(dirv==0) j=PAD_A; //if no movement is possible just fire weapon else j=dirs[diri%4]; if(rand8()<16) j=PAD_A; //random weapon usage as ai is not aware of enemy positions yet }else{ From 6f0f2e8270489d7254e096d77bfc66911705ee5d Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Tue, 28 Jan 2020 13:13:04 +0100 Subject: [PATCH 08/24] remove compiled binary from vcs. --- splatood.nes | Bin 40976 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 splatood.nes diff --git a/splatood.nes b/splatood.nes deleted file mode 100644 index 510594ba2decf5ccc2819012dbf7e63f9033c831..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40976 zcmeHw3t&@Ky6)OZ+NPz@pgaQ9c30(5UM*0tKxqRiFXM<0bRNzagd$bm55*az3GFUW zh_r|bXra>~4Czc26bC`7L7)$0Z1f&23Zr$DiZgRG9!CYCtD|#EUIvKU%T-q@z;kLPbWo{aCPNP4K%albq^S znEdNiepbQczZX_Cm%rp=a!pZ1WqGySd!4^U>814cGjEiPf6k9zm|Q%0^JJer)gClE zzwlJB$IY_e@sO6kuH}c-yb7eF8mdOiYjsk+hB~I@ zZ|I~yYp6H1yg?_uCGCl$I^Wjv|E1_qF__PWp?6`asJ+RCAv> z6kBBWMTgAt*+O`S_mnRlF7kDz2l?A)_eyfJ)NJyZ>Z5}ebcjhlvwF_1IhAu9N>WjB z1@p^_T+a3+l?9|Tbv1JE>*g4jMzIAy;U!yf@T8I?KeIPAxzb0BU_p>D5^0iyXNzK7 zmDT@Ll(^~^Md_qykd>fVK=M7Sik-Qu&|jY_cIO=hK6|WP6s*Co0osCJD0Y{RxnNEh zp>+l+_^m6BQmU*Z`Ff;&7?q^-a8<(6+PX56iJlUFGCa%7CSR>R&!W_pn40T~QQ}P~ z2WgFR9X+n!Q(L(wsoovBuFjr&9r*Vop>RFwLV+~lY2x)d&#&^;=9x5Au1bGMH^?t3 zW;J?!EEElwMuom}=}6bEqGWhDX-|?O*9A?@$V zSm=G&S{&@+OR5j;wkn-TL8w!vFX^)o02BNkyH|-XPL<#Qa>NDh2tsxNGJ@)fA-s^r z@wD^4F6ezeT6{eb0#}bl;>_W#%-X0EEg@;v1+TX)5^8{5*26>qtUxhBgG7tX1Cshg|vC7a9FE3U*e zr9tWC^7W=tqte?YA1ajJD9r6eg-VoMO0S~cF2zz56&0mK^8(DZ)YUt7Uxi_UlJ<;| zo!=E!`g%0EORP=d(7;$r(3E-}PAg8O$uPoLNhRv8Z~3T#kP8zfI9$NG$Z=@v&XiDm z1>J}~qulFtLN6znGG@yd{phA8@sYz+>*F3oM^AgN-hC3W*4R?6z3%$H{rV3`9XM#P&1Op< zHhe_J$Wb?Bjvg~MOP1yI|6qDNS6V+?D(X|1SP92Eyt5=ZX?3}@r;qmmsSeLM{5g+5 z=S%*ucZTGhDftt;-5q|n*Gh4i;P9t=nZs*wc;gY0UdiE&BK%azyFjYA!OzONNo5IA zS)5dMo#an18-TekD|iNh+`p`cNwB7vt9RzeUu1wV5=mkWcQgH?&;?5#e#?~POX z#8t-S_9^O<+b1t-S5>a0^nsNXH|*&H8CY2sCDmP~np0J?q>!nOnv%yG@gOSmJ|y|0 zy>lg)=&B5L2ZBjnv*eAIys=W%R4LXSj6#;0PYk|3lYNPk0j8Uxl3*SM;?Q4e*K?5=7?Jrso=!o<_3xer!> z#8{RdKefbs5hEf_%G~{{)cmQtW8&g4JW5X0k1M$)G^jp1lwtSv$upPrl6;AItSpHt zxQxeHK1bDRbMBCuKM6QDcHHX7Y(oKBnd+W z5sk7hk&1jEyPjJhg}PT(b$6uNLXr!kw%B>PxI%h-0U8iz&+RjB9twUoZ$8?>C8$B( zs~oV&do_RB9Ddo`)!|RZyx_u+3tG>u=QgBptz7&*PN@Dd& z@EvqZ_C0;lJBJeMpmH;GI$u~wjlC<+0r*|DHL>Q$a=&C))j$Tu86$;*k zQuQhc&d8-+Rv;w@$fv{J1frMx+lJ#Hw!nw=yStd1=PCudcbf z-`O{P`M((5>--0YD>wdT_8mDx660Gw|L9-ps$bZ({VA`q^5KPfGk^8dJ8zphaYFW( z8#0CsWzkr@El6fcCN)Wh6gkserVvdENW+g)P|iXz{!tZP=U}r--oKYNlRHwkY{wDB zmukj1tTr8 z^TndZxPFcHa`U2EUt`^(T3&Yr_Pv6nG}P^>wdXc~AXmLuZr)Q{E|t~-SI$an%Pn9W z<#mqOi;ZNeKdfvg=%`WqF@CB|5PZMT$~%6L-M32Rgy<=GKdun`$V!> z@Id)4zd3G=?ZSiQrqbFqdun&>A8%0_$T58zkVE}0U&B-|46IN@Jz@;E)}C7r&%6a+`LC-}8*0xBaA%>-)Ch9e z(7o~w99Vai)?$~~6?i|}GTyQap3ak;DI1(7-kz!#l|YwEK?z3Rt>y4Md3b*>Rdl26k9(w6oq~`x1oX+!+O6&O`tQj zY{qVRuYbP0sh~mzI7RWFt9Vsz*js_~p`2YP&9{7~=q<=%oExqMT>52*na?nmIuxrP2XD)pB$e~@JcITOis`}fO5 zlU(W#m5Y*pzS?glk#rJCh?K}dOxap9GT4V>eOptpeE8Fy)un!!Si#V|wS8Y5(;TIC ziopYVn{+E9m19o|k72CBX-paF8(MGMovhY9l-Hf$9KBJk+amu%X&&lK*~lkEL^MSs zB7=vbxukcwMgDZJf0jJ+CF=Y*`GuG4dAsFlD&16KSLtzW>0D0dr^%yXFU?3=10 zq{&eUqCO0e278{H)B;5eG#g829QUP|R0aB{+k7wvgw zSfWngc^i}l&`cG{5P+EyL#Ehd{65tC+aHO&h7q6OjPK4624@F zDQT(JdKNM}yYBU+VL#Nr9qDpN!_KFJQGT;?+@_kRojIGpYzao=DTj7mMx^;^5~{ZZ z&Be;oa@W1iC!V0Glqnu%mF`dfF}O8t)%UvfGji+m+^uv?Sb+IRc}7uiiBjbA1oN<9 z_-FA+ei~*N!fKowR0L5zvx?NM*VWlb=c5(x zI~P3JPDTDXXhOR(x(SHMhz;mb>Q!|)y}S*+RmNs5Clh39Rv|U3;6KX;wr=H{nM#iw1>X$~^sy@{Dul(}>FEq2+8d_90kdwQ*T*D*lX3Gfi=)o56ya zVsD|6=1U97#1QO_ky|eXul6fg%asN{!(K-TQkOR%9<6#T-{|+0Gb0b29_;S-7*U%c z<$PvSYb5wGKa)6t$9X)S4j%39(8P9>VjjVstd(AwXpMmtnVdRWZOh zWed%6)HnX&-(Q2@V$U7Qm({Bg6nmfc&-#9u_In%NakgyvA+0hvv6V-Rt!-jKQ~j)x z-TrRQe_;9*%Ot86bNIQ6w<(m=O`*1I`rqf%JWbty^ZEux4GKmpgJ9A?-{7brC=Wq- zuy3F}cd(M_8v*gUZ)GH|SNX~tUAXpJsKMQW2Nsw<$)L1B?o*N_A zzUcoOb$6XV1sy!5oT2C&iw-x*lQ#NiAqJE&6a>mxV*Tf3S$U%ui@N#lgx57N^Ymb) z(KqPykf_FzUZI{9DgJsgG=vsn&3{k1!LK;yJmVX@bI2!yf_;t-3=+#5#Bxz*c^51| zHy9+}hh$G>lp$U(2~)Cns%r1GXxc!vX@k%-Gnz)!J9X+{l{!RFv0_?iCxbnJg~Cey z^Im^E4T$2?W3d%^_r=|IEYH57k%4bN~s%-V1o=BW5Kj3$*a=2>lP z(*9NhQ**Pk&j#AD(zcOiz+L+{@S=&1HR`-ms-2AKAk)w!9@ zG`sdc$%37E35Tu?4Cmo;gR0ek!Yc0zV*bKJdi$OR z@~vFEp)$l>J%T`A23$>tZ_Gb%BYCC%+7e6sz>+wWhL_mt$Lx-;Q;(Irg@%T-_SI%A zSo}gjb+4&XxHQ+$UZWrK4EPM3B+a3Odfbd*-HNX_hpuu)Z-WP-x4{D_Wl%}=Kr|f; zllN*(x2WaIHW|Z@H+g_>1bQ95`O2&Ae8^?$r29!QXgS&tg5J&4g@^^Xz)BqkH+11{ zzy~DA$L!{{p)?rh)gd^qX5qX#j-OZk+f=h~UNw4wqU1NU!KK(xxBXAf^Dl@56~%|EC#MsU39rdBD#1KN?Y=2$Rfsa3yqHE zqnSIpt2VSf469*3*s^PX0mI!$AAbQ|Rq3u>;|I`ysO`F!MtOu(Uv!LwJXq=d%+3!& zhcI?nX}uqJ653=C>9+-p_ggtGT}8mJ-i6Dx%FUcb$BJQqA*P2BjTK5381HBenpoio}MPk7zp5%@VT_uo>Ui#qIVgqF0?e;79aK1^cZwmFDVA zGQ{pL^-<5ymLp!$ZOLm_V#XCD#7LmUB)X`J%8uEjYG3%GBEn9zM8N z!oAq9>3biBjRe26(e@H_g2dJ0We>)YZ3eEI0<_7+6(71CS4|GNTiXjMe)pv5RHvTH zYVNx#!e`j9wmq7s(LwZHf0nY1Z|+7F-JlFpMv^J&od}KH9Xt3w6SyoK-MM)(%o9ka zq}9t{+q7dx+Wsu2498j&Q{OdYcK&R~j(g$81+3C{uev;n-h**zxRS-Ji*eCVSIqB< zH6GDl;Gs(g{KFxqHH+vrejGu^?YMW#V+@achGQDAjVj{i z{6;rtnV1Oi=|Af5bCxXyIz#IvidVFOHQ(#E*>gwY#%iE4+&8Rwm_6@y8tb%7`i7Gx z-*8;hP#e`=LM`?@x-QScWymyzZUWPs_x{fBu;-3aMwOVFZ@@lfhyaIZmEayw&Y^Z!>?0>!?cTzXIoPZ(olWbn;0KO zpfbFI!Q<0>>dvxxt8YutiW|;ke92@RT`J*b02|iZV5V=IXf$0R;@T@hrHdg!RWBGv zsn=m*H>_PcD?_nUeFQdbnIb7$d|N_Y{0Fda@4L$XHg15X|DMlC|7o*_Z;M>J8nd6a zq@p@AMa#%gEUt2+K=}D;-?m^Z4llU)m6Xkq;3@u$A%3oZj)z1jjc4_?U>rC#UFuLC zstx6Gd;lfxHIko01z7K&qYyGzNcKE2Az<^>P}j8~Xm+Mn@=jfVxC2zN3qf-)f@U&; z#_arbS0wl%O9pkb=yEqGEID*Q1DroDts1g(U^=0!iE zS#6bQv!fR3^%D9_yVmMfX{gJ<*5s~WyUor)n8wtJL3E6msUw73rJg=QJf`ar^8j`d zLD6@PpmYYCDEhRna!xt6P*?}*b&v8;Nl*L%p{ihSh%ovaVhpoV&?>)Em}+)DMBqFuhyE~3tu0LVrPo__--J~R2ZuC! zZo0gytloqh7Ag~m^AP`HUwt^(yET)9OBcb^obFsE*f5}+r?4SQH7gC9)vaX>TAGIX zF}=ov`UM;;SL41BreHhUleT+$8)JnZs@Yn^f2)U`d7X9WIsMtin>r3bz% z)#*ACg>gL6w*FB>novT~s)b=&Vw*5r-6nzz+gvpaH(>YQUIghDu4|*juq%!zX*UdY zCBl9~xP_wNuqn^B!xNe2uE7L~RTehVG`FD&)7*WS=5FEBTw|4Rj(()LWL7e+e0kN> z55^B}Fw+HF>u^3Bf%PNDkJtGlb+nnPN-sCxUAcV`Jy@N+zo)f{wqNSfbmV#8P|OHQ z8r+|D^xhJ)^EF`9Sxrn;k-nnslP~Qu#CKl|-lg}Un4#L0Z9{~t9b*v3;wbExcm5Vz zY+fF!mN&4_L%M3CS=dI9L40)-Ax%}v|MFrmQx`E-XcQ3vEJP?0QM(#zp@-UQD~XHs zxV;)R_gq?|5NTT@wHF(wH0QYI&_4s7i|ieC&uQyvI+Kd-5mkKenH0M&T*c58&5)24 zmob+5aqu&>lyBJTpZ9IXsB&P7DR$;5YRv;9@doa(8?@CIR^GV#$~!jf0Qvov_Ng;J zI3>M+Pq*;_QGI6w*(-Z+#YuOexW=JNU>UnUeyQn8!v+u^nmpZxiYTT1q!JTc4i3Pv|r8 zPWXyar7xKKuJUg2>~|lW{mz=;-z$CZxIm(BFLA`zgrG$+uAlY~6m<^^50$g7yg$0u zR{9#9efbxiUxH1+zxws$iM; zP8!A4y%6-;P+q6$@^yE2K~y z?rVbQn}f%K-vrV_Q3QSKin;YqrhTXOeYWrOeP8W6yKjWVq?UctUq1fww*BAi|C$|V zQ3pC7xcWe^1IY)7*7v}W10xQMK9Iwqn-7#8c>BP$uS|R8IICp$yz=2I*B-q6;3Ef# zv*_T-gCnc&tS+y%OP{fH>%J(wSbC>@OL#8tdxYl$_O0Og$bG9QUwG5LVh-Q7Z^OO@ z@ZSZ9xYjVt*JR`I$}C(dfjx$6ku1?9(n!Hp#Y1juQ__;@L?d$0Tx$t^yrZz zhmWWz7XQW@b+t#292DwZ<^6a6xT~?IdT+c)z;S4 z)z=?8_Qo5>k28B9P+P0MS#02N9bRFukb$cE}8PwZFg>-ypEOJq-?%P z**I+jE17cJraMc3QZd=9+3Ikg0WY_N_j$IG+O_Oi{6tB)YJ+41?WN(~(_h{;7I>SG)b?mgz6EE$*&TS1EA=dxrA3b*zAGxfIh*#doZAi;A~B>K0XRv$NK( zZmjjIHPwCzwVUUA=$B}3E8lYbE-XYv7+-k(E5_;Un*j^@vt1LrN9rYh3oH*dOm<0PqMJS*F* zfs>?-Hci=hi&Szmm^APfY2(eTbkps(IXx|t4m{NxOx>UA z-c#zz$_(YToi}%Ws%ux~NdmpsQ@#2~-SMjeyc(+{p z%4<22{Q3HVlgW_D)A(2Su2`&|l$ZAV_AcgxRS+1AfH&?}em zr?K|>2N3Nk&0Vz^WE!IYH#gVKf)q2>R#s z*Mx$~3Eo}Vt1Gh$c4e>KIlOvk>8^~`83h@uD>FD|Xw`=H*($SFXBYf2do@%{T)T7V zA6nKPB$WgkRC+5jtC)A^P_I#|m*Y6=1TXaL$}Y(E{&AwpXw>VioKVKrwVXQmG-8Kd z+t-__`KxTZR(PgmTy?R%u-h8E^}K9VH*aCLvR1Fv#XWj>dbC2@in_1qx~f|#u_{Dv znO*(-xpV8zom<=T+v)?=zk2nr)kUvH1o2>v&`&XgtCR>FK6R=vaz4!DJ2_s zNuGn6jWw%S6l@Iey7uy_caedx zHxnK9Oq?`m(BvsoZ*kuGliQ}MGiT+_ zeqc`CgAdJ}H-EvxMT<>KmM(*WzKIV%vi#9s|7OKwEA!o+RRx7g(dsp8ixbza_dd?j zhixcHOf22_#HJ^odV2GgtgVmtF`Wm(~hq*lro3mP0SFiFOd*k?@-%Lzw2)_09|I+OFmv=yV zS0%H?6YRbBRflkUG&DOY3dqTx#8YIC0cj{2?J=N5QMae*qrZOqu|P+1gFPRAa{8lB zA_QZ>Xb*ly``;@7jfSG!CIAiezo;F~J+23!&hUZO;haGYK%I!vhgyeoIs&j2kpQj3 ziB18?(ixjReflrs8FStFI$P&sU@>Dm~iX1KB zmLS*VscuoL(GFw%qE@3F-2T2)msYFVl^hoJt95F%av!MeSL@en(@SIt^#<9m*QS@K zH|S0F3#s;c&nVws@2T=#5oL0Uq4y%;cs;M5qReQ$As9#K^nq(NX*dE!qQtQ=aRf@_lY*1UTLqDYb!d{Zq`=4~stF{02{-;*aOXX6n z`0@QOTA}y9&?|fggvHhwIq^Hd;L>7Fi9=?vX(jaOS^fx_Fvxr|M&V&*sS)W@P>-j+8J3fE{#8R{?*&7MuTY8;33}^ z|2k*;B@us@%abww8!)Ovq2oF6xV=vZ$B)1V87P?5r9X^3Kr;ij0>I0m_=Mx&{?8i! z?OUy5FK4&F8$G9b-1yYj54|6ZC7Sc8nT{ZHTsmRqGcvlZ3tkskW$fs%=)= zVQh_2zUv?%Pjj;RGWu`KSRt?OXw|kD{V(K&wD6zsxR4jH@E>`aT7A80zqSW!?SFCR z(00p5--Lmb+@=LNN((>hB3r#zqz?<+m=$DZP@Ko2{ZH9VfNm}$%! zb31dh@B|=k1mX@L?qu$B@5VK<@J&GCx;*ACAg2@8L?9*saW@e6Fn4leI=ChSIR(g{ z0{JuInhL}%K>QqtUoiL0jdz3VW`{L=lY_-fcUWWYa)4_R5EFs82Z*~J?uQyzH1=s6 z-}peI7u>k13`v9*$v3<#1#!h3=lnl=*ir# zH3q?D1u_;$JCMDID-MWGK=cNp4|AVx{03Z64r|!rU@_et)|hS%aK!)-4Ma~MdN|yj zP9&aqrSYT2m=i-zlr|1K!NLv+K9t}?2|kn{F#(7hfw%*RJ0Tp9Ap=$-VZ(R&d=s9zGloAC89) z$AfDU5EFs82Z+1JyPrQ1IC0+z<-{LOyajFs6%tg~prR}3Gy!1-;wm7nmfU|i@j19G zKt=)C4an}q6%9lT5IunCDY?z>b$bs!1Tq##JCMDID-MWGK=cNpkK|5$Zw$Di#>0o> z;luIpA=wuLL^KdRf#@;becOAk_rfRozIV%ei{5+Z#IpBBpLpy&#$1w>&5&&Detaun zCYG;R==_C})w)QsSr;?AbqSNLOYwI!-ICSjk!-eA%x)`SvaJvw)09Y7d#PlzZ)A4+ z6HK;mVs6HAnH9=xP-f@KmN6?7*`UbI6)DULB{nFrb0tqQD-_tEz)lKe=9*w@2~x_i z1pJNAgzK;GmXHcKC8cY^kRd}75}5jC#0%kGcx$Kx+?gbF!+Rj!C^w(^^3yN>ad+O# zr3)56n!;oxHf3r5CGre;XbkUhrV< z%%!q3cg8FrrY@K>U%qk1;(0S>K9svScP{6FqFa|O$wNo}WWoK*7RYxlT9!8}Z{Cch zOO}CtSKiXOxpF^w+JYrZADA(ZtG#8xgL(3lhh{9Ev1Cpj*D(nc`KH_@c@NAdn5)QL zAQR)f8Jt6wCoP__a8BM#1P2o5kZ;Y+%Uw(`m%lZ4=A0SxRgUrVau?^#oH1X%b>^hJ zx!ln4Q)D#ffyFcC&C8qr0Hp5Bo3~)TJbkEqN8ZdiOG#101p{tOm4~Mf8%es6ev&tT zY3}@43)o$#;Gre*>;;Qucbg^OoAimD!9cRjK|o|v~}4mcp^hVlnbojXSP@>A#Dq`c^q zrum-S84DN8r#P1^Hk%{tu(@T{PU>{B_sJnAvrpcB@>eGpoh&^0{P+a(n*HIh_ZBsqYF>Y#u!UIR$%pJGtiZv%C^7IT;Pi*I^jn)D+TTX3x&fUMXPmMRI~!5-?Q3!AAX(WR6+=p`gdakTp78 zg>)FAJPH1A_~KdA-z4Cs09qsf0VKyrM)mC6 z#S4@!3O=_KgRlGHJC>0|)=~dUW^{XgriRZ!-IN5I3hD5XzczjJ(U&2kUy0Q%__bWV z1a=c_Hpk$LvXRuLU4aW111hyuoC4+k7d4AXVDxpTAIx9 zZpK1q)g<`b9&W!G z@n2uBQG16!-J}3)oR!KfCI&yO452%yKac{U5Xh~1OI4erwhJuiI-WQ`9t%Z5%d@kS z5-k?Q1;zv=L57}-7)l=r_+pcrb;@=HG&r+_v6KsfC^P2qc-$K3aG^kUY){tw3;4^A z{w;*D{H4Z&EQSwc0job5)#K;eufF{9BP2nGIXqGYd<22oB{6fk9;g?h&G=7;Bi@&y z?dgczvo1{{bg)YT{3qxMmG$3=kRsZUK3ZM=? zJai^Tstq6uK*$JZAp!+#Ve0sU>sLO8saoJ)KU{O<2$b`9#`NQ6W|$vib_LL#fk0ET zYDh%y*-PMrgbfW}eERLTLf=3@HDg&b;-N9hp^Wku$``F<_NP&Q0XVjNpGAS}|<|HF#+}k7cP!raRjGzj`R#NRA zsOb-c!cEK)ofUL&I(21!KIC&$b{@cCbe$((L%73*@%Hp-O>T7>#k!yoSokarb3LvC zuGYH?&X=F8H;fQ&it|><(1SFeCx;m`aRw~E)D7G<4!b&B-Axz5U%WzJ`FAhZw7Ah* z=ff>}e4Rb`kCpFVod2Du1!08Iug{Y)t2ewxOR=DTggG`o-j=Sy7Av~O#mrqI@y}cd zuJVB3rW__3Qo>Tr*BUO;u?8M0#?WMu+$Dky*J6CTBOuMAFjQ{`Z#*7?BfNny7qKx1eS z!6d)FaE&G2njW#6^WlN*9QU+d?N{<0HOHQa0A2m4crpX;G&9!X@Jg4sAt`SzSO=f259;Y7a$JaN`W)lL*HB z?Irs~E{7RUx=>S7a{aa3|asA-TVJMb4H^lYV@8OJxim1f+hK@uji-dC(F+5 z&)k=G8zu>wC@zXzqvvS!G=Ud6o%Ql_5;GHQvcn-?jr!?cA=4hRT1+NO9qQ+FyGBR- zoSvxBKlzV#N_KLW_}JKl=s|rtVLpwGK9y*kBrVU+zjhd>-JMr4i@EAYyCK2KT<-KoN2v1$&1ab_8{WLY zH`Rp0&jelUhDUB-IrlAChy?n>T|WOu6T9%;H(iioVtPJ66Xn9)!6q`Isp(8}6W}hL zJMqPd(;-i?ltBOdbI6k{C9a?9p*K&ND|uOi&wl#hYp>9i;(AEk%&CgoeMZ}xm^r31&bw;D@h9ok3n$zHM)Qcy$o2*I<*=r| ze%|Fz-<@D&`#0ZRAXBkZQTIJf!QBf1H#MI*(?pfUbn4uN+(U`vDM231KND#`__==K zr!u`!KY_fAroZ;uho92&ht;>~ESlcZa{kj~!0Lt-0+c)s3?C#F3Wsr!al3&5-xbsM zjqmT9AGGoP=q2Nyj{#VW^FE&+Mqe`iBlQ3B@jteg^&Ff=<136~_lgtYuG;~BawhyG zemNY@?h~uhF+Mr{lt%wVr9U?6YCisN8;X`<{G(w_*&8-Q^L*{v=*J!&!N>n?KS^ts zo@qb3<{S*@-xE9R4Qs7(vnk9_C!vZRmj^ZBEvm)ZON{AZKyJGjE$cfxq& zkFge0Akc*MQO&0Y{CR3WgGqrsn5Uo^Ly|6>7>jJ1rsoWCS`to z^vRK@yMJQ&`lu2Wg?z=&pMGy68)KM z+Nr7ee__*pVAYZ-D$0a@QuCX9(*tME2JRF2Z3|z#^XjY31tM=qf1>sY9KS@q`TF50 zrg*DW|A9vQw_z)HsHTVO0?P$xIJc>&3pgI)Uxc1DI}ixW&WgZikK;Ud z{A>gk=R|=};eY@cuJ+%onVlVhA&ujr9xv)SGIC62Nzpjo;k+hN&G8cId-o zicFgzvznTBFJAmyw}+@J3@}c~7=L=WU&MzG3vnJ6X*qAN-e1)D@zMG=cR7UZcAaj+ zL0rfh^2oj+-7xl4dKOF=8)0?1Rsh!h#n6K;m)?KT(b=HuFk@M>R~qPDaJYv-5q*#c zdvqj#po}We>6m+3@kcX6fF5uz*Zs5RtkC(18A+FC4?l!tfJwd1PxisZt?4UVE*-(` zi`L=!3t^)UvMfhdwC)c+9i=B4=v19iKR|x}Ay{U@yio!`K66y!C~O-eY4+^F#sNz= kAL)90C#I)2r5oy_wj0||M6g7(J$x!sR0|XkHF`Y#Z{8xxhyVZp From 7243d4a70fc4e0c48cd68a1d31c65762c8648e7f Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Tue, 28 Jan 2020 13:16:31 +0100 Subject: [PATCH 09/24] seperate ai in own function. --- game.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/game.c b/game.c index 410bd2f..95309b0 100644 --- a/game.c +++ b/game.c @@ -1019,13 +1019,31 @@ void player_die(unsigned char id) { sfx_play(SFX_DEATH,0); } +/** + * AI movement. + */ +unsigned char ai_move(unsigned char id){ + unsigned char diri,dirv,dirtest; + if(player_dir[id]==DIR_NONE) j=rand8()%4; //random start direction + else j=player_dir_index[id]; //prefer movements in the same direction + diri=255; dirv=0; + for(k=0;k<4;k++){ + dirtest=player_move_test(id,j+k); + if(dirtest>dirv){dirv=dirtest; diri=j+k; if(dirtest==4) break;} + else if((dirtest==dirv)&&(dirv==1)&&(rand8()<8)){dirv=dirtest; diri=j+k;} + } + if(dirv==0) j=PAD_A; //if no movement is possible just fire weapon + else j=dirs[diri%4]; + if(rand8()<16) j=PAD_A; //random weapon usage as ai is not aware of enemy positions yet + return j; +} + /** * Main gameplay loop. */ void game_loop(void) { unsigned char map_type; - unsigned char diri,dirv,dirtest; ppu_off(); @@ -1257,17 +1275,7 @@ void game_loop(void) { if(player_ai[i]!=0){ // AI - if(player_dir[i]==DIR_NONE) j=rand8()%4; //random start direction - else j=player_dir_index[i]; //prefer movements in the same direction - diri=255; dirv=0; - for(k=0;k<4;k++){ - dirtest=player_move_test(i,j+k); - if(dirtest>dirv){dirv=dirtest; diri=j+k; if(dirtest==4) break;} - else if((dirtest==dirv)&&(dirv==1)&&(rand8()<8)){dirv=dirtest; diri=j+k;} - } - if(dirv==0) j=PAD_A; //if no movement is possible just fire weapon - else j=dirs[diri%4]; - if(rand8()<16) j=PAD_A; //random weapon usage as ai is not aware of enemy positions yet + j=ai_move(i); }else{ /* Read pad state if ai is disabled. */ j = pad_state(i); From 7c22316d3c7f5f86440d41dbcf295a946c9edfef Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Tue, 28 Jan 2020 14:52:04 +0100 Subject: [PATCH 10/24] improved aggressive ai shooting near enemies. --- game.c | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/game.c b/game.c index 95309b0..b25a182 100644 --- a/game.c +++ b/game.c @@ -208,6 +208,7 @@ static unsigned char player_wpn [PLAYER_MAX]; static unsigned char player_charge [PLAYER_MAX]; static unsigned char player_ai [PLAYER_MAX]; +static unsigned char ai_aggression[PLAYER_MAX]; const unsigned char dirs[4]={ DIR_LEFT,DIR_UP,DIR_RIGHT,DIR_DOWN }; //basic maze strategy: always turn right static unsigned int projectile_x [PLAYER_MAX]; @@ -572,7 +573,9 @@ void show_select_weapon(void) { anim_frame = 0; - //default ai for player 2 + //default aggressive ai for player 2 + ai_aggression[0]=1; + ai_aggression[1]=1; player_ai[0]=0; player_ai[1]=1; @@ -1020,10 +1023,11 @@ void player_die(unsigned char id) { } /** - * AI movement. + * AI movement with aggressive weapon mode. */ unsigned char ai_move(unsigned char id){ unsigned char diri,dirv,dirtest; + unsigned char px2,py2; if(player_dir[id]==DIR_NONE) j=rand8()%4; //random start direction else j=player_dir_index[id]; //prefer movements in the same direction diri=255; dirv=0; @@ -1034,7 +1038,34 @@ unsigned char ai_move(unsigned char id){ } if(dirv==0) j=PAD_A; //if no movement is possible just fire weapon else j=dirs[diri%4]; - if(rand8()<16) j=PAD_A; //random weapon usage as ai is not aware of enemy positions yet + + if((player_cooldown[id]==0)&&(ai_aggression[id]>=1)){ + px=player_x_spawn[1-id]>>(TILE_SIZE_BIT+FP_BITS); + py=player_y_spawn[1-id]>>(TILE_SIZE_BIT+FP_BITS); + px2=player_x[1-id]>>(TILE_SIZE_BIT+FP_BITS); + py2=player_y[1-id]>>(TILE_SIZE_BIT+FP_BITS); + if((px!=px2)||(py!=py2)){ //dont try to kill enemy in spawn + px=player_x[id]>>(TILE_SIZE_BIT+FP_BITS); + py=player_y[id]>>(TILE_SIZE_BIT+FP_BITS); + if(px==px2){ + if(py>py2){ + if(py-py2<=3){ + if(player_dir[id]==DIR_UP){ j=PAD_A; } + else if(player_move_test(id,1)>0){ j=dirs[1]; } + }}else if(py2-py<=3){ + if(player_dir[id]==DIR_DOWN){ j=PAD_A; } + else if(player_move_test(id,3)>0){ j=dirs[3]; } + }}else if(py==py2){ + if(px>px2){ + if(px-px2<=3){ + if(player_dir[id]==DIR_LEFT){ j=PAD_A; } + else if((player_move_test(id,0)>0)){ j=dirs[0]; } + }}else if(px2-px<=3){ + if(player_dir[id]==DIR_RIGHT){ j=PAD_A; } + else if(player_move_test(id,2)>0){ j=dirs[2]; } + }} + }} + return j; } From 5ce3a74bd56cbed69a7e2e2ba91e0b734c37c3f2 Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Wed, 29 Jan 2020 03:06:23 +0100 Subject: [PATCH 11/24] updated famitone2 library and added positional audio. --- Makefile | 2 +- famitone2.s | 40 ++++++++++------- game.c | 74 ++++++++++++++++++++----------- sound/sounds.ftm | Bin 970 -> 1765 bytes sounds.s | 113 ++++++++++++++++++++++++++++++----------------- 5 files changed, 147 insertions(+), 82 deletions(-) diff --git a/Makefile b/Makefile index 8dfdad9..023afa2 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ all: $(EXECUTABLE) ${CRT_OBJ} crt0.o: *.s *.chr %.s: %.c *.h levels/*.h - $(CC) -Oi $< --add-source + CC65_HOME=$(CC65_HOME) $(CC) -Oi $< --add-source %.o: %.s CC65_HOME=$(CC65_HOME) $(ASM) $< diff --git a/famitone2.s b/famitone2.s index d642455..313ec42 100644 --- a/famitone2.s +++ b/famitone2.s @@ -1,4 +1,4 @@ -;FamiTone2 v1.11 +;FamiTone2 v1.12 @@ -35,7 +35,7 @@ FT_TEMP_PTR = FT_TEMP ;word FT_TEMP_PTR_L = FT_TEMP_PTR+0 FT_TEMP_PTR_H = FT_TEMP_PTR+1 FT_TEMP_VAR1 = FT_TEMP+2 - +FT_TEMP_SIZE = 3 ;envelope structure offsets, 5 bytes per envelope, grouped by variable type @@ -148,6 +148,7 @@ FT_SFX_PTR_H = FT_SFX_BASE_ADR+2 FT_SFX_OFF = FT_SFX_BASE_ADR+3 FT_SFX_BUF = FT_SFX_BASE_ADR+4 ;11 bytes +FT_BASE_SIZE = FT_SFX_BUF+11-FT_BASE_ADR ;aliases for sound effect channels to use in user calls @@ -318,7 +319,7 @@ FamiToneMusicStop: bne @set_envelopes - rts + jmp FamiToneSampleStop ;------------------------------------------------------------------------------ @@ -409,7 +410,11 @@ FamiToneMusicPause: tax ;set SZ flags for A beq @unpause + @pause: + + jsr FamiToneSampleStop + lda #0 ;mute sound sta FT_CH1_VOLUME sta FT_CH2_VOLUME @@ -926,8 +931,6 @@ _FT2ChannelUpdate: rts - .if(FT_DPCM_ENABLE) - ;------------------------------------------------------------------------------ ; stop DPCM sample if it plays @@ -941,6 +944,9 @@ FamiToneSampleStop: rts + + .if(FT_DPCM_ENABLE) + ;------------------------------------------------------------------------------ ; play DPCM sample, used by music player, could be used externally ; in: A is number of a sample, 1..63 @@ -1015,23 +1021,26 @@ _FT2SamplePlay: FamiToneSfxInit: + stx + /* Name tables */ #include "levels/splat_title.h" @@ -80,8 +86,11 @@ extern const unsigned char music_music_data[]; /* Sound effects */ #define SFX_START 0 #define SFX_SPLAT 1 -#define SFX_RESPAWN1 2 -#define SFX_DEATH 3 +#define SFX_SPLAT_VOL3 2 +#define SFX_SPLAT_VOL2 3 +#define SFX_SPLAT_VOL1 4 +#define SFX_RESPAWN1 5 +#define SFX_DEATH 6 /* Music */ #define MUSIC_LEVEL 0 @@ -185,7 +194,7 @@ static unsigned char ptr,spr; static unsigned char px,py; static unsigned char wait; static unsigned int i16; -static unsigned int sum,div; +static unsigned int sum,divvar; static unsigned char nameRow[32]; @@ -648,7 +657,7 @@ void show_credits() { /* Write credits. */ i = 0; j = 0; - div = 0; + divvar = 0; /* Clear the scrolling nametables, A and C */ vram_adr(NAMETABLE_C); @@ -670,17 +679,17 @@ void show_credits() { ppu_on_all(); do { - scroll(0,div); + scroll(0,divvar); /* Judd as a sprite. */ - if (i == 0 && div < 0x62) { - oam_meta_spr(0x70,0x48-div,0,(char*)i16); + if (i == 0 && divvar < 0x62) { + oam_meta_spr(0x70,0x48-divvar,0,(char*)i16); } - div++; + divvar++; WAIT_WITH_SKIP(1); - } while (div % 240); - if (div == 480) div = 0; + } while (divvar % 240); + if (divvar == 480) divvar = 0; if (sum == NAMETABLE_A) sum = NAMETABLE_C; else sum = NAMETABLE_A; @@ -695,10 +704,10 @@ void show_credits() { vram_fill(0xa0,1024-64); ppu_on_all(); - while (div % 240 < 100) { + while (divvar % 240 < 100) { WAIT_WITH_SKIP(1); - scroll(0,div); - div++; + scroll(0,divvar); + divvar++; } _skip_title: @@ -739,19 +748,19 @@ void show_endgame(void) { sum = (player_score[0] + player_score[1]); /* Calculate percentage for player 1 */ - div = player_score[0] * 100; - div /= sum; - if (div == 100) div = 99; - if (div == 0) div = 1; - put_num(NAMETABLE_A+0x1EA,div,2); + divvar = player_score[0] * 100; + divvar /= sum; + if (divvar == 100) divvar = 99; + if (divvar == 0) divvar = 1; + put_num(NAMETABLE_A+0x1EA,divvar,2); /* Player 2 must be 100% - (player 1) */ - div = 100 - div; - put_num(NAMETABLE_A+0x1F4,div,2); + divvar = 100 - divvar; + put_num(NAMETABLE_A+0x1F4,divvar,2); /* Convert Player 2's percentage to a gauge width */ - div *= 9; - div /= 100; + divvar *= 9; + divvar /= 100; /* Print the victory message. */ if (player_score[0] > player_score[1]) { @@ -780,11 +789,11 @@ void show_endgame(void) { /* Set the gauge palettes. */ clear_update_list(); - for (i = 4; i < 12 - div; ++i) { + for (i = 4; i < 12 - divvar; ++i) { /* Player 1 on the left. */ set_tile_palette(i,8,1); } - for (i = 12 - div; i <= 11; ++i) { + for (i = 12 - divvar; i <= 11; ++i) { /* Player 2 on the right. */ set_tile_palette(i,8,2); @@ -857,6 +866,19 @@ void projectile_move(unsigned char id) { } +/** + * Calculate player distance + * + * Uses Manhattan metric + */ +unsigned int player_dist(unsigned char id1, unsigned char id2){ + int px2=player_x[id1]>>(TILE_SIZE_BIT+FP_BITS); + int py2=player_y[id1]>>(TILE_SIZE_BIT+FP_BITS); + int px=player_x[id2]>>(TILE_SIZE_BIT+FP_BITS); + int py=player_y[id2]>>(TILE_SIZE_BIT+FP_BITS); + return abs(px2-px)+abs(py2-py); +} + /** * Player movement test. * @@ -977,7 +999,9 @@ void player_move(unsigned char id,unsigned char dir_index) { player_cnt[id]=TILE_SIZE<>2)%4),0); //positional audio } /** diff --git a/sound/sounds.ftm b/sound/sounds.ftm index 2cb64acf0051096df14bd6d18ee8cfe0887a1a9b..aa08a3c7c0b44df7eeb16571fbf71dbda650e094 100644 GIT binary patch literal 1765 zcmeHI%TB{U40Il(r9hiTfDjTAzrf>8Do6!~257^98v%MiJc`;P#CIU^yD+nx7?3Ke z9^iz9H{M;ZcRco%c7A`84fCtp{&2H1xPH3p$G*r(tJ~`IL?wW=!P%THi8!#~Dr}lj6KX8XT}8ZFH%+W6naoLdiXg_XdrjMz~1*lSN|xcF{>I%aU$d=4Kw! zW!YE;pU6`2t@+Z3943HH!s{YIp0OAfyI8AQ3tKhyTU5Wg`tfn%1QL(bZ(03T)o%?J z$O?_CA(HcX4v?w~L@wEbPrd2dmk|T7O(DkB_I1SYus;&Ch}V{&q85?YO<5Svp0edC zA^-z@EE?Wa()0yQP0`FN8XPLn;Ii4#@TO^K7=HqqilPY=4M-@^An5F9cy<~Z?oUAD zD;iJHAh`k!NS_@IPfSDe^ULBOc&mdIsPtc6X#jO9y`9(({ou(3`6 literal 970 zcmcIj+fKqj6g<69Q4uOpV|>xXFYp6Q+CYgUwpJ+bHp+t$!~n+lBmRINsxxQ12tN7Z zlGB}?ojp6}wDij9V=*u9pT_gEboTH%8Rx!89uMMlD66pzbjnq2MTwlmA`aG!L*@Hf z?`BP)J9q2EKjEt+?k0nuv>+D@-HUgL4GS<#5;wyHG~YFK5r=VRAc4vQA<<7-0M4m)iNlXz{_b zJ@k7e$C`Eu1oPA12O>h~Aj$X}$;&sCd0Z69AhYI#g3rxDWDlI|_|j^t1JoLl@x2NJ z*i)tspl#c+nugUhttJG}{B5f_u$m*QIYxbMm@s3D}96`$ULHEkYPI zD8kW*Grv#+P?iB(7Sx*+!z=VI%&x)J<#lL{4f1v%18(;uY}1$%0EI+uP<6rc0o0lA zR#Xj_X@}^;q_kBroBoj;Uv}Fx;%uSS0bc~JjY6%~0~hXdS5v9qZr(}HhH;u-n~#Ns IFeJ&k- Date: Wed, 29 Jan 2020 04:12:11 +0100 Subject: [PATCH 12/24] fixed maximum allowed player distance for positional audio. --- game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game.c b/game.c index c61502b..188df27 100644 --- a/game.c +++ b/game.c @@ -1001,7 +1001,7 @@ void player_move(unsigned char id,unsigned char dir_index) { player_diag_flip[id]=1; //APU.pulse[0].control=0x12; - sfx_play(SFX_SPLAT+((player_dist(0,1)>>2)%4),0); //positional audio + sfx_play(SFX_SPLAT+((player_dist(0,1)>>3)&0x3),0); //positional audio for maximum player distance of 31 } /** From 11129a9b52e10c649f2a8a01bd9372497464533f Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Thu, 30 Jan 2020 10:09:53 +0100 Subject: [PATCH 13/24] improved famitone2 library to adjustable volumes, updated TODO file. --- TODO.md | 36 +- crt0.s | 2 +- famitone2.s | 88 +++- game.c | 19 +- music.s | 1306 +++++++++++++++++++++++----------------------- neslib.h | 12 +- neslib.s | 17 +- sound/sounds.ftm | Bin 1765 -> 970 bytes sounds.s | 55 +- 9 files changed, 799 insertions(+), 736 deletions(-) diff --git a/TODO.md b/TODO.md index 966a534..3b457ca 100644 --- a/TODO.md +++ b/TODO.md @@ -4,29 +4,51 @@ - Spawn invincibility (to prevent spawn camping) - Woomy +- ~~AI players~~ + - AI select - ~~Chargers~~ -- Charging indicator -- Weapon Balance -- ~~New SFX~~ + - variable range/dmg charging + - Charging indicator +- ~~improved audio library with volume adjustments~~ + - ~~positional SFX~~ + - ~~Reduced in-game music volume~~ + - selection for in-game music volume - ~~Better weapon select~~ - ~~Animated Sprites~~ - ~~Palettes to indicate selection~~ +- Weapon Balance ## 1.2 +- More SFX +- Brushes +- Shooters + - Ammo + - semicoloured tiles +- health + - damage over time - Four Score 2v2 support -- Ammo -- Squid mode +- Squid mode (on B) +- Bombs (secondary fire conflicting with squid mode) +- Weapon Balance ## 1.3 -- AI players +- improved AI + - squid mode + - pathfinding + - improved mazing strategy + - player/map statistics + - states (evasive, defensive, aggressive) ## 2.0 - Campaign + - Scrolling Levels ## Misc -- cc65 2.15 compatibility +- ~~cc65 2.15 compatibility~~ - Cover art +- linux terminal/sdl port including network support + diff --git a/crt0.s b/crt0.s index 8002161..7903063 100644 --- a/crt0.s +++ b/crt0.s @@ -72,7 +72,7 @@ PPU_CTRL_VAR: .res 1 PPU_CTRL_VAR1: .res 1 PPU_MASK_VAR: .res 1 RAND_SEED: .res 2 -FT_TEMP: .res 3 +FT_TEMP: .res 4 TEMP: .res 11 diff --git a/famitone2.s b/famitone2.s index 313ec42..6c4b0c2 100644 --- a/famitone2.s +++ b/famitone2.s @@ -1,11 +1,10 @@ -;FamiTone2 v1.12 - +;FamiTone2 v1.12 SVAV = Simon's Volume Adjust Version. ;settings, uncomment or put them into your main program; the latter makes possible updates easier ; FT_BASE_ADR = $0300 ;page in the RAM used for FT2 variables, should be $xx00 -; FT_TEMP = $00 ;3 bytes in zeropage used by the library as a scratchpad +; FT_TEMP = $00 ;4 bytes in zeropage used by the library as a scratchpad ; FT_DPCM_OFF = $c000 ;$c000..$ffc0, 64-byte steps ; FT_SFX_STREAMS = 4 ;number of sound effects played at once, 1..4 @@ -35,7 +34,8 @@ FT_TEMP_PTR = FT_TEMP ;word FT_TEMP_PTR_L = FT_TEMP_PTR+0 FT_TEMP_PTR_H = FT_TEMP_PTR+1 FT_TEMP_VAR1 = FT_TEMP+2 -FT_TEMP_SIZE = 3 +FT_TEMP_VAR2 = FT_TEMP+3 +FT_TEMP_SIZE = 4 ;envelope structure offsets, 5 bytes per envelope, grouped by variable type @@ -67,7 +67,9 @@ FT_CHN_DUTY = FT_BASE_ADR+8*FT_CHANNELS_ALL ;variables and aliases -FT_ENVELOPES = FT_BASE_ADR +FT_MUSIC_VOLUME = FT_BASE_ADR + +FT_ENVELOPES = FT_BASE_ADR+1 FT_CH1_ENVS = FT_ENVELOPES+0 FT_CH2_ENVS = FT_ENVELOPES+3 FT_CH3_ENVS = FT_ENVELOPES+6 @@ -134,19 +136,20 @@ FT_DPCM_EFFECT = FT_VARS+11 FT_OUT_BUF = FT_VARS+12 ;11 bytes -;sound effect stream variables, 2 bytes and 15 bytes per stream +;sound effect stream variables, 2 bytes and 16 bytes per stream ;when sound effects are disabled, this memory is not used FT_SFX_ADR_L = FT_VARS+23 FT_SFX_ADR_H = FT_VARS+24 FT_SFX_BASE_ADR = FT_VARS+25 -FT_SFX_STRUCT_SIZE = 15 -FT_SFX_REPEAT = FT_SFX_BASE_ADR+0 -FT_SFX_PTR_L = FT_SFX_BASE_ADR+1 -FT_SFX_PTR_H = FT_SFX_BASE_ADR+2 -FT_SFX_OFF = FT_SFX_BASE_ADR+3 -FT_SFX_BUF = FT_SFX_BASE_ADR+4 ;11 bytes +FT_SFX_STRUCT_SIZE = 16 +FT_SFX_VOLUME = FT_SFX_BASE_ADR+0 +FT_SFX_REPEAT = FT_SFX_BASE_ADR+1 +FT_SFX_PTR_L = FT_SFX_BASE_ADR+2 +FT_SFX_PTR_H = FT_SFX_BASE_ADR+3 +FT_SFX_OFF = FT_SFX_BASE_ADR+4 +FT_SFX_BUF = FT_SFX_BASE_ADR+5 ;11 bytes FT_BASE_SIZE = FT_SFX_BUF+11-FT_BASE_ADR @@ -610,6 +613,17 @@ FamiToneUpdate: sta FT_MR_PULSE1_H @ch1prev: lda FT_CH1_VOLUME + pha + and #$f0 + sta >3)&0x3),0); //positional audio for maximum player distance of 31 + sfx_play_damped(SFX_SPLAT,0,(player_dist(0,1)>>1)); //positional audio for maximum player distance of 31 } /** @@ -1273,13 +1270,13 @@ void game_loop(void) { --wait; if (!wait) { - music_play(MUSIC_GAME); + music_play(MUSIC_GAME,4); } } /* When the timer reaches 0, the game is over. */ if (timer == 0) { - music_play(MUSIC_CLEAR); + music_play(MUSIC_CLEAR,0); game_done = TRUE; } diff --git a/music.s b/music.s index d301fbe..e8c8782 100644 --- a/music.s +++ b/music.s @@ -1,653 +1,653 @@ -;this file for FamiTone2 library generated by text2data tool - -music_music_data: - .byte 7 - .word @instruments - .word @samples-3 - .word @song0ch0,@song0ch1,@song0ch2,@song0ch3,@song0ch4,307,256 - .word @song1ch0,@song1ch1,@song1ch2,@song1ch3,@song1ch4,245,204 - .word @song2ch0,@song2ch1,@song2ch2,@song2ch3,@song2ch4,307,256 - .word @song3ch0,@song3ch1,@song3ch2,@song3ch3,@song3ch4,307,256 - .word @song4ch0,@song4ch1,@song4ch2,@song4ch3,@song4ch4,204,170 - .word @song5ch0,@song5ch1,@song5ch2,@song5ch3,@song5ch4,307,256 - .word @song6ch0,@song6ch1,@song6ch2,@song6ch3,@song6ch4,280,233 - -@instruments: - .byte $30 ;instrument $00 - .word @env1,@env0,@env0 - .byte $00 - .byte $30 ;instrument $01 - .word @env2,@env13,@env0 - .byte $00 - .byte $30 ;instrument $02 - .word @env3,@env14,@env0 - .byte $00 - .byte $30 ;instrument $03 - .word @env4,@env15,@env0 - .byte $00 - .byte $30 ;instrument $04 - .word @env5,@env16,@env0 - .byte $00 - .byte $70 ;instrument $05 - .word @env6,@env17,@env0 - .byte $00 - .byte $30 ;instrument $06 - .word @env7,@env18,@env24 - .byte $00 - .byte $30 ;instrument $07 - .word @env8,@env0,@env0 - .byte $00 - .byte $30 ;instrument $08 - .word @env9,@env0,@env0 - .byte $00 - .byte $30 ;instrument $09 - .word @env9,@env0,@env0 - .byte $00 - .byte $70 ;instrument $0a - .word @env9,@env0,@env0 - .byte $00 - .byte $b0 ;instrument $0b - .word @env9,@env0,@env0 - .byte $00 - .byte $b0 ;instrument $0c - .word @env9,@env0,@env0 - .byte $00 - .byte $30 ;instrument $0d - .word @env10,@env0,@env0 - .byte $00 - .byte $70 ;instrument $0e - .word @env10,@env0,@env0 - .byte $00 - .byte $70 ;instrument $0f - .word @env11,@env0,@env0 - .byte $00 - .byte $30 ;instrument $10 - .word @env1,@env19,@env25 - .byte $00 - .byte $30 ;instrument $11 - .word @env1,@env20,@env0 - .byte $00 - .byte $b0 ;instrument $12 - .word @env9,@env21,@env0 - .byte $00 - .byte $30 ;instrument $14 - .word @env12,@env22,@env0 - .byte $00 - .byte $70 ;instrument $15 - .word @env5,@env23,@env0 - .byte $00 - .byte $b0 ;instrument $16 - .word @env5,@env23,@env0 - .byte $00 - .byte $70 ;instrument $17 - .word @env5,@env23,@env0 - .byte $00 - -@samples: -@env0: - .byte $c0,$00,$00 -@env1: - .byte $cf,$00,$00 -@env2: - .byte $c7,$c1,$c2,$c3,$c4,$c5,$c6,$c6,$c5,$02,$c4,$02,$c3,$02,$c2,$02 - .byte $c1,$02,$c0,$00,$12 -@env3: - .byte $c7,$c4,$c2,$c1,$c1,$c0,$00,$05 -@env4: - .byte $c9,$c6,$c5,$c4,$c3,$c3,$c2,$02,$c1,$03,$c0,$00,$0a -@env5: - .byte $c6,$c5,$c5,$c4,$c4,$c3,$c4,$c6,$c5,$c4,$c3,$c3,$c2,$00,$0c -@env6: - .byte $cb,$cb,$c8,$c7,$c5,$c5,$c1,$04,$c0,$00,$08 -@env7: - .byte $cf,$06,$c0,$00,$02 -@env8: - .byte $cf,$c0,$00,$01 -@env9: - .byte $c4,$c7,$02,$c6,$c5,$00,$04 -@env10: - .byte $c8,$c6,$02,$c5,$00,$03 -@env11: - .byte $c4,$00,$00 -@env12: - .byte $c7,$c7,$ca,$02,$c9,$c7,$c6,$c4,$c2,$00,$08 -@env13: - .byte $c0,$c4,$00,$01 -@env14: - .byte $c0,$c2,$c4,$00,$02 -@env15: - .byte $c0,$c7,$c9,$cb,$00,$03 -@env16: - .byte $c0,$c2,$05,$c0,$c2,$c4,$00,$05 -@env17: - .byte $c0,$c4,$bc,$00,$02 -@env18: - .byte $ea,$e3,$dd,$da,$d6,$d4,$d1,$00,$06 -@env19: - .byte $c0,$bf,$be,$00,$02 -@env20: - .byte $c0,$c1,$c1,$c2,$c2,$c3,$c3,$c4,$c4,$c5,$c5,$c6,$c6,$c7,$c7,$c8 - .byte $c8,$c9,$c9,$ca,$ca,$cb,$cb,$cc,$cc,$00,$18 -@env21: - .byte $c0,$c0,$c7,$c7,$c0,$c0,$c7,$c7,$c0,$c0,$00,$09 -@env22: - .byte $c0,$c3,$c8,$00,$00 -@env23: - .byte $c0,$c0,$cc,$cc,$00,$00 -@env24: - .byte $ac,$00,$00 -@env25: - .byte $c0,$c0,$c1,$c2,$c4,$c7,$cc,$d1,$00,$07 - - -@song0ch0: - .byte $fb,$04 -@song0ch0loop: -@ref0: - .byte $a0,$4a,$83,$00,$4a,$83,$00,$ef - .byte $fd - .word @song0ch0loop - -@song0ch1: -@song0ch1loop: -@ref1: - .byte $f9,$85 - .byte $fd - .word @song0ch1loop - -@song0ch2: -@song0ch2loop: -@ref2: - .byte $f9,$85 - .byte $fd - .word @song0ch2loop - -@song0ch3: -@song0ch3loop: -@ref3: - .byte $f9,$85 - .byte $fd - .word @song0ch3loop - -@song0ch4: -@song0ch4loop: -@ref4: - .byte $f9,$85 - .byte $fd - .word @song0ch4loop - - -@song1ch0: - .byte $fb,$04 -@song1ch0loop: -@ref5: - .byte $9c,$2d,$33,$37,$2c,$8b,$00,$9a,$28,$85,$28,$85,$34,$8f,$00,$9c - .byte $2d,$33,$37,$2c,$8b,$00,$9a,$28,$85,$28,$85,$22,$91 - .byte $ff,$19 - .word @ref5 - .byte $ff,$19 - .word @ref5 - .byte $ff,$19 - .word @ref5 -@ref9: - .byte $90,$49,$96,$4f,$53,$98,$48,$8b,$00,$90,$44,$85,$98,$44,$85,$92 - .byte $50,$8f,$00,$90,$49,$4f,$94,$53,$90,$48,$8b,$00,$44,$85,$98,$44 - .byte $85,$92,$3e,$87,$00,$87 - .byte $ff,$1b - .word @ref9 - .byte $fd - .word @song1ch0loop - -@song1ch1: -@song1ch1loop: -@ref11: - .byte $81,$9a,$2d,$33,$37,$2c,$89,$00,$9c,$1e,$85,$1e,$85,$12,$8f,$01 - .byte $9a,$2d,$33,$37,$2c,$89,$00,$9c,$1e,$85,$1e,$85,$18,$91 - .byte $ff,$1a - .word @ref11 -@ref13: - .byte $9e,$61,$5d,$59,$52,$a7,$00,$4f,$53,$61,$5d,$59,$52,$87,$00,$4d - .byte $52,$93,$00,$a2,$60,$89 -@ref14: - .byte $9e,$79,$75,$71,$6a,$a5,$01,$67,$6b,$79,$75,$71,$6a,$89,$65,$6a - .byte $9f,$00 -@ref15: - .byte $90,$31,$96,$37,$3b,$98,$30,$8b,$00,$90,$2c,$85,$98,$2c,$85,$92 - .byte $38,$8f,$00,$90,$31,$37,$94,$3b,$90,$30,$8b,$00,$2c,$85,$98,$2c - .byte $85,$92,$26,$87,$00,$87 - .byte $ff,$1b - .word @ref15 - .byte $fd - .word @song1ch1loop - -@song1ch2: -@song1ch2loop: -@ref17: - .byte $00,$99,$80,$11,$01,$11,$01,$1c,$8f,$00,$9b,$11,$01,$11,$01,$0a - .byte $8b,$00,$83 -@ref18: - .byte $00,$99,$11,$01,$11,$01,$1c,$8f,$00,$9b,$11,$01,$11,$01,$0a,$8b - .byte $00,$83 -@ref19: - .byte $61,$5d,$59,$52,$a7,$00,$4f,$53,$61,$5d,$59,$52,$87,$00,$4d,$52 - .byte $93,$00,$a2,$52,$89 -@ref20: - .byte $80,$79,$75,$71,$6a,$a5,$01,$67,$6b,$9e,$79,$80,$75,$71,$6a,$89 - .byte $65,$6a,$9f,$00 -@ref21: - .byte $9e,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18 - .byte $00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14 - .byte $00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18 - .byte $00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14 - .byte $81 -@ref22: - .byte $18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00 - .byte $14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00 - .byte $18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00 - .byte $14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$81 - .byte $fd - .word @song1ch2loop - -@song1ch3: -@song1ch3loop: -@ref23: - .byte $82,$17,$84,$17,$8a,$0d,$84,$17,$82,$17,$84,$17,$8a,$0d,$84,$17 - .byte $82,$17,$84,$17,$8a,$0d,$84,$17,$82,$17,$84,$17,$8a,$0d,$84,$17 - .byte $82,$17,$84,$17,$8a,$0d,$84,$17,$82,$17,$84,$17,$8a,$0d,$84,$17 - .byte $82,$17,$84,$17,$8a,$0d,$84,$17,$82,$17,$84,$17,$8a,$0d,$8c,$16 - .byte $81 - .byte $ff,$21 - .word @ref23 - .byte $ff,$21 - .word @ref23 - .byte $ff,$21 - .word @ref23 - .byte $ff,$21 - .word @ref23 - .byte $ff,$21 - .word @ref23 - .byte $fd - .word @song1ch3loop - -@song1ch4: -@song1ch4loop: -@ref29: - .byte $f9,$85 -@ref30: - .byte $f9,$85 -@ref31: - .byte $f9,$85 -@ref32: - .byte $f9,$85 -@ref33: - .byte $f9,$85 -@ref34: - .byte $f9,$85 - .byte $fd - .word @song1ch4loop - - -@song2ch0: - .byte $fb,$06 -@song2ch0loop: -@ref35: - .byte $00,$f9,$83 - .byte $fd - .word @song2ch0loop - -@song2ch1: -@song2ch1loop: -@ref36: - .byte $00,$f9,$83 - .byte $fd - .word @song2ch1loop - -@song2ch2: -@song2ch2loop: -@ref37: - .byte $00,$f9,$83 - .byte $fd - .word @song2ch2loop - -@song2ch3: -@song2ch3loop: -@ref38: - .byte $00,$f9,$83 - .byte $fd - .word @song2ch3loop - -@song2ch4: -@song2ch4loop: -@ref39: - .byte $00,$f9,$83 - .byte $fd - .word @song2ch4loop - - -@song3ch0: - .byte $fb,$06 -@song3ch0loop: -@ref40: - .byte $00,$f9,$83 - .byte $fd - .word @song3ch0loop - -@song3ch1: -@song3ch1loop: -@ref41: - .byte $00,$f9,$83 - .byte $fd - .word @song3ch1loop - -@song3ch2: -@song3ch2loop: -@ref42: - .byte $00,$f9,$83 - .byte $fd - .word @song3ch2loop - -@song3ch3: -@song3ch3loop: -@ref43: - .byte $00,$f9,$83 - .byte $fd - .word @song3ch3loop - -@song3ch4: -@song3ch4loop: -@ref44: - .byte $00,$f9,$83 - .byte $fd - .word @song3ch4loop - - -@song4ch0: - .byte $fb,$04 -@song4ch0loop: -@ref45: - .byte $94,$4a,$85,$01,$8e,$45,$94,$45,$92,$47,$01,$90,$41,$00,$9d -@ref46: - .byte $98,$4a,$85,$01,$8e,$45,$94,$45,$47,$01,$92,$41,$00,$89,$94,$3d - .byte $92,$3d,$94,$41,$41,$00,$81 -@ref47: - .byte $4e,$85,$01,$8e,$49,$94,$49,$92,$4b,$01,$90,$45,$00,$9d -@ref48: - .byte $98,$4e,$85,$01,$8e,$49,$94,$49,$4b,$01,$92,$45,$00,$91,$94,$51 - .byte $4f,$4c,$81 - .byte $fd - .word @song4ch0loop - -@song4ch1: -@song4ch1loop: -@ref49: - .byte $96,$1a,$85,$01,$8e,$15,$96,$15,$17,$01,$11,$00,$9d -@ref50: - .byte $1a,$85,$01,$8e,$15,$96,$15,$17,$01,$11,$00,$89,$0d,$98,$0d,$96 - .byte $11,$11,$00,$81 -@ref51: - .byte $1e,$85,$01,$8e,$19,$96,$19,$1b,$01,$15,$00,$9d -@ref52: - .byte $1e,$85,$01,$8e,$19,$96,$19,$1b,$01,$15,$00,$91,$94,$39,$37,$34 - .byte $81 - .byte $fd - .word @song4ch1loop - -@song4ch2: -@song4ch2loop: -@ref53: - .byte $8c,$02,$85,$01,$8e,$2d,$8c,$03,$80,$2f,$01,$29,$8c,$02,$8d,$02 - .byte $8d -@ref54: - .byte $02,$85,$01,$8e,$2d,$8c,$03,$80,$2f,$01,$29,$8c,$02,$89,$80,$25 - .byte $8c,$03,$80,$29,$29,$00,$81 -@ref55: - .byte $8c,$02,$85,$01,$8e,$31,$8c,$03,$80,$33,$01,$2d,$8c,$02,$8d,$02 - .byte $8d -@ref56: - .byte $02,$85,$01,$8e,$31,$8c,$03,$80,$33,$01,$2d,$8c,$02,$8d,$03,$94 - .byte $39,$37,$34,$81 - .byte $fd - .word @song4ch2loop - -@song4ch3: -@song4ch3loop: -@ref57: - .byte $8e,$0c,$85,$8a,$15,$84,$17,$8e,$0d,$84,$17,$8a,$15,$84,$17,$8e - .byte $0c,$85,$8a,$15,$84,$17,$8e,$0d,$86,$19,$8a,$15,$84,$16,$81 - .byte $ff,$11 - .word @ref57 - .byte $ff,$11 - .word @ref57 - .byte $ff,$11 - .word @ref57 - .byte $fd - .word @song4ch3loop - -@song4ch4: -@song4ch4loop: -@ref61: - .byte $bf -@ref62: - .byte $bf -@ref63: - .byte $bf -@ref64: - .byte $bf - .byte $fd - .word @song4ch4loop - - -@song5ch0: - .byte $fb,$06 -@song5ch0loop: -@ref65: - .byte $96,$38,$85,$01,$92,$35,$90,$38,$85,$01,$94,$34,$81 -@ref66: - .byte $90,$38,$85,$01,$92,$35,$90,$39,$a4,$39,$94,$2f,$96,$34,$81 -@ref67: - .byte $90,$38,$85,$01,$92,$35,$96,$38,$85,$01,$92,$34,$81 -@ref68: - .byte $94,$39,$96,$3f,$43,$47,$38,$85,$01,$34,$81 -@ref69: - .byte $38,$85,$01,$35,$38,$85,$01,$34,$81 -@ref70: - .byte $38,$85,$01,$35,$39,$a4,$39,$96,$2f,$34,$81 -@ref71: - .byte $39,$01,$39,$35,$2f,$01,$2f,$34,$81 -@ref72: - .byte $39,$3f,$43,$47,$4d,$47,$43,$3e,$81 -@ref73: - .byte $92,$50,$4c,$46,$42,$46,$42,$3e,$38,$3e,$38,$34,$2e,$34,$2e,$2a - .byte $26 -@ref74: - .byte $50,$4c,$46,$42,$46,$42,$3e,$38,$3e,$38,$34,$2e,$34,$2e,$2a,$26 - .byte $ff,$10 - .word @ref74 - .byte $ff,$10 - .word @ref74 - .byte $fd - .word @song5ch0loop - -@song5ch1: -@song5ch1loop: -@ref77: - .byte $9e,$26,$8d,$2a,$8d -@ref78: - .byte $20,$9d -@ref79: - .byte $26,$8d,$2a,$8d -@ref80: - .byte $20,$8d,$1a,$8d -@ref81: - .byte $26,$8d,$2a,$8d -@ref82: - .byte $20,$9d -@ref83: - .byte $1a,$9d -@ref84: - .byte $18,$8d,$1c,$8d -@ref85: - .byte $9a,$20,$83,$26,$83,$2b,$2e,$83,$34,$83,$38,$81 -@ref86: - .byte $20,$83,$26,$83,$2b,$2e,$83,$34,$83,$38,$81 - .byte $ff,$0b - .word @ref86 -@ref88: - .byte $21,$21,$27,$2b,$2f,$2e,$34,$83,$38,$81 - .byte $fd - .word @song5ch1loop - -@song5ch2: -@song5ch2loop: -@ref89: - .byte $8c,$02,$9d -@ref90: - .byte $9b,$02,$81 -@ref91: - .byte $02,$9d -@ref92: - .byte $97,$02,$02,$02,$02 -@ref93: - .byte $02,$9d -@ref94: - .byte $9b,$02,$81 -@ref95: - .byte $02,$9d - .byte $ff,$05 - .word @ref92 -@ref97: - .byte $02,$85,$02,$85,$02,$85,$02,$85 - .byte $ff,$08 - .word @ref97 - .byte $ff,$08 - .word @ref97 - .byte $ff,$08 - .word @ref97 - .byte $fd - .word @song5ch2loop - -@song5ch3: -@song5ch3loop: -@ref101: - .byte $9f -@ref102: - .byte $9f -@ref103: - .byte $9f -@ref104: - .byte $9f -@ref105: - .byte $9f -@ref106: - .byte $9f -@ref107: - .byte $9f -@ref108: - .byte $9f -@ref109: - .byte $83,$86,$1e,$85,$1e,$85,$1e,$85,$1e,$81 -@ref110: - .byte $83,$1e,$85,$1e,$85,$1e,$85,$1e,$81 - .byte $ff,$09 - .word @ref110 - .byte $ff,$09 - .word @ref110 - .byte $fd - .word @song5ch3loop - -@song5ch4: -@song5ch4loop: -@ref113: - .byte $9f -@ref114: - .byte $9f -@ref115: - .byte $9f -@ref116: - .byte $9f -@ref117: - .byte $9f -@ref118: - .byte $9f -@ref119: - .byte $9f -@ref120: - .byte $9f -@ref121: - .byte $9f -@ref122: - .byte $9f -@ref123: - .byte $9f -@ref124: - .byte $9f - .byte $fd - .word @song5ch4loop - - -@song6ch0: - .byte $fb,$03 -@ref125: - .byte $af -@song6ch0loop: -@ref126: - .byte $8f,$a6,$32,$8b,$a8,$42,$83,$aa,$42,$8d,$a8,$3e,$87,$aa,$3e,$83 - .byte $a8,$3e,$89,$a6,$32,$bd,$2e,$91,$a8,$34,$87,$34,$83,$34,$87,$aa - .byte $34,$83,$a8,$3e,$89,$a6,$2e,$ad -@ref127: - .byte $8f,$32,$8b,$a8,$42,$83,$aa,$42,$8d,$a8,$3e,$87,$aa,$3e,$83,$a8 - .byte $3e,$89,$a6,$32,$bd,$2e,$91,$aa,$3e,$87,$3e,$83,$ac,$3e,$87,$a8 - .byte $42,$83,$46,$89,$a6,$2e,$ab - .byte $fd - .word @song6ch0loop - -@song6ch1: -@ref128: - .byte $af -@song6ch1loop: -@ref129: - .byte $8f,$a6,$32,$87,$a8,$42,$83,$aa,$42,$8d,$a8,$3e,$87,$aa,$3e,$83 - .byte $a8,$3e,$8d,$aa,$38,$ad,$00,$8d,$a6,$2e,$8d,$a8,$34,$87,$34,$83 - .byte $34,$87,$aa,$34,$83,$a8,$3e,$8d,$38,$ad -@ref130: - .byte $00,$8d,$a6,$32,$87,$a8,$42,$83,$42,$8d,$aa,$3e,$87,$a8,$3e,$83 - .byte $3e,$8d,$ac,$46,$ad,$00,$8d,$a6,$2e,$8d,$aa,$3e,$87,$3e,$83,$ac - .byte $3e,$87,$a8,$42,$83,$46,$8d,$aa,$42,$9d,$00,$8b - .byte $fd - .word @song6ch1loop - -@song6ch2: -@ref131: - .byte $97,$8c,$02,$85,$02,$85,$02,$85 -@song6ch2loop: -@ref132: - .byte $9f,$8c,$02,$bd,$02,$bd,$02,$bd,$02,$9d -@ref133: - .byte $9f,$02,$bd,$02,$bd,$02,$bd,$02,$9b - .byte $fd - .word @song6ch2loop - -@song6ch3: -@ref134: - .byte $8a,$18,$84,$14,$88,$18,$84,$14,$8a,$18,$84,$14,$88,$18,$84,$14 - .byte $8a,$18,$9d -@song6ch3loop: -@ref135: - .byte $82,$14,$8d,$84,$14,$9d,$14,$9d,$14,$9d,$14,$9d,$14,$9d,$14,$9d - .byte $14,$9d,$14,$87,$8a,$16,$16,$81 -@ref136: - .byte $16,$8d,$84,$14,$9d,$14,$9d,$14,$9d,$14,$9d,$14,$9d,$14,$10,$86 - .byte $15,$88,$11,$82,$14,$91,$84,$14,$9d,$14,$85,$8a,$16,$16,$81 - .byte $fd - .word @song6ch3loop - -@song6ch4: -@ref137: - .byte $af -@song6ch4loop: -@ref138: - .byte $f9,$f9,$8b -@ref139: - .byte $f9,$f9,$89 - .byte $fd - .word @song6ch4loop +;this file for FamiTone2 library generated by text2data tool + +music_music_data: + .byte 7 + .word @instruments + .word @samples-3 + .word @song0ch0,@song0ch1,@song0ch2,@song0ch3,@song0ch4,307,256 + .word @song1ch0,@song1ch1,@song1ch2,@song1ch3,@song1ch4,245,204 + .word @song2ch0,@song2ch1,@song2ch2,@song2ch3,@song2ch4,307,256 + .word @song3ch0,@song3ch1,@song3ch2,@song3ch3,@song3ch4,307,256 + .word @song4ch0,@song4ch1,@song4ch2,@song4ch3,@song4ch4,204,170 + .word @song5ch0,@song5ch1,@song5ch2,@song5ch3,@song5ch4,307,256 + .word @song6ch0,@song6ch1,@song6ch2,@song6ch3,@song6ch4,280,233 + +@instruments: + .byte $f0 ;instrument $00 + .word @env1,@env0,@env0 + .byte $00 + .byte $f0 ;instrument $01 + .word @env2,@env13,@env0 + .byte $00 + .byte $f0 ;instrument $02 + .word @env3,@env14,@env0 + .byte $00 + .byte $f0 ;instrument $03 + .word @env4,@env15,@env0 + .byte $00 + .byte $30 ;instrument $04 + .word @env5,@env16,@env0 + .byte $00 + .byte $70 ;instrument $05 + .word @env6,@env17,@env0 + .byte $00 + .byte $f0 ;instrument $06 + .word @env7,@env18,@env24 + .byte $00 + .byte $f0 ;instrument $07 + .word @env8,@env0,@env0 + .byte $00 + .byte $30 ;instrument $08 + .word @env9,@env0,@env0 + .byte $00 + .byte $30 ;instrument $09 + .word @env9,@env0,@env0 + .byte $00 + .byte $70 ;instrument $0a + .word @env9,@env0,@env0 + .byte $00 + .byte $b0 ;instrument $0b + .word @env9,@env0,@env0 + .byte $00 + .byte $b0 ;instrument $0c + .word @env9,@env0,@env0 + .byte $00 + .byte $30 ;instrument $0d + .word @env10,@env0,@env0 + .byte $00 + .byte $70 ;instrument $0e + .word @env10,@env0,@env0 + .byte $00 + .byte $70 ;instrument $0f + .word @env11,@env0,@env0 + .byte $00 + .byte $f0 ;instrument $10 + .word @env1,@env19,@env25 + .byte $00 + .byte $f0 ;instrument $11 + .word @env1,@env20,@env0 + .byte $00 + .byte $b0 ;instrument $12 + .word @env9,@env21,@env0 + .byte $00 + .byte $30 ;instrument $14 + .word @env12,@env22,@env0 + .byte $00 + .byte $70 ;instrument $15 + .word @env5,@env23,@env0 + .byte $00 + .byte $b0 ;instrument $16 + .word @env5,@env23,@env0 + .byte $00 + .byte $70 ;instrument $17 + .word @env5,@env23,@env0 + .byte $00 + +@samples: +@env0: + .byte $c0,$00,$00 +@env1: + .byte $cf,$00,$00 +@env2: + .byte $c7,$c1,$c2,$c3,$c4,$c5,$c6,$c6,$c5,$02,$c4,$02,$c3,$02,$c2,$02 + .byte $c1,$02,$c0,$00,$12 +@env3: + .byte $c7,$c4,$c2,$c1,$c1,$c0,$00,$05 +@env4: + .byte $c9,$c6,$c5,$c4,$c3,$c3,$c2,$02,$c1,$03,$c0,$00,$0a +@env5: + .byte $c6,$c5,$c5,$c4,$c4,$c3,$c4,$c6,$c5,$c4,$c3,$c3,$c2,$00,$0c +@env6: + .byte $cb,$cb,$c8,$c7,$c5,$c5,$c1,$04,$c0,$00,$08 +@env7: + .byte $cf,$06,$c0,$00,$02 +@env8: + .byte $cf,$c0,$00,$01 +@env9: + .byte $c4,$c7,$02,$c6,$c5,$00,$04 +@env10: + .byte $c8,$c6,$02,$c5,$00,$03 +@env11: + .byte $c4,$00,$00 +@env12: + .byte $c7,$c7,$ca,$02,$c9,$c7,$c6,$c4,$c2,$00,$08 +@env13: + .byte $c0,$c4,$00,$01 +@env14: + .byte $c0,$c2,$c4,$00,$02 +@env15: + .byte $c0,$c7,$c9,$cb,$00,$03 +@env16: + .byte $c0,$c2,$05,$c0,$c2,$c4,$00,$05 +@env17: + .byte $c0,$c4,$bc,$00,$02 +@env18: + .byte $ea,$e3,$dd,$da,$d6,$d4,$d1,$00,$06 +@env19: + .byte $c0,$bf,$be,$00,$02 +@env20: + .byte $c0,$c1,$c1,$c2,$c2,$c3,$c3,$c4,$c4,$c5,$c5,$c6,$c6,$c7,$c7,$c8 + .byte $c8,$c9,$c9,$ca,$ca,$cb,$cb,$cc,$cc,$00,$18 +@env21: + .byte $c0,$c0,$c7,$c7,$c0,$c0,$c7,$c7,$c0,$c0,$00,$09 +@env22: + .byte $c0,$c3,$c8,$00,$00 +@env23: + .byte $c0,$c0,$cc,$cc,$00,$00 +@env24: + .byte $ac,$00,$00 +@env25: + .byte $c0,$c0,$c1,$c2,$c4,$c7,$cc,$d1,$00,$07 + + +@song0ch0: + .byte $fb,$04 +@song0ch0loop: +@ref0: + .byte $a0,$4a,$83,$00,$4a,$83,$00,$ef + .byte $fd + .word @song0ch0loop + +@song0ch1: +@song0ch1loop: +@ref1: + .byte $f9,$85 + .byte $fd + .word @song0ch1loop + +@song0ch2: +@song0ch2loop: +@ref2: + .byte $f9,$85 + .byte $fd + .word @song0ch2loop + +@song0ch3: +@song0ch3loop: +@ref3: + .byte $f9,$85 + .byte $fd + .word @song0ch3loop + +@song0ch4: +@song0ch4loop: +@ref4: + .byte $f9,$85 + .byte $fd + .word @song0ch4loop + + +@song1ch0: + .byte $fb,$04 +@song1ch0loop: +@ref5: + .byte $9c,$2d,$33,$37,$2c,$8b,$00,$9a,$28,$85,$28,$85,$34,$8f,$00,$9c + .byte $2d,$33,$37,$2c,$8b,$00,$9a,$28,$85,$28,$85,$22,$91 + .byte $ff,$19 + .word @ref5 + .byte $ff,$19 + .word @ref5 + .byte $ff,$19 + .word @ref5 +@ref9: + .byte $90,$49,$96,$4f,$53,$98,$48,$8b,$00,$90,$44,$85,$98,$44,$85,$92 + .byte $50,$8f,$00,$90,$49,$4f,$94,$53,$90,$48,$8b,$00,$44,$85,$98,$44 + .byte $85,$92,$3e,$87,$00,$87 + .byte $ff,$1b + .word @ref9 + .byte $fd + .word @song1ch0loop + +@song1ch1: +@song1ch1loop: +@ref11: + .byte $81,$9a,$2d,$33,$37,$2c,$89,$00,$9c,$1e,$85,$1e,$85,$12,$8f,$01 + .byte $9a,$2d,$33,$37,$2c,$89,$00,$9c,$1e,$85,$1e,$85,$18,$91 + .byte $ff,$1a + .word @ref11 +@ref13: + .byte $9e,$61,$5d,$59,$52,$a7,$00,$4f,$53,$61,$5d,$59,$52,$87,$00,$4d + .byte $52,$93,$00,$a2,$60,$89 +@ref14: + .byte $9e,$79,$75,$71,$6a,$a5,$01,$67,$6b,$79,$75,$71,$6a,$89,$65,$6a + .byte $9f,$00 +@ref15: + .byte $90,$31,$96,$37,$3b,$98,$30,$8b,$00,$90,$2c,$85,$98,$2c,$85,$92 + .byte $38,$8f,$00,$90,$31,$37,$94,$3b,$90,$30,$8b,$00,$2c,$85,$98,$2c + .byte $85,$92,$26,$87,$00,$87 + .byte $ff,$1b + .word @ref15 + .byte $fd + .word @song1ch1loop + +@song1ch2: +@song1ch2loop: +@ref17: + .byte $00,$99,$80,$11,$01,$11,$01,$1c,$8f,$00,$9b,$11,$01,$11,$01,$0a + .byte $8b,$00,$83 +@ref18: + .byte $00,$99,$11,$01,$11,$01,$1c,$8f,$00,$9b,$11,$01,$11,$01,$0a,$8b + .byte $00,$83 +@ref19: + .byte $61,$5d,$59,$52,$a7,$00,$4f,$53,$61,$5d,$59,$52,$87,$00,$4d,$52 + .byte $93,$00,$a2,$52,$89 +@ref20: + .byte $80,$79,$75,$71,$6a,$a5,$01,$67,$6b,$9e,$79,$80,$75,$71,$6a,$89 + .byte $65,$6a,$9f,$00 +@ref21: + .byte $9e,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18 + .byte $00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14 + .byte $00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18 + .byte $00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14 + .byte $81 +@ref22: + .byte $18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00 + .byte $14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00 + .byte $18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00,$18,$00 + .byte $14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$00,$14,$81 + .byte $fd + .word @song1ch2loop + +@song1ch3: +@song1ch3loop: +@ref23: + .byte $82,$17,$84,$17,$8a,$0d,$84,$17,$82,$17,$84,$17,$8a,$0d,$84,$17 + .byte $82,$17,$84,$17,$8a,$0d,$84,$17,$82,$17,$84,$17,$8a,$0d,$84,$17 + .byte $82,$17,$84,$17,$8a,$0d,$84,$17,$82,$17,$84,$17,$8a,$0d,$84,$17 + .byte $82,$17,$84,$17,$8a,$0d,$84,$17,$82,$17,$84,$17,$8a,$0d,$8c,$16 + .byte $81 + .byte $ff,$21 + .word @ref23 + .byte $ff,$21 + .word @ref23 + .byte $ff,$21 + .word @ref23 + .byte $ff,$21 + .word @ref23 + .byte $ff,$21 + .word @ref23 + .byte $fd + .word @song1ch3loop + +@song1ch4: +@song1ch4loop: +@ref29: + .byte $f9,$85 +@ref30: + .byte $f9,$85 +@ref31: + .byte $f9,$85 +@ref32: + .byte $f9,$85 +@ref33: + .byte $f9,$85 +@ref34: + .byte $f9,$85 + .byte $fd + .word @song1ch4loop + + +@song2ch0: + .byte $fb,$06 +@song2ch0loop: +@ref35: + .byte $00,$f9,$83 + .byte $fd + .word @song2ch0loop + +@song2ch1: +@song2ch1loop: +@ref36: + .byte $00,$f9,$83 + .byte $fd + .word @song2ch1loop + +@song2ch2: +@song2ch2loop: +@ref37: + .byte $00,$f9,$83 + .byte $fd + .word @song2ch2loop + +@song2ch3: +@song2ch3loop: +@ref38: + .byte $00,$f9,$83 + .byte $fd + .word @song2ch3loop + +@song2ch4: +@song2ch4loop: +@ref39: + .byte $00,$f9,$83 + .byte $fd + .word @song2ch4loop + + +@song3ch0: + .byte $fb,$06 +@song3ch0loop: +@ref40: + .byte $f9,$85 + .byte $fd + .word @song3ch0loop + +@song3ch1: +@song3ch1loop: +@ref41: + .byte $f9,$85 + .byte $fd + .word @song3ch1loop + +@song3ch2: +@song3ch2loop: +@ref42: + .byte $f9,$85 + .byte $fd + .word @song3ch2loop + +@song3ch3: +@song3ch3loop: +@ref43: + .byte $f9,$85 + .byte $fd + .word @song3ch3loop + +@song3ch4: +@song3ch4loop: +@ref44: + .byte $f9,$85 + .byte $fd + .word @song3ch4loop + + +@song4ch0: + .byte $fb,$04 +@song4ch0loop: +@ref45: + .byte $94,$4a,$85,$01,$8e,$45,$94,$45,$92,$47,$01,$90,$41,$00,$9d +@ref46: + .byte $98,$4a,$85,$01,$8e,$45,$94,$45,$47,$01,$92,$41,$00,$89,$94,$3d + .byte $92,$3d,$94,$41,$41,$00,$81 +@ref47: + .byte $4e,$85,$01,$8e,$49,$94,$49,$92,$4b,$01,$90,$45,$00,$9d +@ref48: + .byte $98,$4e,$85,$01,$8e,$49,$94,$49,$4b,$01,$92,$45,$00,$91,$94,$51 + .byte $4f,$4c,$81 + .byte $fd + .word @song4ch0loop + +@song4ch1: +@song4ch1loop: +@ref49: + .byte $96,$1a,$85,$01,$8e,$15,$96,$15,$17,$01,$11,$00,$9d +@ref50: + .byte $1a,$85,$01,$8e,$15,$96,$15,$17,$01,$11,$00,$89,$0d,$98,$0d,$96 + .byte $11,$11,$00,$81 +@ref51: + .byte $1e,$85,$01,$8e,$19,$96,$19,$1b,$01,$15,$00,$9d +@ref52: + .byte $1e,$85,$01,$8e,$19,$96,$19,$1b,$01,$15,$00,$91,$94,$39,$37,$34 + .byte $81 + .byte $fd + .word @song4ch1loop + +@song4ch2: +@song4ch2loop: +@ref53: + .byte $8c,$02,$85,$01,$8e,$2d,$8c,$03,$80,$2f,$01,$29,$8c,$02,$8d,$02 + .byte $8d +@ref54: + .byte $02,$85,$01,$8e,$2d,$8c,$03,$80,$2f,$01,$29,$8c,$02,$89,$80,$25 + .byte $8c,$03,$80,$29,$29,$00,$81 +@ref55: + .byte $8c,$02,$85,$01,$8e,$31,$8c,$03,$80,$33,$01,$2d,$8c,$02,$8d,$02 + .byte $8d +@ref56: + .byte $02,$85,$01,$8e,$31,$8c,$03,$80,$33,$01,$2d,$8c,$02,$8d,$03,$94 + .byte $39,$37,$34,$81 + .byte $fd + .word @song4ch2loop + +@song4ch3: +@song4ch3loop: +@ref57: + .byte $8e,$0c,$85,$8a,$15,$84,$17,$8e,$0d,$84,$17,$8a,$15,$84,$17,$8e + .byte $0c,$85,$8a,$15,$84,$17,$8e,$0d,$86,$19,$8a,$15,$84,$16,$81 + .byte $ff,$11 + .word @ref57 + .byte $ff,$11 + .word @ref57 + .byte $ff,$11 + .word @ref57 + .byte $fd + .word @song4ch3loop + +@song4ch4: +@song4ch4loop: +@ref61: + .byte $bf +@ref62: + .byte $bf +@ref63: + .byte $bf +@ref64: + .byte $bf + .byte $fd + .word @song4ch4loop + + +@song5ch0: + .byte $fb,$06 +@song5ch0loop: +@ref65: + .byte $96,$38,$85,$01,$92,$35,$90,$38,$85,$01,$94,$34,$81 +@ref66: + .byte $90,$38,$85,$01,$92,$35,$90,$39,$a4,$39,$94,$2f,$96,$34,$81 +@ref67: + .byte $90,$38,$85,$01,$92,$35,$96,$38,$85,$01,$92,$34,$81 +@ref68: + .byte $94,$39,$96,$3f,$43,$47,$38,$85,$01,$34,$81 +@ref69: + .byte $38,$85,$01,$35,$38,$85,$01,$34,$81 +@ref70: + .byte $38,$85,$01,$35,$39,$a4,$39,$96,$2f,$34,$81 +@ref71: + .byte $39,$01,$39,$35,$2f,$01,$2f,$34,$81 +@ref72: + .byte $39,$3f,$43,$47,$4d,$47,$43,$3e,$81 +@ref73: + .byte $92,$50,$4c,$46,$42,$46,$42,$3e,$38,$3e,$38,$34,$2e,$34,$2e,$2a + .byte $26 +@ref74: + .byte $50,$4c,$46,$42,$46,$42,$3e,$38,$3e,$38,$34,$2e,$34,$2e,$2a,$26 + .byte $ff,$10 + .word @ref74 + .byte $ff,$10 + .word @ref74 + .byte $fd + .word @song5ch0loop + +@song5ch1: +@song5ch1loop: +@ref77: + .byte $9e,$26,$8d,$2a,$8d +@ref78: + .byte $20,$9d +@ref79: + .byte $26,$8d,$2a,$8d +@ref80: + .byte $20,$8d,$1a,$8d +@ref81: + .byte $26,$8d,$2a,$8d +@ref82: + .byte $20,$9d +@ref83: + .byte $1a,$9d +@ref84: + .byte $18,$8d,$1c,$8d +@ref85: + .byte $9a,$20,$83,$26,$83,$2b,$2e,$83,$34,$83,$38,$81 +@ref86: + .byte $20,$83,$26,$83,$2b,$2e,$83,$34,$83,$38,$81 + .byte $ff,$0b + .word @ref86 +@ref88: + .byte $21,$21,$27,$2b,$2f,$2e,$34,$83,$38,$81 + .byte $fd + .word @song5ch1loop + +@song5ch2: +@song5ch2loop: +@ref89: + .byte $8c,$02,$9d +@ref90: + .byte $9b,$02,$81 +@ref91: + .byte $02,$9d +@ref92: + .byte $97,$02,$02,$02,$02 +@ref93: + .byte $02,$9d +@ref94: + .byte $9b,$02,$81 +@ref95: + .byte $02,$9d + .byte $ff,$05 + .word @ref92 +@ref97: + .byte $02,$85,$02,$85,$02,$85,$02,$85 + .byte $ff,$08 + .word @ref97 + .byte $ff,$08 + .word @ref97 + .byte $ff,$08 + .word @ref97 + .byte $fd + .word @song5ch2loop + +@song5ch3: +@song5ch3loop: +@ref101: + .byte $9f +@ref102: + .byte $9f +@ref103: + .byte $9f +@ref104: + .byte $9f +@ref105: + .byte $9f +@ref106: + .byte $9f +@ref107: + .byte $9f +@ref108: + .byte $9f +@ref109: + .byte $83,$86,$1e,$85,$1e,$85,$1e,$85,$1e,$81 +@ref110: + .byte $83,$1e,$85,$1e,$85,$1e,$85,$1e,$81 + .byte $ff,$09 + .word @ref110 + .byte $ff,$09 + .word @ref110 + .byte $fd + .word @song5ch3loop + +@song5ch4: +@song5ch4loop: +@ref113: + .byte $9f +@ref114: + .byte $9f +@ref115: + .byte $9f +@ref116: + .byte $9f +@ref117: + .byte $9f +@ref118: + .byte $9f +@ref119: + .byte $9f +@ref120: + .byte $9f +@ref121: + .byte $9f +@ref122: + .byte $9f +@ref123: + .byte $9f +@ref124: + .byte $9f + .byte $fd + .word @song5ch4loop + + +@song6ch0: + .byte $fb,$03 +@ref125: + .byte $af +@song6ch0loop: +@ref126: + .byte $8f,$a6,$32,$8b,$a8,$42,$83,$aa,$42,$8d,$a8,$3e,$87,$aa,$3e,$83 + .byte $a8,$3e,$89,$a6,$32,$bd,$2e,$91,$a8,$34,$87,$34,$83,$34,$87,$aa + .byte $34,$83,$a8,$3e,$89,$a6,$2e,$ad +@ref127: + .byte $8f,$32,$8b,$a8,$42,$83,$aa,$42,$8d,$a8,$3e,$87,$aa,$3e,$83,$a8 + .byte $3e,$89,$a6,$32,$bd,$2e,$91,$aa,$3e,$87,$3e,$83,$ac,$3e,$87,$a8 + .byte $42,$83,$46,$89,$a6,$2e,$ab + .byte $fd + .word @song6ch0loop + +@song6ch1: +@ref128: + .byte $af +@song6ch1loop: +@ref129: + .byte $8f,$a6,$32,$87,$a8,$42,$83,$aa,$42,$8d,$a8,$3e,$87,$aa,$3e,$83 + .byte $a8,$3e,$8d,$aa,$38,$ad,$00,$8d,$a6,$2e,$8d,$a8,$34,$87,$34,$83 + .byte $34,$87,$aa,$34,$83,$a8,$3e,$8d,$38,$ad +@ref130: + .byte $00,$8d,$a6,$32,$87,$a8,$42,$83,$42,$8d,$aa,$3e,$87,$a8,$3e,$83 + .byte $3e,$8d,$ac,$46,$ad,$00,$8d,$a6,$2e,$8d,$aa,$3e,$87,$3e,$83,$ac + .byte $3e,$87,$a8,$42,$83,$46,$8d,$aa,$42,$9d,$00,$8b + .byte $fd + .word @song6ch1loop + +@song6ch2: +@ref131: + .byte $97,$8c,$02,$85,$02,$85,$02,$85 +@song6ch2loop: +@ref132: + .byte $9f,$8c,$02,$bd,$02,$bd,$02,$bd,$02,$9d +@ref133: + .byte $9f,$02,$bd,$02,$bd,$02,$bd,$02,$9b + .byte $fd + .word @song6ch2loop + +@song6ch3: +@ref134: + .byte $8a,$18,$84,$14,$88,$18,$84,$14,$8a,$18,$84,$14,$88,$18,$84,$14 + .byte $8a,$18,$9d +@song6ch3loop: +@ref135: + .byte $82,$14,$8d,$84,$14,$9d,$14,$9d,$14,$9d,$14,$9d,$14,$9d,$14,$9d + .byte $14,$9d,$14,$87,$8a,$16,$16,$81 +@ref136: + .byte $16,$8d,$84,$14,$9d,$14,$9d,$14,$9d,$14,$9d,$14,$9d,$14,$10,$86 + .byte $15,$88,$11,$82,$14,$91,$84,$14,$9d,$14,$85,$8a,$16,$16,$81 + .byte $fd + .word @song6ch3loop + +@song6ch4: +@ref137: + .byte $af +@song6ch4loop: +@ref138: + .byte $f9,$f9,$8b +@ref139: + .byte $f9,$f9,$89 + .byte $fd + .word @song6ch4loop diff --git a/neslib.h b/neslib.h index d71e07a..203d9f8 100644 --- a/neslib.h +++ b/neslib.h @@ -8,7 +8,7 @@ // unrle_vram renamed to vram_unrle, with adr argument removed // 060414 - many fixes and improvements, including sequental VRAM updates // previous versions were created since mid-2011, there were many updates - +// 30012020 - implemented dampening by Simon 'the Sorcerer' Richter. @@ -108,9 +108,9 @@ void __fastcall__ oam_hide_rest(unsigned char sprid); -//play a music in FamiTone format +//play a music in FamiTone format with dampening 0..15 -void __fastcall__ music_play(unsigned char song); +void __fastcall__ music_play(unsigned char song, unsigned char dampening); //stop music @@ -124,6 +124,12 @@ void __fastcall__ music_pause(unsigned char pause); void __fastcall__ sfx_play(unsigned char sound,unsigned char channel); +// same as above but with dampening 0..15 + +void sfx_play_damped(unsigned char sound,unsigned char channel, unsigned char dampening){ + sfx_play(sound,channel|(dampening<<2)); +}; + //play a DPCM sample, 1..63 void __fastcall__ sample_play(unsigned char sample); diff --git a/neslib.s b/neslib.s index 1041dde..ce0d5db 100644 --- a/neslib.s +++ b/neslib.s @@ -1,5 +1,5 @@ ;NES hardware-dependent functions by Shiru (shiru@mail.ru) -;with improvements by VEG +;with improvements by VEG and Simon 'the Sorcerer' Richter ;Feel free to do anything you want with this code, consider it Public Domain @@ -758,10 +758,12 @@ _vram_write: -;void __fastcall__ music_play(unsigned char song); - -_music_play=FamiToneMusicPlay +;void __fastcall__ music_play(unsigned char song, unsigned char dampening); +_music_play: + sta FT_MUSIC_VOLUME + jsr popa + jmp FamiToneMusicPlay ;void __fastcall__ music_stop(void); @@ -779,11 +781,16 @@ _music_pause=FamiToneMusicPause ;void __fastcall__ sfx_play(unsigned char sound,unsigned char channel); _sfx_play: - + pha and #$03 tax lda @sfxPriority,x tax + pla + lsr + lsr + sta FT_SFX_VOLUME,x + jsr popa jmp FamiToneSfxPlay diff --git a/sound/sounds.ftm b/sound/sounds.ftm index aa08a3c7c0b44df7eeb16571fbf71dbda650e094..2cb64acf0051096df14bd6d18ee8cfe0887a1a9b 100644 GIT binary patch literal 970 zcmcIj+fKqj6g<69Q4uOpV|>xXFYp6Q+CYgUwpJ+bHp+t$!~n+lBmRINsxxQ12tN7Z zlGB}?ojp6}wDij9V=*u9pT_gEboTH%8Rx!89uMMlD66pzbjnq2MTwlmA`aG!L*@Hf z?`BP)J9q2EKjEt+?k0nuv>+D@-HUgL4GS<#5;wyHG~YFK5r=VRAc4vQA<<7-0M4m)iNlXz{_b zJ@k7e$C`Eu1oPA12O>h~Aj$X}$;&sCd0Z69AhYI#g3rxDWDlI|_|j^t1JoLl@x2NJ z*i)tspl#c+nugUhttJG}{B5f_u$m*QIYxbMm@s3D}96`$ULHEkYPI zD8kW*Grv#+P?iB(7Sx*+!z=VI%&x)J<#lL{4f1v%18(;uY}1$%0EI+uP<6rc0o0lA zR#Xj_X@}^;q_kBroBoj;Uv}Fx;%uSS0bc~JjY6%~0~hXdS5v9qZr(}HhH;u-n~#Ns IFeJ&k-8Do6!~257^98v%MiJc`;P#CIU^yD+nx7?3Ke z9^iz9H{M;ZcRco%c7A`84fCtp{&2H1xPH3p$G*r(tJ~`IL?wW=!P%THi8!#~Dr}lj6KX8XT}8ZFH%+W6naoLdiXg_XdrjMz~1*lSN|xcF{>I%aU$d=4Kw! zW!YE;pU6`2t@+Z3943HH!s{YIp0OAfyI8AQ3tKhyTU5Wg`tfn%1QL(bZ(03T)o%?J z$O?_CA(HcX4v?w~L@wEbPrd2dmk|T7O(DkB_I1SYus;&Ch}V{&q85?YO<5Svp0edC zA^-z@EE?Wa()0yQP0`FN8XPLn;Ii4#@TO^K7=HqqilPY=4M-@^An5F9cy<~Z?oUAD zD;iJHAh`k!NS_@IPfSDe^ULBOc&mdIsPtc6X#jO9y`9(({ou(3`6 diff --git a/sounds.s b/sounds.s index 6494b2e..cd62667 100644 --- a/sounds.s +++ b/sounds.s @@ -8,66 +8,41 @@ sounds: .word @sfx_ntsc_1 .word @sfx_ntsc_2 .word @sfx_ntsc_3 - .word @sfx_ntsc_4 - .word @sfx_ntsc_5 - .word @sfx_ntsc_6 @pal: .word @sfx_pal_0 .word @sfx_pal_1 .word @sfx_pal_2 .word @sfx_pal_3 - .word @sfx_pal_4 - .word @sfx_pal_5 - .word @sfx_pal_6 @sfx_ntsc_0: - .byte $80,$7f,$81,$7e,$82,$08,$04,$81,$6a,$04,$81,$5e,$04,$81,$7e,$04 + .byte $80,$7f,$81,$7e,$82,$00,$04,$81,$6a,$04,$81,$5e,$04,$81,$7e,$04 .byte $80,$74,$04,$81,$6a,$04,$81,$5e,$04,$81,$7e,$04,$80,$71,$04,$81 - .byte $6a,$04,$81,$5e,$04,$81,$7e,$06,$00 + .byte $6a,$04,$81,$5e,$04,$81,$7e,$04,$00 @sfx_pal_0: - .byte $80,$7f,$81,$75,$82,$08,$04,$81,$62,$03,$81,$57,$03,$81,$75,$04 + .byte $80,$7f,$81,$75,$82,$00,$04,$81,$62,$03,$81,$57,$03,$81,$75,$04 .byte $80,$74,$03,$81,$62,$03,$81,$57,$04,$81,$75,$03,$80,$71,$03,$81 - .byte $62,$04,$81,$57,$03,$81,$75,$05,$00 + .byte $62,$04,$81,$57,$03,$81,$75,$03,$00 @sfx_ntsc_1: .byte $89,$3f,$8a,$00,$01,$89,$3e,$8a,$0e,$01,$89,$3d,$8a,$0c,$01,$89 - .byte $3c,$8a,$0a,$01,$00 + .byte $3c,$8a,$0a,$00 @sfx_pal_1: .byte $89,$3f,$8a,$00,$01,$89,$3e,$8a,$0e,$01,$89,$3d,$8a,$0c,$01,$89 - .byte $3c,$8a,$0a,$01,$00 + .byte $3c,$8a,$0a,$00 @sfx_ntsc_2: - .byte $89,$3a,$8a,$00,$01,$89,$39,$8a,$0e,$01,$89,$38,$8a,$0c,$01,$89 - .byte $37,$8a,$0a,$01,$00 -@sfx_pal_2: - .byte $89,$3a,$8a,$00,$01,$89,$39,$8a,$0e,$01,$89,$38,$8a,$0c,$01,$89 - .byte $37,$8a,$0a,$01,$00 -@sfx_ntsc_3: - .byte $89,$37,$8a,$00,$01,$89,$36,$8a,$0e,$01,$89,$35,$8a,$0c,$01,$89 - .byte $34,$8a,$0a,$01,$00 -@sfx_pal_3: - .byte $89,$37,$8a,$00,$01,$89,$36,$8a,$0e,$01,$89,$35,$8a,$0c,$01,$89 - .byte $34,$8a,$0a,$01,$00 -@sfx_ntsc_4: - .byte $89,$34,$8a,$00,$01,$89,$33,$8a,$0e,$01,$89,$32,$8a,$0c,$01,$89 - .byte $31,$8a,$0a,$01,$00 -@sfx_pal_4: - .byte $89,$34,$8a,$00,$01,$89,$33,$8a,$0e,$01,$89,$32,$8a,$0c,$01,$89 - .byte $31,$8a,$0a,$01,$00 -@sfx_ntsc_5: - .byte $80,$ff,$81,$ab,$82,$09,$01,$81,$3c,$01,$81,$9c,$82,$08,$01,$81 + .byte $80,$ff,$81,$ab,$82,$01,$01,$81,$3c,$01,$81,$9c,$82,$00,$01,$81 .byte $b5,$01,$81,$cb,$01,$00 -@sfx_pal_5: - .byte $80,$ff,$81,$8c,$82,$09,$01,$81,$26,$01,$81,$91,$82,$08,$01,$81 +@sfx_pal_2: + .byte $80,$ff,$81,$8c,$82,$01,$01,$81,$26,$01,$81,$91,$82,$00,$01,$81 .byte $a8,$01,$81,$bc,$01,$00 -@sfx_ntsc_6: - .byte $80,$3b,$81,$d5,$82,$08,$06,$80,$3f,$81,$cf,$01,$81,$c9,$01,$81 +@sfx_ntsc_3: + .byte $80,$3b,$81,$d5,$82,$00,$06,$80,$3f,$81,$cf,$01,$81,$c9,$01,$81 .byte $c3,$01,$81,$bd,$01,$81,$b7,$01,$81,$b1,$01,$80,$bf,$81,$ab,$01 .byte $81,$a5,$01,$81,$9f,$01,$81,$99,$01,$81,$96,$02,$81,$9a,$01,$81 .byte $9e,$01,$81,$a2,$01,$81,$a6,$01,$81,$aa,$01,$81,$ae,$01,$81,$b2 - .byte $01,$81,$b6,$01,$81,$ba,$01,$81,$be,$01,$81,$c2,$01,$81,$c6,$01 - .byte $00 -@sfx_pal_6: - .byte $80,$3b,$81,$c6,$82,$08,$05,$80,$3f,$81,$c0,$01,$81,$ba,$01,$81 + .byte $01,$81,$b6,$01,$81,$ba,$01,$81,$be,$01,$81,$c2,$01,$81,$c6,$00 +@sfx_pal_3: + .byte $80,$3b,$81,$c6,$82,$00,$05,$80,$3f,$81,$c0,$01,$81,$ba,$01,$81 .byte $b4,$01,$81,$ae,$01,$81,$a8,$01,$80,$bf,$81,$a2,$01,$81,$9c,$01 .byte $81,$96,$01,$81,$90,$01,$81,$8b,$01,$81,$8f,$01,$81,$93,$01,$81 .byte $97,$01,$81,$9b,$01,$81,$9f,$01,$81,$a3,$01,$81,$a7,$01,$81,$ab - .byte $01,$81,$af,$01,$81,$b3,$01,$00 + .byte $01,$81,$af,$01,$81,$b3,$00 From 4c2d24613c6aa2b1e02485ac84ccafedc6d8f1bd Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Thu, 30 Jan 2020 14:52:44 +0100 Subject: [PATCH 14/24] reduce music volume by gating instead of substraction. --- famitone2.s | 21 +++++++++------------ game.c | 10 +++++----- neslib.h | 6 +++++- neslib.s | 6 +++--- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/famitone2.s b/famitone2.s index 6c4b0c2..6d3d86a 100644 --- a/famitone2.s +++ b/famitone2.s @@ -618,10 +618,9 @@ FamiToneUpdate: sta Date: Thu, 30 Jan 2020 14:55:08 +0100 Subject: [PATCH 15/24] fixed typo. --- neslib.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neslib.h b/neslib.h index b92697e..42a95e8 100644 --- a/neslib.h +++ b/neslib.h @@ -108,7 +108,7 @@ void __fastcall__ oam_hide_rest(unsigned char sprid); -//play a music in FamiTone format with dampening 0..15 +//play a music in FamiTone format with gating 0..15 void __fastcall__ music_play_gated(unsigned char song, unsigned char dampening); From 215365e004e4483388d7ec96c365ae4aa856682c Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Fri, 31 Jan 2020 01:38:12 +0100 Subject: [PATCH 16/24] added weapon balance concepts. --- Weaponbalance.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Weaponbalance.md diff --git a/Weaponbalance.md b/Weaponbalance.md new file mode 100644 index 0000000..a82e504 --- /dev/null +++ b/Weaponbalance.md @@ -0,0 +1,10 @@ +# Weapons + +Charger - **A** paints fields in front - length (max. 16) and strength dependant on charge time (slow rate of fire) +Roller - paints field in front, **A** paints 3 fields in front longitudinal (straight) (medium rate of fire) +Brush - paints field in front, **A** paints 3 fields in front transversal (diagonal) (medium rate of fire) +Bubbler - paints own field and walls run against, **A** shoots bubble stunning (bubbling) enemy. (medium to slow rate of fire) +Shooter - A paints 4 fields in front (2 straight + 2 diagonal, high fire rate) +Bomb (main weapon) - A colors all fields <=2 distance radius (slow rate of fire) +Bomb (secondary weapon) - A shoots bomb, colors all fields <=2 distance radius when hiting or reaching max distance (slow rate of fire) + From dd3703badd72bf65d08ed4e0fd4b7466162ea0ae Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Fri, 31 Jan 2020 04:26:04 +0100 Subject: [PATCH 17/24] formatting. --- Weaponbalance.md | 10 ---------- weaponbalance.md | 10 ++++++++++ 2 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 Weaponbalance.md create mode 100644 weaponbalance.md diff --git a/Weaponbalance.md b/Weaponbalance.md deleted file mode 100644 index a82e504..0000000 --- a/Weaponbalance.md +++ /dev/null @@ -1,10 +0,0 @@ -# Weapons - -Charger - **A** paints fields in front - length (max. 16) and strength dependant on charge time (slow rate of fire) -Roller - paints field in front, **A** paints 3 fields in front longitudinal (straight) (medium rate of fire) -Brush - paints field in front, **A** paints 3 fields in front transversal (diagonal) (medium rate of fire) -Bubbler - paints own field and walls run against, **A** shoots bubble stunning (bubbling) enemy. (medium to slow rate of fire) -Shooter - A paints 4 fields in front (2 straight + 2 diagonal, high fire rate) -Bomb (main weapon) - A colors all fields <=2 distance radius (slow rate of fire) -Bomb (secondary weapon) - A shoots bomb, colors all fields <=2 distance radius when hiting or reaching max distance (slow rate of fire) - diff --git a/weaponbalance.md b/weaponbalance.md new file mode 100644 index 0000000..40638a1 --- /dev/null +++ b/weaponbalance.md @@ -0,0 +1,10 @@ +# Weapons + +- Charger - **A** paints fields in front - length (max. 16) and strength dependant on charge time (slow rate of fire) +- Roller - paints field in front, **A** paints 3 fields in front longitudinal (straight) (medium rate of fire) +- Brush - paints field in front, **A** paints 3 fields in front transversal (diagonal) (medium rate of fire) +- Bubbler - paints own field and walls run against, **A** shoots bubble stunning (bubbling) enemy. (medium to slow rate of fire) +- Shooter - **A** paints 4 fields in front (2 straight + 2 diagonal, high fire rate) +- Bomb (main weapon) - **A** colors all fields <=2 distance radius (slow rate of fire) +- Bomb (secondary weapon) - **A** shoots bomb, colors all fields <=2 distance radius when hiting or reaching max distance (slow rate of fire) + From 58882540e860b78a203f3b52d6aa0fedd0c7e55e Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Mon, 3 Feb 2020 15:11:18 +0100 Subject: [PATCH 18/24] added squid mode (atm invincibility to enemy ink). --- TODO.md | 3 +- game.c | 43 +++++++++------ metasprites.h | 144 +++++++++++++++++++++++++++++++++++++++++++++++++- tileset.chr | Bin 8192 -> 8192 bytes 4 files changed, 170 insertions(+), 20 deletions(-) diff --git a/TODO.md b/TODO.md index 3b457ca..4d47058 100644 --- a/TODO.md +++ b/TODO.md @@ -16,6 +16,7 @@ - ~~Better weapon select~~ - ~~Animated Sprites~~ - ~~Palettes to indicate selection~~ +- ~~Squid mode (on B)~~ - Weapon Balance ## 1.2 @@ -25,10 +26,10 @@ - Shooters - Ammo - semicoloured tiles +- Bubbler (Bubble enemies instead of killing them) - health - damage over time - Four Score 2v2 support -- Squid mode (on B) - Bombs (secondary fire conflicting with squid mode) - Weapon Balance diff --git a/game.c b/game.c index 38511a3..91f3732 100644 --- a/game.c +++ b/game.c @@ -61,9 +61,13 @@ extern const unsigned char music_music_data[]; /* Weapons */ #define NUM_WPNS 2 -#define WPN_ROLLER 0 -#define WPN_CHARGER 1 -//#define WPN_AI 2 +#define WPN_SQUID 0 +#define WPN_ROLLER 1 +#define WPN_CHARGER 2 +//#define WPN_AI2 + +#define MODE_NORMAL 0 +#define MODE_SQUID 1 /* Tuneable gameplay parameters */ #define RESPAWN_TIME 64 @@ -167,9 +171,9 @@ const unsigned char* const levelList[LEVELS_ALL*4]={ /* Weapon Select */ const unsigned char select_weapon[] = "Select Weapon"; -const unsigned int projectile_speed[] = { PROJECTILE_SPEED_ROLLER, PROJECTILE_SPEED_CHARGER }; -const unsigned char weapon_ranges[] = { PROJECTILE_DISTANCE_ROLLER, PROJECTILE_DISTANCE_CHARGER }; -const unsigned char weapon_cooldown[] = { PROJECTILE_WAIT_TIME_ROLLER, PROJECTILE_WAIT_TIME_CHARGER }; +const unsigned int projectile_speed[] = { 0, PROJECTILE_SPEED_ROLLER, PROJECTILE_SPEED_CHARGER }; +const unsigned char weapon_ranges[] = { 0, PROJECTILE_DISTANCE_ROLLER, PROJECTILE_DISTANCE_CHARGER }; +const unsigned char weapon_cooldown[] = { 0, PROJECTILE_WAIT_TIME_ROLLER, PROJECTILE_WAIT_TIME_CHARGER }; /* This is used to ensure the updatelist starts empty. */ const unsigned char updateListData[]={ @@ -213,6 +217,8 @@ static unsigned char player_diag_flip[PLAYER_MAX]; static unsigned char player_wpn [PLAYER_MAX]; static unsigned char player_charge [PLAYER_MAX]; +static unsigned char player_mode [PLAYER_MAX]; + static unsigned char player_ai [PLAYER_MAX]; static unsigned char ai_aggression[PLAYER_MAX]; const unsigned char dirs[4]={ DIR_LEFT,DIR_UP,DIR_RIGHT,DIR_DOWN }; //basic maze strategy: always turn right @@ -585,6 +591,9 @@ void show_select_weapon(void) { player_ai[0]=0; player_ai[1]=1; + player_mode[0]=MODE_NORMAL; + player_mode[1]=MODE_NORMAL; + while (1) { next: @@ -621,8 +630,8 @@ void show_select_weapon(void) { if (j & PAD_START) return; /* Up - move cursor up */ if (j & PAD_UP) { - if (player_wpn[player_id] == 0) { - player_wpn[player_id] = NUM_WPNS-1; + if (player_wpn[player_id] == 1) { + player_wpn[player_id] = NUM_WPNS; } else { player_wpn[player_id] -= 1; } @@ -632,7 +641,7 @@ void show_select_weapon(void) { /* Select or Down - move cursor down */ if (j & PAD_SELECT || j & PAD_LEFT || j & PAD_RIGHT) { player_wpn[player_id] += 1; - if (player_wpn[player_id] == NUM_WPNS) player_wpn[player_id] = 0; + if (player_wpn[player_id] > NUM_WPNS) player_wpn[player_id] = 1; goto next; } } @@ -986,7 +995,7 @@ void player_move(unsigned char id,unsigned char dir_index) { */ map_type = map[MAP_ADR(px, py)]; - if (player_wpn[id] == WPN_ROLLER && can_ink(map_type)) { + if (player_mode[id]==MODE_NORMAL && player_wpn[id] == WPN_ROLLER && can_ink(map_type)) { set_tile_palette(px, py, id+1); } @@ -1219,9 +1228,8 @@ void game_loop(void) { case DIR_RIGHT: spr_dir = SPR_RIGHT; break; case DIR_UP: spr_dir = SPR_UP; break; } - oam_meta_spr( - px, py, spr, SprPlayers[i][player_wpn[i]][spr_dir][anim_frame] - ); + if(player_mode[i]==MODE_SQUID) oam_meta_spr(px, py, spr, SprPlayers[i][0][spr_dir][anim_frame]); + else oam_meta_spr(px, py, spr, SprPlayers[i][player_wpn[i]][spr_dir][anim_frame]); spr-=16; } @@ -1348,7 +1356,8 @@ void game_loop(void) { if (j&PAD_RIGHT) player_move(i,2); if (j&PAD_UP) player_move(i,1); if (j&PAD_DOWN) player_move(i,3); - if (j&PAD_A) player_make_projectile(i); else player_charge[i] = 0; + if (j&PAD_B) player_mode[i]=MODE_SQUID; else player_mode[i]=MODE_NORMAL; + if (j&PAD_A) {player_mode[i]=MODE_NORMAL; player_make_projectile(i);} else player_charge[i] = 0; } /* If this player has a projectile, move it as well. */ @@ -1385,7 +1394,7 @@ void game_loop(void) { /* Kill players that collide with eachother. */ for (i = 0; i < player_all; ++i) { for (j = i + 1; j < player_all; ++j) { - if (player_x[i] == player_x[j] && player_y[i] == player_y[j]) { + if (player_x[i] == player_x[j] && player_y[i] == player_y[j] && player_mode[i]==MODE_NORMAL && player_mode[j]==MODE_NORMAL) { // If you have a roller, kill the player you collide with // If both players have rollers, both of them die if (player_wpn[i] == WPN_ROLLER) player_die(j); @@ -1395,13 +1404,13 @@ void game_loop(void) { (player_x[i] >> (TILE_SIZE_BIT+FP_BITS)) == (projectile_x[j] >> (TILE_SIZE_BIT+FP_BITS)) && (player_y[i] >> (TILE_SIZE_BIT+FP_BITS)) == (projectile_y[j] >> (TILE_SIZE_BIT+FP_BITS))) { /* Player j kills player i using a projectile */ - player_die(i); + if(player_mode[i]==MODE_NORMAL) player_die(i); } if (projectile_dir[i] != DIR_NONE && (player_x[j] >> (TILE_SIZE_BIT+FP_BITS)) == (projectile_x[i] >> (TILE_SIZE_BIT+FP_BITS)) && (player_y[j] >> (TILE_SIZE_BIT+FP_BITS)) == (projectile_y[i] >> (TILE_SIZE_BIT+FP_BITS))) { /* Player i kills player j using a projectile */ - player_die(j); + if(player_mode[j]==MODE_NORMAL) player_die(j); } } } diff --git a/metasprites.h b/metasprites.h index 2a79b62..1f8710e 100644 --- a/metasprites.h +++ b/metasprites.h @@ -4,6 +4,146 @@ * Player weapons are ordered ROLLER CHARGER (see WPN_ROLLER, etc in game.c) * Player directions need to be ordered DOWN RIGHT UP LEFT (see SPR_DOWN, etc in game.c) */ +const unsigned char SprPlayer1SquidUpFrame1[] = { + 0,-1,0x66,0, + 8,-1,0x67,0, + 0, 7,0x76,0, + 8, 7,0x77,0, + 128 +}; + +const unsigned char SprPlayer1SquidUpFrame2[] = { + 0,-1,0x66,0, + 8,-1,0x67,0, + 0, 7,0x77,0|OAM_FLIP_H, + 8, 7,0x76,0|OAM_FLIP_H, + 128 +}; + +const unsigned char SprPlayer1SquidRightFrame1[] = { + 0,-1,0x68,0, + 8,-1,0x69,0, + 0, 7,0x78,0, + 8, 7,0x79,0, + 128 +}; + +const unsigned char SprPlayer1SquidDownFrame1[] = { + 0,-1,0x76,0|OAM_FLIP_V, + 8,-1,0x77,0|OAM_FLIP_V, + 0, 7,0x66,0|OAM_FLIP_V, + 8, 7,0x67,0|OAM_FLIP_V, + 128 +}; + +const unsigned char SprPlayer1SquidLeftFrame1[] = { + 0,-1,0x69,0|OAM_FLIP_H, + 8,-1,0x68,0|OAM_FLIP_H, + 0, 7,0x79,0|OAM_FLIP_H, + 8, 7,0x78,0|OAM_FLIP_H, + 128 +}; + +const unsigned char SprPlayer1SquidRightFrame2[] = { + 0,-1,0x78,0|OAM_FLIP_V, + 8,-1,0x79,0|OAM_FLIP_V, + 0, 7,0x68,0|OAM_FLIP_V, + 8, 7,0x69,0|OAM_FLIP_V, + 128 +}; + +const unsigned char SprPlayer1SquidDownFrame2[] = { + 0,-1,0x77,0|OAM_FLIP_V|OAM_FLIP_H, + 8,-1,0x76,0|OAM_FLIP_V|OAM_FLIP_H, + 0, 7,0x67,0|OAM_FLIP_V|OAM_FLIP_H, + 8, 7,0x66,0|OAM_FLIP_V|OAM_FLIP_H, + 128 +}; + +const unsigned char SprPlayer1SquidLeftFrame2[] = { + 0,-1,0x79,0|OAM_FLIP_H|OAM_FLIP_V, + 8,-1,0x78,0|OAM_FLIP_H|OAM_FLIP_V, + 0, 7,0x69,0|OAM_FLIP_H|OAM_FLIP_V, + 8, 7,0x68,0|OAM_FLIP_H|OAM_FLIP_V, + 128 +}; + +const unsigned char* const SprPlayer1SquidDown[] = {SprPlayer1SquidDownFrame1, SprPlayer1SquidDownFrame2}; +const unsigned char* const SprPlayer1SquidRight[] = {SprPlayer1SquidRightFrame1, SprPlayer1SquidRightFrame2}; +const unsigned char* const SprPlayer1SquidUp[] = {SprPlayer1SquidUpFrame1, SprPlayer1SquidUpFrame2}; +const unsigned char* const SprPlayer1SquidLeft[] = {SprPlayer1SquidLeftFrame1, SprPlayer1SquidLeftFrame2}; +const unsigned char* const * const SprPlayer1Squid[] = {SprPlayer1SquidDown, SprPlayer1SquidRight, SprPlayer1SquidUp, SprPlayer1SquidLeft}; + +const unsigned char SprPlayer2SquidUpFrame2[] = { + 0,-1,0x66,1, + 8,-1,0x67,1, + 0, 7,0x76,1, + 8, 7,0x77,1, + 128 +}; + +const unsigned char SprPlayer2SquidUpFrame1[] = { + 0,-1,0x66,1, + 8,-1,0x67,1, + 0, 7,0x77,1|OAM_FLIP_H, + 8, 7,0x76,1|OAM_FLIP_H, + 128 +}; + +const unsigned char SprPlayer2SquidRightFrame2[] = { + 0,-1,0x68,1, + 8,-1,0x69,1, + 0, 7,0x78,1, + 8, 7,0x79,1, + 128 +}; + +const unsigned char SprPlayer2SquidDownFrame2[] = { + 0,-1,0x76,1|OAM_FLIP_V, + 8,-1,0x77,1|OAM_FLIP_V, + 0, 7,0x66,1|OAM_FLIP_V, + 8, 7,0x67,1|OAM_FLIP_V, + 128 +}; + +const unsigned char SprPlayer2SquidLeftFrame2[] = { + 0,-1,0x69,1|OAM_FLIP_H, + 8,-1,0x68,1|OAM_FLIP_H, + 0, 7,0x79,1|OAM_FLIP_H, + 8, 7,0x78,1|OAM_FLIP_H, + 128 +}; + +const unsigned char SprPlayer2SquidRightFrame1[] = { + 0,-1,0x78,1|OAM_FLIP_V, + 8,-1,0x79,1|OAM_FLIP_V, + 0, 7,0x68,1|OAM_FLIP_V, + 8, 7,0x69,1|OAM_FLIP_V, + 128 +}; + +const unsigned char SprPlayer2SquidDownFrame1[] = { + 0,-1,0x77,1|OAM_FLIP_V|OAM_FLIP_H, + 8,-1,0x76,1|OAM_FLIP_V|OAM_FLIP_H, + 0, 7,0x67,1|OAM_FLIP_V|OAM_FLIP_H, + 8, 7,0x66,1|OAM_FLIP_V|OAM_FLIP_H, + 128 +}; + +const unsigned char SprPlayer2SquidLeftFrame1[] = { + 0,-1,0x79,1|OAM_FLIP_H|OAM_FLIP_V, + 8,-1,0x78,1|OAM_FLIP_H|OAM_FLIP_V, + 0, 7,0x69,1|OAM_FLIP_H|OAM_FLIP_V, + 8, 7,0x68,1|OAM_FLIP_H|OAM_FLIP_V, + 128 +}; + +const unsigned char* const SprPlayer2SquidDown[] = {SprPlayer2SquidDownFrame1, SprPlayer2SquidDownFrame2}; +const unsigned char* const SprPlayer2SquidRight[] = {SprPlayer2SquidRightFrame1, SprPlayer2SquidRightFrame2}; +const unsigned char* const SprPlayer2SquidUp[] = {SprPlayer2SquidUpFrame1, SprPlayer2SquidUpFrame2}; +const unsigned char* const SprPlayer2SquidLeft[] = {SprPlayer2SquidLeftFrame1, SprPlayer2SquidLeftFrame2}; +const unsigned char* const * const SprPlayer2Squid[] = {SprPlayer2SquidDown, SprPlayer2SquidRight, SprPlayer2SquidUp, SprPlayer2SquidLeft}; + const unsigned char SprPlayer1RollerDownFrame1[] = { 0,-1,0x40,0, 8,-1,0x41,0, @@ -151,7 +291,7 @@ const unsigned char SprPlayer1ChargerLeftFrame2[] = { const unsigned char* const SprPlayer1ChargerLeft[] = {SprPlayer1ChargerLeftFrame1, SprPlayer1ChargerLeftFrame2}; const unsigned char* const * const SprPlayer1Charger[] = {SprPlayer1ChargerDown, SprPlayer1ChargerRight, SprPlayer1ChargerUp, SprPlayer1ChargerLeft}; -const unsigned char* const * const * const SprPlayer1[] = {SprPlayer1Roller, SprPlayer1Charger}; +const unsigned char* const * const * const SprPlayer1[] = {SprPlayer1Squid, SprPlayer1Roller, SprPlayer1Charger}; const unsigned char SprPlayer2RollerDownFrame1[] = { 0,-1,0x40,1, @@ -300,7 +440,7 @@ const unsigned char SprPlayer2ChargerLeftFrame2[] = { const unsigned char* const SprPlayer2ChargerLeft[] = {SprPlayer2ChargerLeftFrame1, SprPlayer2ChargerLeftFrame2}; const unsigned char* const * const SprPlayer2Charger[] = {SprPlayer2ChargerDown, SprPlayer2ChargerRight, SprPlayer2ChargerUp, SprPlayer2ChargerLeft}; -const unsigned char* const * const * const SprPlayer2[] = {SprPlayer2Roller, SprPlayer2Charger}; +const unsigned char* const * const * const SprPlayer2[] = {SprPlayer2Squid, SprPlayer2Roller, SprPlayer2Charger}; const unsigned char* const * const * const * const SprPlayers[] = {SprPlayer1, SprPlayer2}; diff --git a/tileset.chr b/tileset.chr index 3666fe03dc252c86f98bfefec104b0dc7e4bbf8b..afed63ae84d3b65d5aeeb09748507b04017d71a2 100644 GIT binary patch delta 152 zcmV;J0B8SzK!8B7U=~0D0}LNOJ70eR0uK--Eow}F!0?#--2VQ6Krm=zv{Eu4e|0}P zZ+$-?UrIhDP(nTcz_9rI-1_?fz;FoUv{ogPArD}Z7hpekU3Xu5|7HM4b6Ig!nPvd? zy54%f=U@N|Rx*}Zr(gg#ZF?UcH9s&YQe++xDlahq_SF3N@W22eTD;^4Fu;=`4`Z_e G82$(J9X-zg delta 23 dcmZp0XmHq&AU0W%f59a21R%9&Gn2$Wb^v9)2uc6| From 7cf8e36507ffe43a19ec2980b4463416cd34d8b8 Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Mon, 3 Feb 2020 15:27:44 +0100 Subject: [PATCH 19/24] squid mode can swim up walls in own ink colour. --- game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game.c b/game.c index 91f3732..172598f 100644 --- a/game.c +++ b/game.c @@ -999,7 +999,7 @@ void player_move(unsigned char id,unsigned char dir_index) { set_tile_palette(px, py, id+1); } - if ((map_type >= 0x22 && map_type <= 0x29) || (map_type >= 0x32 && map_type <= 0x39)) { + if (((map_type >= 0x22 && map_type <= 0x29) || (map_type >= 0x32 && map_type <= 0x39)) && (player_mode[id]!=MODE_SQUID || get_tile_palette(px,py)!=id+1)) { return; } From d561ea9cc4c533a8e51c47f0d4374f92d445c64b Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Tue, 26 May 2020 10:12:20 +0200 Subject: [PATCH 20/24] ToDo use select button for bombs. --- TODO.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index 4d47058..a55d0e5 100644 --- a/TODO.md +++ b/TODO.md @@ -30,7 +30,7 @@ - health - damage over time - Four Score 2v2 support -- Bombs (secondary fire conflicting with squid mode) +- Bombs (using select button) - Weapon Balance ## 1.3 From 4c285275cd09607fce9c41962f1bbea4f9f37b57 Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Tue, 26 May 2020 10:13:22 +0200 Subject: [PATCH 21/24] Use memcpy from string.h instead of neslib.h. --- game.c | 1 + neslib.h | 10 ++-------- neslib.s | 50 +------------------------------------------------- 3 files changed, 4 insertions(+), 57 deletions(-) diff --git a/game.c b/game.c index 172598f..767ce20 100644 --- a/game.c +++ b/game.c @@ -12,6 +12,7 @@ //#include "nes.h" #include +#include /* Name tables */ #include "levels/splat_title.h" diff --git a/neslib.h b/neslib.h index 42a95e8..c4a1c3a 100644 --- a/neslib.h +++ b/neslib.h @@ -30,7 +30,6 @@ void __fastcall__ pal_spr(const char *data); void __fastcall__ pal_col(unsigned char index,unsigned char color); //reset palette to $0f - void __fastcall__ pal_clear(void); //set virtual bright both for sprites and background, 0 is black, 4 is normal, 8 is white @@ -245,16 +244,11 @@ void __fastcall__ vram_unrle(const unsigned char *data); -//like a normal memcpy, but does not return anything - -void __fastcall__ memcpy(void *dst,void *src,unsigned int len); //like memset, but does not return anything - void __fastcall__ memfill(void *dst,unsigned char value,unsigned int len); //delay for N frames - void __fastcall__ delay(unsigned char frames); @@ -277,8 +271,8 @@ void __fastcall__ delay(unsigned char frames); #define MASK_SPR 0x10 #define MASK_BG 0x08 -#define MASK_EDGE_SPR 0x04 -#define MASK_EDGE_BG 0x02 +#define MASK_EDGE_SPR 0x04 +#define MASK_EDGE_BG 0x02 #define NAMETABLE_A 0x2000 #define NAMETABLE_B 0x2400 diff --git a/neslib.s b/neslib.s index d9fbf82..bceabc6 100644 --- a/neslib.s +++ b/neslib.s @@ -17,7 +17,7 @@ .export _rand8,_rand16,_set_rand .export _vram_adr,_vram_put,_vram_fill,_vram_inc,_vram_unrle .export _set_vram_update,_flush_vram_update - .export _memcpy,_memfill,_delay + .export _memfill,_delay @@ -1105,54 +1105,6 @@ _vram_inc: -;void __fastcall__ memcpy(void *dst,void *src,unsigned int len); - -_memcpy: - - sta Date: Tue, 26 May 2020 12:06:07 +0200 Subject: [PATCH 22/24] neslib documentation. --- neslib.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neslib.h b/neslib.h index c4a1c3a..5f37b22 100644 --- a/neslib.h +++ b/neslib.h @@ -9,7 +9,7 @@ // 060414 - many fixes and improvements, including sequental VRAM updates // previous versions were created since mid-2011, there were many updates // 30012020 - implemented dampening by Simon 'the Sorcerer' Richter. - +// 26052020 - removed memcpy as it is available in string.h already. From 35e0978e68516053ba078fffe8ee0d0f0d447d3f Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Tue, 26 May 2020 12:12:39 +0200 Subject: [PATCH 23/24] added spawn invincibility (starting in squid mode). --- TODO.md | 2 +- game.c | 36 ++++++++++++++++++++---------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/TODO.md b/TODO.md index a55d0e5..2b92a01 100644 --- a/TODO.md +++ b/TODO.md @@ -2,7 +2,7 @@ ## 1.1 -- Spawn invincibility (to prevent spawn camping) +- ~~Spawn invincibility (to prevent spawn camping)~~ - Woomy - ~~AI players~~ - AI select diff --git a/game.c b/game.c index 767ce20..6f9717d 100644 --- a/game.c +++ b/game.c @@ -117,8 +117,8 @@ const unsigned char palCharacters[8]={ 0x0f,0x04,0x30,0x0f,0x0f,0x19,0x30,0x0f } const unsigned char palCharPaused[8] = {0x0f,0x00,0x2d,0x0f,0x0f,0x00,0x2d,0x0f}; const unsigned char palJudd[]={ 0x0f,0x26,0x27,0x30,0x0f,0x14,0x27,0x30,0x0f,0x2a,0x27,0x30,0x0f,0x26,0x27,0x30 }; - /* v 1 . 0 . 5 */ -const unsigned char versionStr[] = {230,232,241,231,241,236}; + /* v 1 . 0 . 6 */ +const unsigned char versionStr[] = {230,232,241,231,241,237}; const unsigned char victoryMsg[] = "Victory!"; const unsigned char fourSpaces[] = " "; const unsigned char tieMsg[] = "It's a tie!"; @@ -592,8 +592,8 @@ void show_select_weapon(void) { player_ai[0]=0; player_ai[1]=1; - player_mode[0]=MODE_NORMAL; - player_mode[1]=MODE_NORMAL; + player_mode[0]=MODE_SQUID; + player_mode[1]=MODE_SQUID; while (1) { next: @@ -1048,6 +1048,7 @@ void player_die(unsigned char id) { player_anim_cnt[id]=0; player_diag_flip[id]=0; player_dir[id] = DIR_NONE; + player_mode[id]=MODE_SQUID; player_wait[id] = RESPAWN_TIME; sfx_play(SFX_DEATH,0); @@ -1070,14 +1071,11 @@ unsigned char ai_move(unsigned char id){ if(dirv==0) j=PAD_A; //if no movement is possible just fire weapon else j=dirs[diri%4]; - if((player_cooldown[id]==0)&&(ai_aggression[id]>=1)){ - px=player_x_spawn[1-id]>>(TILE_SIZE_BIT+FP_BITS); - py=player_y_spawn[1-id]>>(TILE_SIZE_BIT+FP_BITS); - px2=player_x[1-id]>>(TILE_SIZE_BIT+FP_BITS); - py2=player_y[1-id]>>(TILE_SIZE_BIT+FP_BITS); - if((px!=px2)||(py!=py2)){ //dont try to kill enemy in spawn + if((player_cooldown[id]==0)&&(ai_aggression[id]>=1)&&(player_mode[1-id]!=MODE_SQUID)){ px=player_x[id]>>(TILE_SIZE_BIT+FP_BITS); py=player_y[id]>>(TILE_SIZE_BIT+FP_BITS); + px2=player_x[1-id]>>(TILE_SIZE_BIT+FP_BITS); + py2=player_y[1-id]>>(TILE_SIZE_BIT+FP_BITS); if(px==px2){ if(py>py2){ if(py-py2<=3){ @@ -1095,7 +1093,7 @@ unsigned char ai_move(unsigned char id){ if(player_dir[id]==DIR_RIGHT){ j=PAD_A; } else if(player_move_test(id,2)>0){ j=dirs[2]; } }} - }} + } return j; } @@ -1224,10 +1222,10 @@ void game_loop(void) { switch (player_dir[i]) { case DIR_NONE: + case DIR_UP: spr_dir = SPR_UP; break; case DIR_DOWN: spr_dir = SPR_DOWN; break; case DIR_LEFT: spr_dir = SPR_LEFT; break; case DIR_RIGHT: spr_dir = SPR_RIGHT; break; - case DIR_UP: spr_dir = SPR_UP; break; } if(player_mode[i]==MODE_SQUID) oam_meta_spr(px, py, spr, SprPlayers[i][0][spr_dir][anim_frame]); else oam_meta_spr(px, py, spr, SprPlayers[i][player_wpn[i]][spr_dir][anim_frame]); @@ -1346,19 +1344,25 @@ void game_loop(void) { player_cooldown[i] -= 1; } + + if (j&PAD_B) player_mode[i]=MODE_SQUID; else player_mode[i]=MODE_NORMAL; + if (j & player_dir[i] && player_diag_flip[i]) { - /* Give priority new new direction (useful for cornering) */ + /* Give priority to new direction (useful for cornering) */ j &= ~player_dir[i]; player_diag_flip[i] = 0; - player_move(i, player_dir_index[i]); + //player_move(i, player_dir_index[i]); } if (j&PAD_LEFT) player_move(i,0); if (j&PAD_RIGHT) player_move(i,2); if (j&PAD_UP) player_move(i,1); if (j&PAD_DOWN) player_move(i,3); - if (j&PAD_B) player_mode[i]=MODE_SQUID; else player_mode[i]=MODE_NORMAL; - if (j&PAD_A) {player_mode[i]=MODE_NORMAL; player_make_projectile(i);} else player_charge[i] = 0; + + if (player_dir[i]==DIR_NONE) player_mode[i]=MODE_SQUID; + + if ((j&PAD_A)&&(player_mode[i]==MODE_NORMAL)) player_make_projectile(i); else player_charge[i] = 0; + } /* If this player has a projectile, move it as well. */ From 061361cd17441570c792ec612e2b804a0511c65d Mon Sep 17 00:00:00 2001 From: Simon Ullrich Richter Date: Tue, 26 May 2020 16:30:09 +0200 Subject: [PATCH 24/24] weapon balancing; player movement speeds depending on weapon and mode; collision detection fix; optimized Makefile. --- Makefile | 6 +++--- game.c | 43 ++++++++++++++++++++++++++----------------- weaponbalance.md | 2 +- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/Makefile b/Makefile index 023afa2..cabad37 100644 --- a/Makefile +++ b/Makefile @@ -5,8 +5,8 @@ RUNTIME_LIB = nes.lib CC65_HOME = /usr/share/cc65 EXECUTABLE = splatood.nes -ASM = ca65 -CC = cc65 +ASM = ca65 -t nes +CC = cc65 -t nes -Oisr LD = ld65 @@ -15,7 +15,7 @@ all: $(EXECUTABLE) ${CRT_OBJ} crt0.o: *.s *.chr %.s: %.c *.h levels/*.h - CC65_HOME=$(CC65_HOME) $(CC) -Oi $< --add-source + CC65_HOME=$(CC65_HOME) $(CC) $< --add-source %.o: %.s CC65_HOME=$(CC65_HOME) $(ASM) $< diff --git a/game.c b/game.c index 6f9717d..2bb0e40 100644 --- a/game.c +++ b/game.c @@ -4,13 +4,13 @@ * */ +#if !defined(__NES__) +# error This program can only be compiled for the NES at the moment! +#endif + /* NESlib */ #include "neslib.h" -/* Low Level NES Api */ -#define __NES__ -//#include "nes.h" - #include #include @@ -72,13 +72,18 @@ extern const unsigned char music_music_data[]; /* Tuneable gameplay parameters */ #define RESPAWN_TIME 64 -#define PROJECTILE_WAIT_TIME_ROLLER 16 -#define PROJECTILE_WAIT_TIME_CHARGER 64 +#define PROJECTILE_WAIT_TIME_ROLLER 32 +#define PROJECTILE_WAIT_TIME_CHARGER 8 #define PROJECTILE_DISTANCE_ROLLER 4 #define PROJECTILE_DISTANCE_CHARGER 16 #define PROJECTILE_SPEED_ROLLER 8<0){ j=dirs[1]; } - }}else if(py2-py<=3){ + }}else if((py2-py<=3)&&(py2-py>0)){ if(player_dir[id]==DIR_DOWN){ j=PAD_A; } else if(player_move_test(id,3)>0){ j=dirs[3]; } }}else if(py==py2){ @@ -1089,7 +1095,7 @@ unsigned char ai_move(unsigned char id){ if(px-px2<=3){ if(player_dir[id]==DIR_LEFT){ j=PAD_A; } else if((player_move_test(id,0)>0)){ j=dirs[0]; } - }}else if(px2-px<=3){ + }}else if((px2-px<=3)&&(px2-px>0)){ if(player_dir[id]==DIR_RIGHT){ j=PAD_A; } else if(player_move_test(id,2)>0){ j=dirs[2]; } }} @@ -1297,13 +1303,16 @@ void game_loop(void) { sfx_play(SFX_RESPAWN1,0); } --player_wait[i]; - continue; - } + //continue; + }else{ if (wait) continue; /* Avoid processing input during initial spawn. */ /* This player is moving, so animate their movement. */ if (player_cnt[i]) { + if(player_mode[i]==MODE_SQUID) player_speed[i]=3<> (TILE_SIZE_BIT+FP_BITS)) == (projectile_x[j] >> (TILE_SIZE_BIT+FP_BITS)) && - (player_y[i] >> (TILE_SIZE_BIT+FP_BITS)) == (projectile_y[j] >> (TILE_SIZE_BIT+FP_BITS))) { + (player_x[i]&0xff00) == (projectile_x[j]&0xff00) && + (player_y[i]&0xff00) == (projectile_y[j]&0xff00)) { /* Player j kills player i using a projectile */ if(player_mode[i]==MODE_NORMAL) player_die(i); } if (projectile_dir[i] != DIR_NONE && - (player_x[j] >> (TILE_SIZE_BIT+FP_BITS)) == (projectile_x[i] >> (TILE_SIZE_BIT+FP_BITS)) && - (player_y[j] >> (TILE_SIZE_BIT+FP_BITS)) == (projectile_y[i] >> (TILE_SIZE_BIT+FP_BITS))) { + (player_x[j]&0xff00) == (projectile_x[i]&0xff00) && + (player_y[j]&0xff00) == (projectile_y[i]&0xff00)) { /* Player i kills player j using a projectile */ if(player_mode[j]==MODE_NORMAL) player_die(j); } diff --git a/weaponbalance.md b/weaponbalance.md index 40638a1..7996fe1 100644 --- a/weaponbalance.md +++ b/weaponbalance.md @@ -6,5 +6,5 @@ - Bubbler - paints own field and walls run against, **A** shoots bubble stunning (bubbling) enemy. (medium to slow rate of fire) - Shooter - **A** paints 4 fields in front (2 straight + 2 diagonal, high fire rate) - Bomb (main weapon) - **A** colors all fields <=2 distance radius (slow rate of fire) -- Bomb (secondary weapon) - **A** shoots bomb, colors all fields <=2 distance radius when hiting or reaching max distance (slow rate of fire) +- Bomb (secondary weapon) - **SELECT** shoots bomb, colors all fields <=2 distance radius when hiting or reaching max distance (slow rate of fire)