So hallo, ich schreibe dann hier auch mal meinen ersten Post und zwar ne Frage^^
Wäre es irgendwie möglich, einen Sprite zu basteln, der sich komplett wie Mario verhält, also ein Klon von diesem ist? D.h. man hätte dann zwei Marios, die den gleichen Input annehmen würden (und natürlich auch reagieren würden), bei einem Muncher oder bei Lava sterben, schwimmen können etc.. Würde das gehen oder müsste man da ewig viel ASM schreiben oder würde da sogar der RAM nicht reichen?
LG HF01
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Würde also nicht so einfach gehen. Schade. Dann muss ich wohl mit was machbarerem Vorlieb nehmen^^
Aber danke fürs schnelle Antworten
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Schwer ist das Porten für SMW jetzt echt nicht. Es dauert halt Zeit. An sich gibst du ja einfach nur Notenwerte ein. Wenn du mir eine PDF mit den Noten geben kannst, dann mache ichs sogar vielleicht^^
Aber probiers selbst noch mal aus. So schwer ist es jetzt halt echt nicht.
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Hallo zusammen,
ich habe ein kleines Problem mit einem Custom Sprite. Der Sprite soll mal, abhängig von der Münzzahl unterschiedlich schnell, konstant nach rechts unten gehen und wenn der Spieler den Sprungknopf drückt, nach rechts oben. Wenn der Sprite was berührt, soll er sterben und Mario gleich mit töten (Das klingt voll dumm, wenn man das so aufschreibt XD)
Codedcb "INIT"
RTL
SPEEDDOWN: dcb $E8,$D8,$C0,$80
SPEEDUP: dcb $18,$28,$3F,$7F
dcb "MAIN"
JSR Maincode
JSR Graphics
RTL
Maincode:
LDA $14C8,x ; \
CMP #$08 ; |
BNE Freeze ; | Freeze den Sprite wenn nötig
LDA $9D ; |
BNE Freeze ; /
LDA $1588,x ; \
AND #$0F ; | Teste, ob der Sprite gegen ein Hindernis "läuft"
BNE Kill ; /
LDY $0DBF ; \
LDA SPEEDUP,y ; | Setze den X-Speed abhängig von den Münzen
STA $B6,x ; /
LDA $15 ; \
AND #$80 ; | Prüfe, ob der Spieler eine Sprungtaste drückt
BEQ Down ; |
BRA Up ; /
Up: ; \
LDA SPEEDUP,y ; | Setze den Y-Speed abhängig von den Münzen
STA $AA,x ; |
BRA End ; /
Down: ; \
LDA SPEEDDOWN,y ; | Setze den Y-Speed abhängig von den Münzen
STA $AA,x ; |
BRA End ; /
End: ; \
JSL $01802A ; | Ende der Hauptroutine
RTS ; /
Freeze: ; \ Offensichtlich
RTS ; /
Kill: ; \
JSL $00F606 ; | Mario töten
RTS ; /
Das ist der Code, dahinter kommt dann halt noch die Grafikroutine aber mit der ist nix falsch, die Grafiken laden ohne Probleme. Wäre nett wenn ihr mir helfen könntet
Gruß, HF01
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Warum ich Sprites für TRASM schreibe? Ich kenne den Unterschied nicht XD
Was muss man da anders machen?
Was falsch läuft? Einfach alles XD
Der Speed wird (von meiner Perspektive aus) komplett random gesetzt und auf den Input reagiert der Sprite erst gar nicht^^
Und nein, ich plane nicht mehr als 3 Münzen einzubauen. Es soll in den Leveln wenig Münzen geben, die auch nur für den Grund dienen und außerdem habe ich Blöcke in der ROM, die die Münzen auf 0-3 setzen.
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
So... jetzt habe ich mal versucht, das ganze Ding in xkas-Format umzuwandeln.
Allerdings spuckts mir jetzt schon bei
nen Fehler aus (Label [INIT] not found oder so). Andere xkas-Codes werden aber sauber assembliert. Warum?
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Ja, an den Haken habe ich gedacht...
Die Fehlermeldung
Codeerror: tmpasm.asm: line 3: invalid opcode or command [print "INIT ",pc]
error: tmpasm.asm: line 3: label [INIT] not found [print "INIT ",pc]
error: tmpasm.asm: line 3: label [pc] not found [print "INIT ",pc]
MAIN 008001
Die .cfg
Code01
36
00 00 70 A7 39 64
00 00
wave.asm
1
Und hier noch der Code:
Codeprint "INIT ", pc
RTL
print "MAIN ", pc
PHB
PHK
PLB
JSR MAINCODE
JSR GRAPHICS
PLB
RTL
SPEEDDOWN: db $E8,$D8,$C0,$80
SPEEDUP: db $18,$28,$3F,$7F
MAINCODE:
LDA $14C8,x ; \
CMP #$08 ; |
BNE FREEZE ; | Freeze den Sprite wenn nötig
LDA $009D ; |
BNE FREEZE ; /
LDA $1588,x ; \
AND #$0F ; | Teste, ob der Sprite gegen ein Hindernis "läuft"
BNE KILL ; /
LDY $0DBF ; \
LDA SPEEDUP,y ; | Setze den X-Speed abhängig von den Münzen
STA $00B6,x ; /
LDA $15 ; \
AND #$80 ; | Prüfe, ob der Spieler eine Sprungtaste drückt
BEQ DOWN ; /
LDA SPEEDUP,y ; \
STA $00AA,x ; | Setze den Y-Speed abhängig von den Münzen
BRA END ; /
DOWN: ; \
LDA SPEEDDOWN,y ; | Setze den Y-Speed abhängig von den Münzen
STA $00AA,x ; /
END: ; \ Ende der Hauptroutine
JSL $01802A ; /
FREEZE: ; \ Offensichtlich
RTS ; /
KILL: ; \
JSL $00F606 ; | Mario töten
RTS ; /
GRAPHICS:
JSR GET_DRAW_INFO
LDA $00
STA $0300,y
LDA $01
STA $0301,y
LDA #$2A
STA $0302,y
LDA #%00101100
ORA $64
STA $0303,y
INY
INY
INY
INY
LDY #$02
LDA #$00
JSL $01B7B3
RTS
SPR_T1: db $0C,$1C
SPR_T2: db $01,$02
GET_DRAW_INFO: STZ $186C,x ; reset sprite offscreen flag, vertical
STZ $15A0,x ; reset sprite offscreen flag, horizontal
LDA $E4,x ; \
CMP $1A ; | set horizontal offscreen if necessary
LDA $14E0,x ; |
SBC $1B ; |
BEQ ON_SCREEN_X ; |
INC $15A0,x ; /
ON_SCREEN_X: LDA $14E0,x ; \
XBA ; |
LDA $E4,x ; |
REP #$20 ; |
SEC ; |
SBC $1A ; | mark sprite INVALID if far enough off screen
CLC ; |
ADC.w #$0040 ; |
CMP.w #$0180 ; |
SEP #$20 ; |
ROL A ; |
AND #$01 ; |
STA $15C4,x ; /
BNE INVALID ;
LDY #$00 ; \ set up loop:
LDA $1662,x ; |
AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
BEQ ON_SCREEN_LOOP ; | else, go through loop once
INY ; /
ON_SCREEN_LOOP: LDA $D8,x ; \
CLC ; | set vertical offscreen if necessary
ADC SPR_T1,y ; |
PHP ; |
CMP $1C ; | (vert screen boundry)
ROL $00 ; |
PLP ; |
LDA $14D4,x ; |
ADC #$00 ; |
LSR $00 ; |
SBC $1D ; |
BEQ ON_SCREEN_Y ; |
LDA $186C,x ; | (vert offscreen)
ORA SPR_T2,y ; |
STA $186C,x ; |
ON_SCREEN_Y: DEY ; |
BPL ON_SCREEN_LOOP ; /
LDY $15EA,x ; get offset to sprite OAM
LDA $E4,x ; \
SEC ; |
SBC $1A ; | $00 = sprite x position relative to screen boarder
STA $00 ; /
LDA $D8,x ; \
SEC ; |
SBC $1C ; | $01 = sprite y position relative to screen boarder
STA $01 ; /
RTS ; return
INVALID: PLA ; \ return from *main gfx routine* subroutine...
PLA ; | ...(not just this subroutine)
RTS ; /
Ich verstehs nicht... Irgendne Idee?
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Ok, ich habe den gesamten Code 1:1 abgeschrieben und plötzlich geht's
Kein Plan was das war. Vermutlich ein spukendes Steuerzeichen
Edit: Zu früh gefreut. Immerhin nimmt xkas den Sprite jetzt an. Aber das Spiel stürzt jetzt ab, wenn man den Sprite lädt
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Jo, das habe ich dann auch schon gemacht. Habs dann wieder in Trasm probiert und jetzt geht's.
Kann es sein, dass man Variablen / Tabellennamen nur X Zeichen lang machen darf oder so?
Weil jetzt wo meine Tabellen nur noch T1 und T2 heißen geht's.
Codedcb "INIT"
RTL
T1 db $18,$28,$3F,$7F
T2 db $E8,$D8,$C0,$80
dcb "MAIN"
PHB
PHK
PLB
JSR Maincode
JSR Graphics
PLB
RTL
Maincode:
LDA $14C8,x ; \
CMP #$08 ; |
BNE Freeze ; | Freeze den Sprite wenn nötig
LDA $9D ; |
BNE Freeze ; /
LDA $1588,x ; \
AND #$0F ; | Teste, ob der Sprite gegen eine Wand läuft
BNE Kill ; /
LDY $0DBF ; \
LDA T1,y ; | Münzen laden und X-Speed setzen
STA $B6,x ; /
LDA $15 ; \
AND #$80 ; | Wenn der Spieler A oder B drückt, gehe nach oben
BNE Oben ; /
LDA T1,y ; \ Sonst unten
STA $AA,x ; / Y-Speed setzen
JSL $01802A
RTS
Oben:
LDA T2,y ; \
STA $AA,x ; / Y-Speed setzen
JSL $01802A
RTS
Freeze:
RTS
Kill:
JSL $00F606 ; Mario töten
RTS ; Und zurück in die Hauptroutine
Graphics:
JSR GET_DRAW_INFO
LDA $00
STA $0300,y
LDA $01
STA $0301,y
LDA #$2A
STA $0302,y
LDA #%00101100
ORA $64
STA $0303,y
INY
INY
INY
INY
LDY #$02
LDA #$00
JSL $01B7B3
RTS
SPR_T1 dcb $0C,$1C
SPR_T2 dcb $01,$02
GET_DRAW_INFO STZ $186C,x ; reset sprite offscreen flag, vertical
STZ $15A0,x ; reset sprite offscreen flag, horizontal
LDA $E4,x ; \
CMP $1A ; | set horizontal offscreen if necessary
LDA $14E0,x ; |
SBC $1B ; |
BEQ ON_SCREEN_X ; |
INC $15A0,x ; /
ON_SCREEN_X LDA $14E0,x ; \
XBA ; |
LDA $E4,x ; |
REP #$20 ; |
SEC ; |
SBC $1A ; | mark sprite invalid if far enough off screen
CLC ; |
ADC.W #$0040 ; |
CMP.W #$0180 ; |
SEP #$20 ; |
ROL A ; |
AND #$01 ; |
STA $15C4,x ; /
BNE INVALID ;
LDY #$00 ; \ set up loop:
LDA $1662,x ; |
AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
BEQ ON_SCREEN_LOOP ; | else, go through loop once
INY ; /
ON_SCREEN_LOOP LDA $D8,x ; \
CLC ; | set vertical offscreen if necessary
ADC SPR_T1,y ; |
PHP ; |
CMP $1C ; | (vert screen boundry)
ROL $00 ; |
PLP ; |
LDA $14D4,x ; |
ADC #$00 ; |
LSR $00 ; |
SBC $1D ; |
BEQ ON_SCREEN_Y ; |
LDA $186C,x ; | (vert offscreen)
ORA SPR_T2,y ; |
STA $186C,x ; |
ON_SCREEN_Y DEY ; |
BPL ON_SCREEN_LOOP ; /
LDY $15EA,x ; get offset to sprite OAM
LDA $E4,x ; \
SEC ; |
SBC $1A ; | $00 = sprite x position relative to screen boarder
STA $00 ; /
LDA $D8,x ; \
SEC ; |
SBC $1C ; | $01 = sprite y position relative to screen boarder
STA $01 ; /
RTS ; return
INVALID PLA ; \ return from *main gfx routine* subroutine...
PLA ; | ...(not just this subroutine)
RTS ; /
Edit: Hab jetzt noch mal nen bissel rumgetestet und mir ist aufgefallen, dass es nicht mehr funktioniert, wenn ich das JSL $01802A in nen eigenen Block setze und dann dahin BRA-e.
Naja, auf jeden Fall läufts jetzt und der Thread kann *zu*
~HF01
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
$1420 ist die Zahl der Yoshicoins, allerdings nicht die Zahl der angezeigten Yoshicoins (laut SMWC). Die ist $1422. Wenn du die also ändern willst, solltest du sowohl $1420 als auch $1422 verkleinern. Und ja, dass müsste einfach DEC $1420 / $1422 sein.
Wenn du dir bei sowas nicht sicher bist, würde ich dir allerdings immer einen Blick hierhin:
http://www.smwcentral.net/?p=map&type=ram empfehlen
(Oder ich verstehe deine Frage nicht
)
LG HF01
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Zum ersten Code:
Zu der Sache mit !Dragoncoins. Warum definierst du das da oben und ersetzt nicht einfach alles mit $1420 bzw. $1422 (und ja, das sind dann 2 Anweisungen)
Ich würds so schreiben
Code
db $42
JMP Mario : JMP Mario : JMP Mario
JML Return : JML Return
JML Return : JML Return
JMP Mario : JMP Mario : JMP Mario
Mario:
LDA $1420
BEQ Return
LDA #$01 ; Replace block with block # 025
STA $9C
PHY
JSL $00BEB0 ; Make the block disappear.
PLY
DEC $1420
DEC $1422
Return:
RTL
So. Ich hoffe das funktioniert dann. Ist nicht getestet. Nutzen auf eigene Gefahr
Zum zweiten Code:
So. Erstmal ist es afaik unnötig, vor dem DECen zu LDAen. d.h. ích würde die LDAs wegmachen. Dann musst du nicht mit #$00 CMPen. Dann steht bei Reset zweimal RTL. Mach das zweite da weg. Dann müsste es eigentlich passen. Außerdem checke ich den CMP nach dem GotCoins-Label nicht. Was soll der Block überhaupt machen? Weil so wie er da ist, funktioniert er zwar, läuft aber unnötig lange. GotCoins wird doch dann angesprungen, wenn der Spieler die Coins HAT. Dann muss man doch nix mehr vergleichen o.O
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Ehrlich gesagt muss ich bei sowas dann auch passen xD
Ich bin selbst noch nicht so gut mit ASM und das Tile drüber entfernen. Sicher das Blockreator dafür nix hat?
Das "db $42" weiß ich selbst nicht so genau, was das macht, aber BTSD und ich denke mal auch GPS braucht das und somit schreibe ichs halt immer dahin XD
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Hast du es mal mit dem "Stop Generators"-Sprite probiert? Ansonsten würde ich sagen, nur mit ASM.
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Ich baue dann mal auch 'nen Level. Wenn niemand was dagegen hat, nehme ich die Map16-Seiten 2A und 42. Sind Secret Exits erlaubt?
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Es ist so lächerlich. Sie zeigen damit eigentlich nur, dass sie wissen, dass Lunar Magic, eine Freeware, objektiv gesehen besser ist als ihr dämlicher Mario Maker. Ansonsten gäbe es ja überhaupt keinen Grund, das zu claimen. Videos von einem schlechten Editor striken lassen? Wozu. Aber sonst sehen die Leute halt, was mit LM möglich ist und kaufen den MM nicht.
Mario Maker wird von mir jedenfalls nicht gekauft.
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Ich würde vermutlich mitmachen. ("Vermutlich", weil ich manchmal ziemlich unkreativ bin ._.)
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Dann würde ich mal sagen, ich nehme teil^^
(Auch wenn ich vermutlich eher geringe Gewinnchancen hab xD)
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Thema: Wald.
Ist ja auch überhaupt nicht das, was ich als Quali gemacht hab' xD
(Danke RNG, dass du was gewählt hast, was ich halbwegs beherrsche :^) )
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Ich bin bereit zum Verlieren! Ich melde mich für ein Bonusbattle gegen Dark :^)
Ich könnte hier Text hinschreiben. Mache ich aber nicht.
Dann nehme ich mal die Herausforderung an, Ricicir :^)
Ich könnte hier Text hinschreiben. Mache ich aber nicht.