diff --git a/src/doors/dgnlance/dgnlnce.c b/src/doors/dgnlance/dgnlnce.c index b11b574b1de43622d153e76893ee3b8c7c8ac37a..b33ccc9c8b507a1551180a2a1520e608a828a421 100644 --- a/src/doors/dgnlance/dgnlnce.c +++ b/src/doors/dgnlance/dgnlnce.c @@ -58,12 +58,21 @@ enum { ,PLAYER }; +enum { + HE + ,HIS + ,HIM +}; + struct playertype { char name[31]; /* Name from BBS drop file */ char pseudo[31]; /* In-game pseudonym */ char killer[31]; /* Person killed by (if status==DEAD) */ + char bcry[61]; /* Battle Cry */ + char winmsg[61]; /* What you say when you win a battle */ char gaspd[61]; /* Dying curse */ char laston[11]; /* Last date one */ + char sex; /* Characters sex */ DWORD status; /* Status alive or dead for player * records, PLAYER or MONSTER for * opponent record (record 0) */ @@ -367,6 +376,7 @@ writenextuser(struct playertype * plr, FILE * outfile) { fprintf(outfile, "%s\n", plr->name); fprintf(outfile, "%s\n", plr->pseudo); + fprintf(outfile, "%c\n", plr->sex); fprintf(outfile, "%s\n", plr->gaspd); fprintf(outfile, "%s\n", plr->laston); fprintf(outfile, "%u\n", plr->status); @@ -484,7 +494,7 @@ findo(void) if (od_get_answer("YN") == 'Y') { od_disp_str("Yes\r\n"); okea = xp_random(99) + 1; - if ((okea < 10) && (user.weapon >= 25)) { + if ((okea < 10) && (user.weapon <= 25)) { user.weapon++; od_printf("You have found a %s.\r\n", weapon[user.weapon].name); } @@ -501,59 +511,144 @@ findo(void) void battle(void); +char * +sexstrings(struct playertype * plr, int type, BOOL cap) +{ + static char retbuf[16]; + char sex; + sex = plr->sex; + if (plr->charisma < 8) + sex = 'I'; + switch (sex) { + case 'M': + switch (type) { + case HIS: + SAFECOPY(retbuf, "his"); + break; + case HE: + SAFECOPY(retbuf, "he"); + break; + case HIM: + SAFECOPY(retbuf, "him"); + break; + } + case 'F': + switch (type) { + case HIS: + SAFECOPY(retbuf, "her"); + break; + case HE: + SAFECOPY(retbuf, "she"); + break; + case HIM: + SAFECOPY(retbuf, "her"); + break; + } + case 'I': + switch (type) { + case HIS: + SAFECOPY(retbuf, "its"); + break; + case HE: + SAFECOPY(retbuf, "it"); + break; + case HIM: + SAFECOPY(retbuf, "it"); + break; + } + } + if (cap) + retbuf[0] = toupper(retbuf[0]); + return (retbuf); +} + void -mutantvictory(void) +endofbattle(BOOL won) { int bt; int d; FILE *outfile; + char lstr[5]; + char wstr[5]; + struct playertype *winner; + struct playertype *loser; + if (opp.status != MONSTER) + loaduser(opp.name, TRUE, &tmpuser); + if (won) { + winner = &user; + loser = &tmpuser; + SAFECOPY(lstr, sexstrings(loser, HIS, FALSE)); + SAFECOPY(wstr, "You"); + } else { + winner = &tmpuser; + loser = &user; + SAFECOPY(lstr, sexstrings(winner, HIS, FALSE)); + SAFECOPY(lstr, "your"); + opp.experience = user.experience / 10; + } + if (opp.status == MONSTER) opp.gold = opp.gold * supplant(); nl(); - od_printf("You take his %" QWORDFORMAT " Steel pieces.\r\n", opp.gold); - user.gold += opp.gold; + if (won) + od_printf("You take %s %" QWORDFORMAT " Steel pieces.\r\n", sexstrings(&opp, HIS, FALSE), opp.gold); + else { + if (opp.status != MONSTER) + od_printf("%s takes your %" QWORDFORMAT " Steel pieces.\r\n", sexstrings(&opp, HE, TRUE), opp.gold); + } + winner->gold += opp.gold; + loser->gold = 0; + if (opp.status != MONSTER) { - loaduser(opp.name, TRUE, &tmpuser); nl(); od_set_color(D_GREEN, D_BLACK); - od_disp_str("The Last Words He Utters Are...\r\n"); - nl(); - od_printf("\"%s\"\r\n", opp.gaspd); - nl(); - user.wins++; - tmpuser.loses++; - SAFECOPY(tmpuser.killer, user.pseudo); - tmpuser.status = DEAD; - tmpuser.gold = 0; - if (tmpuser.weapon > user.weapon) { - d = user.weapon; - user.weapon = tmpuser.weapon; - tmpuser.weapon = d; - bt = user.plus; - user.plus = tmpuser.plus; - tmpuser.plus = bt; + if (won) { + od_printf("The Last Words %s Utters Are...\r\n", sexstrings(&tmpuser, HE, FALSE)); + nl(); + od_printf("\"%s\"\r\n", tmpuser.gaspd); + nl(); + } else { + od_disp_str("The Last Words You Hear Are...\r\n"); + nl(); + od_printf("\"%s\"\r\n", tmpuser.winmsg); + nl(); + } + winner->wins++; + loser->loses++; + SAFECOPY(loser->killer, winner->pseudo); + loser->status = DEAD; + if (loser->weapon > winner->weapon) { + d = winner->weapon; + winner->weapon = loser->weapon; + loser->weapon = d; + bt = winner->plus; + winner->plus = loser->plus; + loser->plus = bt; od_set_color(D_GREEN, D_BLACK); - od_disp_str("You Hath Taken His Weapon.\r\n"); + od_printf("%s Hath Taken %s Weapon.\r\n", wstr, lstr); } if (tmpuser.armour > user.armour) { - d = user.armour; - user.armour = tmpuser.armour; - tmpuser.armour = d; + d = winner->armour; + winner->armour = loser->armour; + loser->armour = d; od_set_color(L_YELLOW, D_BLACK); - od_disp_str("You Hath Taken His Armour.\r\n"); + od_printf("%s Hath Taken %s Armour.\r\n", wstr, lstr); } user.attack = weapon[user.weapon].attack; user.power = weapon[user.weapon].power; tmpuser.attack = weapon[tmpuser.weapon].attack; tmpuser.power = weapon[tmpuser.weapon].power; outfile = fopen("data/record.lan", "ab"); - fprintf(outfile, "%s conquered %s\r\n", user.pseudo, tmpuser.pseudo); + fprintf(outfile, "%s attacked %s and %s was victorious!\r\n", user.pseudo, tmpuser.pseudo, loser->pseudo); fclose(outfile); - saveuser(&tmpuser); } opp.experience *= supplant(); - user.experience += opp.experience; - od_printf("You obtain %" QWORDFORMAT " exp points.\r\n", opp.experience); + winner->experience += opp.experience; + if (won || opp.status != MONSTER) + od_printf("%s obtain %" QWORDFORMAT " exp points.\r\n", wstr, opp.experience); + + if (opp.status != MONSTER) + saveuser(&tmpuser); } void @@ -610,7 +705,7 @@ amode(void) od_disp_str("Swish you missed!\r\n"); break; case 2: - od_disp_str("HA HA! He dodges your swing!\r\n"); + od_printf("HA HA! %s dodges your swing!\r\n", sexstrings(&opp, HE, FALSE)); break; case 3: od_disp_str("CLANG, The attack is blocked!\r\n"); @@ -629,13 +724,13 @@ amode(void) tint = xp_random(2) + 1; switch (tint) { case 1: - od_printf("You sliced him for %1.0f.\r\n", roll); + od_printf("You sliced %s for %1.0f.\r\n", sexstrings(&opp, HIM, FALSE), roll); break; case 2: - od_printf("You made contact to his body for %1.0f.\r\n", roll); + od_printf("You made contact to %s body for %1.0f.\r\n", sexstrings(&opp, HIS, FALSE), roll); break; case 3: - od_printf("You hacked him for %1.0f.", roll); + od_printf("You hacked %s for %1.0f.", sexstrings(&opp, HIM, FALSE), roll); break; } if (opp.hps <= opp.damage) { @@ -646,19 +741,19 @@ amode(void) od_disp_str("A Painless Death!\r\n"); break; case 2: - od_disp_str("It Hath died!\r\n"); + od_printf("%s Hath died!\r\n", sexstrings(&opp, HE, TRUE)); break; case 3: od_disp_str("A Smooth killing!\r\n"); break; case 4: - od_disp_str("It has gone to the Abyss!\r\n"); + od_printf("%s has gone to the Abyss!\r\n", sexstrings(&opp, HE, TRUE)); break; } okea = xp_random(99) + 1; if (okea < 30) findo(); - mutantvictory(); + endofbattle(TRUE); } } } @@ -674,7 +769,7 @@ bmode(void) roll = opponentattack(); if (roll < 1.5) { od_set_color(D_GREEN, D_BLACK); - od_disp_str("His attack tears your armour.\r\n"); + od_printf("%s attack tears your armour.\r\n", sexstrings(&opp, HIS, TRUE)); } else { roll = opponentattack2(); if (roll > 5 * opp.power) @@ -684,13 +779,13 @@ bmode(void) tint = xp_random(2) + 1; switch (tint) { case 1: - od_printf("He hammered you for %1.0f.\r\n", roll); + od_printf("%s hammered you for %1.0f.\r\n", sexstrings(&opp, HE, TRUE), roll); break; case 2: - od_printf("He swung and hit for %1.0f.\r\n", roll); + od_printf("%s swung and hit for %1.0f.\r\n", sexstrings(&opp, HE, TRUE), roll); break; case 3: - od_printf("You are surprised when he hits you for %1.0f.\r\n", roll); + od_printf("You are surprised when %s hits you for %1.0f.\r\n", sexstrings(&opp, HE, FALSE), roll); break; } user.damage += roll; @@ -711,17 +806,7 @@ bmode(void) od_disp_str("May Palidine Be With You!!\r\n"); break; } - if (opp.status != MONSTER) { - player[opp.status].wins++; - user.loses++; - player[opp.status].gold += user.gold; - user.gold = 0; - outfile = fopen("data/record.lan", "ab"); - fprintf(outfile, "%s killed %s\r\n", user.pseudo, player[opp.status].pseudo); - fclose(outfile); - } - user.status = DEAD; - SAFECOPY(user.killer, opp.pseudo); + endofbattle(FALSE); } } } @@ -1014,6 +1099,7 @@ searcher(void) opp.gold = readnumb(0); opp.experience = readnumb(0); opp.status = MONSTER; + opp.sex = 'I'; endofline(); } fclose(infile); @@ -1106,6 +1192,10 @@ doggie(void) opp.status = PLAYER; user.battles--; opp.experience /= 10; + nl(); + od_disp_str("Your opponent screams out:\r\n"); + od_printf("\"%s\" as battle is joined.\r\n", opp.bcry); + nl(); finder = FALSE; battle(); } @@ -1193,7 +1283,39 @@ vic(void) od_set_color(L_CYAN, D_BLACK); od_disp_str("Enter your new Battle Cry.\r\n"); od_disp_str("> "); - od_input_str(temp, 60, ' ', '~'); + od_input_str(user.bcry, 60, ' ', '~'); + od_disp_str("Is this correct? "); + if (od_get_answer("YN") == 'Y') { + ahuh = TRUE; + od_disp_str("Yes\r\n"); + } else { + ahuh = FALSE; + od_disp_str("No\r\n"); + } + } + + for (ahuh = FALSE; !ahuh;) { + nl(); + od_set_color(L_CYAN, D_BLACK); + od_disp_str("What will you say when you're mortally wounded?.\r\n"); + od_disp_str("> "); + od_input_str(user.gaspd, 60, ' ', '~'); + od_disp_str("Is this correct? "); + if (od_get_answer("YN") == 'Y') { + ahuh = TRUE; + od_disp_str("Yes\r\n"); + } else { + ahuh = FALSE; + od_disp_str("No\r\n"); + } + } + + for (ahuh = FALSE; !ahuh;) { + nl(); + od_set_color(L_CYAN, D_BLACK); + od_disp_str("What will you say when you win?\r\n"); + od_disp_str("> "); + od_input_str(user.winmsg, 60, ' ', '~'); od_disp_str("Is this correct? "); if (od_get_answer("YN") == 'Y') { ahuh = TRUE; @@ -1203,7 +1325,6 @@ vic(void) od_disp_str("No\r\n"); } } - ahuh = TRUE; } void @@ -1229,8 +1350,11 @@ create(BOOL isnew) user.hps = (xp_random(4) + 1) + user.constitution; user.wins = 0; user.loses = 0; - user.gaspd[0]=0; + user.sex = 'M'; if (isnew) { + user.bcry[0] = 0; + user.gaspd[0] = 0; + user.winmsg[0] = 0; nl(); SAFECOPY(user.name, od_control.user_name); SAFECOPY(user.pseudo, od_control.user_name); @@ -1238,10 +1362,9 @@ create(BOOL isnew) user.battles = BATTLES_PER_DAY; user.fights = FIGHTS_PER_DAY; user.flights = FLIGHTS_PER_DAY; - } else { - SAFECOPY(temp, user.gaspd); } - SAFECOPY(user.gaspd, temp); + od_printf("What sex would you like your character to be? (M/F) "); + user.sex = od_get_answer("MF"); nl(); } @@ -1630,6 +1753,10 @@ loadnextuser(struct playertype * plr) if (feof(infile)) return (FALSE); readline(plr->pseudo, sizeof(plr->pseudo)); + if (feof(infile)) + return (FALSE); + fread(&plr->sex, 1, 1, infile); + endofline(); if (feof(infile)) return (FALSE); readline(plr->gaspd, sizeof(plr->gaspd)); @@ -1931,7 +2058,6 @@ main(int argc, char **argv) case '#': od_disp_str("Change Battle Cry\r\n"); vic(); - SAFECOPY(user.gaspd, temp); break; } }