// Note: This file has been directly converted from the EDuke32
// C source code to CON code, without any fixes or improvements.
// Further changes to player.c may or may not be reflected here.

/*
gamevar currentweapon 0 0 //  (system) (pointer)
gamevar gs 0 0 //  (system) (pointer)
gamevar looking_arc 0 0 //  (system) (pointer)
gamevar gun_pos 0 0 //  (system) (pointer)
gamevar weapon_xoffset 0 0 //  (system) (pointer)
gamevar weaponcount 0 0 //  (system) (pointer)
gamevar looking_angSR1 0 0 //  (system) (pointer)

gamevar xdim 0 0 //  (system) (pointer) (read only)
gamevar ydim 0 0 //  (system) (pointer) (read only)
gamevar windowx1 0 0 //  (system) (pointer) (read only)
gamevar windowx2 0 0 //  (system) (pointer) (read only)
gamevar windowy1 0 0 //  (system) (pointer) (read only)
gamevar windowy2 0 0 //  (system) (pointer) (read only)
*/

gamevar hud_tilenum 0 1
gamevar hud_x 0 1
gamevar hud_y 0 1
gamevar hud_scale 65536 1
gamevar hud_angle 0 1
gamevar hud_shade 0 1
gamevar hud_pal 0 1
gamevar hud_orientation 0 1

gamevar hud_fistsign 0 1
gamevar hud_totaltime 0 1

gamevar hud_shadef 0 1
gamevar hud_shadef_crystal 0 1
gamevar hud_palf 0 1

// It is unfortunate that we need so many temporary gamevars.
gamevar hud_temp 0 1
gamevar hud_temp2 0 1
gamevar hud_temp3 0 1
gamevar hud_temp4 0 1

/*
// The following temporary gamevars are named differently because they are used
// in G_Draw[...] which would overwrite their values if used elsewhere.
*/
gamevar hud_G_Draw_temp 0 1
gamevar hud_G_Draw_temp2 0 1

gamevar weapon_pos 0 1
gamevar weaponscale 0 1
gamevar playerid 0 1

// define ROTATESPRITE_MAX 2048

// preliminary functions

state G_DrawTile
    getplayer[THISACTOR].cursectnum hud_G_Draw_temp2
    ifvarg hud_G_Draw_temp2 -1
        getsector[hud_G_Draw_temp2].floorpal hud_G_Draw_temp2
    else
        setvar hud_G_Draw_temp2 0

    ifvarand hud_orientation 4
        addvar hud_angle 1024

    orvar hud_orientation 2

    rotatesprite hud_x hud_y hud_scale hud_angle hud_tilenum hud_shade hud_G_Draw_temp2 hud_orientation windowx1 windowy1 windowx2 windowy2

    ifvarand hud_orientation 2
        xorvar hud_orientation 2

    ifvarand hud_orientation 4
        subvar hud_angle 1024
ends

state G_DrawTilePal
    ifvarand hud_orientation 4
        addvar hud_angle 1024

    orvar hud_orientation 2

    rotatesprite hud_x hud_y hud_scale hud_angle hud_tilenum hud_shade hud_pal hud_orientation windowx1 windowy1 windowx2 windowy2

    ifvarand hud_orientation 2
        xorvar hud_orientation 2

    ifvarand hud_orientation 4
        subvar hud_angle 1024
ends

state G_DrawTileScaled
    setvar hud_G_Draw_temp 192 // xoff

    switch currentweapon
        case DEVISTATOR_WEAPON
        case TRIPBOMB_WEAPON
            setvar hud_G_Draw_temp 160
            break
        default
            ifvarand hud_orientation 262144
            {
                setvar hud_G_Draw_temp 160
                xorvar hud_orientation 262144
            }
            break
    endswitch

    ifvarand hud_orientation 4
        addvar hud_angle 1024

    /*
    ifvarg rendermode 2
        ifvarn usemodels 0
            ifhasmodel hud_tilenum hud_pal
            {
                setvar hud_G_Draw_temp2 224
                mulvarvar hud_G_Draw_temp2 weaponscale
                divvar hud_G_Draw_temp2 100

                addvar hud_y 224
                subvarvar hud_y hud_G_Draw_temp2
            }
    */

    mulvarvar hud_x weaponscale
    divvar hud_x 100
    setvarvar hud_G_Draw_temp2 hud_G_Draw_temp
    mulvarvar hud_G_Draw_temp2 weaponscale
    divvar hud_G_Draw_temp2 100
    subvarvar hud_G_Draw_temp hud_G_Draw_temp2
    addvarvar hud_x hud_G_Draw_temp

    mulvarvar hud_y weaponscale
    divvar hud_y 100
    setvar hud_G_Draw_temp 200
    setvarvar hud_G_Draw_temp2 hud_G_Draw_temp
    mulvarvar hud_G_Draw_temp2 weaponscale
    divvar hud_G_Draw_temp2 100
    subvarvar hud_G_Draw_temp hud_G_Draw_temp2
    addvarvar hud_y hud_G_Draw_temp

    // setvar hud_scale 65536 // do this elsewhere; leave it open for modification
    mulvarvar hud_scale weaponscale
    divvar hud_scale 100

    orvar hud_orientation 2

    rotatesprite hud_x hud_y hud_scale hud_angle hud_tilenum hud_shade hud_pal hud_orientation windowx1 windowy1 windowx2 windowy2

    ifvarand hud_orientation 2
        xorvar hud_orientation 2

    ifvarand hud_orientation 4
        subvar hud_angle 1024
ends

state G_DrawWeaponTile
    // basic fading between player weapon shades
    ifvarvarn hud_shade hud_shadef
    {
        setvar hud_G_Draw_temp 0
        ifvare hud_pal 0 setvar hud_G_Draw_temp 1
        ifvarvare hud_pal hud_palf setvar hud_G_Draw_temp 1
        ifvare hud_G_Draw_temp 1
        {
            setvarvar hud_G_Draw_temp hud_shade
            subvarvar hud_G_Draw_temp hud_shadef
            setvarvar hud_G_Draw_temp2 hud_G_Draw_temp
            shiftvarr hud_G_Draw_temp 2
            addvarvar hud_shadef hud_G_Draw_temp

            ifvare hud_G_Draw_temp 0
            {
                shiftvarr hud_G_Draw_temp2 1
                addvarvar hud_shadef hud_G_Draw_temp2
                ifvare hud_G_Draw_temp2 0
                    setvarvar hud_shadef hud_shade
            }
        }
    }
    else
        setvarvar hud_shadef hud_shade

    setvarvar hud_palf hud_pal
    setvarvar hud_shade hud_shadef

    state G_DrawTileScaled
ends

state G_DrawWeaponTile_crystal
    // basic fading between player weapon shades
    ifvarvarn hud_shade hud_shadef_crystal
    {
        setvarvar hud_G_Draw_temp hud_shade
        subvarvar hud_G_Draw_temp hud_shadef_crystal
        setvarvar hud_G_Draw_temp2 hud_G_Draw_temp
        shiftvarr hud_G_Draw_temp 2
        addvarvar hud_shadef_crystal hud_G_Draw_temp

        ifvare hud_G_Draw_temp 0
        {
            shiftvarr hud_G_Draw_temp2 1
            addvarvar hud_shadef_crystal hud_G_Draw_temp2
            ifvare hud_G_Draw_temp2 0
                setvarvar hud_shadef_crystal hud_shade
        }
    }
    else
        setvarvar hud_shadef_crystal hud_shade

    setvarvar hud_shade hud_shadef_crystal

    state G_DrawTileScaled
ends

// helper states

state reset_hud_weapon_x_coordinate
    setvarvar hud_x weapon_xoffset
    subvarvar hud_x looking_angSR1
ends
state reset_hud_weapon_y_coordinate
    setvarvar hud_y looking_arc
    subvarvar hud_y gun_pos
ends
state reset_hud_weapon_coordinates
    state reset_hud_weapon_x_coordinate
    state reset_hud_weapon_y_coordinate
ends

state determine_animation
    getuserdef[THISACTOR].pause_on hud_temp
    ifvarn hud_temp 0
        setvar hud_temp 1

    ifvarand player[THISACTOR].gm 1 // MODE_MENU
        orvar hud_temp 1

    getactor[playerid].pal hud_G_Draw_temp
    ifvare hud_G_Draw_temp 1
        orvar hud_temp 1
ends

// other EVENT_DISPLAYWEAPON code

state draw_shrunk_fists // Shrunk Running Fists
    // common calculations
    state reset_hud_weapon_x_coordinate

    setvarvar hud_temp3 looking_arc
    ifvare player[THISACTOR].jetpack_on 0
    {
        getactor[playerid].xvel hud_temp2
        shiftvarr hud_temp2 3
        addvar hud_temp3 32
        subvarvar hud_temp3 hud_temp2
        addvarvar hud_fistsign hud_temp2
    }
    // common calculations continued
    setvarvar hud_temp2 hud_fistsign
    andvar hud_temp2 2047
    sin hud_temp2 hud_temp2
    setvarvar hud_temp4 hud_temp2
    shiftvarr hud_temp2 10
    shiftvarr hud_temp4 8
    ifvarl hud_temp4 0
        mulvar hud_temp4 -1

    // right fist
    guniqhudid 101

    addvarvar hud_x hud_temp2
    addvar hud_x 250

    setvarvar hud_y hud_temp3
    addvar hud_y 258
    subvarvar hud_y hud_temp4

    setvar hud_tilenum FIST

    state G_DrawTile

    // cleanup
    subvar hud_x 250

    // left fist
    guniqhudid 102

    subvarvar hud_x hud_temp2
    addvar hud_x 40

    setvarvar hud_y hud_temp3
    addvar hud_y 200
    addvarvar hud_y hud_temp4

    orvar hud_orientation 4

    state G_DrawTile

    // cleanup
    setvar hud_orientation 0
    setvar hud_angle 0
    guniqhudid 0
ends

state draw_quick_kick // Quick Kick
    setvar hud_temp 14
    subvarvar hud_temp player[THISACTOR].quick_kick

    setvar hud_temp2 0
    ifvarn hud_temp 14 setvar hud_temp2 1
    ifvarn player[THISACTOR].last_quick_kick 0 setvar hud_temp2 1
    ifvare hud_temp2 1
    {
        getactor[playerid].pal hud_pal
        ifvarn hud_pal 1
        {
            getplayer[THISACTOR].cursectnum hud_temp2
            ifvarg hud_temp2 -1
                getsector[hud_temp2].floorpal hud_pal
            ifvare hud_pal 0
                getplayer[THISACTOR].palookup hud_pal
        }

        guniqhudid 100

        // common calculations
        state reset_hud_weapon_coordinates

        setvar hud_tilenum KNEE

        setvar hud_orientation 262148 // o|4|262144

        setvar hud_temp3 0

        ifvarg hud_temp 5
            ifvarl hud_temp 13
            {
                addvar hud_x 144 // 160-16

                addvar hud_y 214

                addvar hud_tilenum 1

                state G_DrawTileScaled

                setvar hud_temp3 1
            }

        ifvare hud_temp3 0
        {
            addvar hud_x 80

            addvar hud_y 250

            state G_DrawTileScaled
        }
    }
ends

// weapon code

state draw_kick // KNEE_WEAPON:
    ifvarg weaponcount 0
    {
        guniqhudid currentweapon

        state reset_hud_weapon_coordinates

        getactor[playerid].pal hud_pal
        ifvarn hud_pal 1
        {
            getplayer[THISACTOR].cursectnum hud_temp2
            ifvarg hud_temp2 -1
                getsector[hud_temp2].floorpal hud_pal
            ifvare hud_pal 0
                getplayer[THISACTOR].palookup hud_pal
        }

        setvar hud_tilenum KNEE

        setvar hud_temp3 0

        ifvarg weaponcount 4
            ifvarl weaponcount 10
            {
            addvar hud_x 160

            addvar hud_y 214

            addvar hud_tilenum 1

            state G_DrawTileScaled

            setvar hud_temp3 1
            }

        ifvare hud_temp3 0
        {
            addvar hud_x 220

            addvar hud_y 250

            state G_DrawTileScaled
        }
    }
ends

state draw_tripbomb // TRIPBOMB_WEAPON:
    state reset_hud_weapon_coordinates

    addvar hud_x 8
    addvar hud_y 10

    ifvarg weaponcount 6
    {
        setvarvar hud_temp weaponcount
        shiftvarl hud_temp 3
        addvarvar hud_y hud_temp
    }
    else ifvarl weaponcount 4
    {
        setvarvar hud_temp currentweapon
        shiftvarl currentweapon 2
        guniqhudid hud_temp

        addvar hud_x 142
        addvar hud_y 234

        setvar hud_tilenum HANDHOLDINGLASER
        addvar hud_tilenum 3

        state G_DrawWeaponTile

        // undo
        subvar hud_x 142
        subvar hud_y 234
    }

    // common to both hands

    addvar hud_y 249

    setvarvar hud_tilenum weaponcount
    shiftvarr hud_tilenum 2
    addvar hud_tilenum HANDHOLDINGLASER

    // left hand
    guniqhudid currentweapon

    addvar hud_x 130

    state G_DrawWeaponTile

    // right hand
    setvarvar hud_temp3 currentweapon
    shiftvarl hud_temp3 1
    guniqhudid hud_temp3

    /*
    // absolute method
    subvar hud_x 130 // undo
    addvar hud_x 152
    */
    // relative method
    addvar hud_x 22

    orvar hud_orientation 4

    state G_DrawWeaponTile

    ifvarand hud_orientation 4
        xorvar hud_orientation 4
    guniqhudid 0
ends

state draw_rpg // RPG_WEAPON:

    setvarvar hud_x weapon_xoffset
    setvarvar hud_y looking_arc
    shiftvarl hud_y 1
    subvarvar hud_y gun_pos

    setvarvar hud_temp weaponcount
    shiftvarl hud_temp 7
    addvar hud_temp 768
    andvar hud_temp 2047
    sin hud_temp hud_temp
    shiftvarr hud_temp 11

    subvarvar hud_x hud_temp
    subvarvar hud_y hud_temp

    orvar hud_orientation 512

    addvar hud_x 164

    addvar hud_y 176

    ifvarg weaponcount 0
        ifvarl weaponcount 8
        {
            setvarvar hud_tilenum weaponcount
            shiftvarr hud_tilenum 1
            addvar hud_tilenum RPGGUN

            state G_DrawWeaponTile
        }

    setvar hud_tilenum RPGGUN

    state G_DrawWeaponTile

    ifvarand hud_orientation 512
        xorvar hud_orientation 512
ends

state draw_shotgun // SHOTGUN_WEAPON:
    state reset_hud_weapon_coordinates

    subvar hud_x 8

    switch weaponcount
        case 1
        case 2
            setvarvar hud_temp4 currentweapon
            shiftvarl hud_temp4 1
            guniqhudid hud_temp4

            addvar hud_x 168
            addvar hud_y 201

            setvar hud_shade -128

            setvar hud_tilenum SHOTGUN
            addvar hud_tilenum 2

            state G_DrawWeaponTile

            subvar hud_x 168
            subvar hud_y 201
            setvarvar hud_shade gs
        case 0
        case 6
        case 7
        case 8
            guniqhudid currentweapon

            addvar hud_x 146
            addvar hud_y 202

            setvar hud_tilenum SHOTGUN

            state G_DrawWeaponTile

            guniqhudid 0
            break
        case 3
        case 4
        case 5
        case 9
        case 10
        case 11
        case 12
            ifvarg weaponcount 1
                ifvarl weaponcount 5
                {
                    addvar hud_y 40
                    addvar hud_x 20

                    setvarvar hud_temp4 currentweapon
                    shiftvarl hud_temp4 1
                    guniqhudid hud_temp4

                    addvar hud_x 178
                    addvar hud_y 194

                    setvar hud_shade -128

                    setvarvar hud_tilenum weaponcount
                    subvar hud_tilenum 1
                    shiftvarr hud_tilenum 1
                    addvar hud_tilenum SHOTGUN
                    addvar hud_tilenum 1

                    state G_DrawWeaponTile

                    subvar hud_x 178
                    subvar hud_y 194
                    setvarvar hud_shade gs
                }

            guniqhudid currentweapon

            addvar hud_x 158

            addvar hud_y 220

            setvar hud_tilenum SHOTGUN
            addvar hud_tilenum 3

            state G_DrawWeaponTile

            guniqhudid 0
            break
        case 13
        case 14
        case 15
        case 28
        case 29
        case 30
            guniqhudid currentweapon

            addvar hud_x 198 // 32 + 166
            addvar hud_y 210

            setvar hud_tilenum SHOTGUN
            addvar hud_tilenum 4

            state G_DrawWeaponTile

            guniqhudid 0
            break
        case 16
        case 17
        case 18
        case 19
        case 24
        case 25
        case 26
        case 27
            guniqhudid currentweapon

            addvar hud_x 234 // 64 + 170
            addvar hud_y 196

            setvar hud_tilenum SHOTGUN
            addvar hud_tilenum 5

            state G_DrawWeaponTile
            break
        case 20
        case 21
        case 22
        case 23
            guniqhudid currentweapon

            addvar hud_x 240 // 64 + 176
            addvar hud_y 196

            setvar hud_tilenum SHOTGUN
            addvar hud_tilenum 6

            state G_DrawWeaponTile
            break
    endswitch
ends


state draw_chaingun // CHAINGUN_WEAPON:
    // hud_temp4 = FIREDELAY
    state reset_hud_weapon_coordinates

    ifvarg weaponcount 0
    {
        setvarvar hud_temp weaponcount
        shiftvarl hud_temp 7
        sin hud_temp hud_temp
        shiftvarr hud_temp 12
        addvarvar hud_y hud_temp

        state determine_animation
        ifvarn hud_temp 1
        {
            displayrand hud_temp
            andvar hud_temp 3
            mulvar hud_temp -1
            addvar hud_temp 1
            addvarvar hud_x hud_temp
        }
    }

    // base
    addvar hud_x 168
    addvar hud_y 260

    setvar hud_tilenum CHAINGUN

    state G_DrawWeaponTile

    subvar hud_x 168
    subvar hud_y 260

    switch weaponcount
        case 0
            addvar hud_x 178
            addvar hud_y 233
            addvar hud_tilenum 1 // relative

            state G_DrawWeaponTile
            break
        default
            state determine_animation

            ifvarvarg weaponcount hud_temp4
                ifvarvarl weaponcount hud_totaltime
                {
                    // muzzleflash 1
                    ifvarn hud_temp 1
                    {
                        displayrand hud_temp3
                        andvar hud_temp3 7
                    }
                    else
                        setvar hud_temp3 0

                    addvar hud_x 136 // -4+140
                    addvarvar hud_x hud_temp3

                    setvarvar hud_temp2 weaponcount
                    shiftvarr hud_temp2 1

                    addvarvar hud_y hud_temp3
                    subvarvar hud_y hud_temp2
                    addvar hud_y 208

                    setvarvar hud_tilenum weaponcount
                    subvar hud_tilenum 4
                    divvar hud_tilenum 5
                    addvar hud_tilenum CHAINGUN
                    addvar hud_tilenum 5

                    state G_DrawWeaponTile

                    // cleanup
                    subvarvar hud_x hud_temp3
                    subvarvar hud_y hud_temp3

                    // muzzleflash 3
                    ifvarn hud_temp 1
                    {
                        displayrand hud_temp3
                        andvar hud_temp3 7
                    }

                    addvar hud_x 44 // relative
                    addvarvar hud_x hud_temp3
                    addvarvar hud_y hud_temp3

                    state G_DrawWeaponTile

                    // cleanup
                    subvar hud_x 180 // -4+140 + 44
                    subvar hud_y 208
                    subvarvar hud_x hud_temp3
                    subvarvar hud_y hud_temp3
                    addvarvar hud_y hud_temp2
                }

            subvar hud_totaltime 4
            ifvarvarl weaponcount hud_totaltime
            {
                // muzzleflash 2
                ifvarn hud_temp 1
                {
                    displayrand hud_temp3
                    andvar hud_temp3 7
                }
                else
                    setvar hud_temp3 0

                setvarvar hud_temp2 weaponcount
                shiftvarr hud_temp2 1

                addvarvar hud_x hud_temp3
                addvar hud_x 158 // -4+162

                addvarvar hud_y hud_temp3
                subvarvar hud_y hud_temp2
                addvar hud_y 208

                setvarvar hud_tilenum weaponcount
                subvar hud_tilenum 2
                divvar hud_tilenum 5
                addvar hud_tilenum CHAINGUN
                addvar hud_tilenum 5

                state G_DrawWeaponTile

                // cleanup
                subvarvar hud_x hud_temp3
                subvar hud_x 158
                subvarvar hud_y hud_temp3
                addvarvar hud_y hud_temp2
                subvar hud_y 208

                // barrels (hot)
                addvar hud_x 178

                addvar hud_y 233

                setvar hud_tilenum CHAINGUN
                addvar hud_tilenum 1
                addvarvar hud_tilenum hud_temp2

                state G_DrawWeaponTile
            }
            else
            {
                // barrels
                addvar hud_x 178

                addvar hud_y 233

                setvar hud_tilenum CHAINGUN
                addvar hud_tilenum 1

                state G_DrawWeaponTile
            }
            break
    endswitch
ends

state draw_pistol // PISTOL_WEAPON:
    // hud_temp4 = FIREDELAY
    // hud_temp3 = RELOAD

    state reset_hud_weapon_y_coordinate

    setvar hud_tilenum FIRSTGUN

    addvar hud_totaltime 1
    ifvarvarl weaponcount hud_totaltime
    {
        setvar hud_x 183 // 195-12
        addvarvar hud_x weapon_xoffset
        subvarvar hud_x looking_angSR1

        addvar hud_y 244

        ifvarvare weaponcount hud_temp4
            subvar hud_x 3

        ifvarl weaponcount 3
            addvarvar hud_tilenum weaponcount

        setvar hud_orientation 2

        guniqhudid currentweapon

        state G_DrawWeaponTile

        guniqhudid 0
    }
    else
    {
        orvar hud_orientation 512

        subvarvar hud_temp3 weaponcount

        ifvarg hud_temp3 17
        {
            guniqhudid currentweapon

            setvar hud_x 194
            subvarvar hud_x looking_angSR1

            addvar hud_y 230

            addvar hud_tilenum 4

            state G_DrawWeaponTile

            guniqhudid 0
        }
        else ifvarg hud_temp3 12
        {
            addvar hud_tilenum 6

            setvarvar hud_temp weaponcount
            shiftvarl hud_temp 3

            setvar hud_x 244
            subvarvar hud_x hud_temp
            subvarvar hud_x looking_angSR1

            setvarvar hud_temp2 weaponcount
            shiftvarl hud_temp2 4

            addvar hud_y 130
            addvarvar hud_y hud_temp2

            state G_DrawWeaponTile

            subvar hud_y 130
            subvarvar hud_y hud_temp2
            subvar hud_tilenum 6

            guniqhudid currentweapon

            setvar hud_x 224
            subvarvar hud_x looking_angSR1

            addvar hud_y 220

            addvar hud_tilenum 5

            state G_DrawWeaponTile

            guniqhudid 0
        }
        else ifvarg hud_temp3 7
        {
            addvar hud_tilenum 6

            setvarvar hud_temp weaponcount
            shiftvarl hud_temp 1

            setvar hud_x 124
            addvarvar hud_x hud_temp
            subvarvar hud_x looking_angSR1

            setvarvar hud_temp2 weaponcount
            shiftvarl hud_temp2 3

            addvar hud_y 430
            subvarvar hud_y hud_temp2

            state G_DrawWeaponTile

            subvar hud_y 430
            addvarvar hud_y hud_temp2
            subvar hud_tilenum 6

            guniqhudid currentweapon

            setvar hud_x 224
            subvarvar hud_x looking_angSR1

            addvar hud_y 220

            addvar hud_tilenum 5

            state G_DrawWeaponTile

            guniqhudid 0
        }
        else ifvarg hud_temp3 4
        {
            setvar hud_x 184
            subvarvar hud_x looking_angSR1

            addvar hud_y 235

            addvar hud_tilenum 8

            state G_DrawWeaponTile

            subvar hud_y 235
            subvar hud_tilenum 8

            guniqhudid currentweapon

            setvar hud_x 224
            subvarvar hud_x looking_angSR1

            addvar hud_y 210

            addvar hud_tilenum 5

            state G_DrawWeaponTile

            guniqhudid 0
        }
        else ifvarg hud_temp3 2
        {
            setvar hud_x 164
            subvarvar hud_x looking_angSR1

            addvar hud_y 245

            addvar hud_tilenum 8

            state G_DrawWeaponTile

            subvar hud_y 245
            subvar hud_tilenum 8

            guniqhudid currentweapon

            setvar hud_x 224
            subvarvar hud_x looking_angSR1

            addvar hud_y 220

            addvar hud_tilenum 5

            state G_DrawWeaponTile

            guniqhudid 0
        }
        else ifvarg hud_temp3 0
        {
            guniqhudid currentweapon

            setvar hud_x 194
            subvarvar hud_x looking_angSR1

            addvar hud_y 235

            addvar hud_tilenum 5

            state G_DrawWeaponTile

            guniqhudid 0
        }
    }
ends

state draw_pipebomb // HANDBOMB_WEAPON:
    state reset_hud_weapon_coordinates

    guniqhudid currentweapon

    setvar hud_tilenum HANDTHROW

    ifvarn weaponcount 0
    {
        ifvarvarl weaponcount hud_totaltime
        {
            ifvarl weaponcount 7
            {
                setvarvar hud_temp weaponcount
                mulvar hud_temp 10
                addvarvar hud_y hud_temp // D
            }
            else ifvarl weaponcount 12
            {
                setvarvar hud_temp weaponcount
                subvar hud_temp 10
                mulvar hud_temp 20
                subvarvar hud_y hud_temp // U
            }
            else ifvarl weaponcount 20
            {
                setvarvar hud_temp weaponcount
                subvar hud_temp 14
                mulvar hud_temp 9
                addvarvar hud_y hud_temp // D
            }

            addvar hud_x 190

            addvar hud_y 250

            switch weaponcount
                /*
                case 0
                case 1
                case 2
                case 3
                case 4
                    addvar hud_tilenum 0
                    break
                */
                case 5
                case 6
                case 7
                case 8
                case 9
                case 10
                case 11
                    addvar hud_tilenum 1
                    break
                case 12
                case 13
                case 14
                case 15
                case 16
                case 17
                case 18
                case 19
                case 20
                    addvar hud_tilenum 2
                    break
            endswitch

            state G_DrawWeaponTile
        }
    }
    else
    {
        addvar hud_x 190

        addvar hud_y 260

        state G_DrawWeaponTile
    }

    guniqhudid 0
ends

state draw_detonator // HANDREMOTE_WEAPON:
    state reset_hud_weapon_coordinates

    guniqhudid currentweapon

    addvar hud_x 102 // -48+150

    addvar hud_y 258

    setvar hud_tilenum HANDREMOTE

    switch weaponcount
        /*
        case 0
        case 6
        case 7
        case 8
        case 9
        case 10
            addvar hud_tilenum 0
            break
        */
        case 1
        case 2
        case 4
        case 5
            addvar hud_tilenum 1
            break
        case 3
            addvar hud_tilenum 2
            break
    endswitch

    state G_DrawWeaponTile

    guniqhudid 0
ends

state draw_devastator // DEVISTATOR_WEAPON:
    state reset_hud_weapon_coordinates

    // for guniqhudid
    setvarvar hud_temp4 currentweapon
    shiftvarl hud_temp4 1

    setvar hud_tilenum DEVISTATOR

    setvar hud_temp -1 // flag

    ifvarg weaponcount 0
    {
        addvar hud_totaltime 1
        ifvarvarl weaponcount hud_totaltime
        {
            setvar hud_temp 0

            switch weaponcount
                default
                    addlogvar weaponcount // debug
                    break
                    /*
                case 0
                case 6
                    setvar hud_temp 0
                    break
                    */
                case 1
                case 5
                    setvar hud_temp 4
                    break
                case 2
                case 4
                    setvar hud_temp 12
                    break
                case 3
                    setvar hud_temp 24
                    break
            endswitch

            setvarvar hud_temp2 weaponcount
            shiftvarr hud_temp2 2
            // sign function:
            ifvare hud_temp2 0
                setvar hud_temp3 0
            else ifvarg hud_temp2 0
                setvar hud_temp3 1
            else ifvarl hud_temp2 0
                setvar hud_temp3 -1

            ifvarn player[THISACTOR].hbomb_hold_delay 0
            {
                guniqhudid currentweapon

                setvarvar hud_temp2 hud_temp
                shiftvarr hud_temp2 1
                addvarvar hud_x hud_temp2
                addvar hud_x 268

                addvarvar hud_y hud_temp
                addvar hud_y 238

                addvarvar hud_tilenum hud_temp3

                setvar hud_shade -32

                state G_DrawWeaponTile

                // cleanup
                /*
                subvar hud_x 268
                subvarvar hud_x hud_temp2
                subvar hud_y 238
                subvarvar hud_y hud_temp
                */
                state reset_hud_weapon_coordinates
                subvarvar hud_tilenum hud_temp3
                setvarvar hud_shade gs

                guniqhudid hud_temp4

                addvar hud_x 30

                addvar hud_y 240

                orvar hud_orientation 4

                state G_DrawWeaponTile

                ifvarand hud_orientation 4
                    xorvar hud_orientation 4

                guniqhudid 0
            }
            else
            {
                guniqhudid hud_temp4

                addvar hud_x 30
                setvarvar hud_temp2 hud_temp
                shiftvarr hud_temp2 1
                subvarvar hud_x hud_temp2

                addvar hud_y 240
                addvarvar hud_y hud_temp

                addvarvar hud_tilenum hud_temp3

                setvar hud_shade -32

                orvar hud_orientation 4

                state G_DrawWeaponTile

                // cleanup
                /*
                subvar hud_x 30
                addvarvar hud_x hud_temp2
                subvar hud_y 240
                subvarvar hud_y hud_temp
                */
                state reset_hud_weapon_coordinates
                subvarvar hud_tilenum hud_temp3
                setvarvar hud_shade gs
                ifvarand hud_orientation 4
                    xorvar hud_orientation 4

                guniqhudid currentweapon

                addvar hud_x 268

                addvar hud_y 238

                state G_DrawWeaponTile

                guniqhudid 0
            }
        break
        }
    }

    ifvare hud_temp -1
    {
        guniqhudid currentweapon

        addvar hud_x 268

        addvar hud_y 238

        state G_DrawWeaponTile

        subvar hud_x 268
        subvar hud_y 238

        guniqhudid hud_temp4

        addvar hud_x 30

        addvar hud_y 240

        orvar hud_orientation 4

        state G_DrawWeaponTile

        ifvarand hud_orientation 4
            xorvar hud_orientation 4

        guniqhudid 0
    }
ends

state draw_freezer // FREEZE_WEAPON:
    state reset_hud_weapon_coordinates

    setvar hud_tilenum FREEZE

    orvar hud_orientation 512

    setvar hud_temp3 0

    ifvarg weaponcount 0
    {
        addvar hud_totaltime 1
        ifvarvarl weaponcount hud_totaltime
        {
            state determine_animation
            ifvarn hud_temp 1
            {
                displayrand hud_temp
                andvar hud_temp 3

                addvarvar hud_x hud_temp

                displayrand hud_temp
                andvar hud_temp 3

                addvarvar hud_y hud_temp
            }

            guniqhudid 0

            addvar hud_x 210

            addvar hud_y 277 // 16 + 261

            addvar hud_tilenum 2

            setvar hud_shade -32

            state G_DrawWeaponTile

            guniqhudid currentweapon

            subvar hud_y 26 // relative

            setvarvar hud_temp weaponcount
            modvar hud_temp 6
            divvar hud_temp 2
            addvar hud_tilenum 1
            addvarvar hud_tilenum hud_temp

            state G_DrawWeaponTile

            guniqhudid 0

            setvar hud_temp3 1
        }
    }
    ifvare hud_temp3 0
    {
        guniqhudid currentweapon

        addvar hud_x 210

        addvar hud_y 261

        state G_DrawWeaponTile

        guniqhudid 0
    }

    ifvarand hud_orientation 512
        xorvar hud_orientation 512
ends

state draw_expander // GROW_WEAPON:
    state reset_hud_weapon_coordinates

    addvar hud_x 28
    addvar hud_y 18

    setvarvar hud_temp4 hud_pal
    setvar hud_pal 2

    setvarvar hud_temp3 currentweapon
    shiftvarl hud_temp3 1

    setvar hud_temp2 0

    ifvarg weaponcount 0
    {
        ifvarvarl weaponcount hud_totaltime
        {
            state determine_animation
            ifvarn hud_temp 1
            {
                displayrand hud_temp
                andvar hud_temp 3

                addvarvar hud_x hud_temp

                displayrand hud_temp
                andvar hud_temp 3

                subvarvar hud_y hud_temp
            }

            addvar hud_x 184

            addvar hud_y 240

            setvarvar hud_tilenum weaponcount
            andvar hud_tilenum 3
            addvar hud_tilenum SHRINKER
            addvar hud_tilenum 3

            setvar hud_shade -32

            guniqhudid hud_temp3

            state G_DrawWeaponTile_crystal

            guniqhudid currentweapon

            addvar hud_x 4

            setvar hud_tilenum SHRINKER
            subvar hud_tilenum 1

            setvarvar hud_shade gs

            setvarvar hud_pal hud_temp4

            state G_DrawWeaponTile

            guniqhudid 0

            setvar hud_temp2 1
        }
    }
    ifvare hud_temp2 0
    {
        addvar hud_x 184

        addvar hud_y 240

        setvar hud_tilenum SHRINKER
        addvar hud_tilenum 2

        getplayer[THISACTOR].random_club_frame hud_shade
        andvar hud_shade 2047
        sin hud_shade hud_shade
        shiftvarr hud_shade 10
        mulvar hud_shade -1
        addvar hud_shade 16

        guniqhudid hud_temp3

        state G_DrawWeaponTile_crystal

        guniqhudid currentweapon

        addvar hud_x 4

        setvar hud_tilenum SHRINKER
        subvar hud_tilenum 2

        setvarvar hud_shade gs

        setvarvar hud_pal hud_temp4

        state G_DrawWeaponTile

        guniqhudid 0
    }
ends

state draw_shrinker // SHRINKER_WEAPON:
    state reset_hud_weapon_coordinates

    addvar hud_x 28
    addvar hud_y 18

    setvarvar hud_temp4 hud_pal
    setvar hud_pal 0

    setvarvar hud_temp3 currentweapon
    shiftvarl hud_temp3 1

    setvar hud_temp2 0

    ifvarg weaponcount 0
    {
        ifvarvarl weaponcount hud_totaltime
        {
            state determine_animation
            ifvarn hud_temp 1
            {
                displayrand hud_temp
                andvar hud_temp 3

                addvarvar hud_x hud_temp

                displayrand hud_temp
                andvar hud_temp 3

                subvarvar hud_y hud_temp
            }

            addvar hud_x 184

            addvar hud_y 240

            setvarvar hud_tilenum weaponcount
            andvar hud_tilenum 3
            addvar hud_tilenum SHRINKER
            addvar hud_tilenum 3

            setvar hud_shade -32

            guniqhudid hud_temp3

            state G_DrawWeaponTile_crystal

            guniqhudid currentweapon

            addvar hud_x 4

            setvar hud_tilenum SHRINKER
            addvar hud_tilenum 1

            setvarvar hud_shade gs

            setvarvar hud_pal hud_temp4

            state G_DrawWeaponTile

            guniqhudid 0

            setvar hud_temp2 1
        }
    }
    ifvare hud_temp2 0
    {
        addvar hud_x 184

        addvar hud_y 240

        setvar hud_tilenum SHRINKER
        addvar hud_tilenum 2

        getplayer[THISACTOR].random_club_frame hud_shade
        andvar hud_shade 2047
        sin hud_shade hud_shade
        shiftvarr hud_shade 10
        mulvar hud_shade -1
        addvar hud_shade 16

        guniqhudid hud_temp3

        state G_DrawWeaponTile_crystal

        guniqhudid currentweapon

        addvar hud_x 4

        setvar hud_tilenum SHRINKER

        setvarvar hud_shade gs

        setvarvar hud_pal hud_temp4

        state G_DrawWeaponTile

        guniqhudid 0
    }
ends

// framework

onevent EVENT_DISPLAYWEAPON // P_DisplayWeapon

    setvar RETURN -1

    getplayer[THISACTOR].weapon_pos weapon_pos
    getuserdef[THISACTOR].weaponscale weaponscale
    getplayer[THISACTOR].i playerid

    getuserdef[THISACTOR].drawweapon hud_temp

    ifvare hud_temp 2 // weapon icons
    {
        setvar hud_tilenum -1

        switch currentweapon
            case PISTOL_WEAPON
                setvar hud_tilenum FIRSTGUNSPRITE
                break
            case CHAINGUN_WEAPON
                setvar hud_tilenum CHAINGUNSPRITE
                break
            case RPG_WEAPON
                setvar hud_tilenum RPGSPRITE
                break
            case FREEZE_WEAPON
                setvar hud_tilenum FREEZESPRITE
                break
            case SHRINKER_WEAPON
                setvar hud_tilenum SHRINKERSPRITE
                break
            case GROW_WEAPON
                setvar hud_tilenum GROWSPRITEICON
                break
            case DEVISTATOR_WEAPON
                setvar hud_tilenum DEVISTATORSPRITE
                break
            case TRIPBOMB_WEAPON
                setvar hud_tilenum TRIPBOMBSPRITE
                break
            case HANDREMOTE_WEAPON
            case HANDBOMB_WEAPON
                setvar hud_tilenum HEAVYHBOMB
                break
            case SHOTGUN_WEAPON
                setvar hud_tilenum SHOTGUNSPRITE
                break
            default
                addlogvar currentweapon
                break
                /*
            case KNEE_WEAPON
                setvar hud_tilenum -1
                break
                */
        endswitch

        ifvarn hud_tilenum -1
            {
            setvar hud_x 160
            setvarvar hud_y weapon_pos
            mulvarvar hud_y weapon_pos
            addvar hud_y 180
            setvar hud_scale 65536
            getuserdef[THISACTOR].statusbarscale hud_temp2
            mulvarvar hud_scale hud_temp2
            divvar hud_scale 100
            rotatesprite hud_x hud_y hud_scale 0 hud_tilenum 0 0 2 windowx1 windowy1 windowx2 windowy2
            }
    }

    ifvarn hud_temp 1 break // If we are not displaying the actual HUD weapons, stop processing.

    // these gamevars can get changed in the states up above, so reset them now.
    setvar hud_scale 65536
    setvar hud_orientation 0
    setvar hud_angle 0
    setvarvar hud_shade gs

    state draw_quick_kick

    // cleanup
    setvar hud_orientation 0
    setvar hud_angle 0
    guniqhudid 0

    getactor[playerid].xrepeat hud_temp
    ifvarl hud_temp 40
        state draw_shrunk_fists
    else
    {
        getactor[playerid].pal hud_pal
        ifvarn hud_pal 1
        {
            getplayer[THISACTOR].cursectnum hud_temp2
            ifvarg hud_temp2 -1
                getsector[hud_temp2].floorpal hud_pal
            else
                setvar hud_pal 0
        }

        switch currentweapon
            case KNEE_WEAPON
                setvarvar hud_totaltime WEAPON0_TOTALTIME
                state draw_kick
                break
            case TRIPBOMB_WEAPON
                setvarvar hud_totaltime WEAPON8_TOTALTIME
                state draw_tripbomb
                break
            case RPG_WEAPON
                setvarvar hud_totaltime WEAPON4_TOTALTIME
                state draw_rpg
                break
            case SHOTGUN_WEAPON
                setvarvar hud_totaltime WEAPON2_TOTALTIME
                state draw_shotgun
                break
            case CHAINGUN_WEAPON
                setvarvar hud_temp4 WEAPON3_FIREDELAY
                setvarvar hud_totaltime WEAPON3_TOTALTIME
                state draw_chaingun
                break
            case PISTOL_WEAPON
                setvarvar hud_temp3 WEAPON1_RELOAD
                setvarvar hud_temp4 WEAPON1_FIREDELAY
                setvarvar hud_totaltime WEAPON1_TOTALTIME
                state draw_pistol
                break
            case HANDBOMB_WEAPON
                setvarvar hud_totaltime WEAPON5_TOTALTIME
                state draw_pipebomb
                break
            case HANDREMOTE_WEAPON
                setvarvar hud_totaltime WEAPON10_TOTALTIME
                state draw_detonator
                break
            case DEVISTATOR_WEAPON
                setvarvar hud_totaltime WEAPON7_TOTALTIME
                state draw_devastator
                break
            case FREEZE_WEAPON
                setvarvar hud_totaltime WEAPON9_TOTALTIME
                state draw_freezer
                break
            case GROW_WEAPON
                setvarvar hud_totaltime WEAPON11_TOTALTIME
                state draw_expander
                break
            case SHRINKER_WEAPON
                setvarvar hud_totaltime WEAPON6_TOTALTIME
                state draw_shrinker
                break
            default
                addlogvar currentweapon
                break
        endswitch

        // cleanup
        setvar hud_orientation 0
        setvar hud_angle 0
        guniqhudid 0
    }
endevent