Here how to do :
1/ In the "Project Settings > User Constants", create a new constant named "OBJECT_PLAYER_MELEE" with the value "1".
2/ Create a new script "b_create_melee_weapon.asm" in the "GameEngineData\Routines\Basic\ModuleScripts\InputScripts" folder, with this code:
Code: Select all
LDA gameHandler AND #%00100000 BEQ notNPCstate_attack JMP doneAttacking notNPCstate_attack: LDA weaponsUnlocked AND #%00000001 BNE canAttack JMP doneAttacking canAttack: LDX player1_object GetCurrentActionType player1_object CMP #$03 BNE notAlreadyAttacking JMP doneAttacking notAlreadyAttacking: ;;; don't attack if already attacking. ;;; do we have to check for hurt here? ;;;;; Here, we WOULD create melee ChangeObjectState #$03, #$02 LDA Object_movement,x AND #%00001111 STA Object_movement,x LDA #$00 STA Object_h_speed_hi,x STA Object_h_speed_lo,x STA Object_v_speed_hi,x STA Object_v_speed_lo,x LDA Object_x_hi,x STA temp LDA Object_y_hi,x STA temp1 LDA Object_movement,x AND #%00000111 STA temp2 TAY LDA Object_x_hi,x SEC SBC #$08 ;; <<--- HERE, you have to set width of melee weapon STA temp LDA Object_scroll,x SBC #$00 STA temp3 LDA temp ;;; offset x for creation CLC ADC weaponOffsetTableX,y STA temp LDA temp3 ADC #$00 STA temp3 LDA Object_y_hi,x CLC ADC weaponOffsetTableY,y SEC SBC #$08 ;; <<--- HERE, you have to set height of melee weapon STA temp1 CreateObject temp, temp1, #OBJECT_PLAYER_MELEE, #$00, temp3 meleeCreated: ;;;; x is now the newly created object's x. LDA Object_movement,x ORA temp2 STA Object_movement,x ;PlaySound #SND_SLASH doneAttacking: RTS
3/ In the hierarchy, under "Game Objects", select and setup your "Melee" object:
In the "Details Object", you can its left / right animation :
Then, set it as "Player weapon".:
Set the "Action step 0" to "Ignore gravity" and to "DestroyMe" after the end of the animation, give an animation speed (even if don't have any particular animation!):
And don't forget to set the Bounding Box!
4/ Now, select the "Player" object, go the "Object Details". For the "Action Step 03", uncheck the "Harmfull invicible", set to "Loop" the end of action and set to "GoToFirst" the End of animation, give an animation speed (even if don't have any particular animation!):
5/ In the hierarchy, select the "Game Object" element, and set the position (the Offset) of your Melee object with your Player for all its facing directions:
6/ In the "Scripts > input Scripts" add the "b_create_melee_weapon.asm" script.
7/ In the "Input Editor", assign it to your button ("Press" "B" button).
8/ In your "Project Settings > Script Settings", select the "Use Sprite Based Weapon" element and assign it the "Routines\Basic\ModuleScripts\BlankScript.asm":
9/ Make a new script "PreDraw_DC.asm" in your "GameEngineData\Routines\Basic\ModuleScripts\MainScripts\AdventureGame" folder, with this code (it's the same script that the PreDraw, I just removed all the part about the weapon):
Code: Select all
;; sprite pre-draw ;;; this will allow a user to draw sprites ;;; before object sprites are drawn. ;;; keep in mind, there are still only 64 sprites ;;; that can be drawn on a screen, ;;; and still only 8 per scan line! ;;; you can use DrawSprite macro directly using the following scheme: ;DrawSprite arg0, arg1, arg2, arg3, arg4 ;arg0 = x ;arg1 = y ;arg2 = chr table value ;arg3 = attribute data ;arg3 = starting ram position ;; x and y are the direct positions on the screen in pixels. ;; chr table value is which sprite you'd like to draw from the ppu table. ;; attribute data is a binary number (starts with #%), and here are how the bits work: ;;; bit 7 - Flip sprite vertically ;;; bit 6 - Flip sprite horizontally ;;; bit 5 - priority (0 in front of background, 1 behind background) ;;; bit 4,3,2 - (null) ;;; bit 1,0 - subpalette used (00, 01, 10, 11) ;;; for starting ram position, use spriteOffset. ;; this is set to 0 just before entering this script (or 4 if sprite 0 hit was used). ;; ***remember to increase spriteOffset by 4 for every sprite that is drawn, ;; including after the last one drawn*****, so that the first object's sprite begins ;; in the next available spot. ;; I have created a macro function to handle updating to the next sprite. So, to update to the next sprite position, ;; all that you have to do is use the function UpdateSpritePointer ;;EXAMPLE: ; DrawSprite #$80, #$80, #$10, #%00000000, spriteOffset ; UpdateSpritePointer ;;;; DRAW SPRITE ZERO FOR SPRITE ZERO HIT LDA gameState CMP #GS_MainGame BNE + ;dont draw sprite zero ;DrawSprite #$f8, #$1e, #$7F, #%00000000, spriteOffset ;248 30 127 bit 5 = priority DrawSprite #SPRITE_ZERO_X, #SPRITE_ZERO_Y, #SPRITE_ZERO_INDEX, #%00100000, spriteOffset UpdateSpritePointer ;dont draw sprite zero. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10/ In your "Project Infos", you can check the "Weapon 1 unlock" if you want your player to have the weapon at launch (else he will have to get it from an NPC):
Voilà, your Melee weapon should work as expected...
Note: you should get rid of your GetSword pickup object, make it a health pickup or anything else you want (change the script assign to the "Power Up 00" in the "Project Settings > Script Settings").