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.

