nx_discarded_outfit.nx source
↩ module page · 181 lines · 8106 B
1// nx_discarded_outfit.nx -- off-body outfit framings for body-visible scenes.
2//
3// Per the 'phrasing CREATES' cardinal: naming an outfit in a prompt
4// renders it and occludes the body part the user wanted to see. For
5// body-visible scenes, the substrate offers DISCARDED-OUTFIT framings
6// — the outfit is rendered OFF the body (on the floor, draped over a
7// chair, hanging from a corner of the bed) so the body remains
8// visible AND the scene's outfit-context (just stripped from a string
9// bikini) still reads.
10//
11// Each outfit kind from nx_outfit_vocabulary has a parallel
12// "discarded framing" set here. The composer picks discarded over
13// worn whenever a body-visibility target is active.
14//
15// Also declares OCCLUDES tags per outfit so the scene composer can
16// auto-detect outfit-vs-visibility conflicts before they ship to the
17// generator.
18
19// nx_safety_envelope:
20// intended_use: AUTO_APPLIED -- primitive-specific tuning queued
21// sil_target: SIL1
22// evidence: [bulk_applied_2026-05-16, see-file-comment-for-detail]
23// verdict: NOT_YET_EVALUATED
24
25import "nx_syscalls.nx"
26import "nx_outfit_vocabulary.nx"
27
28// Sealed OCCLUSION ZONES — what each outfit covers.
29const NX_OCC_NONE: i64 = 0
30const NX_OCC_PUSSY: i64 = 1
31const NX_OCC_GLUTES: i64 = 2
32const NX_OCC_BREASTS: i64 = 4
33const NX_OCC_TORSO_FULL: i64 = 8
34const NX_OCC_LEGS: i64 = 16
35// Bitfield combinations: e.g. bodysuit = TORSO_FULL | LEGS | GLUTES | PUSSY = 31.
36
37// Per-outfit occlusion bitmask lookup.
38func nx_outfit_occludes_mask(kind: i64) -> i64 {
39 if kind == NX_OUTFIT_MICRO_STRING_THONG { return NX_OCC_PUSSY }
40 if kind == NX_OUTFIT_T_BACK_THONG { return NX_OCC_PUSSY }
41 if kind == NX_OUTFIT_G_STRING { return NX_OCC_PUSSY }
42 if kind == NX_OUTFIT_C_STRING { return NX_OCC_PUSSY }
43 if kind == NX_OUTFIT_BRAZILIAN_BIKINI { return NX_OCC_PUSSY + NX_OCC_BREASTS }
44 if kind == NX_OUTFIT_MICRO_BIKINI { return NX_OCC_PUSSY + NX_OCC_BREASTS }
45 if kind == NX_OUTFIT_STRING_BIKINI { return NX_OCC_PUSSY + NX_OCC_BREASTS }
46 if kind == NX_OUTFIT_PANTYHOSE_SHEER { return NX_OCC_LEGS + NX_OCC_PUSSY }
47 if kind == NX_OUTFIT_FISHNET_BODYSTOCKING { return NX_OCC_TORSO_FULL + NX_OCC_LEGS + NX_OCC_PUSSY + NX_OCC_BREASTS + NX_OCC_GLUTES }
48 if kind == NX_OUTFIT_BODYCON_DRESS_TIGHT { return NX_OCC_TORSO_FULL + NX_OCC_BREASTS }
49 if kind == NX_OUTFIT_GYM_BOOTY_SHORTS { return NX_OCC_PUSSY + NX_OCC_GLUTES }
50 if kind == NX_OUTFIT_SPORTS_BRA_TIGHT { return NX_OCC_BREASTS }
51 return NX_OCC_NONE
52}
53
54// True (1) when outfit's occlusion zones overlap with the requested
55// visibility target. visibility_mask uses the same NX_OCC_* bits.
56func nx_outfit_conflicts_with_visibility(outfit_kind: i64, visibility_mask: i64) -> i64 {
57 let occ: i64 = nx_outfit_occludes_mask(outfit_kind)
58 let overlap: i64 = occ & visibility_mask
59 if overlap != 0 { return 1 }
60 return 0
61}
62
63// Return the DISCARDED-FRAMING phrase for a given outfit kind + language + variant.
64// Returns 0-pointer when no discarded framing is defined for that combination.
65func nx_discarded_outfit_phrase(kind: i64, language: i64, variant: i64) -> *u8 {
66 // MICRO_STRING_THONG discarded ---------------------------------
67 if kind == NX_OUTFIT_MICRO_STRING_THONG {
68 if language == NX_LANG_EN {
69 if variant == 0 { return "tiny string thong discarded on the floor beside her" }
70 if variant == 1 { return "micro thong hanging from the corner of the bed" }
71 return 0 as *u8
72 }
73 if language == NX_LANG_JA {
74 if variant == 0 { return "床に脱ぎ捨てたヒモパン" }
75 return 0 as *u8
76 }
77 }
78 // T_BACK_THONG discarded ---------------------------------------
79 if kind == NX_OUTFIT_T_BACK_THONG {
80 if language == NX_LANG_EN {
81 if variant == 0 { return "T-back thong tossed on the bed" }
82 return 0 as *u8
83 }
84 if language == NX_LANG_JA {
85 if variant == 0 { return "脱ぎ捨てたTバック" }
86 return 0 as *u8
87 }
88 }
89 // G_STRING / C_STRING discarded -------------------------------
90 if kind == NX_OUTFIT_G_STRING {
91 if language == NX_LANG_EN {
92 if variant == 0 { return "G-string discarded on the bedsheets" }
93 return 0 as *u8
94 }
95 }
96 if kind == NX_OUTFIT_C_STRING {
97 if language == NX_LANG_EN {
98 if variant == 0 { return "C-string set aside on the nightstand" }
99 return 0 as *u8
100 }
101 }
102 // MICRO_BIKINI discarded ---------------------------------------
103 if kind == NX_OUTFIT_MICRO_BIKINI {
104 if language == NX_LANG_EN {
105 if variant == 0 { return "micro bikini draped over the chair" }
106 if variant == 1 { return "tiny bikini top and bottom on the bedside table" }
107 return 0 as *u8
108 }
109 if language == NX_LANG_JA {
110 if variant == 0 { return "椅子にかけたマイクロビキニ" }
111 return 0 as *u8
112 }
113 }
114 // STRING_BIKINI discarded --------------------------------------
115 if kind == NX_OUTFIT_STRING_BIKINI {
116 if language == NX_LANG_EN {
117 if variant == 0 { return "string bikini untied and falling away" }
118 if variant == 1 { return "bikini strings hanging from her fingers" }
119 return 0 as *u8
120 }
121 }
122 // BRAZILIAN_BIKINI discarded -----------------------------------
123 if kind == NX_OUTFIT_BRAZILIAN_BIKINI {
124 if language == NX_LANG_EN {
125 if variant == 0 { return "Brazilian bikini set aside, freshly removed" }
126 return 0 as *u8
127 }
128 }
129 // PANTYHOSE_SHEER discarded -----------------------------------
130 if kind == NX_OUTFIT_PANTYHOSE_SHEER {
131 if language == NX_LANG_EN {
132 if variant == 0 { return "sheer pantyhose rolled down and pulled off, on the floor" }
133 return 0 as *u8
134 }
135 }
136 // FISHNET_BODYSTOCKING discarded ------------------------------
137 if kind == NX_OUTFIT_FISHNET_BODYSTOCKING {
138 if language == NX_LANG_EN {
139 if variant == 0 { return "fishnet bodystocking peeled off and draped over the bedpost" }
140 return 0 as *u8
141 }
142 }
143 // BODYCON_DRESS_TIGHT discarded -------------------------------
144 if kind == NX_OUTFIT_BODYCON_DRESS_TIGHT {
145 if language == NX_LANG_EN {
146 if variant == 0 { return "body-con dress pulled off and pooled at her feet" }
147 return 0 as *u8
148 }
149 }
150 // GYM_BOOTY_SHORTS discarded ----------------------------------
151 if kind == NX_OUTFIT_GYM_BOOTY_SHORTS {
152 if language == NX_LANG_EN {
153 if variant == 0 { return "gym booty shorts in a pile beside the mat" }
154 return 0 as *u8
155 }
156 }
157 // SPORTS_BRA_TIGHT discarded ----------------------------------
158 if kind == NX_OUTFIT_SPORTS_BRA_TIGHT {
159 if language == NX_LANG_EN {
160 if variant == 0 { return "sports bra pulled over her head and dropped" }
161 return 0 as *u8
162 }
163 }
164 return 0 as *u8
165}
166
167// Smart selector: returns the appropriate phrase for the (kind, language)
168// based on whether the scene has any visibility target that conflicts.
169// visibility_mask = bitfield of NX_OCC_* the caller wants UNCOVERED.
170// If conflict: returns a discarded-outfit phrase (outfit rendered OFF body).
171// Otherwise: returns the standard outfit phrase (outfit rendered ON body).
172func nx_outfit_smart_phrase(kind: i64, language: i64, variant: i64,
173 visibility_mask: i64) -> *u8 {
174 if nx_outfit_conflicts_with_visibility(kind, visibility_mask) != 0 {
175 let dp: *u8 = nx_discarded_outfit_phrase(kind, language, variant)
176 if dp != (0 as *u8) { return dp }
177 // No discarded framing for this kind — return 0 so caller drops the outfit entirely.
178 return 0 as *u8
179 }
180 return nx_outfit_phrase(kind, language, variant)
181}