Game Programming
King of Dareux - Duality
Timeframe: 3 months
I worked as contract Gameplay and UI Programmer to fix bugs and implements features on an AA action-adventure RPG based on 4040 post-apocalyptic Earth.
Roboleon
Timeframe: 6 weeks
I co-wrote narrative and programmed gameplay, tools, and UI features for an 3rd-person dark, comedic, narrative puzzle game in Unity's HDRP on a team of 19. My goals were to integrate systems into gameplay and polish the UX of the save-load & UI systems.
Quipu Game
Timeframe: 5 months (3 Unity + 2 Unreal)
While finishing school, I sought to learn Unreal Engine and solo-developed an action adventure prototype following a Moche diver with telekinetic power, adapted from my original screenplay Quipu.
Totally Accurate Warehouse Simulator
Timeframe: 1 week
I programmed rigid body movement, procedural content, UI, and localization systems for a 3rd-person order delivery game in Unity's HDRP on a team of 19.
Computer Systems Projects
Cache Simulator
I implemented a program to simulate how a variety of caches perform on a variety of memory traces. I then used this program and the given traces to determine the best overall cache configuration.
Multithreaded Network Calculator
I created calculator that could work through a network connection, using a thread for each client connection. I made a struct type to represent the data associated with a particular client, which includes the client socket file descriptor and a pointer to the shared struct Calc instance. I added synchronization to my implementation so that expression evaluations are atomic.
#include/* for snprintf */ #include #include #include #include "csapp.h" #include "calc.h" #define LINEBUF_SIZE 1024 //max number of active threads. Chose 100 as an arbitrary upper value, should be changed later const int MAX_THREAD_COUNT = 20; //number of currently active threads int activeThreads = 0; struct ChatInfo { struct Calc *calc; int clientfd; }; int chat_with_client(struct Calc *calc, int infd, int outfd) { rio_t in; char linebuf[LINEBUF_SIZE]; /* wrap standard input (which is file descriptor 0) */ rio_readinitb(&in, infd); /* * Read lines of input, evaluate them as calculator expressions, * and (if evaluation was successful) print the result of each * expression. Quit when "quit" command is received. */ while (1) { ssize_t n = rio_readlineb(&in, linebuf, LINEBUF_SIZE); if (n <= 0) { /* error or end of input */ return 1; } if (strcmp(linebuf, "quit\n") == 0 || strcmp(linebuf, "quit\r\n") == 0) { /* quit command */ return 1; } if (strcmp(linebuf, "shutdown\n") == 0 || strcmp(linebuf, "shutdown\r\n") == 0) { /* shutdown command */ return 0; } else { /* process input line */ int result; if (calc_eval(calc, linebuf, &result) == 0) { /* expression couldn't be evaluated */ rio_writen(outfd, "Error\n", 6); } else { /* output result */ int len = snprintf(linebuf, LINEBUF_SIZE, "%d\n", result); if (len < LINEBUF_SIZE) { rio_writen(outfd, linebuf, len); } } } } } void *thread_chat(void *arg) { //increment threadsNow activeThreads++; struct ChatInfo *info = arg; pthread_detach(pthread_self()); /* chat with client using standard input and standard output */ int shutdown = !chat_with_client(info->calc, info->clientfd, info->clientfd); if(shutdown) { exit(0); } else { close(info->clientfd); } free(info); //decrement threadsNow activeThreads--; return NULL; } void fatal(const char *msg) { fprintf(stderr, "%s\n", msg); exit(1); } int create_server_socket(int port) { struct sockaddr_in serveraddr = {0}; int ssock_fd = socket(AF_INET, SOCK_STREAM, 0); if (ssock_fd < 0) fatal("socket failed"); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); serveraddr.sin_port = htons((unsigned short)port); if (bind(ssock_fd, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0) fatal("bind failed"); if (listen(ssock_fd, 5) < 0) fatal("listen failed"); return ssock_fd; } int accept_connection(int ssock_fd, struct sockaddr_in *clientaddr) { unsigned clientlen = sizeof(clientaddr); int client_fd = accept(ssock_fd, (struct sockaddr *) clientaddr, &clientlen); if (client_fd < 0) fatal("accept failed"); return client_fd; } int main(int argc, char **argv) { if (argc != 2) { fatal("Usage: ./server "); } int port = atoi(argv[1]); int ssock_fd = create_server_socket(port); struct Calc *calc = calc_create(); while (1) { struct sockaddr_in clientaddr; //check that max threads isn't reached and a shutdown command wasn't given int clientfd = accept_connection(ssock_fd, &clientaddr); //struct for thread directions struct ChatInfo *info = malloc(sizeof(struct ChatInfo)); info->calc = calc; info->clientfd = clientfd; //create thread to interract with client pthread_t thr_id; if(pthread_create(&thr_id, NULL, thread_chat, info) != 0){ fatal("pthread_create failed"); } } calc_destroy(calc); close(ssock_fd); return 0; }
/* * Interactive calculator program * */ #include/* for snprintf */ #include "csapp.h" /* for rio_ functions */ #include "calc.h" /* buffer size for reading lines of input from user */ #define LINEBUF_SIZE 1024 void chat_with_client(struct Calc *calc, int infd, int outfd); int main(void) { struct Calc *calc = calc_create(); /* chat with client using standard input and standard output */ chat_with_client(calc, 0, 1); calc_destroy(calc); return 0; } void chat_with_client(struct Calc *calc, int infd, int outfd) { rio_t in; char linebuf[LINEBUF_SIZE]; /* wrap standard input (which is file descriptor 0) */ rio_readinitb(&in, infd); /* * Read lines of input, evaluate them as calculator expressions, * and (if evaluation was successful) print the result of each * expression. Quit when "quit" command is received. */ int done = 0; while (!done) { ssize_t n = rio_readlineb(&in, linebuf, LINEBUF_SIZE); if (n <= 0) { /* error or end of input */ done = 1; } else if (strcmp(linebuf, "quit\n") == 0 || strcmp(linebuf, "quit\r\n") == 0) { /* quit command */ done = 1; } else if (strcmp(linebuf, "shutdown\n") == 0 || strcmp(linebuf, "shutdown\r\n") == 0) { /* shutdown command */ done = 1; } else { /* process input line */ int result; if (calc_eval(calc, linebuf, &result) == 0) { /* expression couldn't be evaluated */ rio_writen(outfd, "Error\n", 6); } else { /* output result */ int len = snprintf(linebuf, LINEBUF_SIZE, "%d\n", result); if (len < LINEBUF_SIZE) { rio_writen(outfd, linebuf, len); } } } } }
Java
Android Modular Tiles
I designed several games (i.e. memory, physical, social) for combined use with physical modular tiles with touch sensors and colored lights with a team @ Technical University of Denmark.
Logical Belief Revision Engine
I worked to implement a logical belief revision engine that takes in propositions, then revises, and removes them depending on contradictions.