I just wanted to post this as it may help someone out when making a D&D style battle engine for a game. I made this program in the C language a few years back and thought it would be helpful to someone; I hope it helps in a search.
M.T. Dixon
Code:
/* Code Title: NPC & MONSTER BATTLE ENGINE beta 0.1 - A fight simulation */
/* By: Michael Dixon (c). 04/14/2013 */
/* Objective: Using Struct to build multiple NPCs & Monsters for a battle. */
////////////////////////////////////////////////////////////////////////////////
// npcmon.h - this part of code will be moved in a header file. //
////////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <iostream>
#include <string>
#include <ctime>
#include <stdlib.h>
using namespace std;
//data structure for NPC & Monster Engine
struct npcmon
{
int npcmon_lev; //Set NPC's & Monster's Level.
int npcmon_exp; //Set NPC's & Monster's Experience.
int npcmon_hp; //Set NPC's & Monster's Hit Points.
int npcmon_gold; //Set NPC's & Monster's Gold.
int weapon_dmg; //Set Weapon Damage.
int mon_mov; //Set Monster's on/off move.
int npc_mov; //Set NPC's on/off move.
string npcmon_name; //Set name for NPC & Monster.
string weapon_name; //Set name for Weapon.
bool EndGame; //Used for Game loop.
bool EndBattle; //Used for battle loop.
void npc_attack(); //Funcion for Npc's attack.
void npc_dodge(); //Function for Npc's dodge.
void mon_attack(); //Funcion for Monster's attack.
void mon_dodge(); //Function for Monster's dodge.
void npcmon_action(); //Funtion for NPC's & Mon's action.
void npcmon_data(); //Function for NPC's & Mon's data.
void npcmon_move(); //Function sets NPC's & Mon's turn.
void npcmon_selection(); //Function to select a NPC & Mon.
void npcmon_greet(); //Function shows welcome screen.
void npcmon_battle(); //Function runs the battle.
void npcmon_show(); //Function to output battle data.
void npcmon_clr(); //Function to clear screen.
void npcmon_endEng(); //Function to end Engine.
};
// Member Selection Operators for NPC & Monster Battle Engine. //
/* NPC */
npcmon fighter; //Member for Fighter's data.
npcmon elf; //Member for Elf's data.
npcmon dwarf; //Member for Dwarf's data.
npcmon mage; //Member for Mage's data.
npcmon knight; //Member for Knight's data.
npcmon thief; //Member for Thief's data.
npcmon halfling; //Member for Halfling's data.
npcmon ranger; //Member for Ranger's data.
npcmon druid; //Member for Druid's data.
npcmon mystic; //Member for Mystic's data
/* Monster */
npcmon dragon; //Member for Dragon's data.
npcmon skeleton; //Member for Skeleton's data.
npcmon giant; //Member for Giant's data.
npcmon cyclops; //Member for Cyclop's data.
npcmon beholder; //Member for Beholder's data.
npcmon slime; //Member for Slime's data.
npcmon werewolf; //Member for Werewolf's data.
npcmon vampire; //Member for Vampire's data.
npcmon hydra; //Member for Hydra's data.
npcmon mummy; //Member for Mummy's data.
/* Other Member Selection Operators. */
npcmon npcmonset; //Member for functions.
npcmon npc; //Member for copying NPC's data.
npcmon mon; //Member for copying Monster's data.
////////////////////////////////////////////////////////////////////////////////
//npcmon.cpp - this part of code will stay as the main.cpp file. //
////////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
npcmonset.npcmon_greet();
npcmonset.npcmon_clr();
npcmonset.EndGame = true;
while (npcmonset.EndGame != false)
{
npcmonset.npcmon_data();
npcmonset.npcmon_selection();
npcmonset.npcmon_battle();
npcmonset.npcmon_endEng();
}
cout << " Please Wait. . ." << endl << endl;
Sleep(100);
cout << " End of NPC & MONSTER Battle Engine Beta 0.1" << endl << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
////////////////////////////////////////////////////////////////////////////////
// npcmonfuc.cpp - this part of code will be put in a file for all functions. //
////////////////////////////////////////////////////////////////////////////////
/* Function npcmon_greet() */
void npcmon::npcmon_greet()
{
cout << endl;
cout << " NPC & MONSTER BATTLE ENGINE beta 0.1" << endl;
cout << " Program By: Michael Dixon (C). 04/14/2013. " << endl << endl;
cout << " This program selects one monster and one npc" << endl;
cout << " for a fight simulation." << endl << endl;
system("PAUSE");
}
/* Function npcmon_data() */
void npcmon::npcmon_data()
{
// NPCs //
fighter.npcmon_lev = 3;
fighter.npcmon_exp = 4000;
fighter.npcmon_hp = 82;
fighter.weapon_dmg = 10;
fighter.npcmon_gold = 450;
fighter.npcmon_name = "Fighter";
fighter.weapon_name = "Bastard Sword - Two Handed";
elf.npcmon_lev = 7;
elf.npcmon_exp = 120000;
elf.npcmon_hp = 116;
elf.weapon_dmg = 18;
elf.npcmon_gold = 3000;
elf.npcmon_name = "Elf";
elf.weapon_name = "Magical Crossbow - Hvy";
dwarf.npcmon_lev = 12;
dwarf.npcmon_exp = 660000;
dwarf.npcmon_hp = 280;
dwarf.weapon_dmg = 14;
dwarf.npcmon_gold = 4800;
dwarf.npcmon_name = "Dwarf";
dwarf.weapon_name = "1 Hand Axe & 1 Battle Axe";
mage.npcmon_lev = 17;
mage.npcmon_exp = 1350000;
mage.npcmon_hp = 175;
mage.weapon_dmg = 18;
mage.npcmon_gold = 9000;
mage.npcmon_name = "Mage";
mage.weapon_name = "Magic Missiles";
knight.npcmon_lev = 10;
knight.npcmon_exp = 360000;
knight.npcmon_hp = 110;
knight.weapon_dmg = 8;
knight.npcmon_gold = 600;
knight.npcmon_name = "Knight";
knight.weapon_name = "Normal Sword";
thief.npcmon_lev = 5;
thief.npcmon_exp = 9600;
thief.npcmon_hp = 45;
thief.weapon_dmg = 6;
thief.npcmon_gold = 6000;
thief.npcmon_name = "Thief";
thief.weapon_name = "Short Sword";
halfling.npcmon_lev = 8;
halfling.npcmon_exp = 120000;
halfling.npcmon_hp = 72;
halfling.weapon_dmg = 6;
halfling.npcmon_gold = 900;
halfling.npcmon_name = "Halfling";
halfling.weapon_name = "Short Bow";
ranger.npcmon_lev = 1;
ranger.npcmon_exp = 4000;
ranger.npcmon_hp = 20;
ranger.weapon_dmg = 3;
ranger.npcmon_gold = 100;
ranger.npcmon_name = "Ranger";
ranger.weapon_name = "Light Sword";
druid.npcmon_lev = 12;
druid.npcmon_exp = 500000;
druid.npcmon_hp = 108;
druid.weapon_dmg = 9;
druid.npcmon_gold = 250;
druid.npcmon_name = "Druid";
druid.weapon_name = "Staff";
mystic.npcmon_lev = 16;
mystic.npcmon_exp = 1080000;
mystic.npcmon_hp = 190;
mystic.weapon_dmg = 20;
mystic.npcmon_gold = 600;
mystic.npcmon_name = "Mystic";
mystic.weapon_name = "War Hammer";
// Monsters //
dragon.npcmon_lev = 4;
dragon.npcmon_exp = 6300;
dragon.npcmon_hp = 240;
dragon.weapon_dmg = 30;
dragon.npcmon_gold = 800000;
dragon.npcmon_name = "Dragon";
dragon.weapon_name = "Breath of Fire";
skeleton.npcmon_lev = 1;
skeleton.npcmon_exp = 250;
skeleton.npcmon_hp = 20;
skeleton.weapon_dmg = 4;
skeleton.npcmon_gold =2;
skeleton.npcmon_name = "Skeleton";
skeleton.weapon_name = "Rusty Sword";
giant.npcmon_lev = 3;
giant.npcmon_exp = 720;
giant.npcmon_hp = 90;
giant.weapon_dmg = 18;
giant.npcmon_gold = 5000;
giant.npcmon_name = "Giant";
giant.weapon_name = "Boulder";
cyclops.npcmon_lev = 6;
cyclops.npcmon_exp = 9500;
cyclops.npcmon_hp = 109;
cyclops.weapon_dmg = 24;
cyclops.npcmon_gold = 80000;
cyclops.npcmon_name = "Cyclops";
cyclops.weapon_name = "Large Stone Axe";
beholder.npcmon_lev = 4;
beholder.npcmon_exp = 14975;
beholder.npcmon_hp = 80;
beholder.weapon_dmg = 16;
beholder.npcmon_gold = 400;
beholder.npcmon_name = "Beholder";
beholder.weapon_name = "Magic Eyes";
slime.npcmon_lev = 1;
slime.npcmon_exp = 200;
slime.npcmon_hp = 10;
slime.weapon_dmg = 4;
slime.npcmon_gold = 3;
slime.npcmon_name = "Slime";
slime.weapon_name = "Body Attack";
werewolf.npcmon_lev = 8;
werewolf.npcmon_exp = 20000;
werewolf.npcmon_hp = 40;
werewolf.weapon_dmg = 10;
werewolf.npcmon_gold = 30;
werewolf.npcmon_name = "Werewolf";
werewolf.weapon_name = "Claws";
vampire.npcmon_lev = 2;
vampire.npcmon_exp = 1500;
vampire.npcmon_hp = 96;
vampire.weapon_dmg = 13;
vampire.npcmon_gold = 4000;
vampire.npcmon_name = "Vampire";
vampire.weapon_name = "Hand Combat";
hydra.npcmon_lev = 7;
hydra.npcmon_exp = 200000;
hydra.npcmon_hp = 210;
hydra.weapon_dmg = 14;
hydra.npcmon_gold = 9000;
hydra.npcmon_name = "Hydra";
hydra.weapon_name = "Bite";
mummy.npcmon_lev = 3;
mummy.npcmon_exp = 500;
mummy.npcmon_hp = 40;
mummy.weapon_dmg = 4;
mummy.npcmon_gold = 16;
mummy.npcmon_name = "Mummy";
mummy.weapon_name = "Hand Combat";
}
/* Function npcmon_selection() */
void npcmon::npcmon_selection()
{
srand(time(0));
int randomNumber1 = rand();
int randomNumber2 = rand();
int dieOne = (randomNumber1 % 10) + 1;
int dieTwo = (randomNumber2 % 10) + 1;
if (dieOne == 1) npc = fighter;
if (dieOne == 2) npc = elf;
if (dieOne == 3) npc = dwarf;
if (dieOne == 4) npc = mage;
if (dieOne == 5) npc = knight;
if (dieOne == 6) npc = halfling;
if (dieOne == 7) npc = ranger;
if (dieOne == 8) npc = thief;
if (dieOne == 9) npc = druid;
if (dieOne == 10) npc = mystic;
if (dieTwo == 1) mon = dragon;
if (dieTwo == 2) mon = skeleton;
if (dieTwo == 3) mon = giant;
if (dieTwo == 4) mon = cyclops;
if (dieTwo == 5) mon = beholder;
if (dieTwo == 6) mon = slime;
if (dieTwo == 7) mon = werewolf;
if (dieTwo == 8) mon = vampire;
if (dieTwo == 9) mon = hydra;
if (dieTwo == 10) mon = mummy;
mon.npcmon_show();
npc.npcmon_show();
}
/* Function npcmon_battle() */
void npcmon::npcmon_battle()
{
system("pause");
Sleep(600);
npcmon_clr();
EndBattle = true;
while (EndBattle != false)
{
npcmon_move();
npcmon_action();
if (mon.npcmon_hp <= 0)
{
mon.npcmon_hp = 0;
EndBattle = false;
}
if (npc.npcmon_hp <= 0)
{
npc.npcmon_hp = 0;
EndBattle = false;
}
}
}
/* Function npcmon_move() */
void npcmon::npcmon_move()
{
srand(time(0));
int randomNumber = rand();
int die = (randomNumber % 2) + 1;
if (die == 1) mon_mov = 1;
if (die == 2) npc_mov = 1;
}
/* Function npcmon_action() */
void npcmon::npcmon_action()
{
srand(time(0));
int randomNumber1 = rand();
int randomNumber2 = rand();
int die1 = (randomNumber1 % 2) + 1;
int die2 = (randomNumber2 % 2) + 1;
if (mon_mov == 1)
{
switch(die1)
{
case 1: mon_attack();
case 2: mon_dodge();
}
if (npc_mov == 1)
{
switch(die2)
{
case 1: npc_attack();
case 2: npc_dodge();
}
}
}
}
/* Group of Functions for npcmon_action() Function */
// Monsters //
void npcmon::mon_attack()
{
npc.npcmon_hp = npc.npcmon_hp - mon.weapon_dmg;
cout << mon.npcmon_name << " attacks and caused " << mon.weapon_dmg
<< " HP of DMG to " << npc.npcmon_name << "." << endl;
cout << npc.npcmon_name << " has " << npc.npcmon_hp << " HP. " << endl << endl;
Sleep(3000);
npcmon_clr();
}
void npcmon::mon_dodge()
{
int holdNum = 3;
mon.npcmon_hp = mon.npcmon_hp - holdNum;
cout << npc.npcmon_name << " dodged " << mon.npcmon_name << " attack. "
<< endl;
cout << mon.npcmon_name << " takes " << holdNum << " HP of DMG. " << endl;
cout << mon.npcmon_name << " now has " << mon.npcmon_hp
<< " HP. " << endl << endl;
Sleep(3000);
npcmon_clr();
}
// NPCs //
void npcmon::npc_attack()
{
mon.npcmon_hp = mon.npcmon_hp - npc.weapon_dmg;
cout << npc.npcmon_name << " attacks and caused " << npc.weapon_dmg
<< " HP of DMG to " << mon.npcmon_name << "." << endl;
cout << mon.npcmon_name << " has " << mon.npcmon_hp
<< " HP. " << endl << endl;
Sleep(3000);
npcmon_clr();
}
void npcmon::npc_dodge()
{
int holdNum = 1;
npc.npcmon_hp = npc.npcmon_hp - holdNum;
cout << mon.npcmon_name << " dodged " << npc.npcmon_name << " attack. "
<< endl;
cout << npc.npcmon_name << " takes " << holdNum << " HP of DMG. " << endl;
cout << npc.npcmon_name << " now has " << npc.npcmon_hp
<< " hit points left. " << endl << endl;
Sleep(3000);
npcmon_clr();
}
/* Functions for npcmon_show() */
void npcmon::npcmon_show()
{
cout << endl << " " << npcmon_name << " Lev: " << npcmon_lev
<< endl << endl;
cout << " HP: " << npcmon_hp << endl;
cout << " EXP: " << npcmon_exp << endl;
cout << " GLD: " <<npcmon_gold << endl << endl;
cout << " WEAPON: " << weapon_name << " (DMG = " << weapon_dmg << ")"
<< endl << endl;
}
/* Function npcmon_clr() */
void npcmon::npcmon_clr()
{
system("cls");
}
/* Function npcmon_endEng() */
void npcmon::npcmon_endEng()
{
if (mon.npcmon_hp == 0)
{
cout << npc.npcmon_name << " won the battle." << endl << endl;
}
if (npc.npcmon_hp == 0)
{
cout << mon.npcmon_name << " won the battle." << endl << endl;
}
cout << "The computer will make a choice to play again or quit." << endl
<< endl;
system ("PAUSE");
srand(time(0));
int randomNumber = rand();
int die = (randomNumber % 2) + 1;
if (die == 1)
{
cout << endl << "The computer chose to play again." << endl << endl;
Sleep(3000);
npcmon_clr();
}
if (die == 2)
{
cout << endl << "The computer chose to quit the program." << endl << endl;
Sleep(2000);
npcmonset.EndGame = false;
}
}