From 8673bb1ad5391e0e61f7b3ebf734ef74c01c0ef5 Mon Sep 17 00:00:00 2001 From: Barry Kane Date: Fri, 20 May 2022 22:28:07 +0100 Subject: [PATCH] Reorganized file structure. - Reimplemented /LOOK. - Commands are now accepted in both upper and lower case. - Move now accepts a number for easier movement. --- Makefile | 8 +-- src/SilverMUD.org => SilverMUD.org | 0 {src/misc => include}/constants.h | 0 {src/misc => include}/gamelogic.h | 0 {src/misc => include}/inputoutput.h | 0 {src/misc => include}/lists.h | 0 {src/misc => include}/playerdata.h | 0 {src/misc => include}/texteffects.h | 0 src/{ => client}/SilverMUDClient.c | 11 ++-- src/{misc => }/gamelogic.c | 68 +++++++++++++++++++++---- src/{misc => }/inputoutput.c | 8 +-- src/{misc => }/lists.c | 4 +- src/{misc => }/playerdata.c | 18 ++++++- src/{ => server}/SilverMUDServer.c | 12 ++--- src/{misc => }/texteffects.c | 0 {src/tests => tests}/list-test.c | 0 {src/tests => tests}/outputQueue-test.c | 0 17 files changed, 98 insertions(+), 31 deletions(-) rename src/SilverMUD.org => SilverMUD.org (100%) rename {src/misc => include}/constants.h (100%) rename {src/misc => include}/gamelogic.h (100%) rename {src/misc => include}/inputoutput.h (100%) rename {src/misc => include}/lists.h (100%) rename {src/misc => include}/playerdata.h (100%) rename {src/misc => include}/texteffects.h (100%) rename src/{ => client}/SilverMUDClient.c (96%) rename src/{misc => }/gamelogic.c (51%) rename src/{misc => }/inputoutput.c (98%) rename src/{misc => }/lists.c (97%) rename src/{misc => }/playerdata.c (85%) rename src/{ => server}/SilverMUDServer.c (97%) rename src/{misc => }/texteffects.c (100%) rename {src/tests => tests}/list-test.c (100%) rename {src/tests => tests}/outputQueue-test.c (100%) diff --git a/Makefile b/Makefile index a945a26..30cd661 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ CC = gcc -clientsrc = $(wildcard src/misc/*.c) \ - src/SilverMUDClient.c +clientsrc = $(wildcard src/*.c) \ + src/client/SilverMUDClient.c clientobj = $(clientsrc:.c=.o) -serversrc = $(wildcard src/misc/*.c) \ - src/SilverMUDServer.c +serversrc = $(wildcard src/*.c) \ + src/server/SilverMUDServer.c serverobj = $(serversrc:.c=.o) CLIENTLDFLAGS= -lpthread -lncurses -lgnutls SERVERLDFLAGS= -lpthread -lncurses -lgnutls diff --git a/src/SilverMUD.org b/SilverMUD.org similarity index 100% rename from src/SilverMUD.org rename to SilverMUD.org diff --git a/src/misc/constants.h b/include/constants.h similarity index 100% rename from src/misc/constants.h rename to include/constants.h diff --git a/src/misc/gamelogic.h b/include/gamelogic.h similarity index 100% rename from src/misc/gamelogic.h rename to include/gamelogic.h diff --git a/src/misc/inputoutput.h b/include/inputoutput.h similarity index 100% rename from src/misc/inputoutput.h rename to include/inputoutput.h diff --git a/src/misc/lists.h b/include/lists.h similarity index 100% rename from src/misc/lists.h rename to include/lists.h diff --git a/src/misc/playerdata.h b/include/playerdata.h similarity index 100% rename from src/misc/playerdata.h rename to include/playerdata.h diff --git a/src/misc/texteffects.h b/include/texteffects.h similarity index 100% rename from src/misc/texteffects.h rename to include/texteffects.h diff --git a/src/SilverMUDClient.c b/src/client/SilverMUDClient.c similarity index 96% rename from src/SilverMUDClient.c rename to src/client/SilverMUDClient.c index a4017de..119baed 100644 --- a/src/SilverMUDClient.c +++ b/src/client/SilverMUDClient.c @@ -13,10 +13,10 @@ #include #include #include -#include "misc/constants.h" -#include "misc/playerdata.h" -#include "misc/texteffects.h" -#include "misc/inputoutput.h" +#include "../../include/constants.h" +#include "../../include/playerdata.h" +#include "../../include/texteffects.h" +#include "../../include/inputoutput.h" // A struct for passing arguments to our threads containing a file descriptor and a window pointer: typedef struct threadparameters @@ -85,7 +85,8 @@ void * messageReceiver(void * parameters) shouldExit = true; pthread_exit(NULL); } - slowPrintNcurses("\n --====<>====-- \n", 8000, threadParameters->window, true); + slowPrintNcurses("\n --====<", 8000, threadParameters->window, true); + slowPrintNcurses(">====-- \n", 8000, threadParameters->window, true); slowPrintNcurses(receiveBuffer.messageContent, 8000, threadParameters->window, false); slowPrintNcurses("\n --====<>====-- \n", 8000, threadParameters->window, true); } diff --git a/src/misc/gamelogic.c b/src/gamelogic.c similarity index 51% rename from src/misc/gamelogic.c rename to src/gamelogic.c index 15efcd5..0229d0b 100644 --- a/src/misc/gamelogic.c +++ b/src/gamelogic.c @@ -1,10 +1,11 @@ // gamelogic.c: Contains function definitons for dealing with the game's logic. // Barry Kane, 2022. +#include #include -#include "constants.h" -#include "gamelogic.h" -#include "playerdata.h" -#include "inputoutput.h" +#include "../include/constants.h" +#include "../include/gamelogic.h" +#include "../include/playerdata.h" +#include "../include/inputoutput.h" // ======================= // -=[ Main Game Loop ]=-: @@ -13,11 +14,13 @@ // Thread function which runs the main game loop, given the needed parameters: void * gameLogicLoop(void * parameters) { + char formattedString[64]; gameLogicParameters * threadParameters = parameters; inputMessage * currentInput = NULL; bool keepRunning = true; while(keepRunning) { + // Check for new messages and pop them off the queue: if(threadParameters->inputQueue->currentLength != 0) { while(threadParameters->inputQueue->lock == true) @@ -26,11 +29,15 @@ void * gameLogicLoop(void * parameters) } currentInput = peekInputMessage(threadParameters->inputQueue); userInputSanatize(currentInput->content->messageContent, MAX); + // A slash as the first character means the message is a user command: if(currentInput->content->messageContent[0] == '/') { // TODO: Implement Command Queue. - // For now, basic intepretation will do. - if(strncmp(¤tInput->content->messageContent[1], "EXIT", 4) == 0) + // For now, basic intepretation will do. + + // Exit command: Sends an "empty" exit message to disconnect a client: + if(strncmp(¤tInput->content->messageContent[1], "EXIT", 4) == 0 || + strncmp(¤tInput->content->messageContent[1], "exit", 4) == 0) { userMessage * exitMessage = malloc(sizeof(userMessage)); exitMessage->senderName[0] = '\0'; @@ -38,9 +45,13 @@ void * gameLogicLoop(void * parameters) queueTargetedOutputMessage(threadParameters->outputQueue, exitMessage, ¤tInput->sender, 1); free(exitMessage); } - if(strncmp(¤tInput->content->messageContent[1], "MOVE", 4) == 0) + + // Move command: Moves the current player down a path in their current area, given a pathname or number: + if(strncmp(¤tInput->content->messageContent[1], "MOVE", 4) == 0 || + strncmp(¤tInput->content->messageContent[1], "move", 4) == 0) { userMessage * moveMessage = malloc(sizeof(userMessage)); + bzero(moveMessage, sizeof(userMessage)); char requestedPath[32]; strncpy(requestedPath, ¤tInput->content->messageContent[6], 32); userInputSanatize(requestedPath, 32); @@ -55,12 +66,51 @@ void * gameLogicLoop(void * parameters) requestedPath[31] = '\0'; if(movePlayerToArea(currentInput->sender, requestedPath) == 0) { - strcpy(moveMessage->senderName, "\0"); - strcpy(moveMessage->messageContent, currentInput->sender->currentArea->areaDescription); + moveMessage->senderName[0] = '\0'; + strncat(moveMessage->messageContent, currentInput->sender->currentArea->areaName, 33); + strncat(moveMessage->messageContent, "\n", 2); + strncat(moveMessage->messageContent, currentInput->sender->currentArea->areaDescription, 256); + strncat(moveMessage->messageContent, "\nYou can go:", 13); + for(int index = 0; index < 16; index++) + { + if(currentInput->sender->currentArea->areaExits[index] != NULL) + { + snprintf(formattedString, 64, "\n\t%d. %s", index + 1, currentInput->sender->currentArea->areaExits[index]->pathName); + strncat(moveMessage->messageContent, formattedString, 64); + } + } queueTargetedOutputMessage(threadParameters->outputQueue, moveMessage, ¤tInput->sender, 1); } free(moveMessage); } + + // Look command: Sends the current area's name, description, and + if(strncmp(¤tInput->content->messageContent[1], "LOOK", 4) == 0 || + strncmp(¤tInput->content->messageContent[1], "look", 4) == 0) + { + userMessage * lookMessage = malloc(sizeof(userMessage)); + strncat(lookMessage->messageContent, currentInput->sender->currentArea->areaName, 33); + strncat(lookMessage->messageContent, "\n", 2); + strncat(lookMessage->messageContent, currentInput->sender->currentArea->areaDescription, 256); + strncat(lookMessage->messageContent, "\nYou can go:", 13); + for(int index = 0; index < 16; index++) + { + if(currentInput->sender->currentArea->areaExits[index] != NULL) + { + snprintf(formattedString, 64, "\n\t%d. %s", index + 1, currentInput->sender->currentArea->areaExits[index]->pathName); + strncat(lookMessage->messageContent, formattedString, 64); + } + } + queueTargetedOutputMessage(threadParameters->outputQueue, lookMessage, ¤tInput->sender, 1); + free(lookMessage); + } + + // Name command: Checks if the name is isn't used and is valid, then changes the player's name: + if(strncmp(¤tInput->content->messageContent[1], "NAME", 4) == 0 || + strncmp(¤tInput->content->messageContent[1], "name", 4) == 0) + { + + } } else { diff --git a/src/misc/inputoutput.c b/src/inputoutput.c similarity index 98% rename from src/misc/inputoutput.c rename to src/inputoutput.c index c6f0739..f2caa6a 100644 --- a/src/misc/inputoutput.c +++ b/src/inputoutput.c @@ -4,11 +4,11 @@ #include #include #include -#include -#include "constants.h" -#include "playerdata.h" -#include "inputoutput.h" +#include #include +#include "../include/constants.h" +#include "../include/playerdata.h" +#include "../include/inputoutput.h" // Sends a message to a given TLS session, wraps the calls to gnutls_write: int messageSend(gnutls_session_t receivingSession, userMessage * messageToSend) diff --git a/src/misc/lists.c b/src/lists.c similarity index 97% rename from src/misc/lists.c rename to src/lists.c index c85ab0b..a7379d0 100644 --- a/src/misc/lists.c +++ b/src/lists.c @@ -1,7 +1,7 @@ // Implementation of lists library for SilverMUD. // Barry Kane, 2021 -#include "lists.h" -#include "playerdata.h" +#include "../include/lists.h" +#include "../include/playerdata.h" areaNode * createAreaList(playerArea * initialArea) { diff --git a/src/misc/playerdata.c b/src/playerdata.c similarity index 85% rename from src/misc/playerdata.c rename to src/playerdata.c index e2f5d88..b4f52c7 100644 --- a/src/misc/playerdata.c +++ b/src/playerdata.c @@ -3,11 +3,27 @@ #include #include #include -#include "playerdata.h" +#include "../include/playerdata.h" // Move a player to a different area given a path in the area: int movePlayerToArea(playerInfo * player, char * requestedPath) { + // Check if a number was given first: + int selected = atoi(requestedPath); + if(selected != 0) + { + if(player->currentArea->areaExits[selected -1]->areaToJoin != NULL) + { + player->currentArea = player->currentArea->areaExits[selected - 1]->areaToJoin; + return 0; + } + else + { + return 1; + } + } + + // Otherwise search for the description: for (int index = 0; index < 16; index++) { if(player->currentArea->areaExits[index] != NULL) diff --git a/src/SilverMUDServer.c b/src/server/SilverMUDServer.c similarity index 97% rename from src/SilverMUDServer.c rename to src/server/SilverMUDServer.c index 37aae8e..be97ab7 100644 --- a/src/SilverMUDServer.c +++ b/src/server/SilverMUDServer.c @@ -14,12 +14,12 @@ #include #include #include -#include "misc/lists.h" -#include "misc/gamelogic.h" -#include "misc/constants.h" -#include "misc/playerdata.h" -#include "misc/texteffects.h" -#include "misc/inputoutput.h" +#include "../../include/lists.h" +#include "../../include/gamelogic.h" +#include "../../include/constants.h" +#include "../../include/playerdata.h" +#include "../../include/texteffects.h" +#include "../../include/inputoutput.h" typedef struct sockaddr sockaddr; diff --git a/src/misc/texteffects.c b/src/texteffects.c similarity index 100% rename from src/misc/texteffects.c rename to src/texteffects.c diff --git a/src/tests/list-test.c b/tests/list-test.c similarity index 100% rename from src/tests/list-test.c rename to tests/list-test.c diff --git a/src/tests/outputQueue-test.c b/tests/outputQueue-test.c similarity index 100% rename from src/tests/outputQueue-test.c rename to tests/outputQueue-test.c