code wiki / (root) / nx_discarded_outfit.nx

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}