diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e515e0..1ac76d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 1.13.0 +* Position is now part of the profile match score + ## 1.12.0 * Post length preference is now part of the profile match score * Improved kink match scoring diff --git a/README.md b/README.md index 7f0c03f..436646c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Download -[Windows](https://github.com/mrstallion/fchat-rising/releases/download/v1.12.0/F-Chat-Rising-1.12.0-win.exe) (75 MB) -| [MacOS](https://github.com/mrstallion/fchat-rising/releases/download/v1.12.0/F-Chat-Rising-1.12.0-macos.dmg) (76 MB) -| [Linux](https://github.com/mrstallion/fchat-rising/releases/download/v1.12.0/F-Chat-Rising-1.12.0-linux.AppImage) (76 MB) +[Windows](https://github.com/mrstallion/fchat-rising/releases/download/v1.13.0/F-Chat-Rising-1.13.0-win.exe) (75 MB) +| [MacOS](https://github.com/mrstallion/fchat-rising/releases/download/v1.13.0/F-Chat-Rising-1.13.0-macos.dmg) (76 MB) +| [Linux](https://github.com/mrstallion/fchat-rising/releases/download/v1.13.0/F-Chat-Rising-1.13.0-linux.AppImage) (76 MB) # F-Chat Rising @@ -94,6 +94,7 @@ This repository contains a heavily customized version of the mainline F-Chat 3.0 * Dominance preference * Human/anthro preference * Post length preference + * Position preference * Non-custom kinks * Species 1. Maching for non-binary genders relies on kinks. For example, if your non-binary character has a preference for females, make sure 'females' are listed as a favorite kink. diff --git a/docs/_config.yml b/docs/_config.yml index 4c14f3e..e383b0e 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -50,7 +50,7 @@ theme: jekyll-theme-slate changelog: https://github.com/mrstallion/fchat-rising/blob/master/CHANGELOG.md download: - version: 1.12.0 + version: 1.13.0 url: https://github.com/mrstallion/fchat-rising/releases/download/v%VERSION%/F-Chat-Rising-%VERSION%-%PLATFORM_TAIL% diff --git a/electron/package.json b/electron/package.json index 0b216be..439a612 100644 --- a/electron/package.json +++ b/electron/package.json @@ -1,6 +1,6 @@ { "name": "fchat", - "version": "1.12.0", + "version": "1.13.0", "author": "The F-List Team and Mister Stallion (Esq.)", "description": "F-List.net Chat Client", "main": "main.js", diff --git a/learn/matcher-types.ts b/learn/matcher-types.ts index 234d5e8..38e97dc 100644 --- a/learn/matcher-types.ts +++ b/learn/matcher-types.ts @@ -56,6 +56,14 @@ export enum SubDomRole { AlwaysDominant = 11 } +export enum Position { + AlwaysBottom = 85, + UsuallyBottom = 86, + Switch = 91, + UsuallyTop = 87, + AlwaysTop = 88 +} + export enum Orientation { Straight = 4, Gay = 5, diff --git a/learn/matcher.ts b/learn/matcher.ts index 0aefb12..bd6f801 100644 --- a/learn/matcher.ts +++ b/learn/matcher.ts @@ -28,6 +28,7 @@ import { mammalSpecies, nonAnthroSpecies, Orientation, + Position, PostLengthPreference, postLengthPreferenceMapping, postLengthPreferenceScoreMapping, Scoring, Species, SpeciesMap, @@ -148,6 +149,7 @@ export class CharacterAnalysis { readonly furryPreference: FurryPreference | null; readonly age: number | null; readonly subDomRole: SubDomRole | null; + readonly position: Position | null; readonly postLengthPreference: PostLengthPreference | null; readonly isAnthro: boolean | null; @@ -162,6 +164,7 @@ export class CharacterAnalysis { this.species = Matcher.species(c); this.furryPreference = Matcher.getTagValueList(TagId.FurryPreference, c); this.subDomRole = Matcher.getTagValueList(TagId.SubDomRole, c); + this.position = Matcher.getTagValueList(TagId.Position, c); this.postLengthPreference = Matcher.getTagValueList(TagId.PostLength, c); const ageTag = Matcher.getTagValue(TagId.Age, c); @@ -401,7 +404,8 @@ export class Matcher { [TagId.Species]: this.resolveSpeciesScore(), [TagId.SubDomRole]: this.resolveSubDomScore(), [TagId.Kinks]: this.resolveKinkScore(pronoun), - [TagId.PostLength]: this.resolvePostLengthScore() + [TagId.PostLength]: this.resolvePostLengthScore(), + [TagId.Position]: this.resolvePositionScore() }, info: { @@ -731,7 +735,7 @@ export class Matcher { if (yourSubDomRole === SubDomRole.UsuallyDominant) { if (theirSubDomRole === SubDomRole.Switch) - return new Score(Scoring.MATCH, `Loves switches`); + return new Score(Scoring.MATCH, `Loves switches (role)`); if ((theirSubDomRole === SubDomRole.AlwaysSubmissive) || (theirSubDomRole === SubDomRole.UsuallySubmissive)) return new Score(Scoring.MATCH, `Loves submissives`); @@ -747,7 +751,7 @@ export class Matcher { if (yourSubDomRole === SubDomRole.AlwaysDominant) { if (theirSubDomRole === SubDomRole.Switch) - return new Score(Scoring.WEAK_MATCH, `Likes switches`); + return new Score(Scoring.WEAK_MATCH, `Likes switches (role)`); if ((theirSubDomRole === SubDomRole.AlwaysSubmissive) || (theirSubDomRole === SubDomRole.UsuallySubmissive)) return new Score(Scoring.MATCH, `Loves submissives`); @@ -766,7 +770,7 @@ export class Matcher { if (yourSubDomRole === SubDomRole.UsuallySubmissive) { if (theirSubDomRole === SubDomRole.Switch) - return new Score(Scoring.MATCH, `Loves switches`); + return new Score(Scoring.MATCH, `Loves switches (role)`); if ((theirSubDomRole === SubDomRole.AlwaysDominant) || (theirSubDomRole === SubDomRole.UsuallyDominant)) return new Score(Scoring.MATCH, `Loves dominants`); @@ -782,7 +786,7 @@ export class Matcher { if (yourSubDomRole === SubDomRole.AlwaysSubmissive) { if (theirSubDomRole === SubDomRole.Switch) - return new Score(Scoring.WEAK_MATCH, `Likes switches`); + return new Score(Scoring.WEAK_MATCH, `Likes switches (role)`); if ((theirSubDomRole === SubDomRole.AlwaysDominant) || (theirSubDomRole === SubDomRole.UsuallyDominant)) return new Score(Scoring.MATCH, `Loves dominants`); @@ -801,7 +805,7 @@ export class Matcher { // You must be a switch if (theirSubDomRole === SubDomRole.Switch) - return new Score(Scoring.MATCH, `Loves switches`); + return new Score(Scoring.MATCH, `Loves switches (role)`); // if (yourRoleReversalPreference === KinkPreference.Favorite) // return new Score(Scoring.MATCH, `Loves role reversal`); @@ -818,6 +822,78 @@ export class Matcher { return new Score(Scoring.NEUTRAL); } + private resolvePositionScore(): Score { + const yourPosition = this.yourAnalysis.position; + const theirPosition = this.theirAnalysis.position; + + if ((!yourPosition) || (!theirPosition)) + return new Score(Scoring.NEUTRAL); + + if (yourPosition === Position.UsuallyTop) { + if (theirPosition === Position.Switch) + return new Score(Scoring.MATCH, `Loves switches (position)`); + + if ((theirPosition === Position.AlwaysBottom) || (theirPosition === Position.UsuallyBottom)) + return new Score(Scoring.MATCH, `Loves bottoms`); + + return new Score(Scoring.WEAK_MISMATCH, 'Hesitant about tops'); + } + + if (yourPosition === Position.AlwaysTop) { + if (theirPosition === Position.Switch) + return new Score(Scoring.WEAK_MATCH, `Likes switches (position)`); + + if ((theirPosition === Position.AlwaysBottom) || (theirPosition === Position.UsuallyBottom)) + return new Score(Scoring.MATCH, `Loves bottoms`); + + if ((yourPosition === Position.AlwaysTop) && (theirPosition === Position.AlwaysTop)) + return new Score(Scoring.MISMATCH, 'No tops'); + + return new Score(Scoring.WEAK_MISMATCH, 'Hesitant about tops'); + } + + if (yourPosition === Position.UsuallyBottom) { + if (theirPosition === Position.Switch) + return new Score(Scoring.MATCH, `Loves switches (position)`); + + if ((theirPosition === Position.AlwaysTop) || (theirPosition === Position.UsuallyTop)) + return new Score(Scoring.MATCH, `Loves tops`); + + return new Score(Scoring.WEAK_MISMATCH, 'Hesitant about bottoms'); + } + + if (yourPosition === Position.AlwaysBottom) { + if (theirPosition === Position.Switch) + return new Score(Scoring.WEAK_MATCH, `Likes switches (position)`); + + if ((theirPosition === Position.AlwaysTop) || (theirPosition === Position.UsuallyTop)) + return new Score(Scoring.MATCH, `Loves tops`); + + if ((yourPosition === Position.AlwaysBottom) && (theirPosition === Position.AlwaysBottom)) + return new Score(Scoring.MISMATCH, 'No bottoms'); + + return new Score(Scoring.WEAK_MISMATCH, 'Hesitant about bottoms'); + } + + // You must be a switch + if (theirPosition === Position.Switch) + return new Score(Scoring.MATCH, `Loves switches (position)`); + + // if (yourRoleReversalPreference === KinkPreference.Favorite) + // return new Score(Scoring.MATCH, `Loves role reversal`); + // + // if (yourRoleReversalPreference === KinkPreference.Yes) + // return new Score(Scoring.MATCH, `Likes role reversal`); + + if ((theirPosition === Position.AlwaysTop) || (theirPosition === Position.UsuallyTop)) + return new Score(Scoring.MATCH, `Loves tops`); + + if ((theirPosition === Position.AlwaysBottom) || (theirPosition === Position.UsuallyBottom)) + return new Score(Scoring.MATCH, `Loves bottoms`); + + return new Score(Scoring.NEUTRAL); + } + private resolveKinkBucketScore(bucket: 'all' | 'favorite' | 'yes' | 'maybe' | 'no' | 'positive' | 'negative'): KinkBucketScore { const yourKinks = this.getAllStandardKinks(this.you); diff --git a/learn/store/indexed.ts b/learn/store/indexed.ts index 8a607e6..ed10e53 100644 --- a/learn/store/indexed.ts +++ b/learn/store/indexed.ts @@ -99,7 +99,7 @@ export class IndexedStore implements PermanentIndexedStore { species: ca.species, age: ca.age, domSubRole: ca.subDomRole, // domSubRole - position: null, // position + position: ca.position, // position lastMetaFetched: null, guestbook: null, diff --git a/package.json b/package.json index eb591e9..0c0210e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "f-list-rising", - "version": "1.12.0", + "version": "1.13.0", "author": "The F-List Team and and Mister Stallion (Esq.)", "description": "A heavily modded F-Chat 3.0 client for F-List", "license": "MIT", diff --git a/site/character_page/infotag.vue b/site/character_page/infotag.vue index 9c744bb..352c4de 100644 --- a/site/character_page/infotag.vue +++ b/site/character_page/infotag.vue @@ -59,7 +59,7 @@ } theirInterestIsRelevant(id: number): boolean { - return ((id === TagId.FurryPreference) || (id === TagId.Orientation) || (id === TagId.SubDomRole) || (id === TagId.PostLength)); + return ((id === TagId.FurryPreference) || (id === TagId.Orientation) || (id === TagId.SubDomRole) || (id === TagId.Position) || (id === TagId.PostLength)); } yourInterestIsRelevant(id: number): boolean {