• Welcome to Smashboards, the world's largest Super Smash Brothers community! Over 250,000 Smash Bros. fans from around the world have come to discuss these great games in over 19 million posts!

    You are currently viewing our boards as a visitor. Click here to sign up right now and start on your path in the Smash community!

Completed Transparent HUD v1.1

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.

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:
 
Last edited:

Kaninapo

Smash Rookie
Joined
Jan 29, 2014
Messages
2
Slippi.gg
KALI#273
Didn't realize I needed it until I did. It works great; thanks for making it and all the other contributions you've made to the community.
 

davidvkimball

blippi.gg, @MeleeHD Lead
Joined
Jun 21, 2013
Messages
400
Location
Tacoma, WA
Slippi.gg
D#0
NNID
davidvkimball
3DS FC
3196-5240-6546
Switch FC
SW-1880-0689-1110
Thanks, works great!
 
Top Bottom