What would you like me to add to the game in the next update?

  • The connection (police) mechanic. This would be a new "currency" and a new batch of upgrades.

  • More events and the possiblity for the packmakers to add some in their packs.

  • The possbility to train the skills of the girls

  • Progress the story and add story missions (mostly focused on Nicole)

  • Something else (tell me either by PM or in this thread).


Results are only viewable after voting.

BlueLine

Newbie
Mar 29, 2021
32
1
Am I missing something? Where is 9.5.0.2? Main page only shows ...1

For those who don't mind testing, I have an testing candidate at this URL.

This will include the new changes to the policy prices and club upgrades requiring them.

As well, it includes the first set of keyboard shortcuts for booze, cigarettes, and so on. This will be done by hitting qweasd to select the girl working the booth followed by r, t, f, or g for the shortcut itself.

There are also minor UI changes.

School classes are still enabled disabled (as it will be migrated to the new Adversity interface) and I have not disabled the relevant Investment.

Also, at the request of @CaptC I've included support for portrait100.

Bios were disabled on this build--I know, and I forgot to include the code to reference it.
 

Disgruntler

Well-Known Member
Game Developer
May 2, 2021
1,042
1,093
"portrait" and "portrait_small" images not in the correct fomat, most likely. Pretty common. The "portrait.jpg" (or png) should be in a 2:3 format with a width of at least 600 pixels and a height of at least 900 pixels. The "portrait_small.jpg" (or png) should be in 1:1 format (a square) with a width and height of at least 120 pixels.
To add to this, if you keep Venus's Club deep deep deep nested in a very long path the path might be getting truncated and the game may not be able to actually reach the girlpacks. Doubtful if it's pulling up their stats, but possible.

In this case, keep Venus's club closer to the root directory.

The utility Chubberlang linked comes highly recommended and its dev is very responsive to feedback (which is why I endorse it).
 
  • Like
Reactions: Jack-O

A524298690

New Member
Sep 1, 2021
4
0
To add to this, if you keep Venus's Club deep deep deep nested in a very long path the path might be getting truncated and the game may not be able to actually reach the girlpacks. Doubtful if it's pulling up their stats, but possible.

In this case, keep Venus's club closer to the root directory.

The utility Chubberlang linked comes highly recommended and its dev is very responsive to feedback (which is why I endorse it).
Dude, after playing your game, I want to make one myself.

But I have a problem. How do you create the file for every girl in [Girlpacks]?

What should the corresponding code be?

I want to make a game similar to fm2022
 

ThroneAweigh

Newbie
Aug 7, 2018
57
120
Hey Disgruntler, idk if you've looked into it at all but when I dropped working on my remake of VC I was looking into multithreading the initialization of Girlpacks. Would you be open to some help?
 
Apr 20, 2018
20
1
Can someone post a picture of the office? Where you can assign girls...there are a bunch of spots, each just has a rectangular black text box. What does assigning girls to these spots do? I'm talking about the promote/assign option
 
Last edited:

Disgruntler

Well-Known Member
Game Developer
May 2, 2021
1,042
1,093
Dude, after playing your game, I want to make one myself.

But I have a problem. How do you create the file for every girl in [Girlpacks]?

What should the corresponding code be?

I want to make a game similar to fm2022
Tobe made the code for this a long time ago and I've not changed it--but I can tell you the broad strokes on how it works.

First, there's the GirlClass class that contains the data structure for the girl. This just uses unity's library to read the initial values from the JSON directly for each property. For example, the property GirlClass.moneyCost is in the JSON as "moneyCost": 300, or whatever--it's just as easy as making sure the name matches the property. For internal-only properties, you just don't put those in JSONs, and you don't tell anyone they exist.

Handling the videos is easy as well. Because the name of the girl and the name of the folder must be identical, you just have the code look into the directory like StaticStrings.PATHTOGIRLPACKS + girl.name + StaticStrings.VIDEOFOLDER + StaticStrings.SEXFOLDER + StaticStrings.BACKVAGFOLDER where the properties of StaticStrings are defined in their own static class. It then pulls a random video from the file list there (checking if that was the last video played but that's neither here nor there.)

That leaves the portraits. In initialization, it runs co-routines that load the images into unity's sprite objects for each of the 6 portrait types, and then stores them. If a portrait is missing, I then added code that has it set the references for missing portraits to the level below, ensuring that all 6 portraits have a representative in the code (and therefore doesn't have to check every type it calls a portrait). This doesn't work with Nicole, however, because she operates under completely different rules, accessing Unity's resource system.

Once you have that structure in place, it goes into the Girlpacks directory---and it checks every subdirectory for the JSON, and if it's missing, it gives an error and won't create that girl. If it is and the JSON has the wrong name, it gives an error and won't create that girl. Otherwise, it goes in and creates it.

To keep track of it, it just using a List<Girlclass> as a master list of the girls in the game. Girl gets created, added to the list, rinse repeat.

There is a snag though. You do not want to use this master list as your in-game data. In order to get around this, you have a clone method that creates a copy of the girl as a new object, and you use this as your recruited girl data. Creating a clone is important--if you just go recruitedGirlsList.Add(masterList[index]) you'll toss a reference to the master data on your recruited list and that means any changes you make to the girl (including gaining stats in the booth or other changes over time) will copy over to your master list, and on a restart this means that your girls will not 'start from scratch.'

A similar thing is necessary for Scramble Mode, though my exact implementation is different from Tobe's and I had a lot of 'learning as I go' trying to get it to work, and save properly. The recruited girls in Scramble Mode save as normal, but the list of girls to be recruited needed to be saved seperately as well.

----

Now, if you want to make a game along these lines, if I may?

There is no need to reinvent the wheel! Just go into this thread, look up Tobe's posts, and you should be able to find his link to the 8.1 source code. Study it (the GirlClass.cs in particular, as well as RegisterGirl.cs and StaticFunctions.cs and StaticStrings.cs is where the meat of what you're looking for is) and use it as a basis of your own. Port the code over that does the loading and initialization, and leave out the part that loads data from the Girlpack's JSON.

Then you can have a second JSON it'd pull your game's specific data from, and have that in the same place the description.JSON is. Have code that can generate a new one from scratch and save it as a JSON (unity has this in its library) and badabing badaboom, you're now able to use VC girlpacks in your game.

You'll want to add an interface for selecting the location for the girlpack folder (do NOT copy VC's for this, for your own sanity TRUST ME) but other than that, bob's your uncle.

I fully support and endorse other games using VC Girlpacks as expandable user-made content for their own--I love TUSC's take on it and I do not see more games using this as a bad thing.
 
  • Red Heart
Reactions: GrooveDaddy

Disgruntler

Well-Known Member
Game Developer
May 2, 2021
1,042
1,093
Sad it isn't playable on Linux. I only use ubuntu now :/
Run a script that converts all the mp4s in girlpacks to webms using v8 for the video codec and vorbis for the audio codec.

Then, next time I do a source-code upload you can recompile that using Unity 2019 on linux and it will work. I just don't have a linux environment to do this in myself.
 

A524298690

New Member
Sep 1, 2021
4
0
There is no need to reinvent the wheel! Just go into this thread, look up Tobe's posts, and you should be able to find his link to the 8.1 source code. Study it (the GirlClass.cs in particular, as well as RegisterGirl.cs and StaticFunctions.cs and StaticStrings.cs is where the meat of what you're looking for is) and use it as a basis of your own. Port the code over that does the loading and initialization, and leave out the part that loads data from the Girlpack's JSON.
It helps me a lot

Thank you so so so so much!
 

bingho8

Newbie
Aug 15, 2020
36
18
Sorry if this was asked and answered, couldn't find it. Just started this game.

Seems you can't change NICOLE(original Mission girl) to other person, packs?, pics? or whatever) is this true?

ALSO Can you change PICTURES of Menu? Improvement?
 

Disgruntler

Well-Known Member
Game Developer
May 2, 2021
1,042
1,093
Sorry if this was asked and answered, couldn't find it. Just started this game.

Seems you can't change NICOLE(original Mission girl) to other person, packs?, pics? or whatever) is this true?

ALSO Can you change PICTURES of Menu? Improvement?
As CaptC said, it is not *currently* changeable.

However--the system itself is potentially modular and it's entirely possible for me to change things to 'Assistant Packs' in a similar manner to GirlPacks--though this would be a higher level of work for creators.

So my answer to this is 'no, for now.' I won't promise I will change this but I won't promise I won't.
 
  • Like
Reactions: bingho8
Apr 20, 2018
20
1
Screenshot from 2022-08-25 18-23-15.png




Here are pictures of my screens loading it on linux. The loading of characters can be fixed via converting the video files. I still, however, have black rectangular text boxes covering almost all of the text in the game. How do I reconcile this?
















Screenshot from 2022-08-25 18-23-30.png Screenshot from 2022-08-25 18-23-15.png Screenshot from 2022-08-25 18-23-15.png Screenshot from 2022-08-25 18-23-49.png Screenshot from 2022-08-25 18-23-41.png
 

Disgruntler

Well-Known Member
Game Developer
May 2, 2021
1,042
1,093
View attachment 2005094




Here are pictures of my screens loading it on linux. The loading of characters can be fixed via converting the video files. I still, however, have black rectangular text boxes covering almost all of the text in the game. How do I reconcile this?
















View attachment 2005096 View attachment 2005097 View attachment 2005094 View attachment 2005098 View attachment 2005099
Oof.

I have no idea!

The best I can do is upload source code and let you unity it into a linux version.
 

A524298690

New Member
Sep 1, 2021
4
0
Tobe made the code for this a long time ago and I've not changed it--but I can tell you the broad strokes on how it works.
Dude, some problems now...

I copied the code and made some modifications..

...↓code↓...

public List<GirlClass> girls = new List<GirlClass>();

GirlClass Lee = new GirlClass();
...

Lee = SaveWithJson.Instance.LoadFromJsonFile<GirlClass>("/StreamingAssets/GirlpacksA/" + directoryInfo.Name + "/JSON_data/Description.json");//RegisterGirlFromJsonFile

girls.Add(Lee);

Debug.Log(girls[0]);

Debug.Log(girls[0].name);
...

【theUnityConsole】

GirlClass
UnityEngine.Debug:Log (object)
Aria Lee
UnityEngine.Debug:Log (object)


My expectation is: Debug.Log(girls[0])→“Aria Lee” instead of “GirlClass”

I want to find a designated girl by naming so how should I modify the code?T T
 

ThroneAweigh

Newbie
Aug 7, 2018
57
120
Dude, some problems now...

I copied the code and made some modifications..

...↓code↓...

public List<GirlClass> girls = new List<GirlClass>();

GirlClass Lee = new GirlClass();
...

Lee = SaveWithJson.Instance.LoadFromJsonFile<GirlClass>("/StreamingAssets/GirlpacksA/" + directoryInfo.Name + "/JSON_data/Description.json");//RegisterGirlFromJsonFile

girls.Add(Lee);

Debug.Log(girls[0]);

Debug.Log(girls[0].name);
...

【theUnityConsole】

GirlClass
UnityEngine.Debug:Log (object)
Aria Lee
UnityEngine.Debug:Log (object)


My expectation is: Debug.Log(girls[0])→“Aria Lee” instead of “GirlClass”

I want to find a designated girl by naming so how should I modify the code?T T
The first debug log is going to return the class because it's a list of class instances. You should be able to search by name (if girls.name == string) and return the values that fit it. I might have an old copy of my attempt laying around somewhere and I can copy-paste my search code in here when I'm home from work.
 

ThroneAweigh

Newbie
Aug 7, 2018
57
120
Dude, some problems now...

I copied the code and made some modifications..

...↓code↓...

public List<GirlClass> girls = new List<GirlClass>();

GirlClass Lee = new GirlClass();
...

Lee = SaveWithJson.Instance.LoadFromJsonFile<GirlClass>("/StreamingAssets/GirlpacksA/" + directoryInfo.Name + "/JSON_data/Description.json");//RegisterGirlFromJsonFile

girls.Add(Lee);

Debug.Log(girls[0]);

Debug.Log(girls[0].name);
...

【theUnityConsole】

GirlClass
UnityEngine.Debug:Log (object)
Aria Lee
UnityEngine.Debug:Log (object)


My expectation is: Debug.Log(girls[0])→“Aria Lee” instead of “GirlClass”

I want to find a designated girl by naming so how should I modify the code?T T
Heads up, you'll need to include "using System.Text" in your search script for the StringBuilder but that only matters if you want dynamic updating on keypress.

Here's my Search function:
Code:
    void Search()
    {
            for (int j = 0; j < shopList.Count; j++) //Traverses the list of performers in shopList
            {
            if(search.Length == 1 && shopList[j].name.ToLower().StartsWith(search.ToLower())) //If user inputs a single character, jumps to the first performer with that name.
            {                                                                                  // Would otherwise look for the first instance of that character anywhere in a name.   
                    GetComponent<Girlpack_Reader>().LoadPortrait(shopList[j],girl); //Set the girl to the front
                    LoadGirlInfo(shopList[j]); //Display all relevant info
                    i = j; //int used to keep track of shop highlight
                    SideGirls(); //Function call to load portrait on either side.
                    break;
            }
            if (search.Length > 1 && shopList[j].name.ToLower().Contains(search.ToLower())) //If user enters more than one character.
            {
                GetComponent<Girlpack_Reader>().LoadPortrait(shopList[j], girl); //Same as above
                LoadGirlInfo(shopList[j]);                                  //
                i = j;                                                                //
                SideGirls();                                                       //
                break;                                                              //Same as above
            }
        }
        return;
    }
And here's what I call during the Update to use it:
Code:
        if (Input.anyKeyDown && (Input.inputString.Length != 0) && (Input.inputString != "\n") && (Input.inputString != "\b"))
        { //Verifies that the input isn't enter or backspace
            timerIsRunning = true; //all timer related things is for a function that had the text stay on screen temporarily
            if(timerIsRunning)
            {
                builder.Append(Input.inputString); //Using the System.Text Stringbuilder to add characters as they're input
                search = builder.ToString(); //Converts to whole sting
                searchTime = defaultTime; //resets fade out time
                searchBar.GetComponent<TMPro.TextMeshProUGUI>().text = search; //displays text on screen
                StopCoroutine("FadeText"); //stops the text fade out
                StartCoroutine("FadeText"); //resets the fade out
            }
            Search(); //Calls search function
        }
 
  • Like
Reactions: A524298690

A524298690

New Member
Sep 1, 2021
4
0
Heads up, you'll need to include "using System.Text" in your search script for the StringBuilder but that only matters if you want dynamic updating on keypress.

Here's my Search function:
Code:
    void Search()
    {
            for (int j = 0; j < shopList.Count; j++) //Traverses the list of performers in shopList
            {
            if(search.Length == 1 && shopList[j].name.ToLower().StartsWith(search.ToLower())) //If user inputs a single character, jumps to the first performer with that name.
            {                                                                                  // Would otherwise look for the first instance of that character anywhere in a name.  
                    GetComponent<Girlpack_Reader>().LoadPortrait(shopList[j],girl); //Set the girl to the front
                    LoadGirlInfo(shopList[j]); //Display all relevant info
                    i = j; //int used to keep track of shop highlight
                    SideGirls(); //Function call to load portrait on either side.
                    break;
            }
            if (search.Length > 1 && shopList[j].name.ToLower().Contains(search.ToLower())) //If user enters more than one character.
            {
                GetComponent<Girlpack_Reader>().LoadPortrait(shopList[j], girl); //Same as above
                LoadGirlInfo(shopList[j]);                                  //
                i = j;                                                                //
                SideGirls();                                                       //
                break;                                                              //Same as above
            }
        }
        return;
    }
And here's what I call during the Update to use it:
Code:
        if (Input.anyKeyDown && (Input.inputString.Length != 0) && (Input.inputString != "\n") && (Input.inputString != "\b"))
        { //Verifies that the input isn't enter or backspace
            timerIsRunning = true; //all timer related things is for a function that had the text stay on screen temporarily
            if(timerIsRunning)
            {
                builder.Append(Input.inputString); //Using the System.Text Stringbuilder to add characters as they're input
                search = builder.ToString(); //Converts to whole sting
                searchTime = defaultTime; //resets fade out time
                searchBar.GetComponent<TMPro.TextMeshProUGUI>().text = search; //displays text on screen
                StopCoroutine("FadeText"); //stops the text fade out
                StartCoroutine("FadeText"); //resets the fade out
            }
            Search(); //Calls search function
        }
Thanks a million !!!!
 
4.40 star(s) 49 Votes