Jump to content

OSex+ The Greatest Virtual Sex Ever


Recommended Posts

That's the only one I have installed, says 0SEX-ALPHA-107C, Got it from the post earlier... I've uninstalled the version on the NMM (1.063) via NMM I don't know how much else I could uninstall it.

h p://ft.trillian.im/94c873cbd73a1392ac2b1bd055c697f7accf92fb/6Fv1eZloQgGTkzODQ01szRGkTWhak.jpg

 

I've stopped using NMM long time ago so im not sure if 1.06 is just disabled or uninstalled. With so few mods installed it might be good idea for you to try Mod Organizer instead.

Anyway MCM that you linked previously is from 1.06 so Skyrim is still reading that one from somewhere.

 

Completely remove 0sex 1.06 and make clean save (no 0sex installed) then install 1.07c.

Link to comment

CEO You sir are a genius. Is there a PDF of 1.07c? If so could some one point me in the right direction?

 

There is no PDF and probably wont be since CEO is already working on 1.07d UI which will probably drasticly change controls comparing to version c.

Link to comment

I was looking at the json files to see how they might be transitioned to xml. What are those arrays with tons of zeros in them?

 

I also tested the Flash timer and can confirm that it is functional in-game. So, you can fire events timed to the millisecond from Flash. In 3DSMax when you are making the animations, what is the unit of measurement for time? Some conversion can be done so that it's easier to base event timing on how time is listed out in 3DS.

 

Hi PipDude,

I've had good success getting things to work with your help including the xml  parser which is really cool thank you. I'll need your guidance in finding the best way to apply it.

 

The 0 arrays are either for tests not used anymore or deep config that I didn't want to put into the MCM but they are there just in case. Like altering the sequential stripping order.

 

Here's a quick summary of all the JSON documents I use:

 

 

The heart of the mod that's used regularly would be:

Data\meshes\0SA\0Sex\MF\00  (B \ P \ L): folders which holds the scenes. It loads <scene> and <flag> from these documents on scene change. This might be what you are talking about with the 0s under their eye data. Each block represents something their eyes can focus on. For base positions I use a SexDentity that only looks at the others actors face so I didn't need the extra data but they should be filled out. It's a matter of that I haven't got to it yet. First box is 3 variations of eye contact, 2nd grouping is the action in the scene, 3rd grouping is a 2nd action (if one is happening, 4th grouping is body, 5th grouping is avoid eye contact (look disinterested)

 

Data\meshes\0SA\0Sex\MF\00\_Tran: Which holds a timeline for what the actors should do in transitions. They have the key name of the transition name and the data is a string list of key words that the script interprets to do papyrus functions.

 

Data\meshes\0SA\0Sex\MF\00\_Cy: Is key words describing the scene for sexdentity to use.

 

Data\meshes\0SA\_Id\Sex\F\_Base\_map\Face: Folders like these that hold MFG or Sound Form data to use at different arousal \ speed levels. This applies to the entire _ID folder.

 

Data\meshes\0SA\0Sex\_Activate\_Alpha.json: Holds the scene information that the MCM uses to bind the scene. When you attach a scene in the MCM it copies this document to a string list if it exists.

 

Everything else is either removed, for the MCM to load the first time it's started up, or for secret config of some stuff.

 

 

 

If you have time PipDude some questions regarding the timing in Flash that I'm stuck on and parts of my current plan to see if you have ideas that can make it work better.

 

In terms of timing the issues I'm hitting when trying to apply it is that I can't use flash to notify the papyrus. For example if Flash realizes it's time to do something I can't get it to nudge papyrus and tell it do switch up what it's doing. Do you have ideas to go about this? (By the way you were right I looked and the entry for playsound is in the C++ under documents named Scaleform. There's not much there besides playsound and they look incomplete though, like not totally decoded maybe.

 

--------------------------------------------------------------

 

Secondly here's UI script plan. It populates a 6 x 3 grid when alt is held down, each entry of the grid consists of an overlay of 3 boxes. 1 is the base the 2nd is how it looks when lit up and the 3rd is the icon that gets applied to it for a graphic. The only way I see to get the information to the SWF is papyrus pulling JSON at the start of a new scene then sending that to the SWF.

 

The script will be calling JSON a lot less this way but I'd still like it if possible to stay at 1 call (On scene change Json call realestate is busy at the moment so I want to keep it down, it's most likely the cause of the crash people are experiencing). 1 string array is very tight on space for button data. Issue is there's a few fields of information that need to go into the swf.  1: Scene name the press should lead too, 2: Description of the scene (Like the help text) 3: Button Icon to load. 

 

If I divide the array up into 3 that's only 40 moves allowed across all actors which is too tight, the undressing scene now is already almost 40 so the only option I see is to have every line represent one transition and have it hold 3 fields of data. 128 possible transitions per scene basically. I plan to have flash break the string down by searching for 2 "#" symbols, that separate the icon name from the press destination name and the destination from the descriptor text.

 

There would be a line devoted to PageEnd and ActorEnd. Meaning when it encounters that entry  it would start recording data for the next Tab-Page or Actor-Tab-Page.

 

Here's the script that builds the menu:

 

 

Base is the box itself, OVA is the box's appearance when selected and ICO is the graphic put over thebox. The name of the graphic that is being attached "icoNGT01_SexTF_41" in all of them here would be string data from the Json that it applies.

 

so a json string would be roughly like this, the # are what it is searching for to split the data up:

 

"icoNGT01_SexTF_41#@4_bST6StCud00#4Turn %2(him her) around."

 

"icoNGT01_SexTF_42#@4_bST6StOvBa200#Bend %2(him her) forward."

 

"#PicoNGT01_SexTF_41   <---- This would tell the script to start recording data for page 2 and what icon graphic page 2 should use. Actor tab woul work the same way.

 

"icoNGT01_SexTF_42#@4_bST6StOvBa200#Bend %2(him her) forward." <------ Entry that goes into tab-page 2

 

%2 is speculating if possible, it would make the script check the gender of the actor and input him or her, his, her. I most likely will not do this as it might involve to much string searching. (I don't know if this would be expensive or not, but am always fearful of it) I might use the singular they (Them they)or just opt to write around this so there's no need.

 

 

Example of my box making script (Not including string processing, as that will happen just once when it receives the string array on scene change, but there will be arrays in here that it's looking at to know when to stop etc. made from the initial array.)

 

var NavPanelCase: MovieClip;

 

{

var zR:Number = 1;
var zC:Number = 1;
var zH:Number = 45;
var zV:Number = Stage.height;
 
//Row, Column, Horizontal Vertical spacing between boxes
 
NavPanelCase.attachMovie("NGT1_TXT_GActor", "NGT1_TXT_GActorMain", NavPanelCase.getNextHighestDepth(), {_x:zH, _y:zV - 50});
NavPanelCase.attachMovie("NGT1_TXT_GStyle", "NGT1_TXT_GStyleMain", NavPanelCase.getNextHighestDepth(), {_x:zH, _y:zV - 75});
NGT1_TXT_GActor = NavPanelCase["NGT1_TXT_GActorMain"]
 
// Attaches actor Name Field, and Descriptive Text Field
 
zV -=  140
var zVU = zV
 
while (zC < 4) {
 
while (zR < 7) {
NavPanelCase.attachMovie("graNGT01_GBOX_BW", "Nav1BASE_GridR"+zR+"C"+zC, NavPanelCase.getNextHighestDepth(), {_x:zH, _y:zV});
NavPanelCase["Nav1Base_GridR"+zR+"C"+zC]._alpha = 40;
NavPanelCase.attachMovie("graNGT01_GBOX_0PNK", "Nav1OVL_GridR"+zR+"C"+zC, NavPanelCase.getNextHighestDepth(), {_x:zH, _y:zV});
NavPanelCase["Nav1OVL_GridR"+zR+"C"+zC]._alpha = 0;
NavPanelCase.attachMovie("icoNGT01_SexTF_41", "Nav1ICO_GridR"+zR+"C"+zC, NavPanelCase.getNextHighestDepth(), {_x:zH, _y:zV});
NavPanelCase["Nav1ICO_GridR"+zR+"C"+zC]._alpha = 80;
zV -= 60;
zR ++;
}
zC ++;
zR = 1;
zH += 77;
zV = zVU;
 
}
}
 
//Place a Base, OVA, and ICO box in each spot vertically then moving over a column and repeating, 6 per row 3 columns max
 
Here's an example of movement on the grid, this is for DPAD up: I'm using basic math:  up and down = +1 -1, left and right = +10 -10
 
if (row < 6) { 
this.NavPanelCase["Nav1BASE_GridR"+row+"C"+col]._alpha = 65;
this.NavPanelCase["Nav1OVL_GridR"+row+"C"+col]._alpha = 0;
this.NavPanelCase["Nav1ICO_GridR"+row+"C"+col]._alpha = 75;
// Dims the previous selected button
row += 1;
this.NavPanelCase["Nav1BASE_GridR"+row+"C"+col]._alpha = 0;
this.NavPanelCase["Nav1OVL_GridR"+row+"C"+col]._alpha = 100;
this.NavPanelCase["Nav1ICO_GridR"+row+"C"+col]._alpha = 100;
// Lights up the new button
}
 
 
Lastly here's the unload script that kill the fields when the scene is complete:
 
while(this.NavPanelCase.numChildren > 0){
     this.NavPanelCase.removeChildAt(0)
;}
this.NavPanelCase.unloadMovie();
 
 

Link to comment

 

 

Dauvmire I just wanted to say thank you also,

 

You've always been encouraging of this project since the beginning, we haven't said much outside of a few questions here and there but your support, and testing is appreciated and helps, thank you!

Link to comment

When I use to be in here Checking this Pages lots of people ask so many qustions in here  :D

Some of the problems can be fix without asking.

When I use to get some problem with this mod I use to try something stupid while installation and it works perfect.So Skyrim mod lovers don`t ask easy fix problem from

mod owner.Well mod creator also trying to improve his mod later on we mod lovers won`t get problem in future while using this mod so don`t keep mods owner busy with to many questions.

I am trying to say that it can be fix by yourself if you try it.

Well  :D  :D with this mod I have made mistakes more than 70 times and it worked 70% good later on in future This will be 100% best working  mod for skyrim.

 

 

Link to comment

CEO could you link 1.07c to original post so that its easier to find. I got random pm asking me where it is and it probably is difficult for new guys to find it now almost 20 pages back.

 

As for people asking questions, we were all there once, so its nice to help them. We would all like that CEO makes this mod yesterday and that its perfect, but things like this take time. So me being here and answering some questions is a way to help and to give CEO more time.

 

I see other people do that too which is really great. But then again people can't expect instant answer on every question 24/7.

Link to comment

In terms of trouble shooting:

My nexus release is what I consider stable, savegame safe to use, and bug free outside of setup. That's still under the stipulation that it's a beta, at some point if 1.07 can get controlled I'll release a 2.0 which is me saying the mod is sealed up and good to go for a play through and you've got nothing to worry about.

 

1.07 is ambitious and been taking a long time, but I believe it's important and if we can do this and make it work well for everyone that it can be a powerful tool that can result in changing Skyrim totally. The launches are here are intended for testing, they are incomplete, and will have bugs. If I felt otherwise it would be on Nexus.

 

I've got a lot of help on this project lately to help me with the issues 1.07 faces so I think we can do this, but the projects goals are on the deep end of what is possible to make Skyriim do. The help has led to two things, in that development has been able to address things that weren't possible before like the UI and also find solutions to make the code smooth and perform better, so it's growing in two ways.

 

-----------------

 

What's coming up soon is a test of the UI for people to see if they like it. It will be 1.07D set up which I believe is a big improvement on 1.07C but it will have limited scene access as I'll only put the first few standing scenes data to fit the UI. If people like the UI, I'll move all the scenes over. The menu is complete in terms of interacting with it, Poping Up closing and moving around with the dpad all work and for me is lightning fast and smooth, the moment I push a button the window is there. What I'm doing now is making it read scene data then I will release a few scenes on the UI for testing, followed by a 1.07E Alpha of the UI on 1.07D's set up.

Link to comment

CEO could you link 1.07c to original post so that its easier to find. I got random pm asking me where it is and it probably is difficult for new guys to find it now almost 20 pages back.

 

As for people asking questions, we were all there once, so its nice to help them. We would all like that CEO makes this mod yesterday and that its perfect, but things like this take time. So me being here and answering some questions is a way to help and to give CEO more time.

 

I see other people do that too which is really great. But then again people can't expect instant answer on every question 24/7.

Oh Yeah. CEO if you put that mod link in original post then you won`t get so many questions about this and that mod where to get it and find it for new members.

Link to comment

The eventual UI implementation will be great. Outstanding work!

 

Thanks!

All credit goes to PipDude and Kinky, I have no idea how to do it without PipDude, he showed me everything and Kinky for sparking the idea and drumming up interest about it.

 

It's not an eventual thing though we're talking a matter of days. It's almost complete!

Link to comment

 

The eventual UI implementation will be great. Outstanding work!

 

Thanks!

All credit goes to PipDude and Kinky, I have no idea how to do it without PipDude, he showed me everything and Kinky for sparking the idea and drumming up interest about it.

 

It's not an eventual thing though we're talking a matter of days. It's almost complete!

 

13640215041644851117.GIF

Link to comment

 

 

Part 2 PipDude if you want to check it out to see if I'm going about this right:

 

Whenever the scene changes 0SA will pull a JSON string array then it will send that to the UI. I have a function PretendArray which is replicating this at the moment where it sets up an array in flash but this would be replaced by the string[] that papyrus sends:

 

The way it turned out developers will be able to pick the look of the button unselected, the button selected and the icon graphic that goes on it. They will also be able to pick the min-icon used for each tabpage also:

 

String that's input into the UI from JSON: A 2 actor scene (It's the scene 0Sex begins from: ST9 Adore)

Actor 1 has 1 page 

Actor 2 has 2 pages

 

 

 

 

tArray[0] = "02";
tArray[1] = "01|06|05|SexyButton1#";
tArray[2] = "01|00|03|SexyButton1#";
tArray[3] = "";
tArray[4] = "";
tArray[10] = "";
tArray[11] = "@2_LST9AdoreEm00#Embrace $N2.#Sex_TFPink#BW#PK#";
tArray[12] = "@4_bST6StCud00#Turn $N2 around.#Sex_TFPink#BW#PK#";
tArray[13] = "@2_bUS9KnStra00#Kneel $N2 down to $P2 knees.#Sex_TFPink#BW#PK#";
tArray[14] = "@2_bST9AdoreAp00#Release from holding $N2.#Sex_TFPink#BW#PK#";
tArray[15] = "@4_bRL9Lotus00#Lift $N2 off her feet.#Sex_TFPink#BW#PK#";
tArray[16] = "@2_LST9AdoreEm00#Embrace $N1.#Sex_TFPink#BW#PK#";
tArray[17] = "@2_bUS9KnStra00#Kneel down to your knees.#Sex_TFPink#BW#PK#";
tArray[18] = "@2_bST9AdoreAp00#Release from holding $W1.#Sex_TFPink#BW#PK#";

 

 

 

The script that crunches the array: (This gave me a migraine but I think it's done

 

 

function NavT1Pilot() : Void
{
NGT1_Scene = new Array(25);
 
NGT1_Scene[0] = Number(tArray[0]);
 
trace("Scene Properties")
trace("Total Actors: "+NGT1_Scene[0]);
var zBIX = 11;
// Lines are parsed Actor > Pages > Buttons so the string array needs an index to remember the last line that was accessed since it's all together.
var zA = 1;
 
while (zA <= NGT1_Scene[0]){
this["NGT1_A"+zA+"_X"] = new Array(50);
trace("---------Actor "+zA+": Tab-Page Data-------------------------------")
 
this["NGT1_A"+zA+"_X"] = new Array(39);
this["NGT1_A"+zA+"_X"][1] = Number(tArray[zA].substring(0,2));
this["NGT1_A"+zA+"_X"][2] = Number(tArray[zA].substring(3,5));  
 
 
 
trace("A"+zA+"Total TabPages: "+this["NGT1_A"+zA+"_X"][1]);
trace("A"+zA+"Has Speeds: "+this["NGT1_A"+zA+"_X"][2]);
 
NavT1CrunchPages(zA);
 
var zBI = 1;
 
// ButtonIndex
var zPI = 1;
// Page Index
 
while (zPI <= this["NGT1_A"+zA+"_X"][1]) {
while (zBI <= this["NGT1_A"+zA+"_X"][10 + zPI]) {
NavT1CrunchButtons(zA, zPI, zBI, zBIX);
zBIX ++;
zBI ++;
}
zBI = 1;
zPI ++;
}
 
zA += 1;
}
 
zA = 1;
 
 
}
 
function NavT1CrunchPages(zA: Number){
 
var zI;
var zL = 5;
 
var zPI = 1
while (zPI <= this["NGT1_A"+zA+"_X"][1]){
zI = zL + 1
this["NGT1_A"+zA+"_X"][10 + zPI] = tArray[zA].substring(zI, zI + 2);
zI += 3;
zL = tArray[zA].indexOf("#", zI)
this["NGT1_A"+zA+"_X"][30 + zPI] = tArray[zA].substring(zI, zL);
 
trace("------A"+zA+",P"+zPI+"------")
trace("Nav Buttons on Page "+zPI+" : "+this["NGT1_A"+zA+"_X"][10 + zPI])
trace("Graphic Icon: "+this["NGT1_A"+zA+"_X"][30 + zPI])
 
this["NGT1_A"+zA+"P"+zPI+"_D"] = new Array(this["NGT1_A"+zA+"_X"][10 + zPI] + 1)
this["NGT1_A"+zA+"P"+zPI+"_I"] = new Array(this["NGT1_A"+zA+"_X"][10 + zPI] + 1)
this["NGT1_A"+zA+"P"+zPI+"_GBS"] = new Array(this["NGT1_A"+zA+"_X"][10 + zPI] + 1)
this["NGT1_A"+zA+"P"+zPI+"_GIC"] = new Array(this["NGT1_A"+zA+"_X"][10 + zPI] + 1)
this["NGT1_A"+zA+"P"+zPI+"_GOV"] = new Array(this["NGT1_A"+zA+"_X"][10 + zPI] + 1)
zPI ++;
}
}
 
function NavT1CrunchButtons(zA: Number, zPI: Number, zBI: Number, zArrP: Number){
 
 
trace("A"+zA+", P"+zPI+": Button#"+zBI)
 
var zL = 0
var zI = tArray[zArrP].indexOf("#", zL);
this["NGT1_A"+zA+"P"+zPI+"_D"][zBI] = tArray[zArrP].substring(zL,zI)
zL = zI + 1
zI = tArray[zArrP].indexOf("#", zL);
 
this["NGT1_A"+zA+"P"+zPI+"_I"][zBI] = SynSnipe(tArray[zArrP].substring(zL,zI))
 
zL = zI + 1
zI = tArray[zArrP].indexOf("#", zL);
this["NGT1_A"+zA+"P"+zPI+"_GBS"][zBI] = tArray[zArrP].substring(zL,zI)
zL = zI + 1
zI = tArray[zArrP].indexOf("#", zL);
this["NGT1_A"+zA+"P"+zPI+"_GOV"][zBI] = tArray[zArrP].substring(zL,zI)
zL = zI + 1
zI = tArray[zArrP].indexOf("#", zL);
this["NGT1_A"+zA+"P"+zPI+"_GIC"][zBI] = tArray[zArrP].substring(zL,zI)
 
trace("Destination: "+this["NGT1_A"+zA+"P"+zPI+"_D"][zBI])
trace("Information: "+this["NGT1_A"+zA+"P"+zPI+"_I"][zBI])
trace("Button Base: "+this["NGT1_A"+zA+"P"+zPI+"_GBS"][zBI])
trace("Button Highlighted: "+this["NGT1_A"+zA+"P"+zPI+"_GOV"][zBI])
trace("Button Icon Graphic: "+this["NGT1_A"+zA+"P"+zPI+"_GIC"][zBI])
}
 
function SynSnipe(zDest: String) : String
{
if (zDest.indexOf("$") != -1) {
 
var zA = 1
var zATN
while (zA <= NGT1_Scene[0]) { 
zATN = zA*10;
zDest = zDest.split("$W"+zA).join(SynCalcW(zATN+3));
zDest = zDest.split("$P"+zA).join(SynCalcP(zATN+3));
zDest = zDest.split("$N"+zA).join(NGT1_Actra[zATN+1]);
zA ++;
}
}
return zDest;
}
 
function SynCalcW(zAct: Number):String{
if (NGT1_Actra[zAct] == "F") {
return "her"
} else if (NGT1_Actra[zAct] == "M") {
return "him"
} else {
return "it"
}
}
 
function SynCalcP(zAct: Number):String{
if (NGT1_Actra[zAct] == "F") {
return "her"
} else if (NGT1_Actra[zAct] == "M") {
return "his"
} else {
return "it's"
}
}

 

 

 

Output of the Data in traces:

 

 

 

Scene Properties
Total Actors: 2
 
---------Actor 1: Tab-Page Data-------------------------------
 
A1Total TabPages: 1
A1Has Speeds: 6
 
------A1,P1------
 
Nav Buttons on Page 1 : 05
Graphic Icon: SexyButton1
 
A1, P1: Button#1
 
Destination: @2_LST9AdoreEm00
Information: Embrace Fione.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
A1, P1: Button#2
 
Destination: @4_bST6StCud00
Information: Turn Fione around.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
A1, P1: Button#3
 
Destination: @2_bUS9KnStra00
Information: Kneel Fione down to her knees.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
A1, P1: Button#4
 
Destination: @2_bST9AdoreAp00
Information: Release from holding Fione.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
A1, P1: Button#5
 
Destination: @4_bRL9Lotus00
Information: Lift Fione off her feet.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
---------Actor 2: Tab-Page Data-------------------------------
 
A2Total TabPages: 1
A2Has Speeds: 0
 
------A2,P1------
 
Nav Buttons on Page 1 : 03
Graphic Icon: SexyButton1
 
A2, P1: Button#1
 
Destination: @2_LST9AdoreEm00
Information: Embrace Guy.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
A2, P1: Button#2
 
Destination: @2_bUS9KnStra00
Information: Kneel down to your knees.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
A2, P1: Button#3
Destination: @2_bST9AdoreAp00
Information: Release from holding him.
Button Base: Sex_TFPink

 

 

 

It's checking $ for gender and name sensitive stuff. ex:

$W1 Actor 1: Him Her

$P2  Actor 2 :  His / Her

$N3 : Actor 3's Name 

 

After this it's just some simpler stuff of propagating the pages to reflect this and it's good to go. Outside of moving the data entry over in the scene json.

Link to comment

I actually made an account here a while back ONLY so I could test these alphas of yours.

 

You're insane, Ceo.  Certifiable probably.

 

We love you all the more for it.

 

Nothing to offer but these meager words of encouragement.

 

Cheers.

 

- btw I could never get the 1.07 alpha to work, no matter what I tried.  Had to do a full hour of game play without any 0SEX installed just to make the MCI menu finally disappear.  Grabbed the 1.07C to test last night, and it works without a hitch.  Personally finding the interface/flow more intuitive than ever, and I really love seeing the 3 things I wanted most are even better than I'd imagined.

 

Two thumbs up and a swirl.

Link to comment

 

Hi PipDude,

I've had good success getting things to work with your help including the xml  parser which is really cool thank you. I'll need your guidance in finding the best way to apply it.

 

The 0 arrays are either for tests not used anymore or deep config that I didn't want to put into the MCM but they are there just in case. Like altering the sequential stripping order.

 

 
Got it on the arrays. Using xml, those would be best handled as comma separated value strings. Then just split them into an array once in Flash. If any of them are used for timings, there should be a more efficient format than having to log every individual 0 state.
 

 

Here's a quick summary of all the JSON documents I use:

 

 

The heart of the mod that's used regularly would be:

Data\meshes\0SA\0Sex\MF\00  (B \ P \ L): folders which holds the scenes. It loads <scene> and <flag> from these documents on scene change. This might be what you are talking about with the 0s under their eye data. Each block represents something their eyes can focus on. For base positions I use a SexDentity that only looks at the others actors face so I didn't need the extra data but they should be filled out. It's a matter of that I haven't got to it yet. First box is 3 variations of eye contact, 2nd grouping is the action in the scene, 3rd grouping is a 2nd action (if one is happening, 4th grouping is body, 5th grouping is avoid eye contact (look disinterested)

 

Data\meshes\0SA\0Sex\MF\00\_Tran: Which holds a timeline for what the actors should do in transitions. They have the key name of the transition name and the data is a string list of key words that the script interprets to do papyrus functions.

 

Data\meshes\0SA\0Sex\MF\00\_Cy: Is key words describing the scene for sexdentity to use.

 

Data\meshes\0SA\_Id\Sex\F\_Base\_map\Face: Folders like these that hold MFG or Sound Form data to use at different arousal \ speed levels. This applies to the entire _ID folder.

 

Data\meshes\0SA\0Sex\_Activate\_Alpha.json: Holds the scene information that the MCM uses to bind the scene. When you attach a scene in the MCM it copies this document to a string list if it exists.

 

Everything else is either removed, for the MCM to load the first time it's started up, or for secret config of some stuff.

 

 

 

 

Ok. I didn't see those before. I'll look through those to see how they would translate to XML and follow up.

 

(More on this below. But, I think that it would help you in the long run to use more standard naming conventions for files, variables and folders. The folders here are a good example. "00" communicates nothing by itself. So, new developers have to learn what it means and you have to memorize its meaning. Kind of a boring reality. But, in coding, the most dryly functional names are the best names. :) )

 

 

If you have time PipDude some questions regarding the timing in Flash that I'm stuck on and parts of my current plan to see if you have ideas that can make it work better.

 

In terms of timing the issues I'm hitting when trying to apply it is that I can't use flash to notify the papyrus. For example if Flash realizes it's time to do something I can't get it to nudge papyrus and tell it do switch up what it's doing. Do you have ideas to go about this? (By the way you were right I looked and the entry for playsound is in the C++ under documents named Scaleform. There's not much there besides playsound and they look incomplete though, like not totally decoded maybe.

 

 

I've been using events for this.

 

Assuming that your flash script extends SkyUI's WidgetBase, you will be able to radio an event out like this:

skse.SendModEvent("0S_AnimationEvent","",animationID);

In Papyrus, you include this in OnInit within whichever script you want to hear the 0S_AnimationEvent event:

Event OnInit()

RegisterForModEvent("0S_AnimationEvent", "yourAnimationHeardFunction")
EndEvent

Then yourAnimationHeardFunction would look like this in Papyrus:

 

Function yourAnimationHeardFunction(string a_eventName, string a_strArg, float a_numArg, Form a_sender)

EndFunction

In the above case, I believe that the animationID would be sent to the listening function as a_strArg.

 

It's possible that there is another way to call functions in Papyrus from flash. I haven't fully studied everything in SkyUI. I studied it until I got what I needed at the time to work. So, if events aren't sufficient, I can dig a little more and see if there is some other way to hook out.

 

 

Secondly here's UI script plan. It populates a 6 x 3 grid when alt is held down, each entry of the grid consists of an overlay of 3 boxes. 1 is the base the 2nd is how it looks when lit up and the 3rd is the icon that gets applied to it for a graphic. The only way I see to get the information to the SWF is papyrus pulling JSON at the start of a new scene then sending that to the SWF.

 

The script will be calling JSON a lot less this way but I'd still like it if possible to stay at 1 call (On scene change Json call realestate is busy at the moment so I want to keep it down, it's most likely the cause of the crash people are experiencing). 1 string array is very tight on space for button data. Issue is there's a few fields of information that need to go into the swf.  1: Scene name the press should lead too, 2: Description of the scene (Like the help text) 3: Button Icon to load. 

 

If I divide the array up into 3 that's only 40 moves allowed across all actors which is too tight, the undressing scene now is already almost 40 so the only option I see is to have every line represent one transition and have it hold 3 fields of data. 128 possible transitions per scene basically. I plan to have flash break the string down by searching for 2 "#" symbols, that separate the icon name from the press destination name and the destination from the descriptor text.

 

There would be a line devoted to PageEnd and ActorEnd. Meaning when it encounters that entry  it would start recording data for the next Tab-Page or Actor-Tab-Page.

 

I may be getting confused by terminology. Is a "scene" the beginning of an entire sex scene? Or is it the beginning of an animation phase?

 

If you use xml, you send all of this data in all at once in one big string. That said, I believe that there is a way to send arrays of data also. I'll look into that and follow up.

 

I'm not following where the 128 possible transitions limit is coming from. Is that a JSON thing? Papyrus' max array size? Either way, that would be overcome by using XML instead. Unless there is some string size limit, you could have a 1000 length array generated from the XML and it would never have to touch JSON or Papyrus.

 
I'm probably just having a brain stall on this one and not understanding.
 
 

 

Here's the script that builds the menu:

 

 
Ok. I think that I'm starting to understand more from this. You are looking to create a sort of short-hand code to send in as instructions. That could work. And that very well could be the best solution given the way the system currently works. Couldn't you concatenate all of that into one string and send in one push? Or, again, preferrably imo, you just send it all in via XML and it retains all of it's structure, eliminating the need to have any kind of short-hand system like this. In that case the data you have available in Flash already has a 1:1 relationship with the XML file.
 
Regarding string searching, I can't speak for Papyrus. It could be slow there. But, replacing %2 with character names would be very trivial in Flash. I say go for it.
 
 

 

Example of my box making script (Not including string processing, as that will happen just once when it receives the string array on scene change, but there will be arrays in here that it's looking at to know when to stop etc. made from the initial array.)

 

 

 

This all looks pretty solid. You may not need to remove the child items out of NavPanelCase since you remove NavPanelCase entirely right after.

 

Also, as mentioned earlier, I think that it would help you in the long run and help your code be more readable for others to tighten up your naming convention. In variable and function names: abbreviations, alternating lower and upper case ad hoc, and generally trying to fit too much information into the names themselves is difficult to keep track of and read. Instead, when there seems to be a need to put more info in a variable, its usually a good case for setting up more of a structure system (multi-dimensional arrays). Of course, Papyrus is not very friendly to that. But, there are ways.

 

Of course, take that with a grain of salt. There isn't a right or wrong answer on naming conventions. There are zillions of guides on-line and a lot of them vary. Here's a decentish one: http://www.htmlgoodies.com/beyond/javascript/variable-naming-conventions-in-javascript.html

 

Link to comment

 

 

 

Part 2 PipDude if you want to check it out to see if I'm going about this right:

 

Whenever the scene changes 0SA will pull a JSON string array then it will send that to the UI. I have a function PretendArray which is replicating this at the moment where it sets up an array in flash but this would be replaced by the string[] that papyrus sends:

 

The way it turned out developers will be able to pick the look of the button unselected, the button selected and the icon graphic that goes on it. They will also be able to pick the min-icon used for each tabpage also:

 

String that's input into the UI from JSON: A 2 actor scene (It's the scene 0Sex begins from: ST9 Adore)

Actor 1 has 1 page 

Actor 2 has 2 pages

 

 

 

 

tArray[0] = "02";
tArray[1] = "01|06|05|SexyButton1#";
tArray[2] = "01|00|03|SexyButton1#";
tArray[3] = "";
tArray[4] = "";
tArray[10] = "";
tArray[11] = "@2_LST9AdoreEm00#Embrace $N2.#Sex_TFPink#BW#PK#";
tArray[12] = "@4_bST6StCud00#Turn $N2 around.#Sex_TFPink#BW#PK#";
tArray[13] = "@2_bUS9KnStra00#Kneel $N2 down to $P2 knees.#Sex_TFPink#BW#PK#";
tArray[14] = "@2_bST9AdoreAp00#Release from holding $N2.#Sex_TFPink#BW#PK#";
tArray[15] = "@4_bRL9Lotus00#Lift $N2 off her feet.#Sex_TFPink#BW#PK#";
tArray[16] = "@2_LST9AdoreEm00#Embrace $N1.#Sex_TFPink#BW#PK#";
tArray[17] = "@2_bUS9KnStra00#Kneel down to your knees.#Sex_TFPink#BW#PK#";
tArray[18] = "@2_bST9AdoreAp00#Release from holding $W1.#Sex_TFPink#BW#PK#";

 

 

 

The script that crunches the array: (This gave me a migraine but I think it's done

 

 

function NavT1Pilot() : Void
{
NGT1_Scene = new Array(25);
 
NGT1_Scene[0] = Number(tArray[0]);
 
trace("Scene Properties")
trace("Total Actors: "+NGT1_Scene[0]);
var zBIX = 11;
// Lines are parsed Actor > Pages > Buttons so the string array needs an index to remember the last line that was accessed since it's all together.
var zA = 1;
 
while (zA <= NGT1_Scene[0]){
this["NGT1_A"+zA+"_X"] = new Array(50);
trace("---------Actor "+zA+": Tab-Page Data-------------------------------")
 
this["NGT1_A"+zA+"_X"] = new Array(39);
this["NGT1_A"+zA+"_X"][1] = Number(tArray[zA].substring(0,2));
this["NGT1_A"+zA+"_X"][2] = Number(tArray[zA].substring(3,5));  
 
 
 
trace("A"+zA+"Total TabPages: "+this["NGT1_A"+zA+"_X"][1]);
trace("A"+zA+"Has Speeds: "+this["NGT1_A"+zA+"_X"][2]);
 
NavT1CrunchPages(zA);
 
var zBI = 1;
 
// ButtonIndex
var zPI = 1;
// Page Index
 
while (zPI <= this["NGT1_A"+zA+"_X"][1]) {
while (zBI <= this["NGT1_A"+zA+"_X"][10 + zPI]) {
NavT1CrunchButtons(zA, zPI, zBI, zBIX);
zBIX ++;
zBI ++;
}
zBI = 1;
zPI ++;
}
 
zA += 1;
}
 
zA = 1;
 
 
}
 
function NavT1CrunchPages(zA: Number){
 
var zI;
var zL = 5;
 
var zPI = 1
while (zPI <= this["NGT1_A"+zA+"_X"][1]){
zI = zL + 1
this["NGT1_A"+zA+"_X"][10 + zPI] = tArray[zA].substring(zI, zI + 2);
zI += 3;
zL = tArray[zA].indexOf("#", zI)
this["NGT1_A"+zA+"_X"][30 + zPI] = tArray[zA].substring(zI, zL);
 
trace("------A"+zA+",P"+zPI+"------")
trace("Nav Buttons on Page "+zPI+" : "+this["NGT1_A"+zA+"_X"][10 + zPI])
trace("Graphic Icon: "+this["NGT1_A"+zA+"_X"][30 + zPI])
 
this["NGT1_A"+zA+"P"+zPI+"_D"] = new Array(this["NGT1_A"+zA+"_X"][10 + zPI] + 1)
this["NGT1_A"+zA+"P"+zPI+"_I"] = new Array(this["NGT1_A"+zA+"_X"][10 + zPI] + 1)
this["NGT1_A"+zA+"P"+zPI+"_GBS"] = new Array(this["NGT1_A"+zA+"_X"][10 + zPI] + 1)
this["NGT1_A"+zA+"P"+zPI+"_GIC"] = new Array(this["NGT1_A"+zA+"_X"][10 + zPI] + 1)
this["NGT1_A"+zA+"P"+zPI+"_GOV"] = new Array(this["NGT1_A"+zA+"_X"][10 + zPI] + 1)
zPI ++;
}
}
 
function NavT1CrunchButtons(zA: Number, zPI: Number, zBI: Number, zArrP: Number){
 
 
trace("A"+zA+", P"+zPI+": Button#"+zBI)
 
var zL = 0
var zI = tArray[zArrP].indexOf("#", zL);
this["NGT1_A"+zA+"P"+zPI+"_D"][zBI] = tArray[zArrP].substring(zL,zI)
zL = zI + 1
zI = tArray[zArrP].indexOf("#", zL);
 
this["NGT1_A"+zA+"P"+zPI+"_I"][zBI] = SynSnipe(tArray[zArrP].substring(zL,zI))
 
zL = zI + 1
zI = tArray[zArrP].indexOf("#", zL);
this["NGT1_A"+zA+"P"+zPI+"_GBS"][zBI] = tArray[zArrP].substring(zL,zI)
zL = zI + 1
zI = tArray[zArrP].indexOf("#", zL);
this["NGT1_A"+zA+"P"+zPI+"_GOV"][zBI] = tArray[zArrP].substring(zL,zI)
zL = zI + 1
zI = tArray[zArrP].indexOf("#", zL);
this["NGT1_A"+zA+"P"+zPI+"_GIC"][zBI] = tArray[zArrP].substring(zL,zI)
 
trace("Destination: "+this["NGT1_A"+zA+"P"+zPI+"_D"][zBI])
trace("Information: "+this["NGT1_A"+zA+"P"+zPI+"_I"][zBI])
trace("Button Base: "+this["NGT1_A"+zA+"P"+zPI+"_GBS"][zBI])
trace("Button Highlighted: "+this["NGT1_A"+zA+"P"+zPI+"_GOV"][zBI])
trace("Button Icon Graphic: "+this["NGT1_A"+zA+"P"+zPI+"_GIC"][zBI])
}
 
function SynSnipe(zDest: String) : String
{
if (zDest.indexOf("$") != -1) {
 
var zA = 1
var zATN
while (zA <= NGT1_Scene[0]) { 
zATN = zA*10;
zDest = zDest.split("$W"+zA).join(SynCalcW(zATN+3));
zDest = zDest.split("$P"+zA).join(SynCalcP(zATN+3));
zDest = zDest.split("$N"+zA).join(NGT1_Actra[zATN+1]);
zA ++;
}
}
return zDest;
}
 
function SynCalcW(zAct: Number):String{
if (NGT1_Actra[zAct] == "F") {
return "her"
} else if (NGT1_Actra[zAct] == "M") {
return "him"
} else {
return "it"
}
}
 
function SynCalcP(zAct: Number):String{
if (NGT1_Actra[zAct] == "F") {
return "her"
} else if (NGT1_Actra[zAct] == "M") {
return "his"
} else {
return "it's"
}
}

 

 

 

Output of the Data in traces:

 

 

 

Scene Properties
Total Actors: 2
 
---------Actor 1: Tab-Page Data-------------------------------
 
A1Total TabPages: 1
A1Has Speeds: 6
 
------A1,P1------
 
Nav Buttons on Page 1 : 05
Graphic Icon: SexyButton1
 
A1, P1: Button#1
 
Destination: @2_LST9AdoreEm00
Information: Embrace Fione.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
A1, P1: Button#2
 
Destination: @4_bST6StCud00
Information: Turn Fione around.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
A1, P1: Button#3
 
Destination: @2_bUS9KnStra00
Information: Kneel Fione down to her knees.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
A1, P1: Button#4
 
Destination: @2_bST9AdoreAp00
Information: Release from holding Fione.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
A1, P1: Button#5
 
Destination: @4_bRL9Lotus00
Information: Lift Fione off her feet.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
---------Actor 2: Tab-Page Data-------------------------------
 
A2Total TabPages: 1
A2Has Speeds: 0
 
------A2,P1------
 
Nav Buttons on Page 1 : 03
Graphic Icon: SexyButton1
 
A2, P1: Button#1
 
Destination: @2_LST9AdoreEm00
Information: Embrace Guy.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
A2, P1: Button#2
 
Destination: @2_bUS9KnStra00
Information: Kneel down to your knees.
Button Base: Sex_TFPink
Button Highlighted: BW
Button Icon Graphic: PK
 
A2, P1: Button#3
Destination: @2_bST9AdoreAp00
Information: Release from holding him.
Button Base: Sex_TFPink

 

 

 

It's checking $ for gender and name sensitive stuff. ex:

$W1 Actor 1: Him Her

$P2  Actor 2 :  His / Her

$N3 : Actor 3's Name 

 

After this it's just some simpler stuff of propagating the pages to reflect this and it's good to go. Outside of moving the data entry over in the scene json.

 

 

Looks good!

 

Though, if you load it all in from XML, you could reduce this to a probably 10 line function. :)

Link to comment

 

 

 

PipDude,

Thank you for all of this information it's a lot to go through so I'm making my way:

 

This is awesome exactly what I needed: skse.SendModEvent("0S_AnimationEvent","",animationID);

I couldn't do what you were suggesting without this and now it makes sense. My events are password protected since they are in spells (like "OS"+Password_AnimationEvent as I needed a way for them to not trigger other scenes if multiples were happening at once but I can send the password up to the UI so this will work perfect.

 

---------------

A note on this: I did in 0Sex a test by replacing the onupdate event which is the main loop of the script with a sendmod event so I could have a second layer of scripts states by being able to suffix the update event with a special string (I hoped). It would disconnect after a while so I came to the conclusion that Papryus will at times ignore a mod event but will never ignore an update event. I'm not sure if this 100% true but something I spent a bit of time testing. I can put the entire script in to AS basically now with this. I'm going to do bits at a time that make sense but there's nothing stopping me now, I'm skeptical that if the update event is being handled by an event it might drop is what I'm saying, i'll try it and see but at the very least maybe that part could just be handled by Skyrim and everything can go into Actionscript. If the timing could be exact it could open up a lot of possibilities, in terms of adding variations into loops, getting the spanks timed perfect etc. so it would be absolutely worth it if it works.

 

---------------

 

 

Yea 128 is Papyrus' array limit so that's the most I can pull from JSON with just one go, you're right that it all could be combined one string or use XML so it doesn't need so much processing. I'm not sure the max length string Skyrim can take but it would only need one extra pass of crunching to turn a single string into that data. My terminology in my head is vague on it as well sorry! By scene in that case I mean a looping static spot in the scene in between transitions. Basically any time you hit a key and are coming out of the transition to another looping scene that 0Sex stays on is when the script would do a json call and then send it up to the UI and the UI would eat the array with that function.

 

I have a hard figuring what's going to be expensive and how things weigh up in terms of performance in Papyrus. I try to use as few JSON calls as possible but I don't have any idea if calling an array is more expensive then calling a string. I went to seek some help on it and was under the impression after the conversation that it's a json call itself that has a price but doesn't matter what kind so it would be better just to pull larger arrays as opposed to smaller strings. I wouldn't know how that applies to calling for a single string vs and array to make the script process. I use the single string at times because It allows be to supply a replacement if the JSON doesn't exist, where as the array doesn't and will get filled in with random junk if it doesn't exist and cause problems. So if I need to be super sure the JSON exists I use the single call just in a few cases.

 

----------------------

 

It's crazier how much faster flash is, the % swaps would prob mess up papyrus pretty good but flash had no change once I added the line. That's the plan is as much info as I get out of one pull and pack the info up to basically fit into a max array in Papyrus. Can't wait to have more of the script handed over and see what happens. I always feel in the dark on the pros and cons of things I can't really see clearly how much one approach  would benefit compared to another (outside of obvious adjustments to efficiency of the script) I just build it all and see if it's worse or better. I'm pretty sure at this point that the more that can get into flash the better.

 

Maybe in time a combination of actionscript and a DLL even. DLL seems perfect for handling the facial expression loops I just can't figure out yet the syntax for the phoneme/modifier METHOD_FN my c++ is horrible. Most likely the ideal end game will involve Actionscript handling navigation and timing and a DLL handling the faces, since the DLL can connect directly to the expression/modifier/phonemes.  The big json load that I think is causing problems is on a new scene change shortly after the actors each start loading in their new sexdentity for the scene, they have to call a lot of files and it's x2 since per actor. I'm hoping in 1.07D it's lighter but if it's not I'll have to make the script space out the json calls so it's only doing a few at a time then waiting a bit, slowly bringing in the new sexdentity basically. If the DLL can access sexdentity data itself it could do this all on its own without every having to touch the papyrus.

 

--------------------

 

Agree on the naming conventions and sorry about them! I have a system that makes sense to me but I get that a lot that they make no sense. I generally put z in front of temp variables that are used in a function but not perm and use Final Fantasy Spell naming-convention on properties, Actra Actro Actraga etc. Depending on the situation.

 

Now that I'm looking at it again I supposed it's the same system MCM does it translations. Could I call a txt or xml or json from the UI and have it be received only the UI? I remember you mentioned the XML API was disabled. If I can do any of those for the sake of translation I imagine it would be better if I called the scenes $SceneName for the descriptive text instead of typing into the scenedata "Flip %N2 over" for example and have it reference a document so that translations could be used.

 

I'm reading more PipDude just dropping my initial thoughts, thanks for all this time.

Link to comment

 

 

 

Sorry PipDude, one more question. The systems takes button customization easy but they would have to all be included the swf as a library to choose from. Do you have any idea the cost this would have, meaning vaguely I guess, should I keep the buttons down to the absolute minimum so it doesn't punish Skyrim or can I have some fun with it?

 

A majority of them are just a few vectors some are more complex. I'd like to have palettes that developers can pick from but I don't want to do that if it's coming at a high price.

Link to comment

Dauvmire I just wanted to say thank you also,

 

You've always been encouraging of this project since the beginning, we haven't said much outside of a few questions here and there but your support, and testing is appreciated and helps, thank you!

0SEX has nearly 60,000 unique downloads, according to Nexus. You've called your mod a "hobby," something you've enjoyed putting together. My hobby is playing video games, a pastime that benefits one individual: me. Your generosity in sharing your "hobby" has made 60,000 gamers' Skyrim experience more interesting, to say the least. It is much appreciated. You have talent and ambition that I can only envy.

 

And I just realized something. "0SEX" pronounced correctly would be "zero sex," which happens to be my current social status :P

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

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

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more information, see our Privacy Policy & Terms of Use