Hi. My name is Adnan el-Bedawi.

I am an aspiring software developer with a passion for game design. A few of my all-time favorite games are Star Wars Galaxies (SOE), World of Warcraft (Blizzard), FFXIV (Square Enix), Jade Dynasty (Perfect World Entertainment), and Baldur’s Gate 3 (Larian Studios).

My goal is to find a career that allows me to not only have an impact in our technology-based society, but to also express my creativity as a person.

Following my undergraduate studies in Computer Science at Drexel University, I am currently working full time as an Infrastructure Engineer at NBME. In this role, I use my technical expertise and knowledge of systems to provide excellent customer service to both internal and external customers, for services including but not limited to Microsoft Power Platform, Office 365, SharePoint, and Citrix.

Currently, I am pursuing a bachelor’s of science in Software Engineering at Western Governors University.

I am a leader, a self-learner, and a person who is driven to achieve their goals.

Highlighted below are several personal and professional projects, both current and completed.

Experience and Projects

ROBLOX - Clover: Kingdom of Magic

Anticipated Release Date: Q4 2024

About the project

Clover: Kingdom of Magic is a multiplayer, open-world action game, currently being designed by Round Table Interactive, LLC. The world as a whole, from level design to characters and abilities, UX/UI, and gameplay systems are being designed and developed by a core team of 4 developers and artists, including myself.

This is a game that is built on Roblox’s internal engine. Leveraging LUA, I am coding all of the game’s main systems, from NPC pathfinding, to ability selection and attack patterns, hitbox detection, client-server data replication, projectile physics simulation, calculating collision detections, and finite-state machines for different gameplay systems including combat states.

The game world is inspired by the animanga Black Clover. The level design, enemies, spell effects, and storyline are being developed with heavy emphasis on a “Magic” theme. As players first embark on their adventure, they choose which magical “Tome” to use, allowing them access to different abilities based on the chosen element.

PvE and PvP features are both being incorporated in to the game. Additionally, C: KoM will feature a racing system where players can challenge each other in “flying broom” races for rewards.

My roles:
  • Lead Programmer
  • Technical Artist
  • 3D Animator
 
Responsibilities:
  • Collaborate on a team of 4 to design & develop an online multiplayer game hosted on Roblox’s servers
  • Using LUA, program video game systems:  inventory management, projectile physics, pathfinding AI, client-server hitbox detection and verification, client-server object replication, server-side database push + pull requests
  • Implement core game design concepts such as player progression and gameplay loops, combat mechanics, UX/UI, accessibility
  • Develop and animate 3D and 2D assets with Blender, using scripting to incorporate the key frame sequences into the game as character abilities

Minecraft - Saiyan Craft

April 2014 - April 2018; September 2020 - June 2021

    
// ## Created by Kish
// ## © SAIYANCRAFT 2020
// ## FOR USE ON SAIYAN CRAFT OFFICIAL SERVER ****ONLY****
/* ## Labyrinth customnpc mini-boss for SC Halloween event 2020.*/

// ** INIT **

//Attack and Health
npc.setMeleeStrength(14750000);
npc.setRangedStrength(14750000);

npc.setMaxHealth(2000000000);
npc.setHealth(2000000000);

npc.setTempData("halfHpLineSaid", false);
npc.setTempData("nearDeathLineSaid", false);
npc.setTempData("transformed", false);
npc.setTempData("dead", false);

npc.setTempData("hitsTracker", []);
npc.setTempData("damageTracker", []);
npc.setTempData("lastHp", npc.getHealth());

var x = npc.x;
var y = npc.y;
var z = npc.z;
world.spawnClone(x-5, y, z-5, 6, "MinionFinale");
world.spawnClone(x-5, y, z+5, 6, "MinionFinale");
world.spawnClone(x+5, y, z+5, 6, "MinionFinale");
world.spawnClone(x+5, y, z-5, 6, "MinionFinale");

world.spawnClone(x-10, y, z-10, 6, "MinionFinale");
world.spawnClone(x-10, y, z+10, 6, "MinionFinale");
world.spawnClone(x+10, y, z+10, 6, "MinionFinale");
world.spawnClone(x+10, y, z-10, 6, "MinionFinale");

world.spawnClone(x-15, y, z-15, 6, "MinionFinale");
world.spawnClone(x-15, y, z+15, 6, "MinionFinale");
world.spawnClone(x+15, y, z+15, 6, "MinionFinale");
world.spawnClone(x+15, y, z-15, 6, "MinionFinale");


// ** UPDATE **
// ## Created by Kish
// ## © SAIYANCRAFT 2020
// ## FOR USE ON SAIYAN CRAFT OFFICIAL SERVER ****ONLY****
var rand = Math.floor(Math.random() * 10);
var x = (npc.x+(" "));
var y = (npc.y+(" "));
var z = (npc.z+(" "));
var coords = (x+y+z);
var dead = npc.getTempData("dead");

// Variables for damage tracker.
var dmg = npc.getTempData("lastHp") - npc.getHealth();
var playerName = npc.getTempData("damagedBy");
var inHitsTracker = false;
var inDamageTracker = false;
var hitsTracker = npc.getTempData("hitsTracker");
var damageTracker = npc.getTempData("damageTracker"); 

// DAMAGE TRACKER CODE
// Prevents npc from adding to damage trackers if it hasn't been hit.
if (npc.getTempData("addToDamage"))
{
	//Check for player name in hits tracker. If player has damaged npc, add +1 to total hits. If it hasn't, add player name to list of hits tracked.
	for (var i in hitsTracker){
		if (i == playerName)
		{
			hitsTracker[i] += 1;
			npc.setTempData("hitsTracker", hitsTracker);
			inHitsTracker = true;
			//npc.say("Player " + playerName + " found in hit tracker. Adding 1 hit."); DEBUG
		}
	}
	if (!inHitsTracker)
	{
		hitsTracker[playerName] = 1;
		npc.setTempData("hitsTracker", hitsTracker);
		//npc.say("Player " + playerName + " NOT found in hit tracker. Adding 1 hit."); DEBUG
	}

	//Check for player name in damage tracker. If player has damaged npc, add dmg amount to total damage. If it hasn't, add player name and current damage to damage tracked.
	for (var i in damageTracker){
		if (i == playerName)
		{
			damageTracker[i] += dmg;
			npc.setTempData("damageTracker", damageTracker);
			inDamageTracker = true;
			//npc.say("Player " + playerName + " found in damage tracker. Adding " + dmg + " damage."); DEBUG
		}
	}
	if (!inDamageTracker)
	{
		damageTracker[playerName] = dmg;
		npc.setTempData("damageTracker", damageTracker);
		//npc.say("Player " + playerName + " NOT found in damage tracker. Adding " + dmg + " damage."); DEBUG
	}		
}

npc.setTempData("addToDamage", false);

// Initialize target var
var target = npc.getTempData("target");

// ** NOTE TO SELF: NPC'S SET TO "DEFENSE FACTION MEMBERS" WILL BREAK THE INSTANT TRANSMISSION SCRIPT. THIS FACTION SETTING SEEMS TO HANDLE TARGETING DIFFERENTLY.
// Instant transmission
function instantTransmission(x, y, z){
	// Teleports close to player.
	var newX = Math.random()*2 + x;
	var newZ = Math.random()*2 + z;
	npc.setPosition(newX, y, newZ);
	npc.executeCommand("playsound mob.wither.shoot " + target.getName());
}
if((npc.isAttacking()) && (dead != true) && (target != null))
{
	// If npc isn't within range of the player, teleport to player OR shoot ki blast (lower chance for blast). This npc randomly picks between both options.
	if((Math.abs(target.x - npc.x) > 20) || (Math.abs(target.y - npc.y) > 10) || (Math.abs(target.z - npc.z) > 20))
	{
		if(rand <= 3) /// Lower # = lower chance (range from 0 - 10)
		{
			npc.executeCommand("/dbcspawnki 1 1 9000000 0 5 1 1 100 " +coords);
		}
		else
		{
			instantTransmission(target.x, target.y, target.z);
		}
	}
}

// ** TARGET **
npc.setTempData("target", event.getTarget());

// ** DAMAGED **
// ## Created by Kish
// ## © SAIYANCRAFT 2020
// ## FOR USE ON SAIYAN CRAFT OFFICIAL SERVER ****ONLY****
var source = event.getSource();
var dmg = npc.getMaxHealth() - npc.getHealth();
var halfHpLineSaid = npc.getTempData("halfHpLineSaid");
var nearDeathLineSaid = npc.getTempData("nearDeathLineSaid");
var rand = Math.floor(Math.random() * 10);


// Start gathering information for damage tracker when damaged.
var playerName = source.getName();
npc.setTempData("lastHp", npc.getHealth());
npc.setTempData("damagedBy", playerName);
npc.setTempData("addToDamage", true);

// Say half hp & near-death lines
if ((dmg >= npc.getMaxHealth() / 2) && !halfHpLineSaid)
{
	npc.say("This world will be mine. Bow before greatness.");
	halfHpLineSaid = true;
	npc.setTempData("halfHpLineSaid", halfHpLineSaid);		
}
else if ((dmg >= npc.getMaxHealth() / 1.25) && !nearDeathLineSaid)
{
	npc.say(".");
	nearDeathLineSaid = true;
	npc.setTempData("nearDeathLineSaid", nearDeathLineSaid);
}

// ** KILLED **
// ## Created by Kish
// ## © SAIYANCRAFT 2020
// ## FOR USE ON SAIYAN CRAFT OFFICIAL SERVER ****ONLY****
var source = event.getSource();
var playerName = source.getName();
var oneShotKill = true;

// Send message on death
//source.sendMessage("Goku: (Thank you...)");
npc.setTempData("dead", true);

// Reward players based on their contribution to the kill.
var hitsTracker = npc.getTempData("hitsTracker");
var damageTracker = npc.getTempData("damageTracker");

var maxHealth = npc.getMaxHealth();
var minReward = maxHealth / 100; // 1% of boss's hp.
var regReward = maxHealth / 20; // 5% of boss's hp.
var goldReward = maxHealth / 10; // 10% of boss's hp.
var diamondReward = maxHealth / 3; // 30% of boss's hp.
var legendaryReward = maxHealth / 2; // half of boss's hp.

for (var i in hitsTracker)
{
	
	// If the player that kills this NPC isn't found in the damage tracker (because they got last hit or killed it in one hit,) oneShotKill flag stays true, and they are rewarded after players who contributed damage are rewarded.
	if (i == playerName)
	{
		oneShotKill = false;
	}
	
	if (damageTracker[i] >= legendaryReward)
	{
	    npc.executeCommand("/citems give -p " + i + " 500milticket -a 10"); 
		npc.executeCommand("/citems give -p " + i + " SoulSack -a 10");
		npc.executeCommand("/citems give -p " + i + " immortalsoul -a 10");
		npc.executeCommand("/citems give -p " + i + " DemonSlayerGlaive -a 1");		
		npc.executeCommand("/msg " + i + " You have received the &4Legendary &flevel reward for your contribution in defeating " + npc.getName() + ".");
	}	
	else if (damageTracker[i] >= diamondReward)
	{
	    npc.executeCommand("/citems give -p " + i + " 500milticket -a 8"); 
		npc.executeCommand("/citems give -p " + i + " SoulSack -a 7");
		npc.executeCommand("/citems give -p " + i + " immortalsoul -a 5");
		npc.executeCommand("/citems give -p " + i + " DemonSlayerGlaive -a 1");	
		npc.executeCommand("/msg " + i + " You have received the &bDiamond &flevel reward for your contribution in defeating " + npc.getName() + ".");
	}
	else if (damageTracker[i] >= goldReward)
	{
	    npc.executeCommand("/citems give -p " + i + " 500milticket -a 7"); 
		npc.executeCommand("/citems give -p " + i + " SoulSack -a 5");
		npc.executeCommand("/citems give -p " + i + " immortalsoul -a 4");
		npc.executeCommand("/citems give -p " + i + " DemonSlayerGlaive -a 1");	
		npc.executeCommand("/msg " + i + " You have been rewarded for your contribution in defeating " + npc.getName() + ".");
	}
	else if (damageTracker[i] >= regReward)
	{
	    npc.executeCommand("/citems give -p " + i + " 500milticket -a 6"); 
		npc.executeCommand("/citems give -p " + i + " SoulSack -a 2");
		npc.executeCommand("/citems give -p " + i + " immortalsoul -a 4");
		npc.executeCommand("/citems give -p " + i + " DemonSlayerGlaive -a 1");	
		npc.executeCommand("/msg " + i + " You have been rewarded for your contribution in defeating " + npc.getName() + ".");
	}
	else if ((hitsTracker[i] >= 15) || (damageTracker[i] >= minReward))
	{
	    npc.executeCommand("/citems give -p " + i + " 500milticket -a 4"); 
		npc.executeCommand("/citems give -p " + i + " SoulSack -a 1");
		npc.executeCommand("/citems give -p " + i + " immortalsoul -a 4");
		npc.executeCommand("/citems give -p " + i + " DemonSlayerGlaive -a 1");	
		npc.executeCommand("/msg " + i + " You have been rewarded for your contribution in defeating " + npc.getName() + ".");
	}
	
}

if (oneShotKill)
{
	npc.executeCommand("/citems give -p " + playerName + " 500milticket -a 4"); 
	npc.executeCommand("/citems give -p " + playerName + " SoulSack -a 1");
	npc.executeCommand("/citems give -p " + playerName + " immortalsoul -a 4");
	npc.executeCommand("/citems give -p " + playerName + " DemonSlayerGlaive -a 1");	
	npc.executeCommand("/msg " + playerName + " You have been rewarded for your contribution in defeating " + npc.getName() + ".");
}
else
{
//	npc.executeCommand("/msg " + playerName + " Debug! OneShotKill was " + oneShotKill + "!");
}

    

JavaScript code by me: initializes "Raid Boss" mob, tracks and attacks targets, tracks player damage, and gives rewards on death based on damage done.

Copy + paste into code editor for accurate indentation.

Player-made video from the server's early days

About the project

Saiyan Craft was a customized Minecraft server and subsequent community of gamers. I designed, configured, and implemented all of the backend processes supporting this server. I also designed the community website, managed user permissions both in-game and on the website, and coded updates for the game with JavaScript.

This effort was accomplished with the help of a team of 4 other staff, who helped to design, manage and communicate updates to our player base.

At its core, the server was themed around a “Dragon Ball Z” Minecraft mod. Players could create their own character, follow a “Dragon Ball” – themed questline, level up, spend stat points on new abilities, and participate in both PvP and PvE activities.

Snippet from the server’s voting platform: “Saiyan Craft is a 24/7 Dragon Block C server. Dragon Block C is a mod for Minecraft based on the popular show and Manga Dragon Ball Z. You can become a Human, Namekian, or even a Saiyan like Goku and fight against enemies like Frieza and Saibamen in order to train and become strong enough to use powerful Ki blasts! The mod also includes a saga feature which allows you to complete sagas while you train and fight enemies like Vegeta and the Androids. (The Dragon Block C mod and its components are required to join the server.)”

My roles:
  • Server Architect
  • Community Manager
  • Gameplay Programmer
  • Website Administrator
 
Responsibilities:
  • Led a team of 5 consisting of developers, community managers, and artists to design and implement content, communicating updates to our player base.
  • Developed content for the server with JavaScript.
  • Managed and supported user data, including purchase records.
  • Performed disaster recovery actions in event of change management failure or malware attack.

Au Luxe 79

Release Date: Q1 2020

About the project

Au Luxe 79 was a high-end custom “Travel Box” store. I was hired as a full-stack developer to help design, develop and implement a full web application. The site was designed based on customer feedback and intent.

I developed the entire solution, both front-end and backend, and utilized a dedicated web server host to run the site. JavaScript, HTML5 and CSS were used on the front-end to style the web pages, while PHP and SQL were utilized to communicate information to and from the site’s database. 

Au Luxe 79 featured a custom “buzz-feed” style product purchase flow. Customers would create an account, choose a product, and then fill out a stylized survey. The answers to the survey were attached to the customer’s order, and sent to the store owner on product purchase. The answers were then used to create a personalized product. Users could sign in and view the answers to their past surveys.

My role:
  • Full-Stack Developer
 
Responsibilities:
  • Designed and delivered in full a custom website, leveraging CSS, JavaScript and jQuery, implementing changes based on customer feedback.
  • Fully designed and implemented a server-side database solution with mySQL and PHP.
  • Met regularly with stakeholders to ascertain customer satisfaction, adjusting design as required, while aiming to stay within negotiated timeframes.

Portfolio page designed for and by Adnan el-Bedawi.

Contact:
Email: elbedawia@yahoo.com
LinkedIn: https://www.linkedin.com/in/gladnan98/