rogue-like/src/actors/actors.asm

185 lines
3.8 KiB
NASM

.include "../common.inc"
.include "../random.inc"
.include "../memory.inc"
.include "../math.inc"
.include "../world/world.inc"
.include "actors.inc"
.import Rooms
.import World
.import Compute_Maze_Addr
.export ActorsInLevel
.export ActorPositions
.export ActorStates
.export ActorTypes
.export ActorTransparent
.BSS
; struc actors_t {
.align 256
ActorsInLevel:
; aligned 256
ActorPositions: .res 256 ; coords_t positions[NB_ACTORS_MAX];
; aligned 256
ActorStates: .res 256 ; actor_state_t* states[NB_ACTORS_MAX];
; aligned 256
ActorTypes: .res 128 ; uint8_t types[NB_ACTORS_MAX];
; }
; NOTE: Modify SIZEOF_ACTORS_T if necessary!!
.RODATA
.align 256
ActorTransparent: ; NB_ACTORS_MAX
; player
.byte TRUE
; floors
.byte TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
; walls
.byte FALSE, FALSE, FALSE, FALSE
; stair down
.byte TRUE
; stair up
.byte FALSE
; monsters
.byte TRUE, TRUE, TRUE
; others
.byte TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
.byte TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
.byte TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
.byte TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
.byte TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
.byte TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
.byte TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
.CODE
; code
.export Place_Actors
.export Actors_Init
Actors_Init:
; positions
ldx #(2*NB_ACTORS_MAX - 1)
lda #UNDEF
loop_actors_pos_init:
sta ActorPositions, x
dex
bne loop_actors_pos_init
; types
ldx #eACTORTYPES::LAST_STATIC
loop_actors_types_init:
txa
sta ActorTypes, X
dex
bne loop_actors_types_init
ldx #eACTORTYPES::LAST_MONSTER+1
loop_actors_types_init_2:
txa
sta ActorTypes, X
inx
cpx #eACTORTYPES::NB_ACTORS
bne loop_actors_types_init_2
rts
.define PTR_ROOM ZERO_2_1 ; 2 bytes
.define PTR_TILE ZERO_2_1 ; 2 bytes
; the two following defines must be the same as in Build_Level
.define ROOM_X ZERO_3
.define ROOM_Y ZERO_2_4
.define ROOM_W ZERO_2_5
.define ROOM_H ZERO_2_6
; parameters:
.define NB_ROOMS ZERO_9_9
.define ACTOR_ID ZERO_9_1
.define ACTOR_TYPE ZERO_9_2
Place_Actors:
loop_find_location:
jsr Random8
ldx NB_ROOMS
jsr Modulus
; sizeof(room_t) == 4
asl
asl
clc
adc #<Rooms
sta PTR_ROOM
lda #0
adc #>Rooms
sta PTR_ROOM+1
ldy #0
lda (PTR_ROOM), Y
sta ROOM_H
iny
lda (PTR_ROOM), Y
sta ROOM_W
iny
lda (PTR_ROOM), Y
sta ROOM_X
iny
lda (PTR_ROOM), Y
sta ROOM_Y
; x = room->x + rand() % (room->width - 2) + 1;
sec
lda ROOM_W
sbc #2
sta ROOM_W
jsr Random8
ldx ROOM_W
jsr Modulus
clc
adc ROOM_X
adc #1
sta ROOM_X
; y = room->y + rand() % (room->height - 2) + 1;
sec
lda ROOM_H
sbc #2
sta ROOM_H
jsr Random8
ldx ROOM_H
jsr Modulus
clc
adc ROOM_Y
adc #1
sta ROOM_Y
tay
ldx ROOM_X
jsr Compute_Maze_Addr
stx PTR_TILE
sta PTR_TILE+1
ldy #0
lda (PTR_TILE), Y
cmp #eACTORTYPES::FLOOR_2
bne loop_find_location
; save position
ldx ACTOR_ID
lda ROOM_X
sta ActorPositions, X
lda ROOM_Y
sta ActorPositions+1, X
; save type
lda ACTOR_TYPE
sta ActorTypes, X
txa
sta (PTR_TILE), Y
rts