Allgemeine Hex- und ASM-Fragen

geschrieben am 22.04.2013 21:05:17
( Link )
Hab auch mal wieder eine Frage.
Habe einen Custom Block erstellt, doch habe ein kleines Problem.
Der Block soll die etwas verbuggte SMW Lava ersetzen, was an sich auch gut funktioniert. Mario wird instant getötet und Items versinken drinnen.. alle außer eins!
Wenn ich einen Baby-Yoshi hereinwerfe, versinkt dort nicht der Yoshi, sondern ein Grüner Turn-Block. o-o
Baby-Yoshi gilt dann trotzdem als getötet, aber es sieht einfach bescheuert aus. Hoffe jemand findet den Fehler.

Code
db $42

JMP MarioBelow : JMP MarioAbove : JMP MarioSide
JMP SpriteV : JMP SpriteH
JMP Cape : JMP Fireball
JMP MarioCorner : JMP MarioHead : JMP MarioBody

MarioBelow:
MarioAbove:
MarioSide:
JSL $00F606
RTL

SpriteV:
SpriteH:
LDA #$05
STA $14C8,X
LDA #$40
STA $1558,x
Cape:
Fireball:
MarioCorner:
MarioHead:
MarioBody:
RTL
geschrieben am 22.04.2013 21:16:36
( Link )
Kann sein, dass der Baby-Yoshi nicht für den Status #$05 gemacht ist.

Wenn alles nichts hilft, dann füg das gleich hinter SpriteH: ein, damit der Sprite sofort verschwindet (immerhin ein bisschen eleganter):

Code
LDA $9E,x
CMP #$xx ; hier Sprite-Nummer einfügen
BNE +
STZ $14C8,x
BRA Cape
+
geschrieben am 22.04.2013 21:21:46
( Link )
Danke für die schnelle Hilfe.
geschrieben am 25.04.2013 20:12:01
( Link )
Eher eine Animationsfrage, aber ich denke dass passt auch hier her.
Wenn ein Fragezeichenblock ausgelöst wird und eine Ranke raus kommt, würde der Block danach zu einem braunen Block werden.
Es gibt 2 Lösungsmöglichkeiten für mein Problem (die mir einfallen würden):
1. (bevorzugt) Es wird kein brauner Block, sondern ein Rankenteil aus dem Fragezeichenblock
2. Dieser eine braune Block wird nicht von den P-Switches beeinflusst.
geschrieben am 26.04.2013 1:46:20
( Link )
zu 1.
Das hier als Custom Block einfügen:
Code
db $42
;Ich garantiere nicht, dass das hier zu 100% funktioniert
JMP MarioBelow : JMP MarioAbove : JMP MarioSide : JMP SpriteH : JMP SpriteV : JMP Fireball : JMP Cape : JMP MarioCorner : JMP MarioHead : JMP MarioBody

MarioBelow:
SpriteH:
SpriteV:
Cape:

REP #$20
LDX #$0125 ;<- Map16 Tile, ich bin mir jetzt nicht sicher ob die Map16-Page das erste byte ist oder nicht.
JSR ChangeMap16
SEP #$20

Fireball:
MarioCorner:
MarioHead:
MarioBody:
MarioAbove:
MarioSide:
RTL

PrematureEnd:
PLX
PLY
PLB
PLP
RTS
ChangeMap16:
PHP
SEP #$20
PHB
PHY
LDA #$00
PHA
PLB
REP #$30
PHX
LDA $9A
STA $0C
LDA $98
STA $0E
LDA #$0000
SEP #$20
LDA $5B
STA $09
LDA $1933
BEQ SkipShift
LSR $09
SkipShift:
LDY $0E
LDA $09
AND #$01
BEQ LeaveXY
LDA $9B
STA $00
LDA $99
STA $9B
LDA $00
STA $99
LDY $0C
LeaveXY:
CPY #$0200
BCS PrematureEnd
LDA $1933
ASL A
TAX
LDA $BEA8,x
STA $65
LDA $BEA9,x
STA $66
STZ $67
LDA $1925
ASL A
TAY
LDA [$65],y
STA $04
INY
LDA [$65],y
STA $05
STZ $06
LDA $9B
STA $07
ASL A
CLC
ADC $07
TAY
LDA [$04],y
STA $6B
STA $6E
INY
LDA [$04],y
STA $6C
STA $6F
LDA #$7E
STA $6D
INC A
STA $70
LDA $09
AND #$01
BEQ SwitchXY
LDA $99
LSR A
LDA $9B
AND #$01
BRA CurrentXY
SwitchXY:
LDA $9B
LSR A
LDA $99
CurrentXY:
ROL A
ASL A
ASL A
ORA #$20
STA $04
CPX #$0000
BEQ NoAdd
CLC
ADC #$10
STA $04
NoAdd:
LDA $98
AND #$F0
CLC
ASL A
ROL A
STA $05
ROL A
AND #$03
ORA $04
STA $06
LDA $9A
AND #$F0
REP 3 : LSR A
STA $04
LDA $05
AND #$C0
ORA $04
STA $07
REP #$20
LDA $09
AND #$0001
BNE LayerSwitch
LDA $1A
SEC
SBC #$0080
TAX
LDY $1C
LDA $1933
BEQ CurrentLayer
LDX $1E
LDA $20
SEC
SBC #$0080
TAY
BRA CurrentLayer
LayerSwitch:
LDX $1A
LDA $1C
SEC
SBC #$0080
TAY
LDA $1933
BEQ CurrentLayer
LDA $1E
SEC
SBC #$0080
TAX
LDY $20
CurrentLayer:
STX $08
STY $0A
LDA $98
AND #$01F0
STA $04
LDA $9A
REP 4 : LSR A
AND #$000F
ORA $04
TAY
PLA
SEP #$20
STA [$6B],y
XBA
STA [$6E],y
XBA
REP #$20
ASL A
TAY
PHK
PER $0006
PEA $804C
JML $00C0FB
PLY
PLB
PLP
RTS



(Act like auf 125 stellen und auf die X-Position aufpassen!!!)
zu 2.
Im Prinzip dasselbe wie 1. nur anstelle von LDX #$0125 kommt da einfach der "fake"-Braune Block. Musst aber dafür entweder den Used-Block als GFX haben oder per ExAnimation einfach dazuschreiben und dann noch ein Map16-Tile machen:

(Destination darfst du ruhig ändern, der Rest ist schon so eingestellt, dass es immer den braunen Block gibt)
Tutorials: ExAnimation | YouTube: W4mp3 | Twitter: https://twitter.com/SMWW4mp3
geschrieben am 26.04.2013 6:42:27
( Link )
@w4mp3 warum denn den code so unnötig lang machen
die SMW build in routine erlaubt es doch schon vines zu kreiren
das würde vollkommen reichen:
Code
;acts like 11A
db $42
JMP MarioBelow : JMP MarioAbove : JMP MarioSide
JMP SpriteV : JMP SpriteH : JMP MarioCape : JMP MarioFireball
JMP TopCorner : JMP HeadInside : JMP BodyInside

MarioBelow:
PHY
LDA #$03 ; Replace block with block # 1E6
STA $9C
JSL $00BEB0 ; Make the block disappear.
PLY
MarioAbove:
MarioSide:
TopCorner:
HeadInside:
BodyInside:
SpriteV:
SpriteH:
MarioCape:
MarioFireball:
RTL
WAS, WIE, WO???? Ne, Ne ich bin nicht die Signatur ...
Ich putze hier nur.

Mein Hack:
<!-- m --><a class="postlink" href="http://www.youtube.com/user/conankun88#p/a/u/0/8vdcyGylrg0">http://www.youtube.com/user/conankun88# ... vdcyGylrg0</a><!-- m -->
geschrieben am 26.04.2013 7:22:01
( Link )
Auf jeden Fall schon mal Danke!
Die beiden Blöcke funktionieren aber nicht ganz.
Zünni, deiner macht garnichts.
W4MP3, deiner lässt einen Schlüssel, einen Ballon, eine Münze und Yoshiflügel erscheinen (je nach Position), aber kein Pflanzenteil.

Edit: Zünni, dein Block funktioniert doch. Ich hätte aber sagen sollen, dass der Block von einer Shell seitlich ausgelöst wird und Mario zu dem Zeitpunkt ganz wo anders ist. Wenn ich deinen Code nämlich nur rein kopierer in SpriteH, dann wird, sobald der Block ausgelöst wird der Block nämlich nicht ersetzt, sondern an der Stelle an der Mario steht, wird nun immer wenn der Block berührt wird eine Ranke erzeugt. Ist ganz lustig, aber ^^
Da irgendwelche Lösungsmöglichkeiten?
geschrieben am 26.04.2013 15:05:55
( Link )
Ups, das war das falsche Act Like (2 Uhr abends war doch spät :/ ). Du musst das bei meinem Block auf 11A stellen, dabei immer noch auf die X-Position achten. Wenn du doch mzünnis Block nimmst, dann kopiere "SpriteH:" über "MarioBelow:".

@mzünni:
Ich weiß, dass der lang ist, ich hab einfach die ChangeMap16-Routine aus dem Code Library Thread von SMWC rauskopiert und leicht modifiziert (Sprich: LDX #$0125 : JSR ChangeMap16). Deine Lösung verbraucht weniger Platz, das ist der Vorteil von deinem, meiner Funktioniert theoretisch auch für das zweite von kooopa
Tutorials: ExAnimation | YouTube: W4mp3 | Twitter: https://twitter.com/SMWW4mp3
geschrieben am 26.04.2013 15:51:45
( Link )
der müsste auch mit Sprites gehen
Code
;acts like 11A
db $42
JMP MarioBelow : JMP MarioAbove : JMP MarioSide
JMP SpriteV : JMP SpriteH : JMP MarioCape : JMP MarioFireball
JMP TopCorner : JMP HeadInside : JMP BodyInside

SpriteH:
LDA $0A
AND #$F0
STA $9A
LDA $0B
STA $9B
LDA $0C
AND #$F0
STA $98
LDA $0D
STA $99
MarioBelow:
PHY
LDA #$03 ; Replace block with block # 1E6
STA $9C
JSL $00BEB0 ; Make the block disappear.
PLY
MarioAbove:
MarioSide:
TopCorner:
HeadInside:
BodyInside:
SpriteV:
MarioCape:
MarioFireball:
RTL
WAS, WIE, WO???? Ne, Ne ich bin nicht die Signatur ...
Ich putze hier nur.

Mein Hack:
<!-- m --><a class="postlink" href="http://www.youtube.com/user/conankun88#p/a/u/0/8vdcyGylrg0">http://www.youtube.com/user/conankun88# ... vdcyGylrg0</a><!-- m -->
geschrieben am 29.04.2013 17:53:12
( Link )
Zünni, der Block funktioniert jetzt in sofern, dass er nach der Berührung durch die Shell zu einem Rankenteil wird, nur die Ranke an sich (der Sprite) kommt nicht raus. Der Block verwandelt sich jetzt einfach nur in ein einziges Rankenteil.
geschrieben am 29.04.2013 20:00:30
( Link )
Zitat von mzünni:
Code
;acts like 11A

?
geschrieben am 29.04.2013 20:19:45
( Link )
Hab ich, aber ich hab den Fehler. 11A ist bei mir aus irgendwelchen Gründen ein PowerUp Block.
Dass sollte ich doch alleine ändern können. Hoffe ich
Auf jeden Fall, danke euch allen!

Edit: Hat funktioniert!
geschrieben am 29.04.2013 23:01:31
( Link )
Nunja, ich habe es zwar geschafft, das ActLike zu verändern, aber selbst mit normal ActLike 11A, gleiches Ergebnis wie oben beschrieben. Außerdem ist mir noch was zusätzlich aufgefallen. Der Block wird jetzt leider ausgelöst, egal welcher Sprite ihn berührt, nicht nur durch eine Shell
geschrieben am 30.04.2013 16:02:42
( Link )
so jetzt auch mit richtigem Sprite status check
Code
;acts like 11A
db $42
JMP MarioBelow : JMP MarioAbove : JMP MarioSide
JMP SpriteV : JMP SpriteH : JMP MarioCape : JMP MarioFireball
JMP TopCorner : JMP HeadInside : JMP BodyInside

SpriteH:
LDA $14C8,x
CMP #$0A
BNE Return
BRA ReplaceSprite
SpriteV:
LDA $AA,x
BPL Return
LDA $14C8,x
CMP #$09
BNE Return
ReplaceSprite:
LDA $0A
AND #$F0
STA $9A
LDA $0B
STA $9B
LDA $0C
AND #$F0
STA $98
LDA $0D
STA $99
MarioBelow:
PHY
LDA #$03 ; Replace block with block # 1E6
STA $9C
JSL $00BEB0 ; Make the block disappear.
PLY
MarioAbove:
MarioSide:
TopCorner:
HeadInside:
BodyInside:
MarioCape:
MarioFireball:
RTL
WAS, WIE, WO???? Ne, Ne ich bin nicht die Signatur ...
Ich putze hier nur.

Mein Hack:
<!-- m --><a class="postlink" href="http://www.youtube.com/user/conankun88#p/a/u/0/8vdcyGylrg0">http://www.youtube.com/user/conankun88# ... vdcyGylrg0</a><!-- m -->
geschrieben am 30.04.2013 20:32:08
( Link )
Noch mal danke.
Hab noch das Return Label eingefügt, hattest du vergessen und nun klappt die Spriteabfrage.
Das Problem ist aber nach wie vor, dass sich der Block nur in eine Ranke verwandelt und kein Rankensprite rauskommt, der die Ranke dann auch nach oben aufbaut. Trotz Act Like 11A.
Klappt es denn bei dir, oder nur bei mir nicht?
geschrieben am 30.04.2013 20:39:28
( Link )
ich habe das nicht ausprobiert aber logisch gesehen müsste der stadart code vom Wine block ausgeführt werden, der die Wine spawnt das Bounce-sprite und den block zu einem Braunen Block macht und dann wird der custom block code ausgeführt welcher den block in eine ranke ändert...
(hast du schonmal ausprobiert was passiert wenn du direkt block 11A platzierst?)
WAS, WIE, WO???? Ne, Ne ich bin nicht die Signatur ...
Ich putze hier nur.

Mein Hack:
<!-- m --><a class="postlink" href="http://www.youtube.com/user/conankun88#p/a/u/0/8vdcyGylrg0">http://www.youtube.com/user/conankun88# ... vdcyGylrg0</a><!-- m -->
geschrieben am 30.04.2013 20:47:37
( Link )
Ja, habe ich. An der richtigen X-Position kommt eine Ranke raus.
geschrieben am 30.04.2013 21:12:06
( Link )
ok ich schreibe das rankenspawnen einfach noch in den Block selbst rein...
SO ist auch nur unwesentlich länger...
Code
    ;acts like 130
db $42
JMP MarioBelow : JMP MarioAbove : JMP MarioSide
JMP SpriteV : JMP SpriteH : JMP MarioCape : JMP MarioFireball
JMP TopCorner : JMP HeadInside : JMP BodyInside

SpriteH:
LDA $14C8,x
CMP #$0A
BEQ ReplaceSprite
Return:
RTL
SpriteV:
LDA $AA,x
BPL Return
LDA $14C8,x
CMP #$09
BNE Return
ReplaceSprite:
LDA $0A
AND #$F0
STA $9A
LDA $0B
STA $9B
LDA $0C
AND #$F0
STA $98
LDA $0D
STA $99
MarioBelow:
LDA #$03
STA $1DFC
LDA #$0F
TRB $9A
TRB $98
PHY
LDA #$03 ; Replace block with block # 1E6
STA $9C
JSL $00BEB0 ; Make the block disappear.
PHB ;preserve current bank
LDA #$02 ;push 02
PHA
PLB ;bank = 02
JSR iwannabounce ; block bounce sprite routine, ripped of SMB3 Brick bin file.
PLB ;restore bank
PLY
PHX
NextSprite:
LDX #$0B
LDA $14C8,x
BEQ FoundSlot
DEX
BPL NextSprite
LDA $1861
EOR #$01
STA $1861
CLC
ADC #$0A
TAX
FoundSlot:
LDA #$08
STA $14C8,x
LDA #$79
STA $9E,x
JSL $07F7D2
INC $15A0,x
LDA $9A
STA $E4,x
LDA $9B
STA $14E0,x
LDA $98
STA $D8,x
LDA $99
STA $14D4,x
LDA #$3E
STA $1540,x
LDA #$D0
STA $AA,x
LDA #$2C
STA $144C,x
PLX

MarioAbove:
MarioSide:
TopCorner:
HeadInside:
BodyInside:
MarioCape:
MarioFireball:
RTL
iwannabounce:
LDX #$00
LDY #$03 ; used for indexing
LDA $8789,x
STA $1901,y ; YXPPCCCT data of bounce sprite that is being shown

LDA #$01 ;Image

STA $1699,y ; Block Bounce Sprite Image Table
LDA #$01 ;seems useless
STA $169D,y ; Block Bounce Sprite ? Table
LDA $9A
STA $16A5,y ; Block Bounce Sprite Xpos Low Byte Table
LDA $9B
STA $16AD,y ; Block Bounce Sprite Xpos High Byte Table
LDA $98
STA $16A1,y ; Block Bounce Sprite Ypos Low Byte Table
LDA $99
STA $16A9,y ; Block Bounce Sprite Ypos High Byte Table
LDA #$08
STA $16C5,y ; Block Bounce Sprite Bouncing Flag Table
LDA #$00
STA $16C1,y ; Block Bounce Sprite Turns Into Table

LDA $1933
LSR A
ROR A
STA $08
LDX #$00
LDA $873A,x
STA $16B1,y ; Block Bounce Sprite YSpeed Table
LDA $873E,x
STA $16B5,y ; Block Bounce Sprite XSpeed Table
TXA
ORA $08 ; seems useless too
STA $16C9,y ; Block Bounce Sprite ? Table
JSR SpriteBlockInteract
RTS

SpriteBlockInteract:
LDY #$03
ALoop1:
LDA $16CD,y ; Block Bounce Sprite Exists Flag Table
BEQ Missing4bytes
DEY
BPL ALoop1
INY ; equal to LDY #$00
Missing4bytes:
LDA $9A
STA $16D1,y
LDA $9B
STA $16D5,y
LDA $98
STA $16D9,y
LDA $99
STA $16DD,y
LDA $1933
BEQ Missing1Ebytes
LDA $9A
SEC
SBC $26
STA $16D1,y
LDA $9B
SBC $27
STA $16D5,y
LDA $98
SEC
SBC $28
STA $16D9,y
LDA $99
SBC $29
STA $16DD,y
Missing1Ebytes:
LDA #$01
STA $16CD,y ; Block Bounce Sprite Exists Flag Table
LDA #$06
STA $18F8,y ; unknown!
RTS
WAS, WIE, WO???? Ne, Ne ich bin nicht die Signatur ...
Ich putze hier nur.

Mein Hack:
<!-- m --><a class="postlink" href="http://www.youtube.com/user/conankun88#p/a/u/0/8vdcyGylrg0">http://www.youtube.com/user/conankun88# ... vdcyGylrg0</a><!-- m -->
geschrieben am 30.04.2013 21:33:11
( Link )
Zünni es geht!!!!!
Auch wenn es Act Like 11A ist, danke!!!
geschrieben am 30.04.2013 21:36:20
( Link )
jab aber für den Block würde ich das acts like auf 130 stellen
WAS, WIE, WO???? Ne, Ne ich bin nicht die Signatur ...
Ich putze hier nur.

Mein Hack:
<!-- m --><a class="postlink" href="http://www.youtube.com/user/conankun88#p/a/u/0/8vdcyGylrg0">http://www.youtube.com/user/conankun88# ... vdcyGylrg0</a><!-- m -->