Users browsing this thread: 1 Guest(s)
No Sale! (Sale/Bet prohibition code)
12-21-2022, 12:17 AM
(This post was last modified: 03-18-2023, 02:30 AM by C-Dude.
Edit Reason: Forgot a label, making freespace reassignment impossible. It has been corrected.
)
This is code which will prevent items set at 0 value from being sold in stores or bet at the Colosseum. Combined with an editor, this should allow you to flag precious treasures that the player is not meant to sell.
Presented as raw code because it uses space in the C3 bank, which may or may not be full in your hack. Yes, I probably should give you an assembly file so you can change the values as need-be. No, I'm probably not going to do that.
EDIT: Okay, fine, I get that people hate hex mangling and this could be very important to new hackers who are unfamiliar with the gibberish I spout. To that end, here's an assembly version compatible with xKas v0.06
Presented as raw code because it uses space in the C3 bank, which may or may not be full in your hack. Yes, I probably should give you an assembly file so you can change the values as need-be. No, I'm probably not going to do that.

Code:
--------------------------
No Sale!
--------------------------
Sets items that have a value of 0 to the gray font palette in the sell and Colosseum menus, and prevents their sale or wager
Subroutine: Check if priceless, set carry if so
3FEEF
DA PHX Put X on the stack for now
20 21 83 JSR $8321 Calculate Item Offset
AE 34 21 LDX $2134
C2 20 REP #$20 Set 16-bit A
BF 1C 50 D8 LDA $D8501C,X Load price, both bytes
D0 03 BNE $03 Branch if nonzero
38 SEC Set carry if zero, indicating priceless
80 01 BRA $01 Cleanup and exit
18 CLC Nonzero branch lands here
E2 20 SEP #$20 Set 8-bit A
FA PLX Pull original X back off the stack
60 RTS Exit
Subroutine: Check if empty or priceless for shop, set carry if so
3FF06
20 CB BF JSR $BFCB Calculate selected item
C9 FF CMP #$FF Is it empty?
F0 05 BEQ $05 Set carry if so.
20 EF FE JSR $FEEF Check if priceless (This is a freespace routine)
80 01 BRA $01 Exit
38 SEC
60 RTS
Hook: Make shop check empty or priceless, bzzt if either
3B63A
20 06 FF JSR $FF06 Freespace subroutine to set carry if item is priceless or empty
EA EA NOP #2
B0 2E BCS $2E Bzzzt and pixelate if carry is set
Code Block: Check if empty or priceless for Colosseum, set carry if so
3FF14
BD 69 18 LDA $1869,X Get item in slot (wager)
C9 FF CMP #$FF Is it empty?
F0 05 BEQ $05 Set carry if so
20 EF FE JSR $FEEF Check if priceless (This is a freespace routine)
80 01 BRA $01 Exit
38 SEC
B0 06 BCS $06 If empty or priceless, go to fail and buzzer
BD 69 18 LDA $1869,X Load wager again
4C 01 AD JMP $AD01 Continue with bet
4C 0E AD JMP $AD0E Fail and buzzer/pixelate
Hook: Make Colosseum check empty or priceless, bzzt if either
3ACFA
4C 14 FF JMP $FF14 Go to alternate code block
EA EA EA EA NOP #4
Subroutine: Check if priceless for sell/Colosseum color
3FF2C
B9 69 18 LDA $1869,Y Get item in slot
20 21 83 JSR $8321 Compute the item's index
AE 34 21 LDX $2134 Load it
C2 20 REP #$20 Set 16-bit A
BF 1C 50 D8 LDA $D8501C,X Load price, both bytes
D0 03 BNE $03 Branch if nonzero
38 SEC Set carry, indicating priceless
80 01 BRA $01 Skip the clear carry for items with value
18 CLC
E2 20 SEP #$20 Set 8-bit A
B0 05 BCS $05 If carry is set, item is priceless
A9 20 LDA #$20
85 29 STA $29 Set font color to white
60 RTS Exit
A9 28 LDA #$28
85 29 STA $29 Set font color to gray
60 RTS
Hook: Gray Lists for Sell/Coliseum
3804A
F0 06 BEQ $06 If sell menu, branch (closer than Vanilla)
C9 07 CMP #$07 Is it the Colosseum menu?
F0 02 BEQ $02 If so, branch (closer than Vanilla)
80 04 BRA $04 Otherwise, branch to Item menu handling
Hook: Subroutine to gray list if 0 value item
38052 [This was flagged as unused in the C3 disassembly]
20 2C FF JSR $FF2C Check if priceless for sell/Colosseum color
60 RTS Exit
EDIT: Okay, fine, I get that people hate hex mangling and this could be very important to new hackers who are unfamiliar with the gibberish I spout. To that end, here's an assembly version compatible with xKas v0.06
Code:
;--------------------------
;No Sale!
;--------------------------
;Sets items that have a value of 0 to the gray font palette in the sell and Colosseum menus, and prevents their sale or wager
hirom
;header
;Hooks: Vanilla locations that hook into freespace subroutines to add the price criterion
org $C3804A ;Hook: Gray Lists for Sell menu
BEQ Gray_Lists ;If sell menu, branch (closer than Vanilla)
org $C3804E ;Hook: Gray Lists for Coliseum menu
BEQ Gray_Lists ;If so, branch (closer than Vanilla)
org $C38052 ;xKas info: Destination of Gray_Lists branches
Gray_Lists:
org $C38052 ;Hook: Subroutine to gray list if 0 value item
;Originally flagged as unused in the C3 disassembly
JSR Font_Check ;Check if priceless for sell/Colosseum color
RTS ;Exit
org $C3ACFA ;Hook: Make Coliseum check empty or priceless and bzzt if either
JMP Coliseum_Check ;Go to alternate code block
NOP #4
org $C3B63A ;Hook: Make shop check empty or priceless, bzzt if either
JSR Shop_Check ;Freespace subroutine to set carry if item is priceless or empty
NOP #2
BCS $2E ;Bzzzt and pixelate if carry is set
;Subroutines: Freespace calculation of item value, to set the carry flag if value is 0
org $C3FEEF ;This is a freespace value, change it to an appropriate spot in your ROM.
;This patch requires 0x60 bytes of space in the C3 bank.
;It could probably be optimized or relocated with Eggers jumps, but...
;I'm not going to do that for you!
Price_Check: ;Subroutine: Check if priceless, set carry if so
PHX ;Put X on the stack for now
JSR $8321 ;Calculate Item Offset (Vanilla C3 subroutine)
LDX $2134
REP #$20 ;Set 16-bit A
LDA $D8501C,X ;Load price, both bytes
BNE Price_Check_notZero ;Branch if nonzero
SEC ;Set carry if zero, indicating priceless
BRA Price_Check_exit ;Cleanup and exit
Price_Check_notZero:
CLC
Price_Check_exit:
SEP #$20 ;Set 8-bit A
PLX ;Pull original X back off the stack
RTS ;Exit
Shop_Check: ;Subroutine: Check if empty or priceless for shop, set carry if so
;At C3FF06 if you didn't change the freespace value
JSR $BFCB ;Calculate selected item
CMP #$FF ;Is it empty?
BEQ Shop_Check_Empty ;Set carry if so.
JSR Price_Check ;Check if priceless
BRA Shop_Check_Exit ;Exit
Shop_Check_Empty:
SEC
Shop_Check_Exit:
RTS
Coliseum_Check: ;Code Block: Check if empty or priceless for Colosseum, set carry if so
;At C3FF14 if you didn't change the freespace value
LDA $1869,X ;Get item in slot (wager)
CMP #$FF ;Is it empty?
BEQ $05 ;Set carry if so
JSR Price_Check ;Check if priceless
BRA Coliseum_Check_Announce
Coliseum_Check_Empty:
SEC ;Flag this item slot for bzzt and pixelation
Coliseum_Check_Announce:
BCS Coliseum_Check_Bzzt ;If empty or priceless, go to fail and buzzer
LDA $1869,X ;Load wager again
JMP $AD01 ;Continue with bet (Vanilla C3 address)
Coliseum_Check_Bzzt:
JMP $AD0E ;Fail and buzzer/pixelate (Vanilla C3 address)
Font_Check: ;Subroutine: Check if priceless for sell/Colosseum color
;At C3FF2C if you didn't change the freespace value
LDA $1869,Y ;Get item in slot
JSR $8321 ;Compute the item's index (Vanilla C3 subroutine)
LDX $2134 ;Load it
REP #$20 ;Set 16-bit A
LDA $D8501C,X ;Load price, both bytes
BNE Font_Check_notZero ;Branch if nonzero
SEC ;Set carry, indicating priceless
BRA Font_Check_Announce ;Skip the clear carry for items with value
Font_Check_notZero:
CLC ;Flag this item slot to draw in white font
Font_Check_Announce:
SEP #$20 ;Set 8-bit A
BCS Font_Check_Gray ;If carry is set, item is priceless
LDA #$20
STA $29 ;Set font color to white
RTS ;Exit
Font_Check_Gray:
LDA #$28
STA $29 ;Set font color to gray
RTS
![[-]](https://www.ff6hacking.com/forums/ff9/collapse.png)
• Gi Nattak (12-21-2022), madsiur (12-21-2022), PowerPanda (12-21-2022), Warrax (12-22-2022)
12-22-2022, 11:07 AM
Is xKas a program listed on this sight? Or should we google it for the download?
12-22-2022, 11:26 AM
We have xkas hosted on the wiki:
https://www.ff6hacking.com/wiki/doku.php?id=utility
under General Utilities>Assembly.
https://www.ff6hacking.com/wiki/doku.php?id=utility
under General Utilities>Assembly.
We are born, live, die and then do the same thing over again.
« Next Oldest | Next Newest »
Users browsing this thread: 1 Guest(s)