Description
UPDATE: Adding high priority label, this should be done after base-separation
Outfits should now have randomization options. (aka, monika should pick what she wants to wear each day.)
This should also affect hair and certain ACS (like ribbons, and later rings).
Can use #3377 to signify which outfits can be picked by Monika
This will not be purely random. The following factors may be considered in the final product:
- seasonal clothes
- month
- staleness - how long monika has been wearing the same thing straight
- user selections - which outfits users select in wardrobe
- pool topic outfit opinions - pool topics where you can say "I like your outfit" or "i dont like ur outfit"
pre-reqs:
JSONify sprite objects #3416 - needed to make adding new outfits seamless- opendoor should stop resettting outfits. Could replace the table/chair line with "let me change into something more comfortable"
weighting considerations in detail
weighting basics
This will be governed by a summation weighting system. Weights are summed with all outfits, and an outift's piece of the total sum acts as its percentage.
Each outfit will have a base weight per season, as well as a base weight per month. Base weights for season and month are added together when doing the main calcuations. This weight can be adjusted by user selection and how long monika wears it, but the outfit will always naturally tend to the base weight. (Except for cases where the user does not like the outfit. See below)
For a season, 2500 should be the base weight. range is [0, 5000]
For a month, 2500 should be the base weight. range is [0, 5000]
For a user-based thing, 0 will be the base weight. this is the only weight that can be negative. Range is [-10k, 10k]
The goal of the values here means that if you really dont like an outfit, you can erase it from being shown completely with the -10k of bad weighting. However, month+season weight determines availability of an outfit. If this sums to 0, the outfit cannot be monika-selected regardless the user weight.
NOTE no reasoning behind this, i just picked numbers that kind of work. The scales could easily be reduced if the potential point adjustments seem not useful. especially considering the stale/freshness values.
weight adjustments
The current weight of an outfit can be modified based on user habits. The base weights are never modified. Weight offsets are tracked, saved, and reapplied on startup.
user selection
User selection (via change clothes topic) increases the user weight of an outfit by 10 per hour for the first 8 hours after the selection. (leads to a maximum of 80 weight - 0.8% gained when a user selects an outfit). This prevents users from spamming selections to artificially increase weight, since the weighting is based on time after selection. Weight is only gained while the mod is open.
staleness
User weight is reduced by 2 per hour (after the first 8 hours). This corresponds to losing all weight gained by user selection exactly 48 hours after initially selecting the outfit. Weight will continue to reduce by 2 per hour until effective weight is 0 or the outfit is taken off. Weight reduction occurs even while the game is off (except in special circumstances, see below).
freshness
An outfit that is not worn will increase in user weight by 1 per 2 hours until it reaches 0 user weight.
outfit selection
Everytime Monika selects an outfit:
- weighting value for every outfit with a non-zero weighting for the season is summed.
- each outfit is given a range of that total weight based on its weight.
- random number from 1 to that sum is selected
- the outfit with the range that contains that number is selected.
Considerations for outfit selection:
- should outfits be selected at specific times?
- should outfits have a minimum amount of time worn?
- should user-selected outfits override monika-selections for a period of time? (I think yes, but then how long?)
For some of the above, I've thought about 8 hours being a long enough amount of time to prevent monika-selections after an outfit selection.
outfit opinions
Pool topics can be used to tell monika if you like or dont like something.
Some considerations:
two options (I like or I dont like)
This is simple, but prevents us from having nuances when adjusting weights. To make this work, we'd probably have to make weight adjustment a blanket amount like 100+-, which might be too rough and make the system too gameable.
5 (or 4) options (strongly like, sightly like, neutral, slightly dontlike, strongly dont like)
The 5 point scale is a decent mix between simple categories and having enough options. This could give us a wide scale for handling nuances, we can attach different weight gains/losses based on the selected choices.
Neutral, however, is kind of pointless here. If we do use this scale, I would probably remove neutral so it becomes a 4-point scale.
Potential values:
- strongly like = +100
- slightly like = +30
- slightly dont like = -30
- strongly dont like = -100
However, there is an issue with this. There's been studies on test questions, and its been discovered that 4/5-point scales are really bad in comparison to 10-point scales.
10 options (Rate from 1-10)
The 10-point scale has been proven to be best scale for capturing exactly how people feel about things. we could definitely get the best nuances and weight adjustment by using this scale.
Potential values:
- 10 - +100
- 9 - + 80
- 8 - + 60
- 7 - + 40
- 6 - +20
- 5 - -20
- 4 - -40
- 3 - -60
- 2 - -80
- 1 - -100
NOTE: all numbers selected above are arbitrary. Actual weighting adjustments can be discussed.
These pool questions will only be available once per selection per day. This is to prevent spamming to increase/reduce chances of an outfit being selected.
affected items
Generally, clothes will be the main target of randomization. Hair and ACS can be included, but each potential selection adds significant overhead in the selection alg.
ACS will not be included in randomization at this time
Only clothes and hair will change, clothes willl not change as outfits, but hair will take off ACS as necessary.
Consideration:
Since outfit_mode
flag is a thing, perhaps this should only be limited to clothes (and probably hair)? and then we just assume outfit mode when changing clothes?
technical
implementation will likely be wrapper classes around MASSpriteBase
objects, similar to selectables.
JSON support will be added, with a default (base value 5k) randomization option.
example of weighting system and selection
lets say its currently summer in july.
lets say we have these clothes:
- uniform - 1000 weight in july, 500 weight in summer, 200 user-based - 1700 total weight
- blazerless - 1000 weight in july, 2500 weight in summer, 400 user-based - 3900 total weight
- sundress - 3000 weight in july, 3000 weight in summer, 300 user-baesd - 6300 total weigtht
The weights are summed: 11900 total weight.
Each clothes is given a range:
- uniform - 1-1700
- blazerless - 1701- 5600
- sundress - 5601-11900
A random number is selected from 1 to 11900
Lets say its 5673.
That means sundress has been selected.
Activity