USING "camhedz_arcade_using.sch" USING "camhedz_arcade_levels.sch" USING "camhedz_arcade_leaderboard.sch" USING "camhedz_arcade_sprites.sch" USING "arcade_games_postfx.sch" USING "degenatron_games_movie.sch" //------------------------------------------------- // HUD CHAR FUNCTIONS //------------------------------------------------- FUNC STRING CMHDZ_GET_HUD_CHAR_SPRITE(CMHDZ_HUD_CHAR eChar) SWITCH (eChar) CASE CMHDZ_HUD_CHAR_0 RETURN "FONT_0" CASE CMHDZ_HUD_CHAR_1 RETURN "FONT_1" CASE CMHDZ_HUD_CHAR_2 RETURN "FONT_2" CASE CMHDZ_HUD_CHAR_3 RETURN "FONT_3" CASE CMHDZ_HUD_CHAR_4 RETURN "FONT_4" CASE CMHDZ_HUD_CHAR_5 RETURN "FONT_5" CASE CMHDZ_HUD_CHAR_6 RETURN "FONT_6" CASE CMHDZ_HUD_CHAR_7 RETURN "FONT_7" CASE CMHDZ_HUD_CHAR_8 RETURN "FONT_8" CASE CMHDZ_HUD_CHAR_9 RETURN "FONT_9" CASE CMHDZ_HUD_CHAR_A RETURN "FONT_A" CASE CMHDZ_HUD_CHAR_B RETURN "FONT_B" CASE CMHDZ_HUD_CHAR_C RETURN "FONT_C" CASE CMHDZ_HUD_CHAR_D RETURN "FONT_D" CASE CMHDZ_HUD_CHAR_E RETURN "FONT_E" CASE CMHDZ_HUD_CHAR_F RETURN "FONT_F" CASE CMHDZ_HUD_CHAR_G RETURN "FONT_G" CASE CMHDZ_HUD_CHAR_H RETURN "FONT_H" CASE CMHDZ_HUD_CHAR_I RETURN "FONT_I" CASE CMHDZ_HUD_CHAR_J RETURN "FONT_J" CASE CMHDZ_HUD_CHAR_K RETURN "FONT_K" CASE CMHDZ_HUD_CHAR_L RETURN "FONT_L" CASE CMHDZ_HUD_CHAR_M RETURN "FONT_M" CASE CMHDZ_HUD_CHAR_N RETURN "FONT_N" CASE CMHDZ_HUD_CHAR_O RETURN "FONT_O" CASE CMHDZ_HUD_CHAR_P RETURN "FONT_P" CASE CMHDZ_HUD_CHAR_Q RETURN "FONT_Q" CASE CMHDZ_HUD_CHAR_R RETURN "FONT_R" CASE CMHDZ_HUD_CHAR_S RETURN "FONT_S" CASE CMHDZ_HUD_CHAR_T RETURN "FONT_T" CASE CMHDZ_HUD_CHAR_U RETURN "FONT_U" CASE CMHDZ_HUD_CHAR_V RETURN "FONT_V" CASE CMHDZ_HUD_CHAR_W RETURN "FONT_W" CASE CMHDZ_HUD_CHAR_X RETURN "FONT_X" CASE CMHDZ_HUD_CHAR_Y RETURN "FONT_Y" CASE CMHDZ_HUD_CHAR_Z RETURN "FONT_Z" CASE CMHDZ_HUD_CHAR_APOSTROPHE RETURN "FONT_APOSTOPHE" //RETURN "FONT_SPECAILCHARACTER_APOSTROPHE" CASE CMHDZ_HUD_CHAR_BACKSLASH RETURN "FONT_BKSLASH" //RETURN "FONT_SPECAILCHARACTER_SLASH" CASE CMHDZ_HUD_CHAR_CLOSEBRACKET RETURN "FONT_]" //RETURN "FONT_SPECAILCHARACTER_CLOSE_BRACKET" CASE CMHDZ_HUD_CHAR_COLON RETURN "FONT_COLON" //RETURN "FONT_SPECAILCHARACTER_COLON" CASE CMHDZ_HUD_CHAR_COMMA RETURN "FONT_," //RETURN "FONT_SPECAILCHARACTER_," CASE CMHDZ_HUD_CHAR_DOLLAR RETURN "FONT_DOLLAR" CASE CMHDZ_HUD_CHAR_EXCLAMATION RETURN "FONT_!" //RETURN "FONT_SPECAILCHARACTER_!" CASE CMHDZ_HUD_CHAR_FULL_STOP RETURN "FONT_." //RETURN "FONT_SPECAILCHARACTER_." CASE CMHDZ_HUD_CHAR_MINUS RETURN "FONT_-" //RETURN "FONT_SPECAILCHARACTER_-COPY" CASE CMHDZ_HUD_CHAR_OPEN_BRACKET RETURN "FONT_[" //RETURN "FONT_SPECAILCHARACTER_OPEN_BRACKET" CASE CMHDZ_HUD_CHAR_PLUS RETURN "FONT_+" //RETURN "FONT_SPECAILCHARACTER_PLUS" CASE CMHDZ_HUD_CHAR_QUESTION RETURN "FONT_QUESTION" //RETURN "FONT_SPECAILCHARACTER_QUESTIONMARK" CASE CMHDZ_HUD_CHAR_SEMI_COLON RETURN "FONT_;" // RETURN "FONT_SPECAILCHARACTER_SEMI_COLON" CASE CMHDZ_HUD_CHAR_SPEECH RETURN "FONT_SPEECH" // RETURN "FONT_SPECAILCHARACTER_SEMI_COLON" CASE CMHDZ_HUD_CHAR_STAR RETURN "FONT_ASTERIX" // SPECAILCHARACTER_STAR" CASE CMHDZ_HUD_CHAR_PERCENT RETURN "FONT_%" ENDSWITCH RETURN "" ENDFUNC FUNC VECTOR_2D CMHDZ_GET_HUD_CHAR_SIZE(CMHDZ_HUD_CHAR eChar, FLOAT sx = 1.0, FLOAT sy = 1.0) VECTOR_2D vScale vScale.y = 40 * sy vScale.x = 24 * sx RETURN vScale SWITCH (eChar) CASE CMHDZ_HUD_CHAR_APOSTROPHE //CASE CMHDZ_HUD_CHAR_COLON CASE CMHDZ_HUD_CHAR_COMMA CASE CMHDZ_HUD_CHAR_EXCLAMATION CASE CMHDZ_HUD_CHAR_FULL_STOP CASE CMHDZ_HUD_CHAR_SEMI_COLON vScale.x = CMHDZ_PX_HUD_THIN_CHAR_WIDTH * sx BREAK CASE CMHDZ_HUD_CHAR_COLON vScale.x = 4 * sx BREAK DEFAULT vScale.x = CMHDZ_PX_HUD_CHAR_WIDTH * sx BREAK ENDSWITCH RETURN vScale ENDFUNC PROC CMHDZ_PACK_HUD_CHAR_TO_ARRAY(CMHDZ_HUD_CHAR eChar, INT iIndex, INT &iCArray[]) INT iIntArrayIndex = iIndex / 5 IF (iIntArrayIndex >= COUNT_OF(iCArray)) EXIT ENDIF INT iBitIntIndex = (iIndex % 5) * 6 SET_BITS_IN_RANGE(iCArray[iIntArrayIndex], iBitIntIndex, iBitIntIndex + 5, ENUM_TO_INT(eChar)) ENDPROC PROC CMHDZ_PACK_SINGLE_DIGIT_TO_HUD_CHAR_ARRAY(INT iDigit, INT iIndex, INT &iCArray[]) INT iIntArrayIndex = iIndex / 5 IF (iIntArrayIndex >= COUNT_OF(iCArray)) EXIT ENDIF INT iBitIntIndex = (iIndex % 5) * 6 SET_BITS_IN_RANGE(iCArray[iIntArrayIndex], iBitIntIndex, iBitIntIndex + 5, ENUM_TO_INT(CMHDZ_HUD_CHAR_0) + iDigit) ENDPROC FUNC CMHDZ_HUD_CHAR CMHDZ_UNPACK_HUD_CHAR_FROM_ARRAY(INT &iCArray[], INT iIndex) INT iIntArrayIndex = iIndex / 5 INT iBitIntIndex = (iIndex % 5) * 6 IF (iIntArrayIndex >= COUNT_OF(iCArray)) RETURN CMHDZ_HUD_CHAR_INVALID ENDIF RETURN INT_TO_ENUM(CMHDZ_HUD_CHAR, GET_BITS_IN_RANGE(iCArray[iIntArrayIndex], iBitIntIndex, iBitIntIndex + 5)) ENDFUNC PROC CMHDZ_SET_HUD_CHAR_PIVOT(CMHDZ_HUD_TEXTPIVOT eTextPivot) sCMHDZData.eTextPivot = eTextPivot ENDPROC PROC CMHDZ_SET_HUD_CHAR_SCALE(FLOAT sx = 1.0, FLOAT sy = 1.0) sCMHDZData.vTextScale.x = sx sCMHDZData.vTextScale.y = sy ENDPROC FUNC INT CMHDZ_GET_NUMBER_OF_DIGITS_IN_NUMBER(INT iNumber) RETURN FLOOR(LOG10(TO_FLOAT(iNumber))) + 1 ENDFUNC PROC CMHDZ_DRAW_HUD_CHAR_POSITIVE_NUMBER_AT_POSITION(FLOAT fX, FLOAT fY, INT iIntToDisplay, INT iNumLength = 8) INT iMaxDigits = CMHDZ_GET_NUMBER_OF_DIGITS_IN_NUMBER(iIntToDisplay) IF (iMaxDigits >= CMHDZ_HUD_MAX_NUM_LENGTH) EXIT ENDIF INT i INT iCurValue = iIntToDisplay TEXT_LABEL_15 str str += iIntToDisplay INT iStrLen = GET_LENGTH_OF_LITERAL_STRING(str) CMHDZ_HUD_CHAR mChars[CMHDZ_HUD_MAX_NUM_LENGTH] VECTOR_2D vPos = INIT_VECTOR_2D(fx, fy) VECTOR_2D vScale = INIT_VECTOR_2D(CMHDZ_PX_HUD_CHAR_WIDTH * sCMHDZData.vTextScale.x, CMHDZ_PX_HUD_CHAR_HEIGHT * sCMHDZData.vTextScale.y) IF (iStrLen < iNumLength) vPos.x -= ((iNumLength - iStrLen) * vScale.x) ENDIF STRING txtDir = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT) REPEAT iMaxDigits i mChars[i] = INT_TO_ENUM(CMHDZ_HUD_CHAR, ENUM_TO_INT(CMHDZ_HUD_CHAR_0) + (iCurValue % 10)) iCurValue /= 10 CMHDZ_DRAW_GAME_SPRITE(txtDir, CMHDZ_GET_HUD_CHAR_SPRITE(mChars[i]), vPos, vScale, 0, sCMHDZData.rgbaWhite) vPos.x -= vScale.x ENDREPEAT ENDPROC PROC CMHDZ_WRITE_STRING_USING_TEXT_SPRITES(STRING sTextToDisplay, VECTOR_2D vDisplayPos, FLOAT fSizeMultiplier = 1.0, BOOL bCenterText = FALSE, INT iLengthOverride = 0, INT iRed = 255, INT iGreen = 255, Int iBlue = 255, INT iAlpha = 255) // Moddable variable VECTOR_2D vDisplayFinalPos = vDisplayPos VECTOR_2D vBaseLetterScale = INIT_VECTOR_2D(24, 40) RGBA_COLOUR_STRUCT rgbaStruct INIT_RGBA_STRUCT(rgbaStruct, iRed, iGreen, iBlue, iAlpha) INT iLengthOfString = GET_LENGTH_OF_LITERAL_STRING(sTextToDisplay) IF iLengthOverride > 0 iLengthOfString = iLengthOverride ENDIF IF bCenterText vDisplayFinalPos.X = (cfBASE_SCREEN_WIDTH/2.0) vDisplayFinalPos.X -= ROUND((24.0*fSizeMultiplier)*((iLengthOfString-1)/2.0)) //vDisplayFinalPos.X += 18 // Fixer ENDIF FLOAT fCarryOverX = 0 INT i = 0 FOR i = 0 TO iLengthOfString-1 TEXT_LABEL_63 sLetterTexture = "FONT_" TEXT_LABEL_63 sCharacter = "!" sCharacter = GET_CHARACTER_FROM_AUDIO_CONVERSATION_FILENAME(sTextToDisplay, i, i+1) VECTOR_2D vScaleFinal = MULTIPLY_VECTOR_2D(vBaseLetterScale, fSizeMultiplier) IF ARE_STRINGS_EQUAL(sCharacter, " ") vDisplayFinalPos.x += vBaseLetterScale.x // Add the size of a sprite Before displaying the next one. RELOOP ENDIF // Smaller and Wider font // IF ARE_STRINGS_EQUAL(sCharacter, "M") // OR ARE_STRINGS_EQUAL(sCharacter, "W") // vScaleFinal.x = (48.0*fSizeMultiplier) // vDisplayFinalPos.x += (vScaleFinal.x/8) // ENDIF IF ARE_STRINGS_EQUAL(sCharacter, ".") OR ARE_STRINGS_EQUAL(sCharacter, ":") OR ARE_STRINGS_EQUAL(sCharacter, "!") OR ARE_STRINGS_EQUAL(sCharacter, "'") vScaleFinal.x = (20.0*fSizeMultiplier) vDisplayFinalPos.x -= (vScaleFinal.x/8) ENDIF // Check if Character is a misc // IF ARE_STRINGS_EQUAL(sCharacter, "!") // sCharacter = "!" // ENDIF IF ARE_STRINGS_EQUAL(sCharacter, "?") sCharacter = "Question" ENDIF IF ARE_STRINGS_EQUAL(sCharacter, ".") sCharacter = "DOT" ENDIF IF ARE_STRINGS_EQUAL(sCharacter, ":") sCharacter = "Colon" ENDIF IF ARE_STRINGS_EQUAL(sCharacter, "'") sCharacter = "Apostrophe" ENDIF IF ARE_STRINGS_EQUAL(sCharacter, "^") // Fallback as we can't specify " in code sCharacter = "Speech" ENDIF // IF ARE_STRINGS_EQUAL(sCharacter, "%") // sCharacter = "%" // ENDIF IF ARE_STRINGS_EQUAL(sCharacter, "*") sCharacter = "Asterix" ENDIF // IF ARE_STRINGS_EQUAL(sCharacter, "+") // sCharacter = "+" // ENDIF // WIDER CHARACTERS // IF ARE_STRINGS_EQUAL(sCharacter, "M") // sCharacter = "M_WIDE" // ENDIF // // IF ARE_STRINGS_EQUAL(sCharacter, "W") // sCharacter = "W_WIDE" // ENDIF sLetterTexture += sCharacter vDisplayFinalPos.x += (fCarryOverX) fCarryOverX = 0 CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), sLetterTexture, vDisplayFinalPos, vScaleFinal, 0.0, rgbaStruct) // IF ARE_STRINGS_EQUAL(sCharacter, "M_WIDE") // OR ARE_STRINGS_EQUAL(sCharacter, "W_WIDE") // fCarryOverX = (vScaleFinal.x/8) // ENDIF IF ARE_STRINGS_EQUAL(sCharacter, ".") OR ARE_STRINGS_EQUAL(sCharacter, ":") OR ARE_STRINGS_EQUAL(sCharacter, "!") OR ARE_STRINGS_EQUAL(sCharacter, "'") fCarryOverX = -(vScaleFinal.x/8) ENDIF IF vScaleFinal.x > (vBaseLetterScale.x*fSizeMultiplier) vScaleFinal.x = (vBaseLetterScale.x*fSizeMultiplier) ENDIF vDisplayFinalPos.x += vScaleFinal.x // Add the size of a sprite Before displaying the next one. ENDFOR ENDPROC PROC CMHDZ_DRAW_DOLLAR_SYMBOL(VECTOR_2D vPos, FLOAT fScale = 1.0, INT iR = 255, INT iG = 255, INT iB = 255, INT iA = 255) //CMHDZ_DRAW_GAME_SPRITE(txTexture, vPos, vScale, 0, sCMHDZData.rgbaSprite) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("$", vPos, fScale, DEFAULT, DEFAULT, iR, iG, iB, iA) ENDPROC PROC CMHDZ_DRAW_HUD_CHAR_PACKED_ARRAY_AT_POSITION(FLOAT fX, FLOAT fY, INT &iCArray[], INT iNumCharactersInArray, RGBA_COLOUR_STRUCT col) INT i CMHDZ_HUD_CHAR eChar VECTOR_2D vPos = INIT_VECTOR_2D(fx, fy) VECTOR_2D vScale = INIT_VECTOR_2D(CMHDZ_PX_HUD_CHAR_WIDTH * sCMHDZData.vTextScale.x, CMHDZ_PX_HUD_CHAR_HEIGHT * sCMHDZData.vTextScale.y) FLOAT sWidth // get string len REPEAT iNumCharactersInArray i eChar = CMHDZ_UNPACK_HUD_CHAR_FROM_ARRAY(iCArray, i) vScale = CMHDZ_GET_HUD_CHAR_SIZE(eChar, sCMHDZData.vTextScale.x, sCMHDZData.vTextScale.y) sWidth += vScale.x ENDREPEAT vPos.y += (vScale.y / 2) SWITCH (sCMHDZData.eTextPivot) CASE CMHDZ_HUD_TEXTPIVOT_LEFT vPos.x += (vScale.x / 2) BREAK CASE CMHDZ_HUD_TEXTPIVOT_CENTER vPos.x -= (sWidth / 2.0) vPos.x += (CMHDZ_PX_HUD_CHAR_WIDTH / 2.0) BREAK CASE CMHDZ_HUD_TEXTPIVOT_RIGHT vPos.x -= (sWidth) BREAK ENDSWITCH STRING txtDir = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT) REPEAT iNumCharactersInArray i eChar = CMHDZ_UNPACK_HUD_CHAR_FROM_ARRAY(iCArray, i) IF (eChar != CMHDZ_HUD_CHAR_SPACE) AND (eChar != CMHDZ_HUD_CHAR_INVALID) vScale = CMHDZ_GET_HUD_CHAR_SIZE(eChar, sCMHDZData.vTextScale.x, sCMHDZData.vTextScale.y) CMHDZ_DRAW_GAME_SPRITE_DETAILS(txtDir, CMHDZ_GET_HUD_CHAR_SPRITE(eChar), vPos, vScale, 0, col) vPos.x += vScale.x ELSE vPos.x += (CMHDZ_PX_HUD_CHAR_WIDTH * sCMHDZData.vTextScale.x) ENDIF ENDREPEAT ENDPROC PROC CMHDZ_DRAW_REC_TEXT(VECTOR_2D vPos, RGBA_COLOUR_STRUCT col) INT iCArray[1] //REC: - # Chars:4 iCArray[0] = 10806301 CMHDZ_SET_HUD_CHAR_SCALE(1.5, 1.5) CMHDZ_SET_HUD_CHAR_PIVOT(CMHDZ_HUD_TEXTPIVOT_LEFT) CMHDZ_DRAW_HUD_CHAR_PACKED_ARRAY_AT_POSITION(vPos.x, vPos.y, iCArray, 4, col) ENDPROC PROC CMHDZ_DRAW_SIGNAL_FAILURE_TEXT() // TEXT_LABEL_31 tl31Sprite = "LEVEL_0" // tl31Sprite += ENUM_TO_INT(sCMHDZData.eCurrentLevel)+1 // tl31Sprite += "_OUTRO_FAIL" // // CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_RESULTS), tl31Sprite, vPos, INIT_VECTOR_2D(320, 104), 0, sCMHDZData.rgbaSprite) VECTOR_2D vPos = INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH / 2, cfBASE_SCREEN_HEIGHT * 0.3) VECTOR_2D vLeftPos = INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH / 3, cfBASE_SCREEN_HEIGHT * 0.5) SWITCH sCMHDZData.eCurrentLevel CASE CMHDZ_LEVEL_CITY ARCADE_DRAW_PIXELSPACE_RECT(vPos, INIT_VECTOR_2D(600, 80), sCMHDZData.rgbaSprite) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("BUTCHERED!", INIT_VECTOR_2D(vPos.x, vPos.y), 1.0, TRUE, 10, 0, 0, 0) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("[The Hoodz shot you down]", vLeftPos, DEFAULT, TRUE) BREAK CASE CMHDZ_LEVEL_SCRAPYARD ARCADE_DRAW_PIXELSPACE_RECT(vPos, INIT_VECTOR_2D(600, 80), sCMHDZData.rgbaSprite) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("EXECUTED!", INIT_VECTOR_2D(vPos.x, vPos.y), 1.0, TRUE, 9, 0,0,0) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("THE INNOCENTZ CORRUPTED YOUR HEAD.", vLeftPos, DEFAULT, TRUE) BREAK CASE CMHDZ_LEVEL_ASYLUM ARCADE_DRAW_PIXELSPACE_RECT(vPos, INIT_VECTOR_2D(600, 80), sCMHDZData.rgbaSprite) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("MASSACRED!", INIT_VECTOR_2D(vPos.x, vPos.y), 1.0, TRUE, 10, 0,0,0) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("THERE WAS NO GETTING PAST THESE GUARDZ.", vLeftPos, DEFAULT, TRUE) BREAK CASE CMHDZ_LEVEL_PARK ARCADE_DRAW_PIXELSPACE_RECT(vPos, INIT_VECTOR_2D(600, 80), sCMHDZData.rgbaSprite) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("MURDERED!", INIT_VECTOR_2D(vPos.x, vPos.y), 1.0, TRUE, 9, 0, 0, 0) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("THE CLOWNZ SPLIT YOUR SIDES.", vLeftPos, DEFAULT, TRUE) BREAK CASE CMHDZ_LEVEL_SLAUGHTERHOUSE ARCADE_DRAW_PIXELSPACE_RECT(vPos, INIT_VECTOR_2D(600, 80), sCMHDZData.rgbaSprite) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("OBLITERATED!", INIT_VECTOR_2D(vPos.x, vPos.y), 1.0, TRUE, 12, 0, 0, 0) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("You got trampled by the Hurd.", vLeftPos, DEFAULT, TRUE) BREAK ENDSWITCH ENDPROC PROC CMHDZ_DRAW_EJECT_OPTION_TEXT(VECTOR_2D vPos, RGBA_COLOUR_STRUCT col) INT iCArray[1] //EJECT - # Chars:5 iCArray[0] = 523830608 CMHDZ_SET_HUD_CHAR_SCALE(1.0, 1.0) CMHDZ_SET_HUD_CHAR_PIVOT(CMHDZ_HUD_TEXTPIVOT_CENTER) CMHDZ_DRAW_HUD_CHAR_PACKED_ARRAY_AT_POSITION(vPos.x, vPos.y, iCArray, 5, col) ENDPROC PROC CMHDZ_DRAW_REWIND_OPTION_TEXT(VECTOR_2D vPos, RGBA_COLOUR_STRUCT col) INT iCArray[2] //REWIND - # Chars:6 iCArray[0] = 424813597 iCArray[1] = 15 CMHDZ_SET_HUD_CHAR_SCALE(1.0, 1.0) CMHDZ_SET_HUD_CHAR_PIVOT(CMHDZ_HUD_TEXTPIVOT_CENTER) CMHDZ_DRAW_HUD_CHAR_PACKED_ARRAY_AT_POSITION(vPos.x, vPos.y, iCArray, 6, col) ENDPROC PROC CMHDZ_DRAW_NO_AMMO_TEXT(RGBA_COLOUR_STRUCT col) INT iCArray[2] //NO AMMO! - # Chars:8 iCArray[0] = 405804697 iCArray[1] = 181912 CMHDZ_SET_HUD_CHAR_SCALE(1.5, 1.5) CMHDZ_SET_HUD_CHAR_PIVOT(CMHDZ_HUD_TEXTPIVOT_CENTER) CMHDZ_DRAW_HUD_CHAR_PACKED_ARRAY_AT_POSITION(cfBASE_SCREEN_WIDTH / 2, cfBASE_SCREEN_HEIGHT / 2, iCArray, 8, col) ENDPROC PROC CMHDZ_DRAW_RELOAD_TEXT(RGBA_COLOUR_STRUCT col) INT iCArray[2] //RELOAD! - # Chars:7 iCArray[0] = 208237597 iCArray[1] = 2831 CMHDZ_SET_HUD_CHAR_SCALE(1.5, 1.5) CMHDZ_SET_HUD_CHAR_PIVOT(CMHDZ_HUD_TEXTPIVOT_CENTER) CMHDZ_DRAW_HUD_CHAR_PACKED_ARRAY_AT_POSITION(cfBASE_SCREEN_WIDTH / 2, cfBASE_SCREEN_HEIGHT / 2, iCArray, 7, col) ENDPROC PROC CMHDZ_DRAW_ROUND_START_TEXT(RGBA_COLOUR_STRUCT col) INT iCArray[3] //TAPE 1 START - # Chars:12 iCArray[0] = 21082911 iCArray[1] = 209576003 iCArray[2] = 2013 CMHDZ_PACK_SINGLE_DIGIT_TO_HUD_CHAR_ARRAY(ENUM_TO_INT(sCMHDZData.eCurrentLevel) + 1, 5, iCArray) CMHDZ_SET_HUD_CHAR_SCALE(1.5, 1.5) CMHDZ_SET_HUD_CHAR_PIVOT(CMHDZ_HUD_TEXTPIVOT_CENTER) CMHDZ_DRAW_HUD_CHAR_PACKED_ARRAY_AT_POSITION(cfBASE_SCREEN_WIDTH / 2, cfBASE_SCREEN_HEIGHT / 2, iCArray, 12, col) ENDPROC PROC CMHDZ_DRAW_ROUND_CLEAR_TEXT(RGBA_COLOUR_STRUCT col) INT iCArray[2] //TAPE 1 END - # Chars:10 iCArray[0] = 21082911 iCArray[1] = 258277443 CMHDZ_PACK_SINGLE_DIGIT_TO_HUD_CHAR_ARRAY(ENUM_TO_INT(sCMHDZData.eCurrentLevel) + 1, 5, iCArray) CMHDZ_SET_HUD_CHAR_SCALE(1.5, 1.5) CMHDZ_SET_HUD_CHAR_PIVOT(CMHDZ_HUD_TEXTPIVOT_CENTER) CMHDZ_DRAW_HUD_CHAR_PACKED_ARRAY_AT_POSITION(cfBASE_SCREEN_WIDTH / 2, cfBASE_SCREEN_HEIGHT / 2, iCArray, 10, col) ENDPROC PROC CMHDZ_DRAW_TIME_TEXT(VECTOR_2D vPos, INT iMilliSeconds, RGBA_COLOUR_STRUCT col, CMHDZ_HUD_TEXTPIVOT just = CMHDZ_HUD_TEXTPIVOT_RIGHT) INT iCArray[2] //00:00:00 - # Chars:8 iCArray[0] = 34246786 iCArray[1] = 8361 // break milliseconds into time INT iHths = (iMilliSeconds / 10) % 100 INT iSecs = (iMilliSeconds / 1000) % 60 INT iMins = (iMilliSeconds / 60000) % 60 // replace chars CMHDZ_PACK_SINGLE_DIGIT_TO_HUD_CHAR_ARRAY((iHths % 10), 7, iCArray) CMHDZ_PACK_SINGLE_DIGIT_TO_HUD_CHAR_ARRAY(((iHths / 10) % 10), 6, iCArray) CMHDZ_PACK_SINGLE_DIGIT_TO_HUD_CHAR_ARRAY((iSecs % 10), 4, iCArray) CMHDZ_PACK_SINGLE_DIGIT_TO_HUD_CHAR_ARRAY(((iSecs / 10) % 10), 3, iCArray) CMHDZ_PACK_SINGLE_DIGIT_TO_HUD_CHAR_ARRAY((iMins % 10), 1, iCArray) CMHDZ_PACK_SINGLE_DIGIT_TO_HUD_CHAR_ARRAY(((iMins / 10) % 10), 0, iCArray) CMHDZ_SET_HUD_CHAR_SCALE(1.5, 1.5) CMHDZ_SET_HUD_CHAR_PIVOT(just) CMHDZ_DRAW_HUD_CHAR_PACKED_ARRAY_AT_POSITION(vPos.x, vPos.y, iCArray, 8, col) ENDPROC PROC CMHDZ_DRAW_PLAYER_SCORE_TEXT(INT sc, RGBA_COLOUR_STRUCT col, FLOAT fx = 680.0, FLOAT fy = 95.0, CMHDZ_HUD_TEXTPIVOT ePivot = CMHDZ_HUD_TEXTPIVOT_USE_STORED) INT iMaxDigits, i, n INT iCurValue INT iCArray[2] //00:00:00 - # Chars:8 iCArray[0] = 34246786 iCArray[1] = 8361 // get number bit IF (sc > 0) iCurValue = sc iMaxDigits = CMHDZ_GET_NUMBER_OF_DIGITS_IN_NUMBER(sc) n = 0 REPEAT iMaxDigits i CMHDZ_PACK_SINGLE_DIGIT_TO_HUD_CHAR_ARRAY((iCurValue % 10), 7 - n, iCArray) iCurValue /= 10 // seperate every second number with : IF (i % 2 != 0) n ++ ENDIF n ++ ENDREPEAT ENDIF CMHDZ_SET_HUD_CHAR_SCALE(1.5, 1.5) IF (ePivot != CMHDZ_HUD_TEXTPIVOT_USE_STORED) CMHDZ_SET_HUD_CHAR_PIVOT(ePivot) ELIF (ePivot != sCMHDZData.eTextPivot) CMHDZ_SET_HUD_CHAR_PIVOT(ePivot) ENDIF CMHDZ_DRAW_HUD_CHAR_PACKED_ARRAY_AT_POSITION(fx, fy, iCArray, 8, col) ENDPROC PROC CMHDZ_DRAW_HORIZONTAL_MASK_SPRITE(STRING sTexDict, STRING sTexName, VECTOR_2D vCenter, VECTOR_2D vScale, FLOAT maskRatio, FLOAT rot, RGBA_COLOUR_STRUCT col) VECTOR_2D vNewScale = vScale vNewScale.y *= maskRatio vCenter.y -= (vScale.y / 2.0) vCenter.y += (vNewScale.y / 2.0) vCenter.y += sCMHDZData.fSyncOffsetY ARCADE_DRAW_PIXELSPACE_SPRITE_WITH_UV(sTexDict, sTexName, vCenter, vNewScale, INIT_VECTOR_2D(0, 0), INIT_VECTOR_2D(1, maskRatio), rot, col) ENDPROC PROC CMHDZ_DRAW_GAME_OVER_EFFECT() VECTOR_2D vu, vy RGBA_COLOUR_STRUCT col VECTOR_2D vNoise = INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH, cfGAME_SCREEN_HEIGHT) // // FLOAT fDesiredFrameTime = 48.0 // FLOAT fFrameTime = (0.0+@1000) // fFrameTime += (fFrameTime%8.0) // CDEBUG2LN(DEBUG_MINIGAME, "CMHDZ_DRAW_GAME_OVER_EFFECT - fFrameTime mod: ", fFrameTime) // vu.x = 1.0 // vu.y = 1.0 // If fc is 242 // resired ft is 32 // Reality ft 4 // INT iFrameCount = ROUND(GET_FRAME_COUNT() / (fDesiredFrameTime/fFrameTime)) // CDEBUG2LN(DEBUG_MINIGAME, "CMHDZ_DRAW_GAME_OVER_EFFECT - iFrameCount: ", iFrameCount) // If frameTime = 4 we get 8 by *2 // If frameTime = 8 do nothing // If frameTime = 24 we get 8 by / 3 // If frameTime = 32 we get 8 by / 4 SWITCH (GET_FRAME_COUNT() % 8) CASE 0 CASE 1 vNoise = INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH, cfGAME_SCREEN_HEIGHT) BREAK CASE 2 CASE 3 vNoise = INIT_VECTOR_2D(-cfGAME_SCREEN_WIDTH, cfGAME_SCREEN_HEIGHT) BREAK CASE 4 CASE 5 vNoise = INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH, -cfGAME_SCREEN_HEIGHT) BREAK CASE 6 CASE 7 vNoise = INIT_VECTOR_2D(-cfGAME_SCREEN_WIDTH, -cfGAME_SCREEN_HEIGHT) BREAK ENDSWITCH INIT_RGBA_STRUCT(col, 190, 190, 170, 150) vu.x = GET_RANDOM_FLOAT_IN_RANGE(0.0, 0.25) vu.y = GET_RANDOM_FLOAT_IN_RANGE(0.0, 0.25) vy.x = vu.x + 0.75 vy.y = vu.y + 0.75 vy.x *= 2.0 vy.y *= 2.0 // Testing doubling effect ARCADE_DRAW_PIXELSPACE_SPRITE_WITH_UV(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_DAMAGE), "critical_damage_fx_001", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), vNoise, vu, vy, 0, col) // ARCADE_DRAW_PIXELSPACE_SPRITE_WITH_UV(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_DAMAGE), "critical_damage_fx_001", // INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), vNoise, vu, vy, 0, col) ENDPROC PROC CMHDZ_DRAW_HEAVY_DAMAGE_EFFECT() VECTOR_2D vu, vy RGBA_COLOUR_STRUCT col VECTOR_2D vNoise = INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH, cfGAME_SCREEN_HEIGHT) SWITCH (GET_FRAME_COUNT() % 8) CASE 0 CASE 1 vNoise = INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH, cfGAME_SCREEN_HEIGHT) BREAK CASE 2 CASE 3 vNoise = INIT_VECTOR_2D(-cfGAME_SCREEN_WIDTH, cfGAME_SCREEN_HEIGHT) BREAK CASE 4 CASE 5 vNoise = INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH, -cfGAME_SCREEN_HEIGHT) BREAK CASE 6 CASE 7 vNoise = INIT_VECTOR_2D(-cfGAME_SCREEN_WIDTH, -cfGAME_SCREEN_HEIGHT) BREAK ENDSWITCH col = sCMHDZData.rgbaWhiteSafe col.iA = 145 //INIT_RGBA_STRUCT(col, 255, 255, 255, 145) vu.x = GET_RANDOM_FLOAT_IN_RANGE(0.0, 0.25) vu.y = GET_RANDOM_FLOAT_IN_RANGE(0.0, 0.25) vy.x = vu.x + 0.75 vy.y = vu.y + 0.75 //vy.x *= 2.0 vy.y *= 2.0 ARCADE_DRAW_PIXELSPACE_SPRITE_WITH_UV(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_DAMAGE), "heavy_damage_fx_overlay_001", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), vNoise, vu, vy, 0, col) ENDPROC PROC CMHDZ_DRAW_REWIND_SYMBOL() VECTOR_2D vPos1 = INIT_VECTOR_2D(420, cfCMHDZ_SPRITE_HUD_HP_INDICATOR_Y + 48) VECTOR_2D vPos2 = INIT_VECTOR_2D(vPos1.x + 48,vPos1.y) VECTOR_2D vScaleRev = INIT_VECTOR_2D(-48,80) CMHDZ_DRAW_GAME_SPRITE_DETAILS("MPCamhedzVHSFont", "PLAY", vPos1, vScaleRev, 0.0, sCMHDZData.rgbaSprite) CMHDZ_DRAW_GAME_SPRITE_DETAILS("MPCamhedzVHSFont", "PLAY", vPos2, vScaleRev, 0.0, sCMHDZData.rgbaSprite) ENDPROC PROC CMHDZ_DRAW_PLAY_SYMBOL() IF (sCMHDZData.iFade < 10.0) EXIT ENDIF CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("PLY:", INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_HP_INDICATOR_X + 20, cfCMHDZ_SPRITE_HUD_HP_INDICATOR_Y + 28), 1.5) VECTOR_2D vPos1 = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_HP_INDICATOR_X + 160, cfCMHDZ_SPRITE_HUD_HP_INDICATOR_Y + 28) VECTOR_2D vScaleRev = INIT_VECTOR_2D(48,40) CMHDZ_DRAW_GAME_SPRITE_DETAILS("MPCamhedzVHSFont", "PLAY", vPos1, vScaleRev, 0.0, sCMHDZData.rgbaGreen) ENDPROC PROC CMHDZ_DRAW_STOP_SYMBOL() CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("STP:", INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_HP_INDICATOR_X + 20, cfCMHDZ_SPRITE_HUD_HP_INDICATOR_Y + 28), 1.5) VECTOR_2D vPos1 = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_HP_INDICATOR_X + 160, cfCMHDZ_SPRITE_HUD_HP_INDICATOR_Y + 28) VECTOR_2D vScaleRev = INIT_VECTOR_2D(48,48) vPos1.y += sCMHDZData.fSyncOffsetY ARCADE_DRAW_PIXELSPACE_RECT(vPos1, vScaleRev, sCMHDZData.rgbaRedText) ENDPROC PROC CMHDZ_DRAW_SELECT_SYMBOL(VECTOR_2D vPos1) VECTOR_2D vScaleRev = INIT_VECTOR_2D(24,40) CMHDZ_DRAW_GAME_SPRITE_DETAILS("MPCamhedzVHSFont", "PLAY", vPos1, vScaleRev, 0.0, sCMHDZData.rgbaSprite) ENDPROC PROC CMHDZ_DRAW_REWIND_EFFECT() VECTOR_2D vu, vy vu.x = GET_RANDOM_FLOAT_IN_RANGE(0.0, 0.25) vu.y = GET_RANDOM_FLOAT_IN_RANGE(0.0, 0.25) vy.x = vu.x + 0.75 vy.y = vu.y + 0.75 //vy.x *= 2.0 vy.y *= 2.0 RGBA_COLOUR_STRUCT col = sCMHDZData.rgbaWhiteSafe col.iA -= 100 ARCADE_DRAW_PIXELSPACE_SPRITE_WITH_UV(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_DAMAGE), "damage_fx_overlay_001", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, (cfBASE_SCREEN_HEIGHT/2) - 180), INIT_VECTOR_2D(1500, 200), vu, vy, 0, col) ARCADE_DRAW_PIXELSPACE_SPRITE_WITH_UV(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_DAMAGE), "damage_fx_overlay_001", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, (cfBASE_SCREEN_HEIGHT/2) + 220), INIT_VECTOR_2D(1500, 200), vu, vy, 0, col) // ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2,cfBASE_SCREEN_HEIGHT/2), // INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH,cfBASE_SCREEN_HEIGHT), // sCMHDZData.rgbaBlack) ENDPROC PROC CMHDZ_DRAW_DAMAGE_NOISE(INT iAlpha = 255) VECTOR_2D vu, vy RGBA_COLOUR_STRUCT col VECTOR_2D vNoise = INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH, cfGAME_SCREEN_HEIGHT) SWITCH (GET_FRAME_COUNT() % 8) CASE 0 CASE 1 vNoise = INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH, cfGAME_SCREEN_HEIGHT) BREAK CASE 2 CASE 3 vNoise = INIT_VECTOR_2D(-cfGAME_SCREEN_WIDTH, cfGAME_SCREEN_HEIGHT) BREAK CASE 4 CASE 5 vNoise = INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH, -cfGAME_SCREEN_HEIGHT) BREAK CASE 6 CASE 7 vNoise = INIT_VECTOR_2D(-cfGAME_SCREEN_WIDTH, -cfGAME_SCREEN_HEIGHT) BREAK ENDSWITCH col = sCMHDZData.rgbaWhiteSafe col.iA = iAlpha //INIT_RGBA_STRUCT(col, 255, 255, 255, iAlpha) vu.x = GET_RANDOM_FLOAT_IN_RANGE(0.0, 0.25) vu.y = GET_RANDOM_FLOAT_IN_RANGE(0.0, 0.25) vy.x = vu.x + 0.75 vy.y = vu.y + 0.75 //vy.x *= 2.0 vy.y *= 2.0 // Testing doubling effect ARCADE_DRAW_PIXELSPACE_SPRITE_WITH_UV(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_DAMAGE), "damage_fx_overlay_001", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), vNoise, vu, vy, 0, col) // ARCADE_DRAW_PIXELSPACE_SPRITE_WITH_UV(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_DAMAGE), "damage_fx_overlay_001", // INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), vNoise, vu, vy, 0, col) ENDPROC /////////////////////////////// /// Star Rating System /// /////////////////////////////// PROC CMHDZ_DRAW_STAR_RATING(VECTOR_2D vPos, FLOAT rating, FLOAT starSize = 64.0) INT i RGBA_COLOUR_STRUCT col VECTOR_2D starPos = vPos VECTOR_2D size = INIT_VECTOR_2D(starSize, starSize) STRING textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT) // draw full stars REPEAT 5 i IF (i <= (ROUND(rating))) col = sCMHDZData.rgbaYellow ELSE col = sCMHDZData.rgbaWhite ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(textDict, "STAR", starPos, size, 0, col) starPos.y -= (size.y + 5) ENDREPEAT // draw section star IF (rating > 5) EXIT ENDIF // IF ((pc = 0.0) OR (pc = 1.0)) // EXIT // ENDIF // VECTOR_2D vu, vy // // starPos = vPos // starPos.x += ((size.x + 5) * FLOOR(rating)) // starPos.x -= (starSize / 2.0) // //starPos.x += ((starSize * pc) / 2.0) // vu = INIT_VECTOR_2D(0, 0) // vy = INIT_VECTOR_2D(pc, 1) // size = INIT_VECTOR_2D(starSize * pc, starSize) // // col = sCMHDZData.rgbaYellow // ARCADE_DRAW_PIXELSPACE_SPRITE_WITH_UV(textDict, "STAR", starPos, size, vu, vy, 0, col) ENDPROC PROC CMHDZ_DRAW_STAR_RATING_RESULTS(VECTOR_2D vPos, FLOAT rating, FLOAT starSize = 64.0) INT i RGBA_COLOUR_STRUCT col VECTOR_2D starPos = vPos VECTOR_2D size = INIT_VECTOR_2D(starSize, starSize) STRING textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT) // draw full stars REPEAT 5 i IF (i <= (ROUND(rating))) col = sCMHDZData.rgbaYellow ELSE col = sCMHDZData.rgbaWhite ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(textDict, "STAR", starPos, size, 0, col) starPos.x += (size.x + 5) ENDREPEAT // draw section star IF (rating > 5) EXIT ENDIF // IF ((pc = 0.0) OR (pc = 1.0)) // EXIT // ENDIF // VECTOR_2D vu, vy // // starPos = vPos // starPos.x += ((size.x + 5) * FLOOR(rating)) // starPos.x -= (starSize / 2.0) // //starPos.x += ((starSize * pc) / 2.0) // vu = INIT_VECTOR_2D(0, 0) // vy = INIT_VECTOR_2D(pc, 1) // size = INIT_VECTOR_2D(starSize * pc, starSize) // // col = sCMHDZData.rgbaYellow // ARCADE_DRAW_PIXELSPACE_SPRITE_WITH_UV(textDict, "STAR", starPos, size, vu, vy, 0, col) ENDPROC PROC CMHDZ_ASIGN_STAR_RATING(CMHDZ_LEVELS level) INT iMaxScore = 0 FLOAT fRating = 0.0 FLOAT pc = 0.0 // Per level score ceiling based on overall enemy count for each stage // Level 5 scores should be based on total enemy count * default enemy score. // Scale accordingly SWITCH(level) CASE CMHDZ_LEVEL_CITY iMaxScore = 10000 BREAK CASE CMHDZ_LEVEL_SCRAPYARD iMaxScore = 10000 BREAK CASE CMHDZ_LEVEL_ASYLUM iMaxScore = 10000 BREAK CASE CMHDZ_LEVEL_PARK iMaxScore = 20000 BREAK CASE CMHDZ_LEVEL_SLAUGHTERHOUSE iMaxScore = 100000 BREAK ENDSWITCH CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_ASIGN_STAR_RATING - iStageScore: ", CMHDZ_GET_LOCAL_PLAYER_SCORE_FOR_LEVEL(ENUM_TO_INT(level))) CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_ASIGN_STAR_RATING - MaxScore: ", iMaxScore) fRating = (TO_FLOAT(CMHDZ_GET_LOCAL_PLAYER_SCORE_FOR_LEVEL(ENUM_TO_INT(level)))) fRating += (TO_FLOAT(playerBd[PARTICIPANT_ID_TO_INT()].iPlayerScore[level]) * ((CMHDZ_GET_PLAYER_ACCURACY_FOR_LEVEL(level)) / 100.0)) fRating /= iMaxScore // Percentage // Round up fRating = (fRating*5.0) pc = fRating - TO_FLOAT(FLOOR(fRating)) fRating -= pc fRating -= 1 //Correction for rounding playerBd[PARTICIPANT_ID_TO_INT()].fPlayerStarRating[level] = fRating ENDPROC PROC CMHDZ_DRAW_STAR_RATING_FOR_STAGE(VECTOR_2D pos, CMHDZ_LEVELS level, FLOAT fSpriteSize = 24.0) CMHDZ_DRAW_STAR_RATING(pos, playerBd[PARTICIPANT_ID_TO_INT()].fPlayerStarRating[level], fSpriteSize) ENDPROC PROC CMHDZ_DRAW_STAR_RATING_RESULTS_FOR_STAGE(VECTOR_2D pos, CMHDZ_LEVELS level, FLOAT fSpriteSize = 24.0) CMHDZ_DRAW_STAR_RATING_RESULTS(pos, playerBd[PARTICIPANT_ID_TO_INT()].fPlayerStarRating[level], fSpriteSize) ENDPROC /////////////////////////////// PROC TWS_DRAW_FRONT_FX() ARCADE_GAMES_POSTFX_DRAW() #IF IS_DEBUG_BUILD IF sCMHDZData.bDisableFacade EXIT ENDIF #ENDIF ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_FACADE), "Badlands_Bezel", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), 0, sCMHDZData.rgbaWhite) ENDPROC /// PURPOSE: /// Different scores (Hi-score, current score, rival's score) are different colours. Need to construct the texture name /// PARAMS: /// iInsertValue - The integer value represented by the texture /// RETURNS: /// FUNC TEXT_LABEL_63 CMHDZ_GET_SCORE_INTEGER_TEXTURE_NAME(INT iInsertValue)//CMHDZ_SCORE_INTEGER_TYPE type, INT iInsertValue) TEXT_LABEL_63 tlTextureName tlTextureName = "FONT_" tlTextureName += iInsertValue RETURN tlTextureName ENDFUNC FUNC RGBA_COLOUR_STRUCT CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE type)//CMHDZ_SCORE_INTEGER_TYPE type, INT iInsertValue) RGBA_COLOUR_STRUCT colReturn = sCMHDZData.rgbaWhite SWITCH type CASE CMHDZ_SCORE_INTEGER_TYPE_BLUE_SCORE INIT_RGBA_STRUCT(colReturn, 0,0,255,255) BREAK CASE CMHDZ_SCORE_INTEGER_TYPE_MY_SCORE INIT_RGBA_STRUCT(colReturn, 255,171,0,255) BREAK CASE CMHDZ_SCORE_INTEGER_TYPE_RED_SCORE INIT_RGBA_STRUCT(colReturn, 255,0,0,255) BREAK ENDSWITCH RETURN colReturn ENDFUNC // See Alex's DEGENATRON_GAMES_DRAW_INTEGER PROC CMHDZ_DRAW_SCORE_INTEGER(INT iValue, INT iDigits, VECTOR_2D vCenter,RGBA_COLOUR_STRUCT rgba, FLOAT fScale = 1.0) VECTOR_2D vCharCenter = vCenter VECTOR_2D vCharSize = INIT_VECTOR_2D(cfCMHDZ_MY_HISCORE_X_DIGIT_SIZE * fScale, cfCMHDZ_MY_HISCORE_Y_DIGIT_SIZE * fScale) BOOL bZero = (iValue = 0) INT iChar IF iDigits = 0 INT currentValue currentValue = iValue IF iValue > 0 iDigits = FLOOR(LOG10(TO_FLOAT(iValue)))+1 ELIF iValue = 0 iDigits = 1 ENDIF // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_SCORE_INTEGER] {DSW} ") // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_SCORE_INTEGER] {DSW} iValue: ", iValue, " iDigits: ", iDigits, " Orig vCenter.x: ", vCenter.x, " vCharSize.x: ", vCharSize.x) WHILE currentValue > 0 OR bZero bZero = FALSE vCharCenter.x = vCenter.x + (vCharSize.x * (iDigits-1)/2.0) - (vCharSize.x * iChar) // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_SCORE_INTEGER] {DSW} currentValue: ", currentValue, " vCharCenter.x: ", vCharCenter.x, " iChar: ", iChar, " Drawing value: ",currentValue % 10) TEXT_LABEL_63 tlTextureName = CMHDZ_GET_SCORE_INTEGER_TEXTURE_NAME(currentValue % 10) currentValue /= 10 CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), tlTextureName,vCharCenter,vCharSize,0.0, rgba) iChar++ ENDWHILE ELSE REPEAT iDigits iChar vCharCenter.x = vCenter.x + vCharSize.x * (iDigits-1)/2.0 - vCharSize.x * iChar TEXT_LABEL_63 tlTextureName = CMHDZ_GET_SCORE_INTEGER_TEXTURE_NAME((iValue / ROUND(POW(10.0,to_float(iChar)))) % 10) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), tlTextureName,vCharCenter,vCharSize,0.0, rgba) ENDREPEAT ENDIF ENDPROC PROC CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(INT iValue, VECTOR_2D vCenter, RGBA_COLOUR_STRUCT rgba, FLOAT fScale = 1.0) //CMHDZ_SCORE_INTEGER_TYPE scoreType, FLOAT fScale = 1.0) // VECTOR_2D vCharCenter = vCenter // VECTOR_2D vCharSize = INIT_VECTOR_2D(cfCMHDZ_MY_HISCORE_X_DIGIT_SIZE * fScale, cfCMHDZ_MY_HISCORE_Y_DIGIT_SIZE * fScale) // BOOL bZero = (iValue = 0) //INT iChar // INT iDigits = 0 TEXT_LABEL_15 tl16Score tl16Score += "$" tl16Score += iValue CMHDZ_WRITE_STRING_USING_TEXT_SPRITES(tl16Score, vCenter, fScale, DEFAULT, DEFAULT, rgba.iR, rgba.iG, rgba.iB, rgba.iA) // CMHDZ_DRAW_DOLLAR_SYMBOL(vCenter, fScale, rgba.iR, rgba.iG, rgba.iB, rgba.iA) // // IF iDigits = 0 // INT currentValue // currentValue = iValue // IF iValue > 0 // iDigits = FLOOR(LOG10(TO_FLOAT(iValue)))+1 // ELIF iValue = 0 // iDigits = 1 // ENDIF // // // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_SCORE_INTEGER] {DSW} ") // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_SCORE_INTEGER] {DSW} iValue: ", iValue, " iDigits: ", iDigits, " Orig vCenter.x: ", vCenter.x, " vCharSize.x: ", vCharSize.x) // WHILE currentValue > 0 OR bZero // bZero = FALSE // //vCharCenter.x = vCenter.x + (vCharSize.x * (iDigits-1)/2.0) - (vCharSize.x * iChar) // vCharCenter.x = vCenter.x + (vCharSize.x * (iChar + 1)) // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_SCORE_INTEGER] {DSW} currentValue: ", currentValue, " vCharCenter.x: ", vCharCenter.x, " iChar: ", iChar, " Drawing value: ",currentValue % 10) // TEXT_LABEL_63 tlTextureName = CMHDZ_GET_SCORE_INTEGER_TEXTURE_NAME(currentValue % 10) // currentValue /= 10 // CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), tlTextureName,vCharCenter,vCharSize,0.0, rgba) // iChar++ // ENDWHILE // // ENDIF ENDPROC //FUNC TEXT_LABEL_63 CMHDZ_GET_PERCENTAGE_SIGN_TEXTURE_FOR_SCORE_TYPE(CMHDZ_SCORE_INTEGER_TYPE type) // TEXT_LABEL_63 tlTextureName // // // SWITCH type // // CASE CMHDZ_SCORE_INTEGER_TYPE_BLUE_SCORE tlTextureName = "FONT_%" BREAK // CASE CMHDZ_SCORE_INTEGER_TYPE_RED_SCORE tlTextureName = "SCORE_TEXT_PERCENTAGE_RED" BREAK // // ENDSWITCH // // // RETURN tlTextureName //ENDFUNC //FUNC TEXT_LABEL_63 CMHDZ_GET_CROSS_CHAR_TEXTURE_FOR_SCORE_TYPE(CMHDZ_SCORE_INTEGER_TYPE type) // TEXT_LABEL_63 tlTextureName // // // SWITCH type // // CASE CMHDZ_SCORE_INTEGER_TYPE_BLUE_SCORE tlTextureName = "SCORE_TEXT_X_BLUE" BREAK // CASE CMHDZ_SCORE_INTEGER_TYPE_RED_SCORE tlTextureName = "SCORE_TEXT_X_RED" BREAK // // ENDSWITCH // // // RETURN tlTextureName //ENDFUNC PROC GET_SCORE_DIGITS_AS_ARRAY(INT iScore, INT iDigits, INT &ScoreArray[]) // //CDEBUG2LN(DEBUG_MINIGAME, "[GET_SCORE_DIGITS_AS_ARRAY] {DSW} ") // //CDEBUG2LN(DEBUG_MINIGAME, "[GET_SCORE_DIGITS_AS_ARRAY] {DSW} iScore: ", iScore, " iDigits:", iDigits ) INT iChar = 0 INT i = 0 FOR iChar = (iDigits-1) to 0 STEP - 1 ScoreArray[i] = (iScore / ROUND(POW(10.0,to_float(iChar)))) % 10 // //CDEBUG2LN(DEBUG_MINIGAME, "[GET_SCORE_DIGITS_AS_ARRAY] {DSW} ScoreArray[", i, "] = ",ScoreArray[i] ) i++ ENDFOR ENDPROC /// PURPOSE: /// Draw the value specified where the 'center' value is the position of the 'left-most' (i.e. first) digit /// PARAMS: /// iValue - /// vLeftMostCenter - /// rgba - /// scoreType - /// fScale - PROC CMHDZ_DRAW_SCORE_INTEGER_CENTER_LEFT_MOST(INT iValue, VECTOR_2D vLeftMostCenter,RGBA_COLOUR_STRUCT rgba, FLOAT fScale = 1.0, BOOL bWithDollar = FALSE, BOOL bWithPercentage = FALSE) VECTOR_2D vCharSize = INIT_VECTOR_2D(cfCMHDZ_MY_HISCORE_X_DIGIT_SIZE * fScale, cfCMHDZ_MY_HISCORE_Y_DIGIT_SIZE * fScale) INT iScoreDigits[10] INT i INT iNumDigits = FLOOR(LOG10(TO_FLOAT(iValue))) + 1 GET_SCORE_DIGITS_AS_ARRAY(iValue, iNumDigits, iScoreDigits) TEXT_LABEL_63 tlTextureName VECTOR_2D vCenter REPEAT iNumDigits i tlTextureName = CMHDZ_GET_SCORE_INTEGER_TEXTURE_NAME(iScoreDigits[i]) vCenter.y = vLeftMostCenter.y vCenter.x = vLeftMostCenter.x + (i * vCharSize.x) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT),tlTextureName,vCenter,vCharSize,0.0, rgba) ENDREPEAT IF bWithDollar vCenter.x = vLeftMostCenter.x - (i * vCharSize.x) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("$", vCenter) ENDIF // Ad percentage onto end IF bWithPercentage AND !bWithDollar vCenter.x += (vCharSize.x) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("%", vCenter) ENDIF ENDPROC PROC CMHDZ_DRAW_SCORE_ZERO( VECTOR_2D vLeftMostCenter,RGBA_COLOUR_STRUCT rgba, FLOAT fScale = 1.0)//CMHDZ_SCORE_INTEGER_TYPE scoreType, FLOAT fScale = 1.0) VECTOR_2D vCharSize = INIT_VECTOR_2D(cfCMHDZ_MY_HISCORE_X_DIGIT_SIZE * fScale, cfCMHDZ_MY_HISCORE_Y_DIGIT_SIZE * fScale) TEXT_LABEL_63 tlTextureName = CMHDZ_GET_SCORE_INTEGER_TEXTURE_NAME(0) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT),tlTextureName,vLeftMostCenter,vCharSize,0.0, rgba) ENDPROC //PROC CMHDZ_DRAW_SCORE_INTEGER_CENTER_RIGHT_MOST(INT iValue, VECTOR_2D vRightMostCenter,RGBA_COLOUR_STRUCT rgba, FLOAT fScale = 1.0, BOOL bWithDollar = FALSE) // // VECTOR_2D vCharSize = INIT_VECTOR_2D(cfCMHDZ_MY_HISCORE_X_DIGIT_SIZE * fScale, cfCMHDZ_MY_HISCORE_Y_DIGIT_SIZE * fScale) // // INT iScoreDigits[10] // INT i // INT iNumDigits = FLOOR(LOG10(TO_FLOAT(iValue))) + 1 // GET_SCORE_DIGITS_AS_ARRAY(iValue, iNumDigits, iScoreDigits) // TEXT_LABEL_63 tlTextureName // VECTOR_2D vCenter // REPEAT iNumDigits i // tlTextureName = CMHDZ_GET_SCORE_INTEGER_TEXTURE_NAME(iScoreDigits[i]) // vCenter.y = vRightMostCenter.y // vCenter.x = vRightMostCenter.x - (i * vCharSize.x) // CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT),tlTextureName,vCenter,vCharSize,0.0, rgba) // ENDREPEAT // // IF bWithDollar // vCenter.x = vRightMostCenter.x - (i * vCharSize.x) // CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("$", vCenter) // ENDIF // //ENDPROC //------------------------------------------------- // CREATE FX //------------------------------------------------- FUNC INT CMHDZ_GET_NEXT_FX_INDEX() INT i FOR i = 0 TO ciCMHDZ_MAX_FX -1 IF sCMHDZData.sFXData[i].bActive = FALSE RETURN i ENDIF ENDFOR RETURN 0 ENDFUNC PROC TWS_CREATE_FX(VECTOR_2D vPos, CMHDZ_FX_TYPE eType, INT iLane) INT iIndex = CMHDZ_GET_NEXT_FX_INDEX() sCMHDZData.sFXData[iIndex].vSpritePos = vPos sCMHDZData.sFXData[iIndex].eFXType = eType IF iLane = ciCMHDZ_LANE_POPUP_LHS OR iLane = ciCMHDZ_LANE_POPUP_RHS iLane= ciCMHDZ_LANE_BACKGROUND ENDIF sCMHDZData.sFXData[iIndex].iLane = iLane sCMHDZData.sFXData[iIndex].iSpriteBlastAnimFrame = 0 sCMHDZData.sFXData[iIndex].bActive = TRUE sCMHDZData.sFXData[iIndex].bFinished = FALSE sCMHDZData.sFXData[iIndex].fAlpha = TO_FLOAT(sCMHDZData.rgbaSprite.iA) // Standard ENDPROC PROC CMHDZ_HANDLE_FX() INT i FOR i = 0 TO ciCMHDZ_MAX_FX - 1 IF sCMHDZData.sFXData[i].bActive sCMHDZData.sFXData[i].iSpriteBlastAnimFrame += sCMHDZData.sFXData[i].iSlowUpdateFrames // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_BULLETS_AND_EFFECTS] {DSW} Frame: ", sCMHDZData.sFXData[i].iSpriteBlastAnimFrame) IF IS_MOVING_LEVEL() AND sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_PLAYING sCMHDZData.sFXData[i].vSpritePos.x -= CMHDZ_GET_FX_UPDATE() ENDIF SWITCH sCMHDZData.sFXData[i].eFXType CASE CMHDZ_FX_ENEMY_SHOT IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame >= ciCMHDZ_ENEMY_SHOT_MAX_ANIM_FRAMES sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 sCMHDZData.sFXData[i].bActive = FALSE ENDIF BREAK CASE CMHDZ_FX_EXPLOSION IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame >= ciCMHDZ_EXPLOSION_MAX_ANIM_FRAMES sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 sCMHDZData.sFXData[i].bActive = FALSE ENDIF BREAK CASE CMHDZ_FX_ENEMY_TNT_EXP IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame >= ciCMHDZ_MAX_ENEMY_THROWN_EXPLOSION_ANIM_FRAMES sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 sCMHDZData.sFXData[i].bActive = FALSE ENDIF BREAK CASE CMHDZ_FX_LOOT_CRATE IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame >= ciCMHDZ_MAX_LOOT_CRATE_FX_ANIM_FRAMES sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 sCMHDZData.sFXData[i].bActive = FALSE ENDIF BREAK // CASE CMHDZ_FX_BLOOD_SPLAT // IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame >= ciCMHDZ_BLOOD_SPLAT_MAX_ANIM_FRAMES // sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 // sCMHDZData.sFXData[i].bActive = FALSE // ENDIF // BREAK CASE CMHDZ_FX_BEARSY_FOREGROUND_PAIN_BLOOD IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame >= ciCMHDZ_BEARSY_BLEED_MAX_ANIM_FRAMES sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 sCMHDZData.sFXData[i].bActive = FALSE ENDIF BREAK CASE CMHDZ_FX_BEARSY_FOREGROUND_SPARKS IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame >= ciCMHDZ_SPARKS_MAX_ANIM_FRAMES sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 sCMHDZData.sFXData[i].bActive = FALSE ENDIF BREAK CASE CMHDZ_FX_OUCH IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame >= 3 sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 sCMHDZData.sFXData[i].bActive = FALSE ENDIF BREAK // CASE CMHDZ_FX_SLASH_EFFECT // IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame >= ciCMHDZ_BLOOD_SPLAT_MAX_ANIM_FRAMES // sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 // sCMHDZData.sFXData[i].bActive = FALSE // ENDIF // BREAK ENDSWITCH ENDIF ENDFOR ENDPROC //------------------------------------------------- // BACKGROUND FUNCTIONS //------------------------------------------------- FUNC BOOL CMHDZ_IS_CLOUD(STRING sCloud) RETURN ARE_STRINGS_EQUAL(sCloud, "LEVEL_01_DESERT_CLOUDS_TILE") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_SCRAPYARD_CLOUD_01") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_SCRAPYARD_CLOUD_02") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_SCRAPYARD_CLOUD_03") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_SCRAPYARD_CLOUD_04") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_SCRAPYARD_CLOUD_05") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_SCRAPYARD_CLOUD_06") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_SCRAPYARD_CLOUD_07") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_TOWN_BACKGROUND_CLOUDS_01") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_TOWN_BACKGROUND_CLOUDS_02") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_TOWN_BACKGROUND_CLOUDS_03") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_TOWN_BACKGROUND_CLOUDS_04") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_TOWN_BACKGROUND_CLOUDS_05") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_TOWN_BACKGROUND_CLOUDS_06") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_02_TOWN_BACKGROUND_CLOUDS_07") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_03_FOREST_BACKGROUND_CLOUDS_01") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_03_FOREST_BACKGROUND_CLOUDS_02") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_03_FOREST_BACKGROUND_CLOUDS_03") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_03_FOREST_BACKGROUND_CLOUDS_04") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_03_FOREST_BACKGROUND_CLOUDS_05") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_03_FOREST_BACKGROUND_CLOUDS_06") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_03_FOREST_BACKGROUND_CLOUDS_07") ENDFUNC FUNC BOOL CMHDZ_IS_CITY_BACKGROUND_BUILDING(STRING sCloud) RETURN ARE_STRINGS_EQUAL(sCloud, "LEVEL_01_CITY_BUILDING_01") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_01_CITY_BUILDING_02") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_01_CITY_BUILDING_03") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_01_CITY_BUILDING_04") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_01_CITY_BUILDING_05") OR ARE_STRINGS_EQUAL(sCloud, "LEVEL_01_CITY_BUILDING_06") ENDFUNC FUNC BOOL CMHDZ_IS_THEMEPARK_BACKGROUND_SKYLINE(STRING sTexture) RETURN ARE_STRINGS_EQUAL(sTexture, "LEVEL_04_THEMEPARK_BACKGROUND_SKYLINE") ENDFUNC FUNC INT CMHDZ_GET_FIRST_BACKGROUND_ELEMENT_OF_TYPE(STRING sType) INT i FOR i = 0 TO ciCMHDZ_MAX_BACKGROUND_ELEMS - 1 IF ARE_STRINGS_EQUAL(sCMHDZData.sBackgroundData[i].sSprite, sType) RETURN i ENDIF ENDFOR RETURN -1 ENDFUNC FUNC INT CMHDZ_GET_NUMBER_OF_BACKGROUND_ELEMENTS_OF_TYPE(STRING sType, INT iFirstElement) INT iCount INT i FOR i = iFirstElement TO ciCMHDZ_MAX_BACKGROUND_ELEMS - 1 IF NOT IS_STRING_NULL_OR_EMPTY(sType) IF NOT IS_STRING_NULL_OR_EMPTY(sCMHDZData.sBackgroundData[i].sSprite) IF ARE_STRINGS_EQUAL(sCMHDZData.sBackgroundData[i].sSprite, sType) iCount++ ENDIF ENDIF ENDIF ENDFOR // //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_GET_NUMBER_OF_BACKGROUND_ELEMENTS_OF_TYPE] Type: ", sType, " Count: ", iCount) RETURN iCount ENDFUNC /// PURPOSE: /// Figure out where to warp the background element specified when it disappears off the screen LHS /// PARAMS: /// iElement - /// RETURNS: /// FUNC FLOAT GET_WARP_POSITION_FOR_BACKGROUND_ELEMENT(INT iElement) FLOAT fWidth = sCMHDZData.sBackgroundData[iElement].vSpriteSize.x INT iFirst = CMHDZ_GET_FIRST_BACKGROUND_ELEMENT_OF_TYPE(sCMHDZData.sBackgroundData[iElement].sSprite) INT iTotal = CMHDZ_GET_NUMBER_OF_BACKGROUND_ELEMENTS_OF_TYPE(sCMHDZData.sBackgroundData[iElement].sSprite, iFirst) INT iPrevious = iElement -1 IF iPrevious < iFirst iPrevious = iFirst + (iTotal - 1) //(ciCMHDZ_MAX_BACKGROUND_TILES - 1) ENDIF RETURN sCMHDZData.sBackgroundData[iPrevious].vSpritePos.X + fWidth ENDFUNC PROC CMHDZ_DRAW_FAR_BACKGROUND(BOOL bBackwards = FALSE)//, BOOL bLeaderBoard = FALSE) TEXT_LABEL_63 tl23BackgroundSprite TEXT_LABEL_31 tl31textDict //= CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_CITY) SWITCH sCMHDZData.eCurrentLevel CASE CMHDZ_LEVEL_CITY tl23BackgroundSprite = "LEVEL_01_CITY_BACKGROUND_TILE" // "bg-tile1" // tl31textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_CITY) BREAK CASE CMHDZ_LEVEL_SCRAPYARD tl23BackgroundSprite = "LEVEL_02_SCRAPYARD_BACKGROUND_TILE" //"bg-tile2" tl31textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_SCRAPYARD) BREAK CASE CMHDZ_LEVEL_ASYLUM tl23BackgroundSprite = "LEVEL_03_ASYLUM_BACKGROUND_TILE" //"bg-tile3" tl31textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_ASYLUM) BREAK CASE CMHDZ_LEVEL_PARK tl23BackgroundSprite = "LEVEL_04_THEMEPARK_BACKGROUND_TILE" //"bg-tile4" tl31textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_THEMEPARK) BREAK CASE CMHDZ_LEVEL_SLAUGHTERHOUSE tl23BackgroundSprite = "LEVEL_05_SLAUGHTERHOUSE_BACKGROUND_TILE" //"bg-tile5" tl31textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVL5) BREAK ENDSWITCH // IF (bLeaderBoard) // tl23BackgroundSprite = "LEVEL_01_CITY_BACKGROUND_TILE" // "bg-tile1" // // tl31textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_CITY) // ENDIF INT i INT iPrevious VECTOR_2D vDrawPos FLOAT xFlip // bg FOR i = 0 TO ciCMHDZ_MAX_BACKGROUND_TILES - 1 vDrawPos = INIT_VECTOR_2D(sCMHDZData.sBackgroundTilesData[i].vSpritePos.x, cfBASE_SCREEN_HEIGHT/2) IF (bBackwards) xFlip = -(vDrawPos.x - (cfBASE_SCREEN_WIDTH / 2)) vDrawPos.x = (cfBASE_SCREEN_WIDTH / 2) + xFlip ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(tl31textDict, tl23BackgroundSprite, vDrawPos, INIT_VECTOR_2D(276.0, cfGAME_SCREEN_HEIGHT), 0, sCMHDZData.rgbaSprite) IF sCMHDZData.sBackgroundTilesData[i].vSpritePos.x < cfCMHDZ_BCAKGROUND_TILE_WIDTH/2 iPrevious = i - 1 IF iPrevious < 0 iPrevious = ciCMHDZ_MAX_BACKGROUND_TILES - 1 ENDIF sCMHDZData.sBackgroundTilesData[i].vSpritePos.x = sCMHDZData.sBackgroundTilesData[iPrevious].vSpritePos.x + cfCMHDZ_BCAKGROUND_TILE_WIDTH ENDIF IF IS_MOVING_LEVEL() AND CMHDZ_GET_LOCAL_PLAYER_HEALTH() > 0.0 sCMHDZData.sBackgroundTilesData[i].vSpritePos.x -= CMHDZ_GET_BACKGROUND_TILE_UPDATE() ENDIF ENDFOR // lane 0 FLOAT fCloudSpace, fClouds REPEAT ciCMHDZ_MAX_BACKGROUND_ELEMS i IF ((sCMHDZData.sBackgroundData[i].iLane = ciCMHDZ_LANE_BACKGROUND) AND CMHDZ_BACKGROUND_DATA_IS_RENDERING(i)) CMHDZ_DRAW_GAME_SPRITE_DETAILS(tl31textDict, sCMHDZData.sBackgroundData[i].sSprite, sCMHDZData.sBackgroundData[i].vSpritePos, sCMHDZData.sBackgroundData[i].vSpriteSize, 0, sCMHDZData.rgbaSprite) IF CMHDZ_IS_THEMEPARK_BACKGROUND_SKYLINE(sCMHDZData.sBackgroundData[i].sSprite) IF sCMHDZData.sBackgroundData[i].vSpritePos.X < (cfGAME_OVERSCAN_MIN_X) - (cfCMHDZ_BG_THEMEPARK_SKYLINE_SPRITE_WIDTH / 2.0) sCMHDZData.sBackgroundData[i].vSpritePos.X += (cfCMHDZ_BG_THEMEPARK_SKYLINE_SPRITE_WIDTH * 2.0) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_BACKGROUND_ELEMENT_UPDATE() ENDIF ELIF CMHDZ_IS_CLOUD(sCMHDZData.sBackgroundData[i].sSprite) IF sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_SCRAPYARD fCloudSpace = cfCMHDZ_BG_SCRAPYARD_CLOUD_GAP fClouds = cfCMHDZ_BG_SCRAPYARD_CLOUD1_WIDTH + fCloudSpace + cfCMHDZ_BG_SCRAPYARD_CLOUD2_WIDTH + fCloudSpace + cfCMHDZ_BG_SCRAPYARD_CLOUD3_WIDTH + fCloudSpace + cfCMHDZ_BG_SCRAPYARD_CLOUD4_WIDTH + fCloudSpace + cfCMHDZ_BG_SCRAPYARD_CLOUD5_WIDTH + fCloudSpace + cfCMHDZ_BG_SCRAPYARD_CLOUD6_WIDTH + fCloudSpace + cfCMHDZ_BG_SCRAPYARD_CLOUD7_WIDTH IF sCMHDZData.sBackgroundData[i].vSpritePos.X + (sCMHDZData.sBackgroundData[i].vSpriteSize.x / 2.0 ) <= 300.0 sCMHDZData.sBackgroundData[i].vSpritePos.X = 300.0 + fClouds + (sCMHDZData.sBackgroundData[i].vSpriteSize.x / 2.0 ) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_CLOUD_UPDATE() ENDIF ENDIF ELSE IF sCMHDZData.sBackgroundData[i].vSpritePos.X < (cfGAME_OVERSCAN_MIN_X) - cfCMHDZ_BCAKGROUND_TILE_WIDTH/2 sCMHDZData.sBackgroundData[i].vSpritePos.X += cfBASE_SCREEN_WIDTH IF (sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_CITY) IF CMHDZ_IS_CITY_BACKGROUND_BUILDING(sCMHDZData.sBackgroundData[i].sSprite) CMHDZ_SET_RANDOM_BG_CITY_BACKGROUND_BUILDING_ELEMENT(i) ENDIF ENDIF ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_BACKGROUND_ELEMENT_UPDATE() ENDIF ENDIF ENDIF ENDREPEAT // lane 1 REPEAT ciCMHDZ_MAX_BACKGROUND_ELEMS i IF ((sCMHDZData.sBackgroundData[i].iLane = ciCMHDZ_LANE_MIDDLE) AND CMHDZ_BACKGROUND_DATA_IS_RENDERING(i)) CMHDZ_DRAW_GAME_SPRITE_DETAILS(tl31textDict, sCMHDZData.sBackgroundData[i].sSprite, sCMHDZData.sBackgroundData[i].vSpritePos, sCMHDZData.sBackgroundData[i].vSpriteSize, 0, sCMHDZData.rgbaSprite) IF ARE_STRINGS_EQUAL(sCMHDZData.sBackgroundData[i].sSprite, "LEVEL_04_THEMEPARK_BACKGROUND_PROP_MINECART_01") IF (sCMHDZData.sBackgroundData[i].vSpritePos.x < (cfGAME_OVERSCAN_MIN_X) - (cfCMHDZ_THEMEPARK_MINECART_TRACK_SPRITE_WIDTH / 2.0)) sCMHDZData.sBackgroundData[i].vSpritePos.X += (cfCMHDZ_THEMEPARK_MINECART_TRACK_SPRITE_WIDTH * 6.0) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_CUSTOM_FAST_NEAR_BACKGROUND_ELEMENT_UPDATE() ENDIF // Scrapyard rock objects. ELIF ARE_STRINGS_EQUAL("LEVEL_02_SCRAPYARD_ROCKS", sCMHDZData.sBackgroundData[i].sSprite) IF sCMHDZData.sBackgroundData[i].vSpritePos.X <= 0.0 sCMHDZData.sBackgroundData[i].vSpritePos.X = 1980 //fClouds// + (sCMHDZData.sBackgroundData[i].vSpriteSize.x / 2.0 ) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_GENERAL_UPDATE() ENDIF ENDIF ENDIF ENDREPEAT ENDPROC PROC CMHDZ_DRAW_BACKGROUND(BOOL bBackwards = FALSE) IF (sCMHDZData.eCurrentLevel <= CMHDZ_LEVEL_PARK) CMHDZ_DRAW_FAR_BACKGROUND(bBackwards) EXIT ENDIF VECTOR_2D vDrawPos FLOAT xFlip TEXT_LABEL_63 tl23BackgroundSprite TEXT_LABEL_31 tl31textDict //= sCMHDZData.tl31BaseTextDict SWITCH sCMHDZData.eCurrentLevel CASE CMHDZ_LEVEL_CITY tl23BackgroundSprite = "LEVEL_01_DESERT_BACKGROUND_TILE" // "bg-tile1" // tl31textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVL1) BREAK CASE CMHDZ_LEVEL_SCRAPYARD tl23BackgroundSprite = "LEVEL_02_TOWN_BACKGROUND_TILE" //"bg-tile2" tl31textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVL2) BREAK CASE CMHDZ_LEVEL_ASYLUM tl23BackgroundSprite = "LEVEL_03_FOREST_BACKGROUND_TILE" //"bg-tile3" tl31textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVL3) BREAK CASE CMHDZ_LEVEL_PARK tl23BackgroundSprite = "LEVEL_04_GOLDMINE_BACKGROUND_TILE" //"bg-tile4" tl31textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVL4) BREAK CASE CMHDZ_LEVEL_SLAUGHTERHOUSE tl23BackgroundSprite = "LEVEL_05_SLAUGHTERHOUSE_BACKGROUND_TILE" //"bg-tile5" tl31textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVL5) BREAK ENDSWITCH INT i INT iPrevious //INT iFirst FOR i = 0 TO ciCMHDZ_MAX_BACKGROUND_TILES - 1 vDrawPos = INIT_VECTOR_2D(sCMHDZData.sBackgroundTilesData[i].vSpritePos.x, cfBASE_SCREEN_HEIGHT/2) IF (bBackwards) xFlip = -(vDrawPos.x -(cfBASE_SCREEN_WIDTH / 2)) vDrawPos.x = (cfBASE_SCREEN_WIDTH / 2) + xFlip ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(tl31textDict, tl23BackgroundSprite, vDrawPos, INIT_VECTOR_2D(cfCMHDZ_BCAKGROUND_TILE_WIDTH, cfGAME_SCREEN_HEIGHT), 0, sCMHDZData.rgbaSprite) IF sCMHDZData.sBackgroundTilesData[i].vSpritePos.x < cfCMHDZ_BCAKGROUND_TILE_WIDTH/2 iPrevious = i - 1 IF iPrevious < 0 iPrevious = ciCMHDZ_MAX_BACKGROUND_TILES - 1 ENDIF //sCMHDZData.sBackgroundTilesData[i].vSpritePos.x = (cfCMHDZ_BCAKGROUND_TILE_WIDTH * 7) - cfCMHDZ_BCAKGROUND_TILE_WIDTH/2 - (4.0 * CMHDZ_GET_PREVIOUS_TIMESTEP()) sCMHDZData.sBackgroundTilesData[i].vSpritePos.x = sCMHDZData.sBackgroundTilesData[iPrevious].vSpritePos.x + cfCMHDZ_BCAKGROUND_TILE_WIDTH ENDIF IF IS_MOVING_LEVEL() AND CMHDZ_GET_LOCAL_PLAYER_HEALTH() > 0.0 sCMHDZData.sBackgroundTilesData[i].vSpritePos.x -= CMHDZ_GET_BACKGROUND_TILE_UPDATE() ENDIF ENDFOR FLOAT fClouds FLOAT fCloudSpace sCMHDZData.iNumberOfBackgroundElementsDrawn = 0 // Far canyons FOR i = 0 TO ciCMHDZ_MAX_BACKGROUND_ELEMS - 1 // CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVL2), "mountains", GET_DEBUG_TEXTURE_POS(0), INIT_VECTOR_2D(cfCMHDZ_MOUNTAIN_1_SPRITE_WIDTH, cfCMHDZ_MOUNTAIN_1_SPRITE_HEIGHT), 0, sCMHDZData.rgbaSprite) // CMHDZ_DRAW_GAME_SPRITE(sCMHDZData.tl31BaseTextDict, "LEVEL_05_GRAVEYARD_BACKGROUND_TILE_TREES", GET_DEBUG_TEXTURE_POS(1), INIT_VECTOR_2D(cfCMHDZ_SLAUGHTERHOUSE_LIGHTS_WIDTH, cfCMHDZ_SLAUGHTERHOUSE_LIGHTS_HEIGHT), 0, sCMHDZData.rgbaSprite) // CMHDZ_DRAW_GAME_SPRITE(sCMHDZData.tl31BaseTextDict, "LEVEL_05_GRAVEYARD_BACKGROUND_TILE_GATE", GET_DEBUG_TEXTURE_POS(2), INIT_VECTOR_2D(cfCMHDZ_SLAUGHTERHOUSE_FENCE_WIDTH, cfCMHDZ_SLAUGHTERHOUSE_FENCE_HEIGHT), 0, sCMHDZData.rgbaSprite) IF (sCMHDZData.sBackgroundData[i].iLane = ciCMHDZ_LANE_BACKGROUND) AND CMHDZ_BACKGROUND_DATA_IS_RENDERING(i) sCMHDZData.iNumberOfBackgroundElementsDrawn ++ vDrawPos = sCMHDZData.sBackgroundData[i].vSpritePos IF (bBackwards) xFlip = -(vDrawPos.x -(cfBASE_SCREEN_WIDTH / 2)) vDrawPos.x = (cfBASE_SCREEN_WIDTH / 2) + xFlip ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(tl31textDict, sCMHDZData.sBackgroundData[i].sSprite, vDrawPos, sCMHDZData.sBackgroundData[i].vSpriteSize, 0, sCMHDZData.rgbaSprite) IF CMHDZ_IS_CLOUD(sCMHDZData.sBackgroundData[i].sSprite) IF CMHDZ_GET_CURRENT_LEVEL() = CMHDZ_LEVEL_CITY IF sCMHDZData.sBackgroundData[i].vSpritePos.X + (cfCMHDZ_LEVEL1_CLOUD_WIDTH / 2.0 ) <= 0 sCMHDZData.sBackgroundData[i].vSpritePos.X = cfCMHDZ_LEVEL1_CLOUD_WIDTH + cfCMHDZ_LEVEL1_CLOUD_WIDTH + (cfCMHDZ_LEVEL1_CLOUD_WIDTH / 2.0 ) //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_COVER] {DSW} Warping cloud ", i, " New Pos x: ", sCMHDZData.sBackgroundData[i].vSpritePos.X) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_CLOUD_UPDATE() ENDIF ELIF CMHDZ_GET_CURRENT_LEVEL() = CMHDZ_LEVEL_SCRAPYARD fCloudSpace = cfCMHDZ_LEVEL2_CLOUD_GAP fClouds = cfCMHDZ_LEVEL2_CLOUD1_WIDTH + fCloudSpace + cfCMHDZ_LEVEL2_CLOUD2_WIDTH + fCloudSpace + cfCMHDZ_LEVEL2_CLOUD3_WIDTH + fCloudSpace + cfCMHDZ_LEVEL2_CLOUD4_WIDTH + fCloudSpace + cfCMHDZ_LEVEL2_CLOUD5_WIDTH + fCloudSpace + cfCMHDZ_LEVEL2_CLOUD6_WIDTH + fCloudSpace + cfCMHDZ_LEVEL2_CLOUD7_WIDTH IF sCMHDZData.sBackgroundData[i].vSpritePos.X + (sCMHDZData.sBackgroundData[i].vSpriteSize.x / 2.0 ) <= 300.0 sCMHDZData.sBackgroundData[i].vSpritePos.X = 300.0 + fClouds + (sCMHDZData.sBackgroundData[i].vSpriteSize.x / 2.0 ) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_CLOUD_UPDATE() ENDIF ELIF CMHDZ_GET_CURRENT_LEVEL() = CMHDZ_LEVEL_ASYLUM fCloudSpace = cfCMHDZ_LEVEL3_CLOUD_GAP fClouds = cfCMHDZ_LEVEL3_CLOUD1_WIDTH + fCloudSpace + cfCMHDZ_LEVEL3_CLOUD2_WIDTH + fCloudSpace + cfCMHDZ_LEVEL3_CLOUD3_WIDTH + fCloudSpace + cfCMHDZ_LEVEL3_CLOUD4_WIDTH + fCloudSpace + cfCMHDZ_LEVEL3_CLOUD5_WIDTH + fCloudSpace + cfCMHDZ_LEVEL3_CLOUD6_WIDTH + fCloudSpace + cfCMHDZ_LEVEL3_CLOUD7_WIDTH IF sCMHDZData.sBackgroundData[i].vSpritePos.X + (sCMHDZData.sBackgroundData[i].vSpriteSize.x / 2.0 ) <= 300.0 sCMHDZData.sBackgroundData[i].vSpritePos.X = 300.0 + fClouds + (sCMHDZData.sBackgroundData[i].vSpriteSize.x / 2.0 ) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_CLOUD_UPDATE() ENDIF ENDIF ELIF ARE_STRINGS_EQUAL(sCMHDZData.sBackgroundData[i].sSprite, "mountains") IF sCMHDZData.sBackgroundData[i].vSpritePos.X + (cfCMHDZ_MOUNTAIN_1_SPRITE_WIDTH / 2.0 ) <= 0 sCMHDZData.sBackgroundData[i].vSpritePos.X = cfCMHDZ_MOUNTAIN_1_SPRITE_WIDTH + cfCMHDZ_MOUNTAIN_1_SPRITE_WIDTH + (cfCMHDZ_MOUNTAIN_1_SPRITE_WIDTH / 2.0 ) //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_COVER] {DSW} Warping mountains ", i, " New Pos x: ", sCMHDZData.sBackgroundData[i].vSpritePos.X) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_BACKGROUND_ELEMENT_UPDATE() ENDIF ELIF ARE_STRINGS_EQUAL(sCMHDZData.sBackgroundData[i].sSprite, "LEVEL_03_FOREST_BACKGROUND_TREES") fClouds = 7 * cfCMHDZ_LEVEL4_BACKGROUND_SURFACE_WIDTH IF sCMHDZData.sBackgroundData[i].vSpritePos.X <= 0.0 sCMHDZData.sBackgroundData[i].vSpritePos.X = GET_WARP_POSITION_FOR_BACKGROUND_ELEMENT(i) //fClouds ENDIF // //CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_DRAW_COVER] Level 3 trees : ", i) IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_BACKGROUND_ELEMENT_UPDATE() ENDIF ELIF ARE_STRINGS_EQUAL(sCMHDZData.sBackgroundData[i].sSprite, "LEVEL_04_GOLDMINE_CAVE_BACKGROUND_CAVE") fClouds = 7 * cfCMHDZ_LEVEL4_BACKGROUND_SURFACE_WIDTH IF sCMHDZData.sBackgroundData[i].vSpritePos.X <= 0.0 sCMHDZData.sBackgroundData[i].vSpritePos.X = GET_WARP_POSITION_FOR_BACKGROUND_ELEMENT(i) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_CLOUD_UPDATE() ENDIF ELIF ARE_STRINGS_EQUAL(sCMHDZData.sBackgroundData[i].sSprite, "LEVEL_04_GOLDMINE_CAVE_TILE_02") fClouds = 7 * cfCMHDZ_LEVEL4_BACKGROUND_SURFACE_WIDTH IF sCMHDZData.sBackgroundData[i].vSpritePos.X <= 0.0 sCMHDZData.sBackgroundData[i].vSpritePos.X = GET_WARP_POSITION_FOR_BACKGROUND_ELEMENT(i) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_BACKGROUND_ELEMENT_UPDATE() ENDIF ELIF ARE_STRINGS_EQUAL(sCMHDZData.sBackgroundData[i].sSprite, "LEVEL_05_SLAUGHTERHOUSE_PROP_DOOR_02") fClouds = 7 * cfCMHDZ_LEVEL4_BACKGROUND_SURFACE_WIDTH IF sCMHDZData.sBackgroundData[i].vSpritePos.X <= 0.0 sCMHDZData.sBackgroundData[i].vSpritePos.X = GET_WARP_POSITION_FOR_BACKGROUND_ELEMENT(i) //fClouds// + (sCMHDZData.sBackgroundData[i].vSpriteSize.x / 2.0 ) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_CLOUD_UPDATE() ENDIF ELIF ARE_STRINGS_EQUAL(sCMHDZData.sBackgroundData[i].sSprite, "LEVEL_05_SLAUGHTERHOUSE_PROP_DOOR_01") fClouds = 7 * cfCMHDZ_LEVEL4_BACKGROUND_SURFACE_WIDTH IF sCMHDZData.sBackgroundData[i].vSpritePos.X <= 0.0 sCMHDZData.sBackgroundData[i].vSpritePos.X = GET_WARP_POSITION_FOR_BACKGROUND_ELEMENT(i) //fClouds// + (sCMHDZData.sBackgroundData[i].vSpriteSize.x / 2.0 ) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_BACKGROUND_ELEMENT_UPDATE() ENDIF ELSE IF sCMHDZData.sBackgroundData[i].vSpritePos.X < cfCMHDZ_BCAKGROUND_TILE_WIDTH/2 sCMHDZData.sBackgroundData[i].vSpritePos.X = cfBASE_SCREEN_WIDTH ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_BACKGROUND_ELEMENT_UPDATE() ENDIF ENDIF ENDIF ENDFOR // Close canyons FOR i = 0 TO ciCMHDZ_MAX_BACKGROUND_ELEMS - 1 IF (sCMHDZData.sBackgroundData[i].iLane = ciCMHDZ_LANE_MIDDLE) AND CMHDZ_BACKGROUND_DATA_IS_RENDERING(i) sCMHDZData.iNumberOfBackgroundElementsDrawn ++ //sCMHDZData.sBackgroundData[i].vSpritePos.y = sCMHDZData.fTexturePosY[0] vDrawPos = sCMHDZData.sBackgroundData[i].vSpritePos IF (bBackwards) xFlip = -(vDrawPos.x -(cfBASE_SCREEN_WIDTH / 2)) vDrawPos.x = (cfBASE_SCREEN_WIDTH / 2) + xFlip ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(tl31textDict, sCMHDZData.sBackgroundData[i].sSprite, vDrawPos, sCMHDZData.sBackgroundData[i].vSpriteSize, 0, sCMHDZData.rgbaSprite) IF ARE_STRINGS_EQUAL("LEVEL_04_GOLDMINE_CAVE_TILE", sCMHDZData.sBackgroundData[i].sSprite) OR ARE_STRINGS_EQUAL("LEVEL_04_GOLDMINE_ASSETS_10", sCMHDZData.sBackgroundData[i].sSprite) IF sCMHDZData.sBackgroundData[i].vSpritePos.X <= 0.0 sCMHDZData.sBackgroundData[i].vSpritePos.X = GET_WARP_POSITION_FOR_BACKGROUND_ELEMENT(i) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_CUSTOM_FAST_NEAR_BACKGROUND_ELEMENT_UPDATE() ENDIF ELIF ARE_STRINGS_EQUAL("fence-small", sCMHDZData.sBackgroundData[i].sSprite) IF sCMHDZData.sBackgroundData[i].vSpritePos.X <= 0.0 sCMHDZData.sBackgroundData[i].vSpritePos.X = GET_WARP_POSITION_FOR_BACKGROUND_ELEMENT(i) ENDIF IF IS_MOVING_LEVEL() sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_DEFAULT_NEAR_BACKGROUND_ELEMENT_UPDATE() ENDIF ELIF ARE_STRINGS_EQUAL(sCMHDZData.sBackgroundData[i].sSprite, "LEVEL_05_SLAUGHTERHOUSE_LIGHT") fClouds = 1 * cfCMHDZ_LEVEL4_BACKGROUND_SURFACE_WIDTH IF sCMHDZData.sBackgroundData[i].vSpritePos.X <= 0.0 sCMHDZData.sBackgroundData[i].vSpritePos.X = GET_WARP_POSITION_FOR_BACKGROUND_ELEMENT(i) //fClouds// + (sCMHDZData.sBackgroundData[i].vSpriteSize.x / 2.0 ) ENDIF IF IS_MOVING_LEVEL() //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] LEVEL_05_SLAUGHTERHOUSE_LIGHT - X Position update") sCMHDZData.sBackgroundData[i].vSpritePos.X -= (CMHDZ_GET_GENERAL_UPDATE()) ENDIF ELSE IF sCMHDZData.sBackgroundData[i].vSpritePos.X < cfCMHDZ_BCAKGROUND_TILE_WIDTH/2 sCMHDZData.sBackgroundData[i].vSpritePos.X = cfBASE_SCREEN_WIDTH ENDIF IF IS_MOVING_LEVEL() IF ARE_STRINGS_EQUAL("TERRAIN_ROCKS", sCMHDZData.sBackgroundData[i].sSprite) OR ARE_STRINGS_EQUAL("FLOOR_GRASS", sCMHDZData.sBackgroundData[i].sSprite) //OR ARE_STRINGS_EQUAL("LEVEL_02_SCRAPYARD_ROCKS", sCMHDZData.sBackgroundData[i].sSprite) OR ARE_STRINGS_EQUAL("LEVEL_03_FOREST_ROCKS", sCMHDZData.sBackgroundData[i].sSprite) OR ARE_STRINGS_EQUAL("LEVEL_04_GOLDMINE_ROCK", sCMHDZData.sBackgroundData[i].sSprite) OR ARE_STRINGS_EQUAL("WOODENSTRUCTURE", sCMHDZData.sBackgroundData[i].sSprite) // OR ARE_STRINGS_EQUAL("LEVEL_04_GOLDMINE_ASSETS_10", sCMHDZData.sBackgroundData[i].sSprite) // OR ARE_STRINGS_EQUAL("LEVEL_04_GOLDMINE_CAVE_TILE", sCMHDZData.sBackgroundData[i].sSprite) sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_CUSTOM_FAST_NEAR_BACKGROUND_ELEMENT_UPDATE() ELIF ARE_STRINGS_EQUAL("mountain-small1", sCMHDZData.sBackgroundData[i].sSprite) OR ARE_STRINGS_EQUAL("mountain-small2", sCMHDZData.sBackgroundData[i].sSprite) sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_CUSTOM_SLOW_NEAR_BACKGROUND_ELEMENT_UPDATE() ELSE sCMHDZData.sBackgroundData[i].vSpritePos.X -= CMHDZ_GET_DEFAULT_NEAR_BACKGROUND_ELEMENT_UPDATE() ENDIF ENDIF ENDIF ENDIF ENDFOR ENDPROC //------------------------------------------------- // HOSTAGE FUNCTIONS //------------------------------------------------- //PROC CMHDZ_DRAW_HOSTAGES(INT iLane) // // CMHDZ_SPRITE eSprite // // INT i // // FOR i = 0 TO ciCMHDZ_MAX_HOSTAGES -1 // // IF sCMHDZData.sHostageData[i].iHostageLane = iLane // IF sCMHDZData.sHostageData[i].iHealth > 0 // SWITCH sCMHDZData.sHostageData[i].eHostageType // CASE CMHDZ_HOSTAGE_GIRL // eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_HOSTAGE11, sCMHDZData.sHostageData[i].iSpriteAnimFrame) // BREAK // CASE CMHDZ_HOSTAGE_GUY // eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_HOSTAGE21, sCMHDZData.sHostageData[i].iSpriteAnimFrame) // BREAK // CASE CMHDZ_HOSTAGE_EAGLE // eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_EAGLE1, sCMHDZData.sHostageData[i].iSpriteAnimFrame) // BREAK // CASE CMHDZ_HOSTAGE_VULTURE // eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_VULTURE_01, sCMHDZData.sHostageData[i].iSpriteAnimFrame) // BREAK // CASE CMHDZ_HOSTAGE_BAT // eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_BAT_01, sCMHDZData.sHostageData[i].iSpriteAnimFrame) // BREAK // CASE CMHDZ_HOSTAGE_SCORPION // eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_ANIMALBONUS_SCORPION_01, sCMHDZData.sHostageData[i].iSpriteAnimFrame) // BREAK // CASE CMHDZ_HOSTAGE_MOUSE // eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_ANIMALBONUS_RAT_01, sCMHDZData.sHostageData[i].iSpriteAnimFrame) // BREAK // ENDSWITCH // // IF sCMHDZData.sHostageData[i].bGoingBack AND (sCMHDZData.sHostageData[i].eHostageType != CMHDZ_HOSTAGE_EAGLE AND sCMHDZData.sHostageData[i].eHostageType != CMHDZ_HOSTAGE_VULTURE) // CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sHostageData[i].vSpritePos, INIT_VECTOR_2D(-sCMHDZData.sHostageData[i].vSize.x, sCMHDZData.sHostageData[i].vSize.y), 0, sCMHDZData.rgbaSprite) // ELSE // CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sHostageData[i].vSpritePos, INIT_VECTOR_2D(sCMHDZData.sHostageData[i].vSize.x, sCMHDZData.sHostageData[i].vSize.y), 0, sCMHDZData.rgbaSprite) // ENDIF // // ELIF sCMHDZData.sHostageData[i].bDying // SWITCH sCMHDZData.sHostageData[i].eHostageType // CASE CMHDZ_HOSTAGE_GIRL // eSprite = CMHDZ_SPRITE_OUCH1 // CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sHostageData[i].vSpritePos, INIT_VECTOR_2D(cfCMHDZ_SPEECH_SPRITE_WIDTH, cfCMHDZ_SPEECH_SPRITE_HEIGHT), 0, sCMHDZData.rgbaSprite) // BREAK // CASE CMHDZ_HOSTAGE_GUY // eSprite = CMHDZ_SPRITE_OUCH1 // CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sHostageData[i].vSpritePos, INIT_VECTOR_2D(cfCMHDZ_SPEECH_SPRITE_WIDTH, cfCMHDZ_SPEECH_SPRITE_HEIGHT), 0, sCMHDZData.rgbaSprite) // BREAK // ENDSWITCH // ENDIF // ENDIF // // ENDFOR // //ENDPROC //------------------------------------------------- // COVER FUNCTIONS //------------------------------------------------- FUNC CMHDZ_SPRITE CMHDZ_COVER_UTIL_GET_SPRITE_FOR_TYPE(CMHDZ_ASSET_TYPES eType, INT iHitCount = 0) CMHDZ_SPRITE eSprite = CMHDZ_SPRITE_NONE SWITCH (eType) CASE CMHDZ_ASSET_CACTUS_1 eSprite = CMHDZ_SPRITE_CACTUS_1 BREAK CASE CMHDZ_ASSET_CACTUS_2 eSprite = CMHDZ_SPRITE_CACTUS_2 BREAK CASE CMHDZ_ASSET_CACTUS_3 eSprite = CMHDZ_SPRITE_CACTUS_3 BREAK CASE CMHDZ_ASSET_ASYLUM_MD_BED eSprite = CMHDZ_SPRITE_ASYLUM_PROP_MD_BED BREAK CASE CMHDZ_ASSET_ASYLUM_MD_WHEELCHAIR eSprite = CMHDZ_SPRITE_ASYLUM_PROP_MD_WHEELCHAIR BREAK CASE CMHDZ_ASSET_ASYLUM_MD_MATTRESS eSprite = CMHDZ_SPRITE_ASYLUM_PROP_MD_MATTRESS BREAK CASE CMHDZ_ASSET_ASYLUM_LIGHT_1 eSprite = CMHDZ_SPRITE_ASYLUM_PROP_LIGHT_STATE_1 BREAK CASE CMHDZ_ASSET_ASYLUM_LIGHT_2 eSprite = CMHDZ_SPRITE_ASYLUM_PROP_LIGHT_STATE_2 BREAK CASE CMHDZ_ASSET_ASYLUM_BG_RADIATOR eSprite = CMHDZ_SPRITE_ASYLUM_RADIATOR_PROP BREAK CASE CMHDZ_ASSET_ASYLUM_BG_DOOR eSprite = CMHDZ_SPRITE_ASYLUM_RADIATOR_DOOR BREAK CASE CMHDZ_ASSET_ASYLUM_GRAFFITI_1 eSprite = CMHDZ_SPRITE_ASYLUM_GRAFFITI_1 BREAK CASE CMHDZ_ASSET_ASYLUM_GRAFFITI_2 eSprite = CMHDZ_SPRITE_ASYLUM_GRAFFITI_2 BREAK CASE CMHDZ_ASSET_ASYLUM_GRAFFITI_3 eSprite = CMHDZ_SPRITE_ASYLUM_GRAFFITI_3 BREAK CASE CMHDZ_ASSET_CITY_BUILDING_1 eSprite = CMHDZ_SPRITE_CITY_BUILDING_06 BREAK CASE CMHDZ_ASSET_CITY_BUILDING_2 eSprite = CMHDZ_SPRITE_CITY_BUILDING_07 BREAK CASE CMHDZ_ASSET_CITY_BUILDING_3 eSprite = CMHDZ_SPRITE_CITY_BUILDING_08 BREAK CASE CMHDZ_ASSET_SCRAPYARD_MD_VAN_1 eSprite = CMHDZ_SPRITE_SCRAPYARD_PROP_MD_VAN_01 BREAK CASE CMHDZ_ASSET_SCRAPYARD_MD_VAN_2 eSprite = CMHDZ_SPRITE_SCRAPYARD_PROP_MD_VAN_02 BREAK CASE CMHDZ_ASSET_SCRAPYARD_MD_VAN_3 eSprite = CMHDZ_SPRITE_SCRAPYARD_PROP_MD_VAN_03 BREAK CASE CMHDZ_ASSET_SCRAPYARD_MD_VAN_4 eSprite = CMHDZ_SPRITE_SCRAPYARD_PROP_MD_VAN_04 BREAK CASE CMHDZ_ASSET_THEMEPARK_BUILDING_1 eSprite = CMHDZ_SPRITE_THEMEPARK_BUILDING_1 BREAK CASE CMHDZ_ASSET_THEMEPARK_BUILDING_2 eSprite = CMHDZ_SPRITE_THEMEPARK_BUILDING_2 BREAK CASE CMHDZ_ASSET_THEMEPARK_BUILDING_3 eSprite = CMHDZ_SPRITE_THEMEPARK_BUILDING_3 BREAK CASE CMHDZ_ASSET_THEMEPARK_BUILDING_4 eSprite = CMHDZ_SPRITE_THEMEPARK_BUILDING_4 BREAK CASE CMHDZ_ASSET_THEMEPARK_CLOWNBOARD_1 eSprite = CMHDZ_SPRITE_THEMEPARK_CLOWNBOARD_1 BREAK CASE CMHDZ_ASSET_THEMEPARK_CLOWNBOARD_2 eSprite = CMHDZ_SPRITE_THEMEPARK_CLOWNBOARD_2 BREAK CASE CMHDZ_ASSET_FENCE eSprite = CMHDZ_SPRITE_FENCE BREAK // CASE CMHDZ_ASSET_FENCE_SMALL // eSprite = CMHDZ_SPRITE_FENCE_SMALL // BREAK CASE CMHDZ_ASSET_SCRAPYARD_MD_CAR_1 eSprite = CMHDZ_SPRITE_SCRAPYARD_PROP_MD_CAR_01 BREAK CASE CMHDZ_ASSET_SCRAPYARD_MD_CAR_2 eSprite = CMHDZ_SPRITE_SCRAPYARD_PROP_MD_CAR_02 BREAK CASE CMHDZ_ASSET_SCRAPYARD_MD_CAR_3 eSprite = CMHDZ_SPRITE_SCRAPYARD_PROP_MD_CAR_03 BREAK CASE CMHDZ_ASSET_SCRAPYARD_MD_CAR_4 eSprite = CMHDZ_SPRITE_SCRAPYARD_PROP_MD_CAR_04 BREAK CASE CMHDZ_ASSET_CACTUS_9 eSprite = CMHDZ_SPRITE_PROP_CACTUS_07 BREAK CASE CMHDZ_ASSET_SCRAPYARD_PROP_FENCE eSprite = CMHDZ_SPRITE_SCRAPYARD_PROP_FENCE BREAK // CASE CMHDZ_ASSET_SCRAPYARD_BG_CARS // eSprite = CMHDZ_SPRITE_SCRAPYARD_PROP_BG_CARS // BREAK CASE CMHDZ_ASSET_THEMEPARK_TREE_1 eSprite = CMHDZ_SPRITE_TREE_01 BREAK CASE CMHDZ_ASSET_THEMEPARK_TREE_2 eSprite = CMHDZ_SPRITE_TREE_02 BREAK CASE CMHDZ_ASSET_THEMEPARK_TREE_3 eSprite = CMHDZ_SPRITE_TREE_01 BREAK CASE CMHDZ_ASSET_THEMEPARK_TREE_4 eSprite = CMHDZ_SPRITE_TREE_02 BREAK CASE CMHDZ_ASSET_GRASS eSprite = CMHDZ_SPRITE_FLOOR_GRASS BREAK CASE CMHDZ_ASSET_BUSH_1 eSprite = CMHDZ_SPRITE_PROP_BUSH_SMALL BREAK CASE CMHDZ_ASSET_BUSH_2 eSprite = CMHDZ_SPRITE_PROP_BUSH_LARGE BREAK CASE CMHDZ_ASSET_ROCK_SMALL eSprite = CMHDZ_SPRITE_PROP_ROCK_SMALL BREAK CASE CMHDZ_ASSET_ROCK_LARGE eSprite = CMHDZ_SPRITE_PROP_ROCK_LARGE BREAK CASE CMHDZ_ASSET_FOREGROUND_TRASH eSprite = CMHDZ_SPRITE_PROP_FOREGROUND_TRASH BREAK CASE CMHDZ_ASSET_BARRIER eSprite = CMHDZ_SPRITE_PROP_BARRIER BREAK CASE CMHDZ_ASSET_BARRELS eSprite = CMHDZ_SPRITE_PROP_BARRELS BREAK CASE CMHDZ_ASSET_MEATGRINDER_1 eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_PROP_MEATGRINDER_01 BREAK CASE CMHDZ_ASSET_MEATGRINDER_2 eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_PROP_MEATGRINDER_02 BREAK CASE CMHDZ_ASSET_BODYBAG_1 eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_BODYBAG_01 BREAK CASE CMHDZ_ASSET_BODYBAG_2 eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_BODYBAG_02 BREAK CASE CMHDZ_ASSET_BODYBAG_3 eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_BODYBAG_03 BREAK CASE CMHDZ_ASSET_BODYBAG_FLOOR_1 eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_FLOOR_BODYBAG_01 BREAK CASE CMHDZ_ASSET_BODYBAG_FLOOR_2 eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_FLOOR_BODYBAG_02 BREAK CASE CMHDZ_ASSET_BODYBAG_FLOOR_3 eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_FLOOR_BODYBAG_03 BREAK CASE CMHDZ_ASSET_BODYBAG_FLOOR_4 eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_FLOOR_BODYBAG_04 BREAK CASE CMHDZ_ASSET_MEATHOOK eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_MEATHOOK BREAK CASE CMHDZ_ASSET_PIG IF iHitCount = 0 eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_PIG_01 ELSE eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_PIG_02 ENDIF BREAK CASE CMHDZ_ASSET_PIG_BATCH eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_PIG_BATCH BREAK CASE CMHDZ_ASSET_WINDOW eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_PROP_WINDOW BREAK CASE CMHDZ_ASSET_DOOR_1 eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_PROP_DOOR_01 BREAK CASE CMHDZ_ASSET_DOOR_2 eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_PROP_DOOR_02 BREAK CASE CMHDZ_ASSET_OVERHEAD_LIGHT eSprite = CMHDZ_SPRITE_SLAUGHTERHOUSE_PROP_LIGHT BREAK CASE CMHDZ_ASSET_WATER_TOWER eSprite = CMHDZ_SPRITE_WATER_TANK BREAK // CASE CMHDZ_ASSET_SPECIAL_TNT_CRATE // eSprite = CMHDZ_SPRITE_PROP_TNT_CRATE_STATE_01 // BREAK CASE CMHDZ_ASSET_SPECIAL_TNT_BARREL_1 eSprite = CMHDZ_SPRITE_BARREL_HORIZONTAL BREAK CASE CMHDZ_ASSET_SPECIAL_TNT_BARREL_2 //tl23Sprite = "BARREL_VERTICAL" // ?!? BREAK CASE CMHDZ_ASSET_TRASHCAN_BIG_1 eSprite = CMHDZ_SPRITE_TRASHCAN_BIG_01 BREAK CASE CMHDZ_ASSET_TRASHCAN_BIG_2 eSprite = CMHDZ_SPRITE_TRASHCAN_BIG_02 BREAK CASE CMHDZ_ASSET_TRASHCAN_SMALL_1 eSprite = CMHDZ_SPRITE_TRASHCAN_SMALL_01 BREAK CASE CMHDZ_ASSET_TRASHCAN_SMALL_2 eSprite = CMHDZ_SPRITE_TRASHCAN_SMALL_02 BREAK CASE CMHDZ_ASSET_TRASHBAG_BIG eSprite = CMHDZ_SPRITE_TRASHBAG_BIG BREAK CASE CMHDZ_ASSET_TRASHBAG_SMALL eSprite = CMHDZ_SPRITE_TRASHBAG_SMALL BREAK ENDSWITCH RETURN eSprite ENDFUNC FUNC BOOL CMHDZ_DRAW_COVER_PROCESS_CHECK(INT i, INT iDistance, BOOL bIsSuperFarBackGround = FALSE, BOOL bIsEditor = FALSE) IF (bIsSuperFarBackGround = TRUE) IF NOT CMHDZ_COVER_DATA_IS_BITMASK_SET(i, CMHDZ_COVER_DATA_BITS_IS_FAR_BG) RETURN FALSE ENDIF ELIF CMHDZ_COVER_DATA_IS_BITMASK_SET(i, CMHDZ_COVER_DATA_BITS_IS_FAR_BG) RETURN FALSE ENDIF // Invalid or empty data IF sCMHDZData.sCoverData[i].fActiveAtPoint = 0 RETURN FALSE ENDIF // Off screen to the right IF !bIsEditor AND (sCMHDZData.fOverallLevelProgression + cfBASE_SCREEN_WIDTH + 400) <= sCMHDZData.sCoverData[i].fActiveAtPoint //CDEBUG2LN(DEBUG_MINIGAME, "CMHDZ_DRAW_COVER_PROCESS_CHECK - Cover number:", i, ", Active point: ", sCMHDZData.sCoverData[i].fActiveAtPoint, ", RESULT:- Returning false as it's off screen to Right") RETURN FALSE ENDIF // Not even on screen // IF sCMHDZData.sCoverData[i].vSpritePos.x <= -(sCMHDZData.sCoverData[i].vSpriteSize.x/2.0) // RETURN FALSE // ENDIF // // IF sCMHDZData.sCoverData[i].vSpritePos.X >= (1920.0 + (sCMHDZData.sCoverData[i].vSpriteSize.X/2.0)) // RETURN FALSE // ENDIF RETURN sCMHDZData.sCoverData[i].iCoverLane = iDistance ENDFUNC FUNC BOOL CMHDZ_IS_COVER_OUT_OF_LIMITS(INT iCoverID) RETURN sCMHDZData.sCoverData[iCoverID].vSpritePos.x <= -(cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT) ENDFUNC PROC CMHDZ_DRAW_COVER(INT iDistance, BOOL bForLeaderboard = FALSE, BOOL bIsSuperFarBackGround = FALSE) CMHDZ_SPRITE eSprite FLOAT fScale = 1.0 VECTOR_2D vScale BOOL bRepositionWhenOffScreenForMovingLevel BOOL bUpdatePosition INT i INT iNumRemove = 0 INT iRemoveWhenOffScreen[ciCMHDZ_MAX_COVER] // Loop thrugh all cover REPEAT ciCMHDZ_MAX_COVER i IF NOT CMHDZ_DRAW_COVER_PROCESS_CHECK(i, iDistance, bIsSuperFarBackGround) RELOOP ENDIF // draw the cover on the current screen and the next fScale = CMHDZ_COVER_UTIL_GET_TYPE_SCALE_FOR_LANE(sCMHDZData.sCoverData[i].eType, iDistance) eSprite = CMHDZ_COVER_UTIL_GET_SPRITE_FOR_TYPE(sCMHDZData.sCoverData[i].eType, sCMHDZData.sCoverData[i].iHitCount) vScale = CMHDZ_COVER_UTIL_GET_TYPE_SIZE(sCMHDZData.sCoverData[i].eType) IF (eSprite = CMHDZ_SPRITE_NONE) RELOOP ENDIF //IF sCMHDZData.sCoverData[i].vSpritePos.x < cfBASE_SCREEN_WIDTH AND sCMHDZData.sCoverData[i].vSpritePos.x > 0 IF bForLeaderboard CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_SPRITE_GET_TEXTURE_DICT_NAME(eSprite), CMHDZ_SPRITE_GET_TEXTURE_NAME(eSprite), sCMHDZData.sCoverData[i].vSpritePos, INIT_VECTOR_2D(vScale.x*fScale, vScale.y*fScale), 0, sCMHDZData.rgbaSprite) ELSE CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sCoverData[i].vSpritePos, INIT_VECTOR_2D(vScale.x*fScale, vScale.y*fScale), 0, sCMHDZData.rgbaSprite) //#IF IS_DEBUG_BUILD // // Identfy cover numbers and size // TEXT_LABEL_31 sDebug = "Cover: " // sDebug += i // sDebug += ", Active: " // sDebug += ROUND(sCMHDZData.sCoverData[i].fActiveAtPoint) // // DRAW_DEBUG_TEXT_2D(sDebug, // <<(sCMHDZData.sCoverData[i].vSpritePos.x / 1920), // (sCMHDZData.sCoverData[i].vSpritePos.y / 1080), // 0.0>>, // 15, 15, 250) //#ENDIF // ENDIF bUpdatePosition = TRUE bRepositionWhenOffScreenForMovingLevel = !CMHDZ_COVER_DATA_IS_BITMASK_SET(i, CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN) IF bForLeaderboard //-- If it's the LB background, always update bRepositionWhenOffScreenForMovingLevel = TRUE ELIF IS_MOVING_LEVEL() IF CMHDZ_IS_MOVING_LEVEL_ABOUT_TO_STOP() //IF CMHDZ_GET_CURRENT_LEVEL() = CMHDZ_LEVEL_CITY IF sCMHDZData.sCoverData[i].iCoverLane = ciCMHDZ_LANE_FOREGROUND //-- Don't want to reprosition if we're about to stop scrolling as otherwise they'll appear again on //-- the static screen bRepositionWhenOffScreenForMovingLevel = FALSE IF CEIL(sCMHDZData.sCoverData[i].fActiveAtPoint/1920.0) <= (CMHDZ_GET_CURRENT_LEVEL_SCREEN() + 1) FLOAT fLeftEdge fLeftEdge = sCMHDZData.sCoverData[i].vSpritePos.x - (sCMHDZData.sCoverData[i].fCoverWidth /2.0) IF fLeftEdge > cfBASE_SCREEN_WIDTH - 250 //-- If we're about to stop, don't update anything that's about to appear from the right #IF IS_DEBUG_BUILD //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_COVER] {DSW} Not updating cover from right - about to stop ", i, " Lane: ", sCMHDZData.sCoverData[i].iCoverLane ," Type: ", CMHDZ_ASSET_TYPES_TO_STRING(sCMHDZData.sCoverData[i].eType), " Left edge Pos: ", fLeftEdge) #ENDIF bUpdatePosition = FALSE ENDIF ENDIF ELSE //-- Level is moving, fine to update bRepositionWhenOffScreenForMovingLevel = TRUE ENDIF ELSE //-- Level is moving, fine to update bRepositionWhenOffScreenForMovingLevel = TRUE ENDIF ELSE //-- Stationary, don't move anything bRepositionWhenOffScreenForMovingLevel = FALSE bUpdatePosition = FALSE ENDIF IF iDistance = ciCMHDZ_LANE_FOREGROUND IF CMHDZ_IS_COVER_OUT_OF_LIMITS(i) IF bRepositionWhenOffScreenForMovingLevel //sCMHDZData.sCoverData[i].vSpritePos.x += (cfRIGHT_SCREEN_LIMIT*3) //+ ((sCMHDZData.sCoverData[i].fCoverWidth * CMHDZ_COVER_UTIL_GET_TYPE_SCALE_FOR_LANE(sCMHDZData.sCoverData[i].eType, sCMHDZData.sCoverData[i].iCoverLane)) /2) IF !CMHDZ_SHOULD_REMOVE_COVER_WHEN_OFF_SCREEN(i) sCMHDZData.sCoverData[i].vSpritePos.x += ((cfRIGHT_SCREEN_LIMIT+cfRIGHT_SCREEN_LIMIT)/2.0)*3 sCMHDZData.sCoverData[i].fActiveAtPoint += ((cfRIGHT_SCREEN_LIMIT+cfRIGHT_SCREEN_LIMIT)/2.0)*3 ENDIF ENDIF ELSE IF bUpdatePosition sCMHDZData.sCoverData[i].vSpritePos.x -= CMHDZ_GET_COVER_FOREGROUND_UPDATE() ENDIF ENDIF ELSE // Distance = 0 or 1. Foreground and background? IF CMHDZ_IS_COVER_OUT_OF_LIMITS(i) IF bRepositionWhenOffScreenForMovingLevel IF CMHDZ_SHOULD_REMOVE_COVER_WHEN_OFF_SCREEN(i) //-- When some cover has finished animating, don't want to reposition IF iNumRemove < ciCMHDZ_MAX_COVER iRemoveWhenOffScreen[iNumRemove] = i iNumRemove++ // // IF sCMHDZData.sCoverData[i].eType = CMHDZ_ASSET_PIG // CMHDZ_ADD_COVER_TO_LIST(sCMHDZData.sCoverData[i].vSpritePos, CMHDZ_ASSET_PIG, ciCMHDZ_LANE_BACKGROUND, sCMHDZData.sCoverData[i].iScreen) // ENDIF // // #IF IS_DEBUG_BUILD // CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_COVER] {DSW} Want to remove when offscreen ", i, " Lane: ", sCMHDZData.sCoverData[i].iCoverLane ," Type: ", CMHDZ_ASSET_TYPES_TO_STRING(sCMHDZData.sCoverData[i].eType)) // #ENDIF // ELSE // #IF IS_DEBUG_BUILD // CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_COVER] {DSW} Want to remove when offscreen BUT ARRAY FULL! ", i, " Lane: ", sCMHDZData.sCoverData[i].iCoverLane ," Type: ", CMHDZ_ASSET_TYPES_TO_STRING(sCMHDZData.sCoverData[i].eType)) // #ENDIF ENDIF ELSE //sCMHDZData.sCoverData[i].vSpritePos.x += (cfRIGHT_SCREEN_LIMIT*3) //+ ((sCMHDZData.sCoverData[i].fCoverWidth * CMHDZ_COVER_UTIL_GET_TYPE_SCALE_FOR_LANE(sCMHDZData.sCoverData[i].eType, sCMHDZData.sCoverData[i].iCoverLane)) /2) sCMHDZData.sCoverData[i].vSpritePos.x += ((cfRIGHT_SCREEN_LIMIT+cfRIGHT_SCREEN_LIMIT)/2.0)*3 sCMHDZData.sCoverData[i].fActiveAtPoint += ((cfRIGHT_SCREEN_LIMIT+cfRIGHT_SCREEN_LIMIT)/2.0)*3 sCMHDZData.sCoverData[i].vSpritePos.x *= CMHDZ_COVER_UTIL_GET_TYPE_SCALE_FOR_LANE(sCMHDZData.sCoverData[i].eType, sCMHDZData.sCoverData[i].iCoverLane) #IF IS_DEBUG_BUILD IF sCMHDZData.sCoverData[i].eType = CMHDZ_ASSET_SPECIAL_TNT_BARREL_1 //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_COVER] {DSW} Found TNT Barrel Cover: ", i, " Type: ", CMHDZ_ASSET_TYPES_TO_STRING(sCMHDZData.sCoverData[i].eType)) ENDIF #ENDIF ENDIF ENDIF ELSE IF bUpdatePosition //sCMHDZData.sCoverData[i].vSpritePos.x -= CMHDZ_GET_GENERAL_UPDATE() sCMHDZData.sCoverData[i].vSpritePos.x = (sCMHDZData.sCoverData[i].fActiveAtPoint - sCMHDZData.fOverallLevelProgression) ENDIF ENDIF ENDIF ENDREPEAT //-- Delete / reset any cover we don't want to re-appear next time the screen scrolls IF iNumRemove > 0 FOR i = 0 TO iNumRemove - 1 CMHDZ_RESET_COVER(iRemoveWhenOffScreen[i]) ENDFOR ENDIF ENDPROC // ============================================= // BOSS Functions // ============================================= PROC CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE eNewState, CMHDZ_BOSS_STATE oldState = CMHDZ_BOSS_STATE_INACTIVE) CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_CHANGE_BOSS_STATE - New state: ", CMHDZ_BOSS_STATE_TO_STRING(eNewState)) INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 255, 255) sCMHDZData.sBossData.bShotThisFrame = FALSE sCMHDZData.sBossData.fStateChangeTimer = 0.0 IF oldState = CMHDZ_BOSS_STATE_FOREGROUND_POP_DOWN IF sCMHDZData.sBossData.fHealth <= (sCMHDZData.sBossData.fDamageThreshold_1) IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sCMHDZData.sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_1) eNewState = (CMHDZ_BOSS_STATE_SPAWN_HELPERS_1) // sCMHDZData.sBossData.eCurrentBossState = eNewState // EXIT ENDIF ENDIF IF sCMHDZData.sBossData.fHealth <= (sCMHDZData.sBossData.fDamageThreshold_2) IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sCMHDZData.sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_2) eNewState = (CMHDZ_BOSS_STATE_SPAWN_HELPERS_2) // sCMHDZData.sBossData.eCurrentBossState = eNewState // EXIT ENDIF ENDIF IF sCMHDZData.sBossData.fHealth <= (sCMHDZData.sBossData.fDamageThreshold_3) // IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sCMHDZData.sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_2) eNewState = (CMHDZ_BOSS_STATE_FOREGROUND_POP_UP) // sCMHDZData.sBossData.eCurrentBossState = eNewState // EXIT // ENDIF ENDIF // Stop the chainsaw sound if Bearsy is leaving the screen. CMHDZ_STOP_SOUND(CMHDZ_AUDIO_EFFECT_BEARSY_CHAINSAW_LOOP) ENDIF IF eNewState = CMHDZ_BOSS_STATE_WALKING AND oldState != CMHDZ_BOSS_STATE_THROWING sCMHDZData.sBossData.fTimeToThrow = GET_RANDOM_FLOAT_IN_RANGE(1800.0, 2600.0) SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(sCMHDZData.sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_REVERSE, INT_TO_BOOL(GET_RANDOM_INT_IN_RANGE(0, 2))) IF IS_BITMASK_ENUM_AS_ENUM_SET(sCMHDZData.sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_REVERSE) sCMHDZData.sBossData.vSpritePos.X = -200 ELSE // Appear from right sCMHDZData.sBossData.vSpritePos.X = 1920 + 200 ENDIF // Middle lane sCMHDZData.sBossData.iActiveLane = ciCMHDZ_LANE_MIDDLE IF sCMHDZData.sBossData.fHealth <= (sCMHDZData.sBossData.fDamageThreshold_3) eNewState = (CMHDZ_BOSS_STATE_FOREGROUND_POP_UP) // Will hit the next state ENDIF ENDIF IF eNewState = CMHDZ_BOSS_STATE_FOREGROUND_POP_UP sCMHDZData.sBossData.iActiveLane = ciCMHDZ_LANE_FOREGROUND sCMHDZData.sBossData.vSpritePos.x = GET_RANDOM_FLOAT_IN_RANGE(600.0, 1200.0) sCMHDZData.sBossData.vSpritePos.y = (1080.0 + (sCMHDZData.sBossData.vScale.y/2.0)) CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_BEARSY_REVEAL) // First time appearance. IF oldState = CMHDZ_BOSS_STATE_WAITING sCMHDZData.sBossData.vSpritePos.x = cfBASE_SCREEN_WIDTH/2.0 ENDIF ENDIF IF eNewState = CMHDZ_BOSS_STATE_STUNNED_BACKGROUND sCMHDZData.iStaticScreenPhase = 0 ENDIF IF eNewState = CMHDZ_BOSS_STATE_DYING CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_FINAL_BOSS_DEFEATED) ENDIF sCMHDZData.sBossData.eCurrentBossState = eNewState ENDPROC FUNC FLOAT CMHDZ_GET_AMOUNT_BOSS_HAS_BEEN_DAMAGED(BOOL bHeadshot, CMHDZ_BOSS_STATE eBossState, INT iActiveLane) IF iActiveLane = ciCMHDZ_LANE_FOREGROUND IF eBossState != CMHDZ_BOSS_STATE_STUNNED_FOREGROUND AND eBossState != CMHDZ_BOSS_STATE_ATTACK_READY RETURN 0.0 ENDIF ENDIF IF iActiveLane = ciCMHDZ_LANE_BACKGROUND // Scale damage if in the background IF eBossState = CMHDZ_BOSS_STATE_STUNNED_BACKGROUND OR eBossState = CMHDZ_BOSS_STATE_WALKING_INV RETURN 0.0 ENDIF ENDIF #IF IS_DEBUG_BUILD //CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} ") //CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} Enemy ", iEnemy, " Shot at least once. Lane: ", sCMHDZData.sEnemyData[iEnemy].iEnemyLane, " Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[iEnemy].iEnemyType), " Headshot? ", bHeadshot) #ENDIF FLOAT fBaseDamage INT iRand CMHDZ_PLAYER_WEAPON weapon = CMHDZ_GET_PLAYER_CURRENT_WEAPON() CMHDZ_PLAYER_WEAPON_DATA data = CMHDZ_GET_PLAYER_WEAPON_DATA(weapon) fBaseDamage = TO_FLOAT(data.iMinDamagePerShot) IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_QUAD_DAMAGE) fBaseDamage *= 2.0 // Bearsy dying too quickly. Upping defense. ENDIF IF sCMHDZData.sPlayerData[0].weaponType = CMHDZ_PLAYER_WEAPON_TYPE_DEFAULT iRand = GET_RANDOM_INT_IN_RANGE(0, 4) fBaseDamage += iRand ENDIF IF bHeadshot fBaseDamage *= 2.0 ENDIF // Scale for background IF iActiveLane = ciCMHDZ_LANE_BACKGROUND fBaseDamage /= 2.0 ENDIF RETURN fBaseDamage ENDFUNC PROC CMHDZ_BOSS_PROCESS_ANIM_DATA(CMHDZ_BOSS_DATA &sBossData, CMHDZ_SPRITE &eSprite, INT &iAnimLength, INT &iFrameTime) BOOL bLoopingAnim = TRUE SWITCH sBossData.eCurrentBossState CASE CMHDZ_BOSS_STATE_WAITING sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_WALK_FRAME_IDLE iAnimLength = 1 iFrameTime = 1000 BREAK CASE CMHDZ_BOSS_STATE_WALKING sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_WALK_FRAME_01 iAnimLength = 5 iFrameTime = 150 BREAK CASE CMHDZ_BOSS_STATE_WALKING_INV sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_WALK_FRAME_01 iAnimLength = 5 iFrameTime = 75 BREAK CASE CMHDZ_BOSS_STATE_STUNNED_BACKGROUND sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_BACKGROUND_STAGGERED iAnimLength = 1 iFrameTime = 150 BREAK CASE CMHDZ_BOSS_STATE_THROWING sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_THROWING_01 iAnimLength = 3 iFrameTime = 200 bLoopingAnim = FALSE BREAK CASE CMHDZ_BOSS_STATE_PAIN sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_BACK_PAIN iAnimLength = 6 iFrameTime = 135 BREAK CASE CMHDZ_BOSS_STATE_FOREGROUND_PAIN sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_DEATH_01 iAnimLength = 2 iFrameTime = 500 BREAK CASE CMHDZ_BOSS_STATE_FOREGROUND_IDLE CASE CMHDZ_BOSS_STATE_FOREGROUND_POP_UP CASE CMHDZ_BOSS_STATE_FOREGROUND_POP_DOWN sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_FOREGROUND_IDLE_04 iAnimLength = 2 iFrameTime = 400 BREAK CASE CMHDZ_BOSS_STATE_ATTACKING sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_FOREGROUND_ATTACKING_01 iAnimLength = 5 iFrameTime = 150 bLoopingAnim = FALSE BREAK CASE CMHDZ_BOSS_STATE_STUNNED_FOREGROUND sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_FOREGROUND_STAGGERED iAnimLength = 1 iFrameTime = 150 BREAK CASE CMHDZ_BOSS_STATE_ATTACKING_COUNTER sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_FOREGROUND_ATTACKING_01 iAnimLength = 5 iFrameTime = 100 bLoopingAnim = FALSE BREAK CASE CMHDZ_BOSS_STATE_BLOCKING sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_FOREGROUND_IDLE_01 iAnimLength = 3 iFrameTime = 200 BREAK CASE CMHDZ_BOSS_STATE_ATTACK_READY sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_FOREGROUND_IDLE_01 iAnimLength = 2 iFrameTime = 400 BREAK CASE CMHDZ_BOSS_STATE_DYING sBossData.sStartingSprite = CMHDZ_SPRITE_BEARSY_DEATH_01 iAnimLength = 2 iFrameTime = 500 bLoopingAnim = TRUE BREAK ENDSWITCH IF (sBossData.fHealth > sBossData.fDamageThreshold_1) // Do nothing - x1 ELIF (sBossData.fHealth > sBossData.fDamageThreshold_2) iFrameTime = ROUND(iFrameTime*0.9) ELIF (sBossData.fHealth > sBossData.fDamageThreshold_3) iFrameTime = ROUND(iFrameTime*0.8) ELSE iFrameTime = ROUND(iFrameTime*0.7) ENDIF // Local frame timer sBossData.fAnimTimer += (0.0+@1000) sBossData.iAnimFrame = FLOOR(sBossData.fAnimTimer / iFrameTime) IF sBossData.iAnimFrame >= iAnimLength IF NOT bLoopingAnim sBossData.iAnimFrame = iAnimLength-1 SET_BITMASK_ENUM_AS_ENUM(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_ANIM_FINISHED_ONCE) ELSE sBossData.fAnimTimer = 0.0 sBossData.iAnimFrame = 0 ENDIF ENDIF //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_BOSS_PROCESS_ANIM_DATA - iAnimFrame: ", sBossData.iAnimFrame) // Get anim frame timer update // IF sBossData.fAnimTimer >= (iFrameTime) // // //sBossData.fAnimTimer = 0.0 // ENDIF // Reset data if we're beyond the length // IF sBossData.iAnimFrame >= iAnimLength // sBossData.iAnimFrame = 0 // sBossData.fAnimTimer = 0.0 // ENDIF eSprite = INT_TO_ENUM(CMHDZ_SPRITE, ENUM_TO_INT(sBossData.sStartingSprite)+ sBossData.iAnimFrame) sBossData.vScale = CMHDZ_BOSS_GET_SPRITE_SIZES(eSprite) IF sBossData.iActiveLane = ciCMHDZ_LANE_BACKGROUND sBossData.vScale = MULTIPLY_VECTOR_2D(sBossData.vScale, 0.8) ENDIF ENDPROC PROC CMHDZ_BOSS_MIDBACK_WALKING_UPDATE(CMHDZ_BOSS_DATA &sBossData, INT &iFrameTime) // Position update IF IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_REVERSE) SWITCH (sBossData.iActiveLane) CASE ciCMHDZ_LANE_MIDDLE //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_BOSS_DATA_BITS_REVERSE - Go to screens right") sBossData.vSpritePos.x += CMHDZ_GET_BOSS_MIDDLE_UPDATE(iFrameTime) sBossData.vSpritePos.y = 500 IF sBossData.vSpritePos.x >= cfRIGHT_SCREEN_LIMIT + 100 sBossData.fTimeToThrow = GET_RANDOM_FLOAT_IN_RANGE(1800.0, 2600.0) sBossData.iActiveLane = ciCMHDZ_LANE_BACKGROUND ENDIF BREAK CASE ciCMHDZ_LANE_BACKGROUND sBossData.vSpritePos.x -= CMHDZ_GET_BOSS_BACKGROUND_UPDATE(iFrameTime) sBossData.vScale.x = -sBossData.vScale.x sBossData.vSpritePos.y = 320 IF sBossData.vSpritePos.x <= cfLEFT_SCREEN_LIMIT - 100 sBossData.iActiveLane = ciCMHDZ_LANE_FOREGROUND sBossData.vSpritePos.x = GET_RANDOM_FLOAT_IN_RANGE(600.0, 1200.0) sBossData.vSpritePos.y = (1080.0 + (sBossData.vScale.y/2.0)) //sBossData.vSpritePos.x = sBossData.eBossPhases[sBossData.iPhaseIndex].fForegroundXAppear sBossData.fStateChangeTimer = 0.0 CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FOREGROUND_POP_UP) //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_BOSS_MIDBACK_WALKING_UPDATE - sBossData.eCurrentBossState - CMHDZ_BOSS_DATA_BITS_REVERSE = CMHDZ_BOSS_STATE_FOREGROUND_POP_UP") ENDIF BREAK ENDSWITCH ELSE // Appear from right SWITCH (sBossData.iActiveLane) CASE ciCMHDZ_LANE_MIDDLE //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] Appear from right - ciCMHDZ_LANE_MIDDLE - iFrameTime: ", iFrameTime) sBossData.vSpritePos.x -= CMHDZ_GET_BOSS_MIDDLE_UPDATE(iFrameTime) sBossData.vScale.x = -sBossData.vScale.x sBossData.vSpritePos.y = 500 IF sBossData.vSpritePos.x <= cfLEFT_SCREEN_LIMIT - 100 sBossData.fTimeToThrow = GET_RANDOM_FLOAT_IN_RANGE(1800.0, 2600.0) sBossData.iActiveLane = ciCMHDZ_LANE_BACKGROUND ENDIF BREAK CASE ciCMHDZ_LANE_BACKGROUND sBossData.vSpritePos.x += CMHDZ_GET_BOSS_BACKGROUND_UPDATE(iFrameTime) //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] Appear from right - ciCMHDZ_LANE_BACKGROUND - sBossData.vSpritePos.x: ", sBossData.vSpritePos.x) sBossData.vSpritePos.y = 320 IF sBossData.vSpritePos.x >= cfRIGHT_SCREEN_LIMIT + 100 sBossData.iActiveLane = ciCMHDZ_LANE_FOREGROUND sBossData.vSpritePos.x = GET_RANDOM_FLOAT_IN_RANGE(600.0, 1200.0) //sBossData.vSpritePos.x = sBossData.eBossPhases[sBossData.iPhaseIndex].fForegroundXAppear sBossData.vSpritePos.y = (1080.0 + (sBossData.vScale.y/2.0)) //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_BOSS_MIDBACK_WALKING_UPDATE - sBossData.eCurrentBossState - NOT CMHDZ_BOSS_DATA_BITS_REVERSE = CMHDZ_BOSS_STATE_FOREGROUND_POP_UP") sBossData.fStateChangeTimer = 0.0 CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FOREGROUND_POP_UP) ENDIF BREAK ENDSWITCH ENDIF ENDPROC PROC CMHDZ_BOSS_INVINCIBLE_WALKING_UPDATE(CMHDZ_BOSS_DATA &sBossData, INT &iFrameTime) // Position update IF IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_REVERSE) SWITCH (sBossData.iActiveLane) CASE ciCMHDZ_LANE_MIDDLE //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_BOSS_DATA_BITS_REVERSE - Go to screens right") sBossData.vSpritePos.x += (CMHDZ_GET_BOSS_MIDDLE_UPDATE(iFrameTime)*2) sBossData.vSpritePos.y = 500 IF sBossData.vSpritePos.x >= cfRIGHT_SCREEN_LIMIT + 100 sBossData.iActiveLane = ciCMHDZ_LANE_FOREGROUND sBossData.vSpritePos.x = GET_RANDOM_FLOAT_IN_RANGE(600.0, 1200.0) sBossData.vSpritePos.y = (1080.0 + (sBossData.vScale.y/2.0)) //sBossData.vSpritePos.x = sBossData.eBossPhases[sBossData.iPhaseIndex].fForegroundXAppear CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FOREGROUND_POP_UP) sBossData.fStateChangeTimer = 0.0 //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_BOSS_MIDBACK_WALKING_UPDATE - sBossData.eCurrentBossState - CMHDZ_BOSS_DATA_BITS_REVERSE = CMHDZ_BOSS_STATE_FOREGROUND_POP_UP") IF sBossData.fHealth <= sBossData.fDamageThreshold_1 IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_1) sBossData.fHealth = sBossData.fDamageThreshold_1 CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_SPAWN_HELPERS_1) EXIT ENDIF ENDIF IF sBossData.fHealth <= sBossData.fDamageThreshold_2 IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_2) sBossData.fHealth = sBossData.fDamageThreshold_2 CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_SPAWN_HELPERS_2) EXIT ENDIF ENDIF // IF sBossData.fHealth <= sBossData.fDamageThreshold_3 // EXIT // ENDIF ENDIF BREAK CASE ciCMHDZ_LANE_BACKGROUND sBossData.vSpritePos.x -= (CMHDZ_GET_BOSS_BACKGROUND_UPDATE(iFrameTime)*2) sBossData.vScale.x = -sBossData.vScale.x sBossData.vSpritePos.y = 320 IF sBossData.vSpritePos.x <= cfLEFT_SCREEN_LIMIT - 100 sBossData.iActiveLane = ciCMHDZ_LANE_FOREGROUND sBossData.vSpritePos.x = GET_RANDOM_FLOAT_IN_RANGE(600.0, 1200.0) sBossData.vSpritePos.y = (1080.0 + (sBossData.vScale.y/2.0)) //sBossData.vSpritePos.x = sBossData.eBossPhases[sBossData.iPhaseIndex].fForegroundXAppear CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FOREGROUND_POP_UP) sBossData.fStateChangeTimer = 0.0 //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_BOSS_MIDBACK_WALKING_UPDATE - sBossData.eCurrentBossState - CMHDZ_BOSS_DATA_BITS_REVERSE = CMHDZ_BOSS_STATE_FOREGROUND_POP_UP") IF sBossData.fHealth <= sBossData.fDamageThreshold_1 IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_1) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_SPAWN_HELPERS_1) sBossData.fHealth = sBossData.fDamageThreshold_1 EXIT ENDIF ENDIF IF sBossData.fHealth <= sBossData.fDamageThreshold_2 IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_2) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_SPAWN_HELPERS_2) sBossData.fHealth = sBossData.fDamageThreshold_2 EXIT ENDIF ENDIF // IF sBossData.fHealth <= sBossData.fDamageThreshold_3 // // EXIT // ENDIF ENDIF BREAK ENDSWITCH ELSE // Appear from right SWITCH (sBossData.iActiveLane) CASE ciCMHDZ_LANE_MIDDLE //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] Appear from right - ciCMHDZ_LANE_MIDDLE - iFrameTime: ", iFrameTime) sBossData.vSpritePos.x -= (CMHDZ_GET_BOSS_MIDDLE_UPDATE(iFrameTime)*2) sBossData.vScale.x = -sBossData.vScale.x sBossData.vSpritePos.y = 500 IF sBossData.vSpritePos.x <= cfLEFT_SCREEN_LIMIT - 100 //sBossData.vSpritePos.x = sBossData.eBossPhases[sBossData.iPhaseIndex].fForegroundXAppear CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FOREGROUND_POP_UP) sBossData.fStateChangeTimer = 0.0 //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_BOSS_MIDBACK_WALKING_UPDATE - sBossData.eCurrentBossState - CMHDZ_BOSS_DATA_BITS_REVERSE = CMHDZ_BOSS_STATE_FOREGROUND_POP_UP") IF sBossData.fHealth <= sBossData.fDamageThreshold_1 IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_1) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_SPAWN_HELPERS_1) sBossData.fHealth = sBossData.fDamageThreshold_1 EXIT ENDIF ENDIF IF sBossData.fHealth <= sBossData.fDamageThreshold_2 IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_2) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_SPAWN_HELPERS_2) sBossData.fHealth = sBossData.fDamageThreshold_2 EXIT ENDIF ENDIF // IF sBossData.fHealth <= sBossData.fDamageThreshold_3 // EXIT // ENDIF ENDIF BREAK CASE ciCMHDZ_LANE_BACKGROUND sBossData.vSpritePos.x += (CMHDZ_GET_BOSS_BACKGROUND_UPDATE(iFrameTime)*2) //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] Appear from right - ciCMHDZ_LANE_BACKGROUND - sBossData.vSpritePos.x: ", sBossData.vSpritePos.x) sBossData.vSpritePos.y = 320 IF sBossData.vSpritePos.x >= cfRIGHT_SCREEN_LIMIT + 100 // sBossData.iActiveLane = ciCMHDZ_LANE_FOREGROUND // sBossData.vSpritePos.x = GET_RANDOM_FLOAT_IN_RANGE(600.0, 1200.0) // //sBossData.vSpritePos.x = sBossData.eBossPhases[sBossData.iPhaseIndex].fForegroundXAppear // sBossData.vSpritePos.y = (1080.0 + (sBossData.vScale.y/2.0)) // //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_BOSS_MIDBACK_WALKING_UPDATE - sBossData.eCurrentBossState - NOT CMHDZ_BOSS_DATA_BITS_REVERSE = CMHDZ_BOSS_STATE_FOREGROUND_POP_UP") // sBossData.fStateChangeTimer = 0.0 CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FOREGROUND_POP_UP) IF sBossData.fHealth <= sBossData.fDamageThreshold_1 IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_1) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_SPAWN_HELPERS_1) sBossData.fHealth = sBossData.fDamageThreshold_1 EXIT ENDIF ENDIF IF sBossData.fHealth <= sBossData.fDamageThreshold_2 IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_2) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_SPAWN_HELPERS_2) sBossData.fHealth = sBossData.fDamageThreshold_2 EXIT ENDIF ENDIF // IF sBossData.fHealth <= sBossData.fDamageThreshold_3 // //sBossData.fHealth = sBossData.fDamageThreshold_3 // EXIT // ENDIF ENDIF BREAK ENDSWITCH ENDIF ENDPROC PROC CMHDZ_INIT_THROWN_BEARSY_PROJECTILE() #IF IS_DEBUG_BUILD //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_INIT_THROWN_ENEMY_PROJECTILE] Called, type: ", CMHDZ_PROJECTILE_TYPES_TO_STRING(eType), " Initial pos: ",vInitialPos.x, ", ", vInitialPos.y) #ENDIF IF sCMHDZData.iNumberOfThrownEnemyProjectiles > ciCMHDZ_MAX_ENEMY_PROJECTILES - 1 //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_INIT_THROWN_BEARSY_PROJECTILE] Too many projectiles - exiting ") EXIT ENDIF sCMHDZData.sEnemyProjectiles[sCMHDZData.iNumberOfThrownEnemyProjectiles].eState = CMHDZ_PROJECTILE_STATE_AIRBORNE INT min = ENUM_TO_INT(CMHDZ_PROJECTILE_BONE) INT max = ENUM_TO_INT(CMHDZ_PROJECTILE_TROTTER)+1// Non inclusive maximum sCMHDZData.sEnemyProjectiles[sCMHDZData.iNumberOfThrownEnemyProjectiles].eType = INT_TO_ENUM(CMHDZ_PROJECTILE_TYPES, GET_RANDOM_INT_IN_RANGE(min,max)) sCMHDZData.sEnemyProjectiles[sCMHDZData.iNumberOfThrownEnemyProjectiles].vSpritePos = sCMHDZData.sBossData.vSpritePos CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BEARSY_MEAT_THROW, sCMHDZData.sEnemyProjectiles[sCMHDZData.iNumberOfThrownEnemyProjectiles].vSpritePos) ENDPROC PROC CMHDZ_HANDLE_THROWN_BEARSY_PROJECTILES() INT i REPEAT ciCMHDZ_MAX_ENEMY_PROJECTILES i SWITCH sCMHDZData.sEnemyProjectiles[i].eState CASE CMHDZ_PROJECTILE_STATE_AIRBORNE //sCMHDZData.sEnemyProjectiles[i].iSpriteAnimFrame += sCMHDZData.sEnemyProjectiles[i].iSlowUpdateFrames IF sCMHDZData.sEnemyProjectiles[i].iSpriteAnimFrame >= ciCMHDZ_MAX_ENEMY_THROWN_DYNAMITE_ANIM_FRAMES sCMHDZData.sEnemyProjectiles[i].eState = CMHDZ_PROJECTILE_STATE_IMPACT CMHDZ_DAMAGE_PLAYER(CMHDZ_DAMAGE_PLAYER_TYPE_BULLET) SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 20) TWS_CREATE_FX(sCMHDZData.sEnemyProjectiles[i].vSpritePos, CMHDZ_FX_BLOOD_SPLAT, ciCMHDZ_LANE_FOREGROUND) CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_RAT_DEATH, sCMHDZData.sEnemyProjectiles[i].vSpritePos) ENDIF BREAK CASE CMHDZ_PROJECTILE_STATE_IMPACT CMHDZ_RESET_ENEMY_THROWN_PROJECTILE(i) BREAK ENDSWITCH ENDREPEAT ENDPROC PROC CMHDZ_DRAW_THROWN_BEARSY_PROJECTILES() INT i CMHDZ_SPRITE eSprite VECTOR_2D vSize CMHDZ_HANDLE_THROWN_BEARSY_PROJECTILES() REPEAT ciCMHDZ_MAX_ENEMY_PROJECTILES i IF sCMHDZData.sEnemyProjectiles[i].eState = CMHDZ_PROJECTILE_STATE_INACTIVE ELIF sCMHDZData.sEnemyProjectiles[i].eState = CMHDZ_PROJECTILE_STATE_AIRBORNE //CDEBUG2LN(DEBUG_MINIGAME, "CMHDZ_DRAW_THROWN_BEARSY_PROJECTILES - Projectile to draw: ", CMHDZ_PROJECTILE_TYPES_TO_STRING(sCMHDZData.sEnemyProjectiles[i].eType)) SWITCH sCMHDZData.sEnemyProjectiles[i].eType CASE CMHDZ_PROJECTILE_BONE SWITCH sCMHDZData.sEnemyProjectiles[i].iSpriteAnimFrame CASE 0 CASE 1 eSprite = CMHDZ_SPRITE_BEARSY_BONE_SMALL_01 vSize = INIT_VECTOR_2D(212, 204) BREAK CASE 2 CASE 3 eSprite = CMHDZ_SPRITE_BEARSY_BONE_MED_02 vSize = INIT_VECTOR_2D(316, 304) BREAK CASE 4 CASE 5 eSprite = CMHDZ_SPRITE_BEARSY_BONE_LARGE_01 vSize = INIT_VECTOR_2D(472, 452) BREAK ENDSWITCH BREAK CASE CMHDZ_PROJECTILE_JOWL SWITCH sCMHDZData.sEnemyProjectiles[i].iSpriteAnimFrame CASE 0 CASE 1 eSprite = CMHDZ_SPRITE_BEARSY_JOWL_SMALL_01 vSize = INIT_VECTOR_2D(212, 204) BREAK CASE 2 CASE 3 eSprite = CMHDZ_SPRITE_BEARSY_JOWL_MED_02 vSize = INIT_VECTOR_2D(316, 304) BREAK CASE 4 CASE 5 eSprite = CMHDZ_SPRITE_BEARSY_JOWL_LARGE_01 vSize = INIT_VECTOR_2D(472, 452) BREAK ENDSWITCH BREAK CASE CMHDZ_PROJECTILE_LEG SWITCH sCMHDZData.sEnemyProjectiles[i].iSpriteAnimFrame CASE 0 CASE 1 eSprite = CMHDZ_SPRITE_BEARSY_LEG_SMALL_01 vSize = INIT_VECTOR_2D(212, 204) BREAK CASE 2 CASE 3 eSprite = CMHDZ_SPRITE_BEARSY_LEG_MED_02 vSize = INIT_VECTOR_2D(316, 304) BREAK CASE 4 CASE 5 eSprite = CMHDZ_SPRITE_BEARSY_LEG_LARGE_01 vSize = INIT_VECTOR_2D(472, 452) BREAK ENDSWITCH BREAK CASE CMHDZ_PROJECTILE_TROTTER SWITCH sCMHDZData.sEnemyProjectiles[i].iSpriteAnimFrame CASE 0 CASE 1 eSprite = CMHDZ_SPRITE_BEARSY_TROTTER_SMALL_01 vSize = INIT_VECTOR_2D(212, 204) BREAK CASE 2 CASE 3 eSprite = CMHDZ_SPRITE_BEARSY_TROTTER_MED_02 vSize = INIT_VECTOR_2D(316, 304) BREAK CASE 4 CASE 5 eSprite = CMHDZ_SPRITE_BEARSY_TROTTER_LARGE_01 vSize = INIT_VECTOR_2D(472, 452) BREAK ENDSWITCH BREAK DEFAULT RELOOP BREAK ENDSWITCH ////CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_DRAW_THROWN_ENEMY_PROJECTILES] Sprite: ", CMHDZ_SPRITE_TO_STRING(eSprite)) CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sEnemyProjectiles[i].vSpritePos, vSize, 0, sCMHDZData.rgbaSprite) ELIF sCMHDZData.sEnemyProjectiles[i].eState = CMHDZ_PROJECTILE_STATE_IMPACT ENDIF ENDREPEAT ENDPROC PROC CMHDZ_HANDLE_BEARSY_DAMAGE(CMHDZ_BOSS_DATA &sBossData, BOOL bHeadshot) // Handle bearsy damage IF sBossData.bShotThisFrame EXIT ENDIF sBossData.bShotThisFrame = TRUE FLOAT fDamage = CMHDZ_GET_AMOUNT_BOSS_HAS_BEEN_DAMAGED(bHeadshot, sBossData.eCurrentBossState, sBossData.iActiveLane) IF (fDamage = 0.0) //sBossData.bShotThisFrame = FALSE ELSE CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_BEARSY, sBossData.vSpritePos) CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BEARSY_PAIN, sBossData.vSpritePos) IF bHeadshot CMHDZ_INCREASE_ENEMY_HEADSHOT_COUNT_FOR_CURRENT_LEVEL() CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_AT_LEAST_ONE_HEADSHOT) ENDIF CMHDZ_ADD_TO_LOCAL_PLAYER_SCORE( CMHDZ_SCORE_TYPE_BEARSY ) CMHDZ_INCREASE_ENEMY_HIT_COUNT_FOR_CURRENT_LEVEL(FALSE) sBossData.fHealth -= fDamage ENDIF ENDPROC PROC CMHDZ_BOSS_STATE_UPDATE(CMHDZ_BOSS_DATA &sBossData, CMHDZ_SPRITE &eSprite) CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_BOSS_STATE_UPDATE - Boss State INT: ", sBossData.eCurrentBossState) INT iLastFrame = 6 INT iFrameTime = 150 FLOAT fEnemyPositionToAppear = TO_FLOAT(sCMHDZData.iCurrentScreen) * (cfCMHDZ_SCREEN_LENGTH) // GET Frame based upon lane. CMHDZ_BOSS_PROCESS_ANIM_DATA(sBossData, eSprite, iLastFrame, iFrameTime) // State change timer sBossData.fStateChangeTimer += (0.0+@1000) IF (sBossData.fStateChangeTimer%100.0) <= 10.0 CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_CHANGE_BOSS_STATE - fStateChangeTimer: ", sBossData.fStateChangeTimer) ENDIF // Get enemy weapon data CMHDZ_PLAYER_WEAPON_TYPE weaponType = sCMHDZData.sPlayerData[0].weaponType INT iClipSize = sCMHDZData.sPlayerData[0].weaponData[weaponType].iAmmoInClip SWITCH sBossData.eCurrentBossState CASE CMHDZ_BOSS_STATE_INACTIVE IF CMHDZ_IS_LEVEL_STOPPED() CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_BEARSY_APPEAR) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_WAITING) CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_FINAL_BOSS) sBossData.fStateChangeTimer = 0.0 // Initialising here sBossData.fDamageThreshold_1 = (sBossData.fHealth * 0.75) sBossData.fDamageThreshold_2 = (sBossData.fHealth * 0.5) sBossData.fDamageThreshold_3 = (sBossData.fHealth * 0.25) ENDIF BREAK CASE CMHDZ_BOSS_STATE_WAITING IF sBossData.fStateChangeTimer >= (3500) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FOREGROUND_POP_UP, CMHDZ_BOSS_STATE_WAITING) ENDIF BREAK CASE CMHDZ_BOSS_STATE_FOREGROUND_POP_UP // eSprite = CMHDZ_SPRITE_BEARSY_FOREGROUND_IDLE_01 // sCMHDZData.CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_WALKING IF sBossData.vSpritePos.y > 780 // Have Bearsy pop-up on screen sBossData.vSpritePos.y -= (1.0*(0.0+@1000)) ELSE sBossData.vSpritePos.y = 780 CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FOREGROUND_IDLE) ENDIF BREAK CASE CMHDZ_BOSS_STATE_FOREGROUND_POP_DOWN IF sBossData.vSpritePos.y < (1080 + (sBossData.vScale.y/2.0)) sBossData.vSpritePos.y += (1.0*(0.0+@1000)) ELSE CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_BEARSY) // sBossData.fTimeToThrow = GET_RANDOM_FLOAT_IN_RANGE(1800.0, 2600.0) // SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_REVERSE, INT_TO_BOOL(GET_RANDOM_INT_IN_RANGE(0, 2))) // // IF IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_REVERSE) // sBossData.vSpritePos.X = -200 // ELSE // Appear from right // sBossData.vSpritePos.X = 1920 + 200 // ENDIF // // // Middle lane // sBossData.iActiveLane = ciCMHDZ_LANE_MIDDLE // CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_WALKING) ENDIF BREAK CASE CMHDZ_BOSS_STATE_FOREGROUND_IDLE IF sBossData.fStateChangeTimer >= (((cfBOSS_MaxHealth+sBossData.fHealth)*15)/4.0) sBossData.fStateChangeTimer = 0.0 //sBossData.iAnimFrame = 0 // Reset anim frames if using timers CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_ATTACK_READY) ENDIF IF sBossData.bShotThisFrame CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_BLOCKING) CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_BEARSY_DEFLECT, sBossData.vSpritePos) CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_METAL, sBossData.vSpritePos) TWS_CREATE_FX(INIT_VECTOR_2D(sBossData.vSpritePos.x + 60, sBossData.vSpritePos.Y - 20), CMHDZ_FX_ENEMY_SHOT, ciCMHDZ_LANE_FOREGROUND) ENDIF BREAK CASE CMHDZ_BOSS_STATE_BLOCKING IF iClipSize = 0 OR sBossData.fStateChangeTimer >= (1500.0) CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BEARSY_ATTACK, sBossData.vSpritePos) //sCMHDZData.iBearAttackTime = GET_GAME_TIMER() CMHDZ_DAMAGE_PLAYER(CMHDZ_DAMAGE_PLAYER_TYPE_SLASH) sBossData.fAnimTimer = 0.0 sBossData.iAnimFrame = 0 // Reset anim frames if using timers TWS_CREATE_FX(sCMHDZData.sBossData.vSpritePos, CMHDZ_FX_BEARSY_FOREGROUND_ATTACKING_BLOOD, ciCMHDZ_LANE_FOREGROUND) TWS_CREATE_FX(sCMHDZData.sBossData.vSpritePos, CMHDZ_FX_BEARSY_FOREGROUND_SPARKS, ciCMHDZ_LANE_FOREGROUND) TWS_CREATE_FX(sCMHDZData.sBossData.vSpritePos, CMHDZ_FX_SLASH_EFFECT, ciCMHDZ_LANE_FOREGROUND) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_ATTACKING_COUNTER) BREAK ENDIF IF sBossData.bShotThisFrame // CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_BLOCKING) CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_BEARSY_DEFLECT, sBossData.vSpritePos) CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_METAL, sBossData.vSpritePos) TWS_CREATE_FX(INIT_VECTOR_2D(sBossData.vSpritePos.x + 60, sBossData.vSpritePos.Y - 20), CMHDZ_FX_ENEMY_SHOT, ciCMHDZ_LANE_FOREGROUND) BREAK ENDIF IF sBossData.fStateChangeTimer >= (1250.0) //sBossData.iAnimFrame = 0 // Reset anim frames if using timers CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FOREGROUND_IDLE) ENDIF BREAK CASE CMHDZ_BOSS_STATE_ATTACK_READY // Flash green IF (sBossData.fStateChangeTimer % 300) <= 150 INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 100, 255, 100) ELSE INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 255, 255) ENDIF IF sBossData.bShotThisFrame CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_STUNNED_FOREGROUND) ENDIF IF sBossData.fStateChangeTimer >= (((cfBOSS_MaxHealth+sBossData.fHealth)*10)/4.0) sBossData.fStateChangeTimer = 0.0 INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 255, 255) CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BEARSY_ATTACK, sBossData.vSpritePos) //sCMHDZData.iBearAttackTime = GET_GAME_TIMER() CMHDZ_DAMAGE_PLAYER(CMHDZ_DAMAGE_PLAYER_TYPE_SLASH) sBossData.fAnimTimer = 0.0 sBossData.iAnimFrame = 0 // Reset anim frames if using timers TWS_CREATE_FX(sCMHDZData.sBossData.vSpritePos, CMHDZ_FX_BEARSY_FOREGROUND_ATTACKING_BLOOD, ciCMHDZ_LANE_FOREGROUND) TWS_CREATE_FX(sCMHDZData.sBossData.vSpritePos, CMHDZ_FX_BEARSY_FOREGROUND_SPARKS, ciCMHDZ_LANE_FOREGROUND) TWS_CREATE_FX(sCMHDZData.sBossData.vSpritePos, CMHDZ_FX_SLASH_EFFECT, ciCMHDZ_LANE_FOREGROUND) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_ATTACKING) ENDIF BREAK CASE CMHDZ_BOSS_STATE_ATTACKING CASE CMHDZ_BOSS_STATE_ATTACKING_COUNTER IF IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_ANIM_FINISHED_ONCE)// If anim is finished transition sBossData.fStateChangeTimer = 0.0 sBossData.fAnimTimer = 0.0 sBossData.iAnimFrame = 0 CLEAR_BITMASK_ENUM_AS_ENUM(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_ANIM_FINISHED_ONCE)// Clear the bit CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FOREGROUND_POP_DOWN) ENDIF BREAK CASE CMHDZ_BOSS_STATE_STUNNED_FOREGROUND // Flash yellow and lightly shake IF (sBossData.fStateChangeTimer % 300) <= 150 INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 200, 100) sCMHDZData.sBossData.vSpritePos.x += 0.05*(0.0+@1000) ELSE INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 255, 255) IF sBossData.bShotThisFrame INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 50, 50) TWS_CREATE_FX(sCMHDZData.sBossData.vSpritePos, CMHDZ_FX_BEARSY_FOREGROUND_PAIN_BLOOD, ciCMHDZ_LANE_FOREGROUND) ENDIF sCMHDZData.sBossData.vSpritePos.x -= 0.05*(0.0+@1000) ENDIF IF sBossData.fStateChangeTimer >= 2000 INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 255, 255) sBossData.fStateChangeTimer = 0.0 //sBossData.iAnimFrame = 0 // Reset anim frames if using timers //TWS_CREATE_FX(sCMHDZData.sBossData.vSpritePos, CMHDZ_FX_BEARSY_FOREGROUND_PAIN_BLOOD, ciCMHDZ_LANE_FOREGROUND) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FOREGROUND_POP_DOWN) ENDIF // Health ran out. Boss is dead. IF sBossData.fHealth <= 0.0 CMHDZ_KILL_ALL_ENEMIES_IN_RANGE_NO_SCORE(sCMHDZData.sBossData.vSpritePos) CMHDZ_ADD_TO_LOCAL_PLAYER_SCORE( CMHDZ_SCORE_TYPE_BEARSY_KILL ) CMHDZ_STOP_SOUND(CMHDZ_AUDIO_EFFECT_BEARSY_CHAINSAW_LOOP) CMHDZ_PLAY_SOUND(CMHDZ_AUDIO_EFFECT_BEARSY_DIE, sCMHDZData.sBossData.vSpritePos) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_DYING) ENDIF BREAK CASE CMHDZ_BOSS_STATE_FOREGROUND_PAIN // Flash red IF (sBossData.fStateChangeTimer % 300) <= 150 INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 50, 50) ELSE INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 255, 255) ENDIF IF sBossData.fStateChangeTimer >= 1000.0 INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 255, 255) sBossData.fStateChangeTimer = 0.0 //sBossData.iAnimFrame = 0 // Reset anim frames if using timers CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FOREGROUND_POP_DOWN) ENDIF BREAK CASE CMHDZ_BOSS_STATE_WALKING CMHDZ_BOSS_MIDBACK_WALKING_UPDATE(sBossData, iFrameTime) IF sBossData.bShotThisFrame INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 50, 50) ELSE INIT_RGBA_STRUCT(sBossData.rgbaColor, 255, 255, 255) ENDIF IF (sBossData.fStateChangeTimer >= sBossData.fTimeToThrow) AND IS_FLOAT_IN_RANGE(sBossData.vSpritePos.x, 400.0, 1400.0) AND sBossData.fStateChangeTimer >= sBossData.fTimeToThrow AND sBossData.fTimeToThrow > 0.0 // If time to throw doesn't have a value don't do it. sBossData.fStateChangeTimer = 0.0 sBossData.iAnimFrame = 0 // Reset anim frames if using timers sBossData.fAnimTimer = 0.0 CMHDZ_INIT_THROWN_BEARSY_PROJECTILE() CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_THROWING) ENDIF IF sBossData.bShotThisFrame IF sBossData.fHealth <= sBossData.fDamageThreshold_1 AND NOT IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_1) sBossData.fHealth = sBossData.fDamageThreshold_1 CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_STUNNED_BACKGROUND) ENDIF IF sBossData.fHealth <= sBossData.fDamageThreshold_2 AND NOT IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_2) sBossData.fHealth = sBossData.fDamageThreshold_2 CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_STUNNED_BACKGROUND) ENDIF IF sBossData.fHealth <= sBossData.fDamageThreshold_3 CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_STUNNED_BACKGROUND) ENDIF ENDIF BREAK CASE CMHDZ_BOSS_STATE_WALKING_INV // Flash red IF (sBossData.fStateChangeTimer % 500) <= 150 INIT_RGBA_STRUCT(sBossData.rgbaColor, 255, 50, 50) ELSE INIT_RGBA_STRUCT(sBossData.rgbaColor, 255, 255, 255) ENDIF CMHDZ_BOSS_INVINCIBLE_WALKING_UPDATE(sBossData, iFrameTime) BREAK CASE CMHDZ_BOSS_STATE_STUNNED_BACKGROUND // Flash red IF (sBossData.fStateChangeTimer % 500) <= 150 INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 50, 50) ELSE INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 255, 255) ENDIF IF sBossData.fStateChangeTimer >= 1500 INIT_RGBA_STRUCT(sCMHDZData.sBossData.rgbaColor, 255, 255, 255) sBossData.fStateChangeTimer = 0.0 //sBossData.iAnimFrame = 0 // Reset anim frames if using timers CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_WALKING_INV) ENDIF BREAK CASE CMHDZ_BOSS_STATE_THROWING IF IS_BITMASK_ENUM_AS_ENUM_SET(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_ANIM_FINISHED_ONCE)// If anim is finished transition sBossData.fTimeToThrow = GET_RANDOM_FLOAT_IN_RANGE(1800.0, 2600.0) sBossData.iAnimFrame = 0 // Reset anim frame here sBossData.fAnimTimer = 0.0 sBossData.fStateChangeTimer = 0.0 CLEAR_BITMASK_ENUM_AS_ENUM(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_ANIM_FINISHED_ONCE)// Clear the bit CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_WALKING, CMHDZ_BOSS_STATE_THROWING) CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] Check the boss health: ", sBossData.fHealth) ENDIF BREAK CASE CMHDZ_BOSS_STATE_SPAWN_HELPERS_1 CMHDZ_ADD_ENEMY_TO_LIST(1850.0000, 430.0000, 1100.0000, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_5, fEnemyPositionToAppear, TRUE, FALSE, 0, 1) CMHDZ_ADD_ENEMY_TO_LIST(100, 680, 900, ciCMHDZ_LANE_MIDDLE, TRUE, CMHDZ_ENEMY_5, fEnemyPositionToAppear, TRUE, FALSE, 0, 1) CMHDZ_ADD_ENEMY_TO_LIST(1850, 950, 1050, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T5_2, fEnemyPositionToAppear, TRUE, FALSE, 0, 1) SET_BITMASK_ENUM_AS_ENUM(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_1) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_WAIT_FOR_ALL_ENEMIES_DEAD) BREAK CASE CMHDZ_BOSS_STATE_SPAWN_HELPERS_2 CMHDZ_ADD_ENEMY_TO_LIST(100, 340, 500, ciCMHDZ_LANE_BACKGROUND, TRUE, CMHDZ_ENEMY_5, fEnemyPositionToAppear, TRUE, FALSE, 0, 1) CMHDZ_ADD_ENEMY_TO_LIST(1850, 675, 780, ciCMHDZ_LANE_MIDDLE, FALSE, CMHDZ_ENEMY_5, fEnemyPositionToAppear, TRUE, FALSE, 0, 1) CMHDZ_ADD_ENEMY_TO_LIST(1850, 430, 1500, ciCMHDZ_LANE_BACKGROUND, FALSE, CMHDZ_ENEMY_5, fEnemyPositionToAppear, TRUE, FALSE, 0, 2) CMHDZ_ADD_ENEMY_TO_LIST(1850, 950, 560, ciCMHDZ_LANE_FOREGROUND, FALSE, CMHDZ_FOREGROUND_ENEMY_T5_1, fEnemyPositionToAppear, TRUE, FALSE, 0, 2) SET_BITMASK_ENUM_AS_ENUM(sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_2) CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_WAIT_FOR_ALL_ENEMIES_DEAD) BREAK CASE CMHDZ_BOSS_STATE_WAIT_FOR_ALL_ENEMIES_DEAD IF CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_SCREEN() <= 1 sCMHDZData.iStaticScreenPhase = 0 CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FOREGROUND_POP_UP) ENDIF BREAK CASE CMHDZ_BOSS_STATE_DYING IF sBossData.vSpritePos.y < (1080 + (sBossData.vScale.y/2.0)) sBossData.vSpritePos.y += (1.0*(0.0+@400)) ELSE CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_FINAL) ENDIF BREAK CASE CMHDZ_BOSS_STATE_FINAL BREAK ENDSWITCH // Handle looping chainsaw sound SWITCH sBossData.eCurrentBossState CASE CMHDZ_BOSS_STATE_FOREGROUND_IDLE CASE CMHDZ_BOSS_STATE_FOREGROUND_PAIN CASE CMHDZ_BOSS_STATE_FOREGROUND_POP_DOWN CASE CMHDZ_BOSS_STATE_FOREGROUND_POP_UP CASE CMHDZ_BOSS_STATE_BLOCKING CASE CMHDZ_BOSS_STATE_ATTACK_READY CASE CMHDZ_BOSS_STATE_ATTACKING CASE CMHDZ_BOSS_STATE_ATTACKING_COUNTER CASE CMHDZ_BOSS_STATE_STUNNED_FOREGROUND CMHDZ_PLAY_SOUND_LOOPING(CMHDZ_AUDIO_EFFECT_BEARSY_CHAINSAW_LOOP, sCMHDZData.sBossData.vSpritePos) BREAK ENDSWITCH sBossData.bShotThisFrame = FALSE ENDPROC PROC CMHDZ_DRAW_BOSS_SPRITE_AND_EFFECTS(CMHDZ_SPRITE eSprite, INT iLane) IF sCMHDZData.sBossData.iActiveLane = iLane CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sBossData.vSpritePos, sCMHDZData.sBossData.vScale, 0.0, sCMHDZData.sBossData.rgbaColor) ENDIF // CMHDZ_HANDLE_FX() // CMHDZ_DRAW_BULLETS_AND_EFFECTS(ciCMHDZ_LANE_FOREGROUND) // CMHDZ_DRAW_GORE_EFFECTS() ENDPROC PROC CMHDZ_DRAW_BOSS(INT iLane = ciCMHDZ_LANE_FOREGROUND) IF (sCMHDZData.eCurrentLevel != CMHDZ_LEVEL_SLAUGHTERHOUSE) EXIT ENDIF IF sCMHDZData.iCurrentScreen < CMHDZ_GET_FINAL_SCREEN_IN_CURRENT_LEVEL() EXIT ENDIF CMHDZ_DRAW_BOSS_SPRITE_AND_EFFECTS(sCMHDZData.sBossData.eActiveSprite, iLane) ENDPROC FUNC BOOL CMHDZ_BEARSY_UPDATE() IF sCMHDZData.eCurrentLevel != CMHDZ_LEVEL_SLAUGHTERHOUSE RETURN FALSE // Don't process if we aren't in the right stage. ENDIF IF sCMHDZData.iCurrentScreen < CMHDZ_GET_FINAL_SCREEN_IN_LEVEL(CMHDZ_LEVEL_SLAUGHTERHOUSE) RETURN FALSE // Don't process if we aren't in the right screen. ENDIF IF sCMHDZData.sBossData.eCurrentBossState = CMHDZ_BOSS_STATE_FINAL RETURN TRUE ENDIF CMHDZ_BOSS_STATE_UPDATE(sCMHDZData.sBossData, sCMHDZData.sBossData.eActiveSprite) CDEBUG2LN(DEBUG_MINIGAME, "CMHDZ_BEARSY_UPDATE - fHealth: ", sCMHDZData.sBossData.fHealth) RETURN FALSE ENDFUNC FUNC BOOL CMHDZ_IS_BEARSY_ON_SCREEN() IF sCMHDZData.sBossData.vSpritePos.x <= 120.0 RETURN FALSE ENDIF IF sCMHDZData.sBossData.vSpritePos.x >= 1820.0 RETURN FALSE ENDIF IF sCMHDZData.sBossData.vSpritePos.y >= 900.0 RETURN FALSE ENDIF IF sCMHDZData.sBossData.vSpritePos.y <= 150.0 RETURN FALSE ENDIF RETURN TRUE ENDFUNC //------------------------------------------------- // PROJECTILE FUNCTIONS //------------------------------------------------- PROC CMHDZ_DRAW_THROWN_PLAYER_PROJECTILES(INT iPlayer) INT i TEXT_LABEL_31 tl31Sprite STRING sTextDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_COMMON_PROPS) VECTOR_2D vSize // CMHDZ_DRAW_GAME_SPRITE(sCMHDZData.tl31BaseTextDict, "THROWING_DYNAMITE_SMALL_01" ,GET_DEBUG_TEXTURE_POS(0), INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_SMALL_WIDTH, ciCMHDZ_DYNAMITE_SMALL_HEIGHT),0, sCMHDZData.rgbaSprite) REPEAT ciCMHDZ_MAX_PLAYER_THROWN_PROJECTILES i IF sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].eState = CMHDZ_PROJECTILE_STATE_INACTIVE ELIF sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].eState = CMHDZ_PROJECTILE_STATE_AIRBORNE SWITCH sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].eType CASE CMHDZ_PROJECTILE_DYNAMITE SWITCH sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].iSpriteAnimFrame CASE 5 tl31Sprite = "THROWING_DYNAMITE_SMALL_01" vSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_SMALL_WIDTH, ciCMHDZ_DYNAMITE_SMALL_HEIGHT) BREAK CASE 4 tl31Sprite = "THROWING_DYNAMITE_SMALL_02" vSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_SMALL_WIDTH, ciCMHDZ_DYNAMITE_SMALL_HEIGHT) BREAK CASE 3 tl31Sprite = "THROWING_DYNAMITE_MEDIUM_01" vSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_MEDIUM_WIDTH, ciCMHDZ_DYNAMITE_MEDIUM_HEIGHT) BREAK CASE 2 tl31Sprite = "THROWING_DYNAMITE_MEDIUM_02" vSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_MEDIUM_WIDTH, ciCMHDZ_DYNAMITE_MEDIUM_HEIGHT) BREAK CASE 1 tl31Sprite = "THROWING_DYNAMITE_LARGE_01" vSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_LARGE_WIDTH, ciCMHDZ_DYNAMITE_LARGE_HEIGHT) BREAK CASE 0 tl31Sprite = "THROWING_DYNAMITE_LARGE_02" vSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_LARGE_WIDTH, ciCMHDZ_DYNAMITE_LARGE_HEIGHT) BREAK ENDSWITCH BREAK CASE CMHDZ_PROJECTILE_MOLOTOV SWITCH sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].iSpriteAnimFrame CASE 5 tl31Sprite = "THROWING_FIREBOTTLE_SMALL" vSize = INIT_VECTOR_2D(ciCMHDZ_MOLOTOV_SMALL_WIDTH, ciCMHDZ_MOLOTOV_SMALL_HEIGHT) BREAK CASE 4 tl31Sprite = "THROWING_FIREBOTTLE_SMALL" vSize = INIT_VECTOR_2D(ciCMHDZ_MOLOTOV_SMALL_WIDTH, ciCMHDZ_MOLOTOV_SMALL_HEIGHT) BREAK CASE 3 tl31Sprite = "THROWING_FIREBOTTLE_MEDIUM" vSize = INIT_VECTOR_2D(ciCMHDZ_MOLOTOV_MEDIUM_WIDTH, ciCMHDZ_MOLOTOV_MEDIUM_HEIGHT) BREAK CASE 2 tl31Sprite = "THROWING_FIREBOTTLE_MEDIUM" vSize = INIT_VECTOR_2D(ciCMHDZ_MOLOTOV_MEDIUM_WIDTH, ciCMHDZ_MOLOTOV_MEDIUM_HEIGHT) BREAK CASE 1 tl31Sprite = "THROWING_FIREBOTTLE_LARGE" vSize = INIT_VECTOR_2D(ciCMHDZ_MOLOTOV_LARGE_WIDTH, ciCMHDZ_MOLOTOV_LARGE_HEIGHT) BREAK CASE 0 tl31Sprite = "THROWING_FIREBOTTLE_LARGE" vSize = INIT_VECTOR_2D(ciCMHDZ_MOLOTOV_LARGE_WIDTH, ciCMHDZ_MOLOTOV_LARGE_HEIGHT) BREAK ENDSWITCH BREAK CASE CMHDZ_PROJECTILE_NAILBOMB SWITCH sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].iSpriteAnimFrame CASE 5 tl31Sprite = "THROWING_ENEMY_NAILBOMB_SMALL" vSize = INIT_VECTOR_2D(ciCMHDZ_NAILBOMB_SMALL_WIDTH, ciCMHDZ_NAILBOMB_SMALL_HEIGHT) BREAK CASE 4 tl31Sprite = "THROWING_ENEMY_NAILBOMB_SMALL" vSize = INIT_VECTOR_2D(ciCMHDZ_NAILBOMB_SMALL_WIDTH, ciCMHDZ_NAILBOMB_SMALL_HEIGHT) BREAK CASE 3 tl31Sprite = "THROWING_ENEMY_NAILBOMB_MEDIUM" vSize = INIT_VECTOR_2D(ciCMHDZ_NAILBOMB_MEDIUM_WIDTH, ciCMHDZ_NAILBOMB_MEDIUM_HEIGHT) BREAK CASE 2 tl31Sprite = "THROWING_ENEMY_NAILBOMB_MEDIUM" vSize = INIT_VECTOR_2D(ciCMHDZ_NAILBOMB_MEDIUM_WIDTH, ciCMHDZ_NAILBOMB_MEDIUM_HEIGHT) BREAK CASE 1 tl31Sprite = "THROWING_ENEMY_NAILBOMB_LARGE" vSize = INIT_VECTOR_2D(ciCMHDZ_NAILBOMB_LARGE_WIDTH, ciCMHDZ_NAILBOMB_LARGE_HEIGHT) BREAK CASE 0 tl31Sprite = "THROWING_ENEMY_NAILBOMB_LARGE" vSize = INIT_VECTOR_2D(ciCMHDZ_NAILBOMB_LARGE_WIDTH, ciCMHDZ_NAILBOMB_LARGE_HEIGHT) BREAK ENDSWITCH BREAK CASE CMHDZ_PROJECTILE_BRICK SWITCH sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].iSpriteAnimFrame CASE 5 tl31Sprite = "THROWING_ENEMY_BRICK_SMALL" vSize = INIT_VECTOR_2D(ciCMHDZ_BRICK_SMALL_WIDTH, ciCMHDZ_BRICK_SMALL_HEIGHT) BREAK CASE 4 tl31Sprite = "THROWING_ENEMY_BRICK_SMALL" vSize = INIT_VECTOR_2D(ciCMHDZ_BRICK_SMALL_WIDTH, ciCMHDZ_BRICK_SMALL_HEIGHT) BREAK CASE 3 tl31Sprite = "THROWING_ENEMY_BRICK_MEDIUM" vSize = INIT_VECTOR_2D(ciCMHDZ_BRICK_MEDIUM_WIDTH, ciCMHDZ_BRICK_MEDIUM_HEIGHT) BREAK CASE 2 tl31Sprite = "THROWING_ENEMY_BRICK_MEDIUM" vSize = INIT_VECTOR_2D(ciCMHDZ_BRICK_MEDIUM_WIDTH, ciCMHDZ_BRICK_MEDIUM_HEIGHT) BREAK CASE 1 tl31Sprite = "THROWING_ENEMY_BRICK_LARGE" vSize = INIT_VECTOR_2D(ciCMHDZ_BRICK_LARGE_WIDTH, ciCMHDZ_BRICK_LARGE_HEIGHT) BREAK CASE 0 tl31Sprite = "THROWING_ENEMY_BRICK_LARGE" vSize = INIT_VECTOR_2D(ciCMHDZ_BRICK_LARGE_WIDTH, ciCMHDZ_BRICK_LARGE_HEIGHT) BREAK ENDSWITCH BREAK ENDSWITCH //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_DRAW_THROWN_PLAYER_PROJECTILES] Player:", iPlayer, " Sprite: ", tl31Sprite) CMHDZ_DRAW_GAME_SPRITE_DETAILS(sTextDict, tl31Sprite, sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].vSpritePos, vSize, 0, sCMHDZData.rgbaSprite) ELIF sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].eState = CMHDZ_PROJECTILE_STATE_IMPACT ENDIF ENDREPEAT ENDPROC PROC CMHDZ_DRAW_THROWN_ENEMY_PROJECTILES() INT i CMHDZ_SPRITE eSprite VECTOR_2D vSize REPEAT ciCMHDZ_MAX_ENEMY_PROJECTILES i IF sCMHDZData.sEnemyProjectiles[i].eState = CMHDZ_PROJECTILE_STATE_INACTIVE ELIF sCMHDZData.sEnemyProjectiles[i].eState = CMHDZ_PROJECTILE_STATE_AIRBORNE SWITCH sCMHDZData.sEnemyProjectiles[i].eType CASE CMHDZ_PROJECTILE_DYNAMITE SWITCH sCMHDZData.sEnemyProjectiles[i].iSpriteAnimFrame CASE 0 CASE 1 eSprite = CMHDZ_SPRITE_THROWING_DYNAMITE_SMALL_01 vSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_SMALL_WIDTH, ciCMHDZ_DYNAMITE_SMALL_HEIGHT) BREAK // eSprite = CMHDZ_SPRITE_THROWING_DYNAMITE_SMALL_02 // vSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_SMALL_WIDTH, ciCMHDZ_DYNAMITE_SMALL_HEIGHT) // BREAK // eSprite = CMHDZ_SPRITE_THROWING_DYNAMITE_MEDIUM_01 // vSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_MEDIUM_WIDTH, ciCMHDZ_DYNAMITE_MEDIUM_HEIGHT) // BREAK CASE 2 CASE 3 eSprite = CMHDZ_SPRITE_THROWING_DYNAMITE_MEDIUM_02 vSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_MEDIUM_WIDTH, ciCMHDZ_DYNAMITE_MEDIUM_HEIGHT) BREAK CASE 4 CASE 5 eSprite = CMHDZ_SPRITE_THROWING_DYNAMITE_LARGE_01 vSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_LARGE_WIDTH, ciCMHDZ_DYNAMITE_LARGE_HEIGHT) BREAK // eSprite = CMHDZ_SPRITE_THROWING_DYNAMITE_LARGE_02 // vSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_LARGE_WIDTH, ciCMHDZ_DYNAMITE_LARGE_HEIGHT) // BREAK ENDSWITCH BREAK CASE CMHDZ_PROJECTILE_BRICK SWITCH sCMHDZData.sEnemyProjectiles[i].iSpriteAnimFrame CASE 0 CASE 1 eSprite = CMHDZ_SPRITE_THROWING_BRICK_SMALL vSize = INIT_VECTOR_2D(ciCMHDZ_BRICK_SMALL_WIDTH, ciCMHDZ_BRICK_SMALL_HEIGHT) BREAK CASE 2 CASE 3 eSprite = CMHDZ_SPRITE_THROWING_BRICK_MEDIUM vSize = INIT_VECTOR_2D(ciCMHDZ_BRICK_MEDIUM_WIDTH, ciCMHDZ_BRICK_MEDIUM_HEIGHT) BREAK CASE 4 CASE 5 eSprite = CMHDZ_SPRITE_THROWING_BRICK_LARGE vSize = INIT_VECTOR_2D(ciCMHDZ_BRICK_LARGE_WIDTH, ciCMHDZ_BRICK_LARGE_HEIGHT) BREAK ENDSWITCH BREAK CASE CMHDZ_PROJECTILE_NAILBOMB SWITCH sCMHDZData.sEnemyProjectiles[i].iSpriteAnimFrame CASE 0 CASE 1 eSprite = CMHDZ_SPRITE_THROWING_NAILBOMB_SMALL vSize = INIT_VECTOR_2D(ciCMHDZ_NAILBOMB_SMALL_WIDTH, ciCMHDZ_NAILBOMB_SMALL_HEIGHT) BREAK CASE 2 CASE 3 eSprite = CMHDZ_SPRITE_THROWING_NAILBOMB_MEDIUM vSize = INIT_VECTOR_2D(ciCMHDZ_NAILBOMB_MEDIUM_WIDTH, ciCMHDZ_NAILBOMB_MEDIUM_HEIGHT) BREAK CASE 4 CASE 5 eSprite = CMHDZ_SPRITE_THROWING_NAILBOMB_LARGE vSize = INIT_VECTOR_2D(ciCMHDZ_NAILBOMB_LARGE_WIDTH, ciCMHDZ_NAILBOMB_LARGE_HEIGHT) BREAK ENDSWITCH BREAK CASE CMHDZ_PROJECTILE_MOLOTOV SWITCH sCMHDZData.sEnemyProjectiles[i].iSpriteAnimFrame CASE 0 CASE 1 eSprite = CMHDZ_SPRITE_THROWING_MOLOTOV_SMALL vSize = INIT_VECTOR_2D(ciCMHDZ_MOLOTOV_SMALL_WIDTH, ciCMHDZ_MOLOTOV_SMALL_HEIGHT) BREAK CASE 2 CASE 3 eSprite = CMHDZ_SPRITE_THROWING_MOLOTOV_MEDIUM vSize = INIT_VECTOR_2D(ciCMHDZ_MOLOTOV_MEDIUM_WIDTH, ciCMHDZ_MOLOTOV_MEDIUM_HEIGHT) BREAK CASE 4 CASE 5 eSprite = CMHDZ_SPRITE_THROWING_MOLOTOV_LARGE vSize = INIT_VECTOR_2D(ciCMHDZ_MOLOTOV_LARGE_WIDTH, ciCMHDZ_MOLOTOV_LARGE_HEIGHT) BREAK ENDSWITCH BREAK DEFAULT RELOOP BREAK ENDSWITCH ////CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_DRAW_THROWN_ENEMY_PROJECTILES] Sprite: ", CMHDZ_SPRITE_TO_STRING(eSprite)) CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sEnemyProjectiles[i].vSpritePos, vSize, 0, sCMHDZData.rgbaSprite) ELIF sCMHDZData.sEnemyProjectiles[i].eState = CMHDZ_PROJECTILE_STATE_IMPACT ENDIF ENDREPEAT // Bearsy projectiles IF CMHDZ_IS_BEARSY_ON_SCREEN() CMHDZ_DRAW_THROWN_BEARSY_PROJECTILES() ENDIF ENDPROC //------------------------------------------------- // ITEM FUNCTIONS //------------------------------------------------- FUNC CMHDZ_SPRITE CMHDZ_GET_SPRITE_FOR_ITEM_TYPE(CMHDZ_ITEM_TYPES eType) CMHDZ_SPRITE eSprite = CMHDZ_SPRITE_NONE SWITCH (eType) CASE CMHDZ_ITEM_HEALTH eSprite = CMHDZ_SPRITE_ITEM_HEALTH BREAK // CASE CMHDZ_ITEM_REVOLVER_AMMO // eSprite = CMHDZ_SPRITE_ITEM_REVOLVER_AMMO // BREAK CASE CMHDZ_ITEM_NAIL_GUN_AMMO eSprite = CMHDZ_SPRITE_ITEM_MACHINE_GUN_AMMO BREAK CASE CMHDZ_ITEM_SHOTGUN_AMMO eSprite = CMHDZ_SPRITE_ITEM_SHOTGUN_AMMO BREAK CASE CMHDZ_ITEM_RIFLE_AMMO eSprite = CMHDZ_SPRITE_ITEM_RIFLE_AMMO BREAK CASE CMHDZ_ITEM_SHIELD eSprite = CMHDZ_SPRITE_ITEM_SHIELD BREAK CASE CMHDZ_ITEM_BUFF eSprite = CMHDZ_SPRITE_ITEM_BUFF BREAK CASE CMHDZ_ITEM_MOLOTOV eSprite = CMHDZ_SPRITE_ITEM_MOLOTOV_AMMO BREAK CASE CMHDZ_ITEM_NAILBOMB eSprite = CMHDZ_SPRITE_ITEM_NAILBOMB_AMMO BREAK CASE CMHDZ_ITEM_CASH eSprite = CMHDZ_SPRITE_ITEM_CASH BREAK CASE CMHDZ_ITEM_VIDEOTAPE eSprite = CMHDZ_SPRITE_ITEM_VIDEOTAPE BREAK ENDSWITCH RETURN eSprite ENDFUNC PROC CMHDZ_DRAW_ITEMS(INT iDistance) CMHDZ_SPRITE eSprite FLOAT fScale = 1.0 SWITCH iDistance CASE 0 fScale = 0.75 BREAK CASE 2 //fScale = 2.5 BREAK ENDSWITCH // IF iDistance = 2 // CMHDZ_DRAW_GAME_SPRITE("ammo1", GET_DEBUG_TEXTURE_POS(0), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_PISTOL_AMMO_CLIP_WIDTH*1.0, cfCMHDZ_SPRITE_HUD_PISTOL_AMMO_CLIP_HEIGHT*1.0), 0, sCMHDZData.rgbaSprite) // CMHDZ_DRAW_GAME_SPRITE("POWERUP_PAINKILLERS", GET_DEBUG_TEXTURE_POS(1), INIT_VECTOR_2D(cfCMHDZ_ITEM_HEALTH_WIDTH*1.0, cfCMHDZ_ITEM_HEALTH_HEIGHT*1.0), 0, sCMHDZData.rgbaSprite) // CMHDZ_DRAW_GAME_SPRITE("ammo4", GET_DEBUG_TEXTURE_POS(2), INIT_VECTOR_2D(cfCMHDZ_ITEM_HEALTH_WIDTH*1.0, cfCMHDZ_ITEM_HEALTH_HEIGHT*1.0), 0, sCMHDZData.rgbaSprite) // ENDIF INT i FOR i = 0 TO ciCMHDZ_MAX_ITEMS -1 IF sCMHDZData.sItemData[i].iLane = iDistance AND (sCMHDZData.sItemData[i].bRendering OR sCMHDZData.sItemData[i].iRenderAfterWarpCount > 0 OR sCMHDZData.sItemData[i].iMinScreen > 0) // //CDEBUG1LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_DRAW_ITEMS] Drawing item ", i, " Type:", ENUM_TO_INT(sCMHDZData.sItemData[i].eItemType), " At pos: ", sCMHDZData.sItemData[i].vSpritePos.x, ", ", sCMHDZData.sItemData[i].vSpritePos.y) IF sCMHDZData.sItemData[i].bRendering eSprite = CMHDZ_GET_SPRITE_FOR_ITEM_TYPE(sCMHDZData.sItemData[i].eItemType) CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sItemData[i].vSpritePos, MULTIPLY_VECTOR_2D(sCMHDZData.sItemData[i].vSize, fScale), 0, sCMHDZData.rgbaSprite) ENDIF IF IS_MOVING_LEVEL() // IF iDistance = 2 sCMHDZData.sItemData[i].vSpritePos.x -= CMHDZ_GET_ITEM_UPDATE() IF sCMHDZData.sItemData[i].vSpritePos.x < -200 sCMHDZData.sItemData[i].bRendering = FALSE ENDIF // ELSE // sCMHDZData.sItemData[i].vSpritePos.x -= CMHDZ_GET_ITEM_UPDATE() // IF CMHDZ_GET_CURRENT_LEVEL() = CMHDZ_LEVEL_CITY // IF sCMHDZData.sItemData[i].vSpritePos.x < -200 // sCMHDZData.sItemData[i].vSpritePos.x = cfBASE_SCREEN_WIDTH + sCMHDZData.sItemData[i].vSize.X/2 // sCMHDZData.sItemData[i].iWarpCount++ // ENDIF // ELSE IF sCMHDZData.sItemData[i].iRenderAfterWarpCount > 0 IF sCMHDZData.sItemData[i].vSpritePos.x < 0 sCMHDZData.sItemData[i].vSpritePos.x = CMHDZ_GET_OFFSET_FOR_ELEMENT_WARP_FOR_CURRENT_LEVEL() sCMHDZData.sItemData[i].iWarpCount++ ENDIF ENDIF // ENDIF // ENDIF ENDIF IF NOT sCMHDZData.sItemData[i].bRendering IF sCMHDZData.sItemData[i].iRenderAfterWarpCount > 0 IF sCMHDZData.sItemData[i].iWarpCount = sCMHDZData.sItemData[i].iRenderAfterWarpCount sCMHDZData.sItemData[i].bRendering = TRUE #IF IS_DEBUG_BUILD //CDEBUG1LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_DRAW_ITEMS] Setting to render item ", i, " Type: ", CMHDZ_ITEM_TYPES_TO_STRING(sCMHDZData.sItemData[i].eItemType), " As warped this num times: ", sCMHDZData.sItemData[i].iRenderAfterWarpCount) #ENDIF ENDIF ENDIF IF sCMHDZData.sItemData[i].iMinScreen > 0 AND sCMHDZData.sItemData[i].iMinScreen = CMHDZ_GET_CURRENT_LEVEL_SCREEN() IF NOT CMHDZ_IS_POSITION_ON_SCREEN(sCMHDZData.sItemData[i].vSpritePos) sCMHDZData.sItemData[i].bRendering = TRUE #IF IS_DEBUG_BUILD //CDEBUG1LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_DRAW_ITEMS] Setting to render item ", i, " Type: ", CMHDZ_ITEM_TYPES_TO_STRING(sCMHDZData.sItemData[i].eItemType), " iMinScreen ", sCMHDZData.sItemData[i].iMinScreen, " = Current stage: ", CMHDZ_GET_CURRENT_LEVEL_SCREEN()) #ENDIF ENDIF ENDIF ENDIF ENDIF IF CMHDZ_IS_POSITION_ON_SCREEN(sCMHDZData.sItemData[i].vSpritePos) // Don't process if the timer isn't 0. IF(sAGHelpText.iCurrentHelpTextExpiry - NATIVE_TO_INT(GET_NETWORK_TIME())) > 0.0 RELOOP ENDIF SWITCH sCMHDZData.sItemData[i].eItemType CASE CMHDZ_ITEM_HEALTH CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_PAINKILLERS) BREAK CASE CMHDZ_ITEM_SHIELD CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_PILLS) BREAK CASE CMHDZ_ITEM_BUFF CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_BUFF) BREAK CASE CMHDZ_ITEM_VIDEOTAPE CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_VIDEO) BREAK CASE CMHDZ_ITEM_NAIL_GUN_AMMO CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_NAIL) BREAK CASE CMHDZ_ITEM_RIFLE_AMMO CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_RIFLE) BREAK CASE CMHDZ_ITEM_SHOTGUN_AMMO CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_SHOTGUN) BREAK CASE CMHDZ_ITEM_MOLOTOV CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_MOLOTOV) BREAK CASE CMHDZ_ITEM_NAILBOMB CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_NAILBOMB) BREAK CASE CMHDZ_ITEM_CASH CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_CASH) BREAK ENDSWITCH ENDIF ENDFOR ENDPROC //------------------------------------------------- // ENEMY FUNCTIONS //------------------------------------------------- PROC CMHDZ_DRAW_ENEMIES(INT iLane = ciCMHDZ_LANE_BACKGROUND) CMHDZ_SPRITE eSprite INT i FLOAT fScale VECTOr_2D v2Scale RGBA_COLOUR_STRUCT rgbaEnemy = sCMHDZData.rgbaSprite //#IF IS_DEBUG_BUILD // INT iBlockingCover //#ENDIF FOR i = 0 TO ciCMHDZ_MAX_ENEMIES -1 fScale = CMHDZ_GET_ENEMY_TYPE_SCALE_FOR_LANE(iLane) #IF IS_DEBUG_BUILD // IF sCMHDZData.sEnemyData[i].eState != CMHDZ_ENEMY_STATE_DYING // AND sCMHDZData.sEnemyData[i].eState != CMHDZ_ENEMY_STATE_INACTIVE // TEXT_LABEL_23 sDebug = "Enemy number: " // sDebug += i // // DRAW_DEBUG_TEXT_2D(sDebug, // <<(sCMHDZData.sEnemyData[i].vSpritePos.x / 1920), // (sCMHDZData.sEnemyData[i].vSpritePos.y / 1080), // 0.0>>, // 250, 15, 15) // // // IF CMHDZ_IS_COORD_BLOCKED_BY_COVER(sCMHDZData.sEnemyData[i].iEnemyLane, sCMHDZData.sEnemyData[i].fStoppingX, iBlockingCover) // sDebug = "BLOCKED BY COVER" // DRAW_DEBUG_TEXT_2D(sDebug, // <<(sCMHDZData.sEnemyData[i].vSpritePos.x / 1920), // (sCMHDZData.sEnemyData[i].vSpritePos.y + 100 / 1080), // 0.0>>, // 250, 15, 15) // ENDIF // UNUSED_PARAMETER(iBlockingCover) // ENDIF #ENDIF IF (sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_STUNNED OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING_HEADSHOT OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING_BURNING) AND (sCMHDZData.sEnemyData[i].iEnemyLane = iLane OR (iLane = ciCMHDZ_LANE_BACKGROUND AND(sCMHDZData.sEnemyData[i].iEnemyLane = ciCMHDZ_LANE_POPUP_LHS OR sCMHDZData.sEnemyData[i].iEnemyLane = ciCMHDZ_LANE_POPUP_RHS))) SWITCH sCMHDZData.sEnemyData[i].iEnemyType CASE CMHDZ_ENEMY_1 eSprite = CMHDZ_SPRITE_GANG_01_DEAD v2Scale = INIT_VECTOR_2D(cfCMHDZ_ENEMY_DEAD_SPRITE_WIDTH*fScale, cfCMHDZ_ENEMY_DEAD_SPRITE_HEIGHT*fScale) BREAK CASE CMHDZ_ENEMY_2 eSprite = CMHDZ_SPRITE_GANG_02_DEAD v2Scale = INIT_VECTOR_2D(cfCMHDZ_ENEMY_DEAD_SPRITE_WIDTH*fScale, cfCMHDZ_ENEMY_DEAD_SPRITE_HEIGHT*fScale) BREAK CASE CMHDZ_ENEMY_3 eSprite = CMHDZ_SPRITE_GANG_03_DEAD v2Scale = INIT_VECTOR_2D(cfCMHDZ_ENEMY_DEAD_SPRITE_WIDTH*fScale, cfCMHDZ_ENEMY_DEAD_SPRITE_HEIGHT*fScale) BREAK CASE CMHDZ_ENEMY_4 eSprite = CMHDZ_SPRITE_GANG_04_DEAD v2Scale = INIT_VECTOR_2D(cfCMHDZ_ENEMY_DEAD_SPRITE_WIDTH*fScale, cfCMHDZ_ENEMY_DEAD_SPRITE_HEIGHT*fScale) BREAK CASE CMHDZ_ENEMY_5 eSprite = CMHDZ_SPRITE_GANG_05_DEAD v2Scale = INIT_VECTOR_2D(cfCMHDZ_ENEMY_DEAD_SPRITE_WIDTH*fScale, cfCMHDZ_ENEMY_DEAD_SPRITE_HEIGHT*fScale) BREAK CASE CMHDZ_THROWING_ENEMY_1 eSprite = CMHDZ_SPRITE_GANG_01_DEAD v2Scale = INIT_VECTOR_2D(cfCMHDZ_ENEMY_DEAD_SPRITE_WIDTH*fScale, cfCMHDZ_ENEMY_DEAD_SPRITE_HEIGHT*fScale) BREAK CASE CMHDZ_THROWING_ENEMY_2 eSprite = CMHDZ_SPRITE_GANG_02_DEAD v2Scale = INIT_VECTOR_2D(cfCMHDZ_ENEMY_DEAD_SPRITE_WIDTH*fScale, cfCMHDZ_ENEMY_DEAD_SPRITE_HEIGHT*fScale) BREAK CASE CMHDZ_THROWING_ENEMY_3 eSprite = CMHDZ_SPRITE_GANG_03_DEAD v2Scale = INIT_VECTOR_2D(cfCMHDZ_ENEMY_DEAD_SPRITE_WIDTH*fScale, cfCMHDZ_ENEMY_DEAD_SPRITE_HEIGHT*fScale) BREAK CASE CMHDZ_THROWING_ENEMY_4 eSprite = CMHDZ_SPRITE_GANG_04_DEAD v2Scale = INIT_VECTOR_2D(cfCMHDZ_ENEMY_DEAD_SPRITE_WIDTH*fScale, cfCMHDZ_ENEMY_DEAD_SPRITE_HEIGHT*fScale) BREAK CASE CMHDZ_THROWING_ENEMY_5 eSprite = CMHDZ_SPRITE_GANG_05_DEAD v2Scale = INIT_VECTOR_2D(cfCMHDZ_ENEMY_DEAD_SPRITE_WIDTH*fScale, cfCMHDZ_ENEMY_DEAD_SPRITE_HEIGHT*fScale) BREAK CASE CMHDZ_RARE_ENEMY_BUNNY eSprite = CMHDZ_SPRITE_GANG_RARE_BUNNY_DEAD v2Scale = INIT_VECTOR_2D(116*fScale, 196*fScale) BREAK CASE CMHDZ_RARE_ENEMY_MONKEY eSprite = CMHDZ_SPRITE_GANG_RARE_MONKEY_DEAD v2Scale = INIT_VECTOR_2D(116*fScale, 196*fScale) BREAK ENDSWITCH // Was it a headshot? IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING_HEADSHOT //Default anim update //CDEBUG2LN(DEBUG_MINIGAME, " CMHDZ_DRAW_ENEMIES sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING_HEADSHOT iDefaultFrameTimeCounter: ", sCMHDZData.sEnemyData[i].iDefaultFrameTimeCounter) //CDEBUG2LN(DEBUG_MINIGAME, " CMHDZ_DRAW_ENEMIES sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING_HEADSHOT iDefaultUpdateFrames: ", sCMHDZData.sEnemyData[i].iDefaultUpdateFrames) IF sCMHDZData.sEnemyData[i].iHeadshotAnimFrame < 8 sCMHDZData.sEnemyData[i].iHeadshotAnimFrame += sCMHDZData.sEnemyData[i].iDefaultUpdateFrames //sCMHDZData.sEnemyData[i].iHeadshotAnimFrame = 0 ENDIF IF sCMHDZData.sEnemyData[i].iGoreAnimFrame < 9 sCMHDZData.sEnemyData[i].iGoreAnimFrame += (sCMHDZData.sEnemyData[i].iDefaultUpdateFrames*2) ENDIF IF (sCMHDZData.sEnemyData[i].iGoreAnimFrame > 10) sCMHDZData.sEnemyData[i].iGoreAnimFrame = 9 ENDIF CDEBUG2LN(DEBUG_MINIGAME, " CMHDZ_DRAW_ENEMIES sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING_HEADSHOT iHeadshotAnimFrame: ", sCMHDZData.sEnemyData[i].iHeadshotAnimFrame) SWITCH sCMHDZData.sEnemyData[i].iEnemyType CASE CMHDZ_ENEMY_1 CASE CMHDZ_THROWING_ENEMY_1 eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_01_HEADSHOT_01, sCMHDZData.sEnemyData[i].iHeadshotAnimFrame) BREAK CASE CMHDZ_ENEMY_2 CASE CMHDZ_THROWING_ENEMY_2 eSprite= CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_02_HEADSHOT_01, sCMHDZData.sEnemyData[i].iHeadshotAnimFrame) BREAK CASE CMHDZ_ENEMY_3 CASE CMHDZ_THROWING_ENEMY_3 eSprite= CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_03_HEADSHOT_01, sCMHDZData.sEnemyData[i].iHeadshotAnimFrame) BREAK CASE CMHDZ_ENEMY_4 CASE CMHDZ_THROWING_ENEMY_4 eSprite= CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_04_HEADSHOT_01, sCMHDZData.sEnemyData[i].iHeadshotAnimFrame) BREAK CASE CMHDZ_ENEMY_5 CASE CMHDZ_THROWING_ENEMY_5 eSprite= CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_05_HEADSHOT_01, sCMHDZData.sEnemyData[i].iHeadshotAnimFrame) BREAK ENDSWITCH VECTOR_2D pos = sCMHDZData.sEnemyData[i].vSpritePos pos.y -= (0.35*(0.0+@1000)) CMHDZ_DRAW_GAME_SPRITE(CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GORE_BACKGROUND_1, sCMHDZData.sEnemyData[i].iGoreAnimFrame),pos, INIT_VECTOR_2D(472.0,372.0),0.0, sCMHDZData.rgbaSprite) ENDIF IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING_BURNING IF sCMHDZData.sEnemyData[i].iHeadshotAnimFrame < 4 sCMHDZData.sEnemyData[i].iHeadshotAnimFrame += sCMHDZData.sEnemyData[i].iDefaultUpdateFrames //sCMHDZData.sEnemyData[i].iHeadshotAnimFrame = 0 ENDIF SWITCH sCMHDZData.sEnemyData[i].iEnemyType CASE CMHDZ_ENEMY_1 CASE CMHDZ_ENEMY_2 CASE CMHDZ_ENEMY_3 CASE CMHDZ_ENEMY_4 CASE CMHDZ_ENEMY_5 CASE CMHDZ_RARE_ENEMY_BUNNY CASE CMHDZ_RARE_ENEMY_MONKEY // CASE CMHDZ_RARE_ENEMY_RAT 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 // Use the enemy flash timer IF sCMHDZData.sEnemyData[i].iEnemyFlashTimer = 0 sCMHDZData.sEnemyData[i].iEnemyFlashTimer = GET_GAME_TIMER() eSprite = CMHDZ_SPRITE_GANG_BURNING_01 ELIF GET_GAME_TIMER() - sCMHDZData.sEnemyData[i].iEnemyFlashTimer >= 50 eSprite = CMHDZ_SPRITE_GANG_BURNING_01 ELSE IF (ROUND(TO_FLOAT(GET_GAME_TIMER() - sCMHDZData.sEnemyData[i].iEnemyFlashTimer)/ 100.0)) % 2 = 0 eSprite = CMHDZ_SPRITE_GANG_BURNING_02 ELSE eSprite = CMHDZ_SPRITE_GANG_BURNING_01 ENDIF ENDIF BREAK ENDSWITCH ENDIF IF sCMHDZData.sEnemyData[i].vSpritePos.x > 0 AND sCMHDZData.sEnemyData[i].vSpritePos.x < cfBASE_SCREEN_WIDTH CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sEnemyData[i].vSpritePos, v2Scale, 0, sCMHDZData.rgbaSprite) ENDIF ElIF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ACTIVE OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING IF sCMHDZData.sEnemyData[i].iEnemyLane = iLane OR (iLane = ciCMHDZ_LANE_BACKGROUND AND (sCMHDZData.sEnemyData[i].iEnemyLane = ciCMHDZ_LANE_POPUP_LHS OR sCMHDZData.sEnemyData[i].iEnemyLane = ciCMHDZ_LANE_POPUP_RHS)) //-- Flash injured peds IF sCMHDZData.sEnemyData[i].iHealth < CMHDZ_GET_ENEMY_START_HEALTH_FOR_TYPE() IF sCMHDZData.sEnemyData[i].iEnemyFlashTimer = 0 sCMHDZData.sEnemyData[i].iEnemyFlashTimer = GET_GAME_TIMER() rgbaEnemy = sCMHDZData.rgbaSprite ELIF GET_GAME_TIMER() - sCMHDZData.sEnemyData[i].iEnemyFlashTimer >= 1000 rgbaEnemy = sCMHDZData.rgbaSprite ELSE IF (ROUND(TO_FLOAT(GET_GAME_TIMER() - sCMHDZData.sEnemyData[i].iEnemyFlashTimer)/ 100.0)) % 2 = 0 rgbaEnemy = sCMHDZData.rgbaEnemyShot ELSE rgbaEnemy = sCMHDZData.rgbaSprite ENDIF ENDIF ENDIF // Process pop up peds at same time as background peds SWITCH sCMHDZData.sEnemyData[i].iEnemyType CASE CMHDZ_ENEMY_1 IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING eSprite = CMHDZ_SPRITE_GANG_01_ATTACKING ELSE eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_01_RUNNING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame) ENDIF BREAK CASE CMHDZ_ENEMY_2 IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING eSprite = CMHDZ_SPRITE_GANG_02_ATTACKING ELSE eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_02_RUNNING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame) ENDIF BREAK CASE CMHDZ_ENEMY_3 IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING eSprite = CMHDZ_SPRITE_GANG_03_ATTACKING ELSE eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_03_RUNNING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame) ENDIF BREAK CASE CMHDZ_ENEMY_4 IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING eSprite = CMHDZ_SPRITE_GANG_04_ATTACKING ELSE eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_04_RUNNING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame) ENDIF BREAK CASE CMHDZ_ENEMY_5 IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING eSprite = CMHDZ_SPRITE_GANG_05_ATTACKING ELSE eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_05_RUNNING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame) ENDIF BREAK // CASE CMHDZ_CART_1 // eSprite = CMHDZ_SPRITE_CART1 // BREAK CASE CMHDZ_THROWING_ENEMY_1 IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_01_THROWING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame + 2) ELSE eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_01_THROWING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame) ENDIF BREAK CASE CMHDZ_THROWING_ENEMY_2 IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_02_THROWING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame + 2) ELSE eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_02_THROWING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame) ENDIF BREAK CASE CMHDZ_THROWING_ENEMY_3 IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_03_THROWING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame + 2) ELSE eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_03_THROWING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame) ENDIF BREAK CASE CMHDZ_THROWING_ENEMY_4 IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_04_THROWING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame + 2) ELSE eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_04_THROWING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame) ENDIF BREAK CASE CMHDZ_THROWING_ENEMY_5 IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_05_THROWING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame + 2) ELSE eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_05_THROWING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame) ENDIF BREAK ENDSWITCH // Rare hostage enemies SWITCH sCMHDZData.sEnemyData[i].iEnemyType CASE CMHDZ_RARE_ENEMY_BUNNY eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_RARE_BUNNY_RUNNING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame) v2Scale = INIT_VECTOR_2D(116*fScale, 196*fScale) BREAK CASE CMHDZ_RARE_ENEMY_MONKEY eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_RARE_MONKEY_RUNNING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame) v2Scale = INIT_VECTOR_2D(116*fScale, 196*fScale) BREAK CASE CMHDZ_RARE_ENEMY_RAT eSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GANG_RARE_RAT_RUNNING_01, sCMHDZData.sEnemyData[i].iSpriteAnimFrame) v2Scale = INIT_VECTOR_2D(140*fScale, 60*fScale) rgbaEnemy = sCMHDZData.rgbaSprite BREAK ENDSWITCH IF sCMHDZData.sEnemyData[i].vSpritePos.x > 0 AND sCMHDZData.sEnemyData[i].vSpritePos.x < cfBASE_SCREEN_WIDTH IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_BONUS) AND CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_REVERSE) sCMHDZData.sEnemyData[i].vSize.x = -ABSF(sCMHDZData.sEnemyData[i].vSize.x) CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_DRAW_ENEMIES - REversing the scale factor if coming from left vSize.x: ", sCMHDZData.sEnemyData[i].vSize.x) ENDIF // //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_DRAW_ENEMIES] Drawing enemy ",i, " At position X ", sCMHDZData.sEnemyData[i].vSpritePos.x, " Size: ", sCMHDZData.sEnemyData[i].vSize.X, ", ", sCMHDZData.sEnemyData[i].vSize.y, " Scale: ", fScale, " Lane: ",sCMHDZData.sEnemyData[i].iEnemyLane) CMHDZ_DRAW_GAME_SPRITE(eSprite ,sCMHDZData.sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sCMHDZData.sEnemyData[i].vSize.X*fScale, sCMHDZData.sEnemyData[i].vSize.y*fScale), 0, rgbaEnemy) // ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(sCMHDZData.sEnemyData[i].fStoppingX, sCMHDZData.sEnemyData[i].vSpritePos.y), // sCMHDZData.sEnemyData[i].vSize, sCMHDZData.rgbaRed) //ELSE // //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_DRAW_ENEMIES] NOT Drawing enemy ", i, " As X Pos: ", sCMHDZData.sEnemyData[i].vSpritePos.x, " Lane: ",sCMHDZData.sEnemyData[i].iEnemyLane) ENDIF ENDIF ENDIF ENDFOR ENDPROC PROC CMHDZ_DRAW_FOREGROUND_ENEMIES() FLOAT fScale = 1.2 CMHDZ_SPRITE eSprite VECTOR_2D vSize INT i FOR i = 0 TO ciCMHDZ_MAX_ENEMIES -1 IF sCMHDZData.sEnemyData[i].iEnemyLane != ciCMHDZ_LANE_FOREGROUND RELOOP ENDIF // Still alive and not stunned IF sCMHDZData.sEnemyData[i].iHealth > 0 AND sCMHDZData.sEnemyData[i].eState != CMHDZ_ENEMY_STATE_STUNNED AND (sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ACTIVE OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING) vSize = sCMHDZData.sEnemyData[i].vSize SWITCH sCMHDZData.sEnemyData[i].iEnemyType CASE CMHDZ_FOREGROUND_ENEMY_T1_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_01_A BREAK CASE CMHDZ_FOREGROUND_ENEMY_T1_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_01_B BREAK CASE CMHDZ_FOREGROUND_ENEMY_T2_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_02_A BREAK CASE CMHDZ_FOREGROUND_ENEMY_T2_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_02_B BREAK CASE CMHDZ_FOREGROUND_ENEMY_T3_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_03_A BREAK CASE CMHDZ_FOREGROUND_ENEMY_T3_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_03_B BREAK CASE CMHDZ_FOREGROUND_ENEMY_T4_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_04_A BREAK CASE CMHDZ_FOREGROUND_ENEMY_T4_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_04_B BREAK CASE CMHDZ_FOREGROUND_ENEMY_T5_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_05_A BREAK CASE CMHDZ_FOREGROUND_ENEMY_T5_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_05_B BREAK ENDSWITCH // Is the enemy attacking IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_WILL_INFLICT_MELEE_DAMAGE) AND sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING IF sCMHDZData.sEnemyData[i].fAnimTimer > 0 SWITCH sCMHDZData.sEnemyData[i].iEnemyType CASE CMHDZ_FOREGROUND_ENEMY_T1_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_01_A_ATTACK vSize = INIT_VECTOR_2D(540, 537) BREAK CASE CMHDZ_FOREGROUND_ENEMY_T2_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_02_A_ATTACK vSize = INIT_VECTOR_2D(540, 537) BREAK CASE CMHDZ_FOREGROUND_ENEMY_T4_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_04_A_ATTACK vSize = INIT_VECTOR_2D(540, 537) BREAK CASE CMHDZ_FOREGROUND_ENEMY_T5_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_05_B_ATTACK BREAK ENDSWITCH sCMHDZData.sEnemyData[i].fAnimTimer -= (0.0+@1000) ENDIF ENDIF CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sEnemyData[i].vSpritePos, INIT_VECTOR_2D(vSize.x *fScale, vSize.Y*fScale), 0, sCMHDZData.rgbaSprite) ENDIF IF (sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_STUNNED) SWITCH sCMHDZData.sEnemyData[i].iEnemyType CASE CMHDZ_FOREGROUND_ENEMY_T1_1 CASE CMHDZ_FOREGROUND_ENEMY_T1_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_01_DEAD BREAK CASE CMHDZ_FOREGROUND_ENEMY_T2_1 CASE CMHDZ_FOREGROUND_ENEMY_T2_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_02_DEAD BREAK CASE CMHDZ_FOREGROUND_ENEMY_T3_1 CASE CMHDZ_FOREGROUND_ENEMY_T3_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_03_DEAD BREAK CASE CMHDZ_FOREGROUND_ENEMY_T4_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_04_A_DEAD BREAK CASE CMHDZ_FOREGROUND_ENEMY_T4_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_04_B_DEAD BREAK CASE CMHDZ_FOREGROUND_ENEMY_T5_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_05_A_DEAD BREAK CASE CMHDZ_FOREGROUND_ENEMY_T5_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_05_B_DEAD BREAK // CASE CMHDZ_FOREGROUND_ENEMY_BEAR // eSprite = CMHDZ_SPRITE_LEVEL_03_FOREST_BEAR_02 // BREAK ENDSWITCH CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sEnemyData[i].vSpritePos, INIT_VECTOR_2D(cfCMHDZ_ENEMY_FOREGROUND_DEAD_SPRITE_WIDTH*1.2, cfCMHDZ_ENEMY_FOREGROUND_DEAD_SPRITE_HEIGHT*1.2), 0, sCMHDZData.rgbaSprite) ENDIF IF (sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING_BURNING) eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_BURNING_01 IF sCMHDZData.sEnemyData[i].iSpriteAnimFrame < 4 sCMHDZData.sEnemyData[i].iSpriteAnimFrame += (sCMHDZData.sEnemyData[i].iDefaultUpdateFrames) IF sCMHDZData.sEnemyData[i].iSpriteAnimFrame >= 4 sCMHDZData.sEnemyData[i].iSpriteAnimFrame = 0 ENDIF ENDIF VECTOR_2D pos = sCMHDZData.sEnemyData[i].vSpritePos pos.y -= (0.55*(0.0+@1000)) //SCRIPT_ASSERT("[BAZ] CMHDZ_DRAW_FOREGROUND_ENEMIES - Foreground burning") CMHDZ_DRAW_GAME_SPRITE(CMHDZ_SPRITE_GET_NEXT_ENUM(eSprite, sCMHDZData.sEnemyData[i].iSpriteAnimFrame), pos, INIT_VECTOR_2D(cfCMHDZ_ENEMY_FOREGROUND_DEAD_SPRITE_WIDTH*1.2, cfCMHDZ_ENEMY_FOREGROUND_DEAD_SPRITE_HEIGHT*1.2), 0, sCMHDZData.rgbaSprite) ENDIF IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING_HEADSHOT SWITCH sCMHDZData.sEnemyData[i].iEnemyType CASE CMHDZ_FOREGROUND_ENEMY_T1_1 CASE CMHDZ_FOREGROUND_ENEMY_T1_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_01_HEADSHOT BREAK CASE CMHDZ_FOREGROUND_ENEMY_T2_1 CASE CMHDZ_FOREGROUND_ENEMY_T2_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_02_HEADSHOT BREAK CASE CMHDZ_FOREGROUND_ENEMY_T3_1 CASE CMHDZ_FOREGROUND_ENEMY_T3_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_03_HEADSHOT BREAK CASE CMHDZ_FOREGROUND_ENEMY_T4_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_04_A_HEADSHOT BREAK CASE CMHDZ_FOREGROUND_ENEMY_T4_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_04_B_HEADSHOT BREAK CASE CMHDZ_FOREGROUND_ENEMY_T5_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_05_A_HEADSHOT BREAK CASE CMHDZ_FOREGROUND_ENEMY_T5_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_05_B_HEADSHOT BREAK // CASE CMHDZ_FOREGROUND_ENEMY_BEAR // eSprite = CMHDZ_SPRITE_LEVEL_03_FOREST_BEAR_02 // BREAK ENDSWITCH IF sCMHDZData.sEnemyData[i].iGoreAnimFrame < 9 // Can sometimes see bearsy sCMHDZData.sEnemyData[i].iGoreAnimFrame += (sCMHDZData.sEnemyData[i].iDefaultUpdateFrames*2) ENDIF VECTOR_2D pos = sCMHDZData.sEnemyData[i].vSpritePos CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sEnemyData[i].vSpritePos, INIT_VECTOR_2D(cfCMHDZ_ENEMY_FOREGROUND_DEAD_SPRITE_WIDTH*1.2, cfCMHDZ_ENEMY_FOREGROUND_DEAD_SPRITE_HEIGHT*1.2), 0, sCMHDZData.rgbaSprite) pos.y -= (0.65*(0.0+@1000)) // Draw the gore effects. CMHDZ_DRAW_GAME_SPRITE(CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_GORE_BACKGROUND_1, sCMHDZData.sEnemyData[i].iGoreAnimFrame),pos, INIT_VECTOR_2D(472.0,372.0),0.0, sCMHDZData.rgbaSprite) ENDIF ENDFOR ENDPROC //------------------------------------------------- // FX FUNCTIONS //------------------------------------------------- PROC CMHDZ_FLASH_SCREEN_FOR_ACTIVE_EFFECT(RGBA_COLOUR_STRUCT colour, INT iMaxAlpha = 50) FLOAT fTimeToMaxAlpha = 5.0 FLOAT fFrameTime = GET_FRAME_TIME() IF NOT sCMHDZData.bEffectHitmaxAlpha sCMHDZData.fEffectFlashAlpha += (TO_FLOAT(iMaxAlpha) / (fTimeToMaxAlpha/fFrameTime)) // sCMHDZData.fTotalTimeTaken += fFrameTime IF sCMHDZData.fEffectFlashAlpha > TO_FLOAT(iMaxAlpha) sCMHDZData.fEffectFlashAlpha = TO_FLOAT(iMaxAlpha) sCMHDZData.bEffectHitmaxAlpha = TRUE ENDIF ELSE // sCMHDZData.fTotalTimeTaken = 0 sCMHDZData.fEffectFlashAlpha -= (TO_FLOAT(iMaxAlpha) / (fTimeToMaxAlpha/fFrameTime)) IF sCMHDZData.fEffectFlashAlpha < 0 sCMHDZData.fEffectFlashAlpha = 0 sCMHDZData.bEffectHitmaxAlpha = FALSE ENDIF ENDIF colour.iA = ROUND(sCMHDZData.fEffectFlashAlpha) ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), colour) //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [CMHDZ_FLASH_SCREEN_FOR_ACTIVE_EFFECT] Alpha: ", sCMHDZData.fEffectFlashAlpha, " Frame time: ", fFrameTime, " Delta: ", ROUND(TO_FLOAT(iMaxAlpha) / (fTimeToMaxAlpha/fFrameTime))) ENDPROC PROC CMHDZ_DRAW_BULLETS_AND_EFFECTS(INT iDistance) TEXT_LABEL_63 tl23Sprite CMHDZ_SPRITE eSprite INT p,i // Bullets FOR p = 0 TO ciCMHDZ_MAX_PLAYERS - 1 FOR i = 0 TO ciCMHDZ_MAX_PROJECTILES - 1 IF sCMHDZData.sPlayerData[p].sBulletData[i].bShot IF sCMHDZData.sPlayerData[p].sBulletData[i].bHitObject tl23Sprite = "bullet-hole" ELIF sCMHDZData.sPlayerData[p].sBulletData[i].vSpritePos.y < 300 tl23Sprite = "smoke" ELIF !sCMHDZData.sPlayerData[p].sBulletData[i].bHit tl23Sprite = "bullet" ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_HUD), tl23Sprite, sCMHDZData.sPlayerData[p].sBulletData[i].vSpritePos, INIT_VECTOR_2D(cfCMHDZ_SPRITE_IMPACT_WIDTH, cfCMHDZ_SPRITE_IMPACT_HEIGHT), 0, sCMHDZData.rgbaSprite) IF NOT sCMHDZData.sPlayerData[p].sBulletData[i].bPlayedAudio // CMHDZ_PLAY_SOUND_FRONT_END(CMHDZ_AUDIO_EFFECT_BULLET_HIT_GENERIC) sCMHDZData.sPlayerData[p].sBulletData[i].bPlayedAudio = TRUE ENDIF ENDIF ENDFOR ENDFOR // FX VECTOR_2D vSize FOR i = 0 TO ciCMHDZ_MAX_FX - 1 IF sCMHDZData.sFXData[i].bActive AND sCMHDZData.sFXData[i].iLane = iDistance SWITCH sCMHDZData.sFXData[i].eFXType CASE CMHDZ_FX_ENEMY_SHOT tl23Sprite = "FOREGROUND_ENEMY_GUNFIRE" CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_COMMON_PROPS), tl23Sprite, sCMHDZData.sFXData[i].vSpritePos, INIT_VECTOR_2D(cfCMHDZ_SPRITE_GANG_SHOT_WIDTH, cfCMHDZ_SPRITE_GANG_SHOT_HEIGHT), 0, sCMHDZData.rgbaSprite) BREAK // CASE CMHDZ_FX_EXPLOSION // // tl23Sprite = "PROP_TNT_CRATE_STATE_0" // tl23Sprite += (sCMHDZData.sFXData[i].iSpriteBlastAnimFrame + 2) // CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_COMMON_PROPS), tl23Sprite, sCMHDZData.sFXData[i].vSpritePos, INIT_VECTOR_2D(cfCMHDZ_SPRITE_EXPLOSION_WIDTH, cfCMHDZ_SPRITE_EXPLOSION_HEIGHT), 0, sCMHDZData.rgbaSprite) // // BREAK CASE CMHDZ_FX_ENEMY_TNT_EXP IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 OR sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 1 tl23Sprite = "THROWING_ENEMY_WEAPON_EXPLOSION_01" vSize = INIT_VECTOR_2D(cfCMHDZ_SPRITE_GANG_THROWN_EXPLOSION_SMALL_WIDTH, cfCMHDZ_SPRITE_GANG_THROWN_EXPLOSION_SMALL_HEIGHT) ELSE tl23Sprite = "THROWING_ENEMY_WEAPON_EXPLOSION_02" vSize = INIT_VECTOR_2D(cfCMHDZ_SPRITE_GANG_THROWN_EXPLOSION_LARGE_WIDTH, cfCMHDZ_SPRITE_GANG_THROWN_EXPLOSION_LARGE_HEIGHT) ENDIF // //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_BULLETS_AND_EFFECTS] {DSW} SPrite: ", tl23Sprite, " Frame: ", sCMHDZData.sFXData[i].iSpriteBlastAnimFrame) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_COMMON_PROPS), tl23Sprite, sCMHDZData.sFXData[i].vSpritePos, vSize, 0, sCMHDZData.rgbaSprite) BREAK CASE CMHDZ_FX_LOOT_CRATE IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 tl23Sprite = "CRATE_04" ELIF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 1 tl23Sprite = "CRATE_05" ELIF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 2 tl23Sprite = "CRATE_06" ENDIF vSize = INIT_VECTOR_2D(cfCMHDZ_SPRITE_LOOT_CRATE_EXPLOSION_WIDTH, cfCMHDZ_SPRITE_LOOT_CRATE_EXPLOSION_HEIGHT) //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_BULLETS_AND_EFFECTS] {DSW} SPrite: ", tl23Sprite, " Frame: ", sCMHDZData.sFXData[i].iSpriteBlastAnimFrame) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_COMMON_PROPS), tl23Sprite, sCMHDZData.sFXData[i].vSpritePos, vSize, 0, sCMHDZData.rgbaSprite) BREAK CASE CMHDZ_FX_BEARSY_FOREGROUND_PAIN_BLOOD eSprite = INT_TO_ENUM(CMHDZ_SPRITE, ENUM_TO_INT(CMHDZ_SPRITE_BEARSY_FOREGROUND_BLOOD_01) + sCMHDZData.sFXData[i].iSpriteBlastAnimFrame) CMHDZ_DRAW_GAME_SPRITE(eSprite,sCMHDZData.sFXData[i].vSpritePos, CMHDZ_BOSS_GET_SPRITE_SIZES(eSprite), 0, sCMHDZData.rgbaSprite) //CDEBUG2LN(DEBUG_MINIGAME, "CMHDZ_FX_BEARSY_FOREGROUND_PAIN_BLOOD - Drawing") BREAK CASE CMHDZ_FX_BEARSY_FOREGROUND_SPARKS eSprite = INT_TO_ENUM(CMHDZ_SPRITE, ENUM_TO_INT(CMHDZ_SPRITE_BEARSY_FOREGROUND_ATTACKING_SPARKS_01) + sCMHDZData.sFXData[i].iSpriteBlastAnimFrame) CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sFXData[i].vSpritePos, CMHDZ_BOSS_GET_SPRITE_SIZES(eSprite), 0, sCMHDZData.rgbaSprite) //CDEBUG2LN(DEBUG_MINIGAME, "CMHDZ_FX_BEARSY_FOREGROUND_SPARKS - Drawing this frame") BREAK CASE CMHDZ_FX_OUCH IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame <= 2 eSprite = INT_TO_ENUM(CMHDZ_SPRITE, ENUM_TO_INT(CMHDZ_SPRITE_OUCH1)) CMHDZ_DRAW_GAME_SPRITE(eSprite, sCMHDZData.sFXData[i].vSpritePos, INIT_VECTOR_2D(116.0,96.0), 0, sCMHDZData.rgbaSprite) ENDIF //CDEBUG2LN(DEBUG_MINIGAME, "CMHDZ_FX_BEARSY_FOREGROUND_SPARKS - Drawing this frame") BREAK ENDSWITCH ENDIF ENDFOR //CMHDZ_FLASH_SCREEN_FOR_ACTIVE_EFFECT(sCMHDZData.rgbaWhite) // RGBA_COLOUR_STRUCT rgbaDead = sCMHDZData.rgbaRed // rgbaDead.iA = 255 // IF iDistance = ciCMHDZ_LANE_FOREGROUND // only once // // ENDIF ENDPROC PROC CMHDZ_DRAW_GORE_EFFECTS() //TEXT_LABEL_63 tl23Sprite //CMHDZ_SPRITE eSprite INT i // FX //VECTOR_2D vSize FOR i = 0 TO ciCMHDZ_MAX_FX - 1 // We determine whther draw function gets hit by assessing Alpha levels. IF sCMHDZData.sFXData[i].bActive// AND sCMHDZData.sFXData[i].iLane = iDistance IF sCMHDZData.sFXData[i].bFinished sCMHDZData.sFXData[i].fAlpha -= (0.0+@1000) sCMHDZData.sFXData[i].vSpritePos.y += (0.0+@1000)/2 // Prevent invalid values IF sCMHDZData.sFXData[i].fAlpha < 0 sCMHDZData.sFXData[i].fAlpha = 0 sCMHDZData.sFXData[i].bActive = FALSE EXIT ENDIF ELSE // bFinished = FALSE IF sCMHDZData.sFXData[i].eFXType = CMHDZ_FX_BEARSY_FOREGROUND_PAIN_BLOOD OR sCMHDZData.sFXData[i].eFXType = CMHDZ_FX_SLASH_EFFECT sCMHDZData.sFXData[i].iSpriteBlastAnimFrame += sCMHDZData.sFXData[i].iSlowUpdateFrames ELSE sCMHDZData.sFXData[i].iSpriteBlastAnimFrame += sCMHDZData.sFXData[i].iMedUpdateFrames ENDIF ENDIF // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_BULLETS_AND_EFFECTS] {DSW} Frame: ", sCMHDZData.sFXData[i].iSpriteBlastAnimFrame) // IF IS_MOVING_LEVEL() AND sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_PLAYING // sCMHDZData.sFXData[i].vSpritePos.x -= CMHDZ_GET_FX_UPDATE() // ENDIF SWITCH sCMHDZData.sFXData[i].eFXType CASE CMHDZ_FX_BLOOD_SPLAT //eSprite = INT_TO_ENUM(CMHDZ_SPRITE, ENUM_TO_INT(CMHDZ_SPRITE_SCREEN_DAMAGE_BLOOD_SPLATTER) + sCMHDZData.sFXData[i].iSpriteBlastAnimFrame) CMHDZ_DRAW_GAME_SPRITE_ALPHA_CONTROL(CMHDZ_SPRITE_SCREEN_DAMAGE_BLOOD_SPLATTER, sCMHDZData.sFXData[i].vSpritePos, CMHDZ_BOSS_GET_SPRITE_SIZES(CMHDZ_SPRITE_SCREEN_DAMAGE_BLOOD_SPLATTER), sCMHDZData.sFXData[i].fAlpha) BREAK CASE CMHDZ_FX_BEARSY_FOREGROUND_ATTACKING_BLOOD //eSprite = INT_TO_ENUM(CMHDZ_SPRITE, (ENUM_TO_INT(CMHDZ_SPRITE_BEARSY_FOREGROUND_ATTACKING_BLOOD_01) + sCMHDZData.sFXData[i].iSpriteBlastAnimFrame)) //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_DRAW_GORE_EFFECTS() - CMHDZ_FX_BEARSY_FOREGROUND_ATTACKING_BLOOD - fAlpha: ", sCMHDZData.sFXData[i].fAlpha) CMHDZ_DRAW_GAME_SPRITE_ALPHA_CONTROL(CMHDZ_GET_SPRITE_FROM_ANIM_FRAME(i, CMHDZ_SPRITE_BEARSY_FOREGROUND_ATTACKING_BLOOD_01), sCMHDZData.sFXData[i].vSpritePos, CMHDZ_BOSS_GET_SPRITE_SIZES(CMHDZ_SPRITE_BEARSY_FOREGROUND_ATTACKING_BLOOD_01), sCMHDZData.sFXData[i].fAlpha) BREAK CASE CMHDZ_FX_SLASH_EFFECT //eSprite = INT_TO_ENUM(CMHDZ_SPRITE, ENUM_TO_INT(CMHDZ_SPRITE_SCREEN_DAMAGE_RIP)) // Only one frame CMHDZ_DRAW_GAME_SPRITE_ALPHA_CONTROL(CMHDZ_SPRITE_SCREEN_DAMAGE_RIP, sCMHDZData.sFXData[i].vSpritePos, CMHDZ_BOSS_GET_SPRITE_SIZES(CMHDZ_SPRITE_SCREEN_DAMAGE_RIP), sCMHDZData.sFXData[i].fAlpha) BREAK ENDSWITCH // Reset effects on finish SWITCH sCMHDZData.sFXData[i].eFXType CASE CMHDZ_FX_BLOOD_SPLAT IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame >= 30 sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 sCMHDZData.sFXData[i].bFinished = TRUE ENDIF BREAK CASE CMHDZ_FX_BEARSY_FOREGROUND_ATTACKING_BLOOD IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame >= ciCMHDZ_BEARSY_CHAINSAW_BLOOD_MAX_ANIM_FRAMES sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 sCMHDZData.sFXData[i].bFinished = TRUE ENDIF BREAK CASE CMHDZ_FX_SLASH_EFFECT IF sCMHDZData.sFXData[i].iSpriteBlastAnimFrame >= ciCMHDZ_SCREEN_SLASH_MAX_ANIM_FRAMES sCMHDZData.sFXData[i].iSpriteBlastAnimFrame = 0 sCMHDZData.sFXData[i].bFinished = TRUE ENDIF BREAK ENDSWITCH ENDIF ENDFOR ENDPROC PROC CMHDZ_DRAW_RETICLES(BOOL bIgnoreDead = FALSE, BOOL bInMenu = FALSE) // What kind of reticle is needed TEXT_LABEL_31 tl15Reticle tl15Reticle = "RETICLE_REVOLVER_DEFAULT" //RGBA_COLOUR_STRUCT col IF (CMHDZ_GET_LOCAL_PLAYER_HEALTH() <= 0.0) AND (bIgnoreDead = FALSE) EXIT ENDIF IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_HIDE_RETICULE) EXIT ENDIF // IF CMHDZ_IS_LOCAL_PLAYER_IN_LEFT_HAND_CABINET() // INIT_RGBA_STRUCT(col, 255, 32, 32, 255) // ELSE // INIT_RGBA_STRUCT(col, 20, 80, 255, 255) // ENDIF SWITCH sCMHDZData.sPlayerData[0].activeWeapon CASE CMHDZ_PLAYER_WEAPON_REVOLVER CASE CMHDZ_PLAYER_WEAPON_NONE tl15Reticle = "RETICLE_REVOLVER" BREAK CASE CMHDZ_PLAYER_WEAPON_NAILGUN tl15Reticle = "RETICLE_NAIL_GUN" BREAK CASE CMHDZ_PLAYER_WEAPON_RIFLE tl15Reticle = "RETICLE_RPG" BREAK CASE CMHDZ_PLAYER_WEAPON_SHOTGUN tl15Reticle = "RETICLE_SHOTGUN" BREAK ENDSWITCH CMHDZ_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() // IF CMHDZ_IS_PLAYER_PLAYING() // AND NOT bInMenu IF NOT bInMenu IF CMHDZ_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() <= 0 IF CMHDZ_IS_PLAYER_SHOOTING() tl15Reticle += "_NO_AMMO_FIRING" ELSE tl15Reticle += "_NO_AMMO" ENDIF ELSE IF CMHDZ_IS_PLAYER_SHOOTING() tl15Reticle += "_SHOOTING" IF IS_BITMASK_ENUM_AS_ENUM_SET(sCMHDZData.sPlayerData[0].eReticuleBits, CMHDZ_RETICLE_BITS_DESTROYED_TARGET) OR IS_BITMASK_ENUM_AS_ENUM_SET(sCMHDZData.sPlayerData[0].eReticuleBits, CMHDZ_RETICLE_BITS_HIT_TARGET) tl15Reticle += "_HIT" ENDIF ELSE tl15Reticle += "_DEFAULT" ENDIF ENDIF ENDIF IF bInMenu IF CMHDZ_IS_PLAYER_SHOOTING() tl15Reticle += "_SHOOTING" ELSE tl15Reticle += "_DEFAULT" ENDIF ENDIF DEBUG_PRINTCALLSTACK() //CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_RETICLE_TYPES), tl15Reticle, sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos, INIT_VECTOR_2D(cfCMHDZ_SPRITE_MARKER_WIDTH, cfCMHDZ_SPRITE_MARKER_HEIGHT), 0, sCMHDZData.rgbaSprite) ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_RETICLE_TYPES), tl15Reticle, sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos, INIT_VECTOR_2D(cfCMHDZ_SPRITE_MARKER_WIDTH, cfCMHDZ_SPRITE_MARKER_HEIGHT), 0, sCMHDZData.rgbaWhite) ENDPROC PROC CMHDZ_DRAW_SHOT_DISTORTION() //TEXT_LABEL_23 tl23Sprite // INT p // FOR p = 0 TO ciCMHDZ_MAX_PLAYERS - 1 // // IF sCMHDZData.sPlayerData[p].bHasJustShot // /* // ON PC // Pistol shot diff ~ 450ms // NAILGUN gun ~ 120 ms // */ // // IF sCMHDZData.sPlayerData[p].iLastShotTime = 0 // OR GET_GAME_TIMER() - sCMHDZData.sPlayerData[p].iLastShotTime > 200 // ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), sCMHDZData.rgbaSprite) // sCMHDZData.sPlayerData[p].iLastShotTime = GET_GAME_TIMER() // ENDIF // //// IF sCMHDZData.sPlayerData[p].iLastShotTime = 0 //// sCMHDZData.sPlayerData[p].iLastShotTime = GET_GAME_TIMER() //// //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_SHOT_DISTORTION] {DSW} Grabbed last shot time") //// ELSE //// //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_SHOT_DISTORTION] {DSW} Time since last shot ", GET_GAME_TIMER() - sCMHDZData.sPlayerData[p].iLastShotTime) //// sCMHDZData.sPlayerData[p].iLastShotTime = GET_GAME_TIMER() //// ENDIF // ENDIF // // ENDFOR BOOL bShowOffset = TRUE #IF IS_DEBUG_BUILD IF GET_COMMANDLINE_PARAM_EXISTS("sc_BadlandsNoDeath") OR (CMHDZ_CMDLINE_NO_DEATH = 1) //OR bShowOffset bShowOffset = FALSE ENDIF #ENDIF //FLOAT fScreenJumpPoint = GET_RANDOM_FLOAT_IN_RANGE(90.0, 125.0) // Point in the timer span that the screen starts returning to neutral. FLOAT fScreenJumpPoint = 10.0 // Point in the timer span that the screen starts returning to neutral. IF sCMHDZData.iFade > 0 bShowOffset = FALSE ENDIF IF bShowOffset IF sCMHDZData.sPlayerData[0].fHitCountdown > 0.0 AND sCMHDZData.sPlayerData[0].fHealth > 0 // Only process if you still have health. sCMHDZData.sPlayerData[0].fHitCountdown -= (0.0+@1000.0) ENDIF IF sCMHDZData.sPlayerData[0].fHitCountdown > fScreenJumpPoint // IF sCMHDZData.sPlayerData[0].fHealth > 0 // Only process if you still have health. // sCMHDZData.sPlayerData[0].fHitCountdown -= (0.0+@1000.0) // ENDIF IF sCMHDZData.sPlayerData[0].bHeavyDamageState OR sCMHDZData.sPlayerData[0].fHealth <= 0.0 INIT_RGBA_STRUCT(sCMHDZData.rgbaSprite, 230, 220, 230, 255) sCMHDZData.sPlayerData[0].bHeavyDamageState = TRUE sCMHDZData.fSyncOffsetY += (0.0+@GET_RANDOM_FLOAT_IN_RANGE(300.0,400.0)) // Testing // Only heavy damage on bool toggle IF sCMHDZData.sPlayerData[0].bHeavyDamageState CMHDZ_DRAW_HEAVY_DAMAGE_EFFECT() ENDIF ELSE // Regular damage CMHDZ_DRAW_DAMAGE_NOISE(85) // Adjust the offset IF (sCMHDZData.fSyncOffsetY > 0.0) AND sCMHDZData.sPlayerData[0].fHealth > 0 sCMHDZData.fSyncOffsetY += (0.0+@GET_RANDOM_FLOAT_IN_RANGE(50.0,100.0)) ENDIF ENDIF ELIF sCMHDZData.sPlayerData[0].fHitCountdown > 0.0 sCMHDZData.fSyncOffsetY -= (0.0+@GET_RANDOM_FLOAT_IN_RANGE(150.0,200.0))//*(1.0+(sCMHDZData.fSyncOffsetY/100)) IF (sCMHDZData.sPlayerData[0].fHealth <= 0.0) CMHDZ_SET_PLAYER_BIT(CMHDZ_PLAYER_BIT_DYING) ENDIF ELSE // fHitCountdown <= 0.0 IF sCMHDZData.fSyncOffsetY < -(fScreenJumpPoint*2.0) sCMHDZData.fSyncOffsetY = -(fScreenJumpPoint*2.0) ENDIF IF sCMHDZData.fSyncOffsetY < 0.0 sCMHDZData.fSyncOffsetY += (0.0+@GET_RANDOM_FLOAT_IN_RANGE(200.0,300.0)) ELSE sCMHDZData.fSyncOffsetY = 0.0 ENDIF sCMHDZData.sPlayerData[0].fHitCountdown = 0.0 INIT_RGBA_STRUCT(sCMHDZData.rgbaSprite, 255, 255, 255, 255) sCMHDZData.sPlayerData[0].bHeavyDamageState = FALSE ENDIF ENDIF IF sCMHDZData.sPlayerData[0].bHeavyDamageState sCMHDZData.fSoundGlitchAdditional += 0.25 ENDIF IF (sCMHDZData.fSyncOffsetY != 0.0) // AND (sCMHDZData.fSyncOffsetY < 0.0) //AND (sCMHDZData.fSyncOffsetY < (cfBASE_SCREEN_HEIGHT/4.0)) VECTOR_2D vu, vy vu.x = GET_RANDOM_FLOAT_IN_RANGE(0.0, 0.25) vu.y = GET_RANDOM_FLOAT_IN_RANGE(0.0, 0.25) vy.x = vu.x + 0.75 vy.y = vu.y + 0.75 ARCADE_DRAW_PIXELSPACE_SPRITE_WITH_UV(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_DAMAGE), "damage_fx_overlay_001", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, sCMHDZData.fSyncOffsetY), INIT_VECTOR_2D(1500, 200), vu, vy, 0, sCMHDZData.rgbaWhiteSafe) ARCADE_DRAW_PIXELSPACE_SPRITE_WITH_UV(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_DAMAGE), "damage_fx_overlay_001", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, sCMHDZData.fSyncOffsetY + 877.0), INIT_VECTOR_2D(1500, 200), vu, vy, 0, sCMHDZData.rgbaWhiteSafe) ENDIF // Old damage assessment. Effect will fade over the gameplay CMHDZ_DRAW_DAMAGE_NOISE(ROUND(90 * (1 - CMHDZ_GET_LOCAL_PLAYER_HEALTH()))) ENDPROC //------------------------------------------------- // HUD FUNCTIONS //------------------------------------------------- PROC CMHDZ_GET_SINGLE_AMMO_HUD_POSITION_DETAILS(CMHDZ_PLAYER_WEAPON weapon, INT iClipPos, VECTOR_2D &v2Pos, VECTOR_2D &v2Size) SWITCH weapon CASE CMHDZ_PLAYER_WEAPON_REVOLVER v2Size = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_PISTOL_AMMO_SINGLE_WIDTH, cfCMHDZ_SPRITE_HUD_PISTOL_AMMO_SINGLE_HEIGHT) SWITCH iClipPos CASE 0 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_0_X, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 1 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_1_X, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 2 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_2_X, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 3 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_3_X, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 4 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_4_X, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 5 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_5_X, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK ENDSWITCH BREAK CASE CMHDZ_PLAYER_WEAPON_RIFLE v2Size = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_RIFLE_AMMO_SINGLE_WIDTH, cfCMHDZ_SPRITE_HUD_RIFLE_AMMO_SINGLE_HEIGHT) SWITCH iClipPos CASE 0 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_0_X, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 1 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_1_X, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 2 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_2_X, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 3 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_3_X, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 4 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_4_X, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 5 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_5_X, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK ENDSWITCH BREAK CASE CMHDZ_PLAYER_WEAPON_SHOTGUN v2Size = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_SHOTGUN_AMMO_SINGLE_WIDTH, cfCMHDZ_SPRITE_HUD_SHOTGUN_AMMO_SINGLE_HEIGHT) SWITCH iClipPos CASE 0 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_0_X+22, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 1 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_1_X+16, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 2 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_2_X+10, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 3 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_3_X+4, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 4 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_4_X+4, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 5 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_5_X+4, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK ENDSWITCH BREAK CASE CMHDZ_PLAYER_WEAPON_NAILGUN v2Size = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_SHOTGUN_AMMO_SINGLE_WIDTH, 80) SWITCH iClipPos CASE 0 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_0_X - 4, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 1 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_1_X - 4, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 2 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_2_X - 4, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 3 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_3_X - 4, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 4 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_4_X - 4, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK CASE 5 v2Pos = INIT_VECTOR_2D(cfCMHDZ_SINGLE_PISTOL_AMMO_5_X - 4, cfCMHDZ_SINGLE_PISTOL_AMMO_0_Y) BREAK ENDSWITCH BREAK ENDSWITCH ENDPROC PROC CMHDZ_DRAW_SINGLE_AMMO(STRING texture, VECTOR_2D pos, VECTOR_2D size, INT iClipPos, INT iAmmoInClip, INT iClipSize) RGBA_COLOUR_STRUCT rgba = sCMHDZData.rgbaWhite INT iBulletsFired = iClipSize - iAmmoInClip IF iBulletsFired > iClipPos rgba = sCMHDZData.rgbaSpriteUsedBullet ENDIF // //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_DRAW_SINGLE_AMMO] iClipPos: ", iClipPos, " Fired: ", iBulletsFired, " iAmmoInClip: ",iAmmoInClip, " iClipSize: ", iClipSize, " Should fade? ", bShouldFade) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_HUD), texture, pos, size, 0, rgba) ENDPROC PROC CMHDZ_DRAW_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() TEXT_LABEL_31 tl23Sprite INT iAmmoInClip INT iClipSize INT i VECTOR_2D v2AmmoPos VECTOR_2D v2AmmoSize INT iMaxAmmoSize = 6 SWITCH CMHDZ_GET_PLAYER_CURRENT_WEAPON() CASE CMHDZ_PLAYER_WEAPON_REVOLVER tl23Sprite = "ammo_pistol1" iAmmoInClip = CMHDZ_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() iClipSize = CMHDZ_GET_PLAYER_CURRENT_WEAPON_CLIP_SIZE() //-- Right to left FOR i = 0 TO iClipSize - 1 CMHDZ_GET_SINGLE_AMMO_HUD_POSITION_DETAILS(CMHDZ_PLAYER_WEAPON_REVOLVER, i, v2AmmoPos, v2AmmoSize) CMHDZ_DRAW_SINGLE_AMMO(tl23Sprite, v2AmmoPos, v2AmmoSize, i, iAmmoInClip, iClipSize) ENDFOR BREAK CASE CMHDZ_PLAYER_WEAPON_SHOTGUN tl23Sprite = "INDIVIDUAL_AMMO_ICON_SHOTGUN" iAmmoInClip = CMHDZ_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() iClipSize = CMHDZ_GET_PLAYER_CURRENT_WEAPON_CLIP_SIZE() // Fixing position from right of screen. // This system doesn't draw objects in the correct place unless manually corrected. //-- Right to left FOR i = 0 TO iClipSize - 1 CMHDZ_GET_SINGLE_AMMO_HUD_POSITION_DETAILS(CMHDZ_PLAYER_WEAPON_SHOTGUN, i, v2AmmoPos, v2AmmoSize) v2AmmoPos.x -= 28.0 * (iMaxAmmoSize - iClipSize) CMHDZ_DRAW_SINGLE_AMMO(tl23Sprite, v2AmmoPos, v2AmmoSize, i, iAmmoInClip, iClipSize) ENDFOR BREAK CASE CMHDZ_PLAYER_WEAPON_RIFLE tl23Sprite = "INDIVIDUAL_AMMO_ICON_RIFLE" iAmmoInClip = CMHDZ_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() iClipSize = CMHDZ_GET_PLAYER_CURRENT_WEAPON_CLIP_SIZE() //-- Right to left FOR i = 0 TO iClipSize - 1 CMHDZ_GET_SINGLE_AMMO_HUD_POSITION_DETAILS(CMHDZ_PLAYER_WEAPON_RIFLE, i, v2AmmoPos, v2AmmoSize) v2AmmoPos.x -= 24.0 * (iMaxAmmoSize - iClipSize) CMHDZ_DRAW_SINGLE_AMMO(tl23Sprite, v2AmmoPos, v2AmmoSize, i, iAmmoInClip, iClipSize) ENDFOR BREAK CASE CMHDZ_PLAYER_WEAPON_NAILGUN tl23Sprite = "INDIVIDUAL_AMMO_NAIL" iAmmoInClip = CMHDZ_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() iClipSize = 5 // Hard lock as ammo doesn't reload. //-- Right to left FOR i = 0 TO iClipSize - 1 CMHDZ_GET_SINGLE_AMMO_HUD_POSITION_DETAILS(CMHDZ_PLAYER_WEAPON_NAILGUN, i, v2AmmoPos, v2AmmoSize) v2AmmoPos.x -= 24.0 * (iMaxAmmoSize - iClipSize) CMHDZ_DRAW_SINGLE_AMMO(tl23Sprite, v2AmmoPos, v2AmmoSize, i, iAmmoInClip, iClipSize) ENDFOR BREAK ENDSWITCH ENDPROC PROC CMHDZ_DRAW_AMMO_QUANTITY(VECTOR_2D vPos, INT iTotalAmmo, RGBA_COLOUR_STRUCT col) TEXT_LABEL_23 n1, n2 STRING txtStr // = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT) txtStr = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT) IF iTotalAmmo > 99 n1 = "FONT_INF" CMHDZ_DRAW_GAME_SPRITE_DETAILS(txtStr, n1, INIT_VECTOR_2D(vPos.x + 50, vPos.y + 6), INIT_VECTOR_2D(72, 60), 0, col) EXIT //n2 = "FONT_9" ELSE n1 = "FONT_" n1 += iTotalAmmo / 10 n2 = "FONT_" n2 += iTotalAmmo % 10 ENDIF txtStr = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT) CMHDZ_DRAW_GAME_SPRITE_DETAILS(txtStr, n1, INIT_VECTOR_2D(vPos.x, vPos.y), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_AMMO_QTY_WIDTH, cfCMHDZ_SPRITE_HUD_AMMO_QTY_HEIGHT), 0, col) IF NOT IS_STRING_NULL_OR_EMPTY(n2) CMHDZ_DRAW_GAME_SPRITE_DETAILS(txtStr, n2, INIT_VECTOR_2D(vPos.x + cfCMHDZ_SPRITE_HUD_AMMO_QTY_WIDTH, vPos.y), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_AMMO_QTY_WIDTH, cfCMHDZ_SPRITE_HUD_AMMO_QTY_HEIGHT), 0, col) ENDIF ENDPROC PROC CMHDZ_DRAW_THROWN_PROJECTILE_RELOAD_METER() FLOAT fReloadRatio = 1.0 FLOAT t1, t2 TEXT_LABEL_31 tl31Sprite CMHDZ_PROJECTILE_TYPES eType = sCMHDZData.sPlayerData[0].projectileType FLOAT fXpos = cfCMHDZ_SPRITE_HUD_PROJECTILE_AMMO_X // Some sprites don't line up correctly without case correction. IF (sCMHDZData.sPlayerData[0].iLastThrownProjectileTime != 0) AND (sCMHDZData.sProjectileInfo[eType].iReloadTimeMS > 0) t1 = TO_FLOAT(GET_GAME_TIMER()) t2 = TO_FLOAT(sCMHDZData.sPlayerData[0].iLastThrownProjectileTime + sCMHDZData.sProjectileInfo[eType].iReloadTimeMS) fReloadRatio = (t2 - t1) / TO_FLOAT(sCMHDZData.sProjectileInfo[eType].iReloadTimeMS) ENDIF fReloadRatio = CLAMP(fReloadRatio, 0.0, 1.0) SWITCH eType CASE CMHDZ_PROJECTILE_DYNAMITE tl31Sprite = "AMMO_BOMB" BREAK CASE CMHDZ_PROJECTILE_MOLOTOV tl31Sprite = "AMMO_MOLOTOV" fXpos += 4.0 BREAK CASE CMHDZ_PROJECTILE_NAILBOMB tl31Sprite = "AMMO_NAILBOMB" fXpos += 4.0 BREAK CASE CMHDZ_PROJECTILE_BRICK tl31Sprite = "AMMO_BRICK" fXpos -= 4.0 // Correct for smaller sprite. BREAK ENDSWITCH STRING sTextDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_HUD) CMHDZ_DRAW_HORIZONTAL_MASK_SPRITE(sTextDict, tl31Sprite, INIT_VECTOR_2D(fXpos, cfCMHDZ_SPRITE_HUD_PROJECTILE_AMMO_Y), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_PROJECTILE_AMMO_WIDTH, cfCMHDZ_SPRITE_HUD_PROJECTILE_AMMO_HEIGHT), 1.0, 0, sCMHDZData.rgbaSpriteUsedBullet) CMHDZ_DRAW_HORIZONTAL_MASK_SPRITE(sTextDict, tl31Sprite, INIT_VECTOR_2D(fXpos, cfCMHDZ_SPRITE_HUD_PROJECTILE_AMMO_Y), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_PROJECTILE_AMMO_WIDTH, cfCMHDZ_SPRITE_HUD_PROJECTILE_AMMO_HEIGHT), 1.0 - fReloadRatio, 0, sCMHDZData.rgbaSprite) IF (eType = CMHDZ_PROJECTILE_BRICK) EXIT ENDIF CMHDZ_DRAW_AMMO_QUANTITY(INIT_VECTOR_2D(cfCMHDZ_PROJECTILE_AMMO_QTY_1_X_POS, cfCMHDZ_PROJECTILE_AMMO_QTY_1_Y_POS), sCMHDZData.sPlayerData[0].iThrownProjectilesAmmo, sCMHDZData.rgbaSprite) ENDPROC PROC CMHDZ_DRAW_LEVEL_PROGRESS_MARKER() FLOAT fMarkerY = cfCMHDZ_SPRITE_HUD_PROGRESS_BAR_Y + (cfCMHDZ_SPRITE_HUD_PROGRESS_BAR_HEIGHT/2.0) fMarkerY -= 84.0 fMarkerY -= (sCMHDZData.iCurrentScreen - 1) * (cfCMHDZ_SPRITE_HUD_PROGRESS_BAR_HEIGHT / CMHDZ_GET_FINAL_SCREEN_IN_CURRENT_LEVEL()) // fMarkerY = (1.0 - fMarkerY) + cfCMHDZ_SPRITE_HUD_PROGRESS_MARKER_Y // because it needs to move from bottom to top // Apply the sync offset. FLOAT fYpos = (cfCMHDZ_SPRITE_HUD_PROGRESS_BAR_Y + sCMHDZData.fSyncOffsetY) fMarkerY += sCMHDZData.fSyncOffsetY ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_PROGRESS_BAR_X, fYpos), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_PROGRESS_BAR_WIDTH, cfCMHDZ_SPRITE_HUD_PROGRESS_BAR_HEIGHT), sCMHDZData.rgbaWhite) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), "HEXAGON", INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_PROGRESS_MARKER_X, fMarkerY), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_PROGRESS_MARKER_WIDTH, cfCMHDZ_SPRITE_HUD_PROGRESS_MARKER_HEIGHT), 0, sCMHDZData.rgbaWhite) ENDPROC PROC CMHDZ_DRAW_PLAYER_HEALTH_BAR() INT icon = 4 FLOAT hp = CMHDZ_GET_LOCAL_PLAYER_HEALTH() RGBA_COLOUR_STRUCT color = sCMHDZData.rgbaWhite STRING textDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT) IF (sCMHDZData.iFade = 0.0) AND (hp != 0.0) CMHDZ_DRAW_REC_TEXT(INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_HP_INDICATOR_X, cfCMHDZ_SPRITE_HUD_TIME_Y), sCMHDZData.rgbaWhite) //CMHDZ_DRAW_STOP_SYMBOL() //CMHDZ_DRAW_PLAY_SYMBOL() ENDIF IF (hp = 0.0) CMHDZ_DRAW_GAME_SPRITE_DETAILS(textDict, "BATTERY_DEAD", INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_HP_INDICATOR_X + 244, cfCMHDZ_SPRITE_HUD_HP_INDICATOR_Y + 28), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_HP_INDICATOR_W, cfCMHDZ_SPRITE_HUD_HP_INDICATOR_H), 0, color) CMHDZ_DRAW_STOP_SYMBOL() // IF (sCMHDZData.iFade = 0.0) // CMHDZ_DRAW_GAME_SPRITE_DETAILS(textDict, "REDCIRCLE", // INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_HP_INDICATOR_X + 135, cfCMHDZ_SPRITE_HUD_HP_INDICATOR_Y + 24), // INIT_VECTOR_2D(48, 48), 0, color) // ENDIF EXIT ENDIF IF ((GET_GAME_TIMER() % 1000) < 500) AND (sCMHDZData.iFade = 0.0) AND (hp != 0.0) CMHDZ_DRAW_GAME_SPRITE_DETAILS(textDict, "REDCIRCLE", INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_HP_INDICATOR_X + 162, cfCMHDZ_SPRITE_HUD_HP_INDICATOR_Y + 28), INIT_VECTOR_2D(48, 48), 0, color) ENDIF IF (hp < 0.2) AND ((GET_GAME_TIMER() % 1000) > 500) EXIT ENDIF IF (hp < 0.2) icon = 0 ELIF (hp < 0.4) icon = 1 ELIF (hp < 0.6) icon = 2 ELIF (hp < 0.8) icon = 3 ENDIF TEXT_LABEL_63 txtName = "BATTERY_" txtName += icon IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_INVULNERABILE) color = sCMHDZData.rgbaYellow ENDIF IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_QUAD_DAMAGE) color = sCMHDZData.rgbaBlue ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(textDict, txtName, INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_HP_INDICATOR_X + 244, cfCMHDZ_SPRITE_HUD_HP_INDICATOR_Y + 28), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_HP_INDICATOR_W, cfCMHDZ_SPRITE_HUD_HP_INDICATOR_H), 0, color) ENDPROC PROC CMHDZ_DRAW_HUD() // Fade IF NOT sCMHDZData.bFadingOut AND sCMHDZData.iFade > 0 // RGBA_COLOUR_STRUCT rgbaFade // INIT_RGBA_STRUCT(rgbaFade, 255, 255, 255, sCMHDZData.iFade) //CMHDZ_DRAW_DAMAGE_NOISE(sCMHDZData.iFade) sCMHDZData.iFade -= ROUND(GET_FRAME_TIME() * 100) //CDEBUG2LN(DEBUG_MINIGAME, "[BAZ][CMHDZ] CMHDZ_DRAW_HUD - bFadingIn - iFade time: ", (GET_FRAME_TIME() * 150)) SET_BITMASK_AS_ENUM(sCMHDZData.iDirectorAudioBits, CMHDZ_DIRECTOR_BITS_Level_Start_TRIGGER) IF (sCMHDZData.iFade > 130) ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), sCMHDZData.rgbaBlack) sCMHDZData.fSoundGlitchLevel = 1.0 IF ((sCMHDZData.iFade)%50) <= 25 CMHDZ_DRAW_ROUND_START_TEXT(sCMHDZData.rgbaWhite) ENDIF //sCMHDZData.fSyncOffsetY = GET_RANDOM_FLOAT_IN_RANGE(-10.0,10.0) INT i = (255 - (sCMHDZData.iFade+30)) IF (i < 0) i = 0 ENDIF CMHDZ_DRAW_DAMAGE_NOISE(i) //sCMHDZData.fSyncOffsetY += (0.0+@(80*(sCMHDZData.iFade))) ELIF(sCMHDZData.iFade > 75) CMHDZ_DRAW_HEAVY_DAMAGE_EFFECT() sCMHDZData.fSoundGlitchLevel = 0.5 //sCMHDZData.fSyncOffsetY += (0.0+@(80*(sCMHDZData.iFade))) // sCMHDZData.fSyncOffsetY = GET_RANDOM_FLOAT_IN_RANGE(-sCMHDZData.iFade/3.0,sCMHDZData.iFade/3.0) ELIF (sCMHDZData.fSyncOffsetY > 0) //sCMHDZData.fSyncOffsetY -= (0.0+@GET_RANDOM_FLOAT_IN_RANGE(2500.0,4000.0)) sCMHDZData.fSyncOffsetY = 0.0 ELIF (sCMHDZData.fSyncOffsetY < 0) sCMHDZData.fSyncOffsetY = 0.0 ENDIF IF (sCMHDZData.iFade < 55) CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_MUSIC_TRANSITION) sCMHDZData.fSoundGlitchLevel = 0.0 CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_GET_MUSIC_EVENT_FOR_LEVEL(CMHDZ_GET_CURRENT_LEVEL())) sCMHDZData.iFade = 0 ENDIF // Draw the play symbol IF (sCMHDZData.iFade > 75) IF (sCMHDZData.iFade < 130) CMHDZ_DRAW_PLAY_SYMBOL() ENDIF EXIT ELSE CMHDZ_HANDLE_DIRECTOR_ONE_OFF_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Level_Start) CMHDZ_DRAW_PLAY_SYMBOL() ENDIF ELIF sCMHDZData.bFadingOut //AND sCMHDZData.iFade < 255 // RGBA_COLOUR_STRUCT rgbaFade // INIT_RGBA_STRUCT(rgbaFade, 255, 255, 255, sCMHDZData.iFade) //CMHDZ_DRAW_DAMAGE_NOISE(sCMHDZData.iFade) //sCMHDZData.iFade += 4 sCMHDZData.iFade += ROUND(GET_FRAME_TIME() * 100) CDEBUG2LN(DEBUG_MINIGAME, "[BAZ][CMHDZ] CMHDZ_DRAW_HUD - bFadingOut - iFade time: ", (GET_FRAME_TIME() * 150)) //SET_VARIABLE_ON_SOUND(sCMHDZData.iSoundId[CMHDZ_AUDIO_EFFECT_LEVEL_BACKGROUND_LOOP],"GlitchLevel",(sCMHDZData.iFade/255.0)) // IF (sCMHDZData.iFade > 150) // CMHDZ_DRAW_HEAVY_DAMAGE_EFFECT() // sCMHDZData.fSyncOffsetY += (0.0+@(80*(sCMHDZData.iFade))) // ELIF (sCMHDZData.fSyncOffsetY > 0) // sCMHDZData.fSyncOffsetY -= (0.0+@GET_RANDOM_FLOAT_IN_RANGE(2500.0,4000.0)) // ELIF (sCMHDZData.fSyncOffsetY < 0) // sCMHDZData.fSyncOffsetY = 0.0 // ENDIF IF (sCMHDZData.iFade > 150) ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), sCMHDZData.rgbaBlack) IF CMHDZ_GET_LOCAL_PLAYER_HEALTH() > 0.0 IF ((sCMHDZData.iFade)%50) <= 25 CMHDZ_DRAW_ROUND_CLEAR_TEXT(sCMHDZData.rgbaWhite) ENDIF ENDIF //sCMHDZData.fSyncOffsetY = GET_RANDOM_FLOAT_IN_RANGE(-10,10) CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_GET_MUSIC_EVENT_FOR_LEVEL(CMHDZ_GET_CURRENT_LEVEL())) CMHDZ_DRAW_DAMAGE_NOISE(FLOOR(sCMHDZData.iFade/1.5)) sCMHDZData.fSoundGlitchLevel = 1.0 //sCMHDZData.fSyncOffsetY += (0.0+@(80*(sCMHDZData.iFade))) ELIF(sCMHDZData.iFade > 75) CMHDZ_DRAW_HEAVY_DAMAGE_EFFECT() sCMHDZData.fSoundGlitchLevel = 0.5 //sCMHDZData.fSyncOffsetY += (0.0+@(80*(sCMHDZData.iFade))) // sCMHDZData.fSyncOffsetY = (GET_RANDOM_FLOAT_IN_RANGE(-sCMHDZData.iFade/3.0,sCMHDZData.iFade/3.0)) ELIF (sCMHDZData.fSyncOffsetY > 0) //sCMHDZData.fSyncOffsetY -= (0.0+@GET_RANDOM_FLOAT_IN_RANGE(2500.0,4000.0)) sCMHDZData.fSyncOffsetY = 0.0 ELIF (sCMHDZData.fSyncOffsetY < 0) sCMHDZData.fSyncOffsetY = 0.0 ENDIF // Draw the play symbol IF (sCMHDZData.iFade > 75) CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_STOP) EXIT ELSE CMHDZ_DRAW_STOP_SYMBOL() ENDIF // IF (sCMHDZData.iFade < 5) // sCMHDZData.iFade = 0 // ENDIF //ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), rgbaFade) //sCMHDZData.fSyncOffsetY += (0.0+@(2000*sCMHDZData.iFade)) ENDIF // No hud if we're out of health. IF sCMHDZData.sPlayerData[0].fHealth <= 0.0 EXIT ENDIF CMHDZ_DRAW_PLAYER_HEALTH_BAR() // Regular score display IF CMHDZ_GET_NUMBER_OF_PLAYERS() <= 1 CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("SCR:", INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_TIME_X - cfCMHDZ_SPRITE_HUD_TIME_TEXT_X, cfCMHDZ_SPRITE_HUD_TIME_Y + cfCMHDZ_SPRITE_HUD_TIME_TEXT_Y), 1.5) CMHDZ_DRAW_PLAYER_SCORE_TEXT(GET_LOCAL_PLAYER_SCORE(), sCMHDZData.rgbaWhite, cfCMHDZ_SPRITE_HUD_TIME_X, cfCMHDZ_SPRITE_HUD_TIME_Y, CMHDZ_HUD_TEXTPIVOT_RIGHT) ENDIF IF CMHDZ_GET_NUMBER_OF_PLAYERS() > 1 // 'Red' (1P) Score //CMHDZ_DRAW_PLAYER_SCORE_TEXT(CMHDZ_GET_RED_PLAYER_SCORE_FOR_LEVEL(CMHDZ_GET_CURRENT_LEVEL_AS_INT()),sCMHDZData.rgbaRed, cfCMHDZ_SPRITE_HUD_TIME_X, cfCMHDZ_SPRITE_HUD_TIME_Y + 100, CMHDZ_HUD_TEXTPIVOT_RIGHT) RGBA_COLOUR_STRUCT rgbaPlayerColor = sCMHDZData.rgbaWhite // Is rival Blue? IF CMHDZ_IS_LOCAL_PLAYER_IN_LEFT_HAND_CABINET() rgbaPlayerColor = sCMHDZData.rgbaRedText ELSE // Rival is red rgbaPlayerColor = sCMHDZData.rgbaBlue ENDIF CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("SCR:", INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_TIME_X - cfCMHDZ_SPRITE_HUD_TIME_TEXT_X, cfCMHDZ_SPRITE_HUD_TIME_Y + cfCMHDZ_SPRITE_HUD_TIME_TEXT_Y), 1.5, DEFAULT, DEFAULT, rgbaPlayerColor.iR, rgbaPlayerColor.iG, rgbaPlayerColor.iB) CMHDZ_DRAW_PLAYER_SCORE_TEXT(GET_LOCAL_PLAYER_SCORE(), rgbaPlayerColor, cfCMHDZ_SPRITE_HUD_TIME_X, cfCMHDZ_SPRITE_HUD_TIME_Y, CMHDZ_HUD_TEXTPIVOT_RIGHT) INT iPart = CMHDZ_GET_PARTICIPANT_WITH_HIGHEST_HI_SCORE_FOR_CURRENT_LEVEL() INT iCurrentLevel = CMHDZ_GET_CURRENT_LEVEL_AS_INT() INT iHighestScore = CMHDZ_GET_PARTICIPANT_HI_SCORE_FOR_LEVEL_FROM_HOST(iPart,iCurrentLevel ) CMHDZ_SCORE_INTEGER_TYPE eHiScoreType IF iHighestScore > 0 IF iPart = PARTICIPANT_ID_TO_INT() //-- I've got the highest score IF CMHDZ_IS_LOCAL_PLAYER_IN_LEFT_HAND_CABINET() //-- I'm in the left hand cabinet - Hi score should be red eHiScoreType = CMHDZ_SCORE_INTEGER_TYPE_RED_SCORE ELSE //-- I'm in the right hand cabinbet - Hi score should be blue eHiScoreType = CMHDZ_SCORE_INTEGER_TYPE_BLUE_SCORE ENDIF ELSE //--Rival has highest score IF CMHDZ_IS_LOCAL_PLAYER_IN_LEFT_HAND_CABINET() //-- Rival in right hand cabinet - score should be blue eHiScoreType = CMHDZ_SCORE_INTEGER_TYPE_BLUE_SCORE ELSE //-- Rival in left hand cabinet - score should be red eHiScoreType = CMHDZ_SCORE_INTEGER_TYPE_RED_SCORE ENDIF ENDIF ELSE //-- Just make the hi score white if nobody has a score yet eHiScoreType = CMHDZ_SCORE_INTEGER_TYPE_HI_SCORE ENDIF UNUSED_PARAMETER(eHiScoreType) //CMHDZ_DRAW_SCORE_INTEGER(iHighestScore, ciCMHDZ_MAX_SCORE_DIGITS, INIT_VECTOR_2D(cfCMHDZ_MY_HISCORE_X_POS, cfCMHDZ_MY_HISCORE_Y_POS), sCMHDZData.rgbaSprite, eHiScoreType) // RGBA_COLOUR_STRUCT rgbaRivalColor = sCMHDZData.rgbaWhite // Is rival Blue? IF CMHDZ_IS_LOCAL_PLAYER_IN_LEFT_HAND_CABINET() rgbaRivalColor = sCMHDZData.rgbaBlue ELSE // Rival is red rgbaRivalColor = sCMHDZData.rgbaRedText ENDIF // (2P) Score CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("RVL:", INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_TIME_X - cfCMHDZ_SPRITE_HUD_TIME_TEXT_X, cfCMHDZ_SPRITE_HUD_TIME_Y + (cfCMHDZ_SPRITE_HUD_TIME_TEXT_Y + 60)), 1.5, DEFAULT, DEFAULT, rgbaRivalColor.iR, rgbaRivalColor.iG, rgbaRivalColor.iB) CMHDZ_DRAW_PLAYER_SCORE_TEXT(CMHDZ_GET_RIVAL_SCORE_FOR_LEVEL(iCurrentLevel), rgbaRivalColor, cfCMHDZ_SPRITE_HUD_TIME_X, cfCMHDZ_SPRITE_HUD_TIME_Y + 60, CMHDZ_HUD_TEXTPIVOT_RIGHT) //CMHDZ_DRAW_SCORE_INTEGER(CMHDZ_GET_RIVAL_SCORE_FOR_LEVEL(iCurrentLevel), ciCMHDZ_MAX_SCORE_DIGITS, INIT_VECTOR_2D(cfCMHDZ_BLUE_SCORE_X_POS, cfCMHDZ_BLUE_SCORE_Y_POS), sCMHDZData.rgbaSprite, CMHDZ_SCORE_INTEGER_TYPE_BLUE_SCORE) IF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iCurrentLevel) > CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iCurrentLevel) //-- Red 'Win' ARCADE_DRAW_PIXELSPACE_SPRITE("MPCamhedzVHSFont", "SCORE_TEXT_WIN_GRAPHIC_RED", INIT_VECTOR_2D(960.0, cfCMHDZ_SCORE_WIN_RED_Y_POS ), INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE, cfCMHDZ_SCORE_WIN_Y_SIZE), 0, sCMHDZData.rgbaSprite) ELIF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iCurrentLevel) < CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iCurrentLevel) //-- Blue 'Win' ARCADE_DRAW_PIXELSPACE_SPRITE("MPCamhedzVHSFont", "SCORE_TEXT_WIN_GRAPHIC_BLUE", INIT_VECTOR_2D(960.0, cfCMHDZ_SCORE_WIN_BLUE_Y_POS), INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE, cfCMHDZ_SCORE_WIN_Y_SIZE), 0, sCMHDZData.rgbaSprite) ENDIF ENDIF CMHDZ_DRAW_THROWN_PROJECTILE_RELOAD_METER() INT iTotalAmmo = CMHDZ_GET_PLAYER_TOTAL_AMMO_IN_CURRENT_WEAPON(FALSE) CMHDZ_DRAW_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() CMHDZ_DRAW_AMMO_QUANTITY(INIT_VECTOR_2D(cfCMHDZ_AMMO_QTY_1_X_POS, cfCMHDZ_AMMO_QTY_1_Y_POS), iTotalAmmo, sCMHDZData.rgbaWhite) // IF CMHDZ_SHOULD_SHOW_RELOAD_PROMPT() AND NOT (sCMHDZData.bFadingOut) // IF CMHDZ_GET_PLAYER_TOTAL_AMMO_IN_CURRENT_WEAPON() = 0 // AND sCMHDZData.sPlayerData[0].weaponType = CMHDZ_PLAYER_WEAPON_TYPE_DEFAULT // CMHDZ_DRAW_NO_AMMO_TEXT(sCMHDZData.rgbaWhite) // //CMHDZ_DRAW_GAME_SPRITE("TYPE_PROMPT_NO_AMMO", INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_NO_AMMO_PROMPT_X, cfCMHDZ_SPRITE_HUD_NO_AMMO_PROMPT_Y), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_NO_AMMO_PROMPT_WIDTH, cfCMHDZ_SPRITE_HUD_NO_AMMO_PROMPT_HEIGHT), 0, sCMHDZData.rgbaSprite) // ELSE // CMHDZ_DRAW_RELOAD_TEXT(sCMHDZData.rgbaWhite) // //CMHDZ_DRAW_GAME_SPRITE("TYPE_PROMPT_RELOAD", INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_RELOAD_PROMPT_X, cfCMHDZ_SPRITE_HUD_RELOAD_PROMPT_Y), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_RELOAD_PROMPT_WIDTH, cfCMHDZ_SPRITE_HUD_RELOAD_PROMPT_HEIGHT), 0, sCMHDZData.rgbaSprite) // ENDIF // ENDIF IF CMHDZ_SHOULD_SHOW_RELOAD_PROMPT() AND NOT (sCMHDZData.bFadingOut) IF CMHDZ_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() = 0 // IF sCMHDZData.sPlayerData[0].weaponType != CMHDZ_PLAYER_WEAPON_TYPE_DEFAULT // //CMHDZ_DRAW_GAME_SPRITE("TYPE_PROMPT_NO_AMMO", INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_NO_AMMO_PROMPT_X, cfCMHDZ_SPRITE_HUD_NO_AMMO_PROMPT_Y), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_NO_AMMO_PROMPT_WIDTH, cfCMHDZ_SPRITE_HUD_NO_AMMO_PROMPT_HEIGHT), 0, sCMHDZData.rgbaSprite) // // Revert to original weapon // CMHDZ_INIT_PLAYER_WEAPON() // ELSE CMHDZ_DRAW_RELOAD_TEXT(sCMHDZData.rgbaWhite) // ENDIF ENDIF ENDIF CMHDZ_DRAW_LEVEL_PROGRESS_MARKER() IF CMHDZ_IS_PLAYER_PLAYING() IF NOT CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_DYING) RGBA_COLOUR_STRUCT rgbaColour FLOAT fTimerDiv // Asign the correct colour IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_INVULNERABILE) rgbaColour = sCMHDZData.rgbaYellow fTimerDiv = 12 //fTimerPercent = 100.0 - (sCMHDZData.fPowerRunTimer / ciCMHDZ_ITEM_SHIELD_TIME) ELIF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_HIDE_RETICULE) rgbaColour = sCMHDZData.rgbaGreen ELIF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_QUAD_DAMAGE) //fTimerPercent = 100.0 - (sCMHDZData.fQuadDamageRunTimer / ciCMHDZ_ITEM_BUFF_TIME) fTimerDiv = 10 rgbaColour = sCMHDZData.rgbaBlue ELSE IF sCMHDZData.fEffectFlashAlpha != 0 sCMHDZData.fEffectFlashAlpha = 0 ENDIF ENDIF IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_INVULNERABILE) OR CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_QUAD_DAMAGE) CMHDZ_FLASH_SCREEN_FOR_ACTIVE_EFFECT(rgbaColour) //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_IS_PLAYER_PLAYING powerup active - fTimerPercent: ", fTimerPercent) CMHDZ_SPRITE csSprite = CMHDZ_SPRITE_GET_NEXT_ENUM(CMHDZ_SPRITE_POWER_UP_LINE_01, ROUND((sCMHDZData.fPowerRunTimer % 200.0)/50.0)) //csSprite = CMHDZ_SPRITE_POWER_UP_LINE_01 // Power up tracking line CMHDZ_DRAW_GAME_SPRITE(csSprite, INIT_VECTOR_2D((cfBASE_SCREEN_WIDTH/2.0), (1000.0 - (sCMHDZData.fPowerRunTimer/fTimerDiv))), INIT_VECTOR_2D(1440, 80), 0.0, rgbaColour) ENDIF ELSE //ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), rgbaDead) //IF sCMHDZData.fSyncOffsetY >= 125.0 //CMHDZ_DRAW_GAME_OVER_EFFECT() //ENDIF ENDIF ELSE IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_INVULNERABILE) CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_INVULNERABILE) CMHDZ_STOP_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_POWERUP_ACTIVE) CMHDZ_STOP_SOUND(CMHDZ_AUDIO_EFFECT_PICKUP_SHIELD) ENDIF IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_QUAD_DAMAGE) CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_QUAD_DAMAGE) CMHDZ_STOP_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_POWERUP_ACTIVE) CMHDZ_STOP_SOUND(CMHDZ_AUDIO_EFFECT_PICKUP_BUFF) ENDIF IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_HIDE_RETICULE) CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_HIDE_RETICULE) CMHDZ_STOP_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_POWERUP_ACTIVE) ENDIF // Toggle special effects off. IF sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_FLICKERING].bShow //sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_SCAN_LINE].bShow = FALSE sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_FLICKERING].bShow = FALSE INIT_RGBA_STRUCT(sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_SCAN_LINE].rgbaColor,255,255,255,3) ENDIF ENDIF ENDPROC #IF IS_DEBUG_BUILD //------------------------------------------------- // DEBUG FUNCTIONS //------------------------------------------------- PROC DEBUG_TEXT_FLOAT_IN_SCREEN(STRING text, FLOAT fValue,FLOAT x, FLOAT y, INT r = 255, INT g = 255, INT b = 255) TEXT_PLACEMENT textPlacement textPlacement.x = x textPlacement.y = y TEXT_STYLE textStyle SET_TITLE_SMALL_TEXT(textStyle) textStyle.XScale = 0.2 textStyle.YScale = 0.2 TEXT_LABEL_63 output output = text output += " = " output += FLOAT_TO_STRING(fValue) textStyle.r = r textStyle.g = g textStyle.b = b DRAW_TEXT_WITH_STRING(textPlacement, textStyle, "DBG_STRING ",TEXT_LABEL_TO_STRING(output)) ENDPROC PROC DEBUG_TEXT_INT_IN_SCREEN(STRING text, INT iValue,FLOAT x, FLOAT y, INT r = 255, INT g = 255, INT b = 255) TEXT_PLACEMENT textPlacement textPlacement.x = x textPlacement.y = y TEXT_STYLE textStyle SET_TITLE_SMALL_TEXT(textStyle) textStyle.XScale = 0.2 textStyle.YScale = 0.2 TEXT_LABEL_63 output output = text output += " = " output += iValue textStyle.r = r textStyle.g = g textStyle.b = b DRAW_TEXT_WITH_STRING(textPlacement, textStyle, "DBG_STRING",TEXT_LABEL_TO_STRING(output)) ENDPROC PROC CMHDZ_DO_ON_SCREEN_DEBUG() // DEBUG_TEXT_FLOAT_IN_SCREEN("fTravelRate ",sDGMonkeyData.sLevelData.fTravelRate,0.16,0.05+0.01*iLine) FLOAT fYpos = 0.2 DEBUG_TEXT_INT_IN_SCREEN("Stage: ", CMHDZ_GET_CURRENT_LEVEL_SCREEN(), 0.16, fYpos) fYpos+=0.025 DEBUG_TEXT_INT_IN_SCREEN("Enemies: ", CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_SCREEN(), 0.16, fYpos) fYpos+=0.025 DEBUG_TEXT_INT_IN_SCREEN("Screen: ", sCMHDZData.iCurrentScreen, 0.16, fYpos) // fYpos+=0.025 // DEBUG_TEXT_INT_IN_SCREEN("Stop screen: ", sCMHDZData.iScreenToStopOn, 0.16, fYpos) // DEBUG_TEXT_FLOAT_IN_SCREEN("RetX", sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.x, 0.16, fYpos) // fYpos+=0.025 // DEBUG_TEXT_FLOAT_IN_SCREEN("RetY", sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.y, 0.16, fYpos) // DEBUG_TEXT_INT_IN_SCREEN("Lane 0: ", sCMHDZData.iCurrentActiveEnemies[0], 0.16, fYpos) // fYpos+=0.025 // DEBUG_TEXT_INT_IN_SCREEN("Lane 1: ", sCMHDZData.iCurrentActiveEnemies[1], 0.16, fYpos) // fYpos+=0.025 // DEBUG_TEXT_INT_IN_SCREEN("Lane 2: ", sCMHDZData.iCurrentActiveEnemies[2], 0.16, fYpos) ENDPROC #ENDIF //------------------------------------------------- // STATE FUNCTIONS //------------------------------------------------- PROC CMHDZ_DRAW_CLIENT_STATE_PLAYING() // Draw black and grey background ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), sCMHDZData.rgbaBlack) //ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH, cfGAME_SCREEN_HEIGHT), sCMHDZData.rgbaRed) sCMHDZData.fBackgroundSpeedMult = 1.0 CMHDZ_DRAW_BACKGROUND() CMHDZ_DRAW_COVER(ciCMHDZ_LANE_BACKGROUND, DEFAULT, TRUE) //CMHDZ_DRAW_HOSTAGES(ciCMHDZ_LANE_BACKGROUND) CMHDZ_DRAW_ENEMIES(ciCMHDZ_LANE_BACKGROUND) CMHDZ_DRAW_BOSS(ciCMHDZ_LANE_BACKGROUND) CMHDZ_DRAW_COVER(ciCMHDZ_LANE_BACKGROUND, DEFAULT, FALSE) CMHDZ_DRAW_ITEMS(ciCMHDZ_LANE_BACKGROUND) // FLOAT fScale = CMHDZ_COVER_UTIL_GET_TYPE_SCALE_FOR_LANE(CMHDZ_ASSET_SCRAPYARD_MD_VAN_3, 0) // CMHDZ_DRAW_GAME_SPRITE(sCMHDZData.tl31BaseTextDict, "LEVEL_02_TOWN_PROP_08", GET_DEBUG_TEXTURE_POS(0), INIT_VECTOR_2D(cfCMHDZ_BUILDING_2_SPRITE_WIDTH*fScale, cfCMHDZ_BUILDING_2_SPRITE_HEIGHT*fScale), 0, sCMHDZData.rgbaSprite) // CMHDZ_DRAW_BULLETS_AND_EFFECTS(ciCMHDZ_LANE_BACKGROUND) CMHDZ_DRAW_ENEMIES(ciCMHDZ_LANE_MIDDLE) CMHDZ_DRAW_BOSS(ciCMHDZ_LANE_MIDDLE) CMHDZ_DRAW_COVER(ciCMHDZ_LANE_MIDDLE) CMHDZ_DRAW_ITEMS(ciCMHDZ_LANE_MIDDLE) CMHDZ_DRAW_BULLETS_AND_EFFECTS(ciCMHDZ_LANE_MIDDLE) //CMHDZ_DRAW_HOSTAGES(ciCMHDZ_LANE_FOREGROUND) CMHDZ_DRAW_ITEMS(ciCMHDZ_LANE_FOREGROUND) CMHDZ_DRAW_FOREGROUND_ENEMIES() CMHDZ_DRAW_BOSS(ciCMHDZ_LANE_FOREGROUND) CMHDZ_DRAW_THROWN_PLAYER_PROJECTILES(0) CMHDZ_DRAW_COVER(ciCMHDZ_LANE_FOREGROUND) CMHDZ_DRAW_THROWN_ENEMY_PROJECTILES() CMHDZ_DRAW_BULLETS_AND_EFFECTS(ciCMHDZ_LANE_FOREGROUND) CMHDZ_DRAW_GORE_EFFECTS() BOOL bInMenu = FALSE #IF IS_DEBUG_BUILD #IF CMHDZ_CMDLINE_EDITOR_NEW bInMenu = sCMHDZData.sEditor.bPlayStage #ENDIF #ENDIF //UNUSED_PARAMETER(bInMenu) CMHDZ_DRAW_RETICLES(DEFAULT, bInMenu) CMHDZ_DRAW_SHOT_DISTORTION() CMHDZ_DRAW_HUD() TWS_DRAW_FRONT_FX() ENDPROC //------------------------------------------------- // MENU FUNCTIONS //------------------------------------------------- PROC CMHDZ_DRAW_MENU_BACKGROUND() ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), sCMHDZData.rgbaBlack) ENDPROC //PROC CMHDZ_DRAW_LEADERBOARD_BACKGROUND() // CMHDZ_DRAW_FAR_BACKGROUND(FALSE, TRUE) //ENDPROC PROC CMHDZ_DRAW_MENU_LEVELS() FLOAT fFactor = 1.0 TEXT_LABEL_31 tl31Sprite TEXT_LABEL_31 tl31TextDict //FLOAT fStarOffset = 90 INT iNumPlayers = CMHDZ_GET_NUMBER_OF_PLAYERS() INT iLevel CMHDZ_SCORE_INTEGER_TYPE eLeftHandCabScoreType = CMHDZ_SCORE_INTEGER_TYPE_RED_SCORE //Placeholder // CMHDZ_DRAW_GAME_SPRITE_DETAILS(tl31textDict, tl31Sprite, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/8), INIT_VECTOR_2D(328, 52), 0, sCMHDZData.rgbaSprite) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("- LEVEL SELECT -", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/8), DEFAULT, TRUE) //-- Level 1 //tl31Sprite = "CAMHEDZ_LEVEL_SELECT_TEXT" tl31TextDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVLSELECT) tl31Sprite = "LEVEL_01_THUMBNAIL" IF sCMHDZData.bLevelsCompleted[0] tl31Sprite += "_COMPLETED" //tl31TextDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_TITLE) ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(tl31textDict, tl31Sprite, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/10*3, cfBASE_SCREEN_HEIGHT/8*3), INIT_VECTOR_2D(cfCMHDZ_SPRITE_POSTER_MENU_WIDTH*fFactor, cfCMHDZ_SPRITE_POSTER_MENU_HEIGHT*fFactor), 0, sCMHDZData.rgbaSprite) //-- Level 2 tl31TextDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVLSELECT) tl31Sprite = "LEVEL_02_THUMBNAIL" IF sCMHDZData.bLevelsCompleted[1] tl31Sprite += "_COMPLETED" //tl31TextDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_TITLE) ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(tl31textDict, tl31Sprite, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/10*5, cfBASE_SCREEN_HEIGHT/8*3), INIT_VECTOR_2D(cfCMHDZ_SPRITE_POSTER_MENU_WIDTH*fFactor, cfCMHDZ_SPRITE_POSTER_MENU_HEIGHT*fFactor), 0, sCMHDZData.rgbaSprite) //-- Level 3 tl31TextDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVLSELECT) tl31Sprite = "LEVEL_03_THUMBNAIL" IF sCMHDZData.bLevelsCompleted[2] tl31Sprite += "_COMPLETED" //tl31TextDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_TITLE) // ELIF IS_LEVEL_UNLOCKED(CMHDZ_LEVEL_ASYLUM) // tl31Sprite = "LVL03" // ELSE // tl31Sprite = "LVL03_LOCKED" ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(tl31textDict, tl31Sprite, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/10*7, cfBASE_SCREEN_HEIGHT/8*3), INIT_VECTOR_2D(cfCMHDZ_SPRITE_POSTER_MENU_WIDTH*fFactor, cfCMHDZ_SPRITE_POSTER_MENU_HEIGHT*fFactor), 0, sCMHDZData.rgbaSprite) //-- Level 4 tl31TextDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVLSELECT) tl31Sprite = "LEVEL_04_THUMBNAIL" IF sCMHDZData.bLevelsCompleted[3] tl31Sprite += "_COMPLETED" //tl31TextDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_TITLE) // ELIF IS_LEVEL_UNLOCKED(CMHDZ_LEVEL_PARK) // tl31Sprite = "LVL04" // ELSE // tl31Sprite = "LVL04_LOCKED" ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(tl31textDict, tl31Sprite, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/10*4, cfBASE_SCREEN_HEIGHT/8*6), INIT_VECTOR_2D(cfCMHDZ_SPRITE_POSTER_MENU_WIDTH*fFactor, cfCMHDZ_SPRITE_POSTER_MENU_HEIGHT*fFactor), 0, sCMHDZData.rgbaSprite) //-- Level 5 tl31TextDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_LVLSELECT) IF sCMHDZData.bLevelsCompleted[4] tl31Sprite = "LEVEL_05_THUMBNAIL_COMPLETED" //tl31TextDict = CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_TITLE) ELIF IS_LEVEL_UNLOCKED(CMHDZ_LEVEL_SLAUGHTERHOUSE) tl31Sprite = "LEVEL_05_THUMBNAIL" ELSE tl31Sprite = "LEVEL_05_THUMBNAIL_UNCOMPLETED" ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(tl31textDict, tl31Sprite, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/10*6, cfBASE_SCREEN_HEIGHT/8*6), INIT_VECTOR_2D(cfCMHDZ_SPRITE_POSTER_MENU_WIDTH*fFactor, cfCMHDZ_SPRITE_POSTER_MENU_HEIGHT*fFactor), 0, sCMHDZData.rgbaSprite) IF iNumPlayers = 1 //-- 1 PLAYER iLevel = ENUM_TO_INT(CMHDZ_LEVEL_CITY) INT iMyScore = CMHDZ_GET_LOCAL_PLAYER_HI_SCORE_FOR_LEVEL(ilevel) IF iMyScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iMyScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL1_SCORE_X_POS, cfCMHDZ_SOLO_LEVEL1_SCORE_Y_POS), sCMHDZData.rgbaSprite, cfCMHDZ_LEVEL_SCORE_SCALE) // Display a star rating based on overall high scores for each level. CMHDZ_DRAW_STAR_RATING_FOR_STAGE(INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL1_STAR_X_POS, cfCMHDZ_SOLO_LEVEL1_STAR_Y_POS), CMHDZ_LEVEL_CITY) ENDIF iLevel = ENUM_TO_INT(CMHDZ_LEVEL_SCRAPYARD) iMyScore = CMHDZ_GET_LOCAL_PLAYER_HI_SCORE_FOR_LEVEL(ilevel) IF iMyScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iMyScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL2_SCORE_X_POS, cfCMHDZ_SOLO_LEVEL1_SCORE_Y_POS), sCMHDZData.rgbaSprite, cfCMHDZ_LEVEL_SCORE_SCALE) // Display a star rating based on overall high scores for each level. CMHDZ_DRAW_STAR_RATING_FOR_STAGE(INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL2_STAR_X_POS, cfCMHDZ_SOLO_LEVEL1_STAR_Y_POS), CMHDZ_LEVEL_SCRAPYARD) ENDIF iLevel = ENUM_TO_INT(CMHDZ_LEVEL_ASYLUM) iMyScore = CMHDZ_GET_LOCAL_PLAYER_HI_SCORE_FOR_LEVEL(ilevel) IF iMyScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iMyScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL3_SCORE_X_POS, cfCMHDZ_SOLO_LEVEL1_SCORE_Y_POS), sCMHDZData.rgbaSprite, cfCMHDZ_LEVEL_SCORE_SCALE) // Display a star rating based on overall high scores for each level. CMHDZ_DRAW_STAR_RATING_FOR_STAGE(INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL3_STAR_X_POS, cfCMHDZ_SOLO_LEVEL1_STAR_Y_POS), CMHDZ_LEVEL_ASYLUM) ENDIF iLevel = ENUM_TO_INT(CMHDZ_LEVEL_PARK) iMyScore = CMHDZ_GET_LOCAL_PLAYER_HI_SCORE_FOR_LEVEL(ilevel) IF iMyScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iMyScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL4_SCORE_X_POS, cfCMHDZ_SOLO_LEVEL4_SCORE_Y_POS), sCMHDZData.rgbaSprite, cfCMHDZ_LEVEL_SCORE_SCALE) // Display a star rating based on overall high scores for each level. CMHDZ_DRAW_STAR_RATING_FOR_STAGE(INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL4_STAR_X_POS, cfCMHDZ_SOLO_LEVEL4_STAR_Y_POS), CMHDZ_LEVEL_PARK) ENDIF iLevel = ENUM_TO_INT(CMHDZ_LEVEL_SLAUGHTERHOUSE) iMyScore = CMHDZ_GET_LOCAL_PLAYER_HI_SCORE_FOR_LEVEL(ilevel) IF iMyScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iMyScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL5_SCORE_X_POS, cfCMHDZ_SOLO_LEVEL4_SCORE_Y_POS), sCMHDZData.rgbaSprite, cfCMHDZ_LEVEL_SCORE_SCALE) // Display a star rating based on overall high scores for each level. CMHDZ_DRAW_STAR_RATING_FOR_STAGE(INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL5_STAR_X_POS, cfCMHDZ_SOLO_LEVEL4_STAR_Y_POS), CMHDZ_LEVEL_SLAUGHTERHOUSE) ENDIF INT iTotalScore = CMHDZ_GET_LOCAL_PLAYER_HI_SCORE_FOR_ALL_LEVELS() IF iTotalScore > 0 //CMHDZ_DRAW_GAME_SPRITE("FONT", INIT_VECTOR_2D(cfCMHDZ_LEVEL_RED_SCORE_DOLLAR_X_POS, cfCMHDZ_SOLO_LEVEL_SCORE_Y_POS), INIT_VECTOR_2D(cfCMHDZ_MY_HISCORE_DOLLAR_X_SIZE, cfCMHDZ_MY_HISCORE_DOLLAR_Y_SIZE), 0, sCMHDZData.rgbaSprite) CMHDZ_DRAW_DOLLAR_SYMBOL(INIT_VECTOR_2D(cfCMHDZ_LEVEL_RED_SCORE_DOLLAR_X_POS, cfCMHDZ_RED_SCORE_DOLLAR_Y_POS)) CMHDZ_DRAW_SCORE_INTEGER(CMHDZ_GET_LOCAL_PLAYER_HI_SCORE_FOR_ALL_LEVELS(), ciCMHDZ_MAX_SCORE_DIGITS, INIT_VECTOR_2D(cfCMHDZ_LEVEL_RED_HI_SCORE_X_POS, cfCMHDZ_LEVEL_RED_HI_SCORE_Y_POS), sCMHDZData.rgbaSprite) ENDIF ELIF iNumPlayers > 1 //-- 2 PLAYERS iLevel = ENUM_TO_INT(CMHDZ_LEVEL_CITY) INT iRedScore = CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(ENUM_TO_INT(iLevel)) INT iBlueScore = CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(ENUM_TO_INT(iLevel)) eLeftHandCabScoreType = CMHDZ_SCORE_INTEGER_TYPE_RED_SCORE //Red Hi-Score - Level 1 IF iRedScore > iBlueScore AND iRedScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iRedScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL1_SCORE_X_POS,cfCMHDZ_SOLO_LEVEL1_SCORE_Y_POS), CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE_RED_SCORE), cfCMHDZ_LEVEL_SCORE_SCALE) ENDIF //Blue Hi-Score - Level 1 IF iBlueScore > iRedScore AND iBlueScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iBlueScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL1_SCORE_X_POS,cfCMHDZ_SOLO_LEVEL1_SCORE_Y_POS), CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE_BLUE_SCORE), cfCMHDZ_LEVEL_SCORE_SCALE) ENDIF // IF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) > CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) // // Red 'Win' - Level 1 // ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), // "SCORE_TEXT_WIN_GRAPHIC_RED", // INIT_VECTOR_2D(cfCMHDZ_RED_LEVEL1_WIN_X_POS, cfCMHDZ_RED_LEVEL1_WIN_Y_POS), // INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE * cfCMHDZ_LEVEL_SCORE_SCALE, cfCMHDZ_SCORE_WIN_Y_SIZE* cfCMHDZ_LEVEL_SCORE_SCALE), // 0, // sCMHDZData.rgbaSprite) // ELIF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) < CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) // // // Blue 'Win' - Level 1 // // ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), // "SCORE_TEXT_WIN_GRAPHIC_BLUE", // INIT_VECTOR_2D(cfCMHDZ_BLUE_LEVEL1_WIN_X_POS, cfCMHDZ_BLUE_LEVEL1_WIN_Y_POS), // INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE * cfCMHDZ_LEVEL_SCORE_SCALE, cfCMHDZ_SCORE_WIN_Y_SIZE* cfCMHDZ_LEVEL_SCORE_SCALE), // 0, // sCMHDZData.rgbaSprite) // ENDIF iLevel = ENUM_TO_INT(CMHDZ_LEVEL_SCRAPYARD) iRedScore = CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(ENUM_TO_INT(iLevel)) iBlueScore = CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) // Red hi-score - Level 2 IF iRedScore > iBlueScore AND iRedScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iRedScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL2_SCORE_X_POS,cfCMHDZ_SOLO_LEVEL1_SCORE_Y_POS), CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE_RED_SCORE), cfCMHDZ_LEVEL_SCORE_SCALE) ENDIF // Blue hi-score - Level 2 IF iBlueScore > iRedScore AND iBlueScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iBlueScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL2_SCORE_X_POS,cfCMHDZ_SOLO_LEVEL1_SCORE_Y_POS), CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE_BLUE_SCORE), cfCMHDZ_LEVEL_SCORE_SCALE) ENDIF // IF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) > CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) // // Red 'Win' - Level 2 // ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), // "SCORE_TEXT_WIN_GRAPHIC_RED", // INIT_VECTOR_2D(cfCMHDZ_RED_LEVEL2_WIN_X_POS, cfCMHDZ_RED_LEVEL1_WIN_Y_POS), // INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE * cfCMHDZ_LEVEL_SCORE_SCALE, cfCMHDZ_SCORE_WIN_Y_SIZE* cfCMHDZ_LEVEL_SCORE_SCALE), // 0, // sCMHDZData.rgbaSprite) // ELIF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) < CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) // // Blue 'Win' - Level 2 // ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), // "SCORE_TEXT_WIN_GRAPHIC_BLUE", // INIT_VECTOR_2D(cfCMHDZ_BLUE_LEVEL2_WIN_X_POS, cfCMHDZ_BLUE_LEVEL1_WIN_Y_POS), // INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE * cfCMHDZ_LEVEL_SCORE_SCALE, cfCMHDZ_SCORE_WIN_Y_SIZE* cfCMHDZ_LEVEL_SCORE_SCALE), // 0, // sCMHDZData.rgbaSprite) // ENDIF iLevel = ENUM_TO_INT(CMHDZ_LEVEL_ASYLUM) iRedScore = CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(ENUM_TO_INT(iLevel)) iBlueScore = CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) // Red Hi-score - level 3 IF iRedScore > iBlueScore AND iRedScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iRedScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL3_SCORE_X_POS,cfCMHDZ_SOLO_LEVEL1_SCORE_Y_POS), CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE_RED_SCORE), cfCMHDZ_LEVEL_SCORE_SCALE) ENDIF // Blue Hi-score - level 3 IF iBlueScore > iRedScore AND iBlueScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iBlueScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL3_SCORE_X_POS,cfCMHDZ_SOLO_LEVEL1_SCORE_Y_POS), CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE_BLUE_SCORE), cfCMHDZ_LEVEL_SCORE_SCALE) ENDIF // IF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) > CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) // // Red 'Win' - Level 3 // ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), // "SCORE_TEXT_WIN_GRAPHIC_RED", // INIT_VECTOR_2D(cfCMHDZ_RED_LEVEL3_WIN_X_POS, cfCMHDZ_RED_LEVEL1_WIN_Y_POS), // INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE * cfCMHDZ_LEVEL_SCORE_SCALE, cfCMHDZ_SCORE_WIN_Y_SIZE* cfCMHDZ_LEVEL_SCORE_SCALE), // 0, // sCMHDZData.rgbaSprite) // // ELIF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) < CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) // // Blue 'Win' - Level 3 // ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), // "SCORE_TEXT_WIN_GRAPHIC_BLUE", // INIT_VECTOR_2D(cfCMHDZ_BLUE_LEVEL3_WIN_X_POS, cfCMHDZ_BLUE_LEVEL1_WIN_Y_POS), // INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE * cfCMHDZ_LEVEL_SCORE_SCALE, cfCMHDZ_SCORE_WIN_Y_SIZE* cfCMHDZ_LEVEL_SCORE_SCALE), // 0, // sCMHDZData.rgbaSprite) // ENDIF iLevel = ENUM_TO_INT(CMHDZ_LEVEL_PARK) iRedScore = CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(ENUM_TO_INT(iLevel)) iBlueScore = CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) // Red Hi-score - level 4 IF iRedScore > iBlueScore AND iRedScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iRedScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL4_SCORE_X_POS,cfCMHDZ_SOLO_LEVEL4_SCORE_Y_POS), CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE_RED_SCORE), cfCMHDZ_LEVEL_SCORE_SCALE) ENDIF // Blue Hi-score - level 4 IF iBlueScore > iRedScore AND iBlueScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iBlueScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL4_SCORE_X_POS,cfCMHDZ_SOLO_LEVEL4_SCORE_Y_POS), CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE_BLUE_SCORE), cfCMHDZ_LEVEL_SCORE_SCALE) ENDIF // // IF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) > CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) // // Red 'Win' - Level 4 // ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), // "SCORE_TEXT_WIN_GRAPHIC_RED", // INIT_VECTOR_2D(cfCMHDZ_RED_LEVEL4_WIN_X_POS, cfCMHDZ_RED_LEVEL4_WIN_Y_POS), // INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE * cfCMHDZ_LEVEL_SCORE_SCALE, cfCMHDZ_SCORE_WIN_Y_SIZE* cfCMHDZ_LEVEL_SCORE_SCALE), // 0, // sCMHDZData.rgbaSprite) // ELIF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) < CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) // // // Blue 'Win' - Level 4 // ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), // "SCORE_TEXT_WIN_GRAPHIC_BLUE", // INIT_VECTOR_2D(cfCMHDZ_BLUE_LEVEL4_WIN_X_POS, cfCMHDZ_RED_LEVEL4_WIN_Y_POS), // INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE * cfCMHDZ_LEVEL_SCORE_SCALE, cfCMHDZ_SCORE_WIN_Y_SIZE* cfCMHDZ_LEVEL_SCORE_SCALE), // 0, // sCMHDZData.rgbaSprite) // ENDIF iLevel = ENUM_TO_INT(CMHDZ_LEVEL_SLAUGHTERHOUSE) iRedScore = CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(ENUM_TO_INT(iLevel)) iBlueScore = CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) //-- Red Hi-score - level 5 IF iRedScore > iBlueScore AND iRedScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iRedScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL5_SCORE_X_POS,cfCMHDZ_SOLO_LEVEL4_SCORE_Y_POS), CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE_RED_SCORE), cfCMHDZ_LEVEL_SCORE_SCALE) ENDIF //-- Blue Hi-score - level 5 IF iBlueScore > iRedScore AND iBlueScore > 0 CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iBlueScore, INIT_VECTOR_2D(cfCMHDZ_SOLO_LEVEL5_SCORE_X_POS,cfCMHDZ_SOLO_LEVEL4_SCORE_Y_POS), CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE_BLUE_SCORE), cfCMHDZ_LEVEL_SCORE_SCALE) ENDIF // IF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) > CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) // // Red 'Win' - Level 5 // ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), // "SCORE_TEXT_WIN_GRAPHIC_RED", // INIT_VECTOR_2D(cfCMHDZ_RED_LEVEL5_WIN_X_POS, cfCMHDZ_RED_LEVEL4_WIN_Y_POS), // INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE * cfCMHDZ_LEVEL_SCORE_SCALE, cfCMHDZ_SCORE_WIN_Y_SIZE* cfCMHDZ_LEVEL_SCORE_SCALE), // 0, // sCMHDZData.rgbaSprite) // ELIF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) < CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_LEVEL_FROM_HOST(iLevel) // // Blue 'Win' - Level 5 // ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), // "SCORE_TEXT_WIN_GRAPHIC_BLUE", // INIT_VECTOR_2D(cfCMHDZ_BLUE_LEVEL5_WIN_X_POS, cfCMHDZ_RED_LEVEL4_WIN_Y_POS), // INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE * cfCMHDZ_LEVEL_SCORE_SCALE, cfCMHDZ_SCORE_WIN_Y_SIZE* cfCMHDZ_LEVEL_SCORE_SCALE), // 0, // sCMHDZData.rgbaSprite) // ENDIF // 'Red' (1P) Score ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), "FONT_$", INIT_VECTOR_2D(cfCMHDZ_LEVEL_RED_SCORE_DOLLAR_X_POS, cfCMHDZ_LEVEL_RED_SCORE_DOLLAR_Y_POS), INIT_VECTOR_2D(cfCMHDZ_MY_HISCORE_DOLLAR_X_SIZE, cfCMHDZ_MY_HISCORE_DOLLAR_Y_SIZE), 0, CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE_RED_SCORE)) CMHDZ_DRAW_SCORE_INTEGER(CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_ALL_LEVELS_FROM_HOST(), ciCMHDZ_MAX_SCORE_DIGITS, INIT_VECTOR_2D(cfCMHDZ_LEVEL_RED_HI_SCORE_X_POS, cfCMHDZ_LEVEL_RED_HI_SCORE_Y_POS), CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(eLeftHandCabScoreType)) // 'Blue' (2P) Score ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), "FONT_$", INIT_VECTOR_2D(cfCMHDZ_LEVEL_BLUE_SCORE_DOLLAR_X_POS, cfCMHDZ_LEVEL_BLUE_SCORE_DOLLAR_Y_POS), INIT_VECTOR_2D(cfCMHDZ_MY_HISCORE_DOLLAR_X_SIZE, cfCMHDZ_MY_HISCORE_DOLLAR_Y_SIZE), 0, CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE_BLUE_SCORE)) CMHDZ_DRAW_SCORE_INTEGER(CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_ALL_LEVELS_FROM_HOST(), ciCMHDZ_MAX_SCORE_DIGITS, INIT_VECTOR_2D(cfCMHDZ_LEVEL_BLUE_HI_SCORE_X_POS, cfCMHDZ_LEVEL_BLUE_HI_SCORE_Y_POS), CMHDZ_GET_SCORE_COLOUR_FROM_TYPE(CMHDZ_SCORE_INTEGER_TYPE_BLUE_SCORE)) // IF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_ALL_LEVELS_FROM_HOST() > CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_ALL_LEVELS_FROM_HOST() // // // Red 'Win' // ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), "SCORE_TEXT_WIN_GRAPHIC_RED", INIT_VECTOR_2D(cfCMHDZ_LEVEL_SCORE_WIN_RED_X_POS, cfCMHDZ_LEVEL_SCORE_WIN_RED_Y_POS), INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE, cfCMHDZ_SCORE_WIN_Y_SIZE), 0, sCMHDZData.rgbaSprite) // ELIF CMHDZ_GET_RED_PLAYER_HI_SCORE_FOR_ALL_LEVELS_FROM_HOST() < CMHDZ_GET_BLUE_PLAYER_HI_SCORE_FOR_ALL_LEVELS_FROM_HOST() // // // Blue 'Win' // ARCADE_DRAW_PIXELSPACE_SPRITE(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_VHSFONT), "SCORE_TEXT_WIN_GRAPHIC_BLUE", INIT_VECTOR_2D(cfCMHDZ_LEVEL_SCORE_WIN_BLUE_X_POS, cfCMHDZ_LEVEL_SCORE_WIN_BLUE_Y_POS), INIT_VECTOR_2D(cfCMHDZ_SCORE_WIN_X_SIZE, cfCMHDZ_SCORE_WIN_Y_SIZE), 0, sCMHDZData.rgbaSprite) // ENDIF ENDIF //ENDIF ENDPROC PROC CMHDZ_DRAW_CLIENT_STATE_MENU() // IF sCMHDZData.fSyncOffsetY > 0.0 // sCMHDZData.fSyncOffsetY -= (0.0+@GET_RANDOM_FLOAT_IN_RANGE(2500.0,4000.0)) // ELSE // sCMHDZData.fSyncOffsetY = 0.0 // ENDIF CMHDZ_DRAW_MENU_BACKGROUND() CMHDZ_DRAW_MENU_LEVELS() CMHDZ_DRAW_BULLETS_AND_EFFECTS(1) CMHDZ_DRAW_RETICLES(DEFAULT, TRUE) TWS_DRAW_FRONT_FX() ENDPROC //------------------------------------------------- // TITLE SCREEN FUNCTIONS //------------------------------------------------- PROC CMHDZ_DRAW_TITLE_SCREEN_ELEMENTS() BOOL bHighlight // // CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_TITLES), "CAMHEDZ_TITLE_SCREEN_LOGO", // INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, (cfBASE_SCREEN_HEIGHT/2)+100), INIT_VECTOR_2D(908, 316), 0, sCMHDZData.rgbaSprite) CMHDZ_DRAW_MENU_BACKGROUND() CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_TITLES), "CAMHEDZ_TITLE_SCREEN_CHARACTER", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, (cfBASE_SCREEN_HEIGHT/2)), INIT_VECTOR_2D(782, 1080), 0, sCMHDZData.rgbaSprite) // Draw the looping Bink for the title screen. // FLOAT fRatioWidth = 1.0 * GET_ASPECT_RATIO_MODIFIER_FROM_ASPECT_RATIO() // FLOAT fRatioHeight = 1.0 // IF GET_BINK_MOVIE_TIME(sCMHDZData.bmIdCmhdzIntro) > 99.5 // SET_BINK_MOVIE_TIME(sCMHDZData.bmIdCmhdzIntro, 99.5) // ENDIF //DRAW_BINK_MOVIE(sCMHDZData.bmIdCmhdzIntro, cfSCREEN_CENTER, cfSCREEN_CENTER, fRatioWidth, fRatioHeight, 0.0, 255,255,255,255) CMHDZ_DRAW_MENU_BACKGROUND() CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_TITLES), "CAMHEDZ_TITLE_SCREEN_CHARACTER", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, (cfBASE_SCREEN_HEIGHT/2)), INIT_VECTOR_2D(782, 1080), 0, sCMHDZData.rgbaSprite) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_TITLES), "CAMHEDZ_TITLE_SCREEN_PIXTRO_LOGO", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, (cfBASE_SCREEN_HEIGHT/2)+388), INIT_VECTOR_2D(200, 44), 0, sCMHDZData.rgbaSprite) IF CMHDZ_IS_POSITION_OVER_MENU_OPTION(sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos, CMHDZ_START) bHighlight = TRUE ENDIF //CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_TITLE), "CAMHEDZ_TITLE_SCREEN_START_GAME_BUTTON", sCMHDZData.sMenuOptionsData[CMHDZ_START].vSpritePos, sCMHDZData.sMenuOptionsData[CMHDZ_START].vSize, 0, sCMHDZData.rgbaSprite) //IF NOT IF bHighlight CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("START", sCMHDZData.sMenuOptionsData[CMHDZ_START].vSpritePos, DEFAULT, TRUE, DEFAULT, sCMHDZData.rgbaYellow.iR, sCMHDZData.rgbaYellow.iG, sCMHDZData.rgbaYellow.iB, sCMHDZData.rgbaYellow.iA) ELSE CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("START", sCMHDZData.sMenuOptionsData[CMHDZ_START].vSpritePos, DEFAULT, TRUE, DEFAULT, sCMHDZData.rgbaWhite.iR, sCMHDZData.rgbaWhite.iG, sCMHDZData.rgbaWhite.iB, sCMHDZData.rgbaWhite.iA) ENDIF bHighlight = FALSE IF NOT sCMHDZData.bSkipLeaderboard IF CMHDZ_IS_POSITION_OVER_MENU_OPTION(sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos, CMHDZ_SCORES) bHighlight = TRUE ENDIF IF bHighlight CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("LEADERBOARD", sCMHDZData.sMenuOptionsData[CMHDZ_SCORES].vSpritePos, DEFAULT, TRUE, DEFAULT, sCMHDZData.rgbaYellow.iR, sCMHDZData.rgbaYellow.iG, sCMHDZData.rgbaYellow.iB, sCMHDZData.rgbaYellow.iA) ELSE CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("LEADERBOARD", sCMHDZData.sMenuOptionsData[CMHDZ_SCORES].vSpritePos, DEFAULT, TRUE, DEFAULT, sCMHDZData.rgbaWhite.iR, sCMHDZData.rgbaWhite.iG, sCMHDZData.rgbaWhite.iB, sCMHDZData.rgbaWhite.iA) ENDIF ENDIF // tl31Sprite = "PIXTRO_LOGO" // CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_TITLE), tl31Sprite, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/6*5 + 60), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_PIXTRO_LOGO_WIDTH, cfCMHDZ_SPRITE_HUD_PIXTRO_LOGO_HEIGHT), 0, sCMHDZData.rgbaSprite) #IF IS_DEBUG_BUILD // #ENDIF ENDPROC PROC CMHDZ_DRAW_CLIENT_STATE_TITLE_SCREEN() CMHDZ_DRAW_TITLE_SCREEN_ELEMENTS() CMHDZ_DRAW_BULLETS_AND_EFFECTS(1) CMHDZ_DRAW_RETICLES(DEFAULT, TRUE) TWS_DRAW_FRONT_FX() //CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("HELLO WORLD!", INIT_VECTOR_2D(1000, 700), 2, DEFAULT, 1) ENDPROC //=========================================================== // NEW REWIND SYSTEM //=========================================================== PROC CMHDZ_REWIND_GET_REWIND_ANIMATION(TEXT_LABEL_63 &sRewindFrame) sRewindFrame = "CMHDZ_REWIND_FRAME_" SWITCH sCMHDZData.eCurrentLevel CASE CMHDZ_LEVEL_CITY sRewindFrame += "CITY" BREAK CASE CMHDZ_LEVEL_SCRAPYARD sRewindFrame += "SCRAPYARD" BREAK CASE CMHDZ_LEVEL_ASYLUM sRewindFrame += "ASYLUM" BREAK CASE CMHDZ_LEVEL_PARK sRewindFrame += "THEMEPARK" BREAK CASE CMHDZ_LEVEL_SLAUGHTERHOUSE sRewindFrame += "SLAUGHTERHOUSE" BREAK ENDSWITCH ENDPROC FUNC BOOL CMHDZ_IS_REWIND_SEQUENCE_FINISHED() TEXT_LABEL_63 tl63RewindFrame sCMHDZData.iTimer += CEIL(0.0+@1000) CMHDZ_REWIND_GET_REWIND_ANIMATION(tl63RewindFrame) RGBA_COLOUR_STRUCT rgbaRandomisedColour INIT_RGBA_STRUCT(rgbaRandomisedColour, GET_RANDOM_INT_IN_RANGE(240,255), GET_RANDOM_INT_IN_RANGE(240,255), GET_RANDOM_INT_IN_RANGE(240,255)) //SCRIPT_ASSERT(CMHDZ_GET_TEXTURE_DICTIONARY_FOR_LEVEL(sCMHDZData.eCurrentLevel)) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICTIONARY_FOR_LEVEL(sCMHDZData.eCurrentLevel), tl63RewindFrame, INIT_VECTOR_2D((cfBASE_SCREEN_WIDTH/2.0) + sCMHDZData.fSyncOffsetX, cfBASE_SCREEN_HEIGHT/2.0), INIT_VECTOR_2D(2048, 944), 0.0, rgbaRandomisedColour) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICTIONARY_FOR_LEVEL(sCMHDZData.eCurrentLevel), tl63RewindFrame, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2.0 + (sCMHDZData.fSyncOffsetX - 2048), cfBASE_SCREEN_HEIGHT/2.0), INIT_VECTOR_2D(2048, 944), 0.0, rgbaRandomisedColour) //CMHDZ_DRAW_HEAVY_DAMAGE_EFFECT() CMHDZ_DRAW_REWIND_EFFECT() // Blink rewind IF (sCMHDZData.iTimer%500) < 250 // Rewind symbol appears on screen CMHDZ_DRAW_REWIND_SYMBOL() ENDIF CMHDZ_DRAW_DAMAGE_NOISE(100) IF sCMHDZData.iTimer < 1850 sCMHDZData.fSyncOffsetX += (0.0+@4000) IF (sCMHDZData.fSyncOffsetX >= 2048) sCMHDZData.fSyncOffsetX = 0.0 ENDIF sCMHDZData.fSyncOffsetY = GET_RANDOM_FLOAT_IN_RANGE(30,90) ELSE sCMHDZData.iTimer = 0 // Reset timer sCMHDZData.fSyncOffsetX = 0.0 sCMHDZData.fSyncOffsetY = 0.0 RETURN TRUE ENDIF RETURN FALSE ENDFUNC //------------------------------------------------- // GAME OVER FUNCTIONS //------------------------------------------------- PROC CMHDZ_DRAW_GAME_OVER_SCREEN() BOOL bHighlight RGBA_COLOUR_STRUCT col DRAW_RECT(0.5, 0.5, 1.0, 1.0, 0, 0, 0, 255) CMHDZ_DRAW_GAME_OVER_EFFECT() CMHDZ_DRAW_PLAYER_HEALTH_BAR() TEXT_LABEL_15 sSubtitles SWITCH (sCMHDZData.eResultState) CASE CMHDZ_RESULT_SCREEN_STATE_INIT sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos = INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/3, cfBASE_SCREEN_HEIGHT/3) //CMHDZ_REPLAY_SYSTEM_STOP_RECORDING() CMHDZ_SET_RESULT_SCREEN_STATE(CMHDZ_RESULT_SCREEN_STATE_DEAD_SCREEN) // Display the subtitle if language isn't English IF GET_CURRENT_LANGUAGE() != LANGUAGE_ENGLISH sSubtitles = "CMHDZ_LVD1" SWITCH sCMHDZData.eCurrentLevel CASE CMHDZ_LEVEL_CITY sSubtitles = "CMHDZ_LVD1" BREAK CASE CMHDZ_LEVEL_SCRAPYARD sSubtitles = "CMHDZ_LVD2" BREAK CASE CMHDZ_LEVEL_ASYLUM sSubtitles = "CMHDZ_LVD3" BREAK CASE CMHDZ_LEVEL_PARK sSubtitles = "CMHDZ_LVD4" BREAK CASE CMHDZ_LEVEL_SLAUGHTERHOUSE sSubtitles = "CMHDZ_LVD5" BREAK ENDSWITCH PRINT_NOW(sSubtitles, 8000, 1) ENDIF BREAK CASE CMHDZ_RESULT_SCREEN_STATE_DEAD_SCREEN ARCADE_GAMES_HELP_TEXT_PRINT_FOREVER(ARCADE_GAMES_HELP_TEXT_ENUM_CMHDZ_HELP_MENU) CMHDZ_DRAW_SIGNAL_FAILURE_TEXT()//, sCMHDZData.rgbaWhite) col = sCMHDZData.rgbaYellow bHighlight = CMHDZ_IS_POSITION_OVER_MENU_OPTION(sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos, CMHDZ_REWIND) IF NOT bHighlight col = sCMHDZData.rgbaWhite // ELSE // Draw the symbol // posX = 600.0 // CMHDZ_DRAW_SELECT_SYMBOL(INIT_VECTOR_2D(posX, sCMHDZData.sMenuOptionsData[CMHDZ_REWIND].vSpritePos.y + 12)) ENDIF CMHDZ_DRAW_REWIND_OPTION_TEXT(sCMHDZData.sMenuOptionsData[CMHDZ_REWIND].vSpritePos, col) col = sCMHDZData.rgbaYellow bHighlight = CMHDZ_IS_POSITION_OVER_MENU_OPTION(sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos, CMHDZ_EJECT) IF NOT bHighlight col = sCMHDZData.rgbaWhite // ELSE // posX = 600.0 // CMHDZ_DRAW_SELECT_SYMBOL(INIT_VECTOR_2D(posX, sCMHDZData.sMenuOptionsData[CMHDZ_EJECT].vSpritePos.y + 12)) ENDIF CMHDZ_DRAW_EJECT_OPTION_TEXT(sCMHDZData.sMenuOptionsData[CMHDZ_EJECT].vSpritePos, col) CMHDZ_DRAW_RETICLES(TRUE, TRUE) BREAK CASE CMHDZ_RESULT_SCREEN_STATE_START_REWIND ARCADE_GAMES_HELP_TEXT_CLEAR() CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_REWIND_START) CMHDZ_PLAY_SOUND_LOOPING_NO_POSITION(CMHDZ_AUDIO_EFFECT_REWIND_LOOP) sCMHDZData.iTimer = 0 CMHDZ_SET_RESULT_SCREEN_STATE(CMHDZ_RESULT_SCREEN_STATE_REWIND) BREAK CASE CMHDZ_RESULT_SCREEN_STATE_REWIND IF CMHDZ_IS_REWIND_SEQUENCE_FINISHED() sCMHDZData.fBackgroundSpeedMult = 0.0 CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Restart_Level) CMHDZ_STOP_SOUND(CMHDZ_AUDIO_EFFECT_REWIND_LOOP) CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_REWIND_STOP) CMHDZ_SET_RESULT_SCREEN_STATE(CMHDZ_RESULT_SCREEN_STATE_COMPLETE) ELSE sCMHDZData.fBackgroundSpeedMult = 8.0 ENDIF //CMHDZ_DRAW_BACKGROUND(TRUE) //CMHDZ_REPLAY_SYSTEM_DRAW() BREAK CASE CMHDZ_RESULT_SCREEN_STATE_GOTO_LEADERBOARD ARCADE_GAMES_HELP_TEXT_CLEAR() sCMHDZData.fBackgroundSpeedMult = 1.0 //CMHDZ_REPLAY_SYSTEM_RESET() BREAK ENDSWITCH ENDPROC PROC CMHDZ_DRAW_CLIENT_STATE_GAME_OVER() CMHDZ_DRAW_MENU_BACKGROUND() CMHDZ_DRAW_GAME_OVER_SCREEN() TWS_DRAW_FRONT_FX() ENDPROC PROC CMHDZ_DRAW_RESULT_SCREEN_ELEMENTS(BOOL bDoOutro) TEXT_LABEL_31 tl31Sprite INT iScore INT iAccuracy INT iAccuracyBonus INT iLevel = CMHDZ_GET_CURRENT_LEVEL_AS_INT() BOOL bShouldShowScore = TRUE BOOL bShouldShowAccuracy = FALSE BOOL bPlayerDead IF CMHDZ_GET_LOCAL_PLAYER_HEALTH() <= 0.0 bPlayerDead = TRUE ENDIF IF sCMHDZData.iResultsScreenTimer = 0 sCMHDZData.iResultsScreenTimer = GET_GAME_TIMER() ENDIF IF NOT bPlayerDead IF GET_GAME_TIMER() - sCMHDZData.iResultsScreenTimer > 1500 bShouldShowAccuracy = TRUE // NEEDS TO TAKE INTO ACCOUNT ANIMALS SHOT //iAccuracy = ROUND(100.0 * (TO_FLOAT(CMHDZ_GET_TOTAL_ENEMY_HITS_FOR_CURRENT_LEVEL()) / TO_FLOAT(CMHDZ_GET_TOTAL_SHOTS_FIRED_IN_CURRENT_LEVEL()))) iAccuracy = ROUND(CMHDZ_GET_PLAYER_ACCURACY_FOR_CURRENT_LEVEL()) IF iAccuracy > 100 iAccuracy = 100 ENDIF IF NOT CMHDZ_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_ADDED_ON_ACCURACY_BONUS) //-- Accuracy bonus is accuracy * level score iAccuracyBonus = ROUND(TO_FLOAT(playerBd[PARTICIPANT_ID_TO_INT()].iPlayerScore[iLevel]) * (TO_FLOAT(iAccuracy) / 100.0)) playerBd[PARTICIPANT_ID_TO_INT()].iPlayerScore[iLevel] += iAccuracyBonus //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_RESULT_SCREEN_ELEMENTS] {DSW} Accuracy Bonus: ", iAccuracyBonus) //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_RESULT_SCREEN_ELEMENTS] {DSW} New score: ", playerBd[PARTICIPANT_ID_TO_INT()].iPlayerScore[iLevel]) IF playerBd[PARTICIPANT_ID_TO_INT()].iPlayerHiScore[iLevel] < playerBd[PARTICIPANT_ID_TO_INT()].iPlayerScore[iLevel] playerBd[PARTICIPANT_ID_TO_INT()].iPlayerHiScore[iLevel] = playerBd[PARTICIPANT_ID_TO_INT()].iPlayerScore[iLevel] //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_RESULT_SCREEN_ELEMENTS] {DSW} New Hi-score: ", playerBd[PARTICIPANT_ID_TO_INT()].iPlayerHiScore[iLevel]) ENDIF CMHDZ_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_ADDED_ON_ACCURACY_BONUS) ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD BOOL bDoOutroDebug = FALSE #ENDIF //bDoOutro = TRUE IF bDoOutro #IF IS_DEBUG_BUILD OR bDoOutroDebug #ENDIF //-- Bearsy tl31Sprite = "BEARSY_DEAD_STATE" CMHDZ_DRAW_GAME_SPRITE_DETAILS( CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_TITLE), tl31Sprite, INIT_VECTOR_2D(cfCMHDZ_SPRITE_FINAL_SCENE_POSTER_X, cfCMHDZ_SPRITE_FINAL_SCENE_POSTER_Y), //INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/6*2, (cfBASE_SCREEN_HEIGHT/3*2)-100), INIT_VECTOR_2D(cfCMHDZ_SPRITE_FINAL_SCENE_POSTER_WIDTH, cfCMHDZ_SPRITE_FINAL_SCENE_POSTER_HEIGHT), 0, sCMHDZData.rgbaSprite) // --- Level complete text tl31Sprite = "LEVEL_0" tl31Sprite += ENUM_TO_INT(sCMHDZData.eCurrentLevel)+1 tl31Sprite += "_OUTRO_WIN" VECTOR_2D vec = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_RESULT_TEXT_WIDTH, cfCMHDZ_SPRITE_HUD_RESULT_TEXT_HEIGHT) SWITCH (ENUM_TO_INT(sCMHDZData.eCurrentLevel)+1) CASE 1 vec = INIT_VECTOR_2D(376, 76) BREAK CASE 2 vec = INIT_VECTOR_2D(436, 104) BREAK CASE 3 vec = INIT_VECTOR_2D(324, 104) BREAK CASE 4 vec = INIT_VECTOR_2D(400, 104) BREAK CASE 5 vec = INIT_VECTOR_2D(580, 104) BREAK ENDSWITCH CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_RESULTS), tl31Sprite, INIT_VECTOR_2D(cfCMHDZ_SPRITE_FINAL_SCENE_TEXT_X, cfCMHDZ_SPRITE_FINAL_SCENE_TEXT_Y), vec, 0, sCMHDZData.rgbaSprite) // --- Level complete Thumbnail tl31Sprite = "LEVEL_0" tl31Sprite += ENUM_TO_INT(sCMHDZData.eCurrentLevel)+1 tl31Sprite += "_THUMBNAIL_COMPLETED" CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_TITLE), tl31Sprite, INIT_VECTOR_2D((cfBASE_SCREEN_WIDTH/6*2)-8, (cfBASE_SCREEN_HEIGHT/2)-20), INIT_VECTOR_2D(cfCMHDZ_SPRITE_POSTER_MENU_WIDTH, cfCMHDZ_SPRITE_POSTER_MENU_HEIGHT), 0, sCMHDZData.rgbaSprite) IF bShouldShowScore //-- Score // tl31Sprite = "SCORE_SCREEN_TEXT_01" // CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_RESULTS), // tl31Sprite, // INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_SCORE_POS_X, cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_SCORE_POS_Y), // INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_SIZE_X, cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_SIZE_Y), // 0, sCMHDZData.rgbaSprite) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("SCORE", INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_SCORE_POS_X, cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_SCORE_POS_Y), DEFAULT, DEFAULT, DEFAULT, sCMHDZData.rgbaYellow.iR, sCMHDZData.rgbaYellow.iG, sCMHDZData.rgbaYellow.iB, sCMHDZData.rgbaYellow.iA) //CMHDZ_DRAW_DOLLAR_SYMBOL(INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_SCORE_DOLLAR_POS_X, cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_SCORE_DOLLAR_POS_Y)) iScore = CMHDZ_GET_LOCAL_PLAYER_TOTAL_SCORE() CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iScore, INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_SCORE_VAL_POS_X, cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_SCORE_POS_Y), sCMHDZData.rgbaSprite, 1) IF NOT CMHDZ_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_PLAYED_RESULTS_SCORE_AUDIO) CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_RESULTS_SCORE_UPDATE) CMHDZ_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_PLAYED_RESULTS_SCORE_AUDIO) ENDIF ENDIF IF bShouldShowAccuracy //-- Accuracy // tl31Sprite = "SCORE_SCREEN_TEXT_02" // // INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_POS_X, cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_POS_Y) // CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_RESULTS), tl31Sprite, INIT_VECTOR_2D(cfCMHDZ_RESULTS_GAME_SCREEN_COMPLETE_ACCURACY_POS_X, cfCMHDZ_RESULTS_GAME_SCREEN_COMPLETE_ACCURACY_POS_Y), INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_SIZE_X, cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_SIZE_Y), 0, sCMHDZData.rgbaSprite) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("ACCURACY", INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_ACCURACY_POS_X, cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_ACCURACY_POS_Y), DEFAULT, DEFAULT, DEFAULT, sCMHDZData.rgbaYellow.iR, sCMHDZData.rgbaYellow.iG, sCMHDZData.rgbaYellow.iB, sCMHDZData.rgbaYellow.iA) //CMHDZ_DRAW_SCORE_INTEGER_WITH_PERCENTAGE( CMHDZ_DRAW_SCORE_INTEGER_CENTER_LEFT_MOST(iAccuracy, INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_ACCURACY_VAL_POS_X, cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_ACCURACY_POS_Y), sCMHDZData.rgbaSprite, 1, DEFAULT, TRUE)//, TRUE) //CMHDZ_DRAW_STAR_RATING_FOR_STAGE(INIT_VECTOR_2D(cfCMHDZ_SOLO_GAME_RESULTS_STAR_X_POS, cfCMHDZ_SOLO_GAME_RESULTS_STAR_Y_POS), sCMHDZData.eCurrentLevel) CMHDZ_DRAW_STAR_RATING_RESULTS_FOR_STAGE(INIT_VECTOR_2D(cfCMHDZ_SOLO_GAME_RESULTS_STAR_X_POS, cfCMHDZ_SOLO_GAME_RESULTS_STAR_Y_POS), sCMHDZData.eCurrentLevel, 48) IF NOT CMHDZ_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_PLAYED_ACCURACY_SCORE_AUDIO) CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_RESULTS_SCORE_UPDATE) SWITCH (ROUND(playerBd[PARTICIPANT_ID_TO_INT()].fPlayerStarRating[sCMHDZData.eCurrentLevel])) CASE 0 CASE 1 CASE 2 CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PLAYER_SCORE_BAD) BREAK CASE 3 CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PLAYER_SCORE_AVERAGE) BREAK CASE 4 CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PLAYER_SCORE_GOOD) BREAK CASE 5 CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PLAYER_SCORE_AMAZING) BREAK ENDSWITCH CMHDZ_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_PLAYED_ACCURACY_SCORE_AUDIO) ENDIF ENDIF // Regular stage clear data ELIF NOT bPlayerDead tl31Sprite = "LEVEL_0" tl31Sprite += ENUM_TO_INT(sCMHDZData.eCurrentLevel)+1 tl31Sprite += "_THUMBNAIL_COMPLETED" CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_TITLE), tl31Sprite, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/6*2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfCMHDZ_SPRITE_POSTER_MENU_WIDTH, cfCMHDZ_SPRITE_POSTER_MENU_HEIGHT), 0, sCMHDZData.rgbaSprite) tl31Sprite = "LEVEL_0" tl31Sprite += ENUM_TO_INT(sCMHDZData.eCurrentLevel)+1 tl31Sprite += "_OUTRO_WIN" VECTOR_2D vec = INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_RESULT_TEXT_WIDTH, cfCMHDZ_SPRITE_HUD_RESULT_TEXT_HEIGHT) SWITCH (ENUM_TO_INT(sCMHDZData.eCurrentLevel)+1) CASE 1 vec = INIT_VECTOR_2D(376, 76) BREAK CASE 2 vec = INIT_VECTOR_2D(436, 104) BREAK CASE 3 vec = INIT_VECTOR_2D(324, 104) BREAK CASE 4 vec = INIT_VECTOR_2D(400, 104) BREAK CASE 5 vec = INIT_VECTOR_2D(580, 104) BREAK ENDSWITCH CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_RESULTS), tl31Sprite, INIT_VECTOR_2D((cfBASE_SCREEN_WIDTH/8*4)+152, (cfBASE_SCREEN_HEIGHT/3)+57), vec, 0, sCMHDZData.rgbaSprite) IF bShouldShowScore //-- Score // tl31Sprite = "SCORE_SCREEN_TEXT_01" // CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_RESULTS), tl31Sprite, INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_POS_X, cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_POS_Y), INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_SIZE_X, cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_SIZE_Y), 0, sCMHDZData.rgbaSprite) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("SCORE", INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_POS_X, cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_POS_Y), DEFAULT, DEFAULT, DEFAULT, sCMHDZData.rgbaYellow.iR, sCMHDZData.rgbaYellow.iG, sCMHDZData.rgbaYellow.iB, sCMHDZData.rgbaYellow.iA) //CMHDZ_DRAW_DOLLAR_SYMBOL(INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_DOLLAR_POS_X, cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_VAL_POS_Y)) iScore = CMHDZ_GET_LOCAL_PLAYER_SCORE_FOR_LEVEL(CMHDZ_GET_CURRENT_LEVEL_AS_INT()) CMHDZ_DRAW_SCORE_INTEGER_WITH_DOLLAR(iScore, INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_VAL_POS_X, cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_VAL_POS_Y), sCMHDZData.rgbaSprite, 1) IF NOT CMHDZ_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_PLAYED_RESULTS_SCORE_AUDIO) CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_RESULTS_SCORE_UPDATE) CMHDZ_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_PLAYED_RESULTS_SCORE_AUDIO) ENDIF ENDIF IF bShouldShowAccuracy //-- Accuracy // tl31Sprite = "SCORE_SCREEN_TEXT_02" // CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_RESULTS), tl31Sprite, INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_POS_X, cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_POS_Y), INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_SIZE_X, cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_SIZE_Y), 0, sCMHDZData.rgbaSprite) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("ACCURACY", INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_POS_X, cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_POS_Y), DEFAULT, DEFAULT, DEFAULT, sCMHDZData.rgbaYellow.iR, sCMHDZData.rgbaYellow.iG, sCMHDZData.rgbaYellow.iB, sCMHDZData.rgbaYellow.iA) // //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_DRAW_RESULT_SCREEN_ELEMENTS] iAccuracy: ", iAccuracy) CMHDZ_DRAW_SCORE_INTEGER_CENTER_LEFT_MOST(iAccuracy, INIT_VECTOR_2D(cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_VAL_POS_X, cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_VAL_POS_Y), sCMHDZData.rgbaSprite, 1, DEFAULT, TRUE)//, TRUE) //CMHDZ_DRAW_STAR_RATING_FOR_STAGE(INIT_VECTOR_2D(cfCMHDZ_SOLO_RESULTS_STAR_X_POS, cfCMHDZ_SOLO_RESULTS_STAR_Y_POS), sCMHDZData.eCurrentLevel) CMHDZ_DRAW_STAR_RATING_RESULTS_FOR_STAGE(INIT_VECTOR_2D(cfCMHDZ_SOLO_RESULTS_STAR_X_POS, cfCMHDZ_SOLO_RESULTS_STAR_Y_POS), sCMHDZData.eCurrentLevel, 48) IF NOT CMHDZ_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_PLAYED_ACCURACY_SCORE_AUDIO) CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_RESULTS_SCORE_UPDATE) CMHDZ_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_PLAYED_ACCURACY_SCORE_AUDIO) ENDIF ENDIF ENDIF ENDPROC PROC CMHDZ_DRAW_CLIENT_STATE_RESULT_SCREEN(BOOL bDoOutro) CMHDZ_DRAW_MENU_BACKGROUND() CMHDZ_DRAW_RESULT_SCREEN_ELEMENTS(bDoOutro) TWS_DRAW_FRONT_FX() ENDPROC //------------------------------------------------- // DEBUG FUNCTIONS //------------------------------------------------- #IF IS_DEBUG_BUILD #IF CMHDZ_CMDLINE_EDITOR_NEW //FUNC CMHDZ_SPRITE CMHDZ_DEBUG_GET_SPRITE_FOR_HOSTAGE_TYPE(CMHDZ_HOSTAGE_TYPES eType) // CMHDZ_SPRITE eSprite // // SWITCH eType // CASE CMHDZ_HOSTAGE_GIRL // eSprite = CMHDZ_SPRITE_HOSTAGE11 // BREAK // CASE CMHDZ_HOSTAGE_GUY // eSprite = CMHDZ_SPRITE_HOSTAGE21 // BREAK // CASE CMHDZ_HOSTAGE_EAGLE // eSprite = CMHDZ_SPRITE_EAGLE1 // BREAK // CASE CMHDZ_HOSTAGE_VULTURE // eSprite = CMHDZ_SPRITE_VULTURE_01 // BREAK // CASE CMHDZ_HOSTAGE_BAT // eSprite = CMHDZ_SPRITE_BAT_01 // BREAK // CASE CMHDZ_HOSTAGE_SCORPION // eSprite = CMHDZ_SPRITE_ANIMALBONUS_SCORPION_01 // BREAK // CASE CMHDZ_HOSTAGE_MOUSE // eSprite = CMHDZ_SPRITE_ANIMALBONUS_RAT_01 // BREAK // ENDSWITCH // // RETURN eSprite //ENDFUNC FUNC CMHDZ_SPRITE CMHDZ_DEBUG_GET_SPRITE_FOR_ENEMY_TYPE(CMHDZ_ENEMY_TYPES eType) CMHDZ_SPRITE eSprite SWITCH eType CASE CMHDZ_ENEMY_1 eSprite = CMHDZ_SPRITE_GANG_01_ATTACKING BREAK CASE CMHDZ_ENEMY_2 eSprite = CMHDZ_SPRITE_GANG_02_ATTACKING BREAK CASE CMHDZ_ENEMY_3 eSprite = CMHDZ_SPRITE_GANG_03_ATTACKING BREAK CASE CMHDZ_ENEMY_4 eSprite = CMHDZ_SPRITE_GANG_04_ATTACKING BREAK CASE CMHDZ_ENEMY_5 eSprite = CMHDZ_SPRITE_GANG_05_ATTACKING BREAK // CASE CMHDZ_CART_1 // eSprite = CMHDZ_SPRITE_CART1 // BREAK CASE CMHDZ_THROWING_ENEMY_1 eSprite = CMHDZ_SPRITE_GANG_01_THROWING_04 BREAK CASE CMHDZ_THROWING_ENEMY_2 eSprite = CMHDZ_SPRITE_GANG_02_THROWING_04 BREAK CASE CMHDZ_THROWING_ENEMY_3 eSprite = CMHDZ_SPRITE_GANG_03_THROWING_04 BREAK CASE CMHDZ_THROWING_ENEMY_4 eSprite = CMHDZ_SPRITE_GANG_04_THROWING_04 BREAK CASE CMHDZ_THROWING_ENEMY_5 eSprite = CMHDZ_SPRITE_GANG_05_THROWING_04 BREAK CASE CMHDZ_FOREGROUND_ENEMY_T1_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_01_A BREAK CASE CMHDZ_FOREGROUND_ENEMY_T1_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_01_B BREAK CASE CMHDZ_FOREGROUND_ENEMY_T2_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_02_A BREAK CASE CMHDZ_FOREGROUND_ENEMY_T2_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_02_B BREAK CASE CMHDZ_FOREGROUND_ENEMY_T3_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_03_A BREAK CASE CMHDZ_FOREGROUND_ENEMY_T3_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_03_B BREAK CASE CMHDZ_FOREGROUND_ENEMY_T4_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_04_A BREAK CASE CMHDZ_FOREGROUND_ENEMY_T4_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_04_B BREAK CASE CMHDZ_FOREGROUND_ENEMY_T5_1 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_05_A BREAK CASE CMHDZ_FOREGROUND_ENEMY_T5_2 eSprite = CMHDZ_SPRITE_FOREGROUND_ENEMY_05_B BREAK // CASE CMHDZ_FOREGROUND_ENEMY_BEAR // eSprite = CMHDZ_SPRITE_LEVEL_03_FOREST_BEAR_01 // BREAK ENDSWITCH RETURN eSprite ENDFUNC PROC CMHDZ_DRAW_DEBUG_LINE(VECTOR_2D pos1, VECTOR_2D pos2, RGBA_COLOUR_STRUCT rgba) pos1 = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_SCREENSPACE(pos1) pos2 = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_SCREENSPACE(pos2) DRAW_DEBUG_LINE_2D_FROM_VECTOR_2D(pos1, pos2, rgba) ENDPROC PROC CMHDZ_DRAW_DEBUG_BOX(VECTOR_2D vPoint, VECTOR_2D vSize, RGBA_COLOUR_STRUCT col) VECTOR_2D vMin, vMax vMin.x = vPoint.x - (vSize.x / 2.0) vMin.y = vPoint.y - (vSize.y / 2.0) vMax.x = vPoint.x + (vSize.x / 2.0) vMax.y = vPoint.y + (vSize.y / 2.0) CMHDZ_DRAW_DEBUG_LINE(INIT_VECTOR_2D(vMin.x, vMin.y), INIT_VECTOR_2D(vMax.x, vMin.y), col) CMHDZ_DRAW_DEBUG_LINE(INIT_VECTOR_2D(vMax.x, vMin.y), INIT_VECTOR_2D(vMax.x, vMax.y), col) CMHDZ_DRAW_DEBUG_LINE(INIT_VECTOR_2D(vMax.x, vMax.y), INIT_VECTOR_2D(vMin.x, vMax.y), col) CMHDZ_DRAW_DEBUG_LINE(INIT_VECTOR_2D(vMin.x, vMax.y), INIT_VECTOR_2D(vMin.x, vMin.y), col) ENDPROC PROC CMHDZ_DRAW_DEBUG_RECT(VECTOR_2D vPoint, VECTOR_2D vSize, RGBA_COLOUR_STRUCT col) ARCADE_DRAW_PIXELSPACE_RECT(vPoint, vSize, col) ENDPROC PROC CMHDZ_DRAW_DEBUG_LINE_MINIMAP(VECTOR_2D vPoint1, VECTOR_2D vPoint2, RGBA_COLOUR_STRUCT rgba, VECTOR_2D vMiniMapPos, VECTOR_2D vMiniMapSize) VECTOR_2D scaleFactor = INIT_VECTOR_2D(vMiniMapSize.x / cfBASE_SCREEN_WIDTH, vMiniMapSize.y / cfBASE_SCREEN_HEIGHT) VECTOR_2D pos1, pos2 pos1.x = (vPoint1.x * scaleFactor.x) + vMiniMapPos.x pos1.y = (vPoint1.y * scaleFactor.y) + vMiniMapPos.y pos2.x = (vPoint2.x * scaleFactor.x) + vMiniMapPos.x pos2.y = (vPoint2.y * scaleFactor.y) + vMiniMapPos.y pos1 = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_SCREENSPACE(pos1) pos2 = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_SCREENSPACE(pos2) DRAW_DEBUG_LINE_2D_FROM_VECTOR_2D(pos1, pos2, rgba) ENDPROC PROC CMHDZ_DRAW_DEBUG_BOX_MINIMAP(VECTOR_2D vPoint, VECTOR_2D vSize, RGBA_COLOUR_STRUCT col, VECTOR_2D vMiniMapPos, VECTOR_2D vMiniMapSize) VECTOR_2D vMin, vMax vMin.x = vPoint.x - (vSize.x / 2.0) vMin.y = vPoint.y - (vSize.y / 2.0) vMax.x = vPoint.x + (vSize.x / 2.0) vMax.y = vPoint.y + (vSize.y / 2.0) CMHDZ_DRAW_DEBUG_LINE_MINIMAP(INIT_VECTOR_2D(vMin.x, vMin.y), INIT_VECTOR_2D(vMax.x, vMin.y), col, vMiniMapPos, vMiniMapSize) CMHDZ_DRAW_DEBUG_LINE_MINIMAP(INIT_VECTOR_2D(vMax.x, vMin.y), INIT_VECTOR_2D(vMax.x, vMax.y), col, vMiniMapPos, vMiniMapSize) CMHDZ_DRAW_DEBUG_LINE_MINIMAP(INIT_VECTOR_2D(vMax.x, vMax.y), INIT_VECTOR_2D(vMin.x, vMax.y), col, vMiniMapPos, vMiniMapSize) CMHDZ_DRAW_DEBUG_LINE_MINIMAP(INIT_VECTOR_2D(vMin.x, vMax.y), INIT_VECTOR_2D(vMin.x, vMin.y), col, vMiniMapPos, vMiniMapSize) ENDPROC PROC CMHDZ_DRAW_DEBUG_RECT_MINIMAP(VECTOR_2D vPoint, VECTOR_2D vSize, RGBA_COLOUR_STRUCT col, VECTOR_2D vMiniMapPos, VECTOR_2D vMiniMapSize) VECTOR_2D pos, size VECTOR_2D scaleFactor = INIT_VECTOR_2D(vMiniMapSize.x / cfBASE_SCREEN_WIDTH, vMiniMapSize.y / cfBASE_SCREEN_HEIGHT) pos.x = (vPoint.x * scaleFactor.x) + vMiniMapPos.x pos.y = (vPoint.y * scaleFactor.y) + vMiniMapPos.y size.x = (vSize.x * scaleFactor.x) size.y = (vSize.y * scaleFactor.y) ARCADE_DRAW_PIXELSPACE_RECT(pos, size, col) ENDPROC PROC CMHDZ_DRAW_DEBUG_SPRITE_MINIMAP(CMHDZ_SPRITE eSprite, VECTOR_2D vPoint, VECTOR_2D vSize, RGBA_COLOUR_STRUCT col, VECTOR_2D vMiniMapPos, VECTOR_2D vMiniMapSize) VECTOR_2D pos, size VECTOR_2D scaleFactor = INIT_VECTOR_2D(vMiniMapSize.x / cfBASE_SCREEN_WIDTH, vMiniMapSize.y / cfBASE_SCREEN_HEIGHT) pos.x = (vPoint.x * scaleFactor.x) + vMiniMapPos.x pos.y = (vPoint.y * scaleFactor.y) + vMiniMapPos.y size.x = (vSize.x * scaleFactor.x) size.y = (vSize.y * scaleFactor.y) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_SPRITE_GET_TEXTURE_DICT_NAME(eSprite), CMHDZ_SPRITE_GET_TEXTURE_NAME(eSprite), pos, size, 0, col) ENDPROC //------------------------------------------------- // EDITOR DRAWING //------------------------------------------------- PROC CMHDZ_EDITOR_DRAW_ENEMIES(CMHDZ_EDITOR &w) IF (w.iSelectedData = -1) OR (w.iSelectedData >= ciCMHDZ_MAX_ENEMIES) OR (w.bPlayStage) OR (w.iEditMode != CMHDZ_EDITOR_MODE_ENEMY) EXIT ENDIF FLOAT fScale VECTOR_2D pos, vSize CMHDZ_SPRITE spr RGBA_COLOUR_STRUCT transColor = sCMHDZData.rgbaWhite // draw selection overlays transColor.iA = 192 CMHDZ_DRAW_DEBUG_BOX(pos, vSize, sCMHDZData.rgbaWhite) //IF (w.sEnemyMapData[w.iSelectedData].fPointToAppear != w.iActiveLevel) //transColor.iA = 128 //ENDIF pos = w.sEnemyMapData[w.iSelectedData].vSpritePos fScale = CMHDZ_GET_ENEMY_TYPE_SCALE_FOR_LANE(w.sEnemyMapData[w.iSelectedData].iLane) vSize = MULTIPLY_VECTOR_2D(CMHDZ_GET_ENEMY_SIZE_FOR_TYPE(w.sEnemyMapData[w.iSelectedData].eEnemyType, w.sEnemyMapData[w.iSelectedData].iLane != ciCMHDZ_LANE_FOREGROUND), fScale) spr = CMHDZ_DEBUG_GET_SPRITE_FOR_ENEMY_TYPE(w.sEnemyMapData[w.iSelectedData].eEnemyType) IF (spr != CMHDZ_SPRITE_NONE) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_SPRITE_GET_TEXTURE_DICT_NAME(spr), CMHDZ_SPRITE_GET_TEXTURE_NAME(spr), pos, vSize, 0, transColor) pos.x = w.sEnemyMapData[w.iSelectedData].fStoppingPos IF IS_BITMASK_ENUM_AS_ENUM_SET(w.sEnemyMapData[w.iSelectedData].eDataBits, CMHDZ_ENEMY_DATA_BITS_IS_POPUP) pos.x = w.sEnemyMapData[w.iSelectedData].vSpritePos.x pos.y = w.sEnemyMapData[w.iSelectedData].fStoppingPos ENDIF INIT_RGBA_STRUCT(transColor, 255, 0, 0, transColor.iA) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_SPRITE_GET_TEXTURE_DICT_NAME(spr), CMHDZ_SPRITE_GET_TEXTURE_NAME(spr), pos, vSize, 0, transColor) CMHDZ_DRAW_DEBUG_LINE(pos, w.sEnemyMapData[w.iSelectedData].vSpritePos, transColor) ENDIF ENDPROC PROC CMHDZ_EDITOR_DRAW_BOSS(CMHDZ_EDITOR &w, INT iLane) IF (w.iEditMode != CMHDZ_EDITOR_MODE_BOSS) EXIT ENDIF // Including for damage effects CMHDZ_DRAW_SHOT_DISTORTION() CMHDZ_SPRITE eSprite CMHDZ_BOSS_STATE_UPDATE(sCMHDZData.sBossData, eSprite) //CMHDZ_DRAW_BOSS_SPRITE_AND_EFFECTS(eSprite, sCMHDZData.sEnemyProjectiles) CMHDZ_DRAW_BOSS(iLane) ENDPROC FUNC BOOL CMHDZ_EDITOR_IS_COVER_OUT_OF_LIMITS(INT iCoverID, BOOL bToRight = FALSE) IF bToRight RETURN sCMHDZData.sEditor.sCoverMapData[iCoverID].vSpritePos.x >= (cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT) ENDIF RETURN sCMHDZData.sEditor.sCoverMapData[iCoverID].vSpritePos.x <= -(cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT) ENDFUNC PROC CMHDZ_EDITOR_DRAW_COVER(INT iDistance, BOOL bIsSuperFarBackGround = FALSE) CMHDZ_SPRITE eSprite FLOAT fScale = 1.0 VECTOR_2D vScale RGBA_COLOUR_STRUCT rgbaToUse //BOOL bRepositionWhenOffScreenForMovingLevel //BOOL bUpdatePosition INT i // Loop thrugh all cover REPEAT ciCMHDZ_MAX_COVER i IF iDistance = 2 AND sCMHDZData.sEditor.sCoverMapData[i].vSpritePos.x <= (1920.0 + 200) AND sCMHDZData.sEditor.sCoverMapData[i].vSpritePos.x >= -200 sCMHDZData.sEditor.sCoverMapData[i].vSpritePos.x = ((sCMHDZData.sEditor.sCoverMapData[i].fActiveAtPoint - sCMHDZData.fOverallLevelProgression) * 12) ELSE // Distance = 0 or 1. Foreground and background? sCMHDZData.sEditor.sCoverMapData[i].vSpritePos.x = (sCMHDZData.sEditor.sCoverMapData[i].fActiveAtPoint - sCMHDZData.fOverallLevelProgression) ENDIF // Too far to Left IF CMHDZ_EDITOR_IS_COVER_OUT_OF_LIMITS(i, FALSE) AND sCMHDZData.sEditor.sCoverMapData[i].vSpriteInitialPos.x <= ((cfRIGHT_SCREEN_LIMIT+cfRIGHT_SCREEN_LIMIT)/2.0)*4 sCMHDZData.sEditor.sCoverMapData[i].vSpritePos.x += ((cfRIGHT_SCREEN_LIMIT+cfRIGHT_SCREEN_LIMIT)/2.0)*3 sCMHDZData.sEditor.sCoverMapData[i].fActiveAtPoint += ((cfRIGHT_SCREEN_LIMIT+cfRIGHT_SCREEN_LIMIT)/2.0)*3 ENDIF // Too far to Right IF CMHDZ_EDITOR_IS_COVER_OUT_OF_LIMITS(i, TRUE) AND sCMHDZData.sEditor.sCoverMapData[i].vSpriteInitialPos.x <= ((cfRIGHT_SCREEN_LIMIT+cfRIGHT_SCREEN_LIMIT)/2.0)*4 sCMHDZData.sEditor.sCoverMapData[i].vSpritePos.x -= ((cfRIGHT_SCREEN_LIMIT+cfRIGHT_SCREEN_LIMIT)/2.0)*3 sCMHDZData.sEditor.sCoverMapData[i].fActiveAtPoint -= ((cfRIGHT_SCREEN_LIMIT+cfRIGHT_SCREEN_LIMIT)/2.0)*3 ENDIF IF NOT CMHDZ_DRAW_COVER_PROCESS_CHECK(i, iDistance, bIsSuperFarBackGround, TRUE) RELOOP ENDIF // draw the cover on the current screen and the next fScale = CMHDZ_COVER_UTIL_GET_TYPE_SCALE_FOR_LANE(sCMHDZData.sEditor.sCoverMapData[i].eType, iDistance) eSprite = CMHDZ_COVER_UTIL_GET_SPRITE_FOR_TYPE(sCMHDZData.sEditor.sCoverMapData[i].eType) vScale = CMHDZ_COVER_UTIL_GET_TYPE_SIZE(sCMHDZData.sEditor.sCoverMapData[i].eType) IF (eSprite = CMHDZ_SPRITE_NONE) RELOOP ENDIF IF sCMHDZData.sEditor.iEditMode = CMHDZ_EDITOR_MODE_COVER AND i = sCMHDZData.sEditor.iSelectedData // Draw the selected dat in the center of the screen CMHDZ_DRAW_GAME_SPRITE(eSprite, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2.0, sCMHDZData.sEditor.sCoverMapData[i].vSpritePos.y), INIT_VECTOR_2D(vScale.x*fScale, vScale.y*fScale), 0, sCMHDZData.rgbaSprite) RELOOP ENDIF IF sCMHDZData.sEditor.sCoverMapData[i].vSpritePos.x <= (1920 + 200) AND sCMHDZData.sEditor.sCoverMapData[i].vSpritePos.x >= (0.0 - 200) rgbaToUse = sCMHDZData.rgbaSprite // Cover that removes will be transparent IF CMHDZ_COVER_MAP_DATA_IS_BITMASK_SET(sCMHDZData.sEditor.sCoverMapData[i], CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN) AND sCMHDZData.fOverallLevelProgression >= sCMHDZData.sEditor.sCoverMapData[i].vSpriteInitialPos.x rgbaToUse.iA /= 3 ENDIF // IF sCMHDZData.iCurrentScreen + 3 >= CMHDZ_GET_FINAL_SCREEN_IN_CURRENT_LEVEL() // ////CDEBUG1LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_EDITOR_DRAW_COVER - iCurrentScreen: ", sCMHDZData.iCurrentScreen) // rgbaToUse.iA /= 3 // ENDIF // IF CMHDZ_COVER_DATA_IS_BITMASK_SET(i, CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN) // CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_EDITOR_DRAW_COVER] CMHDZ_COVER_DATA_IS_BITMASK_SET - CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN: i = ", i) // CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_EDITOR_DRAW_COVER] CMHDZ_COVER_DATA_IS_BITMASK_SET - CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN: sCMHDZData.sEditor.sCoverMapData[i].vSpriteInitialPos.x = ", sCMHDZData.sEditor.sCoverMapData[i].vSpriteInitialPos.x) // CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_EDITOR_DRAW_COVER] CMHDZ_COVER_DATA_IS_BITMASK_SET - CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN: sCMHDZData.sEditor.sCoverMapData[i].vSpritePos.x = ", sCMHDZData.sEditor.sCoverMapData[i].vSpritePos.x) // CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_EDITOR_DRAW_COVER] CMHDZ_COVER_DATA_IS_BITMASK_SET - CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN: sCMHDZData.sEditor.sCoverMapData[i].fActiveAtPoint = ", sCMHDZData.sEditor.sCoverMapData[i].fActiveAtPoint) // ENDIF CMHDZ_DRAW_GAME_SPRITE(eSprite, INIT_VECTOR_2D(sCMHDZData.sEditor.sCoverMapData[i].vSpritePos.x, sCMHDZData.sEditor.sCoverMapData[i].vSpritePos.y), INIT_VECTOR_2D(vScale.x*fScale, vScale.y*fScale), 0, rgbaToUse) ENDIF ENDREPEAT // IF iDistance = ciCMHDZ_LANE_FOREGROUND // // IF sCMHDZData.sEditor.iEditMode != CMHDZ_EDITOR_MODE_COVER // EXIT // ENDIF // // VECTOR_2D pos, vSize // CMHDZ_SPRITE spr // RGBA_COLOUR_STRUCT transColor = sCMHDZData.rgbaWhite // // transColor.iA = 125 // fScale = 1.0 // //IF sCMHDZData.fOverallLevelProgression >= (w.sEnemyMapData[w.iSelectedData].fPointToAppear - 720.0) // // i= 0 // FOR i = 0 TO ciCMHDZ_MAX_ENEMIES -1 // // IF sCMHDZData.sEditor.sEnemyMapData[i].eEnemyType = CMHDZ_ENEMY_INVALID // RELOOP // ENDIF // // pos = sCMHDZData.sEditor.sEnemyMapData[i].vSpritePos // //// IF sCMHDZData.sEditor.sEnemyMapData[i].fPointToAppear + 1355 >= (sCMHDZData.fOverallLevelProgression - 1355.0) //// AND sCMHDZData.sEditor.sEnemyMapData[i].fPointToAppear + 1355 <= (sCMHDZData.fOverallLevelProgression + 1355.0) //// //pos.x = (sCMHDZData.sEditor.sEnemyMapData[i].fPointToAppear - pos.x) //// pos.x -= sCMHDZData.fOverallLevelProgression // //// IF i = 0 //// CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_EDITOR_DRAW_ENEMIES - Enemy Index relooped: ", i) //// CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_EDITOR_DRAW_ENEMIES - Point to appear: ", sCMHDZData.sEditor.sEnemyMapData[i].fPointToAppear) //// CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_EDITOR_DRAW_ENEMIES - X coord to draw: ", pos.x) //// ENDIF // //// IF sCMHDZData.sEditor.sEnemyMapData[i].fPointToAppear < (sCMHDZData.fOverallLevelProgression - 400.0) //// OR sCMHDZData.sEditor.sEnemyMapData[i].fPointToAppear > (sCMHDZData.fOverallLevelProgression + 400) //// RELOOP //// ENDIF // // IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_REVERSE) // //pos.x += ((sCMHDZData.sEditor.sEnemyMapData[i].fPointToAppear - sCMHDZData.fOverallLevelProgression) - sCMHDZData.sEditor.sEnemyMapData[i].fStoppingPos) // //pos.x += ((sCMHDZData.sEditor.sEnemyMapData[i].fPointToAppear) - sCMHDZData.sEditor.sEnemyMapData[i].fStoppingPos) // pos.x -= (sCMHDZData.fOverallLevelProgression - (sCMHDZData.sEditor.sEnemyMapData[i].fPointToAppear)) // pos.x += (sCMHDZData.sEditor.sEnemyMapData[i].fStoppingPos - sCMHDZData.sEditor.sEnemyMapData[i].vSpritePos.x) // // ELSE // pos.x -= sCMHDZData.fOverallLevelProgression // pos.x -= ((sCMHDZData.sEditor.sEnemyMapData[i].fPointToAppear) - sCMHDZData.sEditor.sEnemyMapData[i].fStoppingPos) // pos.x -= (sCMHDZData.sEditor.sEnemyMapData[i].vSpritePos.x - sCMHDZData.sEditor.sEnemyMapData[i].fStoppingPos) // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_EDITOR_DRAW_COVER - Space difference from right: ",(sCMHDZData.sEditor.sEnemyMapData[i].vSpritePos.x - sCMHDZData.sEditor.sEnemyMapData[i].fStoppingPos)) // ENDIF // // //pos.x += 80.0 // // //pos.x = (sCMHDZData.sEditor.sEnemyMapData[sCMHDZData.sEditor.iSelectedData].fPointToAppear - sCMHDZData.fOverallLevelProgression) // IF pos.x < cfLEFT_SCREEN_LIMIT // OR pos.x > cfRIGHT_SCREEN_LIMIT // RELOOP // ENDIF // // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_EDITOR_DRAW_ENEMIES - Enemy Index to draw: ", i) // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_EDITOR_DRAW_ENEMIES - Point to appear: ", sCMHDZData.sEditor.sEnemyMapData[i].fPointToAppear) // // fScale = CMHDZ_GET_ENEMY_TYPE_SCALE_FOR_LANE(sCMHDZData.sEditor.sEnemyMapData[i].iLane) // vSize = MULTIPLY_VECTOR_2D(CMHDZ_GET_ENEMY_SIZE_FOR_TYPE(sCMHDZData.sEditor.sEnemyMapData[i].eEnemyType, sCMHDZData.sEditor.sEnemyMapData[i].iLane != ciCMHDZ_LANE_FOREGROUND), fScale) // spr = CMHDZ_DEBUG_GET_SPRITE_FOR_ENEMY_TYPE(sCMHDZData.sEditor.sEnemyMapData[i].eEnemyType) // // IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_POPUP) // INIT_RGBA_STRUCT(transColor, 255, 100, 100, transColor.iA) // ENDIF // // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_EDITOR_DRAW_ENEMIES - Enemy index drawn: ", i) // // CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_SPRITE_GET_TEXTURE_DICT_NAME(spr), CMHDZ_SPRITE_GET_TEXTURE_NAME(spr), pos, vSize, 0, transColor) // ENDFOR // // EXIT // ENDIF ENDPROC PROC CMHDZ_EDITOR_DRAW_ITEMS(INT iDistance) IF sCMHDZData.sEditor.iEditMode != CMHDZ_EDITOR_MODE_ITEM EXIT ENDIF CMHDZ_SPRITE eSprite FLOAT fScale = 1.0 SWITCH iDistance CASE 0 fScale = 0.75 BREAK CASE 2 //fScale = 2.5 BREAK ENDSWITCH // IF iDistance = 2 // CMHDZ_DRAW_GAME_SPRITE("ammo1", GET_DEBUG_TEXTURE_POS(0), INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_PISTOL_AMMO_CLIP_WIDTH*1.0, cfCMHDZ_SPRITE_HUD_PISTOL_AMMO_CLIP_HEIGHT*1.0), 0, sCMHDZData.rgbaSprite) // CMHDZ_DRAW_GAME_SPRITE("POWERUP_PAINKILLERS", GET_DEBUG_TEXTURE_POS(1), INIT_VECTOR_2D(cfCMHDZ_ITEM_HEALTH_WIDTH*1.0, cfCMHDZ_ITEM_HEALTH_HEIGHT*1.0), 0, sCMHDZData.rgbaSprite) // CMHDZ_DRAW_GAME_SPRITE("ammo4", GET_DEBUG_TEXTURE_POS(2), INIT_VECTOR_2D(cfCMHDZ_ITEM_HEALTH_WIDTH*1.0, cfCMHDZ_ITEM_HEALTH_HEIGHT*1.0), 0, sCMHDZData.rgbaSprite) // ENDIF // INT i // FOR i = 0 TO ciCMHDZ_MAX_ITEMS -1 // Don't draw other items if in Editor mode. Only selected one INT i = sCMHDZData.sEditor.iSelectedData IF i >= 0 AND i < ciCMHDZ_MAX_ITEMS eSprite = CMHDZ_GET_SPRITE_FOR_ITEM_TYPE(sCMHDZData.sEditor.sItemMapData[i].eItemType) CMHDZ_DRAW_GAME_SPRITE(eSprite, INIT_VECTOR_2D((cfBASE_SCREEN_WIDTH/2.0), sCMHDZData.sEditor.sItemMapData[i].vSpritePos.y), MULTIPLY_VECTOR_2D(sCMHDZData.sItemData[i].vSize, fScale), 0, sCMHDZData.rgbaSprite) ENDIF ENDPROC PROC CMHDZ_EDITOR_DRAW_COVER_MAP_DATA_ON_MINIMAP(CMHDZ_EDITOR &w, CMHDZ_COVER_MAP_DATA &array[]) INT i VECTOR_2D vSize FLOAT fScale RGBA_COLOUR_STRUCT rcol CMHDZ_SPRITE eSprite INIT_RGBA_STRUCT(rcol, 0, 255, 0, 255) REPEAT COUNT_OF(array) i IF (array[i].eType != CMHDZ_ASSET_INVALID) eSprite = CMHDZ_COVER_UTIL_GET_SPRITE_FOR_TYPE(array[i].eType) IF (eSprite = CMHDZ_SPRITE_NONE) RELOOP ENDIF fScale = CMHDZ_COVER_UTIL_GET_TYPE_SCALE_FOR_LANE(array[i].eType, array[i].iCoverLane) vSize = MULTIPLY_VECTOR_2D(CMHDZ_COVER_UTIL_GET_TYPE_SIZE(array[i].eType), fScale) IF (i = w.iSelectedData) AND (w.iEditMode = CMHDZ_EDITOR_MODE_COVER) CMHDZ_DRAW_DEBUG_RECT_MINIMAP(array[i].vSpriteInitialPos, vSize, sCMHDZData.rgbaRed, w.vMiniMapPos, w.vMiniMapSize) rcol = sCMHDZData.rgbaWhite ELSE INIT_RGBA_STRUCT(rcol, 200, 200, 200, 255) ENDIF // IF ((CEIL(sCMHDZData.fOverallLevelProgression/((cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT)/2))) != 0) AND ((CEIL(sCMHDZData.fOverallLevelProgression/((cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT)/2))) != array[i].iScreen) // INIT_RGBA_STRUCT(rcol, 200, 200, 200, 64) // ENDIF CMHDZ_DRAW_DEBUG_SPRITE_MINIMAP(eSprite, array[i].vSpriteInitialPos, vSize, rcol, w.vMiniMapPos, w.vMiniMapSize) ENDIF ENDREPEAT ENDPROC PROC CMHDZ_EDITOR_DRAW_ITEM_MAP_DATA_ON_MINIMAP(CMHDZ_EDITOR &w, CMHDZ_ITEM_MAP_DATA &array[]) INT i VECTOR_2D vSize RGBA_COLOUR_STRUCT rcol CMHDZ_SPRITE eSprite INIT_RGBA_STRUCT(rcol, 0, 255, 0, 255) REPEAT COUNT_OF(array) i IF (array[i].eItemType = CMHDZ_ITEM_NONE) RELOOP ENDIF eSprite = CMHDZ_GET_SPRITE_FOR_ITEM_TYPE(array[i].eItemType) IF (eSprite = CMHDZ_SPRITE_NONE) RELOOP ENDIF vSize = CMHDZ_GET_ITEM_SIZE_FOR_TYPE(array[i].eItemType) IF (i = w.iSelectedData) AND (w.iEditMode = CMHDZ_EDITOR_MODE_ITEM) CMHDZ_DRAW_DEBUG_RECT_MINIMAP(array[i].vSpritePos, vSize, sCMHDZData.rgbaRed, w.vMiniMapPos, w.vMiniMapSize) rcol = sCMHDZData.rgbaWhite ELSE INIT_RGBA_STRUCT(rcol, 200, 200, 200, 255) ENDIF CMHDZ_DRAW_DEBUG_SPRITE_MINIMAP(eSprite, array[i].vSpritePos, vSize, rcol, w.vMiniMapPos, w.vMiniMapSize) ENDREPEAT ENDPROC PROC CMHDZ_EDITOR_DRAW_ENEMY_MAP_DATA_ON_MINIMAP(CMHDZ_EDITOR &w, CMHDZ_ENEMY_MAP_DATA &array[]) INT i VECTOR_2D vSize FLOAT fScale RGBA_COLOUR_STRUCT rcol CMHDZ_SPRITE eSprite VECTOR_2D vPos INIT_RGBA_STRUCT(rcol, 0, 255, 0, 255) REPEAT COUNT_OF(array) i IF (array[i].eEnemyType != CMHDZ_ENEMY_INVALID) eSprite = CMHDZ_DEBUG_GET_SPRITE_FOR_ENEMY_TYPE(array[i].eEnemyType) IF (eSprite = CMHDZ_SPRITE_NONE) RELOOP ENDIF fScale = CMHDZ_GET_ENEMY_TYPE_SCALE_FOR_LANE(array[i].iLane) vSize = MULTIPLY_VECTOR_2D(CMHDZ_GET_ENEMY_SIZE_FOR_TYPE(array[i].eEnemyType, array[i].iLane != ciCMHDZ_LANE_FOREGROUND), fScale) vPos = array[i].vSpritePos IF (i = w.iSelectedData) AND (w.iEditMode = CMHDZ_EDITOR_MODE_ENEMY) CMHDZ_DRAW_DEBUG_RECT_MINIMAP(vPos, vSize, sCMHDZData.rgbaRed, w.vMiniMapPos, w.vMiniMapSize) rcol = sCMHDZData.rgbaWhite ELSE INIT_RGBA_STRUCT(rcol, 200, 200, 200, 255) ENDIF CMHDZ_DRAW_DEBUG_SPRITE_MINIMAP(eSprite, vPos, vSize, rcol, w.vMiniMapPos, w.vMiniMapSize) ENDIF ENDREPEAT ENDPROC PROC CMHDZ_EDITOR_DRAW_MINIMAP(CMHDZ_EDITOR &w) IF (!w.bShowMiniMap) OR (w.bPlayStage) EXIT ENDIF // Do not draw the Minimap over the Editor if we are still on the title screen or selection menu. IF (sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_TITLE_SCREEN) EXIT ENDIF IF (sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_LEVEL_SELECTION_MENU) EXIT ENDIF VECTOR_2D v, origin RGBA_COLOUR_STRUCT rcol // draw bg INIT_RGBA_STRUCT(rcol, 0, 0, 0, 200) v = CMHDZ_GET_CENTER_FROM_CORNER_RECT(w.vMiniMapPos.x, w.vMiniMapPos.y, w.vMiniMapSize.x, w.vMiniMapSize.y) ARCADE_DRAW_PIXELSPACE_RECT(v, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, w.vMiniMapSize.y), rcol) // Screens aren't actually screens - they are half screens?!? IF (CEIL(sCMHDZData.fOverallLevelProgression/(cfCMHDZ_SCREEN_LENGTH)) > 0) // draw actual screen boundary INIT_RGBA_STRUCT(rcol, 255, 255, 255, 90) origin = CMHDZ_GET_ORIGIN_FOR_SCREEN(ROUND(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)) v = CMHDZ_GET_CENTER_FROM_CORNER_RECT(origin.x, origin.y, (cfBASE_SCREEN_WIDTH / 2.0), cfBASE_SCREEN_HEIGHT) CMHDZ_DRAW_DEBUG_BOX_MINIMAP(v, INIT_VECTOR_2D((cfBASE_SCREEN_WIDTH / 2.0), cfBASE_SCREEN_HEIGHT), rcol, w.vMiniMapPos, w.vMiniMapSize) // draw viewable screen INIT_RGBA_STRUCT(rcol, 0, 0, 255, 64) v = CMHDZ_GET_CENTER_FROM_CORNER_RECT(origin.x + cfGAME_OVERSCAN_MIN_X, cfGAME_OVERSCAN_MIN_Y, cfGAME_OVERSCAN_WIDTH, cfGAME_OVERSCAN_HEIGHT) CMHDZ_DRAW_DEBUG_RECT_MINIMAP(v, INIT_VECTOR_2D(cfGAME_OVERSCAN_WIDTH, cfGAME_OVERSCAN_HEIGHT), rcol, w.vMiniMapPos, w.vMiniMapSize) ENDIF // draw map things CMHDZ_EDITOR_DRAW_COVER_MAP_DATA_ON_MINIMAP(w, w.sCoverMapData) CMHDZ_EDITOR_DRAW_ITEM_MAP_DATA_ON_MINIMAP(w, w.sItemMapData) CMHDZ_EDITOR_DRAW_ENEMY_MAP_DATA_ON_MINIMAP(w, w.sEnemyMapData) // CMHDZ_EDITOR_DRAW_HOSTAGE_MAP_DATA_ON_MINIMAP(w, w.sHostageMapData) ENDPROC PROC CMHDZ_EDITOR_DRAW_ENTITY_INDICES(CMHDZ_EDITOR &w) INT i VECTOR_2D vScreenCoord IF (w.bShowEntityIndicies[CMHDZ_EDITOR_MODE_ENEMY]) REPEAT ciCMHDZ_MAX_ENEMIES i IF (sCMHDZData.sEnemyData[i].eState != CMHDZ_ENEMY_STATE_INACTIVE) AND (sCMHDZData.sEnemyData[i].eState != CMHDZ_ENEMY_STATE_WAITING) IF sCMHDZData.sEnemyData[i].vSpritePos.x < cfBASE_SCREEN_WIDTH AND sCMHDZData.sEnemyData[i].vSpritePos.x > 0 vScreenCoord = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_SCREENSPACE(sCMHDZData.sEnemyData[i].vSpritePos) DISPLAY_TEXT_WITH_NUMBER(vScreenCoord.x, vScreenCoord.y, "NUMBER", i) ENDIF ENDIF ENDREPEAT ENDIF // IF (w.bShowEntityIndicies[CMHDZ_EDITOR_MODE_HOSTAGE]) // REPEAT ciCMHDZ_MAX_HOSTAGES i // IF sCMHDZData.sHostageData[i].vSpritePos.x < cfBASE_SCREEN_WIDTH AND sCMHDZData.sHostageData[i].vSpritePos.x > 0 // IF (sCMHDZData.sHostageData[i].bRendering) // vScreenCoord = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_SCREENSPACE(sCMHDZData.sHostageData[i].vSpritePos) // DISPLAY_TEXT_WITH_NUMBER(vScreenCoord.x, vScreenCoord.y, "NUMBER", i) // ENDIF // ENDIF // ENDREPEAT // ENDIF IF (w.bShowEntityIndicies[CMHDZ_EDITOR_MODE_ITEM]) REPEAT ciCMHDZ_MAX_ITEMS i IF sCMHDZData.sItemData[i].vSpritePos.x < cfBASE_SCREEN_WIDTH AND sCMHDZData.sItemData[i].vSpritePos.x > 0 vScreenCoord = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_SCREENSPACE(sCMHDZData.sItemData[i].vSpritePos) DISPLAY_TEXT_WITH_NUMBER(vScreenCoord.x, vScreenCoord.y, "NUMBER", i) ENDIF ENDREPEAT ENDIF IF (w.bShowEntityIndicies[CMHDZ_EDITOR_MODE_COVER]) REPEAT ciCMHDZ_MAX_COVER i IF sCMHDZData.sCoverData[i].vSpritePos.x < cfBASE_SCREEN_WIDTH AND sCMHDZData.sCoverData[i].vSpritePos.x > 0 vScreenCoord = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_SCREENSPACE(sCMHDZData.sCoverData[i].vSpritePos) DISPLAY_TEXT_WITH_NUMBER(vScreenCoord.x, vScreenCoord.y, "NUMBER", i) ENDIF ENDREPEAT ENDIF ENDPROC PROC CMHDZ_DRAW_CLIENT_STATE_EDITOR_ACTIVE() // Draw black and grey background ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), sCMHDZData.rgbaBlack) ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH, cfGAME_SCREEN_HEIGHT), sCMHDZData.rgbaRed) CMHDZ_DRAW_BACKGROUND() CMHDZ_EDITOR_DRAW_COVER(ciCMHDZ_LANE_BACKGROUND, TRUE) CMHDZ_EDITOR_DRAW_BOSS(sCMHDZData.sEditor, ciCMHDZ_LANE_BACKGROUND) CMHDZ_EDITOR_DRAW_ITEMS(ciCMHDZ_LANE_BACKGROUND) CMHDZ_EDITOR_DRAW_COVER(ciCMHDZ_LANE_BACKGROUND, FALSE) CMHDZ_EDITOR_DRAW_BOSS(sCMHDZData.sEditor, ciCMHDZ_LANE_MIDDLE) CMHDZ_EDITOR_DRAW_ITEMS(ciCMHDZ_LANE_MIDDLE) CMHDZ_EDITOR_DRAW_COVER(ciCMHDZ_LANE_MIDDLE) CMHDZ_EDITOR_DRAW_BOSS(sCMHDZData.sEditor, ciCMHDZ_LANE_FOREGROUND) CMHDZ_EDITOR_DRAW_ITEMS(ciCMHDZ_LANE_FOREGROUND) CMHDZ_EDITOR_DRAW_COVER(ciCMHDZ_LANE_FOREGROUND) CMHDZ_EDITOR_DRAW_ENEMIES(sCMHDZData.sEditor) //CMHDZ_EDITOR_DRAW_BOSS(sCMHDZData.sEditor) #IF IS_DEBUG_BUILD #IF CMHDZ_CMDLINE_EDITOR_NEW IF (sCMHDZData.sEditor.bPlayStage) CMHDZ_DRAW_HUD() ENDIF #ENDIF #ENDIF CMHDZ_DRAW_RETICLES(TRUE, TRUE) TWS_DRAW_FRONT_FX() ENDPROC #ENDIF #ENDIF //------------------------------------------------- // LEADERBOARD FUNCTIONS //------------------------------------------------- PROC ARCADE_GAMES_DRAW_INTEGER(INT iValue, INT iDigits, VECTOR_2D vCenter,RGBA_COLOUR_STRUCT rgba) VECTOR_2D vCharCenter = vCenter VECTOR_2D vCharSize = ARCADE_GAMES_LEADERBOARD_GET_CHAR_TEXTURE_SIZE() VECTOR_2D vCharSeparation = ARCADE_GAMES_LEADERBOARD_GET_CHAR_TEXTURE_SEPARATION() BOOL bZero = (iValue = 0) INT iChar IF iDigits = 0 INT currentValue currentValue = iValue WHILE currentValue > 0 OR bZero bZero = FALSE vCharCenter.x = vCenter.x + vCharSeparation.x * (iDigits-1)/2.0 - vCharSeparation.x * iChar TEXT_LABEL_63 tlTextureName tlTextureName = ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_NUMBER() tlTextureName += currentValue % 10 currentValue /= 10 CMHDZ_DRAW_GAME_SPRITE_DETAILS(ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_DICTIONARY(),tlTextureName,vCharCenter,vCharSize,0.0, rgba) iChar++ ENDWHILE ELSE REPEAT iDigits iChar vCharCenter.x = vCenter.x + vCharSeparation.x * (iDigits-1)/2.0 - vCharSeparation.x * iChar TEXT_LABEL_63 tlTextureName tlTextureName = ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_NUMBER() tlTextureName += (iValue / ROUND(POW(10.0,to_float(iChar)))) % 10 CMHDZ_DRAW_GAME_SPRITE_DETAILS(ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_DICTIONARY(),tlTextureName,vCharCenter,vCharSize,0.0, rgba) ENDREPEAT ENDIF ENDPROC PROC ARCADE_GAMES_LEADERBOARD_DRAW_UNPACKED_INITIALS(ARCADE_GAMES_LEADERBOARD_DATA &lbData, INT &iUnpackedInitials[ciARCADE_CABINET_LEADERBOARD_INITIALS], VECTOR_2D vCenter,RGBA_COLOUR_STRUCT rgba,RGBA_COLOUR_STRUCT rgbaHighlight, BOOL editing) VECTOR_2D vCharCenter = vCenter VECTOR_2D vCharSize = ARCADE_GAMES_LEADERBOARD_GET_CHAR_TEXTURE_SIZE() VECTOR_2D vCharSeparation = ARCADE_GAMES_LEADERBOARD_GET_CHAR_TEXTURE_SEPARATION() RGBA_COLOUR_STRUCT color INT iChar REPEAT 3 iChar vCharCenter.x = vCenter.x + vCharSeparation.x * (3-1)/2.0 + vCharSeparation.x * iChar TEXT_LABEL_63 tlTextureName IF iUnpackedInitials[iChar] < 26 tlTextureName = ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_LETTER() ELSE tlTextureName = ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_NUMBER() ENDIF tlTextureName += ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[iChar]) IF editing IF lbData.iCurrentInitial = iChar IF lbData.iTickTimer = 0 color = rgba ELSE color = rgbaHighlight ENDIF ELSE color = rgbaHighlight ENDIF ELSE color = rgba ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS("MPCamhedzVHSFont",tlTextureName,vCharCenter,vCharSize,0.0, color) ENDREPEAT ENDPROC PROC ARCADE_GAMES_LEADERBOARD_DRAW_RANK(INT iPosition, VECTOR_2D vCenter,RGBA_COLOUR_STRUCT rgba,RGBA_COLOUR_STRUCT rgbaHighlight, BOOL editing) // //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_DRAW_RANK][LEADERBOARD] - ARCADE_GAMES_LEADERBOARD_DRAW_RANK ") VECTOR_2D vCharCenter = vCenter VECTOR_2D vCharSize = ARCADE_GAMES_LEADERBOARD_GET_CHAR_TEXTURE_SIZE() VECTOR_2D vCharSeparation = ARCADE_GAMES_LEADERBOARD_GET_CHAR_TEXTURE_SEPARATION() RGBA_COLOUR_STRUCT color IF editing color = rgbaHighlight ELSE color = rgba ENDIF TEXT_LABEL_63 tlTextureName IF iPosition = 10 tlTextureName = ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_NUMBER() tlTextureName += 1 vCharCenter.x = vCharCenter.x - vCharSeparation.x CMHDZ_DRAW_GAME_SPRITE_DETAILS(ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_DICTIONARY(),tlTextureName,vCharCenter,vCharSize,0.0, color) vCharCenter = vCenter iPosition = 0 ENDIF tlTextureName = ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_NUMBER() tlTextureName += iPosition CMHDZ_DRAW_GAME_SPRITE_DETAILS(ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_DICTIONARY(),tlTextureName,vCharCenter,vCharSize,0.0, color) vCharCenter.x = vCenter.x + vCharSeparation.x * 1 tlTextureName = ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_LETTER() IF iPosition = 1 tlTextureName += "S" ELIF iPosition = 2 tlTextureName += "N" ELIF iPosition = 3 tlTextureName += "R" ELSE tlTextureName += "T" ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_DICTIONARY(),tlTextureName,vCharCenter,vCharSize,0.0, color) vCharCenter.x = vCenter.x + vCharSeparation.x * 2 tlTextureName = ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_LETTER() IF iPosition = 1 tlTextureName += "T" ELIF iPosition = 2 tlTextureName += "D" ELIF iPosition = 3 tlTextureName += "D" ELSE tlTextureName += "H" ENDIF CMHDZ_DRAW_GAME_SPRITE_DETAILS(ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_DICTIONARY(),tlTextureName,vCharCenter,vCharSize,0.0, color) ENDPROC PROC ARCADE_GAMES_LEADERBOARD_DRAW_SCORE(INT iScore, VECTOR_2D vCenter,RGBA_COLOUR_STRUCT rgba,RGBA_COLOUR_STRUCT rgbaHighlight, BOOL editing) VECTOR_2D vCharCenter = vCenter VECTOR_2D vCharSize = ARCADE_GAMES_LEADERBOARD_GET_CHAR_TEXTURE_SIZE() VECTOR_2D vCharSeparation = ARCADE_GAMES_LEADERBOARD_GET_CHAR_TEXTURE_SEPARATION() RGBA_COLOUR_STRUCT color IF editing color = rgbaHighlight ELSE color = rgba ENDIF ARCADE_GAMES_DRAW_INTEGER(iScore,ARCADE_GAMES_LEADERBOARD_GET_SCORE_MAX_CHARS(),vCenter,color) //PTS TEXT_LABEL_63 tlTextureName vCharCenter.x = vCenter.x + vCharSeparation.x * (ARCADE_GAMES_LEADERBOARD_GET_SCORE_MAX_CHARS()/2 + 1) tlTextureName = ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_LETTER() tlTextureName += "P" CMHDZ_DRAW_GAME_SPRITE_DETAILS(ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_DICTIONARY(),tlTextureName,vCharCenter,vCharSize,0.0, color) vCharCenter.x = vCenter.x + vCharSeparation.x * (ARCADE_GAMES_LEADERBOARD_GET_SCORE_MAX_CHARS()/2 + 2) tlTextureName = ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_LETTER() tlTextureName += "T" CMHDZ_DRAW_GAME_SPRITE_DETAILS(ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_DICTIONARY(),tlTextureName,vCharCenter,vCharSize,0.0, color) vCharCenter.x = vCenter.x + vCharSeparation.x * (ARCADE_GAMES_LEADERBOARD_GET_SCORE_MAX_CHARS()/2 + 3) tlTextureName = ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_LETTER() tlTextureName += "S" CMHDZ_DRAW_GAME_SPRITE_DETAILS(ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_DICTIONARY(),tlTextureName,vCharCenter,vCharSize,0.0, color) ENDPROC /// PURPOSE: /// Draws the leaderboard PROC ARCADE_GAMES_LEADERBOARD_DRAW(ARCADE_GAMES_LEADERBOARD_DATA &lbData, INT iLocalInitials, ARCADE_GAMES_LEADERBOARD_STRUCT &lbHost[ciCASINO_ARCADE_LEADERBOARD_POSITIONS], BOOL bIsPlayerTwo = FALSE) // //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_DRAW][LEADERBOARD] - ARCADE_GAMES_LEADERBOARD_DRAW ") TEXT_LABEL_63 tl63RewindFrame sCMHDZData.iTimer += CEIL(0.0+@1000) IF sCMHDZData.eCurrentLevel >= CMHDZ_MAX_LEVELS OR sCMHDZData.eCurrentLevel < CMHDZ_LEVEL_CITY sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_CITY ENDIF CMHDZ_REWIND_GET_REWIND_ANIMATION(tl63RewindFrame) RGBA_COLOUR_STRUCT rgbaRandomisedColour INIT_RGBA_STRUCT(rgbaRandomisedColour, GET_RANDOM_INT_IN_RANGE(240,255), GET_RANDOM_INT_IN_RANGE(240,255), GET_RANDOM_INT_IN_RANGE(240,255)) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICTIONARY_FOR_LEVEL(sCMHDZData.eCurrentLevel), tl63RewindFrame, INIT_VECTOR_2D((cfBASE_SCREEN_WIDTH/2.0) + sCMHDZData.fSyncOffsetX, cfBASE_SCREEN_HEIGHT/2.0), INIT_VECTOR_2D(2048, 944), 0.0, rgbaRandomisedColour) CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICTIONARY_FOR_LEVEL(sCMHDZData.eCurrentLevel), tl63RewindFrame, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2.0 + (sCMHDZData.fSyncOffsetX - 2048), cfBASE_SCREEN_HEIGHT/2.0), INIT_VECTOR_2D(2048, 944), 0.0, rgbaRandomisedColour) CMHDZ_DRAW_HEAVY_DAMAGE_EFFECT() //CMHDZ_DRAW_REWIND_EFFECT() // Blink rewind // IF (sCMHDZData.iTimer%2000) < 1000 // // Rewind symbol appears on screen // CMHDZ_DRAW_REWIND_SYMBOL() // ENDIF //CMHDZ_DRAW_DAMAGE_NOISE(100) sCMHDZData.fSyncOffsetX += (0.0+@175) IF (sCMHDZData.fSyncOffsetX >= 2048) sCMHDZData.fSyncOffsetX = 0.0 ENDIF // Darken background RGBA_COLOUR_STRUCT col INIT_RGBA_STRUCT(col, 0,0,0,125) ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2.0, cfBASE_SCREEN_HEIGHT/2.0), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH,cfBASE_SCREEN_HEIGHT), col) IF lbData.bEditing ARCADE_GAMES_HELP_TEXT_PRINT_FOREVER(ARCADE_GAMES_HELP_TEXT_ENUM_LEADERBOARD_ENTRY) ELSE ARCADE_GAMES_HELP_TEXT_PRINT_FOREVER(ARCADE_GAMES_HELP_TEXT_ENUM_LEADERBOARD) ENDIF VECTOR_2D vCharSeparation = ARCADE_GAMES_LEADERBOARD_GET_CHAR_TEXTURE_SEPARATION() lbData.iTickTimer = ((lbData.iTickTimer + ROUND(GET_FRAME_TIME() * 1000))% 1000) / 500 // CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_TITLES), // ARCADE_GAMES_LEADERBOARD_GET_TITLE_TEXTURE_NAME(), // ARCADE_GAMES_LEADERBOARD_GET_TITLE_TEXTURE_POSITION(), // ARCADE_GAMES_LEADERBOARD_GET_TITLE_TEXTURE_SIZE(),0.0, // ARCADE_GAMES_LEADERBOARD_GET_DEFAULT_COLOR()) CMHDZ_WRITE_STRING_USING_TEXT_SPRITES("LEADERBOARD", ARCADE_GAMES_LEADERBOARD_GET_TITLE_TEXTURE_POSITION(), DEFAULT, TRUE) // //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_DRAW][LEADERBOARD] My Initials: ", iLocalInitials) INT iUnpackedInitials[ciARCADE_CABINET_LEADERBOARD_INITIALS] INT iPositionLoop = 0 BOOL bEditing = FALSE FOR iPositionLoop = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1 bEditing = lbHost[iPositionLoop].iPlayer = PARTICIPANT_ID_TO_INT() AND lbData.bEditing // bEditing = lbData.bEditing //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_DRAW][LEADERBOARD]") //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_DRAW][LEADERBOARD] iPositionLoop: ",iPositionLoop, " bEditing: ", bEditing, " lbData.bEditing: ", lbData.bEditing, " Local part: ", PARTICIPANT_ID_TO_INT()) //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_DRAW][LEADERBOARD] lbHost[",iPositionLoop, "].iPlayer = ", lbHost[iPositionLoop].iPlayer) //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_DRAW][LEADERBOARD] lbHost[",iPositionLoop, "].iScore = ", lbHost[iPositionLoop].iScore) //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_DRAW][LEADERBOARD] lbHost[",iPositionLoop, "].iInitials = ", lbHost[iPositionLoop].iInitials) IF (lbData.iCurrentInitial < ciARCADE_CABINET_LEADERBOARD_INITIALS - 1 OR SC_PROFANITY_GET_CHECK_IS_VALID(lbData.iLbdInitialProfanityToken)) AND bEditing //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_DRAW][LEADERBOARD] Editing, iInitials: ", iLocalInitials) ARCADE_UNPACK_LEADERBOARD_INITIALS(iLocalInitials, iUnpackedInitials) ELSE ARCADE_UNPACK_LEADERBOARD_INITIALS(lbHost[iPositionLoop].iInitials, iUnpackedInitials) ENDIF // ARCADE_UNPACK_LEADERBOARD_INITIALS(lbHost[iPositionLoop].iInitials, iUnpackedInitials) //Rank ARCADE_GAMES_LEADERBOARD_DRAW_RANK(iPositionLoop+1,ADD_VECTOR_2D(ARCADE_GAMES_LEADERBOARD_GET_RANK_COLUMN_POSITION(),INIT_VECTOR_2D(0.0,vCharSeparation.y*iPositionLoop)),ARCADE_GAMES_LEADERBOARD_GET_DEFAULT_COLOR(),ARCADE_GAMES_LEADERBOARD_GET_ENTRY_COLOR(bIsPlayerTwo),bEditing) //Initials ARCADE_GAMES_LEADERBOARD_DRAW_UNPACKED_INITIALS(lbData, iUnpackedInitials,ADD_VECTOR_2D(ARCADE_GAMES_LEADERBOARD_GET_INITIALS_COLUMN_POSITION(),INIT_VECTOR_2D(0.0,vCharSeparation.y*iPositionLoop)),ARCADE_GAMES_LEADERBOARD_GET_DEFAULT_COLOR(),ARCADE_GAMES_LEADERBOARD_GET_ENTRY_COLOR(bIsPlayerTwo),bEditing) //Score ARCADE_GAMES_LEADERBOARD_DRAW_SCORE(lbHost[iPositionLoop].iScore,ADD_VECTOR_2D(ARCADE_GAMES_LEADERBOARD_GET_SCORE_COLUMN_POSITION(),INIT_VECTOR_2D(0.0,vCharSeparation.y*iPositionLoop)),ARCADE_GAMES_LEADERBOARD_GET_DEFAULT_COLOR(),ARCADE_GAMES_LEADERBOARD_GET_ENTRY_COLOR(bIsPlayerTwo),bEditing) ENDFOR ENDPROC PROC ARCADE_GAMES_LEADERBOARD_LOAD(ARCADE_GAMES_LEADERBOARD_DATA &lbData, CASINO_ARCADE_GAME eGame, BOOL &bReceived) UNUSED_PARAMETER(eGame) IF NOT bReceived AND NETWORK_IS_HOST_OF_THIS_SCRIPT() AND (lbData.iLastLeaderboardRequest = -HIGHEST_INT OR NATIVE_TO_INT(GET_NETWORK_TIME()) - lbData.iLastLeaderboardRequest > ciARCADE_GAMES_RESEND_LEADERBOARD_REQUEST_TIME) BROADCAST_CASINO_ARCADE_REQUEST_LEADERBOARD_EVENT(GET_OWNER_OF_SIMPLE_INTERIOR_PLAYER_IS_IN(PLAYER_ID()), ARCADE_GAMES_LEADERBOARD_GET_CASINO_ARCADE_GAME()) lbData.iLastLeaderboardRequest = NATIVE_TO_INT(GET_NETWORK_TIME()) ENDIF ENDPROC PROC CMHDZ_DRAW_CLIENT_STATE_LEADERBOARD() //sCMHDZData.fOverallLevelProgression = 0.01 // 1 is the minimum screen value so we count from there. //CMHDZ_DRAW_CLIENT_STATE_PLAYING() ARCADE_GAMES_LEADERBOARD_DRAW(sCMHDZData.sLbData, playerBd[PARTICIPANT_ID_TO_INT()].iLeaderboardInitials, cmhdzServerBd.sLeaderboard) TWS_DRAW_FRONT_FX() ENDPROC