RTS Development and Something More

I also wanted to point out my system specs while developing this game -

The game is being tested on a four logical cpu system of 2.4 ghz, but the game itself only runs on one logical core; so in essence, game performance is based on a single 2.4 ghz processor.

(which is still faster than a true single core 2.4 ghz processor because a true single core machine runs every other process on the same cpu.)

The graphic card used for the graphic load is an ATI Radeon HD 2600 XT. That’s an old graphic card and such a card will not play most newer games hitting the market today (at least not with a super blazing frame rate while having maxed graphic settings).

The 2600 XT is holding up nicely with my game so far. :slight_smile: My goal is to stay above 30 fps, even at the most intense graphical moments.

The reason for this limitaion: to make sure some older systems will be able to run the game at an acceptable frame rate, while top-notch systems will “blaze” the game.

I believe a Linux OS can be installed on a PC with Windows as a separate partition. I understand a MAC OS must be on an apple PC (at least that’s what I’ve researched).

I won’t worry about the game running on Linux or Mac until it’s complete on Windows. Any suggestions on that, feel free to share them. I do want this game to cross-platform without issues.

PS,

I looked at the specs on the 5800s graphic card series and oh my lord! What processing power!!

I’m at one of those points now where I just have to stop and get some things clear in my head before I start writing more code. I just competed writing and debugging the code which controls the Move To Point function of the Heroes command tab. (for both groups this time)

Now both, Team A and Team B, can move to the point specified by the “gamer”, plus, the “gamer” can single out a specific Hero and move them alone to a point.

Ok…

What I have to decide on now is the strength of user control versus that of CPU control. For instance, if I told one of my Heroes to move to point (10, 25, 0) and on the way there that Hero gets attacked by an enemy, should the Hero finish the move or engage the enemy?

That’s one of the questions I had in my head but then I looked at my tab and saw that I did include a passive and aggressive mode. I mentioned in a previous post that the game Final Fantasy 12 has used a similar battle system style, but mine is my own thought and I’ll explain –

In FF12, it’s pretty much a turn based battling system in which you can control your characters or let the selected AI control them. If you controlled a FF12 Character, you could select which moves or abilities to use on an enemy. You could also tell a character that was being control by AI to do something specific if you wanted to, or just let them do their thing.

With my system, for starters…

It has a passive and aggressive mode, similar to the pet controls of an MMORPG. If you have played World of Warcraft as a hunter, then you can relate to how your pet controls were designed.

The passive and aggressive will work the same way within my combat system. Going back to that situation of telling a Hero to move to a point and an enemy comes and attacks –

If passive mode was set at the time, then the Hero would ignore the attacks from the enemy and continue to move towards the specified point until reached. If aggressive mode was set at the time, then the move to point would cancel and the Hero would start kicking enemy butt.

A similar scenario would be if I were to send Hero group B back to the city (retreat) with aggressive mode on and they run across some enemies. They would stop going to the city and start stomping enemies. If passive was on, they would indeed go back to their city.

That’s how the passive and aggressive modes can alter the out come of some commands.

As far as attacking goes –

The “gamer” will be able to tell a Hero to attack a specific enemy, but that command may not stick. What I mean by that is this…

Suppose you select a Hero who is a “Shieldmaiden” and you tell her to go attack Enemy C. Now lets say the number one AI slot for that Hero is filled with the ability “Taunt Enemy” and the requirement for the AI is set to “Boss.” Each slot in my AI setup will number from 1 onward, with number 1 being the top priority and number 2 being the next and so on.

In the scenario with the “Shieldmaiden” Hero, rather or not she actually attacks Enemy C depends on what’s going on around her. If she goes to attack Enemy C, but realize a Boss type enemy is within reach, she will Taunt the Boss. Why? Because Taunt Boss is set as the highest AI priority within her AI build. If a Boss was not in the area, she would indeed go and attack Enemy C.

The thing is, the “gamer” will never really have to tell a Hero to attack an Enemy because Heroes will do it any way if they are set to aggressive and enemies are within their range.

You can see how I want to design the combat system…

Very flexible.

Going back to attacking for Heroes; you can specify a specific enemy to attack if you wanted to, but what attack moves trigger is entirely dependant on your Heroes levels and AI builds. The higher level a Hero, the more abilities will become available, which means you have more things to build an AI around. No Hero will automatically do skilled attacks if you don’t set them. Heroes will only perform basic auto attacks on their own; which is also the case with a lot of MMORPGs.

Lets say you have a Healer Hero in your group. Your Healer will not just heal the members of his or her group. This is where the “gamer’s” IQ comes into play. Lets say the Healer has the ability Heal Level 1 for a Single target set to AI slot 1 –

Your requirements will also be different little pieces of the AI which can be acquired during gameplay. Lets say your Healer has the requirement HP90% and the requirement HP40%. If you add requirement HP90% as a requirement for slot 1, which has Heal Level 1 set, your Healer would indeed heal one of their members when that member’s health drops at or below 90 percent.

That’s how the AI building system will be constructed; with an ability/skill and a requirement placed at a slot. Going back to the “gamer’s” IQ….

Sure, healing at 90% seems fine, but think about how fast your Healer will burn through Magic Points. Setting the requirement to HP40% may be the smarter choice. If your Heroes are not taking over sized damage per hit, then why waste Healer magic points by healing them at 90% remaining health? They’re not in a danger zone for health or anything.

In fact, lets set HP40% to slot one’s Heal level 1 ability and lets set Heal level 2 to slot two, but lets add the requirement HP25% to slot two’s ability/skill. With this new AI build, your Healer will now cast a much bigger heal on a member when that member’s health is at 25 % or less, which makes sense. Cast the bigger heal in a more critical situation, which will preserve magic points.

That’s what my AI building system will do, it will leave you hanging. It will not take you by the hand and lead the way; it is up to you to decide what your Heroes will do and when they will do it and in what priority.

Given the fact abilities and ability requirements both have to be gained through game play, setting a really good AI can be hard if you’re lacking the requirement types. This is where I’m thinking about using the Third Game Genre style.

RPG + RTS + ???

Players will have to earn the “requirement types” for skills and abilities through out the game. I may not give every skill and ability through Hero level gain. Those are things I have to consider as I bring my combat system to life.

All this code writing day after day is tiring… The good thing for me is, I can code anything I want to code; which means, I can bring any ideal I have to life. It’s just a matter of wanting to do the programming work.

That’s why I try not to overwhelm myself and do things that are more simple and practical.

(As if coming up with my Path Finding AI for an engine I’m new to was practical… That was down outright ingenious. 8) )

Regards

I had a rough couple of days. I woke up really sick and had to see a doctor; so I’ve been taking it easy. Doctor didn’t find anything wrong though, anyway…

I’m currently working on an alien look for my enemy race. What I like to do is start with something that look somewhat human and go from there.

In the screenshot, I’m checking to see how the shaping is coming along so far, but have found a lot of areas that need some more shaping. It’s hard when you’re dealing with a low vertice count. The vertice count in the screen shot is false. This model is under 1k so far and most likely will finish around 1k.

Image Removed

I already have an idea of what I’ll be aiming for. This race will appear more “animalistic.” That is, they will have the pointy ears, vangs, claws, distorted legs and an unusual skin color.

I also want this race to look more tribal in dress. Once I get a prototype of the enemy race done and skinned, I can then create some basic animations, which would thus allow me to go ahead and program the enemy AI.

That is my ultimate at the moment goal…getting to enemy AI.


Muscle contour shot (player’s race) -
(old screenshot)

Image Removed

The actor is sawing in the screenshot, but I haven’t added those building objects/tools yet.

ps, thumbnails should be clickable (for larger views).

I think I ate too much today… I feel stuffed! When I’m stuffed, I tend to get tired and lazy. :laughing:

Anyway,

Making sure I get the skinning for this race done today, so I can move on to other things tomorrow.

Moving the Head around:

Image Removed

Dropping the Jaw here:

Image Removed

Testing eyelid movement:

Image Removed

I just about have this ‘sucker’ wrapped up. Characters don’t look like much before texturing, that’s for sure.

I won’t even bothering throwing a place holder on this one (like I did the other race); I’ll take care of it during the “graphic stage” of development.

I was thinking of a persona for the leader of this race and I think I want to go with something like “Kain” from the “legacy of kain” series.

That was a sweet Antagonist!

So Mr. Evil Boss man will most likely end up with long hair; white or some other color.

I’m going to enjoy doing the cut scenes for this race of people. They are so ‘devilishly’ cunning according to the story. :slight_smile:

My goal for this month of May is to get the combat system done and finish as many animations as I can.

Once the combat system is in… Wow… A lot of this project will be done. From there, I will start planning all the scenarios for level 1 and all the other places that make up the level 1 island continent.

I won’t stop until the fat panda sings! :laughing:

This is a Concept Render for my enemy race. From the image, you can get some idea of what I’ll be aiming for later; when I do texture mats for actors during the ‘graphic phase’ of my project. (minus any muscle tone bump mapping)

Image Removed

Try to picture this guy wearing ‘tribal’ type dressing.

Very nice, I really like how you did its hair. Hair can be hard to do. And I see your blending is getting better.

Just keep those skin painting tutorials in mind when you do start to texture your characters. There not really about doing human skin there more about blending skin in general be that human, alien or monster.

Looks like your on your way to being a great game developer, just dont forget about us linux users. :wink:

That’s not even a texture mat. Lol I’m way better than that man. That image was CG forged, so I can get some idea of where to go with texturing later on.

I’m definitely not worried about characters looking good later, I just have to get past all the technical stuff so I can get to that stage of development. :slight_smile:

Blending textures for me is easy and fast and I will hand draw and shade muscle tone off of UV maps in order to create normal and height maps; later.

Creating nice textures for anything takes time and therefore needs time put aside for it, alone.

Finishing the combat system is up next. Tomorrow I want to start enemy animations, at least the ones I need in order to start programming heavily on the combat system.

When I get that system done, I’m going to have some fun. :smiley: I was playing Warcraft II on my PC and thought to myself, man… Those where the days.

The game I’m making now will have a lot of that old school Warcraft flavor too. The areas in my game will all be “blackened out.” As the player moves through each level, more of the level will be revealed to them (like it did with old RTS warcrafts).

That effect adds to the mystery of each level; not knowing if you’re going to take one step too many and then BAM!!! Your attacked!! :laughing: That effect creates a nice dungeon crawler feel to an RTS game.

I’m hoping this game will turn out to be that ‘next’ big RTS series. (especially for those who love the old school style ones like me :slight_smile: )

I just remembered I didn’t post up screenshots showing the changes I made to my level 1, visually. Just small stuff right now, nothing big. I also added to the UI.

I’ll wait until I finish the combat system and post some. :slight_smile:

I was zooming in on my characters to get a close-up and realized, I had to zoom way in.

Now I’m wondering…

Should I use that +size character method clearly seen in a game like “Majesty II?”

What I mean is, the characters in Majesty II are a little too big compared to the building structures. However, by giving the characters more size, you can see them much better on close-ups and from what I can see, it doesn’t really hurt the graphical look of the game; but yes, the ‘size-up’ is noticeable.

I’m thinking about sizing my actors up some (later on) so “gamers” don’t have to zoom so far in just to get a good look at actor detail on a close-up.

I’m already thinking about adding UI buttons that allow “gamers” to make the camera follow an actor on a close-up from different angles.

However, the combat action will automatically shoot close-up on certain attacks and mix-up the angles (like a camera man).

How do you guys feel about that? The sizing up of actors against building structures… I’m not talking about making them the same size as the buildings. Lol.

Just a little larger than normal. For instance, some of the characters in Majesty II look like they couldn’t even get through the doors on some of the buildings, but yet they are not big enough to look like they can step on the building.

Right now, my actors are sized ‘realistically’; they are the right size for fitting through doors on buildings, but you can imagine how far you would have to zoom in to get a good look at one.

Anyway, that’s something else for me to consider later. I’m just going to go with what ever looks better. :slight_smile:

This Month of May isn’t turning out exactly as planned. A lot of life events have taken much of my time. I wasn’t able to get anything done for the first two weeks of the Month.

Oh well… That’s life I guess. :slight_smile:

Programming the combat system is tricky since I can easily break the movement AI already done. I’m going to have to take it slowly, building one part at a time and debug as I go along.

So far, the enemy and heroes, both, can detect each other and start attacking.

Image Removed

Right now they detect based on rather or not their enemies are in range, if so, attack the closest one. This is the second approach; I am yet to code in the first approach and what that is, is this… Threat!!

Yep! Good old threat. That is, the enemy that has caused the most threat should get targeted first, if they are in range. If all enemies have equal threat, then take the closest one; that’s how I will finalize the detection.

To make that happen, I just have to make sure I run a re-detection at the end of every attack animation; for reason of threat change or distance change.

Keep in mind, I haven’t even written the AI building part of the combat system.

You can see how things can quickly get complicated.

So I want to make sure all the auto detect and auto attacks (basic attacks) are working before I move any further.

Since my two groups can fight each other now, I will go ahead and setup the threat data base for each Actor Class. The amount of threat created by an attacker will be based on the power or threat of the attack.

Right now I just have a basic attack animation for testing. I won’t even worry about getting combat fancy with animations until the system is done.

I see my one actor’s feet are in the ground some. No worries there…I’ll raise him up later. :slight_smile:

I got things looking well so far. I added a health value to the actors and created code for death, which triggers a cleanup of the actors. I needed to do this so I can plan the “after battle” code.

For the “Heroes”, this is easy, they will just wait for the players input. If the enemy takes out a Hero, then that enemy needs to start heading towards its main objective again, if there’s nothing else in range to attack. Right now, the enemy just stops.

I think I have enough done to write in the “Threat” portion of the code. I still have to test the combat system with multiple actors going at it, but I will most likely finish the GUI that surrounds the AI building system, after I’m done adding the “threat” multiplier into enemy detection.

All this early code will change dramatically later as I start building other small engine programs on top of each other.



def DetectEnemy(self, task):
        if self.EneDectCnt >= 15:
            if self.AttkSkelk == 0 and self.FreeMovSnapped == 0:
                IGS = 0;
                InRanG = [];
                RanDattk = -1;
                for ChaR in AppliSync.InstList:
                    CurChaR = AppliSync.InstList[IGS];
                    ggStr1 = CurChaR.Type;
                    ggStr2 = ggStr1.split("_");
                    ggStr3 = ggStr2[0].find("SAct");
                    if ggStr3 != -1 and (ggStr2[1] == "Soldier" or ggStr2[1] == "Captain"):
                        Edist = Vec3(CurChaR.ObjInst.getPos()) - Vec3(self.ObjInst.getPos());
                        Edist[2] = 0;
                        EdistL = Edist.length();
                        if EdistL <= 40 and CurChaR.Dying != 1:
                            InRanG.append(CurChaR);
                    IGS+=1;
                if InRanG != []:
                    LENtrack = {};
                    LenVals = [];
                    UIUE=0;
                    for dexuro in InRanG:
                        cuRup = InRanG[UIUE];
                        Kies = Vec3(cuRup.ObjInst.getPos()) - Vec3(self.ObjInst.getPos());
                        Kies[2]=0;
                        LENtrack[cuRup] = Kies.length();
                        LenVals.append(Kies.length());
                        UIUE+=1;
                    LowEst = min(LenVals);
                    for Key in LENtrack:
                        Val = LENtrack[Key];
                        if Val == LowEst:
                            RanDattk = InRanG.index(Key);
                            break;
                else:
                    RanDattk = -1;
                if RanDattk != -1:
                    self.AttkSkelk = 1;
                    self.TargObj = InRanG[RanDattk];
                    self.EneyPos = Vec3(self.TargObj.ObjInst.getX(), self.TargObj.ObjInst.getY(), 0);
                    self.MoveToPoint();
            self.EneDectCnt = 0;
        elif self.EneDectCnt < 15:
            self.EneDectCnt += 1;
        return task.cont;

    def CloseEnough(self):
        if hasattr(self.TargObj, "SpecificJob") and self.FreeMovSnapped == 0:
            tDist = Vec3(self.TargObj.ObjInst.getPos()) - Vec3(self.ObjInst.getPos());
            tDist[2] = 0;
            LtDist = tDist.length();
            if LtDist <= 9:
                self.MovingToPnt = 0;
                AppliSync.RemoveTravs(self.SurfCol);
                self.NavCheck = 0;
                self.PerfAttk();
            else:
                self.EneyPos = Vec3(self.TargObj.ObjInst.getX(), self.TargObj.ObjInst.getY(), 0);
                self.MoveToPoint();

    def PerfAttk(self):
        self.BodGeom.play("Attk1_Attk1", fromFrame=0, toFrame=49);
        self.BodGeom.setPlayRate(self.AttkSpd, "Attk1_Attk1");
        self.BodGeom.setControlEffect("Walk", 0.0);
        self.BodGeom.setControlEffect("Stand", 0.0);
        self.BodGeom.setControlEffect("Chop", 0.0);
        self.BodGeom.setControlEffect("Attk1_Attk1", 1.0);
        self.BodGeom.setControlEffect("Attk1_Idle", 0.0);
        try:
            taskMgr.remove(self.PerformAttk);
        except:
            pass;
        self.PerformAttk = taskMgr.add(self.AttkEnding, "StrikeSkelk");
    def AttkEnding(self, task):
        Attk1Attk1 = self.BodGeom.getAnimControl("Attk1_Attk1");
        if self.BodGeom.getCurrentFrame() >= 49 or self.BodGeom.getCurrentFrame() == None:
            self.BodGeom.stop();
            self.BodGeom.pose("Attk1_Idle", 0);
            self.BodGeom.setPlayRate(self.AttkIdleSpd, "Attk1_Idle");
            self.BodGeom.setControlEffect("Walk", 0.0);
            self.BodGeom.setControlEffect("Stand", 0.0);
            self.BodGeom.setControlEffect("Chop", 0.0);
            self.BodGeom.setControlEffect("Attk1_Attk1", 0.0);
            self.BodGeom.setControlEffect("Attk1_Idle", 1.0);
            #-
            if self.TargObj != None:
                if hasattr(self.TargObj, "SpecificJob"):
                    if  self.TargObj.Dying != 1 and self.CurrTask == "AttkSkelk":
                        GGLen = Vec3(self.TargObj.ObjInst.getPos()) - Vec3(self.ObjInst.getPos());
                        GGLen[2] = 0;
                        LggLen = GGLen.length();
                        if LggLen <= 9:
                            self.TargObj.TakeDamage(10);
            #-
            self.ReDetectEnemy();
            return task.done;
        return task.cont;

    def ReDetectEnemy(self):
        if self.AttkSkelk == 1 and self.FreeMovSnapped == 0:
            IGS = 0;
            InRanG = [];
            RanDattk = -1;
            for ChaR in AppliSync.InstList:
                CurChaR = AppliSync.InstList[IGS];
                ggStr1 = CurChaR.Type;
                ggStr2 = ggStr1.split("_");
                ggStr3 = ggStr2[0].find("SAct");
                if ggStr3 != -1 and (ggStr2[1] == "Soldier" or ggStr2[1] == "Captain"):
                    Edist = Vec3(CurChaR.ObjInst.getPos()) - Vec3(self.ObjInst.getPos());
                    Edist[2] = 0;
                    EdistL = Edist.length();
                    if EdistL <= 40 and CurChaR.Dying != 1:
                        InRanG.append(CurChaR);
                IGS+=1;
            if InRanG != []:
                LENtrack = {};
                LenVals = [];
                UIUE=0;
                for dexuro in InRanG:
                    cuRup = InRanG[UIUE];
                    Kies = Vec3(cuRup.ObjInst.getPos()) - Vec3(self.ObjInst.getPos());
                    Kies[2]=0;
                    LENtrack[cuRup] = Kies.length();
                    LenVals.append(Kies.length());
                    UIUE+=1;
                LowEst = min(LenVals);
                for Key in LENtrack:
                    Val = LENtrack[Key];
                    if Val == LowEst:
                        RanDattk = InRanG.index(Key);
                        break;
            else:
                RanDattk = -1;
            if RanDattk != -1:
                self.AttkSkelk = 1;
                self.TargObj = InRanG[RanDattk];
                self.EneyPos = Vec3(self.TargObj.ObjInst.getX(), self.TargObj.ObjInst.getY(), 0);
                self.MoveToPoint();
            else:
                self.BodGeom.stop();
                self.BodGeom.pose("Stand", 0);
                self.BodGeom.setPlayRate(self.StandAnimSpd, "Stand");
                self.BodGeom.setControlEffect("Walk", 0.0);
                self.BodGeom.setControlEffect("Stand", 1.0);
                self.BodGeom.setControlEffect("Chop", 0.0);
                self.BodGeom.setControlEffect("Attk1_Attk1", 0.0);
                self.BodGeom.setControlEffect("Attk1_Idle", 0.0);
                AppliSync.RemoveTravs(self.SurfCol);
                self.NavCheck = 0;
                if self.Type == "HAct_Captain":
                    self.CurrTask = "G_Ready";
                elif self.Type == "HAct_Soldier":
                    self.CurrTask = "P_Ready";
                self.MovingToPnt = 0;
                self.TargObj = None;
                self.AttkSkelk = 0;


    def TakeDamage(self, Amnt):
        self.Cur_HP -= Amnt;
        if self.Cur_HP <= 0:
            self.Cur_HP = 0;
            self.Dying = 1;
        if self.Cur_HP > self.Max_HP:
            self.Cur_HP = self.Max_HP;
        if self.Dying == 1:
            DestroyInst.DumpMe(self);


Why are you putting semicolons after every line of code? It’s not necessary in Python, and it’s considered bad style in general.

Bad style? Depends on who you’re talking to. Semis aren’t bad style, they are honest. When I code, I like to keep basic rules intact. Sure I don’t need the semis, but experience has taught me otherwise.

What happens is, you tend to forget about semis (because you don’t use them) and when you actually insert more than one line of code on the same line, you receive an error; an error that could have been avoided if you would have added the semis for clarity sake; and yes, I do have two lines of code on the same line in some places.

As for style… Logic is the only style when it comes to code, man. There are many ways to do the same thing and how one decides to do it… That’s style. (not error)

Just finished adding in the threat data base. Now I have to make enemy detection use it. Once that’s done, I’ll work on the AI building GUI. Nothing going on in the screenshots but code tests.

Images Removed

It looks cool! Gratz!

No, he’s right. No semicolons at the end of a line in Python. If you want to break long lines, use a backslash or put expressions in parentheses.

Generally I find your code hard to read. That’s not a criticism, just an observation. Sure in the short term you will have no trouble reading your own code, but in the long term even you might. Not even to mention others have to be able to read your code at some point, either additional programmers you bring aboard or people on a forum. Semicolons on the end of lines or unclear variable names to not help readability among Pythonistas.

On a different note I like what I see in this thread. Modelling characters or livestock is not your strength (if this was a SciFi game you could use vehicles for everything, which is a cool design trick), but the buildings, terrain and lighting looks good. Interface is getting there, too. Good job!

I’d recommend some post-processing lighting - I think in the past rdb posted something about SSAO and Manou has his Deferred Shading code going, propably look at that. For dynamic objects then use a blob shadow.

Not being funny, but I’ve been programming for some years now and have had no issues using semis. In fact, I’ve had more issues not using them.

That’s part of my style; using the semis, which is taught early when you’re learning programming (and I suck with it :slight_smile: ). I am glad I use them, because I do insert multiple lines of code on the same line.

As for my code hard to read, of course it is. What you’re looking at is my logic; in order to know what’s going on you have to get inside my head. When I look at that code, it is crystal clear to me. :slight_smile:

Not to mention that code is depended on other code written throughout the program.

Don’t think my code is structured that way… It only looks like that because pasting the code to the forums kind of messed up the layout.

One of the sweet things about logic…you can’t really teach it in the truest sense, but anyone can learn the basics of programming and write code. That much can be taught. Rather you like semis or not, that’s your choice, but if you ever use lines of code on the same line, it might come back to haunt you.

As for my models, they are not complete, so how do you know what my strengths are? That’s judging the race before you see the finish line.

And no, my game would not have spaceships flying vehicles or whatever it was you mention because it’s not that kind of game. My world and story is unique; it does not involve the things you mentioned.

That’s where most rookie game designers mess up… They come up with a fantasy world, but then create a different world; one that does not fit their story.

The world I’m bringing to life will fit my story and characters. Why tell a story of a world ruled by darkness and then create a beautiful world full of sunshine?

I’m glad I was trained in basic game design (creation/concept) mechanics earlier in life. They truly are the bread and butter for game design success.

You mention shadows… The current shadows are just place holders. You have to write the code first. :smiley:

PS,

I would use Blob shadows with things like trees (and not buildings), but honestly, I will be taking a different approach altogether.

Graphic design is still a long ways off for me. Without perfect, flawless code, you have no game…regardless of visuals. :wink:

Thanks, man. :smiley:

Honestly, the code work is so heavy, I know I’m going to be tired out on this project by the time I’m done with the technical side of things.

I might consider taking several weeks off after I finish coding the entire game and then start working with the visuals.

I can’t wait to make those characters finally look like something. :laughing:

Of course every good game designer would know that visuals are like the wrapper around a present. It doesn’t matter what the wrapper looks like if the present inside is bad. :wink: -words to design by

I have successfully added “Threat” to the enemy detection equation. I am now working on the “AI Building” part of the main menu for Heroes.

Image Removed

The menu that says “AI Builder” at the top has six sets of three tabs, each a different shade/color. Each set of three tabs equal one ai slot; the slots are in order with the top most set being slot 1, which is the highest priority in the ai tree.

Each tab has a letter to the left of it; S=Skill, R=Requirement, O=Optional. The way I’m going to do this is simple… The “gamer” will be able to left click or right click on each tab, which will cycle through the available choices.

I’m probably going the set the default “basic attack” for each Skill slot, since that is the default when a specific skilled ability is not “slotted”.

Image Removed

Your buildings look really cool. 8) Also, don’t be so arrogant.