diff --git a/game/03-JavaScript/ingame.js b/game/03-JavaScript/ingame.js
index 51963585906f75aeae1fa017dd6598f95fdf4688..e02fbd85df4a6f5b550a77f3ec4d1838ac917f8a 100644
--- a/game/03-JavaScript/ingame.js
+++ b/game/03-JavaScript/ingame.js
@@ -650,28 +650,20 @@ function numbersBetween(start, end, step = 1) {
 window.numbersBetween = numbersBetween;
 
 function getRobinLocation() {
-	if (V.NPCName[V.NPCNameList.indexOf("Robin")].init !== 1) {
+	if (C.npc.Robin.init !== 1) {
 		return;
 	} else if (V.robinlocationoverride && V.robinlocationoverride.during.includes(V.hour)) {
 		T.robin_location = V.robinlocationoverride.location;
 	} else if (["docks", "landfill", "dinner", "pillory"].includes(V.robinmissing)) {
 		T.robin_location = V.robinmissing;
 	} else if (!between(V.hour, 7, 20)){ //if hour is 6 or lower, or 21 or higher
-		if (V.NPCName[V.NPCNameList.indexOf("Robin")].lust >= 80 && V.robinromance === 1 && between(V.hour, 21, 23) && !V.daily.robin.sleepMasturbate){
-			return T.robin_location = "sleepMasturbate";
-		} else {
-			return T.robin_location = "sleep";
-		}
+		T.robin_location = "sleep";
 	} else if (V.schoolday === 1 && between(V.hour, 8, 15)) {
-		return (T.robin_location = "school");
-	} else if ((V.weekday === 7 || V.weekday === 1) && between(V.hour, 9, 16) && V.NPCName[V.NPCNameList.indexOf("Robin")].trauma < 80) {
-		if (V.season === "winter") {
-			T.robin_location = "park";
-		} else {
-			T.robin_location = "beach";
-		}
+		T.robin_location = "school";
 	} else if (V.halloween === 1 && between(V.hour, 16, 18) && V.monthday === 31) {
 		T.robin_location = "halloween";
+	} else if ((V.weekday === 7 || V.weekday === 1) && between(V.hour, 9, 16) && C.npc.Robin.trauma < 80) {
+		T.robin_location = (V.season === "winter" ? "park" : "beach");
 	} else {
 		T.robin_location = "orphanage";
 	}
@@ -704,7 +696,6 @@ function getRobinCrossdressingStatus(crossdressLevel) {
 	switch (getRobinLocation()) {
 		case "orphanage":
 		case "sleep":
-		case "sleepMasturbate":
 			if (crossdressLevel >= 2) T.robin_cd = 2;
 			break;
 		case "park":
diff --git a/game/base-system/time.twee b/game/base-system/time.twee
index 571813fd2845ce37716b517ab42396115ed1bcf3..c64f8431c82da1813fa6b994dadd4ff7b6895152 100644
--- a/game/base-system/time.twee
+++ b/game/base-system/time.twee
@@ -564,7 +564,7 @@
 	<</if>>
 	<<if $month is "february" and $monthday gte 7 and $monthday lte 14>>
 		<<set $valentines to 1>>
-	<<else>>
+	<<elseif $valentines is 1>>
 		<<set $valentines to 0>>
 		<<unset $valentines_eden>>
 		<<unset $valentines_eden_bought>>
@@ -573,7 +573,7 @@
 	<</if>>
 	<<if $month is "october" and $monthday gte 21>>
 		<<set $halloween to 1>>
-	<<else>>
+	<<elseif $halloween is 1>>
 		<<set $halloween to 0>>
 		<<unset $halloween_whitney>>
 		<<unset $halloween_whitney_proposed>>
@@ -581,13 +581,13 @@
 		<<if $halloween_robin_costume and C.npc.Robin.outfits and C.npc.Robin.outfits.includes($halloween_robin_costume)>>
 			<<removeNNPCOutfit "Robin" $halloween_robin_costume>>
 		<</if>>
+		<<unset $halloween_robin_scare>>
 		<<unset $halloween_robin_costume>>
 		<<unset $halloween_winter_key>>
 		<<unset $halloween_eden>>
 		<<unset $halloween_eden_bought>>
 		<<unset $halloween_eden_candy_given>>
-		<<if $halloween_trick_NPC>>
-		<</if>>
+		<<unset $halloween_trick_NPC>>
 	<</if>>
 	<<if $month is "november" and $monthday is 2>>
 		<<unset $halloween_kylar>>
@@ -595,11 +595,10 @@
 	<</if>>
 	<<if $month is "december" and $monthday gte 18 and $monthday lte 25>>
 		<<set $christmas to 1>>
-	<<else>>
+	<<elseif $christmas is 1>>
 		<<unset $christmas>>
 		<<unset $christmas_event>>
 		<<unset $christmas_event_2>>
-		<<unset _christmas_event_robin>>
 		<<unset $christmas_gift>>
 		<<unset $christmas_gift_robin>>
 		<<unset $christmas_wrap>>
diff --git a/game/overworld-town/loc-home/main.twee b/game/overworld-town/loc-home/main.twee
index 3226c4639da62c0dcffe01a25faeb00a0932e422..3fb340884215bfd6c9fae40b3129e5e3b4279882 100644
--- a/game/overworld-town/loc-home/main.twee
+++ b/game/overworld-town/loc-home/main.twee
@@ -1042,17 +1042,11 @@ You are in the bathroom.
 				<<if _wakingEffect is "dryheaving">>
 					"Are you okay? Let me help," Robin says, easing you back up. <<He>> checks to see if you're fine before getting up <<himself>>.
 					<<set $phase to 1>>
-				<<elseif _orgasm is true and !$rng lte _robinAwakeChance>>
+				<<elseif _orgasm is true and $rng gt _robinAwakeChance>>
 					<<set $phase to 1>>
 					<<if $exposed gte 2>>
-						Robin cuddles you. "You should go-" <<he>> pauses, noticing the moisture on their body and yours. Blushing, <<he>> gathers tissues for both of you.
-						<<if $rng gte 71>>
-							"I-It's okay," <<he>> says.
-						<<elseif $rng gte 31>>
-							"This might be my fault," <<he>> says.
-						<<else>>
-							"I-I might need a bath," <<he>> says.
-						<</if>>
+						Robin cuddles you. "You should go-" <<he>> pauses, noticing the moisture on <<his>> body and yours. Blushing, <<he>> gathers tissues for both of you.
+						"<<print ["I-It's okay", "This might be my fault", "I-I might need a bath"].random()>>," <<he>> says.
 					<<else>>
 						Robin cuddles you. "You should go ba-" <<he>> pauses, noticing the moist patch around your crotch. Blushing, <<he>> passes you a tissue.
 						"I-It's okay," <<he>> says.
@@ -1596,19 +1590,27 @@ You are in the main hall of the orphanage.
 
 <<if $christmas is 1 and $monthday is 25 and $daystate isnot "night">>
 	The room is alive with festive merriment.
+<<elseif $halloween is 1 and $monthday is 31 and $hour gte 15 and $daystate isnot "night">>
+	<<if !$halloween_robin_costume and !$halloween_robin_scare and ($wraith.state isnot "" and $wraithIntro and $hallucinations gte 1 and $rng lte 70)>>
+		<!-- This event happens if Robin is wearing the ghost costume, but you don't know that it's Robin. -->
+		<!-- The odds are 70% if you meet the conditions, much higher than normal, bc this is a non-repeatable event -->
+		<<set _wraithEvent to true>>
+	<<else>>
+		The room is buzzing with the excitement of costumed orphans.
+	<</if>>
 <<else>>
 	<<if $daystate is "day">>
-	A couple of orphans on cleaning duty sweep the floor.
+		A couple of orphans on cleaning duty sweep the floor.
 	<<elseif $daystate is "dusk">>
-	You hear hushed voices.
+		You hear hushed voices.
 	<<elseif $daystate is "dawn">>
 		<<if $schoolday is 1>>
-		The orphans are heading off to school.
+			The orphans are heading off to school.
 		<<else>>
-		The orphans are leaving to find work.
+			The orphans are leaving to find work.
 		<</if>>
 	<<elseif $daystate is "night">>
-	The orphans must be asleep.
+		The orphans must be asleep.
 	<</if>>
 <</if>>
 
@@ -1711,7 +1713,7 @@ You are in the main hall of the orphanage.
 
 	<<link [[Next|Orphanage]]>><<endevent>><</link>>
 
-<<elseif $days gte 1 and $NPCName[$NPCNameList.indexOf("Robin")].init is 0 and ($schoolday is 1 and ($hour is 7 or $hour gte 16 and $hour lte 20) or $schoolday isnot 1 and $hour gte 7 and $hour lte 20)>>
+<<elseif $days gte 1 and _robin.init is 0 and $hour gte 7 and $hour lte 20 and ($schoolday isnot 1 or !($hour gte 8 and $hour lte 15))>>
 	<<set $robindebt to 0>><<set $robindebtlimit to 5>>
 	<<npc Robin>><<initnpc Robin>><<person1>>You hear a voice shout behind you. "Hey!" It's Robin. <<Hes>> another resident at the orphanage. <<Hes>> always looked up to you, despite being about the same age. <<He>> runs towards you and fails to slow down in time, colliding with you and almost falling over. You hold <<his>> arm to steady <<him>>. "Thanks," <<he>> says, looking embarrassed though still smiling.
 	<br><br>
@@ -1748,7 +1750,7 @@ You are in the main hall of the orphanage.
 
 	<<link [[Next|Orphanage]]>><<endevent>><</link>>
 	<br>
-<<elseif $christmas is 1 and $monthday is 25 and $robinmissing is 0 and $NPCName[$NPCNameList.indexOf("Robin")].init is 1 and $christmas_robin_gift_received is undefined and $hour gte 7>>
+<<elseif $christmas is 1 and $monthday is 25 and $robinmissing is 0 and _robin.init is 1 and $christmas_robin_gift_received is undefined and $hour gte 7>>
 	<<set $christmas_robin_gift_received to true>>
 	You spot a present laid under the tree with your name on it. It's from Robin.
 	<br><br>
@@ -1776,6 +1778,24 @@ and !$fromRobinRoom and _robin.cdquest is 2 and _robin.trauma lte 20 and !$daily
 	<br>
 	<<link [[Ignore|Orphanage]]>><<endevent>><</link>>
 <<else>>
+	<<if $halloween is 1 and $monthday is 31 and !$fromRobinRoom and $robinmissing is 0 and $hour gte 16 and $hour lt 19 and _robin.init is 1>>
+		<<if $halloween_robin_costume>>
+			You see Robin, dressed as a $halloween_robin_costume and surrounded by excited orphans.
+		<<elseif _wraithEvent>>
+			You see someone wearing a bedsheet over their head. They're completely motionless, and the hall is empty and silent. <span class="red">The bedsheet is a terrible, familiar pale.</span>
+			<br><br>
+
+			<span class="wraith">"Trick or treat."</span>
+			<br><br>
+
+			You stumble backwards and shriek, and in a single blink, the hall changes completely. Now you see Robin, surrounded by excited orphans and holding <<nnpc_his "Robin">> bedsheet in <<nnpc_his "Robin">> arms, looking at both you and the bedsheet with utter confusion in <<nnpc_his "Robin">> eyes.
+		<<else>>
+			You see someone wearing a bedsheet over their head. They're surrounded by excited orphans.
+		<</if>>
+		<br><br>
+		<<ind>><<link [[Approach them|Robin Trick Hall]]>><</link>>
+		<br><br>
+	<</if>>
 	<<if $police_hack is 2 and ($pub_hack_job is 1 or $pub_hack_job is 2)>>
 		<<ind>><<link [[Find hacker (0:10)|Orphanage Hacker]]>><<pass 10>><</link>>
 		<br><br>
@@ -1787,18 +1807,6 @@ and !$fromRobinRoom and _robin.cdquest is 2 and _robin.trauma lte 20 and !$daily
 		<<ind>><<link [[Decide what to do with Kylar's camera (0:05)|Orphanage Kylar Camera]]>><<pass 5>><</link>>
 		<br><br>
 	<</if>>
-	<<if $halloween is 1 and $robinmissing is 0 and $hour gte 16 and $hour lt 19 and $monthday is 31 and $NPCName[$NPCNameList.indexOf("Robin")].init is 1>>
-		<<if $halloween_robin_costume is "witch">>
-			You see Robin, dressed as a witch and surrounded by excited orphans.
-		<<elseif $halloween_robin_costume is "vampire">>
-			You see Robin, dressed as a vampire and surrounded by excited orphans.
-		<<else>>
-			You see someone wearing a bedsheet over their head. They're surrounded by excited orphans.
-		<</if>>
-		<br><br>
-		<<ind>><<link [[Go trick-or-treating|Robin Trick Hall]]>><</link>>
-		<br>
-	<</if>>
 	<<if $christmas is 1 and $monthday is 25 and $daystate isnot "night" and $exposed lte 0>>
 		<<ind>><<link [[Celebrate Christmas (1:00)|Orphanage Christmas]]>><<pass 60>><<trauma -12>><<stress -6>><</link>><<lltrauma>><<lstress>>
 		<br>
@@ -1807,7 +1815,7 @@ and !$fromRobinRoom and _robin.cdquest is 2 and _robin.trauma lte 20 and !$daily
 	<br><br>
 	<<officeicon>><<link [[Bailey's office (0:01)|Bailey's Office]]>><<pass 1>><</link>>
 	<br>
-	<<if $hour gte 18 and $hour lte 20 and $NPCName[$NPCNameList.indexOf("Robin")].trauma gte 40 and $robinmissing is 0 and !$robinTraumaVisit>>
+	<<if $hour gte 18 and $hour lte 20 and _robin.trauma gte 40 and $robinmissing is 0 and !$robinTraumaVisit>>
 		<<bedroomicon>><<link [[Bedroom (0:01)|Robin Trauma Visit]]>><<set $phase to 0>><<pass 1>><</link>>
 		<br>
 	<<elseif $kylar.timer.home gte 100 and $kylar.home is undefined>>
@@ -1822,7 +1830,7 @@ and !$fromRobinRoom and _robin.cdquest is 2 and _robin.trauma lte 20 and !$daily
 	<</if>>
 	<<bathroomicon>><<link [[Bathroom (0:01)->Bathroom]]>><<pass 1>><</link>>
 	<br>
-	<<if $NPCName[$NPCNameList.indexOf("Robin")].init is 1 and $exposed lte 0>>
+	<<if _robin.init is 1 and $exposed lte 0>>
 		<<bedroomicon>><<link [[Robin's room (0:01)|Robin's Room Entrance]]>><<pass 1>><</link>>
 		<br>
 	<</if>>
diff --git a/game/overworld-town/loc-shop/widgets.twee b/game/overworld-town/loc-shop/widgets.twee
index 78b22fa903ae2d898c2336c3578f0463a4753da5..330912dff4b334b2bf2851207d4e5d98abd0d419 100644
--- a/game/overworld-town/loc-shop/widgets.twee
+++ b/game/overworld-town/loc-shop/widgets.twee
@@ -991,11 +991,22 @@ Name: <input id="colorName" type="text" value="Custom" maxlength="30" onfocus="V
 		"mummyfacewrap":"locked",
 		"mummytop":"locked",
 		"mummyskirt":"locked",
+		"cowbell":"locked",
+		"featheredhairclip":"locked",
 		"catsuit":"locked",
 		"holystole":"locked",
-		"minisnowman":"locked"
+		"minisnowman":"locked",
+		"cowbra":"locked",
+		"cowpanties":"locked",
+		"cowsocks":"locked",
+		"cowsleeves":"locked",
+		"bellydancer'sveil":"locked",
+		"rose":"locked",
+		"scarecrowshirt":"locked",
+		"scarecrowhat":"locked",
 	}>>
 <</if>>
+<!-- the following lines are for backwards compatibility with older saves. if you want to add a new item, add it above as well. -->
 <<if $specialClothes.cowbell is undefined>>
 	<<set $specialClothes.cowbell to "locked">>
 <</if>>
@@ -1036,7 +1047,7 @@ Name: <input id="colorName" type="text" value="Custom" maxlength="30" onfocus="V
 <<if $undergroundbrothelescaped>>
 	<<set $specialClothes["slutshirt"] to "unlocked">>
 <</if>>
-<<if $yeardays gte 47 and $yeardays lte 90>>
+<<if $halloween is 1>>
 	<<set $specialClothes["witchdress"] to "unlocked">>
 	<<set $specialClothes["vampirejacket"] to "unlocked">>
 	<<set $specialClothes["witchhat"] to "unlocked">>
@@ -1047,7 +1058,7 @@ Name: <input id="colorName" type="text" value="Custom" maxlength="30" onfocus="V
 	<<set $specialClothes["scarecrowshirt"] to "unlocked">>
 	<<set $specialClothes["scarecrowhat"] to "unlocked">>
 <</if>>
-<<if $yeardays gte 102 and $yeardays lte 181>>
+<<if $christmas is 1>>
 	<<set $specialClothes["christmasdress"] to "unlocked">>
 	<<set $specialClothes["christmasshirt"] to "unlocked">>
 	<<set $specialClothes["christmastrousers"] to "unlocked">>
@@ -1055,7 +1066,7 @@ Name: <input id="colorName" type="text" value="Custom" maxlength="30" onfocus="V
 	<<set $specialClothes["christmaslegwarmers"] to "unlocked">>
 	<<set $specialClothes["minisnowman"] to "unlocked">>
 <</if>>
-<<if $yeardays gte 156 and $yeardays lte 181>>
+<<if $valentines is 1>>
 	<<set $specialClothes["rose"] to "unlocked">>
 <</if>>
 <<if $brothelshowdata.intro>>
@@ -1097,13 +1108,8 @@ Name: <input id="colorName" type="text" value="Custom" maxlength="30" onfocus="V
 <<if $grace gte 100>>
 	<<set $specialClothes["holystole"] to "unlocked">>
 <</if>>
-<<set _count to 0>>
-<<for $_label, $_value range $specialClothes>>
-	<<if $_value is "unlocked">>
-		<<set _count++>>
-	<</if>>
-<</for>>
-<<if _count is Object.keys($specialClothes).length>>
+
+<<if Object.values($specialClothes).every(item => item is "unlocked")>>
 	<<earnFeat "Curious Attire">>
 <</if>>
 /*Fix for previous save issue when starting without the specialClothing boost, should not be adjusted unless a similar issue occurs*/
@@ -1152,18 +1158,18 @@ Name: <input id="colorName" type="text" value="Custom" maxlength="30" onfocus="V
 <<if _specialClothesHint is undefined>>
 	<<set _specialClothesHint to {
 		"witchdress":"In stock from the 21st of October.",
-		"christmasdress":"In stock from the 15th of December.",
+		"christmasdress":"In stock from the 18th of December.",
 		"serafuku":"Discover the headteacher's secret.",
 		"vampirejacket":"In stock from the 21st of October.",
 		"slutshirt":"Survive slavery in an underground brothel.",
-		"christmasshirt":"In stock from the 15th of December.",
+		"christmasshirt":"In stock from the 18th of December.",
 		"bellydancer'stop":"Be offered the star role in a show at the brothel.",
-		"christmastrousers":"In stock from the 15th of December.",
+		"christmastrousers":"In stock from the 18th of December.",
 		"bellydancer'sbottoms":"Be offered the star role in a show at the brothel.",
 		"bellydancer'sveil":"Be offered the star role in a show at the brothel.",
 		"loincloth":"Befriend a lonely hunter, or join a pack of wolves.",
 		"witchhat":"In stock from the 21st of October.",
-		"christmashat":"In stock from the 15th of December.",
+		"christmashat":"In stock from the 18th of December.",
 		"chefhat":"Become famous for your cream buns.",
 		"fedora":"Eavesdrop as a bartender and learn about a criminal undertaking.",
 		"holypendant":"Discover the soup kitchen.",
@@ -1174,7 +1180,7 @@ Name: <input id="colorName" type="text" value="Custom" maxlength="30" onfocus="V
 		"cowpanties":"Become livestock.",
 		"cowsocks":"Become livestock.",
 		"cowsleeves":"Become livestock.",
-		"christmaslegwarmers":"In stock from the 15th of December.",
+		"christmaslegwarmers":"In stock from the 18th of December.",
 		"witchshoes":"In stock from the 21st of October.",
 		"mummyfacewrap":"In stock from the 21st of October.",
 		"mummytop":"In stock from the 21st of October.",
@@ -1182,7 +1188,7 @@ Name: <input id="colorName" type="text" value="Custom" maxlength="30" onfocus="V
 		"featheredhairclip":"Romance an avian.",
 		"catsuit":"Pillage a shipment.",
 		"holystole":"Requires sufficient devotion.",
-		"minisnowman":"In stock from the 15th of December.",
+		"minisnowman":"In stock from the 18th of December.",
 		"rose":"In stock from the 7th of February.",
 		"scarecrowshirt":"In stock from the 21st of October.",
 		"scarecrowhat":"In stock from the 21st of October."
diff --git a/game/overworld-town/special-robin/main.twee b/game/overworld-town/special-robin/main.twee
index b6675cde0c60dd75ae25bac49cbcd3922d352492..29ee606a88f82c16e3738291b563557e7bdeaf82 100644
--- a/game/overworld-town/special-robin/main.twee
+++ b/game/overworld-town/special-robin/main.twee
@@ -1,6 +1,6 @@
 :: Robin's Room Entrance
 <<set $outside to 0>><<set $location to "home">><<effects>>
-<<run statusCheck("Robin")>>
+<<set _robin to statusCheck("Robin")>>
 
 <<if $robindebt gte $robindebtlimit and $robindebtintro isnot 1 and $robinpaid isnot 1>>
 	<<set $robinconsole to 0>>
@@ -52,23 +52,24 @@
 	<br>
 <<elseif _robin_location is "sleep">>
 	You go to Robin's room. There's a note on the door. "Sleeping!"
-	<br><br>
+	<<if _robin.lust gte 80 and $robinromance is 1 and between($hour, 21, 23) and !$daily.robin.sleepMasturbate>>
+		<<set $daily.robin.sleepMasturbate to true>>
+		<span class="lewd">You notice the door is slightly open.</span>
+		<br><br>
 
-	<<link [[Leave|Orphanage]]>><</link>>
-	<br>
+		<<link [[Take a peek|Robin Mischief]]>><</link>>
+		<br>
+		<<link [[Close the door|Robin Mischief Close]]>><</link>>
+	<<else>>
+		<br><br>
+
+		<<link [[Leave|Orphanage]]>><</link>>
+	<</if>>
+	<br>	
 	<<if $debug is 1>>
 		<<link [[Wait for Robin (DEBUG)|$passage]]>><<set _rem to ($time lt 420 ? (420 - $time) : (1440 - $time + 420))>><<pass _rem>><</link>>
 	<</if>>
 
-<<elseif _robin_location is "sleepMasturbate">>
-	<<set $daily.robin.sleepMasturbate to true>>
-	You go to Robin's room. There's a note on the door. "Sleeping!" <span class="lewd">You notice the door is slightly open.</span>
-	<br><br>
-
-	<<link [[Take a peek|Robin Mischief]]>><</link>>
-	<br>
-	<<link [[Close the door|Robin Mischief Close]]>><</link>>
-	<br>
 <<elseif _robin_location is "beach">>
 	You go to Robin's room. There's a note on the door. "Out selling lemonade!"
 	<br><br>