Skip to content
Permalink
Browse files

Add Entity GameLoop_SpawnAndChangeList test

  • Loading branch information
undisbeliever committed Oct 20, 2018
1 parent 2722765 commit 3056d75fa87d7600b7d6d0f4d876cfe2411556e0
Showing with 167 additions and 0 deletions.
  1. +167 −0 unit_tests/src/tests/entity/gameloop.inc
@@ -441,6 +441,173 @@ MoveCameraTable: {
}
}



// Tests that an entity can spawn a new entity and change its entity
// list at the same time.
a16()
i16()
code()
Test.add("GameLoop (Spawn And Change List)")
function GameLoop_SpawnAndChangeList {
constant _loopsLeft = Test.dpTmp + 0

jsr Entity.Init

lda.w #0x1000
sta.w Entity.Spawn.xPos
sta.w Entity.Spawn.yPos

ldy.w #Entity.lists.N_LISTS - 1
SpawnLoop:
phy
// Y = listId to spawn entity in
lda.w #SpawnAndChangeListTestEntity.EntityId

jsr Entity.Spawn
bcc Fail
ply
dey
bpl SpawnLoop

jsr _FreeListLength
cmp.w #Entity.N_ENTITIES - Entity.lists.N_LISTS
bne Fail


lda.w #20
sta.b _loopsLeft

Loop:
jsr Entity.ProcessGameLoop

jsr _TestEntityListsValid
bcc Fail

dec.b _loopsLeft
bne Loop


jmp _TestEntityListsValid


Fail:
clc
rts


namespace SpawnAndChangeListTestEntity {
buildFunctionTable(BaseEntityFunctionTable, SpawnAndChangeListTestEntity)
Entity.useDefaultRenderer()

constant DELETE_DELAY = 2


// IN: A = entity parameter = entity list id
a16()
i16()
code()
function Init {
sep #$20
a8()
sta.b BaseEntity.listId

rep #$30
a16()
rts
}


a16()
i16()
code()
function Process {
// This entity spawns 3 entities:
// * DeleteAfterDelayEntity with listId = listId
// * DeleteAfterDelayEntity with lidtId = listId - 1
// * DeleteAfterDelayEntity with listId = listId + 1
//
// then changes its entity list to the previous list.

lda.b BaseEntity.listId
and.w #0xff
jsr SpawnDeleteEntity


lda.b BaseEntity.listId
and.w #0xff
dec
jsr SpawnDeleteEntity


lda.b BaseEntity.listId
and.w #0xff
inc
jsr SpawnDeleteEntity


lda.b BaseEntity.listId
and.w #0xff
dec
bpl +
lda.w #Entity.lists.N_LISTS - 1
+
jmp Entity.ChangeEntityListIdAndGotoNextEntity
}


// IN: A = listId to spawn DeleteAfterDelayEntity in.
a16()
i16()
code()
function SpawnDeleteEntity {
// ensure entity is spawned
ldx.w Camera.xPos
stx.w Entity.Spawn.xPos
ldx.w Camera.yPos
stx.w Entity.Spawn.yPos

// wrap list id if necessary
tay
bpl +
// A < 0
lda.w #Entity.lists.N_LISTS - 1
+
cmp.w #Entity.lists.N_LISTS
bcc +
lda.w #0
+

clc
adc.w #Entities.DeleteAfterDelayEntity.EntityId_0
ldy.w #DELETE_DELAY
jmp Entity.Spawn
}


a16()
i16()
code()
Destructor:
ProcessCollision:
function NULL {
rts
}


rodata(EN_RomData)
RomData:
dw FunctionTable
db 0 // initialListId
db 0 // defaultPalette
dw 0 // frameSetId

rodata(EN_EntityList)
constant EntityId = (pc() - Entity.Data.EntityList) / 2
dw RomData
}
}

}

// vim: ft=bass-65816 ts=4 sw=4 et:

0 comments on commit 3056d75

Please sign in to comment.
You can’t perform that action at this time.