;### Sprite Drawing ld hl,SpriteArray SpriteDrawingStart: ld a,(hl) or a jp z,SpriteDrawingExit ; ############################ Hier EnemySprite Check rein ld (hl),0 ;delete Spriten in Array inc hl ld d,(hl) inc hl ld e,(hl) ld (de),a ;save sprite in Map inc hl ld b,(hl) ;y inc hl ld c,(hl) ;x inc hl ;Next SPR push hl ;save pointer push af cp SpriteGrenzeEnemys jp c,SpriteCalcNonEnemy and %11111100 ;<<-- SpriteCalcNonEnemy: ld l,a ld h,0 sla l ; bis 127 gültig. ; add hl,hl ;*2 add hl,hl ;*4 add hl,hl ;*8 add hl,hl ;*16 ld d,h ld e,l add hl,hl ;*32 add hl,de ld de,Sprites - (SpriteGrenze+1*SpriteBytes) add hl,de ld (DSS_SprStart),hl ex de,hl ; hl speichern für animated sprite ld hl,SliceBockieren pop af cp SpriteGrenzeEnemys jp c,NonAnimatedSprite ;Typ, ;Blickwinkel ;ypos fein ;ypos grob ;xpos fein ;xpos grob ;KI var ;Health AnimatedSprite: ld (hl),$77 ; = ld (hl),a --> slice blockiert, keine anderen sprites mehr an diesem platz push de ex af,af' AnimatedSpriteStop: ld hl,EnemyBuffer + 3 - EnemyBufferBytes + 2;YposGrob ld de,EnemyBufferBytes -2 AnimatedSpriteLoop: add hl,de ld a,(hl) or a jp z,NewEnemyBufferEntry inc hl ;x fein inc hl ;x grob cp b jr nz,AnimatedSpriteLoop ld a,(hl) cp c jr nz,AnimatedSpriteLoop SD_BWCalc: push hl exx pop de pop hl ; hl = DSS_SprStart inc de ld a,(de) cp KI_AttackStart +1 ;+ 2 ; dass Waffe richtig abgefeuert wird. <<-- ich seh nicht mehr ein, wieso +2 jr c,AnimatedSpriteGraphWinkelKor ld de,8*48 add hl,de cp KI_AttackStart + AttackErstesBildDauer jr c,AnimatedSpriteGKEndLoad ld de,48 add hl,de cp KI_DieStart jr c,AnimatedSpriteGKEndLoad add hl,de cp KI_DieStart + DieErstesBildDauer jr c,AnimatedSpriteGKEndLoad add hl,de jr AnimatedSpriteGKEndLoad AnimatedSpriteGraphWinkelKor: dec de ;xgrob dec de ;xfein dec de ;ygrob dec de ;yfein dec de ;blickwinkel ld a,(de) ld b,a ld de,48 ld a,(Blickwinkel) sub b sub 32 cp 64 ;rechts jr c,AnimatedSpriteBWCalcEnd ld e,d ;0 cp 128 ; gerade aus jr c,AnimatedSpriteBWCalcEnd ld e,3*48 ;nach links cp 196 jr c,AnimatedSpriteBWCalcEnd ld e,2*48 AnimatedSpriteBWCalcEnd: add hl,de ld e,0 AnimationAddValue = $-1 add hl,de AnimatedSpriteGKEndLoad: ld (DSS_SprStart),hl exx dec hl ;x fein SD_RowDistCalc1: ld d,c ld e,(hl) dec hl ;y grob dec hl ;y fein ld a,(hl) ex af,af' xor a ld c,128 ld hl,(RowWorld) sbc hl,de jr nc,SD_RowPos1 ld hl,(RowWorld) ex de,hl sbc hl,de inc a ld c,%01000000 SD_RowPos1: push hl ;row dist SD_ColDistCalc1: ld hl,(ColWorld) ld d,b ex af,af' ld e,a ex af,af' sbc hl,de jr nc,SD_ColPos1 ld hl,(ColWorld) ex de,hl sbc hl,de add a,2 ex af,af' ld a,c xor %01000000 ld c,a ex af,af' SD_ColPos1: pop de ;de = RowDist push hl ;hl = ColDist sbc hl,de pop hl jp c,SD_HLok ;Optimize jp z,SD_HLok ex de,hl add a,4 jr SD_HLok ;Typ, ;Blickwinkel ;ypos fein ;ypos grob<-- ;xpos fein ;xpos grob ;KI var ;Health ;old thing at position NewEnemyBufferEntry: push hl ;ypos dec hl ;yfein ld (hl),$7F dec hl ex af,af' ld d,a and %00000011 rra rra rra ld (hl),a dec hl ld (hl),d pop hl ;ypos grob ld (hl),b inc hl ;x fein ld (hl),$7F inc hl push hl ld (hl),c inc hl ld (hl),StartKIvar ;128 ; KIVar = enemy steht still inc hl ld a,d ld d,3 cp SpriteGrenzeEnemys+12 ;hund jr c,EnemyHealthSet ld d,5 cp SpriteGrenzeEnemys+24 ;soldat jr c,EnemyHealthSet ld d,10 cp SpriteGrenzeEnemys+36 ;SS jr c,EnemyHealthSet ld d,17 cp SpriteGrenzeEnemys+48 ;priester jr c,EnemyHealthSet ld d,199 EnemyHealthSet: ld (hl),d ;3 ; Health routine Hier rein setzen!!!!!!!!!!!!!!!! inc hl ld (hl),0 ;old thing at position pop hl jp SD_BWCalc NonAnimatedSprite: ld (hl),0 ;= nop --> slice wird nicht blockiert, --> andere sprites werden auch gezeichnet. SD_RowDistCalc: ld hl,(RowWorld) ld d,c ld e,$7F xor a ld c,128 sbc hl,de jr nc,SD_RowPos ld hl,(RowWorld) ex de,hl sbc hl,de inc a ld c,%01000000 SD_RowPos: push hl ;row dist SD_ColDistCalc: ld hl,(ColWorld) ld d,b ld e,$7F sbc hl,de jr nc,SD_ColPos ld hl,(ColWorld) ex de,hl sbc hl,de add a,2 ex af,af' ld a,c xor %01000000 ld c,a ex af,af' SD_ColPos: pop de ; row dist push hl ; colDist sbc hl,de pop hl jr c,SD_HLok ;Optimize ; funktioniert das überhaupt? jr z,SD_HLok ex de,hl add a,4 SD_HLok: ld (SpriteXPosVars),a ld a,c ld (SpriteXPosVars+1),a ; sla l rl h sla l rl h sla l rl h ;*8 sla l rl h ;*16 sla l rl h ;*32 push de ;RowDist call div_hl_by_de ;returns a = winkel ld (SDWinkel),a ;col.. bis jetzt or a jr z,SD_RowDistGleichHypo pop hl ;RowDist push af call CosInv pop af jr SD_RowDistNichtGleichHypo SD_RowDistGleichHypo: pop hl ;RowDist SD_RowDistNichtGleichHypo: ; push hl ; ld e,a ; ld d,0 ; ld hl,FishbowlTable + 32 ; add hl,de ; ld a,(hl) ; pop hl ld a,255 ex de,hl call DivSlice cp 2 jp c,SpriteHadanError; ret c cp MAX_SPRITE_HEIGHT-SpritesYplus+1;64 ;MAX_SCALE+1 ; jp nc,SpriteHadanError ; ret nc jp c,SpriteNotTooBig ld a,MAX_SPRITE_HEIGHT ;64 SpriteNotTooBig: ld c,a ; c = höhe cp SCREEN_HEIGHT - SpritesYplus jr c,HoeheVonSpriteOK ld a,SCREEN_HEIGHT - SpritesYplus HoeheVonSpriteOK: ld (DSSliceHoehe),a dec a ld (DrawSpriteSliceHoehe),a ld a,%10000000 ld (DSS_SpriteMask),a ld a,2 ld (SpriteXaddCounter),a xor a ld (SpriteXAdd),a ld hl,MappingPtrs-2 push hl ld b,a ; ld b,0 add hl,bc ld a,(hl) inc hl ld h,(hl) ld l,a ld (DSS_MappingPtr),hl ;für höhe ld h,b ld l,b ld a,SCREEN_HEIGHT - SpritesYplus sub c jr c,SpriteGrosserBildschirm ; srl a ;/2 rra and %01111111 ;da c meist nicht gerade ld l,a add a,a ; *2 add a,l ; *3 ld l,a add hl,hl ; *6 add hl,hl ; *12 SpriteGrosserBildschirm: ld de,12 * SpritesYplus + plotsscreen + SCREENPOS add hl,de ex de,hl ; c=höhe auf c=breite ändern ld hl,SpriteBreiteTbl-1 sra c add hl,bc ld c,(hl) pop hl ; ld hl,MappingPtrs-2 add hl,bc ld a,(hl) inc hl ld h,(hl) ld l,a ld (DSS_MappingPtr2),hl SpriteWidthMappingOK: ex de,hl ld a,c ;breite sra a ld b,a ; ;b = breite /2 exx ld de,0 SpriteXPosVars = $-2 ;SpriteXPosVars = a (0-7) = e SpriteXPosVars+1 = c (sektor) = d ld a,0 SDWinkel = $-1 ex af,af' ld a,e or a ;0 jr z,SDCalcWay2 sub 3 jr c,SDCalcWay1 jr z,SDCalcWay2 dec a ;4 jr z,SDCalcWay1 sub 3 jr c,SDCalcWay2 ; jr z,EPACalcWay2 ;OK ;7 SDCalcWay1: ex af,af' jr SDCalcWayBoth SDCalcWay2: ex af,af' cpl add a,64 SDCalcWayBoth: add a,d ld hl,Blickwinkel sub (hl) neg add a,32 exx ; hl ptr to screen y; b = breite /2 sub b ld b,a ;col SD_ColCalcEnd: cp 128 jr c,SpriteLinksOK neg ld b,a ld a,c sub b jp c,SpriteHadanError jp z,SpriteHadanError ld c,a ;neue breite SpriteLinksRichten: call Sprite_EditSpriteMask djnz SpriteLinksRichten ld a,b ;0 jr Sprite_SaveScreenPos SpriteLinksOK: ld b,a add a,c ;breite sub 64 jr c,SpriteRechtsOK jr z,SpriteRechtsOK sub c neg jp z,SpriteHadanError ld c,a ; neue breite zum zeichnen ld a,64 sub c jp c,SpriteHadanError ; Nötig? JA jp z,SpriteHadanError ; Nötig? JA ld b,a ;col beginn zum zeichnen SpriteRechtsRichten: SpriteRechtsOK: ld a,b ;col rra ;/2 rra ;/4 rra ;/8 and %00011111 Sprite_SaveScreenPos: ld e,a ld d,0 add hl,de ld (SpriteScreenPos),hl ld a,b and %00000111 ;rest aus /8 ld hl,MaskTable ld e,a ;d=0 von oben) add hl,de ld a,(hl) ;erste Bildschirm Mask ld (SpriteScreenMask),a ld e,b ;Col ld hl,ScreenHeightArray add hl,de ; ex de,hl ;de = ptr für Screen HeightArray ld b,c ;breite zum zeichnen, normalerweise höhe, wird in links/rechts editiert ; de = frei hl=frei b=slice counter a=frei push iy DrawSpriteLoop: ld a,0 DSSliceHoehe = $-1 cp (hl) jr c,SkipSpriteSlice nop ; ld (hl),a ; entweder ld (hl),a oder nop SliceBockieren = $-1 DrawSpriteSlice: exx ld b,0 ;für djnz DrawSpriteSliceHoehe = $-1 ld d,0 ld iy,0 DSS_MappingPtr = $-2 ld ix,0 DSS_SprStart = $-2 ld hl,0 SpriteScreenPos = $-2 SpriteRenderLoop: ld e,(iy) add ix,de ld a,0 DSS_SpriteMask = $-1 and (ix) #ifdef DeckeUndBoden jp z,SkipSprPixel ld a,0 SpriteScreenMask = $-1 xor (hl) ld (hl),a SkipSprPixel: #else #ifdef SpriteClearPixel ld a,0 SpriteScreenMask = $-1 jr z,ClearSprPixel or (hl) jr SkipClearSprPixel ClearSprPixel: cpl and (hl) SkipClearSprPixel: ld (hl),a #else jp z,SkipSprPixel ld a,0 SpriteScreenMask = $-1 or (hl) ld (hl),a SkipSprPixel: #endif #endif ld e,12 add hl,de inc iy djnz SpriteRenderLoop DrawSpriteEnd: exx SkipSpriteSlice: inc hl call Sprite_CalcMasks djnz DrawSpriteLoop pop iy SpriteHadanError: pop hl jp SpriteDrawingStart Sprite_CalcMasks: ld de,SpriteScreenMask ld a,(de) rrca ld (de),a jr nc,SkipIncScrnColSpr ld de,(SpriteScreenPos) inc de ld (SpriteScreenPos),de #ifdef Exclude ld hl,SpriteScreenMask ld a,(hl) rrca ld (hl),a jr nc,SkipIncScrnColSpr ld hl,(SpriteScreenPos) inc hl ld (SpriteScreenPos),hl #endif SkipIncScrnColSpr: Sprite_EditSpriteMask: exx ld ix,0 DSS_MappingPtr2 = $-2 ld a,0 SpriteXaddCounter = $-1 add a,(ix+0) SpriteXAdd = $-1 SpriteMaskLoop: cp 3 jr c,SkipSpriteMaskLoop sub 3 ex af,af' ld hl,DSS_SpriteMask ld a,(hl) rrca jr c,IncDSS_SprStart SpriteMaskLoopWeiter: ld (hl),a ex af,af' jr SpriteMaskLoop SkipSpriteMaskLoop: ld (SpriteXaddCounter),a ld hl,SpriteXAdd inc (hl) exx ret IncDSS_SprStart: ld de,(DSS_SprStart) inc de ld (DSS_SprStart),de jr SpriteMaskLoopWeiter SpriteDrawingExit: