// Dark Woods или Темнолесье by Freakazoitt
// Patched by ALPHAUser
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <unistd.h>
#define SleepMs(ms) sleep((ms)/1000)
#define Scan(...) scanf(__VA_ARGS__)
#define Random(a, b) (random() % ((b) - (a) + 1) + (a))
struct Equipment {
int gold;
const char *weapon_name;
int attack;
const char *defense_name[5];
int defense[5];
int kills;
int total_defense;
};
void update_equipment(struct Equipment *in_out_equipment) {
in_out_equipment->total_defense = 0;
for (int i = 0; i < 5; ++i) {
in_out_equipment->total_defense += in_out_equipment->defense[i];
}
}
void try_buy(int attack_bonus, int defense_bonus, int defense_index, int cost, const char *name,
struct Equipment *in_out_equipment) {
if (in_out_equipment->gold < cost) {
printf(u8"Чтобы купить %s нужно %i золота, а у тебя есть только %i\n",
name, cost, in_out_equipment->gold);
return;
}
printf(u8"Ты %s %s на ", cost > 0 ? u8"купил" : u8"подобрал", name);
if (attack_bonus) {
printf(u8"+%i атаки ", attack_bonus);
}
if (defense_bonus) {
printf(u8"+%i защиты ", defense_bonus);
}
if (cost > 0) {
printf(u8"за %i золотых монет.", cost);
}
if (attack_bonus) {
in_out_equipment->attack = attack_bonus;
in_out_equipment->weapon_name = name;
}
if (defense_bonus) {
if (in_out_equipment->defense_name[defense_index]) {
printf(u8" Ты снял %s на +%i",
in_out_equipment->defense_name[defense_index],
in_out_equipment->defense[defense_index]);
}
in_out_equipment->defense[defense_index] = defense_bonus;
in_out_equipment->defense_name[defense_index] = name;
}
in_out_equipment->gold = in_out_equipment->gold - cost;
update_equipment(in_out_equipment);
printf(u8"\n");
}
void init_equipment(struct Equipment *out_equipment) {
out_equipment->gold = 0;
// сразу дается нош на 1 атаку
out_equipment->weapon_name = u8"нош";
out_equipment->attack = 1;
for (int i = 0; i < 5; ++i) {
out_equipment->defense_name[i] = 0;
out_equipment->defense[i] = 0;
}
out_equipment->kills = 0;
update_equipment(out_equipment);
}
int fight(int monster_attack, int monster_gold, const char* name, struct Equipment *in_out_equipment) {
if (in_out_equipment->attack + in_out_equipment->total_defense > monster_attack) {
printf(u8"Ты победил %s! \n получено %i %s", name, monster_gold, "золота\n");
in_out_equipment->gold += monster_gold;
in_out_equipment->kills += 1;
return 1;
} else {
printf(u8"Ты проиграл!\n");
SleepMs(1000);
printf(u8"Найди экипировку получше и попробуй снова\n");
return 0;
}
}
int main(void) {
char k='z', buy=' ';
struct Equipment equipment;
init_equipment(&equipment);
setlocale(LC_ALL, "Rus");
printf(u8"Игра «Темнолесье» by Freakazoitt\n");
while (1) {
printf(u8"\nСписок команд:\n w - работать на шахте за золото\n i - параметры персонажа\n b - магазин\n m - качаться на монстрах\n q - выход\n u - атаковать босса\n");
Scan(" %c", &k);
switch(k) {
case 'w': // работать в шахте
printf(u8"\nработает в шахте\n");
SleepMs(6000);
printf(u8"закончил работу в шахте\nзаработал 1 золотой\n");
equipment.gold += 1; // заработал 1 gold
break; // case 'w' работать в шахте
case 'i': // инфа о персонаже
printf(u8"класс: наемник\n");
printf(u8"атака: %i\n", equipment.attack);
printf(u8"защита: %i\n", equipment.total_defense);
printf(u8"оружие: %s\n", equipment.weapon_name);
printf(u8"деньги: %i\n", equipment.gold);
printf(u8"монстров убито %i\n", equipment.kills);
break; // case 'i' инфа о персонаже
case 'b': // купить
printf(u8"\nсписок товаров в магазине\n\nоружие: \n d - кинжал +2 атаки, цена 3 золотых \n a - топор +4 атаки, цена 5 золотых \n s - меч +6 атаки, цена 8 золотых \n p - зачарованная пика +10 атаки, цена 15 золотых \n\n");
printf(u8"броня: \n i - кожаная куртка +1 защита, цена 1 золотой \n b - кожаные перчатки +1 защита, цена 1 золотой \n l - ботинки с пластинами +1 защита, цена 2 золотых \n c - кольчуга +3 защиты, (заменяет кожаную куртку), цена 3 золотых \n h - стальной шлем +2 защиты, цена 4 золотых \n g - железная маска личина +1 защита, цена 2 золотых\n");
Scan(" %c", &buy); // покупка
switch(buy) {
case 'd': try_buy(2, 0, -1, 3, u8"кинжал", &equipment); break;
case 'a': try_buy(4, 0, -1, 5, u8"топор", &equipment); break;
case 's': try_buy(6, 0, -1, 8, u8"меч", &equipment); break;
case 'p': try_buy(10, 0, -1, 15, u8"зачарованную пику", &equipment); break;
case 'i': try_buy(0, 1, 0, 1, u8"кожаную куртку", &equipment); break;
case 'b': try_buy(0, 1, 1, 1, u8"кожаные перчатки", &equipment); break;
case 'l': try_buy(0, 1, 2, 1, u8"кожаные ботинки с пластинами", &equipment); break;
case 'c': try_buy(0, 3, 0, 3, u8"кольчугу", &equipment); break;
case 'h': try_buy(0, 2, 4, 4, u8"стальной шлем", &equipment); break;
case 'g': try_buy(0, 1, 3, 2, u8"железную маску личину", &equipment); break;
}
break; // case 'b' купить
case 'm': {// hunting on monster
char p;
printf(u8"Ты отправляешься в Темнолесье. Выбери какого монстра атаковать: \n r - крысу \n w - волка \n g - гоблина \n o - мертвяка \n t - гигантсткую ядовитую жабу\n");
Scan(" %c", &p);
switch(p) {
case 'r': fight(1, 1, u8"крысу", &equipment); break;
case 'w': fight(2, 2, u8"волка", &equipment); break;
case 'g': fight(4, 3, u8"гоблина", &equipment); break;
case 'o':
if (fight(8, 5, u8"мертвяка", &equipment)) {
try_buy(0, 2, 2, 0, u8"кожу мертвяка", &equipment); break;
}
break;
case 't':
if (fight(10, 6, u8"гигантсткую ядовитую жабу", &equipment)) {
try_buy(12, 0, 0, 0, u8"яд", &equipment); break;
}
break;
} // switch(p)
break; // ucase 'm' hunting on monster
}
case 'q':
return 0;
case 'u': {// final quest
printf(u8"Сражение с главным злодеем - коварным магом Боратуром\n");
SleepMs(1000);
if (equipment.attack + equipment.total_defense > Random(1,5) + 4*Random(1,5)) {
printf(u8"Ты победил! \n Игра окончена: Ты победил. Темнолесье освобождено от зла.\n");
} else {
printf(u8"Ты проиграл!\n");
}
return 0;
} // case 'u' final quest
}
}
}