#include <stdio.h>
#include <math.h>

int readpop(void);
int roll(int,int);
void readname(void);
void Fighters(void);
void Monasteries(void);
void Churches(void);
void Healers(void);
void Underworld(void);
void EssenceMasters(void);
void Theaters(void);
void Rangers(void);
void SpecialAgents(void);
void Scholars(void);
void Druids(void);
void Animists(void);
void Mentalists(void);
void Evil(void);
void Specialists(void);
void Printout(void);

    char name[15];
    int pop;
    int army, nco, jun, sen, gen, duelist, facademy, cavalier, nwarrior;
    int stmonk, monastery, wmstudent, mstudent, hwmstudent, wmonk, monk;
    int hwmonk, wmmaster, mmaster, hwmmaster;
    int clergy, temple, shrine, squire, paladin, epaladin;
    int thealer, chealer, lhealer, clinic;
    int underworld, nblade, assassin, thief, rogue;
    int magician, illusionist, warriormage, conjuror, runemaster, total, academy;
    int bard, dancer, dervish, theater;
    int ranger, beastmaster;
    int sorceror, mystic, sleuth, agency;
    int astrologer, seer, scholar, sage, hall;
    int druid, grove, shaman;
    int animist;
    int mentalist, montebanc;
    int necromancer, warlock, witch, chlord, macabre;
    int amage, delver, mmage, crmage, drlord;

void main()
{
    int i,n;
    char y;

    y = 'y';

    while(y = "y") {
        for(i=1; i<5; ++i)
            n = roll(100,1);
        readname();
        pop = readpop();
        printf("\n\nPopulation: %d\n", pop);
        Fighters();
        Monasteries();
        Churches();
        Healers();
        Underworld();
        EssenceMasters();
        Theaters();
        Rangers();
        SpecialAgents();
        Scholars();
        Druids();
        Animists();
        Mentalists();
        Evil();
        Specialists();
        Printout();
        printf("More? ");
        y=getchar();
    }
}

int readpop()
{
    char c, aray[8];
    int num, m, i, j, t;

    m = num = 0;
    printf("Population : ");
    while ((c=getchar()) != '\n') {
        ++m;
        aray[m] = c;
      }
    for (i=m; i>0; --i){
        c = aray[i];
        t = c - '0';
        for (j=(m-i); j>0; --j)
            t = t*10;
        num = num + t;
    }
    printf("%d",num);
    return num;
}

void readname()
{
    char c;
    int m;
    m = 0;

    printf("City name: ");
    while ((c=getchar()) != '\n') {
        ++m;
        name[m] = c;
    }
    while (m<16) {
        name[m] = ' ';
        ++m;
   }
    printf("\n");
}

int roll(type,num)
{
    int i,n;
    double m;
    m = n = 0;
    for (i=1; i<=num; ++i) {
        m = drand48();
        n = n + 1 + (m*type);
    }
    return n;
}

void Fighters()
{
    float f;

    f = (pop/10)*(50+roll(100,1))/100;
    army = f;
    nco = army/20;
    jun = nco/4;
    sen = jun/4;
    gen = sen/5;
    duelist = f =pop/400*roll(100,1)/100;
    facademy = f =(duelist/4)*(50+roll(100,2))/100;
    cavalier = f =army/50*(10+roll(100,2)/100);
    nwarrior = f =army/100*(40+roll(100,2))/100;
    printf("%4d %4d %4d %4d %4d %4d %4d %4d %4d\n", army, nco,
          jun, sen, gen, duelist, facademy, cavalier, nwarrior);
}

void Monasteries()
{
    stmonk = (pop/300)*(roll(100,2)/100);
    monastery = (stmonk/100) * ((50 + roll(100,1))/100);
    hwmstudent = stmonk*.15;
    wmstudent = stmonk*.5;
    mstudent = stmonk - (hwmstudent + wmstudent);
    hwmonk = hwmstudent/5;
    wmonk = wmstudent/5;
    monk = mstudent/5;
    hwmmaster = (hwmonk/10)*(roll(100,2)/100);
    wmmaster = (wmonk/10)*(roll(100,2)/100);
    mmaster = (monk/10)*roll(100,2)/100;
}

void Churches()
{
    clergy = pop/100*((50+roll(100,1))/100);
    temple = clergy/5*((50 + roll(100,1))/100);
    shrine = temple/3*((50+roll(100,1))/100);
    squire = shrine*roll(10,1);
    paladin = shrine*roll(5,1);
    epaladin = shrine*roll(5,1);
}

void Healers()
{
    thealer = pop/150*(50 + roll(100,1))/100;
    chealer = thealer*.3;
    lhealer = thealer - chealer;
    clinic = thealer/roll(10,3);
}

void Underworld()
{
    underworld = pop/100*(50+roll(100,2))/100;
    nblade = underworld*roll(10,2)/100;
    assassin = underworld*roll(10,3)/100;
    thief = (underworld-nblade-assassin)*roll(100,1)/100;
    rogue = underworld - nblade - thief - assassin;
}

void EssenceMasters()
{
    magician = pop/200*roll(100,2)/100;
    illusionist = pop/400*roll(100,2)/100;
    warriormage = pop/250*roll(100,2)/100;
    conjuror = pop/800*roll(100,2)/100;
    runemaster = pop/95000*roll(100,2);
    total = magician + illusionist+conjuror+runemaster;
    academy = total/5000*(50+roll(100,2));
}

void Theaters()
{
    bard = pop/200*roll(100,2)/100;
    dancer = pop/200*roll(100,2)/100;
    dervish =pop/300*roll(100,2)/100;
    theater = bard/roll(10,2);
}

void Rangers()
{
    ranger = army/10*roll(100,2)/100;
    beastmaster = army/200*roll(100,2)/100;
}

void SpecialAgents()
{
    sorceror = pop/700*roll(100,2)/100;
    mystic = pop/650*roll(100,2)/100;
    sleuth = pop/400*(50+roll(100,2))/100;
    agency = (mystic+sorceror+sleuth)/7*(50+roll(100,1))/100;

}

void Scholars()
{
    astrologer = pop/450*roll(100,2)/100;
    seer = pop/450*roll(100,2)/100;
    sage = pop/400*(50+roll(100,2))/100;
    hall = (astrologer+seer)/25*roll(100,2)/100;
    scholar = hall/10*roll(10,2);
}

void Druids()
{
    druid = pop/700*roll(100,2)/100;
    grove = druid/10*(50+roll(100,1))/100;
    shaman = pop/800*roll(100,2)/100;
}

void Animists()
{
    animist = pop/500*roll(100,2)/100;
}

void Mentalists()
{
    mentalist = pop/300*roll(200,2)/100;
    montebanc = pop/400*roll(200,2)/100;
}

void Specialists()
{
    amage = pop/1200*roll(100,1)/100;
    delver = pop/500*roll(100,2)/100;
    mmage = pop/400*(50+roll(100,2))/100;
    crmage = pop/500*roll(100,2)/100;
    drlord = pop/1200*roll(100,2)/100;
}

void Evil()
{
    necromancer = pop/900*roll(100,2)/100;
    warlock = pop/700*roll(100,2)/100;
    witch = pop/500*roll(100,2)/100;
    chlord = pop/5000*roll(100,2)/100;
    macabre = pop/800*(50+roll(100,1))/100;

}

void Printout()
{
   int i;

    printf("\nStatistics for ");
    for (i=1; i<16; ++i)
        printf("%c",name[i]);
    printf("Total Army: %d\n", army);
    printf("  Generals: %d   Senior Officers: %d   Junior: %d   NCO's: %d",
           gen, sen, jun, nco);
    printf("\nIndependets:\n   Duelists: %d    Fighting Academies: %d",
           duelist, facademy);
    printf("   Rangers: %d   Beastmasters: %d\n", ranger, beastmaster);
    printf("\nKing's Forces:\n   Cavaliers: %d   Noble Warriors: %d",
           cavalier, nwarrior);
    printf("\n\nMonasteries: %d\n", monastery);
    printf("Student Monks: %d   Monks: %d   Masters: %d\n", stmonk, monk,
            mmaster);
    printf("Student Warrior Monks: %d   Warrior Monks: %d   Masters: %d\n",
            wmstudent, wmonk, wmmaster);
    printf("Student High Warrior Monks: %d  HWM's: %d   Masters: %d\n",
           hwmstudent, hwmonk, hwmmaster);
    printf("\nReligion:\n");
    printf("Temples: %d        Clergy: %d\n", temple, clergy);
  printf("Shrines: %d   Squires: %d   Paladins: %d   Errant Paladins: %d\n",
         shrine, squire, paladin, epaladin);
    printf("\nHealers:    Total: %d\n", thealer);
    printf("Clinics: %d   Channeling Healers: %d   Lay Healers: %d\n",
           clinic, chealer, lhealer);
    printf("\nUnderworld: %d\n",underworld);
    printf("Thieves: %d   Rogues: %d   Assassins: %d   Night Blades: %d",
            thief, rogue, assassin, nblade);
    printf("\n\nEssence Masters: %d", total);
    printf("\nMagicians: %d   Illusionists: %d   Conjurors: %d",magician,
            illusionist, conjuror);
    printf("   Runemaster: %d    Warrior Mage: %d", runemaster,warriormage);
    printf("\n  Essence Academies: %d", academy);
    printf("\n\nTheaters: %d\n",theater);
    printf("Bards: %d   Dancers: %d   Dervishes: %d",bard, dancer, dervish);
    printf("\n\nAgencies: %d\n", agency);
    printf("Sorcerors: %d   Mystics: %d   Sleuths: %d\n\n",
            sorceror, mystic, sleuth);
    printf("Halls of Knowledge: %d\n", hall);
    printf("Astrologers: %d,  Seers: %d   Sages: %d   Scholars: %d\n\n",
            astrologer, seer, sage, scholar);
    printf("Sacred Groves: %d\n", grove);
    printf("Druids: %d         Shamans: %d\n\n", druid, shaman);
    printf("Animists: %d\n\n", animist);
    printf("Mentalists: %d        Montebancs: %d\n\n",mentalist,montebanc);
    printf("Evil Spell Casters\n\n");
    printf("Necromancers: %d   Witches: %d   Warlocks: %d",
            necromancer, witch, warlock);
    printf("\nMacabres: %d   Chaos Lords: %d\n\n", macabre, chlord);
    printf("Specialists:\n");
    printf("Delvers: %d   Dream Lords: %d\n", delver, drlord);
    printf("Arch Mages: %d   Crystal Mages: %d   Moon Mages: %d\n",
            amage, crmage, mmage);
}
