Diablobetes
- PewkoGames
- Posts: 35
- Joined: Thu Sep 13, 2018 9:16 am
Diablobetes
a WIP.
Plot:
"Glorious Leader Generalissimo Grunt has to clean up his Hedge Maze of Death. The victims apparently didn't get the memo to pick up their dirty skulls after they killed by whatever horrible thing residing in the Hedge Maze of Death. Seriously its just common courtesy. Pick up your dirty skulls. Anyway, help Grunt pick up all the dirty skulls in his 66 acre Hedge Maze. Watch out for Skull Rights Activists (Yes, they sadly exist but welcome to 2019.) who will annoy you to death. Fight back by eating the satanic hoagies strewn about the maze and unleashing the General's Diablobetes! Beat all 66 levels and win the stupid game. Like you have a life."
Right now I've got the gameplay done and the between level cutscenes. The Things I need help with:
Changing the score values. I'd like to have the skulls worth X amount of points and bonus points for eating the sandwich and Skull Rights activists.
Game Over Screen. I have a graphic similar to the Level screens but I want it to appear after you lose all 3 lives.
3 lives. Right now its set to instant death, which I want but right now, you only get 1 life. I'd like there to be 3.
an Instructions screen after you press start on the title screen. so you'll have to press start to start, and start again to get past the instructions screen.
If anyone wants to help let me know!
This is not for the contest considering its more of an adult/joke game but regardless if you want to help, please do.
The music heard in the video is my own composition, I did it in FL Studio as I have no idea how to use famittracker. I'll need some help musically when I get to that point.
Re: Diablobetes
- For the 3 lives and death, and instruction screens/ Cutscenes... I replied on the other post: http://nesmakers.com/viewtopic.php?p=12267#p12267
- For the Skulls worth X amount of point, edit the script assigned to your PowerUp 03 (for increase score).
And change the Addvalue params, from
to:
(for example add 5 points, instead of 1)
And if you want special bonus... a simple way would be to use another PowerUp type (for example the "PowerUp 02" if unused), assign a duplicate of that script but with another value in params.
- For the Skulls worth X amount of point, edit the script assigned to your PowerUp 03 (for increase score).
And change the Addvalue params, from
Code: Select all
AddValue #$08, myScore, #$01, #$00
Code: Select all
AddValue #$08, myScore, #$05, #$00
And if you want special bonus... a simple way would be to use another PowerUp type (for example the "PowerUp 02" if unused), assign a duplicate of that script but with another value in params.
-----
Sorry about my poor english
All I need: A Damn Fine Cup of Coffee
My games: PRESS START GAME / UNDERGROUND ADVENTURE
Sorry about my poor english
All I need: A Damn Fine Cup of Coffee
My games: PRESS START GAME / UNDERGROUND ADVENTURE
- PewkoGames
- Posts: 35
- Joined: Thu Sep 13, 2018 9:16 am
Re: Diablobetes
Sweet! Okay so I got the score running (though occansionally with the 01234567 score counter, the 5 goes black and I can't see the number. ) occasinoally I also get the game freezing when I turn invincible. Not sure how to fix that. Another thing is when I die, I go back to the first level, is there a way to have it so I continue on the current level?
- PewkoGames
- Posts: 35
- Joined: Thu Sep 13, 2018 9:16 am
Re: Diablobetes
okay so I figured out that when I lose a life, THAT's when things get screwy. When I have all 3, it works fine. When I get to 2, the score gets messed up and the game freezes when I run into an enemy. Any ideas?
Re: Diablobetes
I found out that some HUD elements have a custom behavior in the engine code... (and strange issues, I need to digg'in that when I have more time)
But in the mean time, for your game, just change the HUD element to use for your Score:
Go to "HUD & Boxes > User Variables", rename the 3rd element (your current "myScore") to UserVar_2 and select a unused one for example the UserVar_5 (or 6 or 7) and rename it to "myScore" with initial value of "0".
Before:

After:

Then go to the "HUD Elements" tab, select the element 3 (your old Score) set max value to "0" and type to "none".
And lastly, set the element corresponding to your new MyScore (number and max value, ...).
Now you score should work without issue.
But in the mean time, for your game, just change the HUD element to use for your Score:
Go to "HUD & Boxes > User Variables", rename the 3rd element (your current "myScore") to UserVar_2 and select a unused one for example the UserVar_5 (or 6 or 7) and rename it to "myScore" with initial value of "0".
Before:

After:

Then go to the "HUD Elements" tab, select the element 3 (your old Score) set max value to "0" and type to "none".
And lastly, set the element corresponding to your new MyScore (number and max value, ...).
Now you score should work without issue.
-----
Sorry about my poor english
All I need: A Damn Fine Cup of Coffee
My games: PRESS START GAME / UNDERGROUND ADVENTURE
Sorry about my poor english
All I need: A Damn Fine Cup of Coffee
My games: PRESS START GAME / UNDERGROUND ADVENTURE
- PewkoGames
- Posts: 35
- Joined: Thu Sep 13, 2018 9:16 am
Re: Diablobetes
Its still giving me the same issue, after I lose a life the score gets all jarbles and the game freezes when I run into an enemy. I'm even using the latest build
Re: Diablobetes
First, you need to fix your collision issue.
Have you made any modification in the HandleObjectCollision script and/or the HandlePlayerHurt script?
I tested with the maze module (from the tutorial video) and it worked for me (with the modification of HUD variable I explained previously).
PS: If they are different than the basic module one, could you share them?
Have you made any modification in the HandleObjectCollision script and/or the HandlePlayerHurt script?
I tested with the maze module (from the tutorial video) and it worked for me (with the modification of HUD variable I explained previously).
PS: If they are different than the basic module one, could you share them?
-----
Sorry about my poor english
All I need: A Damn Fine Cup of Coffee
My games: PRESS START GAME / UNDERGROUND ADVENTURE
Sorry about my poor english
All I need: A Damn Fine Cup of Coffee
My games: PRESS START GAME / UNDERGROUND ADVENTURE
- PewkoGames
- Posts: 35
- Joined: Thu Sep 13, 2018 9:16 am
Re: Diablobetes
Hey,
I have not made any modification to either script. I don't think they are any different from the basic module but Here they are anyway.
HandleObjectCollission
HandlePlayerHurt
The only things I added were the "PlayerLoseLife_withLives" script
I have not made any modification to either script. I don't think they are any different from the basic module but Here they are anyway.
HandleObjectCollission
Code: Select all
;; LOAD OBJECT 00
;; OUTER LOOP
;; CHECK IF ACTIVE, IF NOT, SKIP OBJECT
;; LOAD self-collision-box
;; START OBJECT COLLISION LOOP
;; LDA ONE MORE THAN CURRENT OBJECT
;; CHECK IF ACTIVE. IF NOT, SKIP THIS other
;; IF IT IS ACTIVE, then we have to play them against each other.
;; IS self object hurt by monsters? If so, and other object is a monster, respond.
;; IS self object hurt by weapons? If so, and other object is a weapon, respond.
;; at this point, we can still gauge whether or not it's affected by player, like with powerups.
;; ADD one to the object being checked, loop through other objects.
;; increase object, return to outer loop. Repeat thorugh all self objects.
;; ObjectFlags:
;; 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0
; | | | | | | | + -- PERSISTENT (especially good for player!)
; | | | | | | +------- player type
; | | | | | + ---------- player weapon/projectile type
; | | | | +--------------- monster type
; | | | +------------------- monster weapon/projectile type
; | | +----------------------- pickup / power up
; | + -------------------------- target type
; +------------------------------- NPC type
;; player type checks monster, mosnter weapon, and pickup.
;; player weapon checks monster and target.
;; nothing else needs checking, as it would all be handled by those two steps.
;; so if it's a monster, do nothing. if it's a monster projectile, do nothing.
;; if it's a pickup, or a target, or it ignores all collisions, do nothing.
;; only if it's #%00000110, do something.
HandleObjectCollisions:
LDA update_screen
BEQ notChangingScreens
rts
notChangingScreens:
LDA npc_collision
AND #%11111110
STA npc_collision
;LDA currentBank
;STA prevBank
;LDY #BANK_ANIMS
;JSR bankswitchY
LDX #$00
CollisionOuterLoop:
TXA
STA tempx
LDA Object_status,x
AND #%10000000
BNE continueObjectCollisions_objectIsActive
JMP doneWithThisObjectCollision
continueObjectCollisions_objectIsActive:
LDA Object_status,x
AND #%00000100 ;; is ot off screen
BEQ continueObjectCollisions_objectIsOnScreen
JMP doneWithThisObjectCollision
continueObjectCollisions_objectIsOnScreen
LDA Object_status,x
AND #%00000011
BEQ continueObjectCollisions_objectIsNotHurtOrInvincible
JMP doneWithThisObjectCollision
continueObjectCollisions_objectIsNotHurtOrInvincible
;LDY Object_type,x
;LDA ObjectFlags,y
LDA Object_flags,x
AND #%00000110
BNE continueObjectCollisions_onlyPlayerTypesCheck
JMP doneWithThisObjectCollision
continueObjectCollisions_onlyPlayerTypesCheck:
;; this is either a player or player projectile type of object.
;; all other types will be taken care of by iterating through these two types.
;; first, check if it's player type.
;LdA ObjectFlags,y
LDA Object_flags,x
AND #%00000010
BNE isPlayerTypeForCollision
JMP notPlayerType_forObjectCollision
isPlayerTypeForCollision:
LDA player1_object
STA colX
;; is player type for object collision
;; player's index is loaded into tempx
JSR GetSelfCollisionBox
;; now we have the collision box for self object
;; next we loop through objects.
LDX #$00
LoopThroughOtherObjects_player:
CPX tempx
BNE dontSkipThisOtherObject
JMP skipThisOtherObject ;; other object IS the player, the one doing the counting..
dontSkipThisOtherObject:
LDA Object_status,x
AND #%00000100
BEQ dontSkipThisOtherObject_becauseOnScreen
JMP skipThisOtherObject ;; because it was off screen.
dontSkipThisOtherObject_becauseOnScreen:
JSR GetOtherCollisionBox
;; now we can do all the compares
LDA selfNT_R
CMP otherNT_L
BCC + ;; no player object collision
BNE ++ ;; is still possible to see collision.
LDA selfRight
CMP otherLeft
BCC + ;; no player object collision
++ ;; it is still possible there is a collision here.
LDA otherNT_R
CMP selfNT_L
BCC +
BNE +++
LDA otherRight
CMP selfLeft
BCC +
+++ ;; there was a collision here
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LDA otherBottom
CMP selfTop
BCC +
LDA selfBottom
CMP otherTop
BCC +
JMP DoPlayerObjectCollision
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; there is no collision here horizontally.
JMP noPlayerObjectCollision
DoPlayerObjectCollision:
LDA Object_flags,x
AND #%10000000 ;; is it an NPC
BNE isAnNPC
;; is not an NPC
JMP isNotAnNPCcollision
isAnNPC:
;;;; do npc stuff.
LDA npc_collision
ORA #%00000001
STA npc_collision
;;;; enables a button to be used to activate a textbox.
LDA Object_ID,x
STA textVar
;LDA gameHandler
;ORA #%00100000
;STA gameHandler
JMP skipThisOtherObject
isNotAnNPCcollision:
LDA Object_flags,x
;LDA ObjectFlags,y
AND #%00011000 ;; is it a monster type?
BNE otherIsAMonsterTypeCollision
JMP otherIsNotAMonsterTypeCollision
otherIsAMonsterTypeCollision:
LDA Object_status,x
AND #HURT_STATUS_MASK ;; if the monster is hurt, it can't hurt us
BEQ yesPlayerObjectCollision
JMP noPlayerObjectCollision
yesPlayerObjectCollision:
LDA Object_vulnerability,x
AND #%00000010 ;; in this module, this is ignore player collision
BEQ doPlayerHurt
JMP noPlayerObjectCollision
doPlayerHurt:
;;;observe health
TXA
STA tempx ;; object is in tempx.
LDX player1_object
LDA Object_status,x
AND #HURT_STATUS_MASK
BEQ playerWasNotHurtDuringCollision
JMP playerWasHurtDuringCollision
playerWasNotHurtDuringCollision:
LDA Object_vulnerability,x
AND #%01000000 ;; is he lethal invincible?
BNE isLethalInvincible
JMP notLethalInvincible
isLethalInvincible:
LDX tempx
LDA Object_x_hi,x
STA temp
LDA Object_y_hi,x
STA temp1
CreateObject temp, temp1, #OBJ_MONSTER_DEATH, #$00, currentNametable ;; create "splat"
LDX tempx
ChangeObjectState #$03, #$10 ;; in the maze game, this is a "ghostly" state
;;; ordinarily we'll want to destroy the instance.
;DeactivateCurrentObject
;; incrase score, you killed a monster
PlaySound #SND_SPLAT
TXA
STA tempx
AddValue #$08, myScore, #$01, #$00
;;; we also need to set up the routine to update the HUD
;; for this to work right, health must be a "blank-then-draw" type element.
;STA hudElementTilesToLoad
; LDA #$00
; STA hudElementTilesMax
; LDA DrawHudBytes
; ora #HUD_myScore
; STA DrawHudBytes
UpdateHud HUD_myScore
LDX tempx
;;
JMP skipThisOtherObject
notLethalInvincible:
;;;;;;;;;;;;;;;;;
;;;;;;;;; WHAT HAPPENS WHEN PLAYER IS HURT
.include SCR_PLAYER_HURT_SCRIPT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
playerWasHurtDuringCollision:
LDX tempx
JMP skipThisOtherObject
otherIsNotAMonsterTypeCollision:
;LDA ObjectFlags,y
LDA Object_flags,x
AND #%00100000 ;; is it a 'collectable'?
BEQ otherIsNotAcollectable
;;;; IS A pickup / power up
DeactivateCurrentObject ;; makes the other object go away
;; since other object is loaded in X
;;=========== WHAT DO YOU WANT TO HAVE HAPPEN WHEN YOU COLLECT THIS ITEM?
JSR HandlePickupPowerup
otherIsNotAcollectable:
noPlayerObjectCollision:
skipThisOtherObject:
INX
CPX #TOTAL_MAX_OBJECTS
BEQ doneLoopThroughOtherObjects_player
JMP LoopThroughOtherObjects_player
doneLoopThroughOtherObjects_player:
;; end of player collision
LDX tempx ;; restore x
JMP doneWithThisObjectCollision
notPlayerType_forObjectCollision:
;; is of player weapon type.
JSR GetSelfCollisionBox
;; now we have the collision box for self object
;; next we loop through objects.
LDX #$00
LoopThroughOtherObjects_weapon:
CPX tempx
BNE dontskipThisOtherObject_weapon
JMP skipThisOtherObject_weapon
dontskipThisOtherObject_weapon
JSR GetOtherCollisionBox
;; now we can do all the compares
LDA selfNT_R
CMP otherNT_L
BCC + ;; no player object collision
BNE ++ ;; is still possible to see collision.
LDA selfRight
CMP otherLeft
BCC + ;; no player object collision
++ ;; it is still possible there is a collision here.
LDA otherNT_R
CMP selfNT_L
BCC +
BNE +++
LDA otherRight
CMP selfLeft
BCC +
+++ ;; there was a collision here
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LDA otherBottom
CMP selfTop
BCC +
LDA selfBottom
CMP otherTop
BCC +
JMP doWeaponObjectCollision
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; there is no collision here horizontally.
JMP noWeaponObjectCollision
doWeaponObjectCollision:
;; go through the different types of collision possible.
;; first, check monster OR monser projectile, as that should lead to hurt/death
;LDY Object_type,x
;LDA ObjectFlags,y
LDA Object_flags,x
AND #%00001000 ;; is it a monster type?
;;; if you'd like the player weapon to ALSO destroy projectiles
;;; use #%00011000 here
BNE otherIsMonsterTypeCollision_weapon
JMP otherIsNotAMonsterTypeCollision_weapon
otherIsMonsterTypeCollision_weapon:
;;;;;;;;;;;;;;;;;;;;;;;;
TXA
PHA
.include SCR_HANDLE_HURT_MONSTER
PLA
TAX
;;; if monster dies, count monsters
;; right now, he always dies, so count the monsters.
JSR countAllMonsters
otherIsNotAMonsterTypeCollision_weapon:
noWeaponObjectCollision:
skipThisOtherObject_weapon:
INX
CPX #TOTAL_MAX_OBJECTS
BEQ doneWithLoopingThroughWeaponObjects
JMP LoopThroughOtherObjects_weapon
doneWithLoopingThroughWeaponObjects:
;; end of player collision
LDX tempx ;; restore x
JMP doneWithThisObjectCollision
doneWithThisObjectCollision:
LDX tempx
INX
CPX #TOTAL_MAX_OBJECTS
BEQ doneWithAllObjects
JMP CollisionOuterLoop
doneWithAllObjects:
;LDY prevBank
;JSR bankswitchY
RTS
GetSelfCollisionBox:
LDA Object_x_hi,x
CLC
ADC Object_left,x
STA selfLeft
LDA Object_scroll,x
ADC #$00
STA selfNT_L
LDA Object_x_hi,x
CLC
ADC Object_right,x
STA selfRight
LDA Object_scroll,x
ADC #$00
STA selfNT_R
LDA Object_vulnerability,x
AND #%10000000
BEQ noDuckingBit
LDA Object_bottom
SEC
SBC Object_top
STA temp
LDA Object_y_hi,x
CLC
ADC temp
JMP gotSelfTop
noDuckingBit:
LDA Object_y_hi,x
CLC
ADC Object_top,x
gotSelfTop:
STA selfTop
LDA Object_y_hi,x
CLC
ADC Object_bottom,x
STA selfBottom
LDA Object_x_hi,x
CLC
ADC Object_origin_x,x
STA selfCenterX
LDA Object_y_hi,x
CLC
ADC Object_origin_y,x
STA selfCenterY
RTS
GetOtherCollisionBox:
LDA Object_x_hi,x
CLC
ADC Object_left,x
STA otherLeft
LDA Object_scroll,x
ADC #$00
STA otherNT_L
LDA Object_x_hi,x
CLC
ADC Object_right,x
STA otherRight
LDA Object_scroll,x
ADC #$00
STA otherNT_R
LDA Object_vulnerability,x
AND #%10000000
BEQ noDuckingBit_other
LDA Object_bottom
SEC
SBC Object_top
STA temp
LDA Object_y_hi,x
CLC
ADC temp
JMP gotSelfTop_other
noDuckingBit_other:
LDA Object_y_hi,x
CLC
ADC Object_top,x
gotSelfTop_other:
STA otherTop
LDA Object_y_hi,x
CLC
ADC Object_bottom,x
STA otherBottom
LDA Object_x_hi,x
CLC
ADC Object_origin_x,x
STA otherCenterX
LDA Object_y_hi,x
CLC
ADC Object_origin_y,x
STA otherCenterY
RTS
DetermineRecoilDirection:
;;;RECOIL
;;First check for the abs x value
LDA recoil_selfX
SEC
SBC recoil_otherX
BCS absCheckDone
EOR #$FF
CLC
ADC #$01
absCheckDone:
STA temp
LDA recoil_selfY
SEC
SBC recoil_otherY
BCS absCheckDone2
EOR #$FF
CLC
ADC #$01
absCheckDone2:
CMP temp
BCS vCol
LDA recoil_selfX
CMP recoil_otherX
BCS recoilRight
;; recoil left
;LDX #$01
LDA #RECOIL_SPEED_LO
STA Object_h_speed_lo,x
LDA #$00
SEC
SBC #RECOIL_SPEED_HI
STA Object_h_speed_hi,x
LDA #$00
STA Object_v_speed_hi,x
STA Object_v_speed_lo,x
LDA #%10000000
STA temp1
LDA Object_movement,x
AND #%00000111
ORA temp1
STA Object_movement,x
CPX player1_object
BNE dontChangeScrollDirectionL
LDA #$00
STA scrollDirection
dontChangeScrollDirectionL
RTS
recoilRight:
;LDX #$01
LDA #RECOIL_SPEED_LO
STA Object_h_speed_lo,x
LDA #RECOIL_SPEED_HI
STA Object_h_speed_hi,x
LDA #$00
STA Object_v_speed_hi,x
STA Object_v_speed_lo,x
LDA #%11000000
STA temp1
LDA Object_movement,x
AND #%00000111
ORA temp1
STA Object_movement,x
CPX player1_object
BNE dontChangeScrollDirectionR
LDA #$01
STA scrollDirection
dontChangeScrollDirectionR:
RTS
vCol:
LDA recoil_selfY
CMP recoil_otherY
BCS recoilDown
;LDX #$01
LDA #RECOIL_SPEED_LO
STA Object_v_speed_lo,x
LDA #$00
SEC
SBC #RECOIL_SPEED_HI
STA Object_v_speed_hi,x
LDA #%00100000
STA temp1
LDA #$00
STA Object_h_speed_hi,x
STA Object_h_speed_lo,x
LDA Object_movement,x
AND #%00000111
ORA temp1
STA Object_movement,x
RTS
recoilDown:
;LDX #$01
LDA #RECOIL_SPEED_LO
STA Object_v_speed_lo,x
LDA #RECOIL_SPEED_HI
STA Object_v_speed_hi,x
LDA #%00110000
STA temp1
LDA #$00
STA Object_h_speed_hi,x
STA Object_h_speed_lo,x
LDA Object_movement,x
AND #%00000111
ORA temp1
STA Object_movement,x
RTS
Code: Select all
;;; assumes myHealth variable
;;; if a different variable should handle health
;;; change thename of myHealth.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; uses timers set in GameData\Constants:
;;OBJECT TIMERS
;HURT_TIMER = #$08
;INVINCIBILITY_TIMER = #$08
;RECOIL_SPEED_HI = #$06
;RECOIL_SPEED_LO = #$00
;;;; To change invincibility time, knock back speed, or hurt duration
;;;; updating the abovevalues in constants.
LDA Object_health,x
SEC
SBC #$01 ;; subtract other's strength
CMP #$01
BCS notPlayerDeath
PlaySound #SND_HURT_PLAYER
JSR HandlePlayerDeath
JMP doneWithPlayerHurt
notPlayerDeath:
STA Object_health,x
STA myHealth
STA hudElementTilesToLoad
LDA #$00
STA hudElementTilesMax
; LDA DrawHudBytes
; ora #HUD_myHealth
; STA DrawHudBytes
UpdateHud HUD_myHealth
;; TURN ON handling the hud
LDA Object_status,x
ORA #%00000001
STA Object_status,x
LDA #HURT_TIMER
STA Object_timer_0,x
ChangeObjectState #$00,#$02 ;; uses idle for hurt state.
LDA selfCenterX
STA recoil_selfX
LDA selfCenterY
STA recoil_selfY
LDA otherCenterX
STA recoil_otherX
LDA otherCenterY
STA recoil_otherY
JSR DetermineRecoilDirection
;;;;; SCROLLER CAN NOT MAKE USE OF UPDATING HUD THIS WAY.
doneWithPlayerHurt:
Re: Diablobetes
Ok, I used your scripts with no issue.
Could you check again your HUD variables and Hud elements?
Or would you be ok to send me your NESMaker folder (in fact I just need the project MST file, the GraphicAssets + GameEngineData folders)? I can check what's going on and tell you how to fix it.
Could you check again your HUD variables and Hud elements?
Or would you be ok to send me your NESMaker folder (in fact I just need the project MST file, the GraphicAssets + GameEngineData folders)? I can check what's going on and tell you how to fix it.
-----
Sorry about my poor english
All I need: A Damn Fine Cup of Coffee
My games: PRESS START GAME / UNDERGROUND ADVENTURE
Sorry about my poor english
All I need: A Damn Fine Cup of Coffee
My games: PRESS START GAME / UNDERGROUND ADVENTURE
- PewkoGames
- Posts: 35
- Joined: Thu Sep 13, 2018 9:16 am
Re: Diablobetes
No problem! I'll DM you it