nx_outfit_sexiness.nx source
↩ module page · 82 lines · 3597 B
1// nx_outfit_sexiness.nx -- outfit sexiness ladder INDEPENDENT of explicit visibility.
2//
3// Distinct from nx_eroticism_ladder (which is about pose + nudity +
4// penetration). An outfit can be SEXY without being explicit: a tight
5// cocktail dress with deep V is sexy but not nude; a sheer bodysuit
6// shows skin without being penetrative; a thong + sports bra is
7// revealing but neutral pose.
8//
9// 6-rank sealed ladder:
10// MODEST_COVERED turtleneck / long sleeves / loose
11// CASUAL jeans + tee / standard daywear
12// STYLISH fitted / accessorized / curated
13// SEDUCTIVE lingerie / sheer / low-cut / bodycon
14// PROVOCATIVE micro outfit / minimal coverage
15// EXPLICIT no fabric where it would normally cover
16
17// nx_safety_envelope:
18// intended_use: AUTO_APPLIED -- primitive-specific tuning queued
19// sil_target: SIL1
20// evidence: [bulk_applied_2026-05-16, see-file-comment-for-detail]
21// verdict: NOT_YET_EVALUATED
22
23import "nx_syscalls.nx"
24
25const NX_SEXY_MODEST_COVERED: i64 = 1
26const NX_SEXY_CASUAL: i64 = 2
27const NX_SEXY_STYLISH: i64 = 3
28const NX_SEXY_SEDUCTIVE: i64 = 4
29const NX_SEXY_PROVOCATIVE: i64 = 5
30const NX_SEXY_EXPLICIT: i64 = 6
31
32const NX_SEXY_RES_MEASURED: i64 = 0
33const NX_SEXY_RES_DECLARED: i64 = 1
34const NX_SEXY_RES_DELTA: i64 = 2
35const NX_SEXY_RES_VERDICT: i64 = 3
36const NX_SEXY_RES_FIELDS: i64 = 4
37
38const NX_SEXY_V_SEVERE_UNDER: i64 = 0
39const NX_SEXY_V_UNDERSHOOT: i64 = 1
40const NX_SEXY_V_MATCH: i64 = 2
41const NX_SEXY_V_OVERSHOOT: i64 = 3
42const NX_SEXY_V_SEVERE_OVER: i64 = 4
43
44// Classify measured sexiness from typed outfit attributes.
45// coverage_pct 0..100 — how much skin is covered by fabric
46// fit_tightness_q10 0..1024 — loose..bodycon-skintight
47// sheer_pct 0..100 — fabric transparency where present
48// cut_drama_q10 0..1024 — neckline depth / slit height / cut-out total
49func nx_sexy_classify_measured(coverage_pct: i64, fit_q10: i64,
50 sheer_pct: i64, cut_drama_q10: i64) -> i64 {
51 // Score = (100 - coverage_pct) + fit/4 + sheer + cut/4 — proxy for sexiness intensity.
52 let intensity: i64 = (100 - coverage_pct) + fit_q10 / 4 + sheer_pct + cut_drama_q10 / 4
53
54 if intensity < 30 { return NX_SEXY_MODEST_COVERED }
55 if intensity < 80 { return NX_SEXY_CASUAL }
56 if intensity < 160 { return NX_SEXY_STYLISH }
57 if intensity < 260 { return NX_SEXY_SEDUCTIVE }
58 if intensity < 380 { return NX_SEXY_PROVOCATIVE }
59 return NX_SEXY_EXPLICIT
60}
61
62// Validate measured vs declared sexiness target.
63func nx_outfit_sexiness_validate(declared_kind: i64, coverage_pct: i64,
64 fit_q10: i64, sheer_pct: i64,
65 cut_drama_q10: i64, result: *i64) -> i64 {
66 var i: i64 = 0
67 while i < NX_SEXY_RES_FIELDS { result[i] = 0; i = i + 1 }
68
69 let measured: i64 = nx_sexy_classify_measured(coverage_pct, fit_q10, sheer_pct, cut_drama_q10)
70 let delta: i64 = measured - declared_kind
71 result[NX_SEXY_RES_MEASURED] = measured
72 result[NX_SEXY_RES_DECLARED] = declared_kind
73 result[NX_SEXY_RES_DELTA] = delta
74
75 var verdict: i64 = NX_SEXY_V_MATCH
76 if delta <= -2 { verdict = NX_SEXY_V_SEVERE_UNDER }
77 if delta == -1 { verdict = NX_SEXY_V_UNDERSHOOT }
78 if delta == 1 { verdict = NX_SEXY_V_OVERSHOOT }
79 if delta >= 2 { verdict = NX_SEXY_V_SEVERE_OVER }
80 result[NX_SEXY_RES_VERDICT] = verdict
81 return 0
82}