[ PutOnSub ancestor; receive_action=##PutOn; if (second == d_obj || player in second) <>; if (parent(noun)~=player) return L__M(##PutOn,1,noun); ancestor = CommonAncestor(noun, second); if (ancestor == noun) return L__M(##PutOn,2,noun); if (ObjectIsUntouchable(second)) return; if (second ~= ancestor) { action=##Receive; if (RunRoutines(second,before)~=0) { action=##PutOn; return; } action=##PutOn; } if (second hasnt supporter) return L__M(##PutOn,3,second); if (ancestor == player) return L__M(##PutOn,4); if (noun has worn) { L__M(##PutOn,5,noun); ; if (noun has worn) return; } if (children(second)>=ValueOrRun(second,capacity)) return L__M(##PutOn,6,second); move noun to second; if (AfterRoutines()==1) return; if (second ~= ancestor) { action=##Receive; if (RunRoutines(second,after)~=0) { action=##PutOn; return; } action=##PutOn; } if (keep_silent==1) return; if (multiflag==1) return L__M(##PutOn,7); L__M(##PutOn,8,noun); ];