/*
    To begin, type in the console:

    include startpos

    If none of keystrokes work, try:

    enableevent all

    Keystrokes:
    Ctrl-(LShift-)W - Jump to the next (previous) DM spawn point.
    Ctrl-(LShift-)E - Jump to the next (previous) coop spawn point.
    Ctrl-1 - Jump to the primary spawn point, keeping the DM/coop "current" indices intact.
    Ctrl-LShift-1 - Jump to the primary spawn point, resetting the DM/coop "current" indices to zero.
    Ctrl-Q - Refresh the collected spawn point data. For example, if you move one of the APLAYER sprites.
    Ctrl-D - Dump the current map's spawn point information to mapster32.log.

    Tip: With pk_quickmapcycling enabled, Ctrl-(LShift-)X loads the next (previous) map in a directory.
*/

include names.h

definequote 0

gamearray DM_x 1
gamearray DM_y 1
gamearray DM_z 1
gamearray DM_ang 1
gamearray DM_sectnum 1

gamearray coop_x 1
gamearray coop_y 1
gamearray coop_z 1
gamearray coop_ang 1
gamearray coop_sectnum 1

gamevar DM 0 0
gamevar coop 0 0

gamevar DM_size 0 0
gamevar coop_size 0 0

gamevar i 0 0
gamevar j 0 0
gamevar k 0 0

gamevar startpos_fresh 0 0

defstate startpos_indexcheck
    ifg DM DM_size
        set DM 0
    ifg coop coop_size
        set coop 0

    ifl DM 0
        set DM DM_size
    ifl coop 0
        set coop DM_size
ends


defstate startpos_gatherdata
    setvar DM_size 0
    setvar coop_size 0

    for i allsprites, ife .picnum APLAYER
    {
        ife .lotag 0
            addvar DM_size 1
        else ife .lotag 1
            addvar coop_size 1

        ifvarand .cstat 1
            xorvar .cstat 1 // necessary to prevent floor HOM if the sprite happens to be blocking
    }

    ifg DM_size 0
    {
        resizearray DM_x DM_size
        resizearray DM_y DM_size
        resizearray DM_z DM_size
        resizearray DM_ang DM_size
        resizearray DM_sectnum DM_size
    }

    ifg coop_size 0
    {
        resizearray coop_x coop_size
        resizearray coop_y coop_size
        resizearray coop_z coop_size
        resizearray coop_ang coop_size
        resizearray coop_sectnum coop_size
    }

    set j 0
    set k 0

    for i allsprites, ife .picnum APLAYER
    {
        ife .lotag 0
        {
            set DM_x[j] .x
            set DM_y[j] .y
            set DM_z[j] .z
            set DM_ang[j] .ang
            set DM_sectnum[j] .sectnum

            addvar j 1
        }
        else ife .lotag 1
        {
            set coop_x[k] .x
            set coop_y[k] .y
            set coop_z[k] .z
            set coop_ang[k] .ang
            set coop_sectnum[k] .sectnum

            addvar k 1
        }
    }

    set startpos_fresh 1

    state startpos_indexcheck
ends

onevent EVENT_LOADMAP
    state startpos_gatherdata
endevent


defstate startpos_primary
    set posx startposx
    set posy startposy
    set posz startposz
    set ang startang
ends


defstate startpos_prekeys
    ifeitherctrl
    {
        ifhitkey KEY_Q
        {
            state startpos_gatherdata

            quote "Spawn position data re-gathered."
        }

        ifhitkey KEY_1
        {
            state startpos_primary
            updatecursectnum

            ifholdkey KEY_LSHIFT
            {
                set DM 0
                set coop 0
            }

            quote "Jumping to primary spawn position."
        }

        ifhitkey KEY_W
        {
            ife startpos_fresh 0
                state startpos_gatherdata

            ifholdkey KEY_LSHIFT
                subvar DM 1
            else
                addvar DM 1

            state startpos_indexcheck

            ife DM 0
                state startpos_primary
            else
            {
                set j DM
                subvar j 1

                set posx DM_x[j]
                set posy DM_y[j]
                set posz DM_z[j]
                set ang DM_ang[j]
            }
            updatecursectnum

            set j DM
            addvar j 1
            set k DM_size
            addvar k 1
            qsprintf 0 "Jumping to DM spawn position %d of %d." j k
            quote 0
        }

        ifhitkey KEY_E
        {
            ife startpos_fresh 0
                state startpos_gatherdata

            ifholdkey KEY_LSHIFT
                subvar coop 1
            else
                addvar coop 1

            state startpos_indexcheck

            ife coop 0
                state startpos_primary
            else
            {
                set j coop
                subvar j 1

                set posx coop_x[j]
                set posy coop_y[j]
                set posz coop_z[j]
                set ang coop_ang[j]
            }
            updatecursectnum

            set j coop
            addvar j 1
            set k coop_size
            addvar k 1
            qsprintf 0 "Jumping to coop spawn position %d of %d." j k
            quote 0
        }

        ifhitkey KEY_D
        {
            ife startpos_fresh 0
                state startpos_gatherdata

            ife startpos_fresh 1
            {
                quote "Dumping spawn point information..."
                print "Format: Type,x,y,z,ang,sectnum"

                qsprintf 0 "Primary,%d,%d,%d,%d,%d" startposx startposy startposz startang startsectnum
                print 0

                for i range DM_size
                {
                    qsprintf 0 "DM,%d,%d,%d,%d,%d" DM_x[i] DM_y[i] DM_z[i] DM_ang[i] DM_sectnum[i]
                    print 0
                }

                for i range coop_size
                {
                    qsprintf 0 "Coop,%d,%d,%d,%d,%d" coop_x[i] coop_y[i] coop_z[i] coop_ang[i] coop_sectnum[i]
                    print 0
                }

                set j DM_size
                addvar j 1
                set k coop_size
                addvar k 1
                qsprintf 0 "Total: %d DM position(s), %d coop position(s)" j k
                print 0

                set startpos_fresh 2

                quote "Spawn position data dump complete."
            }
        }
    }
ends

onevent EVENT_PREKEYS2D
    state startpos_prekeys
endevent

onevent EVENT_PREKEYS3D
    state startpos_prekeys
endevent