Jump to content

SexoutNG - Beta (2.10.93b10) release thread


Recommended Posts

Posted

That's fine but if you need to go back from the beta you'll have to reactivate sexout core. If you zip up the download you can add the zip as a fomod with fomm.

Posted

It seems to work fine for me with M/F sexual acts using SexoutSex, SexoutSexKey and SexoutRapeGame. In fact, the acts initiated by a key seem to work more reliably than before.

Posted

1) Testing a stressful scene with '85b4, everything seemed to work fine, but I noticed subsequently an NVSE error in the console:

 

 

SexoutNGBES: SES: Setting global hook vars.
SexoutNGBES: SES: Global hook triggered, SES moving to BES stage 0.
Error in script 0e08d18f
Attempting to call a function on a NULL reference or base object
    File: Sexout.esm Offset: 0x0054 Command: Let
Error in script 0e08d18f

An expression failed to evaluate to a valid result
    File: Sexout.esm Offset: 0x0054 Command: Let

 

 

(Full scof attached) I did not have debug enabled, but I then enabled it and repeated the sequence and the error did not repeat. XX08d18f is 'fnSexoutGetFlag', which includes error checking which implies to me at least that it shouldn't be possible to get those errors, oddly. Again, as far as I noticed everything worked properly in spite of those errors, so I mean this as information rather than a bug report.

 

 

2) I have been getting intermittent CTDs, with a possible link to when I include 'call fnSexoutActSetInt "bDoKOCons", 0' in my sequence of repeat sexout calls. Scof logs attached. Let me know if there's a way I can get you something more scientific to go on. I'm not requesting that this be a priority concern.

 

As an aside: I wondered if it was related to calling too many sexout variable setting functions in the same frame, so I wrote a gratuitous test script, however, this works perfectly:

 

 

; This test script repeats every second if player is not busy. It works perfectly, so busy calls don't seem to be an issue.

    call fnSexoutActPrep
    call fnSexoutActSetRef "ActorA", rActorA
    call fnSexoutActSetRef "ActorB", PlayerREF
    call fnSexoutActSetRef "ActorC", rActorC
    call fnSexoutActSetRef "ActorX", SunnyREF
    call fnSexoutActSetInt "duration", 10
    call fnSexoutActSetInt "isOral", 1
    call fnSexoutActSetInt "isAnal", 1
    call fnSexoutActSetInt "isVaginal", 1
    call fnSexoutActSetRef "raper", rActorA
    call fnSexoutActSetInt "bDoKORapee", 1
    call fnSexoutActSetInt "bDoKORapist", 1
    call fnSexoutActSetInt "anim", 5305
    call fnSexoutActSetInt "bDontUndressA", 1
    call fnSexoutActSetInt "bDontUndressB", 1
    call fnSexoutActSetInt "bDontUndressC", 1
    call fnSexoutActSetInt "bDontRedressA", 1
    call fnSexoutActSetInt "bDontRedressB", 1
    call fnSexoutActSetInt "bDontRedressC", 1
    call fnSexoutActSetRef "CBDialogA", GREETING
    call fnSexoutActSetRef "CBItemA", Jet
    call fnSexoutActSetRef "CBItemB", Jet
    call fnSexoutActSetRef "CBItemC", Jet
    call fnSexoutActSetRef "CBItemX", Jet

    call fnSexoutActRun

 

 

 

Posted

Thanks, will take a look later today.

 

I did some testing with Legion and found there are some issues with startconversation/cbdialog as well.

Posted

I (obviously) haven't seen your code, but you're not calling the SetInt's from a different script, right?

 

fnSexoutAct* (except actor) for prep, set, and run must all occur from a single script. If the engine treats different blocks as different scripts WRT what GetCallingScript returns, then they must be in the same block as well.

 

You've probably already looked, but Prep/Set/Run,Reset use an array of stringmaps in the SexoutNG main quest script. GetCallingScript is the key into the top level array. If prep isn't called first, then the stringmap will not be created, and subsequent set/run will error out. If Prep is called from a different script according to GCS, same end result -- Set* tries to set a value in a nonexistent stringmap.

 

I'll add some debugprints to prep/set/run to indicate what GCS is returning. If the values aren't the same in a single act, that's the problem.

Posted

No, all calls for any particular act are contained within the same script and iteration of it, and I never start multiple acts in the same iteration.

Posted

Not even any other UDFs involved? Like doing a prep in the main script and the set's in a UDF you call from there? That's definitely strange..

Posted

I have 1 UDF which checks fnSexoutActorInUse for each of an array of actors, but no act setup, thats all within the same script.

 

Take a glance if you like, its long but only 1 stage gets processed each time with a 1-second quest delay.

 

 

 

scn SexoutSolDuntonBrotherSexScript

; * Using global constants, True: 1, False: 0, None: 0, NotFound: -1

int Init
ref rZActor
ref rChuck
ref rBuck
int iStage
int iAngle

int MyWay

int iTimeOut

Begin GameMode

Printc "Sol: DBS Script Starting (Stage = %g)" iStage

    if Init != True
        let rZActor := PlayerREF
        rZActor.NX_SetEVFl "SO:NotNow", True
        let rChuck := SexoutSolDuntonChuckREF
        let rBuck := SexoutSolDuntonBuckREF
        rBuck.Look rZActor
        rChuck.Look rZActor
        let iStage := 0
        let iTimeOut := 0
        imod FadeToBlack2sISFX
        let Init := True
        ;rChuck.Enable ; added for testing
        ;rBuck.Enable
        return
    endif

    if iTimeOut > 3
        DebugPrint "Sol: DBS Timeout = %g" iTimeOut   
    endif


    if iStage == 0
        DebugPrint "Dbros stage 0"
        rZActor.MoveTo SexoutSolDBSMarkPlayer
        rBuck.MoveTo SexoutSolDBSMarkOral
        rChuck.MoveTo SexoutSolDBSMarkCumOn
        rBuck.RemoveItem OutfitWasteland01, 1
        rBuck.AddItem SexoutNude, 1
        rBuck.EquipItem SexoutNude
        rChuck.RemoveItem OutfitWasteland01, 1
        rChuck.AddItem SexoutNude, 1
        rChuck.EquipItem SexoutNude
        ;rZActor.SetRestrained 1
        ;rBuck.SetRestrained 1
        ;rChuck.SetRestrained 1
        let iStage := 100

    ; * You fellate Buck
    elseif iStage == 100
        ShowMessage SexoutSolDunton1FellateBuck
        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rBuck
        call fnSexoutActSetRef "ActorB", rZActor
        call fnSexoutActSetInt "bDontRedressB", True
        call fnSexoutActSetInt "bDoKOCons", False
        call fnSexoutActSetInt "duration", 99
        call fnSexoutActSetInt "isOral", True
        call fnSexoutActSetInt "Anim", 401
        call fnSexoutActRun
        let iStage := 197
        DebugPrint "Sol: DBS %g - fellate" iStage

    ; * Chuck faps while hes waiting
    elseif iStage == 200
        let iAngle := rChuck.GetAngle Z + rChuck.GetHeadingAngle rZActor
        rChuck.SetAngle Z, iAngle
        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rChuck
        call fnSexoutActSetInt "duration", 99
        call fnSexoutActSetInt "bDoKOCons", False
        call fnSexoutActRun
        let iStage := 201
        DebugPrint "Sol: DBS %g - fap" iStage
    
    ; ****
    ;elseif iStage == 216
    ;    imod SexoutSolDuntonISFX
    ;    let iStage += 1
    ;    DebugPrint "Sol: DBS %g - fade" iStage
    elseif iStage == 217
        imod SexoutSolDuntonISFX
        rChuck.CIOS SexoutNGFinishNow
        let iStage += 1
        DebugPrint "Sol: DBS %g - stop" iStage
    elseif iStage == 218
        rBuck.CIOS SexoutNGFinishNow
        let iStage := 300
        DebugPrint "Sol: DBS %g - stop" iStage

    ; * Chuck performs cunnilingus, Buck faps
    elseif iStage == 300
        if eval (call tsolActorsInUse (Ar_List rZActor, rChuck))
            let iTimeOut += 1
            return
        endif
        ShowMessage SexoutSolDunton2ChuckCunni
        let iTimeOut := 0
        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rZActor
        call fnSexoutActSetRef "ActorB", rChuck
        call fnSexoutActSetInt "Duration", 99
        call fnSexoutActSetInt "IsOral", True
        call fnSexoutActSetInt "bDoKOCons", False
        call fnSexoutActSetInt "Anim", 235
        call fnSexoutActRun
        
        let iStage := 301
        DebugPrint "Sol: DBS %g - cunny + fap" iStage
    elseif iStage == 301
        if eval (call tsolActorsInUse (Ar_List rBuck))
            let iTimeOut += 1
            return
        endif
        let iTimeOut := 0
        let iAngle := rBuck.GetAngle Z + rBuck.GetHeadingAngle rZActor
        rBuck.SetAngle Z, iAngle
        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rBuck
        call fnSexoutActSetInt "bDoKOCons", False
        call fnSexoutActSetInt "duration", 99
        call fnSexoutActRun
    
        let iStage += 1
        DebugPrint "Sol: DBS %g - cunny + fap" iStage

    ; ****
    elseif iStage == 306
        ShowMessage SexoutSolDunton3AssPoke
        let SexoutSolGetButtonQuest.Init := False
        StartQuest SexoutSolGetButtonQuest
        let iStage += 1
        DebugPrint "Sol: DBS %g - poke ass" iStage
    elseif iStage == 312
        ;imod SexoutSolDuntonISFX
        let iStage += 1
        DebugPrint "Sol: DBS %g - fade" iStage
    elseif iStage == 313
        imod SexoutSolDuntonISFX
        rChuck.CIOS SexoutNGFinishNow
        let iStage := 400
        DebugPrint "Sol: DBS %g - stop" iStage

    ; * Chuck sodomizes you or you cowgirl (buck carries on)
    elseif iStage == 400
        if eval (call tsolActorsInUse (Ar_List rZActor, rChuck))
            let iTimeOut += 1
            return
        endif
        let iTimeOut := 0
        let MyWay := SexoutSolGetButtonQuest.PressedButton
        StopQuest SexoutSolGetButtonQuest

        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rChuck
        call fnSexoutActSetRef "ActorB", rZActor
        call fnSexoutActSetInt "duration", 99
        call fnSexoutActSetInt "bDoKOCons", False
        if MyWay == True
            ShowMessage SexoutSolDunton4CowGirl
            call fnSexoutActSetInt "isVaginal", True
            call fnSexoutActSetInt "Anim", 901
        else
            ShowMessage SexoutSolDunton4Anal
            call fnSexoutActSetInt "isAnal", True
            call fnSexoutActSetInt "Anim", 603
        endif
        call fnSexoutActRun

        let iStage := 401
        DebugPrint "Sol: DBS %g (MyWay: %g) - sodomy/cowgirl" iStage MyWay

    ; ****
    elseif iStage == 420
        ;imod SexoutSolDuntonISFX
        rBuck.CIOS SexoutNGFinishNow
        let iStage += 1
        DebugPrint "Sol: DBS %g" iStage
    elseif iStage == 421
        imod SexoutSolDuntonISFX
        rChuck.CIOS SexoutNGFinishNow
        let iStage := 500
        DebugPrint "Sol: DBS %g - stop" iStage

    ; * Buck takes your cunny
    elseif iStage == 500
        if eval (call tsolActorsInUse (Ar_List rZActor, rBuck))
            let iTimeOut += 1
            return
        endif
        let iTimeOut := 0
        ShowMessage SexoutSolDunton4Vaginal
        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rBuck
        call fnSexoutActSetRef "ActorB", rZActor
        call fnSexoutActSetInt "duration", 99
        call fnSexoutActSetInt "isVaginal", True
        call fnSexoutActSetInt "bDoKOCons", False
        call fnSexoutActSetInt "Anim", 634
        call fnSexoutActRun

        let iStage := 501
        DebugPrint "Sol: DBS %g - doggy... " iStage
    elseif iStage == 501
        if eval (call tsolActorsInUse (Ar_List rChuck))
            let iTimeOut += 1
            return
        endif
        let iTimeOut := 0
        let iAngle := rChuck.GetAngle Z + rChuck.GetHeadingAngle rZActor
        rChuck.SetAngle Z, iAngle
        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rChuck
        call fnSexoutActSetInt "bDoKOCons", False
        call fnSexoutActSetInt "duration", 99
        call fnSexoutActRun

        let iStage := 502
        DebugPrint "Sol: DBS %g - ... + fap" iStage

    ; ****
    elseif iStage == 520
        imod SexoutSolDuntonISFX
        rChuck.CIOS SexoutNGFinishNow
        let iStage += 1
        DebugPrint "Sol: DBS %g - fade" iStage
    elseif iStage == 521
        rBuck.CIOS SexoutNGFinishNow
        let iStage := 600
        DebugPrint "Sol: DBS %g - stop" iStage

    ; * 3-some
    elseif iStage == 600
        if eval (call tsolActorsInUse (Ar_List rZActor, rChuck, rBuck))
            let iTimeOut += 1
            return
        endif
        let iTimeOut := 0
        ShowMessage SexoutSolDunton6DP1
        ShowMessage SexoutSolDunton6DP2
        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rChuck ; Vaginal
        call fnSexoutActSetRef "ActorB", rZActor ; Lucky You
        call fnSexoutActSetRef "ActorC", rBuck ; Anal
        call fnSexoutActSetInt "duration", 99
        call fnSexoutActSetInt "isVaginal", True
        call fnSexoutActSetInt "isAnal", True
        call fnSexoutActSetInt "bDoKOCons", False
        call fnSexoutActSetInt "Anim", 5301
        call fnSexoutActRun
        
        let iStage := 601
        DebugPrint "Sol: DBS %g - 3 some" iStage

    ; ****
    elseif iStage == 620
        ;imod SexoutSolDuntonISFX
        let iStage += 1
        DebugPrint "Sol: DBS %g - fade" iStage
    elseif iStage == 621
        imod SexoutSolDuntonISFX
        rChuck.CIOS SexoutNGFinishNow
        let iStage += 1
    elseif iStage == 623
        rZActor.MoveTo SexoutSolDBSMarkPlayer
        rBuck.MoveTo SexoutSolDBSMarkCumOn
        rChuck.MoveTo SexoutSolDBSMarkOral
        let iStage := 699
        DebugPrint "Sol: DBS %g - moveto" iStage

    ; * You fellate Chuck while buck faps
    elseif iStage == 700
        if eval (call tsolActorsInUse (Ar_List rZActor, rChuck))
            let iTimeOut += 1
            return
        endif
        let iTimeOut := 0
        let iAngle := rBuck.GetAngle Z + rBuck.GetHeadingAngle rZActor
        ShowMessage SexoutSolDunton7fellate
        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rChuck
        call fnSexoutActSetRef "ActorB", rZActor
        call fnSexoutActSetInt "duration", 99
        call fnSexoutActSetInt "isOral", True
        call fnSexoutActSetInt "bDoKOCons", False
        call fnSexoutActSetInt "Anim", 401
        call fnSexoutActRun

        let iStage := 701
        DebugPrint "Sol: DBS %g finale p1a" iStage
    elseif iStage == 701
        if eval (call tsolActorsInUse (Ar_List rBuck))
            let iTimeOut += 1
            return
        endif
        let iTimeOut := 0
        let iAngle := rBuck.GetAngle Z + rBuck.GetHeadingAngle rZActor
        rBuck.SetAngle Z, iAngle
        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rBuck
        call fnSexoutActSetInt "duration", 99
        call fnSexoutActSetInt "bDoKOCons", False
        call fnSexoutActRun

        let iStage := 702
        DebugPrint "Sol: DBS %g finale p1b" iStage
    
    ; ****
    elseif iStage == 708
        ;imod SexoutSolDuntonISFX
        let iStage += 1
        DebugPrint "Sol: DBS %g - fade" iStage
    elseif iStage == 709
        rBuck.CIOS SexoutNGFinishNow
        let iStage += 1
    elseif iStage == 710
        imod SexoutSolDuntonISFX
        rChuck.CIOS SexoutNGFinishNow
        let iStage += 1
    elseif iStage == 712
        rZActor.MoveTo SexoutSolDBSMarkPlayer
        rBuck.MoveTo SexoutSolDBSMarkOral
        rChuck.MoveTo SexoutSolDBSMarkCumOn
        let iStage := 799

    ; * You fellate Buck while Chuck cums onto you
    elseif iStage == 800
        if eval (call tsolActorsInUse (Ar_List rZActor, rBuck))
            let iTimeOut += 1
            return
        endif
        let iTimeOut := 0
        let iAngle := rChuck.GetAngle Z + rChuck.GetHeadingAngle rZActor
        ShowMessage SexoutSolDunton7ATM
        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rBuck
        call fnSexoutActSetRef "ActorB", rZActor
        call fnSexoutActSetInt "duration", 99
        call fnSexoutActSetInt "isOral", True
        call fnSexoutActSetInt "Anim", 401
        call fnSexoutActRun
        
        let iStage := 801
        DebugPrint "Sol: DBS %g finale p2a" iStage
    elseif iStage == 801
        if eval (call tsolActorsInUse (Ar_List rChuck))
            let iTimeOut += 1
            return
        endif
        let iTimeOut := 0
        let iAngle := rChuck.GetAngle Z + rChuck.GetHeadingAngle rZActor
        rChuck.SetAngle Z iAngle
        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rChuck
        call fnSexoutActSetInt "duration", 99
        call fnSexoutActRun

        let iStage += 1
        DebugPrint "Sol: DBS %g finale p2b" iStage

    ; *****
    elseif iStage == 810
        ShowMessage SexoutSolDunton8Cum
        rBuck.CIOS SexoutNGFinishNow
        let iStage += 1
        DebugPrint "Sol: DBS %g Duntons come" iStage
    elseif iStage == 811
        ShowMessage SexoutSolDunton9Facial
        rChuck.CIOS SexoutNGFinishNow
        let iStage := 900
        DebugPrint "Sol: DBS %g Duntons come" iStage
    
    ; * Youre tingling again, so you fiddle
    elseif iStage == 900
        if eval (call tsolActorsInUse (Ar_List rZActor))
            let iTimeOut += 1
            return
        endif
        let iTimeOut := 0
        ShowMessage SexoutSolDunton10Finger
        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rZActor
        call fnSexoutActSetInt "duration", 99
        call fnSexoutActSetInt "bDoKOCons", False
        call fnSexoutActRun
        let iStage += 1
        DebugPrint "Sol: DBS %g - you fiddle" iStage
    
    ; *****
    elseif iStage == 907
        ;imod SexoutSolDuntonISFX
        let iStage += 1
        DebugPrint "Sol: DBS %g - fade" iStage
    elseif iStage == 908
        imod SexoutSolDuntonISFX
        rZActor.CIOS SexoutNGFinishNow
        let iStage += 1
        DebugPrint "Sol: DBS %g - atop" iStage

    ; * You are licked := completion
    elseif iStage == 910
        if eval (call tsolActorsInUse (Ar_List rZActor, rBuck))
            let iTimeOut += 1
            return
        endif
        let iTimeOut := 0
        ShowMessage SexoutSolDunton11Licking
        call fnSexoutActPrep
        call fnSexoutActSetRef "ActorA", rZActor
        call fnSexoutActSetRef "ActorB", rBuck
        call fnSexoutActSetInt "duration", 99
        call fnSexoutActSetInt "isOral", True
        call fnSexoutActSetInt "Anim", 242
        call fnSexoutActRun
        let iStage += 1
        DebugPrint "Sol: DBS %g queening" iStage
    
    ; ****       
    elseif iStage == 921
        rBuck.CIOS SexoutNGFinishNow
        let iStage := 999
        DebugPrint "Sol: DBS %g - finishing" iStage


    ; * Finish up
    elseif iStage == 1000
        MessageEx "All of you pant hard with fatigue"
        ShowMessage SexoutSolDunton12Bathe
        ;rZActor.SetRestrained False
        ;rBuck.SetRestrained False
        ;rChuck.SetRestrained False
        rBuck.StopLook
        rChuck.StopLook
        let iStage := 1001
        let MyWay := False
        rZActor.NX_SetEVFl "SO:NotNow", False
        let SexoutSolNovacQuest.iBrotherFucks += 1
    elseif iStage == 1007
        rBuck.RemoveItem SexoutNude, 1
        rBuck.AddItem OutfitWasteland01, 1
        rBuck.EquipItem OutfitWasteland01
        rChuck.RemoveItem SexoutNude, 1
        rChuck.AddItem OutfitWasteland01, 1
        rChuck.EquipItem OutfitWasteland01
        PlaySound NPCHumanEatingFoodChewy
        MessageEx "Chuck eats a pie"
        let iStage := 0
        StopQuest SexoutSolDuntonBrothersSexQuest
        return

    ; ** Otherwise, increment the timer
    else
        let iStage += 1
    endif

Printc "Sol: DBS Script Ended (Stage now = %g)" iStage
End

====Seperate Script====

scn tsolActorsInUse

; * lets you check if any of an array of actors are sexout in use
; * returns True once after actually true, to dodge 84 sexout freeze bug.
; * Intended to be used in GameMode block that retry with a delay

; * local
ref rActor
array_var aEntry
int Busy

; * args
array_var aActors


Begin Function { aActors }

    let Busy := False

    foreach aEntry <- aActors
        let rActor := aEntry["value"]
        if eval (call fnSexoutActorInUse rActor)
            let Busy := True
            rActor.NX_SetEVFl "Sol:SexoutDelay", True
        elseif rActor.NX_GetEVFl "Sol:SexoutDelay" == True
            let Busy := True
            rActor.NX_ClrEVFl "Sol:SexoutDelay"
        endif
    loop

    SetFunctionValue Busy
    return

End

 

 

Posted

Well I've eliminated one of the conversation bugs, working on one more, then will dig in more into your reports Odessa. This one might be an actual bug in Legion though, I'm not sure yet.

Posted

Odessa it might be that the ref was not valid, and then it blew up in the printC. I noticed in a few spots that I PrintC'd with more params than I had placeholders. Fixing it up now just in case and adding some more debugging to some of them.

Posted

2.6.85b5 in OP

- No more waiting for consciousness etc. before unlocking.

- LOTS more logging in debug mode -- use with caution!

 

Odessa, this one (with debug mode on) will positively spam the console/logfile with crap (caller ref and passed ref, mostly). If the CTDs are happening in one of those functions, should help narrow it down.

Posted

Unrelated to current issues.

 

Can you add an IsDead check to fnSexoutActorInuse?  It's a part of standard "is target valid?" checks.

Posted

If you're adding GetDead, typical validity checks also include:

 

GetDisabled

GetUnconscious

IsChild

GetKnockedState (not certain if this one is necessary)

Get has no sexout animations

Is in banned actor list

 

 

Personally I think this gets outside the scope of 'ActorInUse', and might be better in a  separate actor validity function.

Posted

You're right, and I debated whether or not to mention it.  Perhaps a different function.  Reinventing the wheel each mod, etc. Pride's call, of course.

Posted

It doesn't really belong there, none of those extra return codes other than true/false do. I wanted to return some information about why it couldn't proceed, a trinary state.. actor is in use (yes, no, notvalid). However it might be better for bugfinding in other scripts if I just turn it back to a true/false.

 

This will mean I return false for invalid refs, so if the caller decides to use it in a subsequent call, it'll be their script that blows up and not sexout -- unless they call sexout, in which case the sanitizer will blow up since it already checks all this stuff.

 

I will be moving those checks out of the sanitizer and into a standalone UDF anyway that anyone can call, that will give a better 'report' on the status of a ref, along the lines of what inuse currently returns. 0 = OK, 1 = not a ref, 2 = not an actor, etc..

 

Sound good?

Posted

I will be moving those checks out of the sanitizer and into a standalone UDF anyway that anyone can call, that will give a better 'report' on the status of a ref, along the lines of what inuse currently returns. 0 = OK, 1 = not a ref, 2 = not an actor, etc..

 

Sound good?

 

Yes, that sounds great. :)

 

 

Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...