; ; def check_dots(): ; r = actor_row[zp.current_actor] ; c = actor_col[zp.current_actor] ; if has_dot(r, c): ; dot_eaten_row[zp.current_actor] = r ; dot_eaten_col[zp.current_actor] = c ; ; # Update maze here so we can check which player closed off a box ; addr = mazerow(r) ; addr[c] &= ~TILE_DOT ; ; player_score[zp.current_actor] += DOT_SCORE check_dots nop lda actor_row,x sta r lda actor_col,x sta c jsr has_dot beq ?1 ldy r jsr mazerow ldy c lda (mazeaddr),y and #CLEAR_TILE_DOT sta (mazeaddr),y ; update damage! Needs to update both screens jsr damage_char lda #DOT_SCORE jsr add_score ?1 rts save_index .byte 0 ; def paint_boxes(): paint_boxes nop ; x = 0 ; pad.addstr(28, 0, "Checking box:") ; while x < NUM_BOX_PAINTING_PARAMS * 16: ldy #0 sty param_index ?loop ldy param_index cpy #MAX_BOX_PAINTING bcc ?1 rts ; if box_painting[x] > 0: ?1 lda box_painting_c,y beq ?skip ; c1 = box_painting[x] ; r1 = box_painting[x + 1] ; r2 = box_painting[x + 2] ; i = box_painting[x + 3] inc debug_paint_box sta c1 lda box_painting_r1,y sta r1 lda box_painting_r2,y sta r2 lda box_painting_actor,y ; player number ; box_log.debug("Painting box line, player %d at %d,%d" % (i, r1, c1)) ; pad.addstr(30, 0, "painting box line at %d,%d" % (r1, c1)) ; addr = screenrow(r1) ldy r1 jsr mazerow ldy c1 lda #$24 ; $ sign sta (mazeaddr),y iny lda #$23 ; # sign sta (mazeaddr),y iny lda #$24 ; $ sign sta (mazeaddr),y iny lda #$23 ; # sign sta (mazeaddr),y iny lda #$24 ; $ sign sta (mazeaddr),y lda c1 sta c lda r1 sta r lda #5 sta size jsr damage_string ; for c in range(BOX_WIDTH): ; if i == 0: ; addr[c1 + c] = ord("X") ; else: ; addr[c1 + c] = ord(".") ; r1 += 1 inc r1 ; print "ROW", r1 ; if r1 >= r2: ; box_painting[x] = 0 lda r1 cmp r2 bcs ?finish ; box_painting[x + 1] = r1 ldy param_index sta box_painting_r1,y inc param_index bne ?loop ; always ?finish ldy param_index lda #0 sta box_painting_c,y ; x += NUM_BOX_PAINTING_PARAMS ?skip inc param_index bne ?loop ; always ; ; def init_static_background(): ; zp.current_actor = 0 ; while zp.current_actor < zp.num_players: ; row = player_score_row[zp.current_actor] ; pad.addstr(row - 1, MAZE_SCORE_COL, " ") ; pad.addstr(row, MAZE_SCORE_COL, "Player%d" % (zp.current_actor + 1)) ; zp.current_actor += 1 clear_panel nop ldx #MAZE_RIGHT_COL+1 lda #0 ?1 jsr text_put_col inx cpx #40 bcc ?1 rts init_panel nop jsr clear_panel ldy #1 jsr mazerow ldy #MAZE_PANEL_COL ldx #0 ?1 lda player1_text,x beq ?2 sta (mazeaddr),y iny inx bne ?1 ?2 ldy #6 jsr mazerow ldy #MAZE_PANEL_COL ldx #0 ?3 lda player2_text,x beq ?4 sta (mazeaddr),y iny inx bne ?3 ?4 ldx #0 jsr print_score jsr print_lives inx jsr print_score jsr print_lives rts player1_text .byte "PLAYER1", 0 player2_text .byte "PLAYER2", 0 ; def show_lives(row, num): ; i = 1 ; col = SCREEN_COLS ; while col > MAZE_SCORE_COL: ; col -= 1 ; if i < num: ; c = "*" ; else: ; c = " " ; pad.addch(row, col, ord(c)) ; i += 1 update_lives nop lda #MAZE_SCORE_COL sta c lda player_lives_row,x sta r lda #6 sta size jsr damage_string print_lives nop ldy player_lives_row,x jsr mazerow lda player_lives,x cmp #6 bcc ?ok lda #6 ?ok sta scratch_col lda #40 sec sbc scratch_col sta scratch_col ldy #MAZE_SCORE_COL ?loop cpy scratch_col bcc ?blank lda #'*' bne ?show ?blank lda #0 ?show sta (mazeaddr),y iny cpy #40 bcc ?loop rts print_hex pha stx param_x lsr lsr lsr lsr tax lda hexdigit,x sta (mazeaddr),y iny pla and #$0f tax lda hexdigit,x sta (mazeaddr),y iny ldx param_x rts print_low_nibble stx param_x and #$0f tax lda hexdigit,x sta (mazeaddr),y iny ldx param_x rts ; def update_score(): update_score nop lda #MAZE_SCORE_COL sta c lda player_score_row,x sta r lda #6 sta size jsr damage_string print_score nop ldy player_score_row,x jsr mazerow ldy #MAZE_SCORE_COL lda player_score_h,x jsr print_low_nibble lda player_score_m,x jsr print_hex lda player_score_l,x jsr print_hex rts ; row = player_score_row[zp.current_actor] ; if actor_status[zp.current_actor] == GAME_OVER: ; pad.addstr(row - 1, MAZE_SCORE_COL, "GAME ") ; pad.addstr(row, MAZE_SCORE_COL, " OVER") ; else: ; pad.addstr(row + 1, MAZE_SCORE_COL, " %06d" % player_score[zp.current_actor]) ; show_lives(row + 2, player_lives[zp.current_actor]) ; init_damage lda #0 sta damageindex1 sta damageindex2 sta damageptr sta damageptr1 sta damageptr2 lda #damagepage1 sta damageptr+1 sta damageptr1+1 lda #damagepage2 sta damageptr2+1 lda #0 sta tdamageindex1 lda #128 sta tdamageindex2 rts restorebg_driver ; copy damaged characters back to screen ;jsr copytexthgr ldy #0 sty param_count restorebg_loop1 ldy param_count cpy damageindex bcc restorebg_cont ; possible there's no damage, so have to check first ldy #0 sty damageindex ; clear damage index for this page rts restorebg_cont lda (damageptr),y ; groups of 4 x1 -> x2, y1 -> y2 sta param_x iny lda (damageptr),y sta param_col iny lda (damageptr),y sta param_y iny lda (damageptr),y sta param_row iny sty param_count ldy param_y restorebg_row lda textrows_h,y .if DEBUG_BOUNDS cpy #24 bcc ?1 jsr debug_bounds .endif ?1 lda textrows_h,y sta restorebg_row_smc+2 lda textrows_l,y sta restorebg_row_smc+1 ldx param_x restorebg_row_smc lda $ffff,x .if DEBUG_BOUNDS cpx #40 bcc ?1 jsr debug_bounds .endif ?1 jsr fastfont inx cpx param_col bcc restorebg_row_smc iny cpy param_row beq restorebg_row bcc restorebg_row bcs restorebg_loop1 ; text position in r, c. add single char to both pages! damage_char nop lda #1 sta size ; fallthrough ; text position in r, c; string length in size damage_string nop ldy tdamageindex1 lda c sta TEXTDAMAGE,y iny lda r sta TEXTDAMAGE,y iny lda size sta TEXTDAMAGE,y iny sty tdamageindex1 ldy tdamageindex2 lda c sta TEXTDAMAGE,y iny lda r sta TEXTDAMAGE,y iny lda size sta TEXTDAMAGE,y iny sty tdamageindex2 lda damagestart bmi ?2 lda tdamageindex1 sta tdamageindex rts ?2 lda tdamageindex2 sta tdamageindex rts restoretext nop ldy damagestart sty param_index ?loop1 ldy param_index cpy tdamageindex bcc ?cont ; possible there's no damage, so have to check first lda damagestart sta tdamageindex ; clear damage index for this page rts ?cont lda TEXTDAMAGE,y ; groups of 4 x1 -> x2, y1 -> y2 sta param_col iny lda TEXTDAMAGE,y sta param_row iny lda TEXTDAMAGE,y sta param_count iny sty param_index jsr fasttiles beq ?loop1 ; Draw sprites by looping through the list of sprites renderstart lda #0 sta damageindex sta param_index renderloop ldx param_index jsr evaluate_status lda actor_active,x beq renderskip ; skip if zero bmi renderend ; end if negative jsr get_sprite lda actor_l,x sta jsrsprite_smc+1 lda actor_h,x sta jsrsprite_smc+2 lda actor_x,x sta param_x lda actor_y,x sta param_y jmp jsrsprite_smc jsrsprite_smc jsr $ffff ; wish you could JSR ($nnnn) ldy damageindex lda scratch_col ; contains the byte index into the line sta (damageptr),y iny clc adc damage_w sta (damageptr),y iny ; need to convert hgr y values to char rows lda param_y lsr a lsr a lsr a sta (damageptr),y iny lda param_y clc adc damage_h lsr a lsr a lsr a sta (damageptr),y iny sty damageindex renderskip inc param_index bne renderloop renderend rts