--- tinymush-3.2-orig/src/attrs.h	2008-10-25 15:35:10.000000000 -0700
+++ tinymush-3.2/src/attrs.h	2013-04-08 13:45:12.000000000 -0700
@@ -203,6 +203,13 @@
 #define	ATR_BUF_CHUNK	100	/* Min size to allocate for attribute buffer */
 #define	ATR_BUF_INCR	6	/* Max size of one attribute */
 
+/* Additions for custom pronouns -- Orville, 09-FEB-2013 */
+#define A_ABS       901
+#define A_OBJ       902
+#define A_POS       903
+#define A_SUBJ      904
+
+
 #define Print_Attr_Flags(a,b,p) \
 	p = b; \
 	if (a & AF_LOCK) *p++ = '+'; \
--- tinymush-3.2-orig/src/db.c	2009-02-21 12:58:58.000000000 -0800
+++ tinymush-3.2/src/db.c	2013-04-08 13:45:12.000000000 -0700
@@ -213,6 +213,7 @@ extern void FDECL(desc_reload, (dbref));
 ATTR attr[] =
 {
 {"Aahear",	A_AAHEAR,	AF_DEFAULT|AF_NOPROG,			NULL},
+{"AbsPossessive",		A_ABS,	AF_VISUAL|AF_NOPROG,			NULL},
 {"Aclone",	A_ACLONE,	AF_DEFAULT|AF_NOPROG,			NULL},
 {"Aconnect",	A_ACONNECT,	AF_DEFAULT|AF_NOPROG,			NULL},
 {"Adesc",	A_ADESC,	AF_DEFAULT|AF_NOPROG,			NULL},
@@ -313,6 +314,7 @@ ATTR attr[] =
 {"Nameformat",	A_NAME_FMT,	AF_DEFAULT|AF_NOPROG,			NULL},
 {"Newobjs",	A_NEWOBJS,	AF_MDARK|AF_NOPROG|AF_GOD|AF_NOCMD|AF_NOCLONE,
 								NULL},
+{"Objective",		A_OBJ,	AF_VISUAL|AF_NOPROG,			NULL},
 {"Odesc",	A_ODESC,	AF_DEFAULT|AF_NOPROG,			NULL},
 {"Odfail",	A_ODFAIL,	AF_DEFAULT|AF_NOPROG,			NULL},
 {"Odrop",	A_ODROP,	AF_DEFAULT|AF_NOPROG,			NULL},
@@ -340,6 +342,7 @@ ATTR attr[] =
 {"PageLock",	A_LPAGE,	AF_NOPROG|AF_NOCMD|AF_IS_LOCK,	NULL},
 {"ParentLock",	A_LPARENT,	AF_NOPROG|AF_NOCMD|AF_IS_LOCK,	NULL},
 {"Pay",		A_PAY,		AF_NOPROG,			NULL},
+{"Possessive",		A_POS,	AF_VISUAL|AF_NOPROG,			NULL},
 {"Prefix",	A_PREFIX,	AF_NOPROG,			NULL},
 {"Progcmd",	A_PROGCMD,	AF_DARK|AF_NOPROG|AF_NOCMD|AF_INTERNAL,
 								NULL},
@@ -360,6 +363,7 @@ ATTR attr[] =
 {"Speechformat",A_SPEECHFMT,	AF_DEFAULT|AF_NOPROG,		NULL},
 {"SpeechLock",	A_LSPEECH,	AF_NOPROG|AF_NOCMD|AF_IS_LOCK,	NULL},
 {"Startup",	A_STARTUP,	AF_NOPROG,			NULL},
+{"Subjective",		A_SUBJ,	AF_VISUAL|AF_NOPROG,			NULL},
 {"Succ",	A_SUCC,		AF_DEFAULT|AF_NOPROG,			NULL},
 {"TeloutLock",	A_LTELOUT,	AF_NOPROG|AF_NOCMD|AF_IS_LOCK,	NULL},
 {"Tfail",	A_TFAIL,	AF_DEFAULT|AF_NOPROG,			NULL},
--- tinymush-3.2-orig/src/eval.c	2010-05-10 11:54:22.000000000 -0700
+++ tinymush-3.2/src/eval.c	2013-04-08 13:45:12.000000000 -0700
@@ -874,47 +874,71 @@ char *cargs[];
 				break;
 			case 'O':	/* Objective pronoun */
 			case 'o':
-				if (gender < 0)
-					gender = get_gender(cause);
-				if (!gender)
-					safe_name(cause, buff, bufc);
-				else
-					safe_str((char *)obj[gender],
-						 buff, bufc);
-				break;
+			    atr_gotten = atr_pget(cause, A_OBJ, &aowner, &aflags, &alen);
+			    if (*atr_gotten != '\0') {
+			        safe_str(atr_gotten, buff, bufc);
+			    } else {
+				    if (gender < 0)
+					    gender = get_gender(cause);
+				    if (!gender)
+					    safe_name(cause, buff, bufc);   
+				    else
+					    safe_str((char *)obj[gender],
+						         buff, bufc);
+			    }
+			    free_lbuf(atr_gotten);
+			    break;
 			case 'P':	/* Personal pronoun */
 			case 'p':
-				if (gender < 0)
-					gender = get_gender(cause);
-				if (!gender) {
+			    atr_gotten = atr_pget(cause, A_POS, &aowner, &aflags, &alen);
+			    if (*atr_gotten != '\0') {
+			        safe_str(atr_gotten, buff, bufc);
+			    } else {
+				    if (gender < 0)
+					    gender = get_gender(cause);
+				    if (!gender) {
 				        safe_name(cause, buff, bufc);
-					safe_chr('s', buff, bufc);
-				} else {
-					safe_str((char *)poss[gender],
-						 buff, bufc);
+					    safe_chr('s', buff, bufc);
+				    } else {
+					    safe_str((char *)poss[gender],
+						        buff, bufc);
+				    }
 				}
+			        free_lbuf(atr_gotten);
 				break;
 			case 'S':	/* Subjective pronoun */
 			case 's':
-				if (gender < 0)
-					gender = get_gender(cause);
-				if (!gender)
-					safe_name(cause, buff, bufc);
-				else
-					safe_str((char *)subj[gender],
-						 buff, bufc);
+			    atr_gotten = atr_pget(cause, A_SUBJ, &aowner, &aflags, &alen);
+			    if (*atr_gotten != '\0') {
+			        safe_str(atr_gotten, buff, bufc);
+			    } else {
+				    if (gender < 0)
+					    gender = get_gender(cause);
+				    if (!gender)
+					    safe_name(cause, buff, bufc);
+				    else
+					    safe_str((char *)subj[gender],
+						        buff, bufc);
+				}
+			        free_lbuf(atr_gotten);
 				break;
 			case 'A':	/* Absolute possessive */
 			case 'a':	/* idea from Empedocles */
-				if (gender < 0)
-					gender = get_gender(cause);
-				if (!gender) {
+			    atr_gotten = atr_pget(cause, A_ABS, &aowner, &aflags, &alen);
+			    if (*atr_gotten != '\0') {
+			        safe_str(atr_gotten, buff, bufc);
+			    } else {
+				    if (gender < 0)
+					    gender = get_gender(cause);
+				    if (!gender) {
 				        safe_name(cause, buff, bufc);
-					safe_chr('s', buff, bufc);
-				} else {
-					safe_str((char *)absp[gender],
-						 buff, bufc);
+					    safe_chr('s', buff, bufc);
+				    } else {
+					    safe_str((char *)absp[gender],
+						    buff, bufc);
+				    }
 				}
+			        free_lbuf(atr_gotten);
 				break;
 			case '#':	/* Invoker DB number */
 				safe_dbref(buff, bufc, cause);
--- tinymush-3.2-orig/src/player.c	2008-01-08 15:35:24.000000000 -0800
+++ tinymush-3.2/src/player.c	2013-04-08 13:45:13.000000000 -0700
@@ -193,12 +193,26 @@ const char *password;
 	dbref aowner;
 	int aflags, alen;
 	char *target;
+	char salt[6];
 
 	target = atr_get(player, A_PASS, &aowner, &aflags, &alen);
+
+    /* Because our database has moved around a lot, and because MUSHes
+       use the system defaults for crypt(), we have three kinds of hashes:
+       MD5 hashes marked with "$1$", unmarked MD5 hashes, and unmarked DES
+       hashes.  -- Orville, 10-FEB-2013. */
+    if (strncmp( target, "$1$", 3 ) == 0) strcpy(salt, "$1$XX");
+ 	else strcpy(salt, "XX");
+
+    crypt_set_format("des");    /* Try DES first. */
 	if (*target && strcmp(target, password) &&
-	    strcmp(crypt(password, "XX"), target)) {
-		free_lbuf(target);
-		return 0;
+	    strcmp(crypt(password, salt), target)) {
+	    /* No good?  Then try MD5. */
+	    crypt_set_format("md5");
+	    if (*target && strcmp(crypt(password, salt), target)) {	    
+		    free_lbuf(target);
+		    return 0;
+	    }
 	}
 	free_lbuf(target);
 
