UnclePunch
Smash Ace
- Joined
- Nov 9, 2014
- Messages
- 673
This code makes the fighter's HUD elements transparent when a fighter is positioned behind it. The fighter's ECB is made into a rectangle and is checked against the area each fighter's HUD occupies. GXProject is used to convert CObj coords to onscreen coords.
Demonstration:
Code:
$HUD Transparency v1.1 [UnclePunch]
C22F6690 0000009D
7C0802A6 90010004
9421FF00 BE810008
3860000E 3880000F
38A00000 3D808039
618C01F0 7D8903A6
4E800421 7C7F1B78
38600090 3D808037
618CF1E4 7D8903A6
4E800421 7C7E1B78
38800090 3D808000
618CC160 7D8903A6
4E800421 7FC6F378
7FE3FB78 38800004
3CA08037 60A5F1B0
3D808039 618C0B68
7D8903A6 4E800421
7FE3FB78 48000059
7C8802A6 38A00013
3D808038 618CFD54
7D8903A6 4E800421
4800040D 7C6802A6
7FC4F378 38A00000
C0230008 D0240000
C023000C D0240008
C0230010 D0240010
38A50001 38840018
2C050006 4180FFDC
480003F8 4E800021
7C0802A6 90010004
9421FF00 BE810008
83E3002C 480003B9
7FC802A6 3A800000
7FF5FB78 C03E0008
D0350004 C03E000C
D035000C C03E0010
D0350014 3A940001
3AB50018 2C140006
4180FFDC 806DC18C
82830020 480001D8
82B4002C 8875221F
54600673 408201C4
8875221E 54600631
408201B8 C03506F8
C0550778 EC41102A
D0410080 C0550780
EC41102A D0410084
C03506F4 C055078C
EC41102A D0410088
C0550784 EC41102A
D041008C 3D808003
618C0A50 7D8903A6
4E800421 83A30028
38600000 90610068
C0210088 D0210060
C0210080 D0210064
7FA3EB78 38810060
38A10070 38C00000
3D808000 618CE210
7D8903A6 4E800421
C0210070 D0210088
C0210074 D0210080
C021008C D0210060
C0210084 D0210064
7FA3EB78 38810060
38A10070 38C00000
3D808000 618CE210
7D8903A6 4E800421
C0210070 D021008C
C0210074 D0210084
3AC00000 7EC3B378
3D80802F 618C3424
7D8903A6 4E800421
7C641B78 3C60804A
60630FD8 80630000
80630028 38A10090
38C00000 3D808000
618CE210 7D8903A6
4E800421 C0210090
C05E0014 EC21102A
C0410088 FC020840
4080007C C0210090
C05E0014 EC211028
C041008C FC020840
40810064 C0210094
C05E0018 EC211028
C0410084 FC020840
4081004C C0210094
C05E0018 EC21102A
C0410080 FC020840
40800034 1C760018
7C63FA14 C05E0000
C03E0008 EC2100B2
D0230004 C03E000C
EC2100B2 D023000C
C03E0010 EC2100B2
D0230014 3AD60001
2C160006 4180FF28
82940008 2C140000
4082FE28 3A800000
1C740018 7EA3FA14
3C60804A 60631380
1C940050 7C632214
80630000 2C030000
4182000C 38950000
4800006D 3C60804A
606310C8 1C940064
7C632214 80630004
2C030000 4182000C
38950008 48000049
3C60804A 606310C8
1C940064 7C632214
80630000 2C030000
4182000C 38950010
48000025 3A940001
2C140006 4180FF84
BA810008 80010104
38210100 7C0803A6
4E800020 7C0802A6
90010004 9421FF00
BE810008 83E30028
7C9E2378 480000E9
7FA802A6 C03E0000
C05E0004 C07D0004
FC011040 4182003C
41810018 EC21182A
FC011040 40810020
FC201090 48000018
EC211828 FC011040
4080000C FC201090
48000004 D03E0000
7FE3FB78 48000019
BA810008 80010104
38210100 7C0803A6
4E800020 7C0802A6
90010004 9421FFE4
93E10014 93C10018
7C7F1B78 83DF0018
48000024 807E0008
2C030000 41820014
8063000C 2C030000
41820008 D023000C
83DE0004 2C1E0000
4082FFDC 807F0010
2C030000 41820008
4BFFFFAD 807F0008
2C030000 41820008
4BFFFF9D 83C10018
83E10014 80010020
3821001C 7C0803A6
4E800020 4E800021
3ECCCCCD 3DA3D70A
3F7FBE77 3F32F1AA
3F7FBE77 42820000
42820000 40000000
BA810008 80010104
38210100 7C0803A6
8001001C 00000000
Code:
#To be inserted at 802f6690
.include "../../Globals.s"
.set REG_GObj,31
.set REG_GObjData,30
#Manager Data
.set mgr_size,0x18
.set mgr_stockcurr,0x0
.set mgr_stockfinal,0x4
.set mgr_insigcurr,0x8
.set mgr_insigfinal,0xC
.set mgr_pcntcurr,0x10
.set mgr_pcntfinal,0x14
backup
#Create GObj
li r3,14
li r4,15
li r5,0
branchl r12,GObj_Create
mr REG_GObj,r3
#Allocate Space
li r3,mgr_size * 6
branchl r12,HSD_MemAlloc
mr REG_GObjData,r3
#Zero
li r4, mgr_size * 6
branchl r12,ZeroAreaLength
#Initialize
mr r6,REG_GObjData
mr r3,REG_GObj
li r4,4
load r5,HSD_Free
branchl r12,GObj_AddUserData
#Add Process
mr r3,REG_GObj
bl Mgr_Think
mflr r4
li r5,19
branchl r12,GObj_AddProc
#Init mgr struct
bl Floats
mflr r3
mr r4,REG_GObjData
li r5,0
MgrInit_Loop:
lfs f1,0x8(r3)
stfs f1,mgr_stockcurr(r4)
lfs f1,0xC(r3)
stfs f1,mgr_insigcurr(r4)
lfs f1,0x10(r3)
stfs f1,mgr_pcntcurr(r4)
addi r5,5,1
addi r4,r4,mgr_size
cmpwi r5,6
blt MgrInit_Loop
b Exit
##############################
Mgr_Think:
blrl
.set REG_MgrData,31
.set REG_Floats,30
backup
lwz REG_MgrData,0x2C(r3)
bl Floats
mflr REG_Floats
# Init all HUD transparency
.set REG_Count,20
.set REG_ThisHUD,21
li REG_Count,0
mr REG_ThisHUD,REG_MgrData
Mgr_InitLoop:
lfs f1,0x8(REG_Floats)
stfs f1,mgr_stockfinal(REG_ThisHUD)
lfs f1,0xC(REG_Floats)
stfs f1,mgr_insigfinal(REG_ThisHUD)
lfs f1,0x10(REG_Floats)
stfs f1,mgr_pcntfinal(REG_ThisHUD)
Mgr_InitInc:
addi REG_Count,REG_Count,1
addi REG_ThisHUD,REG_ThisHUD,mgr_size
cmpwi REG_Count,6
blt Mgr_InitLoop
# Check for collisions
.set REG_Fighter,20
.set REG_FighterData,21
lwz r3, -0x3E74 (r13)
lwz REG_Fighter,0x20(r3)
b MgrColl_FtCheck
MgrColl_FtLoop:
# Get Fighter Data
lwz REG_FighterData,0x2C(REG_Fighter)
# Check if player is dead
lbz r3,0x221f(REG_FighterData)
rlwinm. r0,r3,0,0x40
bne MgrColl_FtInc
# Check if player is invisible
lbz r3,0x221e(REG_FighterData)
rlwinm. r0,r3,0,0x80
bne MgrColl_FtInc
# Get player box
# Boxes go Up, Down, Left, Right
lfs f1,0x6F0 + 0x8 (REG_FighterData)
lfs f2,0x6F0 + 0x88 (REG_FighterData)
fadds f2,f1,f2
stfs f2,0x80(sp) # up
lfs f2,0x6F0 + 0x90 (REG_FighterData)
fadds f2,f1,f2
stfs f2,0x84(sp) # down
lfs f1,0x6F0 + 0x4 (REG_FighterData)
lfs f2,0x6F0 + 0x9C (REG_FighterData)
fadds f2,f1,f2
stfs f2,0x88(sp) # left
lfs f2,0x6F0 + 0x94 (REG_FighterData)
fadds f2,f1,f2
stfs f2,0x8C(sp) # right
# Convert these coords to screen
branchl r12,0x80030a50
lwz r29, 0x0028 (r3)
li r3,0
stw r3,0x68(sp) # Z
# Top Left
lfs f1,0x88(sp)
stfs f1,0x60(sp)
lfs f1,0x80(sp)
stfs f1,0x64(sp)
mr r3,r29
addi r4,sp,0x60 # point position
addi r5,sp,0x70
li r6,0
branchl r12,0x8000e210
lfs f1,0x70(sp) # left
stfs f1,0x88(sp)
lfs f1,0x74(sp) # bottom
stfs f1,0x80(sp)
# Bot Right
lfs f1,0x8C(sp)
stfs f1,0x60(sp)
lfs f1,0x84(sp)
stfs f1,0x64(sp)
mr r3,r29
addi r4,sp,0x60 # point position
addi r5,sp,0x70
li r6,0
branchl r12,0x8000e210
lfs f1,0x70(sp) # right
stfs f1,0x8C(sp)
lfs f1,0x74(sp) # bottom
stfs f1,0x84(sp)
# Check if colliding with any HUD
.set REG_Count,22
.set REG_HUDPos,23
li REG_Count,0
MgrColl_HUDLoop:
# Get this HUD elements pos
mr r3,REG_Count
branchl r12,0x802f3424
# Get onscreen coords
mr r4,r3
load r3,0x804a0fd8 # get hud camera gobj
lwz r3, 0x0000 (r3)
lwz r3, 0x0028 (r3) # get hud camera cobj
addi r5,sp,0x90
li r6,0
branchl r12,0x8000e210
# Check if fighter is within this HUDs area
# Boxes go Up, Down, Left, Right
# ft.left < hud.right
lfs f1,0x90(sp) # hud X
lfs f2,0x14(REG_Floats) # width
fadds f1,f1,f2
lfs f2,0x88(sp)
fcmpo cr0,f2,f1
bge MgrColl_HUDInc
# ft.right > hud.left
lfs f1,0x90(sp) # hud X
lfs f2,0x14(REG_Floats) # width
fsubs f1,f1,f2
lfs f2,0x8C(sp)
fcmpo cr0,f2,f1
ble MgrColl_HUDInc
# ft.top > hud.bottom
lfs f1,0x94(sp) # hud Y
lfs f2,0x18(REG_Floats) # height
fsubs f1,f1,f2
lfs f2,0x84(sp)
fcmpo cr0,f2,f1
ble MgrColl_HUDInc
# ft.bottom < hud.top
lfs f1,0x94(sp) # hud Y
lfs f2,0x18(REG_Floats) # height
fadds f1,f1,f2
lfs f2,0x80(sp)
fcmpo cr0,f2,f1
bge MgrColl_HUDInc
# is within, set new transparency
mulli r3,REG_Count,mgr_size
add r3,r3,REG_MgrData
lfs f2,0x0(REG_Floats) # multipler
lfs f1,0x8(REG_Floats)
fmuls f1,f1,f2
stfs f1,mgr_stockfinal(r3)
lfs f1,0xC(REG_Floats)
fmuls f1,f1,f2
stfs f1,mgr_insigfinal(r3)
lfs f1,0x10(REG_Floats)
fmuls f1,f1,f2
stfs f1,mgr_pcntfinal(r3)
MgrColl_HUDInc:
addi REG_Count,REG_Count,1
cmpwi REG_Count,6
blt MgrColl_HUDLoop
MgrColl_FtInc:
lwz REG_Fighter,0x8(REG_Fighter)
MgrColl_FtCheck:
cmpwi REG_Fighter,0
bne MgrColl_FtLoop
# Update Transparency
.set REG_Count,20
.set REG_ThisHUD,21
li REG_Count,0
MgrUpdate_HUDLoop:
mulli r3,REG_Count,mgr_size
add REG_ThisHUD,r3,REG_MgrData
# Update stocks
load r3,0x804a1380
mulli r4,REG_Count,0x50
add r3,r3,r4
lwz r3,0x0(r3)
cmpwi r3,0
beq 0xC
addi r4,REG_ThisHUD, 0 * mgr_size
bl ElementUpdate
# Update insignia
load r3,0x804a10c8
mulli r4,REG_Count,0x64
add r3,r3,r4
lwz r3,0x4(r3)
cmpwi r3,0
beq 0xC
addi r4,REG_ThisHUD, 1 * 0x8
bl ElementUpdate
# Update percent
load r3,0x804a10c8
mulli r4,REG_Count,0x64
add r3,r3,r4
lwz r3,0x0(r3)
cmpwi r3,0
beq 0xC
addi r4,REG_ThisHUD, 2 * 0x8
bl ElementUpdate
MgrUpdate_HUDInc:
addi REG_Count,REG_Count,1
cmpwi REG_Count,6
blt MgrUpdate_HUDLoop
Mgr_Exit:
restore
blr
##############################
ElementUpdate:
# r3 = gobj
# r4 = mgr data
.set REG_JObj, 31
.set REG_MgrData, 30
.set REG_Floats,29
backup
lwz REG_JObj,0x28(r3)
mr REG_MgrData,r4
bl Floats
mflr REG_Floats
# check if already at destination transparency
lfs f1,0x0(REG_MgrData) # curr
lfs f2,0x4(REG_MgrData) # final
lfs f3,0x4(REG_Floats) # step amt
fcmpo cr0,f1,f2
beq ElementUpdate_Exit
# Check whether to add or sub
bgt ElementUpdate_Sub
ElementUpdate_Add:
# add to curr
fadds f1,f1,f3
# check if over destination
fcmpo cr0,f1,f2
ble ElementUpdate_SetAlpha
# use destination alpha
fmr f1,f2
b ElementUpdate_SetAlpha
ElementUpdate_Sub:
# add to curr
fsubs f1,f1,f3
# check if under destination
fcmpo cr0,f1,f2
bge ElementUpdate_SetAlpha
# use destination alpha
fmr f1,f2
b ElementUpdate_SetAlpha
ElementUpdate_SetAlpha:
stfs f1,0x0(REG_MgrData) # update curr
mr r3,REG_JObj
bl JOBJ_SetAllAlpha
ElementUpdate_Exit:
restore
blr
##############################
JOBJ_SetAllAlpha:
# r3 = jobj
# f1 = alpha
.set REG_JObj, 31
.set REG_DObj, 30
# backup jobj
mflr r0
stw r0, 0x0004 (sp)
stwu sp, -0x001C (sp)
stw REG_JObj, 0x0014 (sp)
stw REG_DObj, 0x0018 (sp)
mr REG_JObj,r3
# set all mobj alpha
lwz REG_DObj,0x18(REG_JObj)
b JOBJ_SetAllAlpha_DObjCheck
JOBJ_SetAllAlpha_DObjLoop:
lwz r3,0x8(REG_DObj) # get mobj
cmpwi r3,0
beq JOBJ_SetAllAlpha_DObjInc
lwz r3,0xC(r3) # get material
cmpwi r3,0
beq JOBJ_SetAllAlpha_DObjInc
stfs f1,0xC(r3) # set alpha
JOBJ_SetAllAlpha_DObjInc:
lwz REG_DObj,0x4(REG_DObj)
JOBJ_SetAllAlpha_DObjCheck:
cmpwi REG_DObj,0
bne JOBJ_SetAllAlpha_DObjLoop
# run on child
lwz r3,0x10(REG_JObj)
cmpwi r3,0
beq 0x8
bl JOBJ_SetAllAlpha
# run on sibling
lwz r3,0x8(REG_JObj)
cmpwi r3,0
beq 0x8
bl JOBJ_SetAllAlpha
JOBJ_SetAllAlpha_Exit:
lwz REG_DObj, 0x0018 (sp)
lwz REG_JObj, 0x0014 (sp)
lwz r0,0x20(sp)
addi sp, sp, 0x001C
mtlr r0
blr
##############################
Floats:
blrl
.float 0.4 # Final Transparency Multipler
.float 0.08 # Transparency Step
.float 0.999 # Stock Default Transparency
.float 0.699 # Insignia Default Transparency
.float 0.999 # Percent Default Transparency
.float 65 # HUD Collision Width
.float 65 # HUD Collision Height
.float 2 # Fighter Position Divisor
Exit:
restore
lwz r0, 0x001C (sp)
Demonstration:
For a while, I've wanted to make it so the HUD becomes transparent when a fighter is positioned behind it. This feature was present in all Smash games after Melee and I always thought it was a great quality of life change. You can grab the code below:https://t.co/93VxraUHcu pic.twitter.com/F1344x3TbX
— UnclePunch (@UnclePunch_) November 11, 2020
Last edited: