Allgemeine Hex- und ASM-Fragen

geschrieben am 04.12.2010 15:43:21
zuletzt bearbeitet von Shog am 04.12.2010 16:23:21.
( Link )
RPG, ich sollte wohl ausdrücklich erwähnen, das der Code von Fusoya ist, und in SMWC bei dieser "Library" ist, also sorry, ich weiß nicht, was man da besser machen kann. Aber ich probier was aus, und editier es hierrein, ob es geklappt hat

Edit: Habe es geschafft
Wie kritisch man doch gegenüber dem System wird, wenn man älter wird...
geschrieben am 04.12.2010 15:58:16
( Link )
Leerer Edit?

Kannst du mir mal den Originalcode auf SMWC zeigen? Vielleicht hilft das ja weiter. Der erscheint mir zumindest nicht ganz sauber.
-Das quadratische Rad neu erfinden-
Mit das quadratische Rad neu erfinden (englisch Reinventing the square wheel) bezeichnet man die Bereitstellung einer schlechten Lösung, wenn eine gute Lösung bereits existiert.

-Slowsort-
Slowsort (von engl. slow: langsam) ist ein langsamer, rekursiver Sortieralgorithmus, der nach dem Prinzip Vervielfache und kapituliere (engl. Multiply and surrender, eine Parodie auf Teile und herrsche) arbeitet.

geschrieben am 04.12.2010 16:26:46
( Link )
Nee ist schon gut, hier der "funktionierende" Code, habe den aus einem aktuelleren Block geklaubt(der Block rechts vom Block ist dann der, der sich darin verwandelt):
In dne "ausführenden" Code rein(zum Beispiel unter dem Souondeffekt, den es gerade spielen soll)
Code
REP #$20
LDA $03
CLC
ADC #$0001
STA $03
JSR ChangeMap16
SEP #$20
RTL

Das als Routine unter/über dem Code, sodass er NICHT "direkt" ausgeführt wird
Code
ChangeMap16:
PHP
REP #$30
PHY
PHX
TAX
LDA $03
PHA
JSR SUB_8034
PLA
STA $03
PLX
PLY
PLP
RTS

RETURN18: PLX
PLB
PLP
RTS

SUB_8034: PHP
SEP #$20
PHB
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 NO_SHIFT
LSR $09
NO_SHIFT: LDY $0E
LDA $09
AND #$01
BEQ HORIZ
LDA $9B
STA $00
LDA $99
STA $9B
LDA $00
STA $99
LDY $0C
HORIZ: CPY #$0200
BCS RETURN18
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 NO_AND
LDA $99
LSR A
LDA $9B
AND #$01
BRA LABEL52
NO_AND: LDA $9B
LSR A
LDA $99
LABEL52: ROL A
ASL A
ASL A
ORA #$20
STA $04
CPX #$0000
BEQ NO_ADD
CLC
ADC #$10
STA $04
NO_ADD: LDA $98
AND #$F0
CLC
ASL A
ROL A
STA $05
ROL A
AND #$03
ORA $04
STA $06
LDA $9A
AND #$F0
LSR A
LSR A
LSR A
STA $04
LDA $05
AND #$C0
ORA $04
STA $07
REP #$20
LDA $09
AND #$0001
BNE LABEL51
LDA $1A
SEC
SBC #$0080
TAX
LDY $1C
LDA $1933
BEQ LABEL50
LDX $1E
LDA $20
SEC
SBC #$0080
TAY
BRA LABEL50
LABEL51: LDX $1A
LDA $1C
SEC
SBC #$0080
TAY
LDA $1933
BEQ LABEL50
LDA $1E
SEC
SBC #$0080
TAX
LDY $20
LABEL50: STX $08
STY $0A
LDA $98
AND #$01F0
STA $04
LDA $9A
LSR A
LSR A
LSR A
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 MAP16_RETURN-$01
PEA $804C
JML $00C0FB
MAP16_RETURN: PLB
PLP
RTS
Wie kritisch man doch gegenüber dem System wird, wenn man älter wird...
geschrieben am 05.12.2010 15:08:29
( Link )
Ich habe mal eine Frage zu dem Sparky/Fuzzball(Groundguided)-Sprite. Wie kann ich hier die Geschwindigkeit ändern? Der Sprite soll schneller seine Runden drehen:
Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; SMW Sparky/Fuzzy and Hothead (sprite A5 & A6), by imamelia
;;
;; This is a disassembly of sprites A5 and A6 in SMW, the wall-following Sparky/Fuzzy
;; and the Hothead.
;;
;; Uses first extra bit: YES
;;
;; If the extra bit is clear, the sprite will act like a Sparky/Fuzzy. If the extra bit
;; is set, the sprite will act like a Hothead. Also, if the extra bit is clear and the
;; sprite tileset is 02, the sprite will use the Fuzzy graphics. (If the sprite tileset
;; is anything else, then it will use the Sparky graphics.)
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; defines and tables
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

!ExtraBit = $04 ; may be changed to 01 if using GEMS

InitXSpeed:
db $08,$00

InitYSpeed:
db $00,$08

XSpeed:
db $01,$FF,$FF,$01,$FF,$01,$01,$FF

YSpeed:
db $01,$01,$FF,$FF,$01,$01,$FF,$FF

XSpeed2:
db $08,$00,$F8,$00,$F8,$00,$08,$00

YSpeed2:
db $00,$08,$00,$F8,$00,$08,$00,$F8

ObjCheckVals:
db $01,$04,$02,$08,$02,$04,$01,$08

FuzzyTileProp:
db $05,$45

!SparkyTile = $0A
!FuzzyTile = $C8

HotheadXDisp:
db $F8,$08,$F8,$08

HotheadYDisp:
db $F8,$F8,$08,$08

HotheadTiles:
db $0C,$0E,$0E,$0C,$0E,$0C,$0C,$0E

HotheadTileProp:
db $05,$05,$C5,$C5,$45,$45,$85,$85

!HotheadEyeTile1 = $09
!HotheadEyeTile2 = $19

EyesXDisp:
db $07,$07,$01,$01,$01,$01,$07,$07

EyesYDisp:
db $00,$08,$08,$00,$00,$08,$08,$00

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; init routine wrapper
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

print "INIT ",pc
PHB
PHK
PLB
JSR InitSparky
PLB
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; init routine
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

InitSparky:

LDA $E4,x ; sprite X position
LDY #$00 ;
AND #$10 ;
EOR #$10 ;
STA $151C,x ;
BNE StartOutLeft ; move right if the sprite is on an odd X coordinate
INY ;
StartOutLeft: ;
LDA InitXSpeed,y ;
STA $B6,x ; set the sprite's initial X speed
LDA InitYSpeed,y ;
STA $AA,x ; set the sprite's initial Y speed
INC $164A,x ;
LDA $151C,x ;
LSR ;
LSR ;
STA $C2,x ;

LDA $7FAB10,x ;
AND #!ExtraBit ;
STA $1510,x ; save the extra bit
BEQ NoChangeClipping ; if the extra bit is set...
LDA #$27 ; set the sprite clipping
STA $1662,x ; for the Hothead
NoChangeClipping: ;

RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; main routine wrapper
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

print "MAIN ",pc
PHB
PHK
PLB
JSR Main
PLB
RTL

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; main routine
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Main:

JSL $018032 ; interact with sprites
JSL $01ACF9 ; get a random number
ORA $9D ;
BNE NoSet1 ; if sprites are locked or the number was not 0...
LDA #$0C ; don't set this timer
STA $1558,x ;
NoSet1: ;

JSR SubGFX

LDA $14C8,x ;
CMP #$08 ; if the sprite is still alive...
BEQ StillAlive ; skip this termination code
STZ $1528,x ;
LDA #$FF ;
STA $1558,x ; reset this timer

Return0: ;
RTS

StillAlive: ;

LDA $9D ; if sprites are locked...
BNE Return0 ; return

JSR SubOffscreenX3 ;

JSL $01A7DC ; interact with the player

; removed sprite number checks (2E, 3C, A5, A6)

LDA $1540,x ;
BNE Skip1 ; branch if the timer is set

LDY $C2,x ;
LDA YSpeed,y ; set the sprite's Y speed
STA $AA,x ;
LDA XSpeed,y ; set the sprite's X speed
STA $B6,x ;

JSL $019138 ; interact with objects

LDA $1588,x ; check the sprite's object status
AND #$0F ; if the sprite is touching an object...
BNE Skip1 ; branch

LDA #$08 ;
STA $1564,x ; disable contact with other sprites
LDA #$1A ; timer = 1A
LDY $1510,x ; if the sprite is a Hothead...
BNE SetTimer1 ;
LSR ; timer = 0D
SetTimer1: ;
STA $1540,x ;

Skip1: ;

LDA #$10 ; check value = 10
LDY $1510,x ; if the extra bit is set...
BNE CheckTimer1 ;
LSR ; check value = 08
CheckTimer1: ;
CMP $1540,x ; if the timer has reached the check value...
BNE NoChangeState ;
INC $C2,x ; change the sprite state
LDA $C2,x ;
CMP #$04 ; if the sprite state has reached 04...
BNE NoResetState ;
STZ $C2,x ; reset it to 00
NoResetState: ;
CMP #$08 ; if it is 08...
BNE NoChangeState ;
LDA #$04 ; set it to 04
STA $C2,x ;

NoChangeState: ;

LDY $C2,x ;
LDA $1588,x ; check the object contact status
AND ObjCheckVals,y ; depending on the sprite state
BEQ Skip2 ; if the sprite isn't touching the specified surface, skip the next part
LDA #$08 ;
STA $1564,x ; disable contact with other sprites for a few frames
DEC $C2,x ; decrement the sprite state
LDA $C2,x ;
BPL CompareState1 ; if the result was positive, branch
LDA #$03 ;
BRA StoreState1 ; set the sprite state to 03

CompareState1: ;

CMP #$03 ;
BNE Skip2 ;
LDA #$07 ;
StoreState1: ;
STA $C2,x ;

Skip2: ;

LDY $C2,x ;
LDA YSpeed2,y ; set the sprite's Y speed
STA $AA,x ;
LDA XSpeed2,y ;
STA $B6,x ;

LDY $1510,x ; if the extra bit is set...
BNE SlowerSpeed ;
ASL $B6,x ; double both speed values
ASL $AA,x ;
SlowerSpeed: ;

JSL $018022 ; update sprite X position without gravity
JSL $01801A ; update sprite Y position without gravity

RTS


Wenn ich oben bei InitXSpeed oder InitYSpeed die Zahlen ändere, passiert überhaupt nichts. Wenn ich darunter bei XSpeed, XSpeed2 usw. Zahlen ändere, dann stimmt der Bewegungsablauf nicht mehr (der Sprite verlässt die Bahn, er bewegt sich nicht mehr gleichmäßig um den Block).
Was muss ich hier machen? Warum passiert beim Ändern der InitXSpeed bzw. InitYSpeed nichts?
geschrieben am 05.12.2010 15:12:21
( Link )
Wozu (=Zu was) hast du sie denn geändert?
geschrieben am 05.12.2010 15:38:03
( Link )
Ich habe alles Mögliche ausprobiert: Zunächst habe ich bei InitXSpeed und InitYSpeed jeweils die 08 auf 18 geändert, es passierte nichts.
Dann habe ich jeweils die 08 auf 05 geändert und die 00 auf 03 (also alles jeweils um 3 Zahlen). Beim nächsten Versuch habe ich bei 08 hohe Zahlen eingetragen (z.B. F8) und die Zahlen dann auch ungleichmäßig geändert (um verschiedene Differenzen also).
Und wie gesagt, wenn ich etwas bei den unteren Speeds ändere, geraten die Sprites aus der Bahn, führen ungleichmäßige Bewegungen durch. Da sind ja komischerweise auch immer 8 Zahlen...

Ich frage mich, was die Init-Speeds zu bedeuten haben, wenn eh nichts passiert.
geschrieben am 05.12.2010 15:48:54
( Link )
Steht denn etwas in der Readme?
-Das quadratische Rad neu erfinden-
Mit das quadratische Rad neu erfinden (englisch Reinventing the square wheel) bezeichnet man die Bereitstellung einer schlechten Lösung, wenn eine gute Lösung bereits existiert.

-Slowsort-
Slowsort (von engl. slow: langsam) ist ein langsamer, rekursiver Sortieralgorithmus, der nach dem Prinzip Vervielfache und kapituliere (engl. Multiply and surrender, eine Parodie auf Teile und herrsche) arbeitet.

geschrieben am 05.12.2010 15:52:51
( Link )
Es gibt keine Readme dazu.
geschrieben am 05.12.2010 16:10:38
( Link )
Code
LDY $1510,x      ; if the extra bit is set...
BNE SlowerSpeed ;
ASL $B6,x ; double both speed values
ASL $AA,x ;
SlowerSpeed: ;


Ändere mal die ASLs zu LSR.
Und dann probiers mit Extra bit.
geschrieben am 26.12.2010 20:31:41
( Link )
So, ich kämpfe ja mit den Banditengraphiken herum und habe mir eine kleine Notlösung einfallen lassen. Der Chuck als Bandit ist zwar schön und gut, aber ich vereinfache das Ganze ein bisschen. Es gibt ja den Yoshis Island Grunt als Sprite (sozusagen ein Bandit mit Helm auf dem Kopf). Ich hab nun die Banditengraphiken genommen und so gelegt, dass sie auf den Grunt passen (siehe Screenshot).



Dass der Körper rot ist, ist nicht weiter wichtig. Habe gesehen, dass es die Banditen in blauer und in roter Kleidung gibt, dementsprechend mache ich zwei Sprites draus: Einen blauen Banditen, der langsam geht und einen roten, der schnell läuft und Mario wohl folgt.

Zwei kleine Sachen fehlen noch zu meinem Glück:

1. Die Palette konnte ich mittlerweile ändern. Allerdings existiert nun folgendes Problem: Ich kann einige Felder weiter rechts neben den Banditen springen und töte ihn (warum auch immer). Ebenfalls werde ich getötet, wenn ich eine gewisse Distanz rechts von ihm stehe und er auf mich zuläuft. Kann man das irgendwie beheben? Dazu muss ich sagen, dass ich die Tilemaps in der .asm Datei anders angeordnet habe, und zwar von dem unteren Mittelbereich der SP4 Graphik auf die linke Seite.


2. Scheinbar ist es nicht vorgesehen, dass der Grund durch einen Sprung besiegt werden kann. Ich habe ein wenig mit dem cfg_editor rumgefummelt und mittlerweile eingestellt, dass der Grunt mit einem Sprung auf den Kopf besiegt werden kann. Allerdings hätte ich es gerne, dass er dann wie andere Gegner nach unten aus dem Bildschirm fällt (wie z.B. ein besiegter Chuck). Aktuell ist es so, dass nach einem Sprung auf den Kopf die Graphik noch kurz angezeigt wird und sie dann verschwindet. Sollte da niemand eine Lösung für wissen, werde ich den Grunt in einer Rauchwolke verschwinden lassen.

Danke im Voraus!

Hier noch der Code der aktuellen .asm Datei:

Spoiler anzeigen
;Grunt
;by smkdan

;IMPORTANT: Sprite clipping offset is 9 by default, but may be wider than you'd like.
; Sprite clipping offset 1 is a viable alternative, which is less wide. This will cause the sprite to be unaffected by being
; hit from a block from below.

;you can change the palette to green, blue, red or yellow. The head and feet are unaffected.

;USES EXTRA BIT
;if set, it will run else it will walk.

;Extra prop 1:
;bit 0 = stay on ledges?
;bit 1 = follow mario?

;Tilemaps for SP4


DIR = $03
PROPRAM = $04
PROPINDEX = $05
XDISPINDEX = $06
YDISPINDEX = $07
FRAMEINDEX = $08
TEMP = $09

Speed dcb $08,$F8 ;walking speed
dcb $10,$F0 ;running speed

;C2: for follow behaviour
;1570: frame number
;151C: turn counter

;=====

dcb "INIT"
JSR SUB_HORZ_POS
TYA
STA $157C,x ;face mario intially
STZ $1570,x ;reset frame number

LDA $1588,x
ORA #$04
STA $1588,x

RTL

dcb "MAIN"
PHB
PHK
PLB
JSR Run
PLB
RTL


Return_l
RTS

Run
JSR GET_DRAW_INFO
JSR GFX ;draw sprite
JSR SUB_OFF_SCREEN_X0

LDA $14C8,x
CMP #$08 ;if it's not living, see if the sprite should be generated
BNE Return_l
LDA $9D ;locked sprites?
BNE Return_l
LDA $15D0,x ;yoshi eating?
BNE Return_l

;===
LDA $7FAB28,x ;load prop 1
AND #$01 ;bit 0 set?
BEQ Fall ;if clear, just fall, else stay on ledge

LDA $1588,x ;sprite in air?
ORA $151C,x
BNE OnGround
JSR SUB_CHANGE_DIR
LDA #$01 ;turning decision bit
STA $151C,x

OnGround
LDA $1588,x ;if on the ground, reset the turn counter
AND #$04
BEQ InAir
STZ $151C,x
STZ $AA,x ;no Yspd
BRA InAir

;Only run when stay on ledges is disabled

Fall LDA $1588,x
AND #$04
BEQ InAir
LDA #$10 ;falling yspd, if not already falling
STA $AA,x

;===

InAir
LDA $1588,x ;touching object?
AND #$03
BEQ SameDir
LDA $157C,x
EOR #$01 ;invert direction
STA $157C,x

SameDir
LDA $7FAB10,x ;extra bit
AND #$04 ;just that
LSR A ;bit 1 = running
ORA $157C,x ;bit 0 = direction
TAY ;into Y
LDA Speed,y ;x speed depends on direction
STA $B6,x

JSL $018032 ;other sprites
JSL $01802A ;update position based on speed values
JSL $01A7DC ;mario interact

LDA $7FAB28,x ;load prop 1
AND #$02 ;bit 1, follow mario?
BEQ Return ;if clear, don't do anything else

JSR SUB_HORZ_POS ;left/right?
TYA ;result into A
CMP $157C,x ;compare to direction, if matches there's no need to follow
BEQ NoFollowing

LDA $C2,x
INC A
STA $C2,x
CMP #$10 ;don't change dir for X frames
BNE Return ;if not yet, return

LDA $157C,x ;else flip direction
EOR #$01
STA $157C,x ;and, also reset turn counter

NoFollowing
STZ $C2,x ;not following = zero follow counter for later use

Return
RTS

;=====

TILEMAP dcb $E2,$A0,$C0
dcb $F0,$F1 ;different feet tiles

dcb $E2,$A0,$C0
dcb $E0,$F1

dcb $E2,$A0,$C0
dcb $E1,$E1

dcb $E2,$A0,$C0
dcb $E0,$E1

dcb $E2,$A0,$C0
dcb $F0,$F1

;running tilemaps

dcb $E2,$A0,$C0
dcb $F0,$E1

dcb $E2,$A0,$C0
dcb $E0,$E0

dcb $E2,$A0,$C0
dcb $E0,$E0

XDISP dcb $00,$00,$00
dcb $05,$00

dcb $00,$00,$00
dcb $09,$00

dcb $00,$00,$00
dcb $FE,$0C

dcb $00,$00,$00
dcb $FF,$0D

dcb $00,$00,$00
dcb $03,$00

;

dcb $00,$00,$00
dcb $05,$0D

dcb $00,$00,$00
dcb $01,$0A

dcb $00,$00,$00
dcb $01,$0A

XBIAS
dcb $00,$00,$00
dcb $08,$08

YDISP dcb $FE,$05,$0C
dcb $18,$00

dcb $FF,$06,$0D
dcb $18,$00

dcb $00,$07,$0E
dcb $17,$19

dcb $01,$07,$0D
dcb $18,$14

dcb $00,$06,$0C
dcb $18,$00

;
dcb $01,$07,$0D
dcb $18,$17

dcb $00,$06,$0C
dcb $17,$17

dcb $00,$06,$0C
dcb $17,$17

PROP dcb $00,$00,$00
dcb $00,$00

dcb $00,$00,$00
dcb $40,$00

dcb $00,$00,$00
dcb $00,$40

dcb $00,$00,$00
dcb $00,$00

dcb $00,$00,$00
dcb $00,$00

;
dcb $00,$00,$00
dcb $00,$40

dcb $00,$00,$00
dcb $00,$40

dcb $00,$00,$00
dcb $00,$40

CPAL dcb $00,$00,$00 ;00 if custom palette is used, else palette data here is used
dcb $03,$03 ;feet are blue

SIZE dcb $02,$02,$02
dcb $00,$00

EORF dcb $40,$00


GFX
LDA $157C,x ;direction
STA DIR

LDA $15F6,x ;properties, palette and page bit
STA PROPRAM

LDA $7FAB10,x
AND #$04 ;extra bit = running
BEQ Walking

LDA $14
AND #$01 ;every odd frame
BNE SkipR
LDA $9D ;due to odd way it animates, skip animating if sprites are locked
BNE SkipR
LDA $14C8,x ;if not normal status, don't animate
CMP #$08
BNE SkipR

LDA $1570,x
INC A
STA $1570,x
CMP #$03 ;3 = overflow
BNE SkipR
STZ $1570,x

SkipR
LDA $1570,x
ASL A
ASL A ;x4
CLC
ADC $1570,x ;x5
ADC #$19 ;+25, skip past walking frames
STA FRAMEINDEX

LDX #$00 ;loop index
BRA OAM_Loop ;jump into loop

Walking
LDA $14
AND #$03 ;every 4th frame
BNE SkipW
LDA $9D ;due to odd way it animates, skip animating if sprites are locked
BNE SkipW
LDA $14C8,x ;if not normal status, don't animate
CMP #$08
BNE SkipW

LDA $1570,x ;grab frame no.
INC A
STA $1570,x
CMP #$05 ;5 = overflow
BNE SkipW
STZ $1570,x

SkipW
LDA $1570,x ;frame no...
ASL A
ASL A ;x4
CLC
ADC $1570,x ;x5
STA FRAMEINDEX


LDX #$00 ;loop index

OAM_Loop
TYA
LSR A
LSR A
PHY
TAY
LDA SIZE,x
STA $0460,y ;size table
PLY ;restore

TXA
CLC
ADC FRAMEINDEX
PHX
TAX
LDA DIR
BNE XLeft

LDA $00
SEC
SBC XDISP,x
PLX ;pulling x here = loop index
CLC
ADC XBIAS,x ;add bias since it throws it on the other side
STA $0300,y
BRA XNext
XLeft
LDA $00
CLC
ADC XDISP,x
STA $0300,y
PLX
XNext

TXA
CLC
ADC FRAMEINDEX
PHX
TAX
LDA $01
CLC
ADC YDISP,x
STA $0301,y
PLX

TXA
CLC
ADC FRAMEINDEX
PHX
TAX
LDA TILEMAP,x
STA $0302,y
PLX

TXA
CLC
ADC FRAMEINDEX
PHX
TAX
LDA PROP,x
ORA $64
PHX
LDX DIR
EOR EORF,x
PLX

PLX ;restore loop index, since the same palette applies to each tile
STA TEMP ;store current value to TEMP
LDA CPAL,x
BEQ CustomPal ;if zero, use user supplied palette

ASL A ;else move into palette bits
TSB TEMP ;OR with current bits
LDA PROPRAM
AND #$01 ;load only the low bit, page bit
TSB TEMP ;OR with current bits
LDA TEMP ;get ready to store it

BRA StoreProp ;skip past custom palette bit

CustomPal
LDA #$00 ;reset
LDA PROPRAM ;just OR with propram
ORA TEMP ;and also TEMP

StoreProp
STA $0303,y

INY
INY
INY
INY
INX
CPX #$05 ;5 tiles ATM
BEQ End_Loop
JMP OAM_Loop

End_Loop
LDX $15E9

LDY #$FF ;$460 written to
LDA #$04 ;5 tiles
JSL $01B7B3

RTS

;=================
;BORROWED ROUTINES
;=================

;GET_DRAW_INFO
;==============

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $B760 - graphics routine helper - shared
; sets off screen flags and sets index to OAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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 ; /


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_OFF_SCREEN
; This subroutine deals with sprites that have moved off screen
; It is adapted from the subroutine at $01AC0D
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SPR_T12 dcb $40,$B0
SPR_T13 dcb $01,$FF
SPR_T14 dcb $30,$C0,$A0,$C0,$A0,$F0,$60,$90 ;bank 1 sizes
dcb $30,$C0,$A0,$80,$A0,$40,$60,$B0 ;bank 3 sizes
SPR_T15 dcb $01,$FF,$01,$FF,$01,$FF,$01,$FF ;bank 1 sizes
dcb $01,$FF,$01,$FF,$01,$00,$01,$FF ;bank 3 sizes

SUB_OFF_SCREEN_X1 LDA #$02 ; \ entry point of routine determines value of $03
BRA STORE_03 ; | (table entry to use on horizontal levels)
SUB_OFF_SCREEN_X2 LDA #$04 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X3 LDA #$06 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X4 LDA #$08 ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X5 LDA #$0A ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X6 LDA #$0C ; |
BRA STORE_03 ; |
SUB_OFF_SCREEN_X7 LDA #$0E ; |
STORE_03 STA $03 ; |
BRA START_SUB ; |
SUB_OFF_SCREEN_X0 STZ $03 ; /

START_SUB JSR SUB_IS_OFF_SCREEN ; \ if sprite is not off screen, return
BEQ RETURN_35 ; /
LDA $5B ; \ goto VERTICAL_LEVEL if vertical level
AND #$01 ; |
BNE VERTICAL_LEVEL ; /
LDA $D8,x ; \
CLC ; |
ADC #$50 ; | if the sprite has gone off the bottom of the level...
LDA $14D4,x ; | (if adding 0x50 to the sprite y position would make the high byte >= 2)
ADC #$00 ; |
CMP #$02 ; |
BPL ERASE_SPRITE ; / ...erase the sprite
LDA $167A,x ; \ if "process offscreen" flag is set, return
AND #$04 ; |
BNE RETURN_35 ; /
LDA $13 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0756 VC:176 00 FL:205
AND #$01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0780 VC:176 00 FL:205
ORA $03 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0796 VC:176 00 FL:205
STA $01 ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0820 VC:176 00 FL:205
TAY ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0844 VC:176 00 FL:205
LDA $1A ;A:8A01 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizcHC:0858 VC:176 00 FL:205
CLC ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0882 VC:176 00 FL:205
ADC SPR_T14,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZcHC:0896 VC:176 00 FL:205
ROL $00 ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizcHC:0928 VC:176 00 FL:205
CMP $E4,x ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:0966 VC:176 00 FL:205
PHP ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:0996 VC:176 00 FL:205
LDA $1B ;A:8AC0 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizCHC:1018 VC:176 00 FL:205
LSR $00 ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdiZCHC:1042 VC:176 00 FL:205
ADC SPR_T15,y ;A:8A00 X:0009 Y:0001 D:0000 DB:01 S:01F0 P:envMXdizcHC:1080 VC:176 00 FL:205
PLP ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F0 P:eNvMXdizcHC:1112 VC:176 00 FL:205
SBC $14E0,x ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1140 VC:176 00 FL:205
STA $00 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1172 VC:176 00 FL:205
LSR $01 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:eNvMXdizCHC:1196 VC:176 00 FL:205
BCC SPR_L31 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1234 VC:176 00 FL:205
EOR #$80 ;A:8AFF X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdiZCHC:1250 VC:176 00 FL:205
STA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1266 VC:176 00 FL:205
SPR_L31 LDA $00 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1290 VC:176 00 FL:205
BPL RETURN_35 ;A:8A7F X:0009 Y:0001 D:0000 DB:01 S:01F1 P:envMXdizCHC:1314 VC:176 00 FL:205
ERASE_SPRITE LDA $14C8,x ; \ if sprite status < 8, permanently erase sprite
CMP #$08 ; |
BCC KILL_SPRITE ; /
LDY $161A,x ;A:FF08 X:0007 Y:0001 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1108 VC:059 00 FL:2878
CPY #$FF ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZCHC:1140 VC:059 00 FL:2878
BEQ KILL_SPRITE ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1156 VC:059 00 FL:2878
LDA #$00 ;A:FF08 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdizcHC:1172 VC:059 00 FL:2878
STA $1938,y ;A:FF00 X:0007 Y:0000 D:0000 DB:01 S:01F3 P:envMXdiZcHC:1188 VC:059 00 FL:2878
KILL_SPRITE STZ $14C8,x ; erase sprite
RETURN_35 RTS ; return

VERTICAL_LEVEL LDA $167A,x ; \ if "process offscreen" flag is set, return
AND #$04 ; |
BNE RETURN_35 ; /
LDA $13 ; \
LSR A ; |
BCS RETURN_35 ; /
LDA $E4,x ; \
CMP #$00 ; | if the sprite has gone off the side of the level...
LDA $14E0,x ; |
SBC #$00 ; |
CMP #$02 ; |
BCS ERASE_SPRITE ; / ...erase the sprite
LDA $13 ;A:0000 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:1218 VC:250 00 FL:5379
LSR A ;A:0016 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1242 VC:250 00 FL:5379
AND #$01 ;A:000B X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1256 VC:250 00 FL:5379
STA $01 ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1272 VC:250 00 FL:5379
TAY ;A:0001 X:0009 Y:00E4 D:0000 DB:01 S:01F3 P:envMXdizcHC:1296 VC:250 00 FL:5379
LDA $1C ;A:001A X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0052 VC:251 00 FL:5379
CLC ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0076 VC:251 00 FL:5379
ADC SPR_T12,y ;A:00BD X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0090 VC:251 00 FL:5379
ROL $00 ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:enVMXdizCHC:0122 VC:251 00 FL:5379
CMP $D8,x ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0160 VC:251 00 FL:5379
PHP ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0190 VC:251 00 FL:5379
LDA.W $001D ;A:006D X:0009 Y:0001 D:0000 DB:01 S:01F2 P:eNVMXdizcHC:0212 VC:251 00 FL:5379
LSR $00 ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdiZcHC:0244 VC:251 00 FL:5379
ADC SPR_T13,y ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:enVMXdizCHC:0282 VC:251 00 FL:5379
PLP ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F2 P:envMXdiZCHC:0314 VC:251 00 FL:5379
SBC $14D4,x ;A:0000 X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNVMXdizcHC:0342 VC:251 00 FL:5379
STA $00 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0374 VC:251 00 FL:5379
LDY $01 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0398 VC:251 00 FL:5379
BEQ SPR_L38 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0422 VC:251 00 FL:5379
EOR #$80 ;A:00FF X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0438 VC:251 00 FL:5379
STA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0454 VC:251 00 FL:5379
SPR_L38 LDA $00 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0478 VC:251 00 FL:5379
BPL RETURN_35 ;A:007F X:0009 Y:0001 D:0000 DB:01 S:01F3 P:envMXdizcHC:0502 VC:251 00 FL:5379
BMI ERASE_SPRITE ;A:8AFF X:0002 Y:0000 D:0000 DB:01 S:01F3 P:eNvMXdizcHC:0704 VC:184 00 FL:5490

SUB_IS_OFF_SCREEN LDA $15A0,x ; \ if sprite is on screen, accumulator = 0
ORA $186C,x ; |
RTS ; / return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_HORZ_POS
; This routine determines which side of the sprite Mario is on. It sets the Y register
; to the direction such that the sprite would face Mario
; It is ripped from $03B817
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SUB_HORZ_POS LDY #$00
LDA $94
SEC
SBC $E4,x
STA $0F
LDA $95
SBC $14E0,x
BPL SPR_L16
INY
SPR_L16 RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_CHANGE_DIR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;org $019098

SUB_CHANGE_DIR LDA $15AC,x
BNE LABEL41
LDA #$08
STA $15AC,x
LDA $B6,x
EOR #$FF
INC A
STA $B6,x
LDA $157C,x
EOR #$01
STA $157C,x
LABEL41 RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB_HORZ_POS
; This routine determines which side of the sprite Mario is on. It sets the Y register
; to the direction such that the sprite would face Mario
; It is ripped from $03B817
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SUB_HORZ_POS LDY #$00
LDA $94
SEC
SBC $E4,x
STA $0F
LDA $95
SBC $14E0,x
BPL SPR_L16
INY
SPR_L16 RTS
geschrieben am 27.12.2010 17:04:34
( Link )
2. Ich hoffe das hilft:
No PDA here
geschrieben am 27.12.2010 18:01:44
( Link )
Das ist bereits aktiviert. Wie gesagt, wenn ich auf den Gegner springe, bleibt die gerade angezeigte Animation vom Banditen kurz auf dem Screen und verschwindet dann.

Edit: Interessanterweise haben sich soeben beide meiner Probleme gelöst. Ich liebe Lunar Magic, wenn es so will wie ich!
geschrieben am 30.12.2010 15:01:51
( Link )
Ich hab folgendes Problem: Ich wollte meinen Hack eigentlich ohne Zeitlimit machen und habe deswegen zuerst versucht einfach in allen Leveln das Zeitlimit auf 0 zu stellen und den Timer aus der Statusbar zu löschen.

Aber als ich ihn gelöscht hatte tauchte in der Statusbar ein A auf:

Dann habe ich versucht ihn mit der Rom Adresse zu löschen: x1028 - Change this address to AD to disable the timer.
Habe ich ebenfalls gemacht aber an der Statusbar hat sich absolut nichts geändert....

Wer eine Lösung für eines der Probleme hat....bitte...danke...und so...
geschrieben am 30.12.2010 15:48:41
( Link )
Ich stelle fest, du hast lediglich die Timer-Teile mit einem leeren Teil aus der rechten Hälfte des Editors überschrieben. Der Code, der die Zeit anzeigt, ist aber noch da, also wird trotzdem Teil 0 angezeigt, und da es aus der rechten Hälfte stammt, ist es keine 0, sondern ein A.

Um den Timer-Code selbst wegzukriegen, musst du mit der Leertaste in den Counter-Modus wechseln, mit den Pfeiltasten den Timer auswählen und Entf drücken. ich empfehle dir aber sehr, statt Smallhackers Tool Status Effect zu benutzen.
geschrieben am 30.12.2010 16:28:48
( Link )
Zitat von WYE:
Ich stelle fest, du hast lediglich die Timer-Teile mit einem leeren Teil aus der rechten Hälfte des Editors überschrieben. Der Code, der die Zeit anzeigt, ist aber noch da, also wird trotzdem Teil 0 angezeigt, und da es aus der rechten Hälfte stammt, ist es keine 0, sondern ein A.

Um den Timer-Code selbst wegzukriegen, musst du mit der Leertaste in den Counter-Modus wechseln, mit den Pfeiltasten den Timer auswählen und Entf drücken. ich empfehle dir aber sehr, statt Smallhackers Tool Status Effect zu benutzen.


Oh WYE das ist ein RIIIEEESSSIIIEEEGGGGERRR Minus Punkt in deiner perfektes Deutschliste ^^ Aber trotzdem danke funktioniert perfekt ^^
geschrieben am 30.12.2010 16:48:06
( Link )
?
geschrieben am 30.12.2010 17:20:27
( Link )
Halt O_o jetzt versteh ichs ^^....Fail von mir

Edit: Aber das i am Satzanfang war nicht großgeschrieben :3 also etwas weniger Fail von mir ^^

Edit 2: Aber etwas ist da komisch.....wenn man das erste level schafft bekommt man ein Leben sobald die Zeit unter Course clear angezeigt wird...und nach dem Level ist dies nicht mehr der Fall...
geschrieben am 30.12.2010 18:11:36
( Link )
Das liegt an einem nahezu unbekannten Feature in SMW - Man bekommt ein 1up, wenn die Bonus-Sterne, die man am Ziel bekommt, gleich der letzten zwei Stellen des Timers ist. Und da der Timer hier 0 ist und man oft 0 Bonus-Sterne bekommt, gibt's eben oft Leben.

Es sei denn:
Code
2CE66	$05:CC66	2 bytes	Misc.	Change to 80 1C to prevent the player from getting a free 1UP at the goal if the tens digit of your bonus star counter and the tens and ones digits of your time are all the same
geschrieben am 30.12.2010 18:29:02
( Link )
Zitat von WYE:
Das liegt an einem nahezu unbekannten Feature in SMW - Man bekommt ein 1up, wenn die Bonus-Sterne, die man am Ziel bekommt, gleich der letzten zwei Stellen des Timers ist. Und da der Timer hier 0 ist und man oft 0 Bonus-Sterne bekommt, gibt's eben oft Leben.

Es sei denn:
Code
2CE66	$05:CC66	2 bytes	Misc.	Change to 80 1C to prevent the player from getting a free 1UP at the goal if the tens digit of your bonus star counter and the tens and ones digits of your time are all the same


Danke WYE ^^ Jetzt funktioniert es perfekt ^^ und das Feature ist mir echt unbekannt gewesen... Aber eine Frage hätte ich dann noch...die ist aber nicht wirklich wichtig es interessiert mich nur...wieso erhält man dann in Level mit Zeitlimit 0 kein Extraleben wenn man das Level beendet ? (Ich weiß ich nerve ^^)
geschrieben am 30.12.2010 19:40:47
( Link )
Doch, das tut man. (Sollte man zumindest, wenn man nicht gerade Bonussterne bekommt.)