From e795d0d9167d6d7de948e9db62eae7020462b591 Mon Sep 17 00:00:00 2001 From: Mischa Poslawsky Date: Wed, 21 Jun 2000 00:00:00 +0200 Subject: [PATCH] version 0.97 pre: reinternalise levels, minor updates # bullets do damage in all levels * more armor at armor-upgrade and extra armor at end of a level - internal levels again (no need for external, safer/smaller) # some registers not correctly pushed/popped * several optimizations (init.procs some bytes smaller) --- nemesis.z80 | 647 +++++++++++++++++++++++++++++++++++---------------- nemesis0.z80 | 250 -------------------- 2 files changed, 447 insertions(+), 450 deletions(-) delete mode 100644 nemesis0.z80 diff --git a/nemesis.z80 b/nemesis.z80 index feb535d..24c7366 100644 --- a/nemesis.z80 +++ b/nemesis.z80 @@ -40,18 +40,9 @@ _asapvar = $d6fc storepos = _asm_exec_ram+6000 ;120 OF 165 storepos2 = _asm_exec_ram+6200 ;141 OF 167 -exlevel = _asm_exec_ram+6400 ;784+OF 2.7kb - -XLlevelsdata = exlevel+8 ;size: upto 1016 bytes -XLweapondata = exlevel+1024 ;size: always 64 byte -XLenemytable = exlevel+1088 ;size: always 16 byt -XLenemyinfos = exlevel+1104 ;size: always 64 by -XLsprenemies = exlevel+1168 ;size: like 128 b (upto 1kb) ;---------------------- in-game vars ------------------------------------------ -temp1 = storepos ;+0+1 ;temp (2 bytes) bullet - just_fired = storepos+2 ; +2 ;counts how long a blast lasts curline = storepos+2 ; +2 ;used to display SFX menuitem = storepos+2 ; +2 ;used to store menu location @@ -95,22 +86,23 @@ your_prevpos = your_locpos+1 ;+88 ;save previous positions (32d) ;^-----------------------------------<1 ;-120=$78 -nrenemies = 10 ;max. nr of enemies +enemies = storepos2 ; +0 ;info about each enemy (6byt) enemysize = 7 -enemies = storepos2 ; +0 ;info about each enemy (6byt) +nrenemies = 10 ;max. nr of enemies -nrybuls = 10 -ybullets = enemies+(nrenemies*6) ;+80 ;60 bytes = 20(state,x,y) -nrebuls = 10 +ybullets = enemies+(nrenemies*enemysize) ;60 bytes = 20(state,x,y) +nrybuls = 32 ; +80\ ebullets = ybullets+(nrybuls*3) ;+110 ;30 bytes = 10(state,x,y) +nrebuls = 16 ybuls = ebullets+(nrebuls*3) ;+140 +maxbullets = 32 ;^-----------------------------------<2 ;-141=$8D ;level_info: ; [0000:damage 0:directfire 0:ground 0:ceiling 0:diagfire] ;enemies: -; [HP] [000000:HP left 00:(00=no enemy 01=exploding 10=normal 11=moving)] +; [HP64] [000000:HP left 00:(00=no enemy 01=exploding 10=normal 11=moving)] ; [ship type or explosion frame] [x] [y] [move] [fire] ;---------------------- introduction ------------------------------------------ @@ -137,22 +129,6 @@ Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 9bytes level_name: .db 8,"nemesis0" -StartFix: - im 1 - ld hl,$D400 - ld de,$D401 - ld bc,$0100 - ld (hl),$D3 - ldir - ld hl,int_handler - ld de,$D3D3 - ld bc,int_end-int_handler - ldir - ld a,$D4 - ld i,a - im 2 - ret - int_handler: ex af,af' in a,($03) @@ -165,52 +141,38 @@ int_end: init: cal BUSY_OFF ;turns the run-indicator off, obviously cal _clrScrn ;clean the screen - -Loadlevel: - ld hl,level_name-1 ;find own variable - rst 20h ;cal _ABS_MOV10TOOP1 - rst 10h ;cal _FINDSYM - ret c ;not found? who cares... - - cal _ex_ahl_bde - cal _SET_ABS_SRC_ADDR - xor a - ld hl,exlevel - cal _SET_ABS_DEST_ADDR - ld hl,4+4 - cal _SET_MM_NUM_BYTES - cal _mm_ldir - - ld hl,(exlevel+4+2) - cal _SET_MM_NUM_BYTES - cal _mm_ldir - - xor a - ld hl,XLweapondata - cal _SET_ABS_DEST_ADDR - ld hl,272 - cal _SET_MM_NUM_BYTES - cal _mm_ldir ;save done (cal \ ret) - -setup: xor a ;: reset: + xor a ;ld a,0 ld (iy+13),a ;don't affect TEXT_MEM and don't scroll screen + cal _flushallmenus ;remove TI menus ld (_asapvar+1),a ;Asm( thinks it's the first time it runs Nems. - cal StartFix -setcontrast: - ld a,(CONTRAST) ;load current contrast level - cp $1f ;if already at maximum... - jr z,skipdarken ;...then skip level increase - inc a ;otherwise increase contrast level -skipdarken: - out (2),a ;set it + +FixKeys: ;fixes some key problems like left+down bug + im 1 + ld a,$D4 + ld bc,$0100 + ld h,a + ld l,c ;ld hl,$D400 + ld d,a + ld e,b ;ld de,$D401 + dec a ;ld a,$D3 + ld (hl),a + ldir + ld hl,int_handler + ld d,a + ld e,a ;ld de,$D3D3 + ld bc,int_end-int_handler + ldir + inc a ;ld a,$D4 + ld i,a + im 2 ;---------------------- main menu --------------------------------------------- LogoPut: xor a ;white bitmask (a=0) - ld b,16 ;one line ld hl,logo_nemesis ;from... ld de,VIDEO_MEM+16 ;...to one line from top + ld b,e ;ld b,16: one line AboveLogo: ld (de),a ;clear/n byte inc de ;next @@ -219,14 +181,6 @@ AboveLogo: ld bc,16*19 ;logo size ldir ;display one line of logo -; ld hl,GRAPH_MEM ;cleared line -; ld bc,16 ;size=one line -; ldir ;also clear one line below the logo - -; ld a,-1 ;first line is -1+1=0 -; ld b,21 ;with first 21 lines: -; cal DoSFX ;do special effect &&&skip - ld hl,VIDEO_MEM+(16*$39)+4 ;$39 rows down, 4 cols right (4*8=$20) ld b,8 ;draw 8x one byte = 8*8 = 64 pixels wide ld a,%11111111 ;horizontal line mask @@ -280,7 +234,7 @@ menuloop: ld (_curRow),hl cal _putc - halt \ halt \ halt \ halt + halt \ halt cal GET_KEY ;wait for keypress cp K_UP @@ -300,11 +254,7 @@ menuloop: ld a,(menuitem) dec a jr nz,startnewgame - cal Continue_game - jr game_main_loop - -startnewgame: - cal New_game + cal samelevel jr game_main_loop menuchange: @@ -314,12 +264,15 @@ menuchange: jr menuloop do_invert: - ld (hl),$EE + ld (hl),$2F ;cpl ret undo_invert - ld (hl),$E6 + ld (hl),$B7 ;or a ret +startnewgame: + cal New_game + ;------------------------------------------------------------------------------ ;---------------------- game loop --------------------------------------------- ;------------------------------------------------------------------------------ @@ -384,11 +337,7 @@ game_stuff: cal CheckGround ;check for collision with the ground check_keys: - cal GET_KEY - cp K_GRAPH - cal z,Teacher - - ld a,%00111111 ;function keys (MORE,EXIT,2ND,F1,F2,F3,F4,F5) + ld a,%10111111 ;function keys (MORE,EXIT,2ND,F1,F2,F3,F4,F5) out (1),a ;ask for them nop \ nop ;delay 8 clocks in a,(1) ;get zem! @@ -406,19 +355,23 @@ check_firekey: psh hl ;push hl on stack (instead of cal Fire_bullet) jp z,Fire_bullet ;fire smtn (bulletstorplasermultiples+stuff..) pop hl ;no cal to Fire_bullet made, so pop stack - ld hl,just_fired ;no: - ld (hl),0 ;reset just_fired + xor a ;no: + ld (just_fired),a ;reset just_fired check_selkey: ld a,%01011111 ;look at first column of keys (ALPHA to STO) out (1),a ;gimme nop \ nop ;what's taking you so long in a,(1) ;at last... our precious keyzzz... - ;old: now see this: + + bit 6,a ;'bout the GRAPH key... + cal z,Teacher ;you didn't _press_ it, did you?!? + rla ;test bit7 so we know f ALPHA has been pressed cal nc,select ;yeppy, select the currently selected upgrade cal Enemies_hit ;check for collision with enemies + cal inc_weapdamage _gamestuff1: cal Handle_Ship ;move you @@ -432,7 +385,22 @@ _gamestuff1: cal Display_Screen ;display all halt ;delay - jp game_main_loop ;LOOP^^^^^^^^^^^^^ + jp game_main_loop ;LOOP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +inc_weapdamage: + ld a,0 +weapincs =$-1 + inc a + cp 31 + ret nc ;return if increased 16 times or more already + ld (weapincs),a + + ld b,1 +weapdamage =$-1 + add a,b + + ld (curweapdamage),a + ret ;--------------------------- ground ------------------------------------------- @@ -736,9 +704,7 @@ teacherans: ;--------------------------- exit --------------------------------------------- quit: - im 1 - ld a,(CONTRAST) ;load original contrast level - out (2),a ;and set it back + im 1 ;release keyfix procedure ld (iy+13),3 ;use textshadow (TEXT_MEM) and scrolling ld hl,GRAPH_MEM ;graph-screen location @@ -749,8 +715,7 @@ quit: jp _clrWindow ;as _clrLCD but also clears TEXT_MEM (like the ;_clrScrn) AND also executes _homeup and ret -; cal _clrScrn -; jp _homeup + ;--------------------------- display ------------------------------------------ Display_Screen: @@ -762,7 +727,7 @@ displayloop: displaytloop: ld a,(hl) ;copy byte from (hl) _invert: - xor $ff ; } ;invert byte (white<=>black) + cpl ;xor $ff: invert byte (white<=>black) ld (de),a ;to (de) inc hl \ inc de ;next byte dnz displaytloop ;16x hl >> de @@ -993,12 +958,14 @@ select: jr nz,select2 ;no, carry on select1: ld a,(your_armor) ;load current armor - cp 24 ;is it >=24 - ret nc ;then return (armor may not be 25 or more) - xor a - ld (your_pickup),a ;reset pickups (a=0) - ld hl,your_armor ;change armor - inc (hl) ;increase HPs by one + cp 25-6 ;may not become >=25 + jr c,select1_ ;ok then just add 6 + ld a,25-6 ;set to maximum (6 will be added below) +select1_: + add a,6 ;add 6 to armor + ld (your_armor),a ;change armor + xor a ;ld a,0 + ld (your_pickup),a ;reset pickups jp disp_icons ;display and return select2: dec a ;is it 2? @@ -1017,17 +984,7 @@ select3: cp 10 jp nc,disp_icons ;>=10 ld (hl),a - - add a,a ;weap*2 - add a,a ; *4 - add a,a ; *8 - ld c,a - ld b,0 - ld hl,XLweapondata-7 - add hl,bc - ld a,(hl) - ld (ybuls),a - + cal loadweapon jp disp_icons ;display n return select4: dec a ;is it 4? @@ -1052,11 +1009,6 @@ select6: ;------------------------- fire bullet ---------------------------------------- Fire_bullet: - ld hl,RanPos ;random - inc (hl) ;update random counter - -; ld a,(laserlasts) -; ld b,5 ld hl,just_fired ld a,(hl) ;just_fired cp 5 ;already pressed? @@ -1087,7 +1039,7 @@ fireany: dec a ;1=yes jr z,fire_laser - ld ix,XLweapondata-6 + ld ix,weapondata-6 add a,a ;weap*2 add a,a ; *4 add a,a ; *8 @@ -1108,7 +1060,7 @@ fireany: ld c,(ix) xor a cp c - jr nz,fire_ybullet + cal nz,fire_ybullet ret fire_torp: @@ -1201,22 +1153,22 @@ nolashit: dnz laserhits ;check all enemies ret -enemy_lashit: +enemy_lashit: ;&&&before nolashit cal enemy_hit jr nolashit fire_ybullet: ld hl,ybullets ld de,3 - ld a,(ybuls) - ld b,a + ld b,maxbullets find_ybullet: ld a,(hl) or a jr z,found_ybullet ;0 = no bullet here add hl,de dnz find_ybullet ;look next bullet - ret + pop hl ;don't try to fire any other bullets + ret ;so ret twice found_ybullet: ld (hl),c ;use the bullet and set correct bullet-type @@ -1229,6 +1181,9 @@ found_ybullet: add a,(ix+1) ;place bullet at the middle of your ship inc hl ;go to bullet-y ld (hl),a ;set y + + xor a + ld (weapincs),a ;reset damage ret ;------------------------ handle bullets -------------------------------------- @@ -1287,8 +1242,7 @@ remove_bullet: Handle_bullets: ld hl,ybullets - ld a,(ybuls) - ld b,a + ld b,maxbullets scan_bullets: psh bc psh hl @@ -1305,8 +1259,23 @@ scan_bullets: cal bullet_left ;move bullet left display_bullet: - ld ix,spr_bullet01 psh de + ld hl,XLbullettable ;pointer to first bullet + ld a,(curweapdamage) ;bullet damage=size + srl a + srl a ;per 4 + inc a ;must be at least 1 +nextbulletlook: + inc hl ;next bullet + dec a + jr nz,nextbulletlook + ld a,(hl) ;load pointer offset + ld d,0 + ld e,a ;convert to 16bit + ld ix,spr_bullet01 ;first sprite + add ix,de ;add offset (go to correct sprite) + pop de ;position saved + psh de ;but will be altered so save again cal putsprite ;display bullet pop de @@ -1328,6 +1297,7 @@ check_bullethits: ;INPUT: de=X,Y; (temp1)=bullet ld hl,enemies+1 hit_enemies: ;Hits with normal enemies + psh bc ;enemy counter psh hl ld a,(hl) @@ -1362,18 +1332,17 @@ hit_enemies: ;Hits with normal enemies jp m,nohit psh hl - ld hl,(temp1) - ld (hl),$00 ;remove bullet + xor a + ld (0),a ;remove bullet +temp1 =$-2 pop hl cal enemy_hit - nohit: pop hl - ld a,b ;psh bc ld bc,enemysize add hl,bc - ld b,a ;pop bc + pop bc dnz hit_enemies ;check next enemy ret @@ -1381,16 +1350,27 @@ enemy_hit: dec hl dec hl dec hl - ld a,(hl) ;occ - ld c,a ;psh occ - and %11111100 ;occ/4 = HP left ; jump - ld (hl),%01 ;set to explode + ld a,1 ;damage to inflict +curweapdamage =$-1 + rla + rla ;*4 + ld b,a + ld a,(hl) ;load occ + sub b ;decrease HP (if <0 then c is set) + ld (hl),a ;save (no flag-changes) + dec hl ;goto hp64; no change in c + ld a,(hl) ;load; no c-change + sbc a,0 ;if c then decrease a + ld (hl),a ;save back the new value + ret nc ;if a>=0 then return, otherwise explode + + inc hl ;goto occ again + ld (hl),%01 ;set to explode ld a,(pickuptimer) ;counts enemies destroyed dec a ;enough destroyed for a pickup? jr nz,pickupdone ;otherwise just explode - ld (hl),%00000110 ;change it into a pickup (with 2 HP) + ld (hl),%110 ;change it into a pickup (with 2 HP) ld a,18 ;reset enemies counter (18 hits = next) pickupdone: ld (pickuptimer),a ;save new enemiescounter value @@ -1400,12 +1380,6 @@ pickupdone: ld hl,1 ;increase score by one jp scoreInc ;+ret -hpleft: - ld a,c ;pop occ - sub %00000100 ;decrease HP by one - ld (hl),a ;save - ret - ;--------------------------- handle torpedo ---------------------------------- Handle_torp: @@ -1505,9 +1479,7 @@ chk_noenemy: add hl,bc cp (hl) ;(hl) = 0 ?? jr nz,chk_noenemy ;jump if enemy present (non-0) - - ld d,h - ld e,l + ex de,hl ;de=hl=usable enemy place_enemy: ld a,(level_enemy) ;enemy type to place (lvl) @@ -1520,8 +1492,9 @@ place_enemy: ld a,(hl) ;load hitpoints+occ of this enemy class ld (de),a ;save occ + inc hl ;next enemyInfo byte dec de ;goto hp - xor a + ld a,(hl) ;load hp64 ld (de),a ;save hp64 inc de ;next byte (or previous): occ again @@ -2135,7 +2108,7 @@ SFXdelay: halt dnz SFXdelay - pop bc + pop bc dnz SFXframe ret @@ -2414,7 +2387,8 @@ save_hi: cal _SET_ABS_SRC_ADDR ld hl,storehi_end-storehi_start cal _SET_MM_NUM_BYTES - jp _mm_ldir ;save done (cal \ ret) + cal _mm_ldir ;save done (cal \ ret) + jp _RAM_PAGE_1 save_lvl: ld hl,own_name-1 ;find own variable @@ -2432,8 +2406,8 @@ save_lvl: cal _SET_ABS_SRC_ADDR ld hl,storesave_end-storesave_start cal _SET_MM_NUM_BYTES - jp _mm_ldir ;save done (cal \ ret) - ret + cal _mm_ldir ;save done (cal \ ret) + jp _RAM_PAGE_1 game_over: pop hl ;=ret (game_over was called from a procedure) @@ -2556,9 +2530,6 @@ restore_line: cal _getkey ;wait for keypress jp quit ;restore some things and return to TI-OS/shell -Continue_game: - jr nonext_level - New_game: xor a ;ld a,0 ld (score),a ;reset score @@ -2577,23 +2548,26 @@ New_game: ld (your_lives),a ;3 lives (4 will be decreased @ You_die) ld (pickuptimer),a ;next pickup after 4 enemies destroyed - xor a - cp (hl) - cal z,dostory - You_die: ld a,12 - ld (your_armor),a ;5 HPs/shields - ld hl,your_lives - dec (hl) ;decrease lives - ld a,(hl) ;load lives left - inc a ;if lives=0ffh then a=0 - jp z,game_over ;if so, game's over - jr nonext_level + ld (your_armor),a ;12 HPs/shields + ld a,(your_lives) ;load lives left + dec a ;decrease lives + ld (your_lives),a ;if lives=0ffh GO + jp c,game_over + jr samelevel ;--------------------------- next level --------------------------------------- Next_level: + ld a,(your_armor) ;load current armor + cp 25-8 ;may not become >=25 + jr c,addok ;ok then just add 8 + ld a,25-8 ;set to maximum (8 will be added below) +addok: + add a,8 ;add 8 to armor + ld (your_armor),a ;change armor + ld hl,level ;level number ld a,(hl) inc a @@ -2612,26 +2586,15 @@ Next_level: add hl,bc ;update to point to next level ld (levelp),hl ;save - xor a - cp (hl) - cal z,dostory - -nonext_level: - ld a,(your_weapon) - add a,a ;weap*2 - add a,a ; *4 - add a,a ; *8 - ld c,a - ld b,0 - ld hl,XLweapondata-7 - add hl,bc - ld a,(hl) - ld (ybuls),a ;max number of bullets (varies per weap.class) - +samelevel: ld a,80 ld (nextevent),a ;time to first enemy appearance ld hl,(levelp) ;level pointer + xor a + cp (hl) + cal z,dostory + ld a,(hl) ;load new level-enemy type ld (level_enemy),a ;set level-enemy inc hl @@ -2743,11 +2706,27 @@ placestars: dnz placestars ;repeat for all stars ret +loadweapon: + ld a,(your_weapon) + add a,a ;weap*2 + add a,a ; *4 + add a,a ; *8 + ld c,a + ld b,0 + ld hl,weapondata-16 + add hl,bc + ld a,(hl) + ld (weapdamage),a ;damage of bullets + inc hl + ld a,(hl) +; ld (weapdaminc),a ;damage increase + ret + ;--------------------------- putsprite ---------------------------------------- ;--------------------------- de =(X,Y) ---------------------------------------- offsets_table: - .db 128,64,32,%10000,%01000,%00100,%00010,%00001 + .db $80,$40,$20,$10,8,4,2,1 putsprite: ld a,d ;a = X and %00000111 ;a = X mod 8 = bit nr. to mask @@ -2770,7 +2749,7 @@ putsprite: srl d ;d/4 srl d ;d/8 (8 bits in byte) ** c is set when overflow add a,d ;a = (Y*16+X/8) mod 256 - jp nc,_n1 ;jump if no carry = no overflow = a<=255 + jr nc,_n1 ;jump if no carry = no overflow = a<=255 inc b ;a>255 so increase bc by 256 _n1: ld c,a ;c = (Y*16+X/8) mod 256 add hl,bc ;bc = Y*16+X/8 @@ -2784,13 +2763,13 @@ _oloop: psh bc ;Save # of rows inc ix _smc1: ld a,1 ;Load pixel mask _iloop: sla c ;Test leftmost pixel - jp nc,_noplot ;See if a plot is needed + jr nc,_noplot ;See if a plot is needed ld e,a ;OR pixel with screen or (hl) ld (hl),a ld a,e _noplot:rrca - jp nc,_notedge ;Test if edge of byte reached + jr nc,_notedge ;Test if edge of byte reached inc hl ;Go to next byte _notedge: dnz _iloop @@ -2888,14 +2867,6 @@ spr_ship01: .db %01111000 ; ████ spr_ship01i: .db 7,7 ;ship alpha class - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %01010000 ; █ █ .db %10100000 ; █ █ .db %01010100 ; █ █ █ @@ -3106,6 +3077,19 @@ spr_dividerline: .db 8,7 .db 128,128,128,128,128,128,128 ;128 = %10000000 +;-------------------------- weapondata ---------------------------------------- + +;format:[unused] [ybuls(max.bullets)] [0000:direction 0000:speed] [offset] +weapondata: + .db 2,1,%00000010,2,%00000000,0,%00000000,0 ;single fire + .db 2,1,%00000011,2,%00000000,0,%00000000,0 ;fast single + .db 16,2,%00000010,0,%00000010,5,%00000000,0 ;double + .db 16,1,%00010010,2,%00110010,2,%01000010,2 ;triple + .db 16,1,%00010011,2,%00110011,2,%01000011,2 + .db 16,1,%00010011,2,%00110011,2,%01000100,2 + .db 16,1,%00010100,2,%00110100,2,%01000101,2 + .db 16,1,%00010100,2,%00110100,2,%01000101,2 + ;---------------------------- texts ------------------------------------------- txt_about: .db " v0.96.A30",127,"by Shiar",0 @@ -3130,12 +3114,12 @@ laserlasts .db 5 storehi_start: hiscore .dw $0000 -hiname .db "Shiar.96",0 +hiname .db "Shiar.97",0 storehi_end: storesave_start: level .db $01 ;level number -levelp .dw XLlevelsdata+4 ;pointer to level data +levelp .dw XLlevelsdata ;pointer to level data pickuptimer .db $04 ;counts when to place a pickup score .dw $0000 @@ -3145,12 +3129,267 @@ your_inv .db $00 ;invincibility left your_armor .db $0a ;HP left your_lives .db $03 ; -your_weapon .db $02 ;laser avail: 0=no, 1=yes +your_weapon .db $02 ;weapon: 0=no, 1=laser, 2+=bullet n+1 your_multiples .db $00 ;multiples present torp_occ .db $00 ;torp.state: 0=unavail 1=avail 2=presnt torp_pos .dw $0000 ;torpedo position (x,y) storesave_end: + +;XLlevelsdata:---------------------------------------------------------------- +XLlevelsdata: + + .db 0 + .db $21,$1d,"Cosmic year 6716" ,0,0,$1d,$06 + .db $1b,$1d,"storyline coming soon..." ,0,0,$1d,$06 + .db $09,$19,"the Nemesis saga continues",0,1 + .db $2e,$21,"with NEMESIS 86" ,0,1 + .db $52,$36,"by Shiar" ,0,0,$19,$23 + .db $ff + +;format:[enemy nr] [enemy frequency] [next lvl] +; [level_info: 0000:damage 0:directfire 0:ground 0:ceiling 0:diagfire] +; [level_move] [level_fire] [tunnel size] [groundtype] [16_ground] +; [16_ceiling] [stars1] [stars2] + + .db $15,$07,$08 ;fireFreq; moveType; enemyType +level01: ;efrequency must be odd if halfluring! + .db $01,$1b,$2f,%00010001,0,255,0,0 ;0f>>2f ; 7 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;16 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;16 + .db 1,1 ; 2 + .db $10,$07,$09 ; 3 + + .db 0 + .db $01,01,"And the storyline conti", + .db "nues.....",0,1 + .db $01,09,"You decide to fly close", + .db " to the",0,1 + .db $01,15,"surface of a nearby pl", + .db "anet =)",0,0,1,20 + .db $FF + + .db $10,$07,$09 ; 3 +level02: ;44 + .db $02,$13,$4b,%00100101,0,064,0,0 + .db 1,2,3,4,5,6,6,5,4,3,4,5,4,3,2,1 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + .db $0E,$07,$09 + + .db 0 + .db $01,01,"Blablabla...",0,1 + .db $01,34,"this storyline sux",0,0,1,39 + .DB $FF + + .db $0E,$07,$09 +level03: + .db $03,$2d,$3f,%00010110,0,255,-9,1 + .db 3,2,4,3,2,2,1,1,1,1 ,1,1,21,17,18,20 + .db 1,1,1,1,1,1,1,3,6,12,9,1,21,19,18,18 + .db -1,-1 + + .db $0D,$07,$08 +level04: + .db $04,$11,$41,%00100001,0,057,0,0 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + .db $0C,$07,$09 +level05: + .db $05,$11,$45,%00100101,%10,031,-7,1 + .db 14,12,11,9,10,7,7,5,4,3,4,4,2,3,1,2 + .db 1, 1, 1, 1,1, 1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + .db $0B,$07,$08 +level06: + .db $06,$19,$3a,%00100111,0,255,-4,1 + .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1 + .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + + .db $08,$07,$09 +level07: + .db $07,$09,$ff,%00100001,0,043,0,0 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + +;XLenemytable:---------------------------------------------------------------- +XLbullettable: + .db (spr_bullet01-spr_bullet01) + .db (spr_bullet01-spr_bullet01) + .db (spr_bullet01-spr_bullet01) + .db (spr_bullet01-spr_bullet01) + .db (spr_bullet01-spr_bullet01) + .db (spr_bullet01-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + .db (spr_bullet02-spr_bullet01) + +XLenemytable: + .db $00 ;00 + .db (spr_enemy01-spr_enemy00)/2 ;01 + .db (spr_enemy02-spr_enemy00)/2 ;02 + .db (spr_enemy03-spr_enemy00)/2 ;03 + .db (spr_enemy04-spr_enemy00)/2 ;04 + .db (spr_enemy05-spr_enemy00)/2 ;05 + .db (spr_enemy06-spr_enemy00)/2 ;06 + .db (spr_enemy07-spr_enemy00)/2 ;07 + .db (spr_boss01 -spr_enemy00)/2 ;08 + .db (spr_boss02 -spr_enemy00)/2 ;09 + .db (spr_enemy08-spr_enemy00)/2 ;0A + .db (spr_enemy00-spr_enemy00)/2 ;0B + .db (spr_enemy00-spr_enemy00)/2 ;0C + .db (spr_enemy00-spr_enemy00)/2 ;0D + .db (spr_enemy00-spr_enemy00)/2 ;0E + .db (spr_enemy00-spr_enemy00)/2 ;0F + +;XLenemyinfos:---------------------------------------------------------------- +XLenemyinfos: + +;format: [000000:HP 00:occ] [HP64] [appearance(ypos)] [unused] + + .db %00100110,0,1,1 ;#1 HP:1 app:random + .db %00101010,0,2,3 ;#2 HP:1 app:halflure + .db %00001111,0,3,2 ;#3 HP:1 app:lure + + .db %00000110,0,4,2 ;#4 HP:2 app:lure + .db %00000111,0,5,3 ;#5 HP:2 app:random moving + .db %00001011,0,6,2 ;#6 HP:3 app:lure moving + + .db %00011011,0,7,3 ;#7 HP:7 app:halflure moving + + .db %00110011,1,8,1 ;boss1 + .db %00111011,0,9,3 ;boss2 + + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + +;XLsprenemies:---------------------------------------------------------------- +XLsprenemies: + +spr_enemy00: + .db 8,8 ;pickup + .db %00011000 ; ██ + .db %00011000 ; ██ + .db %00011000 ; ██ + .db %11111111 ; ████████ + .db %11111111 ; ████████ + .db %00011000 ; ██ + .db %00011000 ; ██ + .db %00011000 ; ██ + +spr_enemy01: + .db 6,6 ;enemy type one + .db %00111100 ; ████ + .db %01110000 ; ███ + .db %11110000 ; ████ + .db %11110000 ; ████ + .db %01110000 ; ███ + .db %00111100 ; ████ +spr_enemy02: + .db 8,6 ;enemy type two + .db %00111111 ; █████ + .db %01111000 ; ████ + .db %11111100 ; ██████ + .db %11111100 ; ██████ + .db %01111000 ; ████ + .db %00111111 ; █████ +spr_enemy03: + .db 6,6 ;enemy type three + .db %01111100 ; █████ + .db %11110000 ; ████ + .db %11111000 ; █████ + .db %11111000 ; █████ + .db %11110000 ; ████ + .db %01111100 ; █████ +spr_enemy04: + .db 6,6 ;enemy type four + .db %00111000 ; ███ + .db %01111100 ; █████ + .db %11111000 ; █████ + .db %11111000 ; █████ + .db %01111100 ; █████ + .db %00111000 ; ███ +spr_enemy05: + .db 7,6 ;enemy type five + .db %00011110 ; ████ + .db %01111110 ; ██████ + .db %11111100 ; ██████ + .db %11111100 ; ██████ + .db %01111110 ; ██████ + .db %00011110 ; ████ +spr_enemy06: + .db 7,6 ;enemy type six + .db %00011100 ; ███ + .db %01111110 ; ██████ + .db %10111000 ; █ ███ + .db %10111000 ; █ ███ + .db %01111110 ; ██████ + .db %00011100 ; ███ +spr_enemy07: + .db 8,6 ;enemy type seven + .db %00011110 ; ████ + .db %01111111 ; ███████ + .db %10011100 ; █ ███ + .db %10011100 ; █ ███ + .db %01111111 ; ███████ + .db %00011110 ; ████ + +spr_boss01: + .db 16,10 ;boss type one + .db %00000001,%11111111 ; █████████ + .db %00001111,%11111110 ; ███████████ + .db %00111111,%11110000 ; ██████████ + .db %01011111,%10000000 ; █ ██████ + .db %10011111,%01000000 ; █ █████ █ + .db %10011111,%01000000 ; █ █████ █ + .db %01011111,%10000000 ; █ ██████ + .db %00111111,%11110000 ; ██████████ + .db %00001111,%11111110 ; ███████████ + .db %00000001,%11111111 ; █████████ +spr_boss02: + .db 16,10 ;boss type:one : + .db %11111110,%00000000 ; ███████ + .db %00001111,%10001111 ; █████ ████ + .db %00111111,%11100011 ; █████████ ██ + .db %01001111,%11111110 ; █ ███████████ + .db %10001101,%01111100 ; █ ██ █ █████ + .db %10001101,%01111100 ; █ ██ █ █████ + .db %01001111,%11111110 ; █ ███████████ + .db %00111111,%11100011 ; █████████ ██ + .db %00001111,%10001111 ; █████ ████ + .db %11111110,%00000000 ; ███████ + + +spr_enemy08: + .db 8,6 ;enemy type eight + .db %00011110 ; ████ + .db %01111111 ; ███████ + .db %10011100 ; █ ███ + .db %10011100 ; █ ███ + .db %01111111 ; ███████ + .db %00011110 ; ████ + +;----------------------------------------------------------------------------- ;----------------------------- logo ------------------------------------------- logo_nemesis: @@ -3220,6 +3459,14 @@ logo_nemesis: ; instead of two 4-byte spaces 40 bytes apart! (cleaner code; faster) ; * ground/ceiling/stars are continued when at boss (c00l level 3 boss) ; +; 0.97.B12 -- 12.XI.99 -- size +; +; # bullets do damage in all levels +; * more armor at armor-upgrade and extra armor at end of a level +; - internal levels again (no need, safer/smaller) +; # some registers not correctly pushed/popped +; * several optimizations (init.procs some bytes smaller) +; ; ; + added - removed * changed # bug fixed diff --git a/nemesis0.z80 b/nemesis0.z80 deleted file mode 100644 index 93816e9..0000000 --- a/nemesis0.z80 +++ /dev/null @@ -1,250 +0,0 @@ -;header:---------------------------------------------------------------------- - - .db $c9,0 ;ret \ nop = nemesis-header - .dw lend-lstart ;levelsdata-size = 134h = 308d < 505d - -;XLlevelsdata:---------------------------------------------------------------- - -;format:[enemy nr] [enemy frequency] [next lvl] [level_info] [level_move] -; [level_fire] [tunnel size] [groundtype] [16_ground] [16_ceiling] -; [stars1] [stars2] - -lstart: - .db 0 - .db $21,$1d,"Cosmic year 6716" ,0,0,$1d,$06 - .db $1b,$1d,"storyline coming soon..." ,0,0,$1d,$06 - .db $09,$19,"the Nemesis saga continues",0,1 - .db $2e,$21,"with NEMESIS 86" ,0,1 - .db $52,$36,"by Shiar" ,0,0,$19,$23 - .db $ff - - .db $15,$07,$08 ;fireFreq; moveType; enemyType -level01: ;efrequency must be odd if halfluring! - .db $01,$1b,$2f,%00010001,0,255,0,0 ;0f>>2f ; 7 - .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;16 - .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;16 - .db 1,1 ; 2 - .db $10,$07,$09 ; 3 - - .db 0 - .db $01,01,"And the storyline conti", - .db "nues.....",0,1 - .db $01,09,"You decide to fly close", - .db " to the",0,1 - .db $01,15,"surface of a nearby pl", - .db "anet =)",0,0,1,20 - .DB $FF - - .db $10,$07,$09 ; 3 -level02: ;44 - .db $02,$13,$4b,%00100101,0,064,0,0 - .db 1,2,3,4,5,6,6,5,4,3,4,5,4,3,2,1 - .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - .db 1,1 - .db $0E,$07,$09 - - .db 0 - .db $01,01,"Blablabla...",0,1 - .db $01,34,"this storyline sux",0,0,1,39 - .DB $FF - - .db $0E,$07,$09 -level03: - .db $03,$2d,$3f,%00000110,0,255,-9,1 - .db 3,2,4,3,2,2,1,1,1,1 ,1,1,21,17,18,20 - .db 1,1,1,1,1,1,1,3,6,12,9,1,21,19,18,18 - .db -1,-1 - - .db $0D,$07,$08 -level04: - .db $04,$11,$41,%00000001,0,057,0,0 - .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - .db 1,1 - .db $0C,$07,$09 -level05: - .db $05,$11,$45,%00000101,%10,031,-7,1 - .db 14,12,11,9,10,7,7,5,4,3,4,4,2,3,1,2 - .db 1, 1, 1, 1,1, 1,1,1,1,1,1,1,1,1,1,1 - .db 1,1 - .db $0B,$07,$08 -level06: - .db $06,$19,$3a,%00000111,0,255,-4,1 - .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1 - .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1 - .db 1,1 - - .db $08,$07,$09 -level07: - .db $07,$09,$ff,%00000001,0,043,0,0 - .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - .db 1,1 -lend: - -;XLweapondata:---------------------------------------------------------------- - -;format:[unused] [ybuls(max.bullets)] [0000:direction 0000:speed] [offset] - - .db 0,3,%00000010,2,%00000000,0,%00000000,0 ;single fire - .db 0,3,%00000011,2,%00000000,0,%00000000,0 ;fast single fire - .db 0,6,%00000010,0,%00000010,5,%00000000,0 ;double fire - .db 0,9,%00010010,2,%00110010,2,%01000010,2 ;triple fire - .db 0,10,%00010011,2,%00110011,2,%01000011,2 ;triple fire - .db 0,10,%00010011,2,%00110011,2,%01000100,2 ;triple fire - .db 0,10,%00010100,2,%00110100,2,%01000101,2 ;triple fire - .db 0,10,%00010100,2,%00110100,2,%01000101,2 ;triple fire - -;XLenemytable:---------------------------------------------------------------- - - .db $00 ;00 - .db (spr_enemy01-spr_enemy00)/2 ;01 - .db (spr_enemy02-spr_enemy00)/2 ;02 - .db (spr_enemy03-spr_enemy00)/2 ;03 - .db (spr_enemy04-spr_enemy00)/2 ;04 - .db (spr_enemy05-spr_enemy00)/2 ;05 - .db (spr_enemy06-spr_enemy00)/2 ;06 - .db (spr_enemy07-spr_enemy00)/2 ;07 - .db (spr_boss01 -spr_enemy00)/2 ;08 - .db (spr_boss02 -spr_enemy00)/2 ;09 - .db (spr_enemy08-spr_enemy00)/2 ;0A - .db (spr_enemy00-spr_enemy00)/2 ;0B - .db (spr_enemy00-spr_enemy00)/2 ;0C - .db (spr_enemy00-spr_enemy00)/2 ;0D - .db (spr_enemy00-spr_enemy00)/2 ;0E - .db (spr_enemy00-spr_enemy00)/2 ;0F - -;XLenemyinfos:---------------------------------------------------------------- - -;format: [000000:HP 00:occ] [type] [appearance(ypos)] [unused] - - .db %00000010,1,1,0 ;#1 HP:1 app:random - .db %00000010,2,3,0 ;#2 HP:1 app:halflure - .db %00001111,3,2,0 ;#3 HP:1 app:lure - - .db %00000110,4,2,0 ;#4 HP:2 app:lure - .db %00000111,5,3,0 ;#5 HP:2 app:random moving - .db %00001011,6,2,0 ;#6 HP:3 app:lure moving - - .db %00011011,7,3,0 ;#7 HP:7 app:halflure moving - - .db %00110011,8,1,0 ;boss1 - .db %00111011,9,3,0 ;boss2 - - .db %00000000,0,0,0 - .db %00000000,0,0,0 - .db %00000000,0,0,0 - .db %00000000,0,0,0 - .db %00000000,0,0,0 - .db %00000000,0,0,0 - .db %00000000,0,0,0 - -;XLsprenemies:---------------------------------------------------------------- - -spr_enemy00: - .db 8,8 ;pickup - .db %00011000 ; ██ - .db %00011000 ; ██ - .db %00011000 ; ██ - .db %11111111 ; ████████ - .db %11111111 ; ████████ - .db %00011000 ; ██ - .db %00011000 ; ██ - .db %00011000 ; ██ - -spr_enemy01: - .db 6,6 ;enemy type one - .db %00111100 ; ████ - .db %01110000 ; ███ - .db %11110000 ; ████ - .db %11110000 ; ████ - .db %01110000 ; ███ - .db %00111100 ; ████ -spr_enemy02: - .db 8,6 ;enemy type two - .db %00111111 ; █████ - .db %01111000 ; ████ - .db %11111100 ; ██████ - .db %11111100 ; ██████ - .db %01111000 ; ████ - .db %00111111 ; █████ -spr_enemy03: - .db 6,6 ;enemy type three - .db %01111100 ; █████ - .db %11110000 ; ████ - .db %11111000 ; █████ - .db %11111000 ; █████ - .db %11110000 ; ████ - .db %01111100 ; █████ -spr_enemy04: - .db 6,6 ;enemy type four - .db %00111000 ; ███ - .db %01111100 ; █████ - .db %11111000 ; █████ - .db %11111000 ; █████ - .db %01111100 ; █████ - .db %00111000 ; ███ -spr_enemy05: - .db 7,6 ;enemy type five - .db %00011110 ; ████ - .db %01111110 ; ██████ - .db %11111100 ; ██████ - .db %11111100 ; ██████ - .db %01111110 ; ██████ - .db %00011110 ; ████ -spr_enemy06: - .db 7,6 ;enemy type six - .db %00011100 ; ███ - .db %01111110 ; ██████ - .db %10111000 ; █ ███ - .db %10111000 ; █ ███ - .db %01111110 ; ██████ - .db %00011100 ; ███ -spr_enemy07: - .db 8,6 ;enemy type seven - .db %00011110 ; ████ - .db %01111111 ; ███████ - .db %10011100 ; █ ███ - .db %10011100 ; █ ███ - .db %01111111 ; ███████ - .db %00011110 ; ████ - -spr_boss01: - .db 16,10 ;boss type one - .db %00000001,%11111111 ; █████████ - .db %00001111,%11111110 ; ███████████ - .db %00111111,%11110000 ; ██████████ - .db %01011111,%10000000 ; █ ██████ - .db %10011111,%01000000 ; █ █████ █ - .db %10011111,%01000000 ; █ █████ █ - .db %01011111,%10000000 ; █ ██████ - .db %00111111,%11110000 ; ██████████ - .db %00001111,%11111110 ; ███████████ - .db %00000001,%11111111 ; █████████ -spr_boss02: - .db 16,10 ;boss type:one : - .db %11111110,%00000000 ; ███████ - .db %00001111,%10001111 ; █████ ████ - .db %00111111,%11100011 ; █████████ ██ - .db %01001111,%11111110 ; █ ███████████ - .db %10001101,%01111100 ; █ ██ █ █████ - .db %10001101,%01111100 ; █ ██ █ █████ - .db %01001111,%11111110 ; █ ███████████ - .db %00111111,%11100011 ; █████████ ██ - .db %00001111,%10001111 ; █████ ████ - .db %11111110,%00000000 ; ███████ - - -spr_enemy08: - .db 8,6 ;enemy type eight - .db %00011110 ; ████ - .db %01111111 ; ███████ - .db %10011100 ; █ ███ - .db %10011100 ; █ ███ - .db %01111111 ; ███████ - .db %00011110 ; ████ - -;----------------------------------------------------------------------------- - - .end -.end \ No newline at end of file -- 2.30.0