Compare commits
4 Commits
f641112a2d
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 0b2968e33f | |||
| 4eea1dcec7 | |||
| fd8c091872 | |||
| 49dc1aecd1 |
23
README.md
23
README.md
@@ -1,3 +1,22 @@
|
|||||||
# ASCII-G
|
# ASCII-G - The Cookies Edition
|
||||||
|
|
||||||
A Super Cool Initial (not so) Interesting Game. Simple and turn-based.
|
Текстовый квест в терминале. Игрок исследует подземный лабиринт, решает головоломки, открывает сундуки, взаимодействует с NPC и участвует в боях.
|
||||||
|
|
||||||
|
## Возможности
|
||||||
|
|
||||||
|
- 5 ASCII-локаций
|
||||||
|
- головоломки
|
||||||
|
- сундуки
|
||||||
|
- инвентарь
|
||||||
|
- зелья лечения
|
||||||
|
- оружие
|
||||||
|
- NPC и диалоги
|
||||||
|
- боевая система
|
||||||
|
- сохранение и загрузка
|
||||||
|
- логирование событий
|
||||||
|
|
||||||
|
## Сборка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make run
|
||||||
|
```
|
||||||
164
docs/classes.md
Normal file
164
docs/classes.md
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
# Документация классов
|
||||||
|
|
||||||
|
## Game
|
||||||
|
|
||||||
|
Основной класс игры. Управляет игровым циклом, загрузкой данных, отображением карты, обработкой команд игрока, взаимодействием с объектами и переходами между локациями.
|
||||||
|
|
||||||
|
### Поля
|
||||||
|
|
||||||
|
| Поле | Тип | Описание |
|
||||||
|
| ------------ | --------------------- | ---------------- |
|
||||||
|
| player | Player | Игрок |
|
||||||
|
| locations | std::vector<Location> | Список локаций |
|
||||||
|
| itemDatabase | std::vector<Item> | База предметов |
|
||||||
|
| isRunning | bool | Флаг работы игры |
|
||||||
|
|
||||||
|
### Методы
|
||||||
|
|
||||||
|
| Метод | Назначение |
|
||||||
|
| ----------------- | ---------------------------- |
|
||||||
|
| run() | Запуск игры |
|
||||||
|
| loadItems() | Загрузка предметов |
|
||||||
|
| loadLocations() | Загрузка локаций |
|
||||||
|
| render() | Отрисовка текущего состояния |
|
||||||
|
| processCommand() | Обработка команды игрока |
|
||||||
|
| movePlayer() | Перемещение игрока |
|
||||||
|
| handleTile() | Обработка клетки карты |
|
||||||
|
| solveRiddle() | Решение загадки |
|
||||||
|
| openChest() | Открытие сундука |
|
||||||
|
| interactWithNPC() | Взаимодействие с NPC |
|
||||||
|
| startCombat() | Запуск боя |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Player
|
||||||
|
|
||||||
|
Класс игрока.
|
||||||
|
|
||||||
|
### Поля
|
||||||
|
|
||||||
|
| Поле | Тип | Описание |
|
||||||
|
| ---------------- | ----------- | ------------------------ |
|
||||||
|
| name | std::string | Имя персонажа |
|
||||||
|
| hp | int | Здоровье |
|
||||||
|
| maxHp | int | Максимальное здоровье |
|
||||||
|
| atk | int | Базовый урон |
|
||||||
|
| gold | int | Количество золота |
|
||||||
|
| currentLocation | int | Текущая локация |
|
||||||
|
| position | Point | Позиция на карте |
|
||||||
|
| inventory | Inventory | Инвентарь |
|
||||||
|
| equippedWeaponId | int | ID экипированного оружия |
|
||||||
|
|
||||||
|
### Методы
|
||||||
|
|
||||||
|
| Метод | Назначение |
|
||||||
|
| ------------- | ---------------------- |
|
||||||
|
| showStats() | Вывод характеристик |
|
||||||
|
| getDamage() | Расчёт итогового урона |
|
||||||
|
| usePotion() | Использование зелья |
|
||||||
|
| equipWeapon() | Экипировка оружия |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Inventory
|
||||||
|
|
||||||
|
Инвентарь игрока.
|
||||||
|
|
||||||
|
### Поля
|
||||||
|
|
||||||
|
| Поле | Тип |
|
||||||
|
| ----- | -------------------------- |
|
||||||
|
| items | std::vector<InventorySlot> |
|
||||||
|
|
||||||
|
### Методы
|
||||||
|
|
||||||
|
| Метод | Назначение |
|
||||||
|
| ------------ | ------------------------- |
|
||||||
|
| addItem() | Добавление предмета |
|
||||||
|
| removeItem() | Удаление предмета |
|
||||||
|
| hasItem() | Проверка наличия предмета |
|
||||||
|
| show() | Вывод содержимого |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Location
|
||||||
|
|
||||||
|
Игровая локация.
|
||||||
|
|
||||||
|
### Поля
|
||||||
|
|
||||||
|
| Поле | Назначение |
|
||||||
|
| --------------------- | ------------------------ |
|
||||||
|
| id | Уникальный идентификатор |
|
||||||
|
| title | Название |
|
||||||
|
| width | Ширина карты |
|
||||||
|
| height | Высота карты |
|
||||||
|
| map | ASCII-карта |
|
||||||
|
| startPosition | Стартовая позиция |
|
||||||
|
| north/south/east/west | Связи между локациями |
|
||||||
|
| riddle | Загадка |
|
||||||
|
| chests | Сундуки |
|
||||||
|
| npcs | NPC |
|
||||||
|
| enemies | Противники |
|
||||||
|
|
||||||
|
### Методы
|
||||||
|
|
||||||
|
| Метод | Назначение |
|
||||||
|
| -------------- | ---------------------------- |
|
||||||
|
| loadFromFile() | Загрузка локации |
|
||||||
|
| draw() | Отрисовка карты |
|
||||||
|
| isWalkable() | Проверка проходимости клетки |
|
||||||
|
| getTile() | Получение символа карты |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## NPC
|
||||||
|
|
||||||
|
Неигровой персонаж.
|
||||||
|
|
||||||
|
### Поля
|
||||||
|
|
||||||
|
| Поле | Назначение |
|
||||||
|
| ---------- | ------------------------ |
|
||||||
|
| id | Уникальный идентификатор |
|
||||||
|
| name | Имя |
|
||||||
|
| state | Состояние |
|
||||||
|
| hp | Здоровье |
|
||||||
|
| damage | Урон |
|
||||||
|
| dialogText | Основной текст диалога |
|
||||||
|
| options | Варианты ответов |
|
||||||
|
| position | Координаты |
|
||||||
|
| defeated | Флаг поражения |
|
||||||
|
|
||||||
|
### Методы
|
||||||
|
|
||||||
|
| Метод | Назначение |
|
||||||
|
| ------------------- | ------------------------- |
|
||||||
|
| loadFromFile() | Загрузка NPC |
|
||||||
|
| parseState() | Разбор состояния |
|
||||||
|
| parseDialogResult() | Разбор результата диалога |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## SaveManager
|
||||||
|
|
||||||
|
Система сохранения и загрузки игры.
|
||||||
|
|
||||||
|
### Методы
|
||||||
|
|
||||||
|
| Метод | Назначение |
|
||||||
|
| ---------- | --------------- |
|
||||||
|
| saveGame() | Сохранение игры |
|
||||||
|
| loadGame() | Загрузка игры |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Logger
|
||||||
|
|
||||||
|
Система журналирования событий.
|
||||||
|
|
||||||
|
### Методы
|
||||||
|
|
||||||
|
| Метод | Назначение |
|
||||||
|
| ----- | ------------------------- |
|
||||||
|
| log() | Запись события в лог-файл |
|
||||||
128
docs/methods.md
Normal file
128
docs/methods.md
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
# Описание методов
|
||||||
|
|
||||||
|
## Game::movePlayer(int dx, int dy)
|
||||||
|
|
||||||
|
Перемещает игрока на указанное смещение.
|
||||||
|
|
||||||
|
### Параметры
|
||||||
|
|
||||||
|
| Имя | Тип | Описание |
|
||||||
|
| --- | --- | ----------------- |
|
||||||
|
| dx | int | Смещение по оси X |
|
||||||
|
| dy | int | Смещение по оси Y |
|
||||||
|
|
||||||
|
### Возвращаемое значение
|
||||||
|
|
||||||
|
Отсутствует.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Game::solveRiddle(Location& location)
|
||||||
|
|
||||||
|
Отображает загадку игроку и проверяет введённый ответ.
|
||||||
|
|
||||||
|
### Параметры
|
||||||
|
|
||||||
|
| Имя | Тип |
|
||||||
|
| -------- | --------- |
|
||||||
|
| location | Location& |
|
||||||
|
|
||||||
|
### Возвращаемое значение
|
||||||
|
|
||||||
|
| Тип | Описание |
|
||||||
|
| ---- | -------------------------- |
|
||||||
|
| bool | true при правильном ответе |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Player::usePotion(int itemId, const std::vector<Item>& itemDatabase)
|
||||||
|
|
||||||
|
Использует выбранное зелье из инвентаря.
|
||||||
|
|
||||||
|
### Параметры
|
||||||
|
|
||||||
|
| Имя | Тип |
|
||||||
|
| ------------ | ----------------- |
|
||||||
|
| itemId | int |
|
||||||
|
| itemDatabase | std::vector<Item> |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Player::equipWeapon(int itemId, const std::vector<Item>& itemDatabase)
|
||||||
|
|
||||||
|
Экипирует выбранное оружие.
|
||||||
|
|
||||||
|
### Параметры
|
||||||
|
|
||||||
|
| Имя | Тип |
|
||||||
|
| ------------ | ----------------- |
|
||||||
|
| itemId | int |
|
||||||
|
| itemDatabase | std::vector<Item> |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Inventory::addItem(int itemId, int count)
|
||||||
|
|
||||||
|
Добавляет предмет в инвентарь.
|
||||||
|
|
||||||
|
### Параметры
|
||||||
|
|
||||||
|
| Имя | Тип |
|
||||||
|
| ------ | --- |
|
||||||
|
| itemId | int |
|
||||||
|
| count | int |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Inventory::removeItem(int itemId, int count)
|
||||||
|
|
||||||
|
Удаляет предмет из инвентаря.
|
||||||
|
|
||||||
|
### Параметры
|
||||||
|
|
||||||
|
| Имя | Тип |
|
||||||
|
| ------ | --- |
|
||||||
|
| itemId | int |
|
||||||
|
| count | int |
|
||||||
|
|
||||||
|
### Возвращаемое значение
|
||||||
|
|
||||||
|
| Тип | Описание |
|
||||||
|
| ---- | ------------------- |
|
||||||
|
| bool | Успешность операции |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Location::loadFromFile(const std::string& path)
|
||||||
|
|
||||||
|
Загружает данные локации из файла.
|
||||||
|
|
||||||
|
### Параметры
|
||||||
|
|
||||||
|
| Имя | Тип |
|
||||||
|
| ---- | ----------- |
|
||||||
|
| path | std::string |
|
||||||
|
|
||||||
|
### Возвращаемое значение
|
||||||
|
|
||||||
|
| Тип |
|
||||||
|
| ---- |
|
||||||
|
| bool |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## NPC::loadFromFile(const std::string& path)
|
||||||
|
|
||||||
|
Загружает параметры NPC из текстового файла.
|
||||||
|
|
||||||
|
### Параметры
|
||||||
|
|
||||||
|
| Имя | Тип |
|
||||||
|
| ---- | ----------- |
|
||||||
|
| path | std::string |
|
||||||
|
|
||||||
|
### Возвращаемое значение
|
||||||
|
|
||||||
|
| Тип |
|
||||||
|
| ---- |
|
||||||
|
| bool |
|
||||||
9
docs/user_manual.md
Normal file
9
docs/user_manual.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Инструкция пользователя
|
||||||
|
|
||||||
|
## Запуск игры
|
||||||
|
|
||||||
|
### Windows / Linux
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make run
|
||||||
|
```
|
||||||
8
include/logger.h
Normal file
8
include/logger.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class Logger {
|
||||||
|
public:
|
||||||
|
static void log(const std::string& message);
|
||||||
|
};
|
||||||
48
logs/game.log
Normal file
48
logs/game.log
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
[2026-06-11 15:28:07] Game started
|
||||||
|
[2026-06-11 15:28:09] New game started. Player name: Zero
|
||||||
|
[2026-06-11 15:28:12] Player opened chest in location: Entrance Hall
|
||||||
|
[2026-06-11 15:28:12] Player received item ID: 101
|
||||||
|
[2026-06-11 15:28:12] Player received item ID: 101
|
||||||
|
[2026-06-11 16:07:50] Game started
|
||||||
|
[2026-06-11 16:08:03] Game started
|
||||||
|
[2026-06-11 16:08:05] New game started. Player name: Zero
|
||||||
|
[2026-06-11 16:08:20] Wrong riddle answer in location: Entrance Hall
|
||||||
|
[2026-06-11 16:08:28] Player selected dialog option with NPC: Old Guard
|
||||||
|
[2026-06-11 16:08:29] Player opened chest in location: Entrance Hall
|
||||||
|
[2026-06-11 16:08:29] Player received item ID: 101
|
||||||
|
[2026-06-11 16:08:29] Player received item ID: 101
|
||||||
|
[2026-06-11 16:08:32] Player entered location: Old Corridor
|
||||||
|
[2026-06-11 16:08:34] Combat started with NPC: Dungeon Bandit
|
||||||
|
[2026-06-11 16:08:36] NPC defeated: Dungeon Bandit
|
||||||
|
[2026-06-11 16:08:38] Player opened chest in location: Old Corridor
|
||||||
|
[2026-06-11 16:08:38] Player received item ID: 101
|
||||||
|
[2026-06-11 16:08:38] Player received item ID: 201
|
||||||
|
[2026-06-11 16:08:41] Riddle solved in location: Old Corridor
|
||||||
|
[2026-06-11 16:08:41] Player entered location: Guard Room
|
||||||
|
[2026-06-11 16:08:46] Player selected dialog option with NPC: Archivist
|
||||||
|
[2026-06-11 16:08:46] Combat started with NPC: Archivist
|
||||||
|
[2026-06-11 16:08:55] NPC defeated: Archivist
|
||||||
|
[2026-06-11 16:08:59] Riddle solved in location: Guard Room
|
||||||
|
[2026-06-11 16:08:59] Player entered location: Library
|
||||||
|
[2026-06-11 16:09:03] Wrong riddle answer in location: Library
|
||||||
|
[2026-06-11 16:09:07] Riddle solved in location: Library
|
||||||
|
[2026-06-11 16:09:07] Player entered location: Final Gate
|
||||||
|
[2026-06-11 16:09:13] Player selected dialog option with NPC: Old Guard
|
||||||
|
[2026-06-11 16:09:29] Wrong riddle answer in location: Final Gate
|
||||||
|
[2026-06-11 16:09:53] Riddle solved in location: Final Gate
|
||||||
|
[2026-06-11 16:09:53] Player entered location: Library
|
||||||
|
[2026-06-11 16:09:57] Player selected dialog option with NPC: Old Guard
|
||||||
|
[2026-06-11 16:10:00] Player entered location: Final Gate
|
||||||
|
[2026-06-11 16:10:08] Player selected dialog option with NPC: Old Guard
|
||||||
|
[2026-06-11 16:10:08] Combat started with NPC: Old Guard
|
||||||
|
[2026-06-11 16:10:12] NPC defeated: Old Guard
|
||||||
|
[2026-06-11 16:10:16] Player entered location: Library
|
||||||
|
[2026-06-11 16:10:30] Player entered location: Final Gate
|
||||||
|
[2026-06-11 16:10:36] Player opened chest in location: Final Gate
|
||||||
|
[2026-06-11 16:10:36] Player received item ID: 101
|
||||||
|
[2026-06-11 16:10:36] Player received item ID: 102
|
||||||
|
[2026-06-11 16:10:36] Player received item ID: 202
|
||||||
|
[2026-06-11 16:10:39] Player entered location: Library
|
||||||
|
[2026-06-11 16:10:42] Player opened chest in location: Library
|
||||||
|
[2026-06-11 16:10:42] Player received item ID: 102
|
||||||
|
[2026-06-11 16:10:42] Player received item ID: 202
|
||||||
26
src/game.cpp
26
src/game.cpp
@@ -1,10 +1,12 @@
|
|||||||
#include "../include/game.h"
|
#include "../include/game.h"
|
||||||
#include "../include/save_manager.h"
|
#include "../include/save_manager.h"
|
||||||
|
#include "../include/logger.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
void Game::run() {
|
void Game::run() {
|
||||||
|
Logger::log("Game started");
|
||||||
loadItems();
|
loadItems();
|
||||||
loadLocations();
|
loadLocations();
|
||||||
showMainMenu();
|
showMainMenu();
|
||||||
@@ -13,6 +15,8 @@ void Game::run() {
|
|||||||
render();
|
render();
|
||||||
processCommand();
|
processCommand();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Logger::log("Game closed");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::loadLocations() {
|
void Game::loadLocations() {
|
||||||
@@ -69,11 +73,13 @@ void Game::showMainMenu() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::cout << ">>> Created new character " << player.name << "!\n";
|
std::cout << ">>> Created new character " << player.name << "!\n";
|
||||||
|
Logger::log("New game started. Player name: " + player.name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (str == "2") {
|
else if (str == "2") {
|
||||||
if (SaveManager::loadGame(player, "saves/save.txt")) {
|
if (SaveManager::loadGame(player, "saves/save.txt")) {
|
||||||
std::cout << ">>> Game loaded.\n";
|
std::cout << ">>> Game loaded.\n";
|
||||||
|
Logger::log("New game started. Player name: " + player.name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -149,6 +155,7 @@ void Game::processCommand() {
|
|||||||
else if (command == "save") {
|
else if (command == "save") {
|
||||||
if (SaveManager::saveGame(player, "saves/save.txt")) {
|
if (SaveManager::saveGame(player, "saves/save.txt")) {
|
||||||
std::cout << "Game saved.\n";
|
std::cout << "Game saved.\n";
|
||||||
|
Logger::log("Game saved");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (command == "load") {
|
else if (command == "load") {
|
||||||
@@ -201,6 +208,14 @@ void Game::handleTile(char tile) {
|
|||||||
interactWithNPC(*location);
|
interactWithNPC(*location);
|
||||||
}
|
}
|
||||||
else if (tile == 'D') {
|
else if (tile == 'D') {
|
||||||
|
|
||||||
|
if (location->id == 5) {
|
||||||
|
std::cout << "\nYou escaped from the labyrinth!\n";
|
||||||
|
std::cout << "Victory!\n";
|
||||||
|
isRunning = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!location->riddle.isSolved) {
|
if (!location->riddle.isSolved) {
|
||||||
bool solved = solveRiddle(*location);
|
bool solved = solveRiddle(*location);
|
||||||
|
|
||||||
@@ -233,6 +248,7 @@ void Game::handleTile(char tile) {
|
|||||||
if (newLocation != nullptr) {
|
if (newLocation != nullptr) {
|
||||||
player.position = newLocation->startPosition;
|
player.position = newLocation->startPosition;
|
||||||
std::cout << "You entered: " << newLocation->title << "\n";
|
std::cout << "You entered: " << newLocation->title << "\n";
|
||||||
|
Logger::log("Player entered location: " + newLocation->title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -252,9 +268,10 @@ bool Game::solveRiddle(Location& location) {
|
|||||||
if (answer == location.riddle.answer) {
|
if (answer == location.riddle.answer) {
|
||||||
std::cout << "Correct.\n";
|
std::cout << "Correct.\n";
|
||||||
location.riddle.isSolved = true;
|
location.riddle.isSolved = true;
|
||||||
|
Logger::log("Riddle solved in location: " + location.title);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Logger::log("Wrong riddle answer in location: " + location.title);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -318,10 +335,12 @@ void Game::openChest(Location& location) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "You opened the chest.\n";
|
std::cout << "You opened the chest.\n";
|
||||||
|
Logger::log("Player opened chest in location: " + location.title);
|
||||||
|
|
||||||
for (int itemId : chest.itemIds) {
|
for (int itemId : chest.itemIds) {
|
||||||
player.inventory.addItem(itemId);
|
player.inventory.addItem(itemId);
|
||||||
std::cout << "Received item ID: " << itemId << "\n";
|
std::cout << "Received item ID: " << itemId << "\n";
|
||||||
|
Logger::log("Player received item ID: " + std::to_string(itemId));
|
||||||
}
|
}
|
||||||
|
|
||||||
chest.opened = true;
|
chest.opened = true;
|
||||||
@@ -363,6 +382,7 @@ void Game::applyDialogResult(NPC& npc, const DialogOption& option) {
|
|||||||
|
|
||||||
void Game::startCombat(NPC& npc) {
|
void Game::startCombat(NPC& npc) {
|
||||||
std::cout << "\nCombat started with " << npc.name << "!\n";
|
std::cout << "\nCombat started with " << npc.name << "!\n";
|
||||||
|
Logger::log("Combat started with NPC: " + npc.name);
|
||||||
|
|
||||||
while (player.hp > 0 && npc.hp > 0) {
|
while (player.hp > 0 && npc.hp > 0) {
|
||||||
std::cout << "\nYour HP: " << player.hp << "\n";
|
std::cout << "\nYour HP: " << player.hp << "\n";
|
||||||
@@ -385,6 +405,7 @@ void Game::startCombat(NPC& npc) {
|
|||||||
if (npc.hp <= 0) {
|
if (npc.hp <= 0) {
|
||||||
npc.defeated = true;
|
npc.defeated = true;
|
||||||
std::cout << "You defeated " << npc.name << ".\n";
|
std::cout << "You defeated " << npc.name << ".\n";
|
||||||
|
Logger::log("NPC defeated: " + npc.name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -393,6 +414,7 @@ void Game::startCombat(NPC& npc) {
|
|||||||
}
|
}
|
||||||
else if (choice == 3) {
|
else if (choice == 3) {
|
||||||
std::cout << "You ran away.\n";
|
std::cout << "You ran away.\n";
|
||||||
|
Logger::log("Player escaped from combat with: " + npc.name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -405,6 +427,7 @@ void Game::startCombat(NPC& npc) {
|
|||||||
|
|
||||||
if (player.hp <= 0) {
|
if (player.hp <= 0) {
|
||||||
std::cout << "You died.\n";
|
std::cout << "You died.\n";
|
||||||
|
Logger::log("Player died in combat with: " + npc.name);
|
||||||
isRunning = false;
|
isRunning = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -437,6 +460,7 @@ void Game::interactWithNPC(Location& location) {
|
|||||||
|
|
||||||
int choice;
|
int choice;
|
||||||
std::cin >> choice;
|
std::cin >> choice;
|
||||||
|
Logger::log("Player selected dialog option with NPC: " + npc.name);
|
||||||
|
|
||||||
if (choice < 1 || choice > npc.options.size()) {
|
if (choice < 1 || choice > npc.options.size()) {
|
||||||
std::cout << "Invalid dialog option.\n";
|
std::cout << "Invalid dialog option.\n";
|
||||||
|
|||||||
22
src/logger.cpp
Normal file
22
src/logger.cpp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#include "../include/logger.h"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <ctime>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
void Logger::log(const std::string& message) {
|
||||||
|
std::ofstream file("logs/game.log", std::ios::app);
|
||||||
|
|
||||||
|
if (!file.is_open()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::time_t now = std::time(nullptr);
|
||||||
|
std::tm* localTime = std::localtime(&now);
|
||||||
|
|
||||||
|
file << "["
|
||||||
|
<< std::put_time(localTime, "%Y-%m-%d %H:%M:%S")
|
||||||
|
<< "] "
|
||||||
|
<< message
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user