Files
2025-09-29 00:52:08 +02:00

3173 lines
138 KiB
XML
Executable File

USING "camhedz_arcade_using.sch"
//-------------------------------------
// BG FUNCTIONS
//-------------------------------------
PROC CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(VECTOR_2D vPos, VECTOR_2D vSize, STRING sSprite, INT iLane, BOOL bGroundY = FALSE, BOOL bSkyY = FALSE)
IF (sCMHDZData.iNumberOfBackgroundElements >= COUNT_OF(sCMHDZData.sBackgroundData))
EXIT
ENDIF
CMHDZ_BACKGROUND_DATA_SET_RENDERING(sCMHDZData.iNumberOfBackgroundElements, TRUE)
sCMHDZData.sBackgroundData[sCMHDZData.iNumberOfBackgroundElements].vSpritePos = vPos
sCMHDZData.sBackgroundData[sCMHDZData.iNumberOfBackgroundElements].vSpriteSize = vSize
sCMHDZData.sBackgroundData[sCMHDZData.iNumberOfBackgroundElements].sSprite = sSprite
sCMHDZData.sBackgroundData[sCMHDZData.iNumberOfBackgroundElements].iLane = iLane
IF (bGroundY)
sCMHDZData.sBackgroundData[sCMHDZData.iNumberOfBackgroundElements].vSpritePos.y = vPos.y - (sCMHDZData.sBackgroundData[sCMHDZData.iNumberOfBackgroundElements].vSpriteSize.y / 2.0)
ENDIF
IF (bSkyY)
sCMHDZData.sBackgroundData[sCMHDZData.iNumberOfBackgroundElements].vSpritePos.y = vPos.y + (sCMHDZData.sBackgroundData[sCMHDZData.iNumberOfBackgroundElements].vSpriteSize.y / 2.0)
ENDIF
sCMHDZData.iNumberOfBackgroundElements++
ENDPROC
PROC CMHDZ_SET_BACKGROUND_ELEMENT_GROUND_POSITION_Y(INT iElement, FLOAT y)
sCMHDZData.sBackgroundData[iElement].vSpritePos.y = y - (sCMHDZData.sBackgroundData[iElement].vSpriteSize.y / 2.0)
ENDPROC
PROC CMHDZ_SET_RANDOM_BG_CITY_BACKGROUND_BUILDING_ELEMENT(INT iElement)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 5)
CASE 0
sCMHDZData.sBackgroundData[iElement].vSpriteSize = INIT_VECTOR_2D(cfCMHDZ_BG_CITY_TALL_BUILDING_SPRITE_WIDTH, cfCMHDZ_BG_CITY_TALL_BUILDING_SPRITE_HEIGHT)
sCMHDZData.sBackgroundData[iElement].sSprite = "LEVEL_01_CITY_BUILDING_01"
BREAK
CASE 1
sCMHDZData.sBackgroundData[iElement].vSpriteSize = INIT_VECTOR_2D(cfCMHDZ_BG_CITY_TALL_BUILDING_SPRITE_WIDTH, cfCMHDZ_BG_CITY_TALL_BUILDING_SPRITE_HEIGHT)
sCMHDZData.sBackgroundData[iElement].sSprite = "LEVEL_01_CITY_BUILDING_02"
BREAK
CASE 2
sCMHDZData.sBackgroundData[iElement].vSpriteSize = INIT_VECTOR_2D(cfCMHDZ_BG_CITY_SMALL_BUILDING_SPRITE_WIDTH, cfCMHDZ_BG_CITY_SMALL_BUILDING_SPRITE_HEIGHT)
sCMHDZData.sBackgroundData[iElement].sSprite = "LEVEL_01_CITY_BUILDING_03"
BREAK
CASE 3
sCMHDZData.sBackgroundData[iElement].vSpriteSize = INIT_VECTOR_2D(cfCMHDZ_BG_CITY_SMALL_BUILDING_SPRITE_WIDTH, cfCMHDZ_BG_CITY_SMALL_BUILDING_SPRITE_HEIGHT)
sCMHDZData.sBackgroundData[iElement].sSprite = "LEVEL_01_CITY_BUILDING_04"
BREAK
CASE 4
sCMHDZData.sBackgroundData[iElement].vSpriteSize = INIT_VECTOR_2D(cfCMHDZ_BG_CITY_SMALL_BUILDING_SPRITE_WIDTH, cfCMHDZ_BG_CITY_SMALL_BUILDING_SPRITE_HEIGHT)
sCMHDZData.sBackgroundData[iElement].sSprite = "LEVEL_01_CITY_BUILDING_05"
BREAK
DEFAULT
sCMHDZData.sBackgroundData[iElement].vSpriteSize = INIT_VECTOR_2D(cfCMHDZ_BG_CITY_TALL_BUILDING_SPRITE_WIDTH, cfCMHDZ_BG_CITY_TALL_BUILDING_SPRITE_HEIGHT)
sCMHDZData.sBackgroundData[iElement].sSprite = "LEVEL_01_CITY_BUILDING_01"
BREAK
ENDSWITCH
ENDPROC
PROC CMHDZ_ADD_RANDOM_BG_CITY_BACKGROUND_BUILDING_ELEMENT_TO_LIST(VECTOR_2D vPos, INT iLane)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 5)
CASE 0
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(vPos, INIT_VECTOR_2D(cfCMHDZ_BG_CITY_TALL_BUILDING_SPRITE_WIDTH, cfCMHDZ_BG_CITY_TALL_BUILDING_SPRITE_HEIGHT), "LEVEL_01_CITY_BUILDING_01", iLane)
BREAK
CASE 1
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(vPos, INIT_VECTOR_2D(cfCMHDZ_BG_CITY_TALL_BUILDING_SPRITE_WIDTH, cfCMHDZ_BG_CITY_TALL_BUILDING_SPRITE_HEIGHT), "LEVEL_01_CITY_BUILDING_02", iLane)
BREAK
CASE 2
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(vPos, INIT_VECTOR_2D(cfCMHDZ_BG_CITY_SMALL_BUILDING_SPRITE_WIDTH, cfCMHDZ_BG_CITY_SMALL_BUILDING_SPRITE_HEIGHT), "LEVEL_01_CITY_BUILDING_03", iLane)
BREAK
CASE 3
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(vPos, INIT_VECTOR_2D(cfCMHDZ_BG_CITY_SMALL_BUILDING_SPRITE_WIDTH, cfCMHDZ_BG_CITY_SMALL_BUILDING_SPRITE_HEIGHT), "LEVEL_01_CITY_BUILDING_04", iLane)
BREAK
CASE 4
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(vPos, INIT_VECTOR_2D(cfCMHDZ_BG_CITY_SMALL_BUILDING_SPRITE_WIDTH, cfCMHDZ_BG_CITY_SMALL_BUILDING_SPRITE_HEIGHT), "LEVEL_01_CITY_BUILDING_05", iLane)
BREAK
DEFAULT
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(vPos, INIT_VECTOR_2D(cfCMHDZ_BG_CITY_TALL_BUILDING_SPRITE_WIDTH, cfCMHDZ_BG_CITY_TALL_BUILDING_SPRITE_HEIGHT), "LEVEL_01_CITY_BUILDING_01", iLane)
BREAK
ENDSWITCH
ENDPROC
PROC CMHDZ_ADD_RANDOM_BG_SCRAPYARD_BACKGROUND_VAN_ELEMENT_TO_LIST(VECTOR_2D vPos, INT iLane)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 4)
CASE 0
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(vPos, INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_VAN_SPRITE_WIDTH, cfCMHDZ_BG_SCRAPYARD_VAN_SPRITE_HEIGHT), "LEVEL_02_SCRAPYARD_BACKGROUND_VAN_01", iLane)
BREAK
CASE 1
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(vPos, INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_VAN_SPRITE_WIDTH, cfCMHDZ_BG_SCRAPYARD_VAN_SPRITE_HEIGHT), "LEVEL_02_SCRAPYARD_BACKGROUND_VAN_02", iLane)
BREAK
CASE 2
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(vPos, INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_VAN_SPRITE_WIDTH, cfCMHDZ_BG_SCRAPYARD_VAN_SPRITE_HEIGHT), "LEVEL_02_SCRAPYARD_BACKGROUND_VAN_03", iLane)
BREAK
CASE 3
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(vPos, INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_VAN_SPRITE_WIDTH, cfCMHDZ_BG_SCRAPYARD_VAN_SPRITE_HEIGHT), "LEVEL_02_SCRAPYARD_BACKGROUND_VAN_04", iLane)
BREAK
ENDSWITCH
ENDPROC
PROC CMHDZ_INIT_BACKGROUND(CMHDZ_LEVELS level)
sCMHDZData.iFade = 255
sCMHDZData.bFadingOut = FALSE
FLOAT fXPos
FLOAT fCloudSpace
// FLOAT fSlaughterhouseFence
FLOAT fSlaughterHouseLights
VECTOR_2D vPosition
INT i = 0, j = 0
WHILE j < ciCMHDZ_MAX_BACKGROUND_TILES
sCMHDZData.sBackgroundTilesData[j].vSpritePos.X = TO_FLOAT(i)
i += 276
j ++
ENDWHILE
sCMHDZData.iNumberOfBackgroundElements = 0
SWITCH level
CASE CMHDZ_LEVEL_CITY
// city far bg
REPEAT 7 i
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(50 + (i * cfCMHDZ_BG_CITY_SKYLINE_SPRITE_WIDTH), 350), INIT_VECTOR_2D(cfCMHDZ_BG_CITY_SKYLINE_SPRITE_WIDTH, cfCMHDZ_BG_CITY_SKYLINE_SPRITE_HEIGHT), "LEVEL_01_CITY_SKYLINE_TILE", 0)
ENDREPEAT
REPEAT 6 i
CMHDZ_ADD_RANDOM_BG_CITY_BACKGROUND_BUILDING_ELEMENT_TO_LIST(INIT_VECTOR_2D((i * cfCMHDZ_BG_CITY_BUILDING_SPACING), 300), 0)
ENDREPEAT
REPEAT 7 i
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(50 + (i * cfCMHDZ_BG_CITY_FENCE_SPRITE_WIDTH), 420), INIT_VECTOR_2D(cfCMHDZ_BG_CITY_FENCE_SPRITE_WIDTH, cfCMHDZ_BG_CITY_FENCE_SPRITE_HEIGHT), "LEVEL_01_CITY_FENCE_TILE", 0)
ENDREPEAT
BREAK
CASE CMHDZ_LEVEL_SCRAPYARD
fXPos = cfCMHDZ_BG_SCRAPYARD_CLOUD_X
fCloudSpace = cfCMHDZ_BG_SCRAPYARD_CLOUD_GAP
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_BG_SCRAPYARD_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_CLOUD1_WIDTH, cfCMHDZ_BG_SCRAPYARD_CLOUD1_HEIGHT), "LEVEL_02_SCRAPYARD_CLOUD_01", 0)
fXPos += (cfCMHDZ_BG_SCRAPYARD_CLOUD1_WIDTH/2.0) + (cfCMHDZ_BG_SCRAPYARD_CLOUD2_WIDTH/2.0) + fCloudSpace
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_BG_SCRAPYARD_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_CLOUD2_WIDTH, cfCMHDZ_BG_SCRAPYARD_CLOUD2_HEIGHT), "LEVEL_02_SCRAPYARD_CLOUD_02", 0)
fXPos += (cfCMHDZ_BG_SCRAPYARD_CLOUD2_WIDTH / 2.0) + (cfCMHDZ_BG_SCRAPYARD_CLOUD3_WIDTH / 2.0) + fCloudSpace
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_BG_SCRAPYARD_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_CLOUD3_WIDTH, cfCMHDZ_BG_SCRAPYARD_CLOUD3_HEIGHT), "LEVEL_02_SCRAPYARD_CLOUD_03", 0)
fXPos += (cfCMHDZ_BG_SCRAPYARD_CLOUD3_WIDTH / 2.0) + (cfCMHDZ_BG_SCRAPYARD_CLOUD4_WIDTH / 2.0) + fCloudSpace
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_BG_SCRAPYARD_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_CLOUD4_WIDTH, cfCMHDZ_BG_SCRAPYARD_CLOUD4_HEIGHT), "LEVEL_02_SCRAPYARD_CLOUD_04", 0)
fXPos += (cfCMHDZ_BG_SCRAPYARD_CLOUD4_WIDTH / 2.0) + (cfCMHDZ_BG_SCRAPYARD_CLOUD5_WIDTH / 2.0) + fCloudSpace
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_BG_SCRAPYARD_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_CLOUD5_WIDTH, cfCMHDZ_BG_SCRAPYARD_CLOUD5_HEIGHT), "LEVEL_02_SCRAPYARD_CLOUD_05", 0)
fXPos += (cfCMHDZ_BG_SCRAPYARD_CLOUD5_WIDTH / 2.0) + (cfCMHDZ_BG_SCRAPYARD_CLOUD6_WIDTH / 2.0) + fCloudSpace
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_BG_SCRAPYARD_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_CLOUD6_WIDTH, cfCMHDZ_BG_SCRAPYARD_CLOUD6_HEIGHT), "LEVEL_02_SCRAPYARD_CLOUD_06", 0)
fXPos += (cfCMHDZ_LEVEL2_CLOUD6_WIDTH / 2.0) + (cfCMHDZ_BG_SCRAPYARD_CLOUD7_WIDTH / 2.0) + fCloudSpace
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_BG_SCRAPYARD_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_CLOUD7_WIDTH, cfCMHDZ_BG_SCRAPYARD_CLOUD7_HEIGHT), "LEVEL_02_SCRAPYARD_CLOUD_07", 0)
// Trees
REPEAT 7 i
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(50 + (i * cfCMHDZ_BG_SCRAPYARD_TREES_SPRITE_WIDTH), cfCMHDZ_BG_SCRAPYARD_TREES_Y), INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_TREES_SPRITE_WIDTH, cfCMHDZ_BG_SCRAPYARD_TREES_SPRITE_HEIGHT), "LEVEL_03_FOREST_BACKGROUND_TREES", 0)
ENDREPEAT
REPEAT 6 i
CMHDZ_ADD_RANDOM_BG_SCRAPYARD_BACKGROUND_VAN_ELEMENT_TO_LIST(INIT_VECTOR_2D((i * cfCMHDZ_BG_SCRAPYARD_VAN_SPACING), 400), 0)
ENDREPEAT
// Fence
REPEAT 7 i
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(50 + (i * cfCMHDZ_BG_SCRAPYARD_FENCE_SPRITE_WIDTH), 420), INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_FENCE_SPRITE_WIDTH, cfCMHDZ_BG_SCRAPYARD_FENCE_SPRITE_HEIGHT), "LEVEL_02_SCRAPYARD_METAL_FENCE", 0)
ENDREPEAT
// Rocks
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(400, 675), INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_ROCKS_SPRITE_WIDTH, cfCMHDZ_BG_SCRAPYARD_ROCKS_SPRITE_HEIGHT), "LEVEL_02_SCRAPYARD_ROCKS", ciCMHDZ_LANE_MIDDLE)
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(820, 755), INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_ROCKS_SPRITE_WIDTH, cfCMHDZ_BG_SCRAPYARD_ROCKS_SPRITE_HEIGHT), "LEVEL_02_SCRAPYARD_ROCKS", ciCMHDZ_LANE_MIDDLE)
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(1050, 895), INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_ROCKS_SPRITE_WIDTH, cfCMHDZ_BG_SCRAPYARD_ROCKS_SPRITE_HEIGHT), "LEVEL_02_SCRAPYARD_ROCKS", ciCMHDZ_LANE_MIDDLE)
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(1400, 1000), INIT_VECTOR_2D(cfCMHDZ_BG_SCRAPYARD_ROCKS_SPRITE_WIDTH, cfCMHDZ_BG_SCRAPYARD_ROCKS_SPRITE_HEIGHT), "LEVEL_02_SCRAPYARD_ROCKS", ciCMHDZ_LANE_MIDDLE)
BREAK
CASE CMHDZ_LEVEL_ASYLUM
/*
fXPos = cfCMHDZ_LEVEL3_CLOUD_X
fCloudSpace = cfCMHDZ_LEVEL3_CLOUD_GAP
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_LEVEL3_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_LEVEL3_CLOUD1_WIDTH, cfCMHDZ_LEVEL3_CLOUD1_HEIGHT), "LEVEL_03_FOREST_BACKGROUND_CLOUDS_01", 0)
fXPos += (cfCMHDZ_LEVEL3_CLOUD1_WIDTH/2.0) + (cfCMHDZ_LEVEL3_CLOUD2_WIDTH/2.0) + fCloudSpace
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_LEVEL3_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_LEVEL3_CLOUD2_WIDTH, cfCMHDZ_LEVEL3_CLOUD2_HEIGHT), "LEVEL_03_FOREST_BACKGROUND_CLOUDS_02", 0)
fXPos += (cfCMHDZ_LEVEL3_CLOUD2_WIDTH / 2.0) + (cfCMHDZ_LEVEL3_CLOUD3_WIDTH / 2.0) + fCloudSpace
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_LEVEL3_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_LEVEL3_CLOUD3_WIDTH, cfCMHDZ_LEVEL3_CLOUD3_HEIGHT), "LEVEL_03_FOREST_BACKGROUND_CLOUDS_03", 0)
fXPos += (cfCMHDZ_LEVEL3_CLOUD3_WIDTH / 2.0) + (cfCMHDZ_LEVEL3_CLOUD4_WIDTH / 2.0) + fCloudSpace
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_LEVEL3_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_LEVEL3_CLOUD4_WIDTH, cfCMHDZ_LEVEL3_CLOUD4_HEIGHT), "LEVEL_03_FOREST_BACKGROUND_CLOUDS_04", 0)
fXPos += (cfCMHDZ_LEVEL3_CLOUD4_WIDTH / 2.0) + (cfCMHDZ_LEVEL3_CLOUD5_WIDTH / 2.0) + fCloudSpace
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_LEVEL3_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_LEVEL3_CLOUD5_WIDTH, cfCMHDZ_LEVEL3_CLOUD5_HEIGHT), "LEVEL_03_FOREST_BACKGROUND_CLOUDS_05", 0)
fXPos += (cfCMHDZ_LEVEL3_CLOUD5_WIDTH / 2.0) + (cfCMHDZ_LEVEL3_CLOUD6_WIDTH / 2.0) + fCloudSpace
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_LEVEL3_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_LEVEL3_CLOUD6_WIDTH, cfCMHDZ_LEVEL3_CLOUD6_HEIGHT), "LEVEL_03_FOREST_BACKGROUND_CLOUDS_06", 0)
fXPos += (cfCMHDZ_LEVEL3_CLOUD6_WIDTH / 2.0) + (cfCMHDZ_LEVEL3_CLOUD7_WIDTH / 2.0) + fCloudSpace
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(fXPos, cfCMHDZ_LEVEL3_CLOUD_Y), INIT_VECTOR_2D(cfCMHDZ_LEVEL3_CLOUD7_WIDTH, cfCMHDZ_LEVEL3_CLOUD7_HEIGHT), "LEVEL_03_FOREST_BACKGROUND_CLOUDS_07", 0)
FLOAT fFirstBackgroundTrees
fFirstBackgroundTrees = cfCMHDZ_LEVEL3_BACKGROUND_TREES_X
VECTOR_2D v2Trees
FOR i = 0 TO 6
v2Trees = INIT_VECTOR_2D(fFirstBackgroundTrees + (i * cfCMHDZ_LEVEL3_BACKGROUND_TREES_WIDTH), cfCMHDZ_LEVEL3_BACKGROUND_TREES_Y)
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(v2Trees, INIT_VECTOR_2D(cfCMHDZ_LEVEL3_BACKGROUND_TREES_WIDTH, cfCMHDZ_LEVEL3_BACKGROUND_TREES_HEIGHT), "LEVEL_03_FOREST_BACKGROUND_TREES", 0)
ENDFOR
// CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(1288.125, 696.625), INIT_VECTOR_2D(cfCMHDZ_FOREST_GRASS_SPRITE_WIDTH, cfCMHDZ_FOREST_GRASS_SPRITE_HEIGHT), "FLOOR_GRASS", 1)
// CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(665.750, 851.250), INIT_VECTOR_2D(cfCMHDZ_FOREST_GRASS_SPRITE_WIDTH, cfCMHDZ_FOREST_GRASS_SPRITE_HEIGHT), "FLOOR_GRASS", 1)
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(855.000, 660.000), INIT_VECTOR_2D(cfCMHDZ_FOREST_ROCKS_SPRITE_WIDTH, cfCMHDZ_FOREST_ROCKS_SPRITE_HEIGHT), "TERRAIN_ROCKS", 1)
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(1275.000, 905), INIT_VECTOR_2D(cfCMHDZ_FOREST_ROCKS_SPRITE_WIDTH, cfCMHDZ_FOREST_ROCKS_SPRITE_HEIGHT), "TERRAIN_ROCKS", 1)
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(1110.000, 485), INIT_VECTOR_2D(cfCMHDZ_FOREST_ROCKS_SPRITE_WIDTH, cfCMHDZ_FOREST_ROCKS_SPRITE_HEIGHT), "TERRAIN_ROCKS", 1)
// CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(1000, 895), INIT_VECTOR_2D(cfCMHDZ_FOREST_GRASS_SPRITE_WIDTH, cfCMHDZ_FOREST_GRASS_SPRITE_HEIGHT), "FLOOR_GRASS", 1)
// CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(1300, 1000), INIT_VECTOR_2D(cfCMHDZ_FOREST_GRASS_SPRITE_WIDTH, cfCMHDZ_FOREST_GRASS_SPRITE_HEIGHT), "FLOOR_GRASS", 1)
*/
BREAK
CASE CMHDZ_LEVEL_PARK
REPEAT 3 i
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(-50 + (i * cfCMHDZ_BG_THEMEPARK_SKYLINE_SPRITE_WIDTH), 70), INIT_VECTOR_2D(cfCMHDZ_BG_THEMEPARK_SKYLINE_SPRITE_WIDTH, cfCMHDZ_BG_THEMEPARK_SKYLINE_SPRITE_HEIGHT), "LEVEL_04_THEMEPARK_BACKGROUND_SKYLINE", 0, FALSE, TRUE)
ENDREPEAT
// Trees
REPEAT 7 i
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(50 + (i * cfCMHDZ_BG_THEMEPARK_TREES_SPRITE_WIDTH), cfCMHDZ_BG_HORIZON_Y_COORD), INIT_VECTOR_2D(cfCMHDZ_BG_THEMEPARK_TREES_SPRITE_WIDTH, cfCMHDZ_BG_THEMEPARK_TREES_SPRITE_HEIGHT), "LEVEL_04_THEMEPARK_BACKGROUND_TREES", 0, TRUE)
ENDREPEAT
// Railway
fXPos = cfCMHDZ_THEMEPARK_MINECART_TRACK_SPRITE_WIDTH
FOR i = 0 TO 6
vPosition = INIT_VECTOR_2D(fXPos + (i * cfCMHDZ_THEMEPARK_MINECART_TRACK_SPRITE_WIDTH), cfCMHDZ_BG_HORIZON_Y_COORD)
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(vPosition, INIT_VECTOR_2D(cfCMHDZ_THEMEPARK_MINECART_TRACK_SPRITE_WIDTH, cfCMHDZ_THEMEPARK_MINECART_TRACK_SPRITE_HEIGHT), "LEVEL_04_THEMEPARK_BACKGROUND_PROP_MINECART_01", 1, FALSE, TRUE)
ENDFOR
//-- Railway
// Wooden structures
//CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(500, 220), INIT_VECTOR_2D(cfCMHDZ_WOODENSTRUCTURE_SPRITE_WIDTH, cfCMHDZ_WOODENSTRUCTURE_SPRITE_HEIGHT), "WOODENSTRUCTURE", 1)
//CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(1000, 220), INIT_VECTOR_2D(cfCMHDZ_WOODENSTRUCTURE_SPRITE_WIDTH, cfCMHDZ_WOODENSTRUCTURE_SPRITE_HEIGHT), "WOODENSTRUCTURE", 1)
//CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(1500, 220), INIT_VECTOR_2D(cfCMHDZ_WOODENSTRUCTURE_SPRITE_WIDTH, cfCMHDZ_WOODENSTRUCTURE_SPRITE_HEIGHT), "WOODENSTRUCTURE", 1)
//-- Surface Rocks
//CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(700, 675), INIT_VECTOR_2D(cfCMHDZ_ROCKS_SPRITE_WIDTH, cfCMHDZ_ROCKS_SPRITE_HEIGHT), "LEVEL_04_GOLDMINE_ROCK", 1)
//CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(1020.0, 785), INIT_VECTOR_2D(cfCMHDZ_ROCKS_SPRITE_WIDTH, cfCMHDZ_ROCKS_SPRITE_HEIGHT), "LEVEL_04_GOLDMINE_ROCK", 1)
//CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(INIT_VECTOR_2D(1365.0, 545.0), INIT_VECTOR_2D(cfCMHDZ_ROCKS_SPRITE_WIDTH, cfCMHDZ_ROCKS_SPRITE_HEIGHT), "LEVEL_04_GOLDMINE_ROCK", 1)
BREAK
CASE CMHDZ_LEVEL_SLAUGHTERHOUSE
//fSlaughterhouseClouds = cfCMHDZ_SLAUGHTERHOUSE_LIGHTS_X
//fSlaughterhouseFence = cfCMHDZ_SLAUGHTERHOUSE_FENCE_X
fSlaughterHouseLights = cfCMHDZ_SLAUGHTERHOUSE_LIGHT_X
VECTOR_2D v2Slaughterhouse
FOR i = 0 TO 3
v2Slaughterhouse = INIT_VECTOR_2D(fSlaughterHouseLights + ((i * 2) * cfCMHDZ_SLAUGHTERHOUSE_LIGHTS_WIDTH), cfCMHDZ_SLAUGHTERHOUSE_LIGHT_Y)
CMHDZ_ADD_BACKGROUND_ELEMENT_TO_LIST(v2Slaughterhouse, INIT_VECTOR_2D(cfCMHDZ_SLAUGHTERHOUSE_LIGHTS_WIDTH, cfCMHDZ_SLAUGHTERHOUSE_LIGHTS_HEIGHT), "LEVEL_05_SLAUGHTERHOUSE_LIGHT", ciCMHDZ_LANE_MIDDLE)
ENDFOR
//CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_INIT_BACKGROUND - LEVEL_05_SLAUGHTERHOUSE_LIGHT - Adding new Midground elements")
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
FOR i = 0 TO ciCMHDZ_MAX_BACKGROUND_ELEMS - 1
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_INIT_BACKGROUND] Element ", i, " Type: ", sCMHDZData.sBackgroundData[i].sSprite)
ENDFOR
#ENDIF
ENDPROC
//-------------------------------------
// ITEM FUNCTIONS
//-------------------------------------
PROC CMHDZ_RESET_ITEM(INT iItem)
sCMHDZData.sItemData[iItem].bRendering = FALSE
sCMHDZData.sItemData[iItem].iMinScreen = 0
sCMHDZData.sItemData[iItem].iRenderAfterWarpCount = 0
sCMHDZData.sItemData[iItem].iWarpCount = 0
sCMHDZData.sItemData[iItem].bShot = FALSE
ENDPROC
PROC CMHDZ_RESET_ITEMS()
INT i
FOR i = 0 TO ciCMHDZ_MAX_ITEMS -1
sCMHDZData.sItemData[i].eItemType = CMHDZ_ITEM_NONE
CMHDZ_RESET_ITEM(i)
ENDFOR
sCMHDZData.iNumberOfItems = 0
ENDPROC
PROC CMHDZ_RESET_ITEM_MAP_DATA(CMHDZ_ITEM_MAP_DATA &dat)
dat.eItemType = CMHDZ_ITEM_NONE
dat.iLane = 0
dat.iMinScreen = 0
dat.iRenderAfterWarpCount = 0
dat.fForceScale = 1.0
ENDPROC
FUNC INT CMHDZ_GET_ITEM_MAP_DATA_SLOT(CMHDZ_ITEM_MAP_DATA &array[])
INT i
REPEAT COUNT_OF(array) i
IF (array[i].eItemType = CMHDZ_ITEM_NONE)
RETURN i
ENDIF
ENDREPEAT
RETURN -1
ENDFUNC
FUNC INT CMHDZ_GET_FREE_SLOT_FOR_ITEM()
INT i
REPEAT ciCMHDZ_MAX_ITEMS i
IF sCMHDZData.sItemData[i].bRendering = FALSE
AND sCMHDZData.sItemData[i].iRenderAfterWarpCount = 0
AND sCMHDZData.sItemData[i].iMinScreen = 0
//CDEBUG2LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_ADD_ITEM_TO_LIST] Using slot ", i)
RETURN i
ENDIF
ENDREPEAT
RETURN -1
ENDFUNC
FUNC VECTOR_2D CMHDZ_GET_ITEM_SIZE_FOR_TYPE(CMHDZ_ITEM_TYPES eType)
VECTOR_2D vSize
SWITCH (eType)
CASE CMHDZ_ITEM_NAIL_GUN_AMMO
vSize = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_AMMO_WIDTH, cfCMHDZ_SPRITE_HUD_AMMO_HEIGHT)
BREAK
// CASE CMHDZ_ITEM_REVOLVER_AMMO
// vSize = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_PISTOL_AMMO_CLIP_WIDTH, cfCMHDZ_SPRITE_HUD_PISTOL_AMMO_CLIP_HEIGHT)
// BREAK
CASE CMHDZ_ITEM_HEALTH
vSize = INIT_VECTOR_2D(cfCMHDZ_ITEM_HEALTH_WIDTH, cfCMHDZ_ITEM_HEALTH_HEIGHT)
BREAK
CASE CMHDZ_ITEM_SHOTGUN_AMMO
vSize = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_SHOTGUN_AMMO_CLIP_WIDTH, cfCMHDZ_SPRITE_HUD_SHOTGUN_AMMO_CLIP_HEIGHT)
BREAK
CASE CMHDZ_ITEM_SHIELD
vSize = INIT_VECTOR_2D(cfCMHDZ_ITEM_SHIELD_WIDTH, cfCMHDZ_ITEM_SHIELD_HEIGHT)
BREAK
CASE CMHDZ_ITEM_BUFF
vSize = INIT_VECTOR_2D(cfCMHDZ_ITEM_BUFF_WIDTH, cfCMHDZ_ITEM_BUFF_HEIGHT)
BREAK
CASE CMHDZ_ITEM_RIFLE_AMMO
vSize = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_RIFLE_AMMO_CLIP_WIDTH, cfCMHDZ_SPRITE_HUD_RIFLE_AMMO_CLIP_HEIGHT)
BREAK
CASE CMHDZ_ITEM_NAILBOMB
vSize = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_NAILBOMB_AMMO_CLIP_WIDTH, cfCMHDZ_SPRITE_HUD_NAILBOMB_AMMO_CLIP_HEIGHT)
BREAK
CASE CMHDZ_ITEM_BRICK
vSize = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_BRICK_AMMO_CLIP_WIDTH, cfCMHDZ_SPRITE_HUD_BRICK_AMMO_CLIP_HEIGHT)
BREAK
CASE CMHDZ_ITEM_MOLOTOV
vSize = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_MOLOTOV_AMMO_CLIP_WIDTH, cfCMHDZ_SPRITE_HUD_MOLOTOV_AMMO_CLIP_HEIGHT)
BREAK
CASE CMHDZ_ITEM_DYNAMITE
vSize = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_DYNAMITE_AMMO_CLIP_WIDTH, cfCMHDZ_SPRITE_HUD_DYNAMITE_AMMO_CLIP_HEIGHT)
BREAK
CASE CMHDZ_ITEM_VIDEOTAPE
vSize = INIT_VECTOR_2D(88,52)
BREAK
CASE CMHDZ_ITEM_CASH
vSize = INIT_VECTOR_2D(92,64)
BREAK
ENDSWITCH
RETURN vSize
ENDFUNC
PROC CMHDZ_SET_ITEM_MAP_DATA(CMHDZ_ITEM_MAP_DATA &dat, VECTOR_2D vPos, CMHDZ_ITEM_TYPES eType, INT iLane, INT iRenderAfterWarpCount = 0, FLOAT fForceScale = 1.0, INT iMinScreen = 0)
dat.eItemType = eType
dat.iLane = iLane
dat.iMinScreen = iMinScreen
dat.iRenderAfterWarpCount = iRenderAfterWarpCount
dat.vSpritePos = vPos
dat.fForceScale = fForceScale
ENDPROC
FUNC INT CMHDZ_GENERATE_ITEM_MAP_DATA_CHECKSUM(CMHDZ_ITEM_MAP_DATA &dat)
INT iChecksum = ENUM_TO_INT(dat.eItemType)
iChecksum += dat.iLane
iChecksum += dat.iRenderAfterWarpCount
iChecksum += dat.iMinScreen
iChecksum += FLOOR(dat.fForceScale * 100.0)
iChecksum += VECTOR_FLAT_PACK(<<dat.vSpritePos.x, dat.vSpritePos.y, 0>>)
RETURN iChecksum
ENDFUNC
PROC CMHDZ_COPY_ITEM_TO_ITEM_MAP(INT iCover, CMHDZ_ITEM_MAP_DATA &dat)
//CMHDZ_RESET_ITEM_MAP_DATA(dat)
dat.eItemType = sCMHDZData.sItemData[iCover].eItemType
dat.iMinScreen = sCMHDZData.sItemData[iCover].iMinScreen
dat.iLane = sCMHDZData.sItemData[iCover].iLane
dat.iRenderAfterWarpCount = sCMHDZData.sItemData[iCover].iRenderAfterWarpCount
dat.vSpritePos = sCMHDZData.sItemData[iCover].vSpritePos
dat.vSpritePos.x = sCMHDZData.sItemData[iCover].fInitialXPos
ENDPROC
PROC CMHDZ_COPY_ITEM_MAP_TO_ITEM(CMHDZ_ITEM_MAP_DATA &dat, INT iCover)
CMHDZ_RESET_ITEM(iCover)
sCMHDZData.sItemData[iCover].eItemType = dat.eItemType
sCMHDZData.sItemData[iCover].iMinScreen = dat.iMinScreen
sCMHDZData.sItemData[iCover].iLane = dat.iLane
sCMHDZData.sItemData[iCover].iRenderAfterWarpCount = dat.iRenderAfterWarpCount
sCMHDZData.sItemData[iCover].vSize = CMHDZ_GET_ITEM_SIZE_FOR_TYPE(dat.eItemType)
sCMHDZData.sItemData[iCover].vSize.x *= dat.fForceScale
sCMHDZData.sItemData[iCover].vSize.y *= dat.fForceScale
IF dat.iRenderAfterWarpCount = 0
AND dat.iMinScreen = 0
sCMHDZData.sItemData[iCover].bRendering = TRUE
ENDIF
ENDPROC
PROC CMHDZ_RESET_ALL_ITEM_MAP_DATA(CMHDZ_ITEM_MAP_DATA &src[])
INT i
REPEAT ciCMHDZ_MAX_ITEMS i
CMHDZ_RESET_ITEM_MAP_DATA(src[i])
IF (i < sCMHDZData.iNumberOfItems)
CMHDZ_COPY_ITEM_TO_ITEM_MAP(i, src[i])
ENDIF
ENDREPEAT
ENDPROC
FUNC INT CMHDZ_PARTITION_ITEM_MAP_ARRAY(CMHDZ_ITEM_MAP_DATA &sArray[], INT iLow, INT iHigh)
CMHDZ_ITEM_MAP_DATA swap
FLOAT pivot = sArray[iHigh].vSpritePos.x
INT i = (iLow - 1)
INT j
FOR j = iLow TO iHigh - 1 STEP 1
IF (sArray[j].vSpritePos.x < pivot)
i ++
swap = sArray[i]
sArray[i] = sArray[j]
sArray[j] = swap
ENDIF
ENDFOR
swap = sArray[i + 1]
sArray[i + 1] = sArray[iHigh]
sArray[iHigh] = swap
RETURN i + 1
ENDFUNC
PROC CMHDZ_QUICK_SORT_ITEM_MAP_ARRAY(CMHDZ_ITEM_MAP_DATA &sArray[], INT iLow, INT iHigh)
INT pi
IF (iLow < iHigh)
pi = CMHDZ_PARTITION_ITEM_MAP_ARRAY(sArray, iLow, iHigh)
CMHDZ_QUICK_SORT_ITEM_MAP_ARRAY(sArray, iLow, pi - 1)
CMHDZ_QUICK_SORT_ITEM_MAP_ARRAY(sArray, pi + 1, iHigh)
ENDIF
ENDPROC
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Exports a Spawn Definition to script
/// PARAMS:
/// data -
/// bOpenAndCloseFile -
PROC CMHDZ_DEBUG_EXPORT_ITEM_MAP_DATA_TO_SCRIPT(CMHDZ_ITEM_MAP_DATA &data, INT iItemID, BOOL bOpenAndCloseFile = TRUE)
IF data.vSpritePos.x <= 0.0
EXIT // Don't add any invalid data
ENDIF
IF (bOpenAndCloseFile)
OPEN_DEBUG_FILE()
ENDIF
SAVE_STRING_TO_DEBUG_FILE(" // ")
SAVE_INT_TO_DEBUG_FILE(iItemID)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(" CMHDZ_ADD_ITEM_TO_LIST(")
SAVE_STRING_TO_DEBUG_FILE("INIT_VECTOR_2D(")
SAVE_FLOAT_TO_DEBUG_FILE(data.vSpritePos.x)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_FLOAT_TO_DEBUG_FILE(data.vSpritePos.y)
SAVE_STRING_TO_DEBUG_FILE("), ")
SAVE_STRING_TO_DEBUG_FILE(CMHDZ_ITEM_TYPES_TO_STRING(data.eItemType))
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_STRING_TO_DEBUG_FILE(CMHDZ_LANE_TO_STRING(data.iLane))
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_INT_TO_DEBUG_FILE(data.iRenderAfterWarpCount)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_FLOAT_TO_DEBUG_FILE(data.fForceScale)
IF data.iMinScreen > 0
AND NOT ARE_STRINGS_EQUAL(CMHDZ_SCREEN_TO_STRING(data.iMinScreen), "UNKNOWN")
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_STRING_TO_DEBUG_FILE(CMHDZ_SCREEN_TO_STRING(data.iMinScreen))
ENDIF
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
IF (bOpenAndCloseFile)
CLOSE_DEBUG_FILE()
ENDIF
ENDPROC
PROC CMHDZ_DEBUG_EXPORT_ITEM_MAP_DATA_ARRAY_TO_SCRIPT(CMHDZ_ITEM_MAP_DATA &data[])
INT i
OPEN_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(" // Item Data List")
SAVE_NEWLINE_TO_DEBUG_FILE()
//CMHDZ_QUICK_SORT_ITEM_MAP_ARRAY(data, 0, COUNT_OF(data) - 1)
REPEAT COUNT_OF(data) i
IF (data[i].eItemType = CMHDZ_ITEM_NONE)
RELOOP
ENDIF
CMHDZ_DEBUG_EXPORT_ITEM_MAP_DATA_TO_SCRIPT(data[i], i, FALSE)
ENDREPEAT
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
ENDPROC
#ENDIF
// Items
PROC CMHDZ_ADD_ITEM_TO_LIST(VECTOR_2D vPos, CMHDZ_ITEM_TYPES eType, INT iLane, INT iRenderAfterWarpCount = 0, FLOAT fForceScale = 1.0, INT iMinScreen = 0)
INT iSlotToUse = CMHDZ_GET_FREE_SLOT_FOR_ITEM()
IF iSlotToUse = -1
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_ADD_ITEM_TO_LIST] Not adding item type ", CMHDZ_ITEM_TYPES_TO_STRING(eType), " as ran out of slots")
#ENDIF
EXIT
ENDIF
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_ADD_ITEM_TO_LIST] Add item type ", CMHDZ_ITEM_TYPES_TO_STRING(eType), " Lane: ", iLane, " Pos: ", vPos.x, ", ", vPos.y, " iRenderAfterWarpCount: ", iRenderAfterWarpCount, " fForceScale: ", fForceScale, " Num so far (inc this): ", sCMHDZData.iNumberOfItems + 1)
//CDEBUG2LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_ADD_ITEM_TO_LIST] Slot to use: ", iSlotToUse, " iMinScreen: ", iMinScreen)
DEBUG_PRINTCALLSTACK()
#ENDIF
IF iRenderAfterWarpCount = 0
AND iMinScreen = 0
sCMHDZData.sItemData[iSlotToUse].bRendering = TRUE
ENDIF
sCMHDZData.sItemData[iSlotToUse].iMinScreen = iMinScreen
sCMHDZData.sItemData[iSlotToUse].bShot = FALSE
sCMHDZData.sItemData[iSlotToUse].vSpritePos = vPos
sCMHDZData.sItemData[iSlotToUse].eItemType = eType
sCMHDZData.sItemData[iSlotToUse].iLane = iLane
sCMHDZData.sItemData[iSlotToUse].iRenderAfterWarpCount = iRenderAfterWarpCount
sCMHDZData.sItemData[iSlotToUse].iWarpCount = 0
sCMHDZData.sItemData[iSlotToUse].vSize = CMHDZ_GET_ITEM_SIZE_FOR_TYPE(sCMHDZData.sItemData[iSlotToUse].eItemType)
sCMHDZData.sItemData[iSlotToUse].fInitialXPos = vPos.x
sCMHDZData.sItemData[iSlotToUse].vSize.x *= fForceScale
sCMHDZData.sItemData[iSlotToUse].vSize.y *= fForceScale
sCMHDZData.iNumberOfItems ++
ENDPROC
PROC CMHDZ_COPY_ITEM_MAP_DATA_TO_GAME(CMHDZ_ITEM_MAP_DATA &src[])
INT i
sCMHDZData.iNumberOfItems = 0
REPEAT ciCMHDZ_MAX_ITEMS i
CMHDZ_RESET_ITEM(i)
IF (src[i].eItemType != CMHDZ_ITEM_NONE)
CMHDZ_ADD_ITEM_TO_LIST(src[i].vSpritePos, src[i].eItemType, src[i].iLane, src[i].iRenderAfterWarpCount, src[i].fForceScale, src[i].iMinScreen)
ENDIF
ENDREPEAT
ENDPROC
PROC CMHDZ_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(CMHDZ_ITEM_TYPES eType, INT iScreen, VECTOR_2D &vPos, VECTOR_2D &vOffset)
SWITCH CMHDZ_GET_CURRENT_LEVEL()
CASE CMHDZ_LEVEL_SCRAPYARD
SWITCH eType
CASE CMHDZ_ITEM_HEALTH
CASE CMHDZ_ITEM_SHIELD
CASE CMHDZ_ITEM_BUFF
SWITCH iScreen // vOffset is the offset of the pickup form the large building at base coords (1200, 440)
CASE 1 vPos = INIT_VECTOR_2D(1063.875, 822.5) vOffset = INIT_VECTOR_2D(-136.125, 382.5) BREAK
CASE 2 vPos = INIT_VECTOR_2D(789.375, 822.5) vOffset = INIT_VECTOR_2D(-410.625, 382.5) BREAK
CASE 3 vPos = INIT_VECTOR_2D(993.75, 822.5) vOffset = INIT_VECTOR_2D(-206.25, 382.5) BREAK
CASE 4 vPos = INIT_VECTOR_2D(1299.375, 822.5) vOffset = INIT_VECTOR_2D(99.375, 382.5) BREAK
ENDSWITCH
BREAK
// CASE CMHDZ_ITEM_REVOLVER_AMMO
//
// SWITCH iScreen
// CASE 1 vPos = INIT_VECTOR_2D(872.125, 817.125) vOffset = INIT_VECTOR_2D(-327.875, 327.875) BREAK
// CASE 2 vPos = INIT_VECTOR_2D(1418.625, 870.625) vOffset = INIT_VECTOR_2D(218.625, 870.625) BREAK
// CASE 3 vPos = INIT_VECTOR_2D(776.0, 817.125) vOffset = INIT_VECTOR_2D(-424.0, 327.875) BREAK
// CASE 4 vPos = INIT_VECTOR_2D(776.0, 817.125) vOffset = INIT_VECTOR_2D(-424.0, 327.875) BREAK
// ENDSWITCH
// BREAK
//
CASE CMHDZ_ITEM_SHOTGUN_AMMO
CASE CMHDZ_ITEM_RIFLE_AMMO
SWITCH iScreen
CASE 1 vPos = INIT_VECTOR_2D(872.125, 817.125) vOffset = INIT_VECTOR_2D(-327.875, 327.875) BREAK
CASE 2 vPos = INIT_VECTOR_2D(1418.625, 870.625)vOffset = INIT_VECTOR_2D(218.625, 870.625) BREAK
CASE 3 vPos = INIT_VECTOR_2D(776.0, 817.125) vOffset = INIT_VECTOR_2D(-424.0, 327.875) BREAK
CASE 4 vPos = INIT_VECTOR_2D(776.0, 817.125) vOffset = INIT_VECTOR_2D(-424.0, 327.875) BREAK
ENDSWITCH
BREAK
ENDSWITCH
BREAK
CASE CMHDZ_LEVEL_ASYLUM
SWITCH eType
/*
SCREEN 1 Base: (1404.125, 870)
SCREEN 2 Base: (1576.1250 , 870.250)
SCREEN 3 Base: (1472.25, 474.625)
SCREEN 4 Base: (1415.750, 562.375)
*/
CASE CMHDZ_ITEM_HEALTH
CASE CMHDZ_ITEM_SHIELD
CASE CMHDZ_ITEM_BUFF
SWITCH iScreen
CASE 1 vPos = INIT_VECTOR_2D(1218.625, 832.75) vOffset = INIT_VECTOR_2D(-185.5, -37.25) BREAK
CASE 2 vPos = INIT_VECTOR_2D(1111.75, 832.75) vOffset = INIT_VECTOR_2D(-464.375, -37.5) BREAK
CASE 3 vPos = INIT_VECTOR_2D(1001.375,871.625) vOffset = INIT_VECTOR_2D(-470.875, 397.0) BREAK
CASE 4 vPos = INIT_VECTOR_2D(717.875, 577.125) vOffset = INIT_VECTOR_2D(-697.875, 14.75) BREAK
ENDSWITCH
BREAK
//
CASE CMHDZ_ITEM_RIFLE_AMMO
SWITCH iScreen
CASE 1 vPos = INIT_VECTOR_2D(979.625, 510.500) vOffset = INIT_VECTOR_2D(-424.5,-359.5) BREAK
CASE 2 vPos = INIT_VECTOR_2D(1026.250, 510.500) vOffset = INIT_VECTOR_2D(-549.875, -359.75) BREAK
CASE 3 vPos = INIT_VECTOR_2D(1083.250, 588.750) vOffset = INIT_VECTOR_2D(-389.0, 114.125) BREAK
CASE 4 vPos = INIT_VECTOR_2D(1156.875, 872.750) vOffset = INIT_VECTOR_2D(-258.875, 310.375) BREAK
ENDSWITCH
BREAK
// CASE CMHDZ_ITEM_REVOLVER_AMMO
CASE CMHDZ_ITEM_SHOTGUN_AMMO
SWITCH iScreen
CASE 1 vPos = INIT_VECTOR_2D(704.625, 842.375) vOffset = INIT_VECTOR_2D(-699.5 ,-27.625) BREAK
CASE 2 vPos = INIT_VECTOR_2D(648.625, 870.625) vOffset = INIT_VECTOR_2D(-927.5, 0.375) BREAK
CASE 3 vPos = INIT_VECTOR_2D(1316.500, 870.625 ) vOffset = INIT_VECTOR_2D(-155.75, 396.0) BREAK
CASE 4 vPos = INIT_VECTOR_2D(762.000, 908.500) vOffset = INIT_VECTOR_2D(-653.75, 346.125) BREAK
ENDSWITCH
BREAK
//
ENDSWITCH
BREAK
CASE CMHDZ_LEVEL_PARK
SWITCH eType
CASE CMHDZ_ITEM_HEALTH
CASE CMHDZ_ITEM_SHIELD
CASE CMHDZ_ITEM_BUFF
SWITCH iScreen
CASE 1 vPos = INIT_VECTOR_2D(835.375, 558.625) vOffset = INIT_VECTOR_2D(-584.25, -187.0) BREAK
CASE 2 vPos = INIT_VECTOR_2D(1222.5, 825.375) vOffset = INIT_VECTOR_2D(-172.75, -8.625) BREAK
CASE 3 vPos = INIT_VECTOR_2D(1441.25, 886.25) vOffset = INIT_VECTOR_2D(67.25, 347.625) BREAK
CASE 4 vPos = INIT_VECTOR_2D(1310.75, 929.125) vOffset = INIT_VECTOR_2D(-44.25, 392.75) BREAK
ENDSWITCH
BREAK
// CASE CMHDZ_ITEM_REVOLVER_AMMO
CASE CMHDZ_ITEM_NAIL_GUN_AMMO
SWITCH iScreen
CASE 1 vPos = INIT_VECTOR_2D(778.75, 811.25) vOffset = INIT_VECTOR_2D(-641.25, 65.625) BREAK
CASE 2 vPos = INIT_VECTOR_2D(641.0, 799.25) vOffset = INIT_VECTOR_2D(-754.25, -34.75) BREAK
CASE 3 vPos = INIT_VECTOR_2D(641.0, 819.875) vOffset = INIT_VECTOR_2D(-733.0, 281.25) BREAK
CASE 4 vPos = INIT_VECTOR_2D(589.0, 825.75) vOffset = INIT_VECTOR_2D(-766.0, 289.375) BREAK
ENDSWITCH
BREAK
CASE CMHDZ_ITEM_SHOTGUN_AMMO
CASE CMHDZ_ITEM_RIFLE_AMMO
SWITCH iScreen
CASE 1 vPos = INIT_VECTOR_2D(1220.75, 560.75) vOffset = INIT_VECTOR_2D(-199.25, -184.875) BREAK
CASE 2 vPos = INIT_VECTOR_2D(1479.375, 560.75) vOffset = INIT_VECTOR_2D(84.125, -273.25) BREAK
CASE 3 vPos = INIT_VECTOR_2D(1169.25, 560.75) vOffset = INIT_VECTOR_2D(-204.75, 22.125) BREAK
CASE 4 vPos = INIT_VECTOR_2D(679.5, 560.75) vOffset = INIT_VECTOR_2D(-675.5, 536.375) BREAK
ENDSWITCH
BREAK
ENDSWITCH
BREAK
CASE CMHDZ_LEVEL_SLAUGHTERHOUSE
/*
Base coords are:
Screen 1: 1700, 850
Screen 2: 1505.500, 857.000
Screen 3: 1521.625, 845.625
Screen 4: 1535.250, 871.375
*/
SWITCH eType
CASE CMHDZ_ITEM_SHOTGUN_AMMO
CASE CMHDZ_ITEM_RIFLE_AMMO
SWITCH iScreen
CASE 1 vPos = INIT_VECTOR_2D(822.875, 874.125) vOffset = INIT_VECTOR_2D(-877.125, 24.125) BREAK
CASE 2 vPos = INIT_VECTOR_2D(1001.125, 575.25) vOffset = INIT_VECTOR_2D(-504.375, -281.75) BREAK
CASE 3 vPos = INIT_VECTOR_2D(1409.875, 575.25) vOffset = INIT_VECTOR_2D(-111.75, -270.375) BREAK
CASE 4 vPos = INIT_VECTOR_2D(1082.875, 552.625) vOffset = INIT_VECTOR_2D(-452.375, -318.75) BREAK
ENDSWITCH
BREAK
CASE CMHDZ_ITEM_HEALTH
CASE CMHDZ_ITEM_SHIELD
CASE CMHDZ_ITEM_BUFF
SWITCH iScreen
CASE 1 vPos = INIT_VECTOR_2D(1416.875, 572.0) vOffset = INIT_VECTOR_2D(-283.125, -278) BREAK
CASE 2 vPos = INIT_VECTOR_2D(1429.125, 842.875) vOffset = INIT_VECTOR_2D(-76.375, -14.125) BREAK
CASE 3 vPos = INIT_VECTOR_2D(984.375, 868.25) vOffset = INIT_VECTOR_2D(-537.25, 22.625) BREAK
CASE 4 vPos = INIT_VECTOR_2D(858.5, 868.25) vOffset = INIT_VECTOR_2D(-676.75, -3.125) BREAK
ENDSWITCH
BREAK
// CASE CMHDZ_ITEM_REVOLVER_AMMO
CASE CMHDZ_ITEM_NAIL_GUN_AMMO
SWITCH iScreen
CASE 1 vPos = INIT_VECTOR_2D(525.75, 591.875) vOffset = INIT_VECTOR_2D(-1174.25, -258.125) BREAK
CASE 2 vPos = INIT_VECTOR_2D(1251.0, 578.875) vOffset = INIT_VECTOR_2D(-254.5, -278.125) BREAK
CASE 3 vPos = INIT_VECTOR_2D(564.875, 578.875) vOffset = INIT_VECTOR_2D(-956.75, -266.75) BREAK
CASE 4 vPos = INIT_VECTOR_2D(1405.375, 549.375) vOffset = INIT_VECTOR_2D(-129.875, -322.0) BREAK
ENDSWITCH
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDPROC
PROC CMHDZ_RESET_ALL_COLLECTIBLE_ITEMS_NOT_ON_SCREEN()
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_RESET_ALL_COLLECTIBLE_ITEMS_NOT_ON_SCREEN] Called")
#ENDIF
INT i
FOR i = 0 TO ciCMHDZ_MAX_ITEMS - 1
IF sCMHDZData.sItemData[i].bRendering
IF NOT CMHDZ_IS_POSITION_ON_SCREEN(sCMHDZData.sItemData[i].vSpritePos)
//CDEBUG2LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_RESET_ALL_COLLECTIBLE_ITEMS_NOT_ON_SCREEN] Resetting item ", i, " Type: ", CMHDZ_ITEM_TYPES_TO_STRING(sCMHDZData.sItemData[i].eItemType))
CMHDZ_RESET_ITEM(i)
ELSE
//CDEBUG2LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_RESET_ALL_COLLECTIBLE_ITEMS_NOT_ON_SCREEN] NOT Resetting item ", i, " Type: ", CMHDZ_ITEM_TYPES_TO_STRING(sCMHDZData.sItemData[i].eItemType), " as on screen coords ", sCMHDZData.sItemData[i].vSpritePos.x, ", ", sCMHDZData.sItemData[i].vSpritePos.y)
ENDIF
ELSE
//CDEBUG2LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_RESET_ALL_COLLECTIBLE_ITEMS_NOT_ON_SCREEN] NOT Resetting item ", i, " Type: ", CMHDZ_ITEM_TYPES_TO_STRING(sCMHDZData.sItemData[i].eItemType), " as not rendering")
ENDIF
ENDFOR
ENDPROC
PROC CMHDZ_INIT_ITEMS()
//FLOAT fOffset
//VECTOR_2D vPos, vOffset
CMHDZ_RESET_ITEMS()
sCMHDZData.iNumberOfItems = 0
SWITCH sCMHDZData.eCurrentLevel
CASE CMHDZ_LEVEL_CITY
// 1
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(3322.0000, 848.0000), CMHDZ_ITEM_NAILBOMB, ciCMHDZ_LANE_MIDDLE, 0, 1.0000, 0)
// 2
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(5240.0000, 524.0000), CMHDZ_ITEM_HEALTH, ciCMHDZ_LANE_BACKGROUND, 0, 1.0000, 0)
// 3
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(7628.0000, 564.0000), CMHDZ_ITEM_SHOTGUN_AMMO, ciCMHDZ_LANE_BACKGROUND, 0, 1.0000, 1)
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(6868.0000, 871.1250), CMHDZ_ITEM_CASH, ciCMHDZ_LANE_MIDDLE, 0, 1.0000)
BREAK
CASE CMHDZ_LEVEL_SCRAPYARD
//-- SHerriff, ammo, health, shotgun
// Item Data List
// 0
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(1629.3750, 882.5000), CMHDZ_ITEM_HEALTH, ciCMHDZ_LANE_MIDDLE, 2, 1.0000)
// 1
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(2625.3750, 472.5000), CMHDZ_ITEM_NAIL_GUN_AMMO, ciCMHDZ_LANE_BACKGROUND, 0, 1.0000)
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(6964.0000, 505.1250), CMHDZ_ITEM_CASH, ciCMHDZ_LANE_BACKGROUND, 0, 1.0000)
// 2
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(4494.0000, 786.0000), CMHDZ_ITEM_SHIELD, ciCMHDZ_LANE_MIDDLE, 1, 1.0000, 1)
// 3
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(5787.3750, 918.5000), CMHDZ_ITEM_HEALTH, ciCMHDZ_LANE_MIDDLE, 0, 1.0000, 3)
// 4
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(6792.0000, 494.0000), CMHDZ_ITEM_RIFLE_AMMO, ciCMHDZ_LANE_BACKGROUND, 0, 1.0000, 3)
BREAK
CASE CMHDZ_LEVEL_ASYLUM
// Item Data List - CMHDZ_LEVEL_ASYLUM
// 2
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(7020.0000, 612.000), CMHDZ_ITEM_NAIL_GUN_AMMO, ciCMHDZ_LANE_BACKGROUND, 0, 1.0000)
// 3
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(3696.0000, 852.0000), CMHDZ_ITEM_SHIELD, ciCMHDZ_LANE_MIDDLE, 0, 1.0000)
// 4
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(3432.0000, 396.0000), CMHDZ_ITEM_NAILBOMB, ciCMHDZ_LANE_BACKGROUND, 0, 1.0000)
// 5
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(6264.0000, 828.0000), CMHDZ_ITEM_HEALTH, ciCMHDZ_LANE_MIDDLE, 0, 1.0000)
// 6
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(7868.0000, 871.1250), CMHDZ_ITEM_CASH, ciCMHDZ_LANE_MIDDLE, 0, 1.0000)
BREAK
CASE CMHDZ_LEVEL_PARK
// Item Data List
// 0
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(3764.7500, 392.7500), CMHDZ_ITEM_RIFLE_AMMO, ciCMHDZ_LANE_BACKGROUND, 0, 1.0000)
// 2
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(6094.5000, 489.3750), CMHDZ_ITEM_CASH, ciCMHDZ_LANE_BACKGROUND, 1, 1.0000)
// 3
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(6759.3750, 828.7500), CMHDZ_ITEM_MOLOTOV, ciCMHDZ_LANE_MIDDLE, 0, 1.0000)
// 6
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(8574.0000, 532.0000), CMHDZ_ITEM_SHOTGUN_AMMO, ciCMHDZ_LANE_BACKGROUND, 0, 1.0000)
// 7
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(8496.0000, 876.0000), CMHDZ_ITEM_VIDEOTAPE, ciCMHDZ_LANE_MIDDLE, 0, 1.0000, 5)
// 8
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(9118.7500, 610.0000), CMHDZ_ITEM_HEALTH, ciCMHDZ_LANE_MIDDLE, 0, 1.0000)
BREAK
CASE CMHDZ_LEVEL_SLAUGHTERHOUSE
// 2
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(2701.1250, 794.8750), CMHDZ_ITEM_SHIELD, ciCMHDZ_LANE_MIDDLE, 0, 1.0000, 0)
// 1
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(3888.8750, 776.0000), CMHDZ_ITEM_SHOTGUN_AMMO, ciCMHDZ_LANE_MIDDLE, 0, 1.0000, 1)
// 1
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(5801.8750, 383.2500), CMHDZ_ITEM_VIDEOTAPE, ciCMHDZ_LANE_BACKGROUND, 0, 1.0000, 1)
// 4
CMHDZ_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(6570.5000, 340.2500), CMHDZ_ITEM_HEALTH, ciCMHDZ_LANE_BACKGROUND, 0, 1.0000, 3)
// //1
// //-- Rifle
// CMHDZ_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(CMHDZ_ITEM_RIFLE_AMMO, 1, vPos, vOffset)
// CMHDZ_ADD_ITEM_TO_LIST(vPos, CMHDZ_ITEM_RIFLE_AMMO, ciCMHDZ_LANE_MIDDLE)
//
//
// //-- Snake oil
// CMHDZ_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(CMHDZ_ITEM_SHIELD, 1, vPos, vOffset)
// CMHDZ_ADD_ITEM_TO_LIST(vPos, CMHDZ_ITEM_SHIELD, ciCMHDZ_LANE_MIDDLE)
//
// //2
// fOffset = cfBASE_SCREEN_WIDTH / 2.0
//
// //-- Sheriff
// CMHDZ_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(CMHDZ_ITEM_BUFF, 2, vPos, vOffset)
// vPos.x += fOffset
// CMHDZ_ADD_ITEM_TO_LIST(vPos, CMHDZ_ITEM_BUFF, ciCMHDZ_LANE_MIDDLE, 1)
//
// //3
// fOffset = cfBASE_SCREEN_WIDTH
// //-- Shotgun ammo
// CMHDZ_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(CMHDZ_ITEM_SHOTGUN_AMMO, 3, vPos, vOffset)
// vPos.x += fOffset
// CMHDZ_ADD_ITEM_TO_LIST(vPos, CMHDZ_ITEM_SHOTGUN_AMMO, ciCMHDZ_LANE_MIDDLE, 1)
//
// //4
//
// //-- Health
// fOffset = cfBASE_SCREEN_WIDTH + cfBASE_SCREEN_WIDTH / 2.0
// CMHDZ_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(CMHDZ_ITEM_HEALTH, 4, vPos, vOffset)
// vPos.x += fOffset
// CMHDZ_ADD_ITEM_TO_LIST(vPos, CMHDZ_ITEM_HEALTH, ciCMHDZ_LANE_MIDDLE, 1)
//
// //-- Rifle
// CMHDZ_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(CMHDZ_ITEM_RIFLE_AMMO, 4, vPos, vOffset)
// vPos.x += fOffset
// CMHDZ_ADD_ITEM_TO_LIST(vPos, CMHDZ_ITEM_RIFLE_AMMO, ciCMHDZ_LANE_MIDDLE, 1)
BREAK
ENDSWITCH
ENDPROC
//-------------------------------------
// COVER FUNCTIONS
//-------------------------------------
FUNC BOOL CMHDZ_COVER_UTIL_CAN_SHOOT_THROUGH_TYPE(CMHDZ_ASSET_TYPES eType)
// IF CMHDZ_GET_CURRENT_LEVEL() = CMHDZ_LEVEL_ASYLUM
// OR CMHDZ_GET_CURRENT_LEVEL() = CMHDZ_LEVEL_PARK
//
// RETURN TRUE
// ENDIF
SWITCH eType
CASE CMHDZ_ASSET_CACTUS_1
CASE CMHDZ_ASSET_CACTUS_2
CASE CMHDZ_ASSET_CACTUS_3
CASE CMHDZ_ASSET_ASYLUM_MD_BED
CASE CMHDZ_ASSET_SCRAPYARD_MD_CAR_2
CASE CMHDZ_ASSET_CACTUS_9
CASE CMHDZ_ASSET_SCRAPYARD_PROP_FENCE
CASE CMHDZ_ASSET_WATER_TOWER
CASE CMHDZ_ASSET_FENCE
RETURN TRUE
BREAK
ENDSWITCH
IF CMHDZ_GET_CURRENT_LEVEL() = CMHDZ_LEVEL_SLAUGHTERHOUSE
SWITCH eType
CASE CMHDZ_ASSET_DOOR_1
CASE CMHDZ_ASSET_DOOR_2
CASE CMHDZ_ASSET_WINDOW
CASE CMHDZ_ASSET_PIG
CASE CMHDZ_ASSET_BODYBAG_FLOOR_1
CASE CMHDZ_ASSET_BODYBAG_FLOOR_2
CASE CMHDZ_ASSET_BODYBAG_FLOOR_3
CASE CMHDZ_ASSET_BODYBAG_FLOOR_4
RETURN TRUE
BREAK
ENDSWITCH
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CMHDZ_CAN_SHOOT_THROUGH_COVER(INT iCover)
// IF CMHDZ_COVER_DATA_IS_BITMASK_SET(iCover, CMHDZ_COVER_DATA_BITS_NEVER_RENDER)
// RETURN FALSE
// ENDIF
// Can always shoot through foreground slaughterhouse cover.
IF CMHDZ_GET_CURRENT_LEVEL() = CMHDZ_LEVEL_SLAUGHTERHOUSE
AND sCMHDZData.sCoverData[iCover].iCoverLane = ciCMHDZ_LANE_FOREGROUND
RETURN TRUE
ENDIF
RETURN CMHDZ_COVER_UTIL_CAN_SHOOT_THROUGH_TYPE(sCMHDZData.sCoverData[iCover].eType)
ENDFUNC
FUNC FLOAT CMHDZ_COVER_UTIL_GET_SIZE_MODIFIER_FOR_COLLISION_CHECK(CMHDZ_ASSET_TYPES eType)
UNUSED_PARAMETER(eType)
IF CMHDZ_COVER_UTIL_IS_TYPE_BUILDING(eType)
RETURN 0.6
ENDIF
IF eType = CMHDZ_ASSET_BARRELS
RETURN 0.8
ENDIF
IF eType = CMHDZ_ASSET_BODYBAG_1
OR eType = CMHDZ_ASSET_BODYBAG_2
OR eType = CMHDZ_ASSET_BODYBAG_3
// OR eType = CMHDZ_ASSET_PIG_BATCH
RETURN 0.3
ENDIF
RETURN 1.0
ENDFUNC
PROC CMHDZ_RESET_COVER_MAP_DATA(CMHDZ_COVER_MAP_DATA &dat)
//dat.eDataBits = CMHDZ_COVER_DATA_BITS_NONE
dat.eType = CMHDZ_ASSET_INVALID
dat.fActiveAtPoint = dat.vSpriteInitialPos.x
dat.iCoverLane = 0
ENDPROC
FUNC INT CMHDZ_GET_COVER_MAP_DATA_SLOT(CMHDZ_COVER_MAP_DATA &array[])
INT i
REPEAT COUNT_OF(array) i
IF (array[i].eType = CMHDZ_ASSET_INVALID)
//CDEBUG2LN(DEBUG_MINIGAME, "CMHDZ_GET_COVER_MAP_DATA_SLOT i value: ", i)
RETURN i
ENDIF
ENDREPEAT
RETURN -1
ENDFUNC
PROC CMHDZ_RESET_COVER(INT iCover)
IF CMHDZ_COVER_DATA_IS_BITMASK_SET(iCover, CMHDZ_COVER_DATA_BITS_SPAWNED_PICKUP)
CMHDZ_COVER_DATA_CLEAR_BITMASK(iCover, CMHDZ_COVER_DATA_BITS_SPAWNED_PICKUP)
ENDIF
//sCMHDZData.sCoverData[iCover].eDataBits = CMHDZ_COVER_DATA_BITS_NONE
sCMHDZData.sCoverData[iCover].iHitCount = 0
sCMHDZData.sCoverData[iCover].fActiveAtPoint = sCMHDZData.sCoverData[iCover].vSpriteInitialPos.x
ENDPROC
FUNC BOOL CMHDZ_COVER_UTIL_IS_TYPE_ANIMATED(CMHDZ_ASSET_TYPES eType)
SWITCH eType
CASE CMHDZ_ASSET_PIG
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL CMHDZ_COVER_UTIL_IS_TYPE_SPECIAL(CMHDZ_ASSET_TYPES eType)
SWITCH (eType)
// CASE CMHDZ_ASSET_SPECIAL_TNT_CRATE
CASE CMHDZ_ASSET_SPECIAL_TNT_BARREL_1
CASE CMHDZ_ASSET_SPECIAL_TNT_BARREL_2
RETURN TRUE
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC VECTOR_2D CMHDZ_COVER_UTIL_GET_TYPE_SIZE(CMHDZ_ASSET_TYPES eType)
VECTOR_2D vSize
SWITCH (eType)
CASE CMHDZ_ASSET_CACTUS_1
vSize.x = cfCMHDZ_CACTUS_1_SPRITE_WIDTH
vSize.y = cfCMHDZ_CACTUS_1_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_CACTUS_2
vSize.x = cfCMHDZ_CACTUS_2_SPRITE_WIDTH
vSize.y = cfCMHDZ_CACTUS_2_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_CACTUS_3
vSize.x = cfCMHDZ_CACTUS_3_SPRITE_WIDTH
vSize.y = cfCMHDZ_CACTUS_3_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_ASYLUM_MD_BED
vSize.x = cfCMHDZ_ASYLUM_MD_BED_SPRITE_WIDTH
vSize.y = cfCMHDZ_ASYLUM_MD_BED_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_ASYLUM_MD_WHEELCHAIR
vSize.x = cfCMHDZ_ASYLUM_MD_WHEELCHAIR_SPRITE_WIDTH
vSize.y = cfCMHDZ_ASYLUM_MD_WHEELCHAIR_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_ASYLUM_MD_MATTRESS
vSize.x = cfCMHDZ_ASYLUM_MD_MATTRESS_SPRITE_WIDTH
vSize.y = cfCMHDZ_ASYLUM_MD_MATTRESS_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_ASYLUM_LIGHT_1
vSize.x = cfCMHDZ_ASYLUM_LIGHT_SPRITE_WIDTH
vSize.y = cfCMHDZ_ASYLUM_LIGHT_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_ASYLUM_LIGHT_2
vSize.x = cfCMHDZ_ASYLUM_LIGHT_SPRITE_WIDTH
vSize.y = cfCMHDZ_ASYLUM_LIGHT_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_ASYLUM_BG_RADIATOR
vSize.x = cfCMHDZ_ASYLUM_RADIATOR_SPRITE_WIDTH
vSize.y = cfCMHDZ_ASYLUM_RADIATOR_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_ASYLUM_BG_DOOR
vSize.x = cfCMHDZ_ASYLUM_DOOR_SPRITE_WIDTH
vSize.y = cfCMHDZ_ASYLUM_DOOR_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_ASYLUM_GRAFFITI_1
vSize.x = cfCMHDZ_ASYLUM_GRAF_1_SPRITE_WIDTH
vSize.y = cfCMHDZ_ASYLUM_GRAF_1_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_ASYLUM_GRAFFITI_2
vSize.x = cfCMHDZ_ASYLUM_GRAF_2_SPRITE_WIDTH
vSize.y = cfCMHDZ_ASYLUM_GRAF_2_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_ASYLUM_GRAFFITI_3
vSize.x = cfCMHDZ_ASYLUM_GRAF_3_SPRITE_WIDTH
vSize.y = cfCMHDZ_ASYLUM_GRAF_3_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_CITY_BUILDING_1
CASE CMHDZ_ASSET_CITY_BUILDING_2
CASE CMHDZ_ASSET_CITY_BUILDING_3
vSize.x = cfCMHDZ_CITY_BUILDING_SPRITE_WIDTH
vSize.y = cfCMHDZ_CITY_BUILDING_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_SCRAPYARD_MD_VAN_1
CASE CMHDZ_ASSET_SCRAPYARD_MD_VAN_2
CASE CMHDZ_ASSET_SCRAPYARD_MD_VAN_3
CASE CMHDZ_ASSET_SCRAPYARD_MD_VAN_4
vSize.x = cfCMHDZ_SCRAPYARD_MD_VAN_SPRITE_WIDTH
vSize.y = cfCMHDZ_SCRAPYARD_MD_VAN_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_THEMEPARK_BUILDING_1
CASE CMHDZ_ASSET_THEMEPARK_BUILDING_2
vSize.x = cfCMHDZ_THEMEPARK_BUILDING_1_SPRITE_WIDTH
vSize.y = cfCMHDZ_THEMEPARK_BUILDING_1_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_THEMEPARK_BUILDING_3
CASE CMHDZ_ASSET_THEMEPARK_BUILDING_4
vSize.x = cfCMHDZ_THEMEPARK_BUILDING_3_SPRITE_WIDTH
vSize.y = cfCMHDZ_THEMEPARK_BUILDING_3_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_THEMEPARK_CLOWNBOARD_1
vSize.x = cfCMHDZ_THEMEPARK_CLOWNBOARD_1_SPRITE_WIDTH
vSize.y = cfCMHDZ_THEMEPARK_CLOWNBOARD_1_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_THEMEPARK_CLOWNBOARD_2
vSize.x = cfCMHDZ_THEMEPARK_CLOWNBOARD_2_SPRITE_WIDTH
vSize.y = cfCMHDZ_THEMEPARK_CLOWNBOARD_2_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_FENCE
vSize.x = cfCMHDZ_FENCE_SPRITE_WIDTH
vSize.y = cfCMHDZ_FENCE_SPRITE_HEIGHT
BREAK
// CASE CMHDZ_ASSET_FENCE_SMALL
// vSize.x = cfCMHDZ_FENCE_SMALL_SPRITE_WIDTH
// vSize.y = cfCMHDZ_FENCE_SMALL_SPRITE_HEIGHT
// BREAK
CASE CMHDZ_ASSET_SCRAPYARD_MD_CAR_1
CASE CMHDZ_ASSET_SCRAPYARD_MD_CAR_2
CASE CMHDZ_ASSET_SCRAPYARD_MD_CAR_3
CASE CMHDZ_ASSET_SCRAPYARD_MD_CAR_4
vSize.x = cfCMHDZ_SCRAPYARD_MD_CAR_SPRITE_WIDTH
vSize.y = cfCMHDZ_SCRAPYARD_MD_CAR_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_CACTUS_9
vSize.x = cfCMHDZ_CACTUS_9_SPRITE_WIDTH
vSize.y = cfCMHDZ_CACTUS_9_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_SCRAPYARD_PROP_FENCE
vSize.x = cfCMHDZ_SCRAPYARD_PROP_FENCE_SPRITE_WIDTH
vSize.y = cfCMHDZ_SCRAPYARD_PROP_FENCE_SPRITE_HEIGHT
BREAK
// CASE CMHDZ_ASSET_SCRAPYARD_BG_CARS
// vSize.x = cfCMHDZ_SCRAPYARD_BG_CARS_SPRITE_WIDTH
// vSize.y = cfCMHDZ_SCRAPYARD_BG_CARS_SPRITE_HEIGHT
// BREAK
CASE CMHDZ_ASSET_THEMEPARK_TREE_1
vSize.x = cfCMHDZ_FOREST_TREE_1_SPRITE_WIDTH
vSize.y = cfCMHDZ_FOREST_TREE_1_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_THEMEPARK_TREE_2
vSize.x = cfCMHDZ_FOREST_TREE_2_SPRITE_WIDTH
vSize.y = cfCMHDZ_FOREST_TREE_2_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_THEMEPARK_TREE_3
vSize.x = cfCMHDZ_FOREST_TREE_3_SPRITE_WIDTH
vSize.y = cfCMHDZ_FOREST_TREE_3_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_THEMEPARK_TREE_4
vSize.x = cfCMHDZ_FOREST_TREE_4_SPRITE_WIDTH
vSize.y = cfCMHDZ_FOREST_TREE_4_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_GRASS
vSize.x = cfCMHDZ_FOREST_GRASS_SPRITE_WIDTH
vSize.y = cfCMHDZ_FOREST_GRASS_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_BUSH_1
vSize.x = cfCMHDZ_FOREST_BUSH_SM_SPRITE_WIDTH
vSize.y = cfCMHDZ_FOREST_BUSH_SM_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_BUSH_2
vSize.x = cfCMHDZ_FOREST_BUSH_LG_SPRITE_WIDTH
vSize.y = cfCMHDZ_FOREST_BUSH_LG_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_ROCK_SMALL
vSize.x = cfCMHDZ_ROCK_SMALL_SPRITE_WIDTH
vSize.y = cfCMHDZ_ROCK_SMALL_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_ROCK_LARGE
vSize.x = cfCMHDZ_ROCK_LARGE_SPRITE_WIDTH
vSize.y = cfCMHDZ_ROCK_LARGE_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_FOREGROUND_TRASH
vSize.x = cfCMHDZ_FOREGROUND_TRASH_SPRITE_WIDTH
vSize.y = cfCMHDZ_FOREGROUND_TRASH_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_BARRIER
vSize.x = cfCMHDZ_BARRIER_SPRITE_WIDTH
vSize.y = cfCMHDZ_BARRIER_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_BARRELS
vSize.x = cfCMHDZ_BARRELS_SPRITE_WIDTH
vSize.y = cfCMHDZ_BARRELS_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_MEATGRINDER_1
vSize.x = cfCMHDZ_SLAUGHTERHOUSE_PROP_MEATGRINDER_SPRITE_WIDTH
vSize.y = cfCMHDZ_SLAUGHTERHOUSE_PROP_MEATGRINDER_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_MEATGRINDER_2
vSize.x = cfCMHDZ_SLAUGHTERHOUSE_PROP_MEATGRINDER_SPRITE_WIDTH
vSize.y = cfCMHDZ_SLAUGHTERHOUSE_PROP_MEATGRINDER_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_BODYBAG_1
vSize.x = cfCMHDZ_SLAUGHTERHOUSE_PROP_HANGING_BODYBAG_1_SPRITE_WIDTH
vSize.y = cfCMHDZ_SLAUGHTERHOUSE_PROP_HANGING_BODYBAG_1_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_BODYBAG_2
vSize.x = cfCMHDZ_SLAUGHTERHOUSE_PROP_HANGING_BODYBAG_2_SPRITE_WIDTH
vSize.y = cfCMHDZ_SLAUGHTERHOUSE_PROP_HANGING_BODYBAG_2_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_BODYBAG_3
vSize.x = cfCMHDZ_SLAUGHTERHOUSE_PROP_HANGING_BODYBAG_3_SPRITE_WIDTH
vSize.y = cfCMHDZ_SLAUGHTERHOUSE_PROP_HANGING_BODYBAG_3_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_BODYBAG_FLOOR_1
vSize.x = cfCMHDZ_SLAUGHTERHOUSE_PROP_BODYBAG_1_SPRITE_WIDTH
vSize.y = cfCMHDZ_SLAUGHTERHOUSE_PROP_BODYBAG_1_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_BODYBAG_FLOOR_2
vSize.x = cfCMHDZ_SLAUGHTERHOUSE_PROP_BODYBAG_2_SPRITE_WIDTH
vSize.y = cfCMHDZ_SLAUGHTERHOUSE_PROP_BODYBAG_2_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_BODYBAG_FLOOR_3
vSize.x = cfCMHDZ_SLAUGHTERHOUSE_PROP_BODYBAG_2_SPRITE_WIDTH
vSize.y = cfCMHDZ_SLAUGHTERHOUSE_PROP_BODYBAG_2_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_PIG
vSize.x = cfCMHDZ_SLAUGHTERHOUSE_PIG_SPRITE_WIDTH
vSize.y = cfCMHDZ_SLAUGHTERHOUSE_PIG_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_WATER_TOWER
vSize.x = cfCMHDZ_WATER_TOWER_SPRITE_WIDTH
vSize.y = cfCMHDZ_WATER_TOWER_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_MEATHOOK
vSize.x = 28
vSize.y = 104
BREAK
CASE CMHDZ_ASSET_PIG_BATCH
vSize.x = 384
vSize.y = 456
BREAK
CASE CMHDZ_ASSET_DOOR_1
vSize.x = cfCMHDZ_SLAUGHTERHOUSE_PROP_DOOR_01_SPRITE_WIDTH
vSize.y = cfCMHDZ_SLAUGHTERHOUSE_PROP_DOOR_01_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_DOOR_2
vSize.x = cfCMHDZ_SLAUGHTERHOUSE_PROP_DOOR_02_SPRITE_WIDTH
vSize.y = cfCMHDZ_SLAUGHTERHOUSE_PROP_DOOR_02_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_WINDOW
vSize.x = cfCMHDZ_SLAUGHTERHOUSE_PROP_WINDOW_SPRITE_WIDTH
vSize.y = cfCMHDZ_SLAUGHTERHOUSE_PROP_WINDOW_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_SPECIAL_TNT_BARREL_1
vSize.x = cfCMHDZ_TNT_BARREL_1_SPRITE_WIDTH
vSize.y = cfCMHDZ_TNT_BARREL_1_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_SPECIAL_TNT_BARREL_2
vSize.x = cfCMHDZ_TNT_BARREL_2_SPRITE_WIDTH
vSize.y = cfCMHDZ_TNT_BARREL_2_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_TRASHBAG_BIG
vSize.x = cfCMHDZ_TRASHBAG_BIG_SPRITE_WIDTH
vSize.y = cfCMHDZ_TRASHBAG_BIG_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_TRASHBAG_SMALL
vSize.x = cfCMHDZ_TRASHBAG_SMALL_SPRITE_WIDTH
vSize.y = cfCMHDZ_TRASHBAG_SMALL_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_TRASHCAN_BIG_1
CASE CMHDZ_ASSET_TRASHCAN_BIG_2
vSize.x = cfCMHDZ_TRASHCAN_BIG_SPRITE_WIDTH
vSize.y = cfCMHDZ_TRASHCAN_BIG_SPRITE_HEIGHT
BREAK
CASE CMHDZ_ASSET_TRASHCAN_SMALL_1
CASE CMHDZ_ASSET_TRASHCAN_SMALL_2
vSize.x = cfCMHDZ_TRASHCAN_SMALL_SPRITE_WIDTH
vSize.y = cfCMHDZ_TRASHCAN_SMALL_SPRITE_HEIGHT
BREAK
ENDSWITCH
RETURN vSize
ENDFUNC
PROC CMHDZ_SET_DEFAULT_COVER_MAP_DATA(CMHDZ_COVER_MAP_DATA &dat, VECTOR_2D vPos, CMHDZ_ASSET_TYPES eType, INT iLane, BOOL bFarBackground = FALSE, BOOL bRemoveOffScreen = FALSE)
//SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(dat.eDataBits, CMHDZ_COVER_DATA_BITS_NEVER_RENDER, bNeverRender)
//SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(dat.eDataBits, CMHDZ_COVER_DATA_BITS_STOP_SCROLLING, bStopScrollingOnThisProp)
//SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(dat.eDataBits, CMHDZ_COVER_DATA_BITS_THIS_SCREEN_ONLY, bActiveThisScreenOnly)
SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(dat.eDataBits, CMHDZ_COVER_DATA_BITS_IS_FAR_BG, bFarBackground)
SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(dat.eDataBits, CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN, bRemoveOffScreen)
dat.eType = eType
dat.iCoverLane = iLane
dat.vSpriteInitialPos = vPos
dat.vSpritePos = vPos
dat.fActiveAtPoint = sCMHDZData.fOverallLevelProgression + (cfBASE_SCREEN_WIDTH/2.0) // Only used for placing new objects so place in middle of current screen.
dat.vSpriteSize = CMHDZ_COVER_UTIL_GET_TYPE_SIZE(eType)
ENDPROC
FUNC INT CMHDZ_GENERATE_COVER_MAP_DATA_CHECKSUM(CMHDZ_COVER_MAP_DATA &dat)
INT iChecksum = ENUM_TO_INT(dat.eDataBits)
iChecksum += ENUM_TO_INT(dat.eType)
iChecksum += FLOOR(dat.fActiveAtPoint)
iChecksum += dat.iCoverLane
iChecksum += VECTOR_FLAT_PACK(<<dat.vSpriteInitialPos.x, dat.vSpriteInitialPos.y, 0>>)
iChecksum += VECTOR_FLAT_PACK(<<dat.vSpriteSize.x, dat.vSpriteSize.y, 0>>)
RETURN iChecksum
ENDFUNC
PROC CMHDZ_COPY_COVER_TO_COVER_MAP(CMHDZ_COVER_MAP_DATA &dat, INT iCover)
UNUSED_PARAMETER(dat)
UNUSED_PARAMETER(iCover)
#IF IS_DEBUG_BUILD
dat.eType = sCMHDZData.sCoverData[iCover].eType
dat.fActiveAtPoint = sCMHDZData.sCoverData[iCover].fActiveAtPoint
dat.iCoverLane = sCMHDZData.sCoverData[iCover].iCoverLane
dat.vSpriteInitialPos = sCMHDZData.sCoverData[iCover].vSpriteInitialPos
dat.vSpritePos = sCMHDZData.sCoverData[iCover].vSpriteInitialPos
dat.vSpriteSize = CMHDZ_COVER_UTIL_GET_TYPE_SIZE(dat.eType)
CMHDZ_COVER_MAP_DATA_SET_BIT_BY_BOOL(dat, CMHDZ_COVER_DATA_BITS_IS_ANIMATED, CMHDZ_COVER_UTIL_IS_TYPE_ANIMATED(sCMHDZData.sCoverData[iCover].eType))
CMHDZ_COVER_MAP_DATA_SET_BIT_BY_BOOL(dat, CMHDZ_COVER_DATA_BITS_IS_SPECIAL_COVER, CMHDZ_COVER_UTIL_IS_TYPE_SPECIAL(sCMHDZData.sCoverData[iCover].eType))
CMHDZ_COVER_MAP_DATA_SET_BIT_BY_BOOL(dat, CMHDZ_COVER_DATA_BITS_IS_FAR_BG, CMHDZ_COVER_DATA_IS_BITMASK_SET(iCover, CMHDZ_COVER_DATA_BITS_IS_FAR_BG))
CMHDZ_COVER_MAP_DATA_SET_BIT_BY_BOOL(dat, CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN, CMHDZ_COVER_DATA_IS_BITMASK_SET(iCover, CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN))
#ENDIF
ENDPROC
PROC CMHDZ_COPY_COVER_MAP_TO_COVER(CMHDZ_COVER_MAP_DATA &dat, INT iCover)
IF dat.eType = CMHDZ_ASSET_INVALID
SCRIPT_ASSERT("[BAZ][CMHDZ_COPY_COVER_MAP_TO_COVER] Data will not populate correctly as type is invalid")
ENDIF
// CMHDZ_COVER_DATA_SET_BIT_BY_BOOL(iCover, CMHDZ_COVER_DATA_BITS_STOP_SCROLLING, IS_BITMASK_ENUM_AS_ENUM_SET(dat.eDataBits, CMHDZ_COVER_DATA_BITS_STOP_SCROLLING))
CMHDZ_COVER_DATA_SET_BIT_BY_BOOL(iCover, CMHDZ_COVER_DATA_BITS_IS_ANIMATED, CMHDZ_COVER_UTIL_IS_TYPE_ANIMATED(dat.eType))
CMHDZ_COVER_DATA_SET_BIT_BY_BOOL(iCover, CMHDZ_COVER_DATA_BITS_IS_SPECIAL_COVER, CMHDZ_COVER_UTIL_IS_TYPE_SPECIAL(dat.eType))
CMHDZ_COVER_DATA_SET_BIT_BY_BOOL(iCover, CMHDZ_COVER_DATA_BITS_IS_FAR_BG, IS_BITMASK_AS_ENUM_SET(dat.eDataBits, CMHDZ_COVER_DATA_BITS_IS_FAR_BG))
CMHDZ_COVER_DATA_SET_BIT_BY_BOOL(iCover, CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN, IS_BITMASK_AS_ENUM_SET(dat.eDataBits, CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN))
sCMHDZData.sCoverData[iCover].eType = dat.eType
sCMHDZData.sCoverData[iCover].fActiveAtPoint = dat.fActiveAtPoint
sCMHDZData.sCoverData[iCover].iCoverLane = dat.iCoverLane
sCMHDZData.sCoverData[iCover].vSpriteInitialPos = dat.vSpriteInitialPos
sCMHDZData.sCoverData[iCover].vSpriteSize = CMHDZ_COVER_UTIL_GET_TYPE_SIZE(dat.eType)
//sCMHDZData.sCoverData[iCover].eDataBits = dat.eDataBits
sCMHDZData.sCoverData[iCover].fCoverWidth = sCMHDZData.sCoverData[iCover].vSpriteSize.x
sCMHDZData.sCoverData[iCover].fCoverHeight = sCMHDZData.sCoverData[iCover].vSpriteSize.y
ENDPROC
FUNC INT CMHDZ_PARTITION_COVER_MAP_ARRAY(CMHDZ_COVER_MAP_DATA &sArray[], INT iLow, INT iHigh)
CMHDZ_COVER_MAP_DATA swap
FLOAT pivot = sArray[iHigh].vSpriteInitialPos.x
INT i = (iLow - 1)
INT j
FOR j = iLow TO iHigh - 1 STEP 1
IF (sArray[j].vSpriteInitialPos.x < pivot)
i ++
swap = sArray[i]
sArray[i] = sArray[j]
sArray[j] = swap
ENDIF
ENDFOR
swap = sArray[i + 1]
sArray[i + 1] = sArray[iHigh]
sArray[iHigh] = swap
RETURN i + 1
ENDFUNC
PROC CMHDZ_QUICK_SORT_COVER_MAP_ARRAY(CMHDZ_COVER_MAP_DATA &sArray[], INT iLow, INT iHigh)
INT pi
IF (iLow < iHigh)
pi = CMHDZ_PARTITION_COVER_MAP_ARRAY(sArray, iLow, iHigh)
CMHDZ_QUICK_SORT_COVER_MAP_ARRAY(sArray, iLow, pi - 1)
CMHDZ_QUICK_SORT_COVER_MAP_ARRAY(sArray, pi + 1, iHigh)
ENDIF
ENDPROC
PROC CMHDZ_RESET_ALL_COVER_MAP_DATA(CMHDZ_COVER_MAP_DATA &src[])
INT i
REPEAT ciCMHDZ_MAX_COVER i
CMHDZ_RESET_COVER_MAP_DATA(src[i])
IF (i < sCMHDZData.iNumberOfProps)
CMHDZ_COPY_COVER_TO_COVER_MAP(src[i], i)
ENDIF
ENDREPEAT
ENDPROC
//PROC CMHDZ_RESET_ALL_COVER_MAP_DATA(CMHDZ_COVER_MAP_DATA &src[])
// INT i
//
// REPEAT COUNT_OF(src) i
// CMHDZ_RESET_COVER_MAP_DATA(src[i])
// ENDREPEAT
//ENDPROC
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Exports a Spawn Definition to script
/// PARAMS:
/// data -
/// bOpenAndCloseFile -
PROC CMHDZ_DEBUG_EXPORT_COVER_MAP_DATA_TO_SCRIPT(CMHDZ_COVER_MAP_DATA &data, INT iCoverID, BOOL bOpenAndCloseFile = TRUE)
IF (bOpenAndCloseFile)
OPEN_DEBUG_FILE()
ENDIF
SAVE_STRING_TO_DEBUG_FILE(" // ")
SAVE_INT_TO_DEBUG_FILE(iCoverID)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(" CMHDZ_ADD_COVER_TO_LIST(")
SAVE_STRING_TO_DEBUG_FILE("INIT_VECTOR_2D(")
SAVE_FLOAT_TO_DEBUG_FILE(data.vSpriteInitialPos.x)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_FLOAT_TO_DEBUG_FILE(data.vSpriteInitialPos.y)
SAVE_STRING_TO_DEBUG_FILE("), ")
// SAVE_STRING_TO_DEBUG_FILE("INIT_VECTOR_2D(")
// SAVE_FLOAT_TO_DEBUG_FILE(data.vSpriteSize.x)
// SAVE_STRING_TO_DEBUG_FILE(", ")
// SAVE_FLOAT_TO_DEBUG_FILE(data.vSpriteSize.y)
// SAVE_STRING_TO_DEBUG_FILE("), ")
SAVE_STRING_TO_DEBUG_FILE(CMHDZ_ASSET_TYPES_TO_STRING(data.eType))
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_STRING_TO_DEBUG_FILE(CMHDZ_LANE_TO_STRING(data.iCoverLane))
SAVE_STRING_TO_DEBUG_FILE(", ")
// SAVE_STRING_TO_DEBUG_FILE(CMHDZ_SCREEN_TO_STRING(ROUND(data.fActiveAtPoint)))
// SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_STRING_TO_DEBUG_FILE(GET_STRING_FROM_BOOL(IS_BITMASK_ENUM_AS_ENUM_SET(data.eDataBits, CMHDZ_COVER_DATA_BITS_IS_FAR_BG)))
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_STRING_TO_DEBUG_FILE(GET_STRING_FROM_BOOL(IS_BITMASK_ENUM_AS_ENUM_SET(data.eDataBits, CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN)))
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
IF (bOpenAndCloseFile)
CLOSE_DEBUG_FILE()
ENDIF
ENDPROC
PROC CMHDZ_DEBUG_EXPORT_COVER_MAP_DATA_ARRAY_TO_SCRIPT(CMHDZ_COVER_MAP_DATA &data[])
INT i
TEXT_LABEL_63 txt63
txt63 = " // Cover Data List - "
txt63 += CMHDZ_LEVELS_TO_STRING(sCMHDZData.eCurrentLevel)
OPEN_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(txt63)
SAVE_NEWLINE_TO_DEBUG_FILE()
//REPEAT 4 iScreen
// bStageMarker = FALSE
REPEAT COUNT_OF(data) i
IF (data[i].eType = CMHDZ_ASSET_INVALID)
RELOOP
ENDIF
//IF (iLastScreen != data[i].iScreen)
// SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE(" // Screen ")
// //SAVE_INT_TO_DEBUG_FILE(data[i].iScreen)
// SAVE_NEWLINE_TO_DEBUG_FILE()
//ENDIF
CMHDZ_DEBUG_EXPORT_COVER_MAP_DATA_TO_SCRIPT(data[i], i, FALSE)
//iLastScreen = data[i].iScreen
ENDREPEAT
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
ENDPROC
#ENDIF
// Cover and props
PROC CMHDZ_ADD_COVER_TO_LIST(VECTOR_2D vPos, CMHDZ_ASSET_TYPES eType, INT iLane, BOOL bIsFarBG = FALSE, BOOL bRemoveOffScreen = FALSE)
IF sCMHDZData.iNumberOfProps >= ciCMHDZ_MAX_COVER
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_ADD_COVER_TO_LIST] Not adding TYpe: ", CMHDZ_ASSET_TYPES_TO_STRING(eType), " as array full")
#ENDIF
EXIT
ENDIF
VECTOR_2D vSize = CMHDZ_COVER_UTIL_GET_TYPE_SIZE(eType)
IF vSize.x <= 0.0
TEXT_LABEL_63 sAssert = "[ADD_COVER_TO_LIST] Sprite scale showing as 0.0. Asset num: "
sAssert += ENUM_TO_INT(eType)
SCRIPT_ASSERT(sAssert)
// Obviously wrong
vSize.x = 700
vSize.y = 700
ENDIF
sCMHDZData.sCoverData[sCMHDZData.iNumberOfProps].fCoverWidth = vSize.x
sCMHDZData.sCoverData[sCMHDZData.iNumberOfProps].fCoverHeight = vSize.y
// What point in the overall progression should this item appear.
sCMHDZData.sCoverData[sCMHDZData.iNumberOfProps].fActiveAtPoint = vPos.x //- (1920 - cfLEFT_SCREEN_LIMIT)
sCMHDZData.sCoverData[sCMHDZData.iNumberOfProps].vSpritePos = vPos
sCMHDZData.sCoverData[sCMHDZData.iNumberOfProps].vSpriteInitialPos = vPos
sCMHDZData.sCoverData[sCMHDZData.iNumberOfProps].vSpriteSize = vSize
sCMHDZData.sCoverData[sCMHDZData.iNumberOfProps].eType = eType
sCMHDZData.sCoverData[sCMHDZData.iNumberOfProps].iCoverLane = iLane
CMHDZ_COVER_DATA_SET_BIT_BY_BOOL(sCMHDZData.iNumberOfProps, CMHDZ_COVER_DATA_BITS_IS_FAR_BG, bIsFarBG)
CMHDZ_COVER_DATA_SET_BIT_BY_BOOL(sCMHDZData.iNumberOfProps, CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN, bRemoveOffScreen)
IF CMHDZ_COVER_UTIL_IS_TYPE_ANIMATED(eType)
CMHDZ_COVER_DATA_SET_BIT_BY_BOOL(sCMHDZData.iNumberOfProps, CMHDZ_COVER_DATA_BITS_IS_ANIMATED, TRUE)
ENDIF
IF CMHDZ_COVER_UTIL_IS_TYPE_SPECIAL(eType)
CMHDZ_COVER_DATA_SET_BIT_BY_BOOL(sCMHDZData.iNumberOfProps, CMHDZ_COVER_DATA_BITS_IS_SPECIAL_COVER, TRUE)
ENDIF
sCMHDZData.iNumberOfProps++
ENDPROC
PROC CMHDZ_COPY_COVER_MAP_DATA_TO_GAME(CMHDZ_COVER_MAP_DATA &src[])
INT i
sCMHDZData.iNumberOfProps = 0
// REPEAT COUNT_OF(sCMHDZData.iPropToStopOn) i
// sCMHDZData.iPropToStopOn[i] = -1
// ENDREPEAT
REPEAT ciCMHDZ_MAX_COVER i
CMHDZ_RESET_COVER(i)
IF (src[i].eType != CMHDZ_ASSET_INVALID)
CMHDZ_ADD_COVER_TO_LIST(src[i].vSpriteInitialPos, src[i].eType, src[i].iCoverLane
#IF IS_DEBUG_BUILD
,CMHDZ_COVER_MAP_DATA_IS_BITMASK_SET(src[i], CMHDZ_COVER_DATA_BITS_IS_FAR_BG),
CMHDZ_COVER_MAP_DATA_IS_BITMASK_SET(src[i], CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN)
#ENDIF
)
ENDIF
ENDREPEAT
ENDPROC
PROC CMHDZ_INIT_COVER_POINTS(CMHDZ_LEVELS level)
sCMHDZData.iNumberOfProps = 0
SWITCH level
CASE CMHDZ_LEVEL_CITY
// Cover Data List - CMHDZ_LEVEL_CITY
// 0
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(891.5327, 1105.7385), CMHDZ_ASSET_FOREGROUND_TRASH, ciCMHDZ_LANE_FOREGROUND, FALSE, FALSE)
// 1
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(563.5327, 417.7386), CMHDZ_ASSET_CITY_BUILDING_3, ciCMHDZ_LANE_BACKGROUND, FALSE, FALSE)
// 2
// CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1763.7964, 449.1813), CMHDZ_ASSET_CITY_BUILDING_2, ciCMHDZ_LANE_BACKGROUND, FALSE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1263.5327, 417.7386), CMHDZ_ASSET_CITY_BUILDING_3, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// 6
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1483.0000, 810.0000), CMHDZ_ASSET_CITY_BUILDING_1, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
// 3
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1915.7375, 430.6459), CMHDZ_ASSET_TRASHCAN_BIG_1, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1929.0000, 442.0000), CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
// 4
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2500.5327, 1105.7386), CMHDZ_ASSET_FOREGROUND_TRASH, ciCMHDZ_LANE_FOREGROUND, FALSE, FALSE)
// 5
// CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2914.0066, 445.1742), CMHDZ_ASSET_CITY_BUILDING_3, ciCMHDZ_LANE_BACKGROUND, FALSE, FALSE)
// 7
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2467.0000, 498.0000), CMHDZ_ASSET_BARRIER, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// 8
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3372.0000, 802.0000), CMHDZ_ASSET_TRASHCAN_BIG_2, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
// 9
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3392.0000, 830.0000), CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
// 15
//CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3552.0000, 454.0000), CMHDZ_ASSET_TRASHBAG_SMALL, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// 3
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3655.7375, 420.0), CMHDZ_ASSET_TRASHCAN_BIG_1, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3685.0000, 442.0000), CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
// 10
// CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(4100.0000, 450.0000), CMHDZ_ASSET_CITY_BUILDING_1, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(4100.0000, 660.0000), CMHDZ_ASSET_BARRIER, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(4624.0000, 348.0000), CMHDZ_ASSET_CITY_BUILDING_2, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
// 16
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(7390.0000, 612.0000), CMHDZ_ASSET_TRASHCAN_BIG_1, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
//CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(7362.0000, 632.0000), CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
// 11
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(5694.0000, 546.0000), CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// 12
// CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(6388.0000, 706.0000), CMHDZ_ASSET_TRASHCAN_BIG_2, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
// // 13
// CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(6408.0000, 734.0000), CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
// 14
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(7752.0000, 456.0000), CMHDZ_ASSET_CITY_BUILDING_3, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// 17
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(7368.0000, 672.0000), CMHDZ_ASSET_TRASHCAN_BIG_2, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(7390.0000, 692.0000), CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
// 18
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(6888.0000, 672.0000), CMHDZ_ASSET_BARRIER, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
// 19
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(6988.0000, 624.0000), CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_BACKGROUND, TRUE, TRUE)
BREAK
CASE CMHDZ_LEVEL_SCRAPYARD
// Cover Data List
// 0
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(731.0000, 394.1250), CMHDZ_ASSET_WATER_TOWER, ciCMHDZ_LANE_BACKGROUND, FALSE)
// 1
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(360.0000, 590.0000), CMHDZ_ASSET_CACTUS_2, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// 2
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(900.0000, 857.3750), CMHDZ_ASSET_SCRAPYARD_MD_CAR_1, ciCMHDZ_LANE_MIDDLE, FALSE)
// 3
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1343.2500, 490.0000), CMHDZ_ASSET_SCRAPYARD_MD_VAN_2, ciCMHDZ_LANE_BACKGROUND, FALSE)
// 4
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1913.0000, 562.3750), CMHDZ_ASSET_SCRAPYARD_MD_CAR_2, ciCMHDZ_LANE_BACKGROUND, FALSE)
// 5
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1550.0000, 790.0000), CMHDZ_ASSET_CACTUS_1, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
// 6
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1800.0000, 988.1250), CMHDZ_ASSET_CACTUS_3, ciCMHDZ_LANE_FOREGROUND, FALSE)
// 7
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2203.2500, 460.0000), CMHDZ_ASSET_SCRAPYARD_MD_VAN_3, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// 8
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2745.5000, 513.0000), CMHDZ_ASSET_FENCE, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// 9
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2900.0000, 864.3750), CMHDZ_ASSET_SCRAPYARD_MD_CAR_1, ciCMHDZ_LANE_MIDDLE, FALSE)
// 10
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3213.2500, 600.0000), CMHDZ_ASSET_BARRELS, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// 11
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3105.0000, 877.1250), CMHDZ_ASSET_CACTUS_2, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
// 12
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3675.0000, 480.1250), CMHDZ_ASSET_SCRAPYARD_MD_VAN_1, ciCMHDZ_LANE_BACKGROUND, FALSE)
// 13
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(4090.0000, 540.5468), CMHDZ_ASSET_CACTUS_1, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// 14
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(4240.0000, 1040.0000), CMHDZ_ASSET_CACTUS_3, ciCMHDZ_LANE_FOREGROUND, FALSE)
// 15
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(4289.6250, 440.6250), CMHDZ_ASSET_CACTUS_9, ciCMHDZ_LANE_BACKGROUND, TRUE, TRUE)
// 16
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(4640.7949, 738.5468), CMHDZ_ASSET_SCRAPYARD_MD_CAR_3, ciCMHDZ_LANE_MIDDLE, FALSE)
// 17
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(7151.2500, 464.0000), CMHDZ_ASSET_SCRAPYARD_MD_VAN_3, ciCMHDZ_LANE_BACKGROUND, FALSE)
// 20
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(9120.0000, 444.0000), CMHDZ_ASSET_SCRAPYARD_MD_VAN_4, ciCMHDZ_LANE_BACKGROUND, FALSE, FALSE)
// 21
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(9888.0000, 396.0000), CMHDZ_ASSET_CACTUS_3, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
// 18
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(11420.0000, 950.0000), CMHDZ_ASSET_CACTUS_2, ciCMHDZ_LANE_FOREGROUND, FALSE)
// 19
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(16518.0000, 718.3750), CMHDZ_ASSET_SCRAPYARD_MD_CAR_3, ciCMHDZ_LANE_MIDDLE, FALSE)
BREAK
CASE CMHDZ_LEVEL_ASYLUM
// Cover Data List - CMHDZ_LEVEL_ASYLUM
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(480.0000, 610.0000), CMHDZ_ASSET_ROCK_SMALL, ciCMHDZ_LANE_BACKGROUND, FALSE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(480.0000, 648.0000), CMHDZ_ASSET_GRASS, ciCMHDZ_LANE_BACKGROUND, FALSE, FALSE)
// 2
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1675.0000, 350.7500), CMHDZ_ASSET_TRASHCAN_BIG_1, ciCMHDZ_LANE_BACKGROUND, TRUE, TRUE)
// 3
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1705.0000, 358.7500), CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_BACKGROUND, TRUE, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3969.0000, 358.7500), CMHDZ_ASSET_TRASHCAN_BIG_2, ciCMHDZ_LANE_BACKGROUND, TRUE, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(4115.0000, 185.7500), CMHDZ_ASSET_ASYLUM_GRAFFITI_1, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(4555.0000, 350.7500), CMHDZ_ASSET_TRASHCAN_BIG_1, ciCMHDZ_LANE_BACKGROUND, TRUE, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2136.0000, 784.0000), CMHDZ_ASSET_ASYLUM_MD_WHEELCHAIR, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(707.0000, 760.0000), CMHDZ_ASSET_ASYLUM_MD_BED, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(891.5327, 917.7386), CMHDZ_ASSET_FOREGROUND_TRASH, ciCMHDZ_LANE_FOREGROUND, FALSE, FALSE)
// One offs
// 27
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(4304.0000, 468.0000), CMHDZ_ASSET_ASYLUM_MD_MATTRESS, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// 28
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(5012.0000, 468.0000), CMHDZ_ASSET_TRASHCAN_BIG_2, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// 29
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(5046.0000, 516.0000), CMHDZ_ASSET_TRASHCAN_BIG_1, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(650.0693, 300.0000), CMHDZ_ASSET_ASYLUM_BG_DOOR, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3336.0000, 432.0000), CMHDZ_ASSET_ASYLUM_MD_WHEELCHAIR, ciCMHDZ_LANE_BACKGROUND, FALSE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1260.0000, 300.0000), CMHDZ_ASSET_ASYLUM_BG_DOOR, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2432.4290, 300.0000), CMHDZ_ASSET_ASYLUM_BG_DOOR, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2732.0000, 333.8490), CMHDZ_ASSET_ASYLUM_BG_RADIATOR, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3292.2500, 89.9648), CMHDZ_ASSET_ASYLUM_LIGHT_2, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1256.4404, 80.0000), CMHDZ_ASSET_ASYLUM_LIGHT_1, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(715.0000, 187.7500), CMHDZ_ASSET_ASYLUM_GRAFFITI_3, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(111.2329, 179.1774), CMHDZ_ASSET_ASYLUM_GRAFFITI_2, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1415.0000, 183.7500), CMHDZ_ASSET_ASYLUM_GRAFFITI_1, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1711.2329, 177.1774), CMHDZ_ASSET_ASYLUM_GRAFFITI_2, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2115.0000, 185.7500), CMHDZ_ASSET_ASYLUM_GRAFFITI_1, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2815.0000, 182.7500), CMHDZ_ASSET_ASYLUM_GRAFFITI_3, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3636.0000, 1100.0000), CMHDZ_ASSET_ASYLUM_MD_MATTRESS, ciCMHDZ_LANE_FOREGROUND, FALSE, FALSE)
// Final screen
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(7828.0000, 390.0000), CMHDZ_ASSET_ASYLUM_MD_MATTRESS, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(7538.0000, 780.0000), CMHDZ_ASSET_TRASHCAN_BIG_2, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(7898.0000, 440.0000), CMHDZ_ASSET_ASYLUM_MD_BED, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(7898.0000, 820.0000), CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
BREAK
CASE CMHDZ_LEVEL_PARK
// Cover Data List - CMHDZ_LEVEL_PARK
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(872.0000, 900.0000), CMHDZ_ASSET_THEMEPARK_TREE_1, ciCMHDZ_LANE_FOREGROUND, FALSE, FALSE)
// 0
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1212.5034, 351.4268), CMHDZ_ASSET_THEMEPARK_BUILDING_1, ciCMHDZ_LANE_BACKGROUND, FALSE, FALSE)
// 1
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(772.0000, 688.0000), CMHDZ_ASSET_THEMEPARK_CLOWNBOARD_2, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
// 2
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1442.0000, 268.0000), CMHDZ_ASSET_THEMEPARK_TREE_3, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
// 13
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2115.5751, 796.0000), CMHDZ_ASSET_THEMEPARK_CLOWNBOARD_1, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
// 3
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1877.2715, 803.3350), CMHDZ_ASSET_TRASHCAN_BIG_2, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
// 4
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2070.5881, 338.6382), CMHDZ_ASSET_THEMEPARK_BUILDING_2, ciCMHDZ_LANE_BACKGROUND, FALSE, FALSE)
// 5
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2355.2500, 1000.6147), CMHDZ_ASSET_TRASHCAN_BIG_1, ciCMHDZ_LANE_FOREGROUND, FALSE, FALSE)
// 6
//CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(4384.0000, 924.0000), CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_FOREGROUND, FALSE, FALSE)
// 7
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2916.0127, 364.8707), CMHDZ_ASSET_THEMEPARK_BUILDING_3, ciCMHDZ_LANE_BACKGROUND, FALSE, FALSE)
// 8
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3588.8809, 327.3298), CMHDZ_ASSET_THEMEPARK_BUILDING_2, ciCMHDZ_LANE_BACKGROUND, TRUE, FALSE)
// 9
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3761.8198, 483.5000), CMHDZ_ASSET_BARRELS, ciCMHDZ_LANE_BACKGROUND, FALSE, FALSE)
// 10
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(5140.0000, 540.0000), CMHDZ_ASSET_THEMEPARK_BUILDING_4, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
// 11
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(4580.0000, 246.2417), CMHDZ_ASSET_THEMEPARK_BUILDING_3, ciCMHDZ_LANE_BACKGROUND, TRUE, TRUE)
// 12
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(6376.9878, 1000.7474), CMHDZ_ASSET_TRASHCAN_BIG_2, ciCMHDZ_LANE_FOREGROUND, FALSE, TRUE)
// 14
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3592.5000, 760.0000), CMHDZ_ASSET_ROCK_LARGE, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
// 15
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(5403.7500, 704.0000), CMHDZ_ASSET_TRASHCAN_BIG_2, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
// 16
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(5423.7500, 732.0000), CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
// 17
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(6491.0000, 480.0000), CMHDZ_ASSET_THEMEPARK_BUILDING_3, ciCMHDZ_LANE_BACKGROUND, FALSE, FALSE)
// 18
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(8642.0000, 790.0000), CMHDZ_ASSET_ROCK_LARGE, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
// 19
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(8840.1650, 272.0000), CMHDZ_ASSET_THEMEPARK_TREE_3, ciCMHDZ_LANE_BACKGROUND, TRUE, TRUE)
// 20
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(9620.2529, 848.5654), CMHDZ_ASSET_THEMEPARK_CLOWNBOARD_2, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
// 21
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(9132.0000, 713.5000), CMHDZ_ASSET_BARRELS, ciCMHDZ_LANE_MIDDLE, FALSE, TRUE)
// 22
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(9672.0000, 276.0000), CMHDZ_ASSET_THEMEPARK_TREE_2, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
BREAK
// Cover Data List - CMHDZ_LEVEL_SLAUGHTERHOUSE
CASE CMHDZ_LEVEL_SLAUGHTERHOUSE
// Screen 1
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(380.1250, 54.6250), CMHDZ_ASSET_PIG, ciCMHDZ_LANE_BACKGROUND, TRUE, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(500, 296), CMHDZ_ASSET_DOOR_1, ciCMHDZ_LANE_BACKGROUND, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2120.1250, 40.6250), CMHDZ_ASSET_PIG, ciCMHDZ_LANE_FOREGROUND, FALSE, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2920.1250, 40.6250), CMHDZ_ASSET_PIG, ciCMHDZ_LANE_FOREGROUND, FALSE, TRUE)
// Screen 2
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1700, 296), CMHDZ_ASSET_DOOR_2, ciCMHDZ_LANE_BACKGROUND, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1006.3750, 328.5000), CMHDZ_ASSET_MEATGRINDER_2, ciCMHDZ_LANE_BACKGROUND, DEFAULT, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1134.5000, 1000.8750), CMHDZ_ASSET_BODYBAG_FLOOR_1, ciCMHDZ_LANE_FOREGROUND)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(1886.1250, 104.6250), CMHDZ_ASSET_PIG, ciCMHDZ_LANE_BACKGROUND, TRUE, TRUE)
// Screen 3
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2134.7500, 84.6250), CMHDZ_ASSET_PIG, ciCMHDZ_LANE_BACKGROUND, TRUE, TRUE)
//CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3086.0000, 84.6250), CMHDZ_ASSET_PIG_BATCH, ciCMHDZ_LANE_BACKGROUND, TRUE, T)
// Screen 4
// CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(2791.5000, 768.8750), CMHDZ_ASSET_BODYBAG_FLOOR_3, ciCMHDZ_LANE_MIDDLE, DEFAULT, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3642.3750, 94.0), CMHDZ_ASSET_MEATHOOK, ciCMHDZ_LANE_FOREGROUND)
// CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3811.0000, 574.0000), CMHDZ_ASSET_MEATGRINDER_1, ciCMHDZ_LANE_MIDDLE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(3900, 220), CMHDZ_ASSET_WINDOW, ciCMHDZ_LANE_BACKGROUND, TRUE)
// 21
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(4056.0000, 588.0000), CMHDZ_ASSET_MEATGRINDER_1, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(5056.0000, 708.0000), CMHDZ_ASSET_BODYBAG_FLOOR_2, ciCMHDZ_LANE_MIDDLE, FALSE, FALSE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(5230.3750, 328.5000), CMHDZ_ASSET_MEATGRINDER_2, ciCMHDZ_LANE_BACKGROUND, DEFAULT, TRUE)
// // Final screen
// CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(25306.3750, 628.5000), CMHDZ_ASSET_MEATGRINDER_2, ciCMHDZ_LANE_MIDDLE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(
(CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SLAUGHTERHOUSE) * cfCMHDZ_SCREEN_LENGTH) + 400,
84.5000),
CMHDZ_ASSET_PIG, ciCMHDZ_LANE_BACKGROUND,
TRUE, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(
(CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SLAUGHTERHOUSE) * cfCMHDZ_SCREEN_LENGTH) + 1140,
84.5000),
CMHDZ_ASSET_PIG, ciCMHDZ_LANE_BACKGROUND,
TRUE, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(
(CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SLAUGHTERHOUSE) * cfCMHDZ_SCREEN_LENGTH) + 1680,
818.5000),
CMHDZ_ASSET_MEATGRINDER_1, ciCMHDZ_LANE_MIDDLE,
DEFAULT, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(
(CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SLAUGHTERHOUSE) * cfCMHDZ_SCREEN_LENGTH) + 696,
495.5000),
CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_BACKGROUND,
DEFAULT, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(
(CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SLAUGHTERHOUSE) * cfCMHDZ_SCREEN_LENGTH) + 720,
500.5000),
CMHDZ_ASSET_TRASHCAN_BIG_1, ciCMHDZ_LANE_BACKGROUND,
DEFAULT, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(
(CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SLAUGHTERHOUSE) * cfCMHDZ_SCREEN_LENGTH) + 1140,
510.5000),
CMHDZ_ASSET_TRASHCAN_BIG_2, ciCMHDZ_LANE_BACKGROUND,
DEFAULT, TRUE)
CMHDZ_ADD_COVER_TO_LIST(INIT_VECTOR_2D(
(CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SLAUGHTERHOUSE) * cfCMHDZ_SCREEN_LENGTH) + 1160,
526.0000), CMHDZ_ASSET_TRASHBAG_BIG, ciCMHDZ_LANE_BACKGROUND, DEFAULT, TRUE)
BREAK
ENDSWITCH
ENDPROC
//-------------------------------------
// PROJECTILE FUNCTIONS
//-------------------------------------
PROC CMHDZ_RESET_ENEMY_THROWN_PROJECTILE(INT iThrown)
sCMHDZData.sEnemyProjectiles[iThrown].eState = CMHDZ_PROJECTILE_STATE_INACTIVE
sCMHDZData.sEnemyProjectiles[iThrown].iSpriteAnimFrame = 0
ENDPROC
PROC CMHDZ_RESET_PLAYER_THROWN_PROJECTILE(INT iPlayer, INT iThrown)
IF (iThrown < 0) OR (iThrown >= ciCMHDZ_MAX_PLAYER_THROWN_PROJECTILES)
EXIT
ENDIF
sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[iThrown].eState = CMHDZ_PROJECTILE_STATE_INACTIVE
sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[iThrown].iSpriteAnimFrame = 0
ENDPROC
PROC CMHDZ_RESET_ALL_PLAYER_THROWN_PROJECTILES(INT iPlayer)
INT i
REPEAT ciCMHDZ_MAX_PLAYER_THROWN_PROJECTILES i
CMHDZ_RESET_PLAYER_THROWN_PROJECTILE(iPlayer, i)
ENDREPEAT
sCMHDZData.sPlayerData[iPlayer].iNumberOfThrownProjectiles = 0
sCMHDZData.sPlayerData[iPlayer].iLastThrownProjectileTime = GET_GAME_TIMER()
ENDPROC
//-------------------------------------
// ENEMY FUNCTIONS
//-------------------------------------
PROC CMHDZ_RESET_ENEMY_MAP_DATA(CMHDZ_ENEMY_MAP_DATA &dat)
dat.eDataBits = CMHDZ_ENEMY_DATA_BITS_NONE
dat.eEnemyType = CMHDZ_ENEMY_INVALID
dat.fStoppingPos = 500.0
dat.iLane = 0
dat.fPointToAppear = 0
ENDPROC
FUNC INT CMHDZ_GET_ENEMY_MAP_DATA_SLOT(CMHDZ_ENEMY_MAP_DATA &array[])
INT i
REPEAT COUNT_OF(array) i
IF (array[i].eEnemyType = CMHDZ_ENEMY_INVALID)
RETURN i
ENDIF
ENDREPEAT
RETURN -1
ENDFUNC
PROC CMHDZ_RESET_ENEMY(INT iEnemy)
sCMHDZData.sEnemyData[iEnemy].eDataBits = CMHDZ_ENEMY_DATA_BITS_NONE
sCMHDZData.sEnemyData[iEnemy].eState = CMHDZ_ENEMY_STATE_INACTIVE
sCMHDZData.sEnemyData[iEnemy].fPointToAppear = 0
sCMHDZData.sEnemyData[iEnemy].iHealth = 10
sCMHDZData.sEnemyData[iEnemy].vSpritePos.x = 0.0
sCMHDZData.sEnemyData[iEnemy].vSpritePos.y = 0.0
sCMHDZData.sEnemyData[iEnemy].vSize.x = 0.0
sCMHDZData.sEnemyData[iEnemy].vSize.y = 0.0
sCMHDZData.sEnemyData[iEnemy].fStoppingX = 0.0
sCMHDZData.sEnemyData[iEnemy].iEnemyType = CMHDZ_ENEMY_1
sCMHDZData.sEnemyData[iEnemy].iEnemyLane = 0
sCMHDZData.sEnemyData[iEnemy].iSpriteAnimFrame = 0
sCMHDZData.sEnemyData[iEnemy].iWarpedForMovingLevelCount = 0
sCMHDZData.sEnemyData[iEnemy].iRenderAfterWarpedCount = 0
sCMHDZData.sEnemyData[iEnemy].iPopUpTime = 0
// replace these with a bit set
//sCMHDZData.sEnemyData[iEnemy].bReverse = FALSE
//sCMHDZData.sEnemyData[iEnemy].bIsPopup = FALSE
//sCMHDZData.sEnemyData[iEnemy].bPlayedAimAudio = FALSE
//sCMHDZData.sEnemyData[iEnemy].bPlayedCriticalWarningAudio = FALSE
//sCMHDZData.sEnemyData[iEnemy].bWaitUntilLevelStationary = FALSE
//sCMHDZData.sEnemyData[iEnemy].bShotAtLeastOnce = FALSE
//sCMHDZData.sEnemyData[iEnemy].bThrownProjectile = FALSE
//sCMHDZData.sEnemyData[iEnemy].bOuthouseAudio = FALSE
//sCMHDZData.sEnemyData[iEnemy].bAppearedOnscreen = FALSE
ENDPROC
PROC CMHDZ_RESET_ENEMY_ARRAY()
INT i
REPEAT ciCMHDZ_MAX_ENEMIES i
CMHDZ_RESET_ENEMY(i)
sCMHDZData.sEnemyData[i].iEnemyType = CMHDZ_ENEMY_INVALID
ENDREPEAT
ENDPROC
FUNC INT CMHDZ_GET_FREE_SLOT_FOR_ENEMY()
INT iCurrentStage = CMHDZ_GET_CURRENT_LEVEL_SCREEN()
INT i
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_GET_FREE_SLOT_FOR_ENEMY] iCurrentStage: ", iCurrentStage)
REPEAT ciCMHDZ_MAX_ENEMIES i
IF iCurrentStage = 0
IF sCMHDZData.sEnemyData[i].vSize.x = 0.0
RETURN i
ELSE
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_GET_FREE_SLOT_FOR_ENEMY] sCMHDZData.sEnemyData[i].vSize.x : ", sCMHDZData.sEnemyData[i].vSize.x )
ENDIF
ELSE
IF sCMHDZData.sEnemyData[i].fPointToAppear < iCurrentStage
IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_INACTIVE
CMHDZ_RESET_ENEMY(i)
RETURN i
ENDIF
ENDIF
ENDIF
ENDREPEAT
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_GET_FREE_SLOT_FOR_ENEMY] {DSW} Failed to find slot")
RETURN -1
ENDFUNC
FUNC INT CMHDZ_GET_ENEMY_START_HEALTH_FOR_TYPE()
RETURN 10
ENDFUNC
FUNC VECTOR_2D CMHDZ_GET_ENEMY_SIZE_FOR_TYPE(CMHDZ_ENEMY_TYPES eType, BOOL bIsNotForeground = TRUE)
VECTOR_2D vSize
IF (bIsNotForeground)
SWITCH (eType)
CASE CMHDZ_ENEMY_1
CASE CMHDZ_ENEMY_2
CASE CMHDZ_ENEMY_3
CASE CMHDZ_ENEMY_4
CASE CMHDZ_ENEMY_5
vSize.x = cfCMHDZ_ENEMY_SPRITE_WIDTH
vSize.y = cfCMHDZ_ENEMY_SPRITE_HEIGHT
BREAK
CASE CMHDZ_RARE_ENEMY_BUNNY
CASE CMHDZ_RARE_ENEMY_MONKEY
vSize.x = 116
vSize.y = 196
BREAK
CASE CMHDZ_RARE_ENEMY_RAT
vSize.x = 140
vSize.y = 60
BREAK
CASE CMHDZ_THROWING_ENEMY_1
CASE CMHDZ_THROWING_ENEMY_2
CASE CMHDZ_THROWING_ENEMY_3
CASE CMHDZ_THROWING_ENEMY_4
CASE CMHDZ_THROWING_ENEMY_5
vSize.x = cfCMHDZ_ENEMY_THROWING_SPRITE_WIDTH
vSize.y = cfCMHDZ_ENEMY_THROWING_SPRITE_HEIGHT
BREAK
DEFAULT
vSize.x = cfCMHDZ_ENEMY_FOREGROUND_SPRITE_WIDTH
vSize.y = cfCMHDZ_ENEMY_FOREGROUND_SPRITE_HEIGHT
BREAK
ENDSWITCH
ELSE
vSize.x = cfCMHDZ_ENEMY_FOREGROUND_SPRITE_WIDTH
vSize.y = cfCMHDZ_ENEMY_FOREGROUND_SPRITE_HEIGHT
IF eType = CMHDZ_FOREGROUND_ENEMY_T5_2
vSize.x = cfCMHDZ_ENEMY_FOREGROUND_HERD_SPRITE_WIDTH
vSize.y = cfCMHDZ_ENEMY_FOREGROUND_HERD_SPRITE_HEIGHT
ENDIF
ENDIF
RETURN vSize
ENDFUNC
PROC CMHDZ_SET_ENEMY_MAP_DATA(CMHDZ_ENEMY_MAP_DATA &dat, VECTOR_2D vPos, FLOAT fStoppingPos, INT iLane, BOOL bFromLeft, CMHDZ_ENEMY_TYPES iType, FLOAT fPointToAppear, BOOL bWaitUntilScreenStationary, BOOL bIsPopup, INT iRenderAfterWarpedCount)
SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(dat.eDataBits, CMHDZ_ENEMY_DATA_BITS_WAIT_UNTIL_LEVEL_STATIONARY, bWaitUntilScreenStationary)
SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(dat.eDataBits, CMHDZ_ENEMY_DATA_BITS_IS_POPUP, bIsPopup)
SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(dat.eDataBits, CMHDZ_ENEMY_DATA_BITS_REVERSE, bFromLeft)
dat.eEnemyType = iType
dat.fStoppingPos = fStoppingPos
dat.iLane = iLane
dat.fPointToAppear = fPointToAppear
dat.vSpritePos = vPos
dat.iRenderAfterWarpCount = iRenderAfterWarpedCount
ENDPROC
FUNC INT CMHDZ_GENERATE_ENEMY_MAP_DATA_CHECKSUM(CMHDZ_ENEMY_MAP_DATA &dat)
INT iChecksum = ENUM_TO_INT(dat.eDataBits)
iChecksum += ENUM_TO_INT(dat.eEnemyType)
iChecksum += FLOOR(dat.fStoppingPos)
iChecksum += dat.iLane
iChecksum += FLOOR(dat.fPointToAppear)
iChecksum += VECTOR_FLAT_PACK(<<dat.vSpritePos.x, dat.vSpritePos.y, 0>>)
iChecksum += dat.iRenderAfterWarpCount
RETURN iChecksum
ENDFUNC
PROC CMHDZ_COPY_ENEMY_TO_ENEMY_MAP(INT iEnemy, CMHDZ_ENEMY_MAP_DATA &dat)
//CMHDZ_RESET_ENEMY_MAP_DATA(dat)
dat.eDataBits = sCMHDZData.sEnemyData[iEnemy].eDataBits
dat.eEnemyType = sCMHDZData.sEnemyData[iEnemy].iEnemyType
dat.fStoppingPos = sCMHDZData.sEnemyData[iEnemy].fStoppingX
dat.iLane = sCMHDZData.sEnemyData[iEnemy].iEnemyLane
dat.fPointToAppear = sCMHDZData.sEnemyData[iEnemy].fPointToAppear
dat.vSpritePos = sCMHDZData.sEnemyData[iEnemy].vStartPos
dat.iRenderAfterWarpCount = sCMHDZData.sEnemyData[iEnemy].iRenderAfterWarpedCount
dat.iStaticScreenPhase = sCMHDZData.sEnemyData[iEnemy].iStaticScreenPhase
ENDPROC
PROC CMHDZ_COPY_ENEMY_MAP_TO_ENEMY(CMHDZ_ENEMY_MAP_DATA &dat, INT iEnemy)
sCMHDZData.sEnemyData[iEnemy].iEnemyType = dat.eEnemyType
sCMHDZData.sEnemyData[iEnemy].fStoppingX = dat.fStoppingPos
sCMHDZData.sEnemyData[iEnemy].iEnemyLane = dat.iLane
sCMHDZData.sEnemyData[iEnemy].fPointToAppear = dat.fPointToAppear
sCMHDZData.sEnemyData[iEnemy].vStartPos = dat.vSpritePos
sCMHDZData.sEnemyData[iEnemy].iStaticScreenPhase = dat.iStaticScreenPhase
sCMHDZData.sEnemyData[iEnemy].vSize = CMHDZ_GET_ENEMY_SIZE_FOR_TYPE(dat.eEnemyType, dat.iLane != ciCMHDZ_LANE_FOREGROUND)
CMHDZ_ENEMY_DATA_SET_BIT_BY_BOOL(iEnemy, CMHDZ_ENEMY_DATA_BITS_REVERSE, IS_BITMASK_ENUM_AS_ENUM_SET(dat.eDataBits, CMHDZ_ENEMY_DATA_BITS_REVERSE))
CMHDZ_ENEMY_DATA_SET_BIT_BY_BOOL(iEnemy, CMHDZ_ENEMY_DATA_BITS_IS_POPUP, IS_BITMASK_ENUM_AS_ENUM_SET(dat.eDataBits, CMHDZ_ENEMY_DATA_BITS_IS_POPUP))
CMHDZ_ENEMY_DATA_SET_BIT_BY_BOOL(iEnemy, CMHDZ_ENEMY_DATA_BITS_WAIT_UNTIL_LEVEL_STATIONARY, IS_BITMASK_ENUM_AS_ENUM_SET(dat.eDataBits, CMHDZ_ENEMY_DATA_BITS_WAIT_UNTIL_LEVEL_STATIONARY))
//CMHDZ_ENEMY_DATA_BITS_WILL_INFLICT_MELEE_DAMAGE = BIT8,
//CMHDZ_ENEMY_DATA_BITS_IS_BONUS = BIT9
ENDPROC
PROC CMHDZ_RESET_ALL_ENEMY_MAP_DATA(CMHDZ_ENEMY_MAP_DATA &src[])
INT i
REPEAT ciCMHDZ_MAX_ENEMIES i
CMHDZ_RESET_ENEMY_MAP_DATA(src[i])
IF (i < sCMHDZData.iNumberOfEnemies)
CMHDZ_COPY_ENEMY_TO_ENEMY_MAP(i, src[i])
ENDIF
ENDREPEAT
ENDPROC
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Exports a Spawn Definition to script
/// PARAMS:
/// data -
/// bOpenAndCloseFile -
PROC CMHDZ_DEBUG_EXPORT_ENEMY_MAP_DATA_TO_SCRIPT(CMHDZ_ENEMY_MAP_DATA &data, INT iEnemyID, BOOL bOpenAndCloseFile = TRUE)
IF (bOpenAndCloseFile)
OPEN_DEBUG_FILE()
ENDIF
SAVE_STRING_TO_DEBUG_FILE(" // ")
SAVE_INT_TO_DEBUG_FILE(iEnemyID)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(" CMHDZ_ADD_ENEMY_TO_LIST(")
SAVE_FLOAT_TO_DEBUG_FILE(data.vSpritePos.x)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_FLOAT_TO_DEBUG_FILE(data.vSpritePos.y)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_FLOAT_TO_DEBUG_FILE(data.fStoppingPos)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_STRING_TO_DEBUG_FILE(CMHDZ_LANE_TO_STRING(data.iLane))
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_STRING_TO_DEBUG_FILE(GET_STRING_FROM_BOOL(IS_BITMASK_ENUM_AS_ENUM_SET(data.eDataBits, CMHDZ_ENEMY_DATA_BITS_REVERSE)))
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_STRING_TO_DEBUG_FILE(CMHDZ_ENEMY_TYPES_TO_STRING(data.eEnemyType))
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_FLOAT_TO_DEBUG_FILE(data.fPointToAppear)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_STRING_TO_DEBUG_FILE(GET_STRING_FROM_BOOL(IS_BITMASK_ENUM_AS_ENUM_SET(data.eDataBits, CMHDZ_ENEMY_DATA_BITS_WAIT_UNTIL_LEVEL_STATIONARY)))
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_STRING_TO_DEBUG_FILE(GET_STRING_FROM_BOOL(IS_BITMASK_ENUM_AS_ENUM_SET(data.eDataBits, CMHDZ_ENEMY_DATA_BITS_IS_POPUP)))
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_INT_TO_DEBUG_FILE(data.iRenderAfterWarpCount)
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
IF (bOpenAndCloseFile)
CLOSE_DEBUG_FILE()
ENDIF
ENDPROC
PROC CMHDZ_DEBUG_EXPORT_ENEMY_MAP_DATA_ARRAY_TO_SCRIPT(CMHDZ_ENEMY_MAP_DATA &data[])
INT i
TEXT_LABEL_63 txt63
//INT iScreen
// BOOL bStageMarker
// INT iPreviousLane
txt63 = " // Enemy Data List - "
txt63 += CMHDZ_LEVELS_TO_STRING(sCMHDZData.eCurrentLevel)
OPEN_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(txt63)
SAVE_NEWLINE_TO_DEBUG_FILE()
//REPEAT 4 iScreen
// bStageMarker = FALSE
REPEAT COUNT_OF(data) i
IF (data[i].eEnemyType = CMHDZ_ENEMY_INVALID)
RELOOP
ENDIF
// IF (data[i].fPointToAppear != iScreen)
// RELOOP
// ENDIF
// IF (bStageMarker = FALSE)
// SAVE_NEWLINE_TO_DEBUG_FILE()
// SAVE_STRING_TO_DEBUG_FILE(" // Stage ")
// SAVE_INT_TO_DEBUG_FILE(iScreen)
// SAVE_NEWLINE_TO_DEBUG_FILE()
// bStageMarker = TRUE
// ENDIF
// IF (iPreviousLane != data[i].iLane)
// iPreviousLane = data[i].iLane
// SAVE_NEWLINE_TO_DEBUG_FILE()
// ENDIF
CMHDZ_DEBUG_EXPORT_ENEMY_MAP_DATA_TO_SCRIPT(data[i], i, FALSE)
ENDREPEAT
//ENDREPEAT
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
ENDPROC
#ENDIF
// Enemies
PROC CMHDZ_ADD_ENEMY_COVER_POPUP(FLOAT fPointToAppear, VECTOR_2D fPos, INT iIndex = 0)
INT iRand
VECTOR_2D vPos
UNUSED_PARAMETER(iIndex)
UNUSED_PARAMETER(iRand)
// IF sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_CITY
//
// iRand = (iIndex%3)
//
// SWITCH iRand
// CASE 0
// vPos.y += 80
// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_CITY_BUILDING_1, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// BREAK
//
// CASE 1
// vPos.y += 80
// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_CITY_BUILDING_3, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// BREAK
//
// CASE 2
// vPos.y += 80
// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_CITY_BUILDING_2, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
// BREAK
// ENDSWITCH
//
// ENDIF
// Make switch if adopted throughout.
IF sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_ASYLUM
vPos = INIT_VECTOR_2D(fPointToAppear + fPos.x, fPos.Y)
//vPos.x += 196.0
vPos.y += 90
//vPos.x += cfLEFT_SCREEN_LIMIT
CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_ASYLUM_MD_MATTRESS, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
ENDIF
IF sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_SLAUGHTERHOUSE
vPos = INIT_VECTOR_2D(fPointToAppear + fPos.x, fPos.Y)
//vPos.x += 196.0
//vPos.y += 240
//vPos.x += cfLEFT_SCREEN_LIMIT
CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_MEATGRINDER_2, ciCMHDZ_LANE_BACKGROUND, FALSE, TRUE)
ENDIF
ENDPROC
PROC CMHDZ_ADD_ENEMY_COVER_POINT(INT iIndex, FLOAT fPointToAppear, FLOAT fStoppingPos, FLOAT fPosY, INT iLane)
VECTOR_2D vPos
vPos = INIT_VECTOR_2D(fPointToAppear + (fStoppingPos - cfLEFT_SCREEN_LIMIT), fPosY)
vPos.x += 196.0
// SWITCH sCMHDZData.eCurrentLevel
//
// CASE CMHDZ_LEVEL_ASYLUM
//
// BREAK
//
// ENDSWITCH
// Cover variations
//INT iRand = GET_RANDOM_INT_IN_RANGE(0, 3)
INT iRand
// IF sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_CITY
//
// iRand = (iIndex%5)
//
// SWITCH iRand
// CASE 0
// vPos.y += 220
// CMHDZ_ADD_COVER_TO_LIST(vPos, INT_TO_ENUM(CMHDZ_ASSET_TYPES, GET_RANDOM_INT_IN_RANGE(14,17)), iLane, FALSE, TRUE)
// BREAK
//
//// CASE 1
//// vPos.y += 220
//// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_CITY_BUILDING_2, iLane, FALSE, TRUE)
//// BREAK
//
//// CASE 2
//// vPos.y += 220
//// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_CITY_BUILDING_3, iLane, FALSE, TRUE)
//// BREAK
//
// CASE 2
// vPos.y += 68
// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_BARRIER, iLane, FALSE, TRUE)
// BREAK
//
// CASE 4
// vPos.y += 60
// vPos.x += 24
//
// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_TRASHCAN_BIG_2, iLane, FALSE, TRUE)
//
// vPos.x += 20
// vPos.y += 28
//
// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_TRASHBAG_BIG, iLane, FALSE, TRUE)
// BREAK
// ENDSWITCH
// ENDIF
IF sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_ASYLUM
iRand = (iIndex%3)
SWITCH iRand
CASE 0
vPos.y += 60
vPos.x += 24
CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_TRASHCAN_BIG_2, iLane, FALSE, TRUE)
vPos.x += 20
vPos.y += 28
CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_TRASHBAG_BIG, iLane, FALSE, TRUE)
BREAK
CASE 1
vPos.y += 90
CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_ASYLUM_MD_MATTRESS, iLane, FALSE, TRUE)
BREAK
CASE 2
vPos.y += 72
CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_ASYLUM_MD_BED, iLane, FALSE, TRUE)
BREAK
ENDSWITCH
ENDIF
// IF sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_PARK
//
// //iRand = (iIndex%4)
//
// SWITCH iIndex
// CASE 0
// vPos.y += 72
// vPos.x -= 36
//
// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_THEMEPARK_CLOWNBOARD_1, iLane, FALSE, FALSE)
//
// BREAK
//
// CASE 4
//
// vPos.y += 80
// vPos.x -= 36
// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_ROCK_LARGE, iLane, FALSE, FALSE)
//
// BREAK
//
// CASE 8
//
// vPos.y += 60
// vPos.x += 24
//
// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_TRASHCAN_BIG_2, iLane, FALSE, TRUE)
//
// vPos.x += 20
// vPos.y += 28
//
// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_TRASHBAG_BIG, iLane, FALSE, TRUE)
//
// BREAK
//
// CASE 12
//
// vPos.y -= 120
// vPos.x -= 120
//
// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_THEMEPARK_BUILDING_3, iLane, FALSE, FALSE)
//
// BREAK
//
// CASE 16
//
// vPos.y += 80
// vPos.x += 36
//
// CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_ROCK_LARGE, iLane, FALSE, FALSE)
//
// BREAK
//
// ENDSWITCH
//
//
// ENDIF
IF sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_SLAUGHTERHOUSE
iRand = (iIndex%3)
SWITCH iRand
CASE 0
vPos.y += 90
vPos.x += 24
CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_BODYBAG_FLOOR_1, iLane, FALSE, TRUE)
BREAK
CASE 1
vPos.y += 90
vPos.x -= 24
CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_BODYBAG_FLOOR_2, iLane, FALSE, TRUE)
BREAK
CASE 2
vPos.y += 90
vPos.x += 36
CMHDZ_ADD_COVER_TO_LIST(vPos, CMHDZ_ASSET_BODYBAG_FLOOR_3, iLane, FALSE, TRUE)
BREAK
ENDSWITCH
ENDIF
ENDPROC
PROC CMHDZ_ADD_ENEMY_TO_LIST(FLOAT fPosX = 1000.0, FLOAT fPosY = 900.0, FLOAT fStoppingPos = 500.0, INT iLane = 0, BOOL bFromLeft = FALSE, CMHDZ_ENEMY_TYPES iType = CMHDZ_ENEMY_1, FLOAT fPointToAppear = 0.0, BOOL bWaitUntilScreenStationary = FALSE, BOOL bIsPopup = FALSE, INT iRenderAfterWarpedCount = 0, INT iStaticScreenPhase = 0)
INT iSlotToUse = CMHDZ_GET_FREE_SLOT_FOR_ENEMY()
IF iSlotToUse > -1
sCMHDZData.sEnemyData[iSlotToUse].eState = CMHDZ_ENEMY_STATE_WAITING
sCMHDZData.sEnemyData[iSlotToUse].vSpritePos.x = fPosX
sCMHDZData.sEnemyData[iSlotToUse].vSpritePos.y = fPosY
sCMHDZData.sEnemyData[iSlotToUse].vStartPos = sCMHDZData.sEnemyData[iSlotToUse].vSpritePos
sCMHDZData.sEnemyData[iSlotToUse].fStoppingX = fStoppingPos
sCMHDZData.sEnemyData[iSlotToUse].iEnemyType = iType
sCMHDZData.sEnemyData[iSlotToUse].iEnemyLane = iLane
sCMHDZData.sEnemyData[iSlotToUse].iEnemyVoiceId = GET_RANDOM_INT_IN_RANGE(0, 5)
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_ADD_ENEMY_TO_LIST - iSlotToUse: ", iSlotToUse, " iEnemyVoiceId: ", sCMHDZData.sEnemyData[iSlotToUse].iEnemyVoiceId)
// Failsafe for failed asignment
IF bWaitUntilScreenStationary
AND iStaticScreenPhase = 0
iStaticScreenPhase = 1
ENDIF
// Auto fix misasigned popup lanes.
IF bIsPopup
AND (iLane != ciCMHDZ_LANE_POPUP_LHS
OR iLane != ciCMHDZ_LANE_POPUP_RHS)
iLane = ciCMHDZ_LANE_POPUP_RHS
ENDIF
// If slot is greater than the first then make sure the voise ID is not the same as the last.
IF iSlotToUse > 0
WHILE sCMHDZData.sEnemyData[iSlotToUse].iEnemyVoiceId = sCMHDZData.sEnemyData[iSlotToUse - 1].iEnemyVoiceId
sCMHDZData.sEnemyData[iSlotToUse].iEnemyVoiceId = GET_RANDOM_INT_IN_RANGE(0, 5)
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_ADD_ENEMY_TO_LIST - iSlotToUse WHILE loop: ", iSlotToUse, " iEnemyVoiceId: ", sCMHDZData.sEnemyData[iSlotToUse].iEnemyVoiceId)
ENDWHILE
IF iSlotToUse > 1
WHILE sCMHDZData.sEnemyData[iSlotToUse].iEnemyVoiceId = sCMHDZData.sEnemyData[iSlotToUse - 2].iEnemyVoiceId
sCMHDZData.sEnemyData[iSlotToUse].iEnemyVoiceId = GET_RANDOM_INT_IN_RANGE(0, 5)
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_ADD_ENEMY_TO_LIST - iSlotToUse WHILE loop: ", iSlotToUse, " iEnemyVoiceId: ", sCMHDZData.sEnemyData[iSlotToUse].iEnemyVoiceId)
ENDWHILE
ENDIF
ENDIF
CMHDZ_ENEMY_DATA_CLEAR_BITMASK(iSlotToUse, CMHDZ_ENEMY_DATA_BITS_SHOT_AT_LEAST_ONCE)
CMHDZ_ENEMY_DATA_CLEAR_BITMASK(iSlotToUse, CMHDZ_ENEMY_DATA_BITS_PLAYED_AIM_AUDIO)
CMHDZ_ENEMY_DATA_CLEAR_BITMASK(iSlotToUse, CMHDZ_ENEMY_DATA_BITS_PLAYED_WARN_AUDIO)
CMHDZ_ENEMY_DATA_SET_BIT_BY_BOOL(iSlotToUse, CMHDZ_ENEMY_DATA_BITS_REVERSE, bFromLeft)
CMHDZ_ENEMY_DATA_SET_BIT_BY_BOOL(iSlotToUse, CMHDZ_ENEMY_DATA_BITS_IS_POPUP, bIsPopup)
CMHDZ_ENEMY_DATA_SET_BIT_BY_BOOL(iSlotToUse, CMHDZ_ENEMY_DATA_BITS_WAIT_UNTIL_LEVEL_STATIONARY, bWaitUntilScreenStationary)
SWITCH iType
CASE CMHDZ_FOREGROUND_ENEMY_T1_1
CASE CMHDZ_FOREGROUND_ENEMY_T2_1
CASE CMHDZ_FOREGROUND_ENEMY_T4_1
CASE CMHDZ_FOREGROUND_ENEMY_T5_2
CMHDZ_ENEMY_DATA_SET_BITMASK(iSlotToUse, CMHDZ_ENEMY_DATA_BITS_WILL_INFLICT_MELEE_DAMAGE)
BREAK
CASE CMHDZ_RARE_ENEMY_BUNNY
CASE CMHDZ_RARE_ENEMY_MONKEY
CASE CMHDZ_RARE_ENEMY_RAT
CMHDZ_ENEMY_DATA_SET_BITMASK(iSlotToUse, CMHDZ_ENEMY_DATA_BITS_IS_BONUS)
BREAK
ENDSWITCH
sCMHDZData.sEnemyData[iSlotToUse].fPointToAppear = fPointToAppear
sCMHDZData.sEnemyData[iSlotToUse].iStaticScreenPhase = iStaticScreenPhase
sCMHDZData.sEnemyData[iSlotToUse].iRenderAfterWarpedCount = iRenderAfterWarpedCount
sCMHDZData.sEnemyData[iSlotToUse].iWarpedForMovingLevelCount = 0
sCMHDZData.sEnemyData[iSlotToUse].iSpriteAnimFrame = 0
sCMHDZData.sEnemyData[iSlotToUse].iEnemyFlashTimer = 0
IF (sCMHDZData.sEnemyData[iSlotToUse].iStaticScreenPhase > 0)
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] [CMHDZ_ADD_ENEMY_TO_LIST] iStaticScreenPhase > 0")
ENDIF
sCMHDZData.sEnemyData[iSlotToUse].vSize = CMHDZ_GET_ENEMY_SIZE_FOR_TYPE(sCMHDZData.sEnemyData[iSlotToUse].iEnemyType, sCMHDZData.sEnemyData[iSlotToUse].iEnemyLane != ciCMHDZ_LANE_FOREGROUND)
sCMHDZData.sEnemyData[iSlotToUse].iHealth = CMHDZ_GET_ENEMY_START_HEALTH_FOR_TYPE()
// TESTING
// Adding a cover point whenever an enemy is added.
IF iLane != ciCMHDZ_LANE_FOREGROUND
AND iLane != ciCMHDZ_LANE_POPUP_LHS
AND iLane != ciCMHDZ_LANE_POPUP_RHS
IF !bWaitUntilScreenStationary
AND (iSlotToUse%2) = 0 // Evens only
CMHDZ_ADD_ENEMY_COVER_POINT(iSlotToUse, fPointToAppear, fStoppingPos, fPosY, iLane)
ENDIF
ELIF iLane = ciCMHDZ_LANE_POPUP_LHS
OR iLane = ciCMHDZ_LANE_POPUP_RHS
IF !bWaitUntilScreenStationary
CMHDZ_ADD_ENEMY_COVER_POPUP(fPointToAppear, sCMHDZData.sEnemyData[iSlotToUse].vSpritePos, iSlotToUse)
ENDIF
ENDIF
sCMHDZData.iNumberOfEnemies++
ELSE
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ADD_ENEMY_TO_LIST] Failed to add enemy of type ", CMHDZ_ENEMY_TYPES_TO_STRING(iType))
#ENDIF
ENDIF
ENDPROC
PROC CMHDZ_COPY_ENEMY_MAP_DATA_TO_GAME(CMHDZ_ENEMY_MAP_DATA &src[])
INT i
sCMHDZData.iNumberOfEnemies = 0
REPEAT ciCMHDZ_MAX_ENEMIES i
CMHDZ_RESET_ENEMY(i)
IF (src[i].eEnemyType != CMHDZ_ENEMY_INVALID)
CMHDZ_ADD_ENEMY_TO_LIST(src[i].vSpritePos.x, src[i].vSpritePos.y, src[i].fStoppingPos, src[i].iLane,
IS_BITMASK_ENUM_AS_ENUM_SET(src[i].eDataBits, CMHDZ_ENEMY_DATA_BITS_REVERSE), src[i].eEnemyType,
src[i].fPointToAppear, IS_BITMASK_ENUM_AS_ENUM_SET(src[i].eDataBits, CMHDZ_ENEMY_DATA_BITS_WAIT_UNTIL_LEVEL_STATIONARY),
IS_BITMASK_ENUM_AS_ENUM_SET(src[i].eDataBits, CMHDZ_ENEMY_DATA_BITS_IS_POPUP), src[i].iRenderAfterWarpCount, src[i].iStaticScreenPhase)
ENDIF
ENDREPEAT
ENDPROC
PROC CMHDZ_INIT_ENEMIES()
////CDEBUG2LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_INIT_ENEMIES] Called. Stage: ", iScreen)
SWITCH sCMHDZData.eCurrentLevel
CASE CMHDZ_LEVEL_CITY
// #IF IS_DEBUG_BUILD
// IF GET_COMMANDLINE_PARAM_EXISTS("sc_BadlandsQuickLevel1") OR (CMHDZ_CMDLINE_QUICK_LEVEL1 = 1)
// CMHDZ_ADD_ENEMY_TO_LIST(100, 950, 560, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T1_1)
// EXIT
// ENDIF
// #ENDIF
// Enemy Data List - CITY
// 0
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 490.0000, -10.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_RARE_ENEMY_RAT, 360.0000, FALSE, FALSE, 0)
// CMHDZ_ADD_ENEMY_TO_LIST(220.0000, 590.0000, 944.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_1, 593.0000, FALSE, FALSE, 0)
// 1
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 646.0000, 1220.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_1, 781.0000, FALSE, FALSE, 0)
// 2
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 430.0000, 1312.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_1, 1109.0000, FALSE, FALSE, 0)
// 3
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 966.0000, 676.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T1_1, 1668.0000, FALSE, FALSE, 0)
// 4
CMHDZ_ADD_ENEMY_TO_LIST(1682.0000, 742.0000, 1300.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_1, 2102.0000, FALSE, FALSE, 0)
// 5
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 398.0000, 920.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_THROWING_ENEMY_1, 2375.0000, FALSE, FALSE, 0)
// 6
CMHDZ_ADD_ENEMY_TO_LIST(1826.0000, 918.0000, 1364.0000, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T1_2, 2823.0000, FALSE, FALSE, 0)
// 7
CMHDZ_ADD_ENEMY_TO_LIST(200.0000, 430.0000, 1064.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_1, 2843.0000, FALSE, FALSE, 0)
// 8
CMHDZ_ADD_ENEMY_TO_LIST(242.0000, 622.0000, 1028.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_1, 3368.0000, FALSE, FALSE, 0)
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 458.0000, -10.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_RARE_ENEMY_MONKEY, 3700.0)
// 8
CMHDZ_ADD_ENEMY_TO_LIST(964.0000, 406.0000, 244.0000, ciCMHDZ_LANE_POPUP_RHS, TRUE, CMHDZ_ENEMY_1, 4288.0000, FALSE, TRUE, 0)
// 10
CMHDZ_ADD_ENEMY_TO_LIST(1658.0000, 616.0000, 1244.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_1, 5152.0000, FALSE, FALSE, 0)
// 11
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 958.0000, 560.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T1_1, 4673.0000, FALSE, FALSE, 0)
// 12
CMHDZ_ADD_ENEMY_TO_LIST(1826.0000, 942.0000, 1256.0000, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T1_2, 4897.0000, FALSE, FALSE, 0)
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 690.0000, -10.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_RARE_ENEMY_RAT, 5200.0000, FALSE, FALSE, 0)
// 13
CMHDZ_ADD_ENEMY_TO_LIST(200.0000, 598.0000, 1124.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_1, 5769.0000, FALSE, FALSE, 0)
// 14
CMHDZ_ADD_ENEMY_TO_LIST(1682.0000, 622.0000, 1452.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_1, 5590.0000, FALSE, FALSE, 0)
// 15
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 454.0000, 1328.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_1, 5744.0000, FALSE, FALSE, 0)
// 17
//CMHDZ_ADD_ENEMY_TO_LIST(200.0000, 454.0000, 756.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_THROWING_ENEMY_1, 6607.0000, FALSE, FALSE, 0)
// // 18
// CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 670.0000, 1052.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_1, 6943.0000, FALSE, FALSE, 0)
// // 19
// CMHDZ_ADD_ENEMY_TO_LIST(200.0000, 670.0000, 948.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_THROWING_ENEMY_1, 7383.0000, FALSE, FALSE, 0)
// // 20
// CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 950.0000, 560.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T1_2, 7859.0000, FALSE, FALSE, 0)
// // 21
// CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 430.0000, 1272.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_1, 8259.0000, FALSE, FALSE, 0)
// // 22
// CMHDZ_ADD_ENEMY_TO_LIST(1706.0000, 670.0000, 1452.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_1, 8657.0000, FALSE, FALSE, 0)
// // 23
// CMHDZ_ADD_ENEMY_TO_LIST(200.0000, 718.0000, 1000.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_1, 9050.0000, FALSE, FALSE, 0)
// 28
CMHDZ_ADD_ENEMY_TO_LIST(98.0000, 620.0000, 820.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_1, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_CITY) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 1)
// 30
CMHDZ_ADD_ENEMY_TO_LIST(1856.0000, 620.0000, 1452.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_THROWING_ENEMY_1, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_CITY) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 1)
// 31
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 418.0000, 1024.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_1, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_CITY) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 2)
// 32
CMHDZ_ADD_ENEMY_TO_LIST(1154.0000, 430.0000, 264.0000, ciCMHDZ_LANE_POPUP_RHS, FALSE, CMHDZ_ENEMY_1, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_CITY) * cfCMHDZ_SCREEN_LENGTH, TRUE, TRUE, 0, 2)
// 33
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 620.0000, 1200.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_1, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_CITY) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 2)
// 34
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 430.0000, 1024.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_1, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_CITY) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 3)
// 35
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 430.0000, 612.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_1, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_CITY) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 3)
// 36
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 950.0000, 560.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T1_2, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_CITY) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 3)
// 37
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 608.0000, 1150.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_1, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_CITY) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 4)
// 38
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 950.0000, 1280.0000, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T1_1, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_CITY) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 4)
// 39
//CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 950.0000, 560.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T1_1, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_CITY) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 4)
BREAK
CASE CMHDZ_LEVEL_SCRAPYARD
// Enemy Data List - SCRAPYARD
// Enemy Data List - CMHDZ_LEVEL_SCRAPYARD
// 0
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 430.0000, 1000.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_2, 508.0000, FALSE, FALSE, 0)
// 1
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 430.0000, -10.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_RARE_ENEMY_BUNNY, 650.0000, FALSE, FALSE, 0)
// 2
CMHDZ_ADD_ENEMY_TO_LIST(1466.6250, 460.8750, 310.8750, ciCMHDZ_LANE_POPUP_RHS, FALSE, CMHDZ_THROWING_ENEMY_2, 776.0000, FALSE, TRUE, 0)
// 3
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 430.0000, 1256.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_2, 1196.0000, FALSE, FALSE, 0)
// 4
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 480.0000, 1232.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_2, 1400.0000, FALSE, FALSE, 0)
// 5
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 770.0000, 1250.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_2, 1752.0000, FALSE, FALSE, 0)
// 6
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 770.0000, 832.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_2, (2 * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 1)
// 7
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 470.0000, 1100.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_2, (2 * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 1)
// 8
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 412.0000, 850.8750, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_THROWING_ENEMY_2, (2 * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 2)
// 9
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 670.0000, 1210.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_2, (2 * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 2)
// 10
CMHDZ_ADD_ENEMY_TO_LIST(1658.0000, 434.0000, 1240.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_2, (2 * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 3)
// 11
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 952.0000, 524.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T2_1, (2 * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 3)
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 744.0000, 1800.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_RARE_ENEMY_RAT, 2640.0000, FALSE, FALSE, 0)
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 690.0000, -10.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_RARE_ENEMY_RAT, 2560.0000, FALSE, FALSE, 0)
// 12
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 444.0000, 1100.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_2, 2800.0000, FALSE, FALSE, 0)
// 13
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 670.0000, 1162.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_2, 3340.0000, FALSE, FALSE, 0)
// 14
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 674.0000, 1264.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_2, 3548.0000, FALSE, FALSE, 0)
// 15
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 852.0000, 524.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T2_1, 3740.0000, FALSE, FALSE, 0)
// 16
CMHDZ_ADD_ENEMY_TO_LIST(1266.6250, 337.0750, 257.8750, ciCMHDZ_LANE_POPUP_RHS, FALSE, CMHDZ_ENEMY_2, 4240.0000, FALSE, TRUE, 0)
// 17
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 950.0000, 560.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T2_2, 4540.0000, FALSE, FALSE, 0)
// 18
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 416.0000, 1150.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_2, 4782.0000, FALSE, FALSE, 0)
// 19
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 430.0000, 1260.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_2, 5120.0000, FALSE, FALSE, 0)
// 20
CMHDZ_ADD_ENEMY_TO_LIST(886.6250, 486.8750, 357.8750, ciCMHDZ_LANE_POPUP_RHS, FALSE, CMHDZ_THROWING_ENEMY_2, 5248.0000, FALSE, TRUE, 0)
// 21
CMHDZ_ADD_ENEMY_TO_LIST(1680.0000, 756.0000, 748.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_2, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SCRAPYARD) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 1)
// 22
CMHDZ_ADD_ENEMY_TO_LIST(240.0000, 420.0000, 916.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_2, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SCRAPYARD) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 1)
// 23
CMHDZ_ADD_ENEMY_TO_LIST(96.0000, 852.0000, 652.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T2_2, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SCRAPYARD) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 1)
// 25
CMHDZ_ADD_ENEMY_TO_LIST(1512.0000, 444.0000, 340.0000, ciCMHDZ_LANE_POPUP_RHS, FALSE, CMHDZ_ENEMY_2, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SCRAPYARD) * cfCMHDZ_SCREEN_LENGTH), TRUE, TRUE, 0, 2)
// 26
CMHDZ_ADD_ENEMY_TO_LIST(624.0000, 492.0000, 364.0000, ciCMHDZ_LANE_POPUP_RHS, FALSE, CMHDZ_ENEMY_2, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SCRAPYARD) * cfCMHDZ_SCREEN_LENGTH), TRUE, TRUE, 0, 2)
// 27
CMHDZ_ADD_ENEMY_TO_LIST(120.0000, 844.0000, 676.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T2_1, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SCRAPYARD) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 3)
// 29
CMHDZ_ADD_ENEMY_TO_LIST(1776.0000, 844.0000, 1372.0000, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T2_2, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SCRAPYARD) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 3)
// 30
CMHDZ_ADD_ENEMY_TO_LIST(1656.0000, 660.0000, 988.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_THROWING_ENEMY_2, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SCRAPYARD) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 3)
BREAK
CASE CMHDZ_LEVEL_ASYLUM
// Enemy Data List - CMHDZ_LEVEL_ASYLUM
// 0
CMHDZ_ADD_ENEMY_TO_LIST(1656.0000, 660.0000, 1160.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_3, 700.0000, FALSE, FALSE, 0)
// 1
CMHDZ_ADD_ENEMY_TO_LIST(288.0000, 372.0000, 1520.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_3, 700.0000, FALSE, FALSE, 0)
// 2
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 844.0000, 662.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T3_2, 1400.0000, FALSE, FALSE, 0)
// 3
CMHDZ_ADD_ENEMY_TO_LIST(1656.0000, 684.0000, 1160.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_3, 1620.0000, FALSE, FALSE, 0)
// 4
CMHDZ_ADD_ENEMY_TO_LIST(1656.0000, 372.0000, 1356.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_3, 1620.0000, FALSE, FALSE, 0)
// 5
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 844.0000, 1210.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T3_2, 2410.0000, FALSE, FALSE, 0)
// 6
CMHDZ_ADD_ENEMY_TO_LIST(264.0000, 732.0000, 996.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_3, 2790.0000, FALSE, FALSE, 0)
// 7
CMHDZ_ADD_ENEMY_TO_LIST(288.0000, 372.0000, 1044.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_3, 2830.0000, FALSE, FALSE, 0)
// 8
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 376.0000, -10.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_RARE_ENEMY_BUNNY, 3250.0000, FALSE, FALSE, 0)
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 690.0000, -10.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_RARE_ENEMY_RAT, 3100.0000, FALSE, FALSE, 0)
// 10
CMHDZ_ADD_ENEMY_TO_LIST(0.0000, 864.0000, 708.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T3_1, 3710.0000, TRUE, FALSE, 0, 1)
// 11
CMHDZ_ADD_ENEMY_TO_LIST(2424.0000, 864.0000, 1176.0000, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T3_2, 3710.0000, TRUE, FALSE, 0, 1)
// 12
CMHDZ_ADD_ENEMY_TO_LIST(2100.0000, 614.0000, 948.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_THROWING_ENEMY_3, 3710.0000, TRUE, FALSE, 0, 1)
// 8
CMHDZ_ADD_ENEMY_TO_LIST(640.0000, 456.0000, 368.0000, ciCMHDZ_LANE_POPUP_LHS, TRUE, CMHDZ_ENEMY_3, 3710.0000, TRUE, TRUE, 0, 2)
// 9
CMHDZ_ADD_ENEMY_TO_LIST(1328.0000, 492.0000, 412.0000, ciCMHDZ_LANE_POPUP_LHS, FALSE, CMHDZ_ENEMY_3, 3710.0000, TRUE, TRUE, 0, 3)
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 430.0000, -10.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_RARE_ENEMY_RAT, 3900.0000, FALSE, FALSE, 0)
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 744.0000, 1800.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_RARE_ENEMY_RAT, 4240.0000, FALSE, FALSE, 0)
// 13
CMHDZ_ADD_ENEMY_TO_LIST(264.0000, 680.0000, 940.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_3, 4630.0000, FALSE, FALSE, 0)
// 15
CMHDZ_ADD_ENEMY_TO_LIST(96.0000, 844.0000, 940.0000, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T3_2, 4970.0000, FALSE, FALSE, 0)
// 14
CMHDZ_ADD_ENEMY_TO_LIST(1656.0000, 420.0000, 1252.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_3, 5246.0000, FALSE, FALSE, 0)
// 15
CMHDZ_ADD_ENEMY_TO_LIST(96.0000, 844.0000, 940.0000, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T3_1, 5466.0000, FALSE, FALSE, 0)
// 17
CMHDZ_ADD_ENEMY_TO_LIST(264.0000, 324.0000, 940.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_3, 5694.0000, FALSE, FALSE, 0)
// 18
// CMHDZ_ADD_ENEMY_TO_LIST(1656.0000, 690.0000, 1084.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_3, 5694.0000, FALSE, FALSE, 0)
// 25
// CMHDZ_ADD_ENEMY_TO_LIST(264.0000, 324.0000, 1040.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_3, 5854.0000, FALSE, FALSE, 0)
// // 26
// CMHDZ_ADD_ENEMY_TO_LIST(1656.0000, 690.0000, 884.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_3, 5834.0000, FALSE, FALSE, 0)
// 23
CMHDZ_ADD_ENEMY_TO_LIST(1180.0000, 528.0000, 464.0000, ciCMHDZ_LANE_POPUP_RHS, FALSE, CMHDZ_THROWING_ENEMY_3, 6090.0000, FALSE, TRUE, 0)
// 24
//CMHDZ_ADD_ENEMY_TO_LIST(1656.0000, 680.0000, 1228.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_THROWING_ENEMY_3, 7366.0000, FALSE, FALSE, 0)
// 27
//CMHDZ_ADD_ENEMY_TO_LIST(96.0000, 780.0000, 940.0000, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T3_1, 8146.0000, FALSE, FALSE, 0)
// 28
CMHDZ_ADD_ENEMY_TO_LIST(120.0000, 370.0000, 712.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_3, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_ASYLUM) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 1)
// 29
//CMHDZ_ADD_ENEMY_TO_LIST(2250.0000, 690.0000, 944.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_3, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_ASYLUM) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 1)
// 30
CMHDZ_ADD_ENEMY_TO_LIST(120.0000, 716.0000, 960.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_THROWING_ENEMY_3, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_ASYLUM) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 1)
// 31
CMHDZ_ADD_ENEMY_TO_LIST(2226.0000, 980.0000, 1440.0000, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T3_2, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_ASYLUM) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 1)
// 32
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 952.0000, 924.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T3_2, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_ASYLUM) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 2)
// 33
CMHDZ_ADD_ENEMY_TO_LIST(264.0000, 708.0000, 996.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_3, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_ASYLUM) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 2)
// 34
CMHDZ_ADD_ENEMY_TO_LIST(288.0000, 324.0000, 924.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_3, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_ASYLUM) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 2)
// 35
//CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 952.0000, 512.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T3_1, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_ASYLUM) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 2)
// 36
//CMHDZ_ADD_ENEMY_TO_LIST(264.0000, 732.0000, 926.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_3, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_ASYLUM) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 3)
// 37
CMHDZ_ADD_ENEMY_TO_LIST(264.0000, 732.0000, 974.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_3, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_ASYLUM) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 3)
// 38
CMHDZ_ADD_ENEMY_TO_LIST(1656.0000, 732.0000, 1296.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_3, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_ASYLUM) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 3)
// 39
CMHDZ_ADD_ENEMY_TO_LIST(288.0000, 324.0000, 548.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_3, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_ASYLUM) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 4)
// 40
CMHDZ_ADD_ENEMY_TO_LIST(1656.0000, 324.0000, 1210.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_3, (CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_ASYLUM) * cfCMHDZ_SCREEN_LENGTH), TRUE, FALSE, 0, 4)
BREAK
CASE CMHDZ_LEVEL_PARK
// Enemy Data List - CMHDZ_LEVEL_PARK
CMHDZ_ADD_ENEMY_TO_LIST(1084.0000, 724.0000, 644.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_4, 1081.5751, FALSE, TRUE, 0)
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 368.0000, 1122.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_4, 1539.6500, FALSE, FALSE, 0)
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 710.0000, 1320.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_4, 1.66 * cfCMHDZ_SCREEN_LENGTH)
// Screen 1
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 950.0000, 560.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T4_2, 2.5 * cfCMHDZ_SCREEN_LENGTH)
// Screen 2
CMHDZ_ADD_ENEMY_TO_LIST(1800.0000, 680.0000, 900.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_4, 3* cfCMHDZ_SCREEN_LENGTH)
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 430.0000, 1040.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_4, 3 * cfCMHDZ_SCREEN_LENGTH)
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 834.0000, 1800.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_RARE_ENEMY_RAT, 3.5 * cfCMHDZ_SCREEN_LENGTH, FALSE, FALSE, 0)
// Screen 3
CMHDZ_ADD_ENEMY_TO_LIST(2000.0000, 950.0000, 1400.0000, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T4_2, 4 * cfCMHDZ_SCREEN_LENGTH)
// Screen 3.5
CMHDZ_ADD_ENEMY_TO_LIST(-100.0000, 954.0000, 960.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T4_1, (4.5 * cfCMHDZ_SCREEN_LENGTH), FALSE, FALSE, 0)
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 580.0000, 1280.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_4, (4.5 * cfCMHDZ_SCREEN_LENGTH), FALSE, FALSE, 0)
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 372.0000, 1560.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_4, (4.5 * cfCMHDZ_SCREEN_LENGTH), FALSE, FALSE, 0)
// Screen 4
//CMHDZ_ADD_ENEMY_TO_LIST(350.0000, 480.0000, 340.0000, ciCMHDZ_LANE_POPUP_RHS, FALSE, CMHDZ_ENEMY_4, 4.9 * cfCMHDZ_SCREEN_LENGTH, FALSE, TRUE)
CMHDZ_ADD_ENEMY_TO_LIST(1334.0000, 384.0000, 268.0000, ciCMHDZ_LANE_POPUP_RHS, FALSE, CMHDZ_THROWING_ENEMY_4, 4784.7500, FALSE, TRUE, 0)
//4.75
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 378.0000, 996.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_4, (5.66 * cfCMHDZ_SCREEN_LENGTH))
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 430.0000, -10.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_RARE_ENEMY_RAT, 6.2 * cfCMHDZ_SCREEN_LENGTH, FALSE, FALSE, 0)
// Screen 6
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 392.0000, 1484.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_4, 6492.5)
CMHDZ_ADD_ENEMY_TO_LIST(1856.0000, 684.0000, 1360.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_4, 7 * cfCMHDZ_SCREEN_LENGTH)
// Screen 7
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 950.0000, 660.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T4_1, 8* cfCMHDZ_SCREEN_LENGTH)
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 710.0000, 1240.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_4, 8 * cfCMHDZ_SCREEN_LENGTH)
// Rare 2
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 382.0000, -10.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_RARE_ENEMY_MONKEY, 8.5 * cfCMHDZ_SCREEN_LENGTH)
// Static screens
// 1
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 392.0000, 880.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_4, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_PARK) * cfCMHDZ_SCREEN_LENGTH, TRUE, DEFAULT, DEFAULT, 1)
CMHDZ_ADD_ENEMY_TO_LIST(1856.0000, 666.0000, 960.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_4, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_PARK) * cfCMHDZ_SCREEN_LENGTH, TRUE, DEFAULT, DEFAULT, 1)
// 2
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 392.0000, 1560.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_4, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_PARK) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 2)
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 666.0000, 1500.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_4, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_PARK) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 2)
// 3
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 660.0000, 960.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_THROWING_ENEMY_4, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_PARK) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 3)
CMHDZ_ADD_ENEMY_TO_LIST(0.0000, 828.0000, 708.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T4_1, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_PARK) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 3)
CMHDZ_ADD_ENEMY_TO_LIST(2424.0000, 804.0000, 1176.0000, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T4_2, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_PARK) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 3)
// 4
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 391.0000, 728.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_4, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_PARK) * cfCMHDZ_SCREEN_LENGTH, TRUE, TRUE, 0, 4)
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 666.0000, 1500.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_4, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_PARK) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 4)
// 5
CMHDZ_ADD_ENEMY_TO_LIST(1900.0000, 660.0000, 960.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_4, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_PARK) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 5)
CMHDZ_ADD_ENEMY_TO_LIST(2000.0000, 950.0000, 1360.0000, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T4_1, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_PARK) * cfCMHDZ_SCREEN_LENGTH, TRUE, FALSE, 0, 5)
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 392.0000, 880.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_4, CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_PARK) * cfCMHDZ_SCREEN_LENGTH, TRUE, DEFAULT, DEFAULT, 5)
BREAK
CASE CMHDZ_LEVEL_SLAUGHTERHOUSE
// Enemy Data List - CMHDZ_LEVEL_SLAUGHTERHOUSE
// 3
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 680.0000, 1412.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_5, 1375.0000, FALSE, FALSE, 0)
// 4
CMHDZ_ADD_ENEMY_TO_LIST(0.0000, 950.0000, 700.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T5_1, 2302.5000, FALSE, FALSE, 0)
// 5
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 334.0000, 1100.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_5, 2510.0000, FALSE, FALSE, 0)
// 6
CMHDZ_ADD_ENEMY_TO_LIST(-144.0000, 950.0000, 660.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T5_2, 3605.5000, FALSE, FALSE, 0)
// 7
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 334.0000, 700.0000, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_5, 3909.0000, FALSE, FALSE, 0)
// 8
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 720.0000, 900.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_5, 5052.5000, FALSE, FALSE, 0)
// 9
CMHDZ_ADD_ENEMY_TO_LIST(1634.0000, 950.0000, 1080.0000, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T5_2, 5292.5000, FALSE, FALSE, 0)
// 10
CMHDZ_ADD_ENEMY_TO_LIST(0.0000, 950.0000, 660.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T5_1, 5548.0000, FALSE, FALSE, 0)
// 11
CMHDZ_ADD_ENEMY_TO_LIST(1658.0000, 334.0000, 588.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_5, 5980.0000, FALSE, FALSE, 0)
// 12
CMHDZ_ADD_ENEMY_TO_LIST(264.0000, 516.0000, 988.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_5, 6076.0000, FALSE, FALSE, 0)
// 13
CMHDZ_ADD_ENEMY_TO_LIST(1656.0000, 520.0000, 1108.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_THROWING_ENEMY_5, 6244.0000, FALSE, FALSE, 0)
// 15
CMHDZ_ADD_ENEMY_TO_LIST(-360.0000, 852.0000, 860.0000, ciCMHDZ_LANE_FOREGROUND, TRUE, CMHDZ_FOREGROUND_ENEMY_T5_2, 6380.0000, FALSE, FALSE, 0)
// 14
CMHDZ_ADD_ENEMY_TO_LIST(1656.0000, 612.0000, 1036.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_5, 6700.0000, FALSE, FALSE, 0)
// 16
CMHDZ_ADD_ENEMY_TO_LIST(768.0000, 396.0000, 220.0000, ciCMHDZ_LANE_POPUP_RHS, FALSE, CMHDZ_ENEMY_5, 6480.0000, FALSE, TRUE, 0)
// Screen 1 - Rats rats we're the rats
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 430.0000, -10.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_RARE_ENEMY_RAT, 550.0000, FALSE, FALSE, 0)
CMHDZ_ADD_ENEMY_TO_LIST(100.0000, 744.0000, 1800.0000, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_RARE_ENEMY_RAT, 550.0000, FALSE, FALSE, 0)
CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 690.0000, -10.0000, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_RARE_ENEMY_RAT, 750.0000, FALSE, FALSE, 0)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// This generates the totals for the progression meter - I don't want to hard code this
/// PARAMS:
/// iLevel -
//PROC CMHDZ_CALCULATE_ENEMY_TOTALS_FOR_LEVEL()
// INT iScreen, i
// INT iOldNumber
//
// // reset all enemies and counters
// FOR i = 0 TO ciCMHDZ_MAX_ENEMIES -1
// CMHDZ_RESET_ENEMY(i)
// ENDFOR
//
// sCMHDZData.iTotalNumberOfEnemies = 0
//
// REPEAT CMHDZ_GET_FINAL_SCREEN_IN_CURRENT_LEVEL() iScreen
// iOldNumber = sCMHDZData.iNumberOfEnemies
// //CMHDZ_INIT_ENEMIES()
//
// sCMHDZData.iTotalNumberOfEnemies += (sCMHDZData.iNumberOfEnemies - iOldNumber)
// sCMHDZData.iNumberOfEnemies = 0
//
// // reset all enemies
// FOR i = 0 TO ciCMHDZ_MAX_ENEMIES -1
// CMHDZ_RESET_ENEMY(i)
// ENDFOR
// ENDREPEAT
//
// sCMHDZData.iNumberOfEnemies = 0
//ENDPROC
FUNC BOOL CMHDZ_SHOULD_MOVING_LEVEL_STOP()
IF CMHDZ_IS_LEVEL_SCREEN_STATIONARY(CMHDZ_GET_CURRENT_LEVEL(), sCMHDZData.iCurrentScreen)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//-------------------------------------
// MISC FUNCTIONS
//-------------------------------------
/// PURPOSE:
/// If we want a prop or a pickup to loop round as the level scrolls, so it appears agan, need to work out how far
/// to warp it so that it re-appears at a sensible location (i.e. not on top of another prop).
/// Generally some multiple of the screen width + an offset. The offset is the difference between the x pos
/// of the right-most element on the 'final' screen and the right hand screen limit
/// RETURNS:
///
FUNC FLOAT CMHDZ_GET_OFFSET_FOR_ELEMENT_WARP_FOR_CURRENT_LEVEL()
RETURN (cfBASE_SCREEN_WIDTH * 3.0)
// SWITCH CMHDZ_GET_CURRENT_LEVEL()
// CASE CMHDZ_LEVEL_SCRAPYARD
// RETURN (cfBASE_SCREEN_WIDTH * 2.0) + (cfRIGHT_SCREEN_LIMIT - cfCMHDZ_TOWN_LEVEL_RIGHTMOST_ENTITY_X)
// BREAK
//
// CASE CMHDZ_LEVEL_ASYLUM
// RETURN (cfBASE_SCREEN_WIDTH * 2.0) + (cfRIGHT_SCREEN_LIMIT - cfCMHDZ_FOREST_LEVEL_RIGHTMOST_ENTITY_X)
// BREAK
//
// CASE CMHDZ_LEVEL_PARK
// RETURN (cfBASE_SCREEN_WIDTH * 2.0) + (cfRIGHT_SCREEN_LIMIT - cfCMHDZ_MINE_LEVEL_RIGHTMOST_ENTITY_X)
// BREAK
//
// CASE CMHDZ_LEVEL_SLAUGHTERHOUSE
// RETURN (cfBASE_SCREEN_WIDTH * 2.0) + (cfRIGHT_SCREEN_LIMIT - cfCMHDZ_GRAVEYARD_LEVEL_RIGHTMOST_ENTITY_X)
// BREAK
// ENDSWITCH
// RETURN (cfBASE_SCREEN_WIDTH * 2.0) + (cfRIGHT_SCREEN_LIMIT - cfCMHDZ_TOWN_LEVEL_RIGHTMOST_ENTITY_X)
ENDFUNC
FUNC STRING CMHDZ_GET_TEXTURE_DICTIONARY_FOR_LEVEL(CMHDZ_LEVELS eLevel)
STRING sLevel
SWITCH eLevel
CASE CMHDZ_LEVEL_CITY sLevel = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVL1) BREAK
CASE CMHDZ_LEVEL_SCRAPYARD sLevel = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVL2) BREAK
CASE CMHDZ_LEVEL_ASYLUM sLevel = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVL3) BREAK
CASE CMHDZ_LEVEL_PARK sLevel = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVL4) BREAK
CASE CMHDZ_LEVEL_SLAUGHTERHOUSE sLevel = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVL5) BREAK
ENDSWITCH
RETURN sLevel
ENDFUNC
FUNC INT CMHDZ_GET_COVER_OVER_RETICULE(INT iLaneFilter = -1)
VECTOR_2D vCoord = CMHDZ_GET_PLAYER_RETICULE_POSITON()
FLOAT fDistance, fScale
FLOAT fClosest = MAX_FLOAT
INT iClosest = -1
VECTOR_2D vSize, vPos
INT i
REPEAT ciCMHDZ_MAX_COVER i
IF (sCMHDZData.sCoverData[i].eType = CMHDZ_ASSET_INVALID)
RELOOP
ENDIF
IF (iLaneFilter != -1) AND (sCMHDZData.sCoverData[i].iCoverLane != iLaneFilter)
RELOOP
ENDIF
fScale = CMHDZ_COVER_UTIL_GET_TYPE_SCALE_FOR_LANE(sCMHDZData.sCoverData[i].eType, sCMHDZData.sCoverData[i].iCoverLane)
vSize = MULTIPLY_VECTOR_2D(CMHDZ_COVER_UTIL_GET_TYPE_SIZE(sCMHDZData.sCoverData[i].eType), fScale)
vPos = sCMHDZData.sCoverData[i].vSpritePos
IF CMHDZ_IS_POSITION_IN_BOX(vCoord, vPos, vSize)
fDistance = VECTOR_2D_DIST2(vCoord, vPos)
IF fDistance <= fClosest
fClosest = fDistance
iClosest = i
ENDIF
ENDIF
ENDREPEAT
RETURN iClosest
ENDFUNC
FUNC INT CMHDZ_GET_ENEMY_OVER_RETICULE(INT iLaneFilter = -1)
VECTOR_2D vCoord = CMHDZ_GET_PLAYER_RETICULE_POSITON()
FLOAT fDistance, fScale
FLOAT fClosest = MAX_FLOAT
INT iClosest = -1
VECTOR_2D vSize
VECTOR_2D vPos
INT i
REPEAT ciCMHDZ_MAX_ENEMIES i
IF (sCMHDZData.sEnemyData[i].iEnemyType = CMHDZ_ENEMY_INVALID)
RELOOP
ENDIF
IF (iLaneFilter != -1) AND (sCMHDZData.sEnemyData[i].iEnemyLane != iLaneFilter)
RELOOP
ENDIF
fScale = CMHDZ_GET_ENEMY_TYPE_SCALE_FOR_LANE(sCMHDZData.sEnemyData[i].iEnemyLane)
vSize = MULTIPLY_VECTOR_2D(CMHDZ_GET_ENEMY_SIZE_FOR_TYPE(sCMHDZData.sEnemyData[i].iEnemyType, sCMHDZData.sEnemyData[i].iEnemyLane != ciCMHDZ_LANE_FOREGROUND), fScale)
vPos = sCMHDZData.sEnemyData[i].vSpritePos
IF CMHDZ_IS_POSITION_IN_BOX(vCoord, vPos, vSize)
fDistance = VECTOR_2D_DIST2(vCoord, vPos)
IF fDistance <= fClosest
fClosest = fDistance
iClosest = i
ENDIF
ENDIF
ENDREPEAT
RETURN iClosest
ENDFUNC
FUNC INT CMHDZ_GET_ITEM_OVER_RETICULE(INT iLaneFilter = -1)
VECTOR_2D vCoord = CMHDZ_GET_PLAYER_RETICULE_POSITON()
FLOAT fDistance
FLOAT fClosest = MAX_FLOAT
INT iClosest = -1
VECTOR_2D vSize, vPos
INT i
REPEAT ciCMHDZ_MAX_ITEMS i
IF (sCMHDZData.sItemData[i].eItemType = CMHDZ_ITEM_NONE)
RELOOP
ENDIF
IF (iLaneFilter != -1) AND (sCMHDZData.sItemData[i].iLane != iLaneFilter)
RELOOP
ENDIF
vSize = CMHDZ_GET_ITEM_SIZE_FOR_TYPE(sCMHDZData.sItemData[i].eItemType)
vPos = sCMHDZData.sItemData[i].vSpritePos
IF CMHDZ_IS_POSITION_IN_BOX(vCoord, vPos, vSize)
fDistance = VECTOR_2D_DIST2(vCoord, vPos)
IF fDistance <= fClosest
fClosest = fDistance
iClosest = i
ENDIF
ENDIF
ENDREPEAT
RETURN iClosest
ENDFUNC