Adventure Game Studio

AGS Support => Beginners' Technical Questions => Topic started by: shaungaryevans on Tue 09/03/2010 22:37:02

Title: can you have some fighting in your game?
Post by: shaungaryevans on Tue 09/03/2010 22:37:02
Hi,

I have been using AGS for about 1 years now and i mastered all the simple techquies (hotspots, rooms, varibles etc). Now I would like to do a bit of action in my game, maybe a bit of fighting when you have to beat emeries. I have got no idea of how to start this kind of scripting off, can somebody advise me a simple script to learn to start please?

Thanks in advance
Title: Re: can you have some fighting in your game?
Post by: monkey0506 on Tue 09/03/2010 23:24:54
if (player.IsCollidingWithChar(cEnemy)) {
 cEnemy.Say("I AM DEAD!");
 cEnemy.ChangeRoom(-1);
}


That's a pretty simple one, I know, but it works..sort of..depending where you put it..maybe. :D
Title: Re: can you have some fighting in your game?
Post by: Crimson Wizard on Tue 09/03/2010 23:56:19
Seriously, monkey is right in his way, there's no simple script for that kind of things. It usually requires lots of scripting, but before scripting it requires lots of thinking, planning module logic, etc.

By the way, there's Ahmed's fighting game available, maybe you will find it useful, it has open code: http://www.adventuregamestudio.co.uk/yabb/index.php?topic=20327.msg515108#msg515108
Title: Re: can you have some fighting in your game?
Post by: Khris on Wed 10/03/2010 00:24:49
shaungaryevans:

If you just want some working fighting code, try to be more specific (but don't expect a full-fledged fight engine script). Then we can give you some pointers.

If you rather want to add other advanced stuff later on and be able to do that yourself, you're going to need to learn how to tackle a scripting problem. I'm not sure where to point you; the web is full of tutorials but those are almost always aimed at learning a specific language.
In general, break down the engine into smaller parts, start simple and solve one problem at a time.

A good starting point would be implementing a numpad controlled sprite that can move and punch.
Title: Re: can you have some fighting in your game?
Post by: monkey0506 on Wed 10/03/2010 01:06:22
It also depends on your fighting style that you want to achieve. Presumably you are talking about some sort of real-time fighting, but if you want turned-based it will be totally different. Also to take into consideration, will the fighting be projectile or melee?

There's a lot more to "adding fighting to your game" than simply adding a couple lines of script. The snippet I posted could, after a fashion, prove useful depending on how your fighting will be managed. However, there is no catch-all generic (or simple for that matter) solution.
Title: Re: can you have some fighting in your game?
Post by: Mr Flibble on Wed 10/03/2010 02:19:26
Something I've been wondering about for a long time, which has applications here, is the idea of being able to split up sprites into regions or areas. It'd be useful for, for instance, fighting game collision detection (ie. did the enemy collide with a fist or just the body* or where did a specific punch land), or switching out segments of a character (like how the old LEC games worked, they didn't store the whole sprites each time, just the segment that was changing) or for having characters only being partially tinted by a region (for instance, so you could have them standing half in shadow, half in light)


*A nice and simple way to achieve this with existing behaviour would be to check if the sprites are colliding, then also check if the current frame of the player's (or enemy's) view. This would mean that the player would have to "punch" to cause damage, not just collide by walking into the enemy.
Title: Re: can you have some fighting in your game?
Post by: CShelton on Wed 10/03/2010 02:30:29
Quote from: Mr Flibble on Wed 10/03/2010 02:19:26
Something I've been wondering about for a long time, which has applications here, is the idea of being able to split up sprites into regions or areas. It'd be useful for, for instance, fighting game collision detection (ie. did the enemy collide with a fist or just the body* or where did a specific punch land)

With some hackery and SSH's Pixel Perfect Collision Module (http://www.adventuregamestudio.co.uk/yabb/index.php?topic=26307.0) you could build a complex character that has fist and foot collision areas. This would be accomplished by having multiple characters occupying the same space, each limb being a separate character with their own collision. Orchestrating all of this is no easy feat, though it can be done.
Title: Re: can you have some fighting in your game?
Post by: Khris on Wed 10/03/2010 09:26:42
Or you could use structs to store the coordinates of collision boxes for every frame. Similarly annoying to set up but faster and easier to change.
Title: Re: can you have some fighting in your game?
Post by: shaungaryevans on Thu 11/03/2010 17:22:51
Hi Guys,

Thanks for all the pointers, so i need to start from the begining on this a work on it, first thing i would suppose is the enemy's movement. He will walk on this own around the map, sorry to be a pain but how can you make a character move around the map/room without you controlling it?
Title: Re: can you have some fighting in your game?
Post by: monkey0506 on Thu 11/03/2010 17:27:31
Well it depends whether you want them to walk along a predefined path or just wander around aimlessly at random. The first would involve creating some way of defining the path, the points along it to which the character will travel, and then the order in which each point is reached. That would probably be done using some sort of struct.

The second is much simpler:

function repeatedly_execute_always() {
  if (!cEnemy.Moving) cEnemy.Walk(Random(Room.Width), Random(Room.Height));
}
Title: Re: can you have some fighting in your game?
Post by: suicidal pencil on Fri 12/03/2010 00:24:28
Quote from: monkey_05_06 on Thu 11/03/2010 17:27:31
function repeatedly_execute_always() {
  if (!cEnemy.Moving) cEnemy.Walk(Random(Room.Width), Random(Room.Height));
}


what about walkable areas and the such? If you had an urban scene, I think it would be a bit weird to watch an enemy walk up the side of a building :P

Title: Re: can you have some fighting in your game?
Post by: monkey0506 on Fri 12/03/2010 00:59:13
The Walk function can take account of walkable areas. In the example provided you'd presumably want to use eWalkableAreas and eNoBlock. Don't remember what the defaults are, but that's what the manual is for.
Title: Re: can you have some fighting in your game?
Post by: shaungaryevans on Fri 12/03/2010 20:37:28
Thanks, i have now got someone that moves on his own, but one problem, the timer cursor stays on while he moves. I don't remember how to make the timer go off? Any help please?
Title: Re: can you have some fighting in your game?
Post by: monkey0506 on Fri 12/03/2010 20:44:39
Okay just checked in with the manual and the default settings are eNoBlock and eWalkable areas so unless you specifically pass something different it shouldn't be blocking at all.

What is the exact code you are using?
Title: Re: can you have some fighting in your game?
Post by: shaungaryevans on Fri 12/03/2010 20:48:46
if(cEgo.Room == 1) cChar1.Walk(Random(Room.Width), Random(Room.Height), eNoBlock);
Title: Re: can you have some fighting in your game?
Post by: monkey0506 on Fri 12/03/2010 21:13:04
You forgot to check that the character isn't moving:

if ((cEgo.Room == 1) && (!cChar1.Moving)) cChar1.Walk(Random(Room.Width), Random(Room.Height));

eNoBlock is the default so you don't need to pass that in explictly.
Title: Re: can you have some fighting in your game?
Post by: shaungaryevans on Fri 12/03/2010 21:20:10
Thanks, that works now.

Back to the getting to the frighting bit now, now i know how to move cchar1 freely, can i make him to come towards me all the time as what enemys do please?
Title: Re: can you have some fighting in your game?
Post by: monkey0506 on Fri 12/03/2010 21:41:08
Do you want him to chase after you if you get within a certain distance, if he can see you, or just all the time?

Regardless of when you want him to chase you, look up the Character.FollowCharacter function in the manual.
Title: Re: can you have some fighting in your game?
Post by: shaungaryevans on Fri 12/03/2010 21:49:16
I had a look at the manual now, its only got how to set the distance between charatcher the the standing time. How to set set as if they look at him or he get anywhere near him, they chase him
Title: Re: can you have some fighting in your game?
Post by: monkey0506 on Sat 13/03/2010 00:32:00
You will have to script that yourself as it's not a built-in method. Something like:

int DistanceFromCharacter(this Character*, Character *theCharacter) {
 // based on a script by KhrisMUC
 if (theCharacter == null) return -1;
 int z1 = 10000 / this.Scaling;
 int z2 = 10000 / theCharacter.Scaling;
 int x1 = this.x * (z1 / 100);
 int x2 = theCharacter.x * (z2 / 100);
 int dx = x1 - x2;
 int dz = z1 - z2;
 return FloatToInt(Maths.Sqrt(IntToFloat((dx * dx) + (dz * dz))));
}

bool IsFacingCharacter(this Character*, Character *theCharacter) {
 if (theCharacter == null) return false;
 bool turnBeforeWalk = GetGameOption(OPT_TURNBEFOREWALK); // whether characters turn before walking
 if (turnBeforeWalk) SetGameOption(OPT_TURNBEFOREWALK, 0); // temporarily disable this setting
 int loop = theCharacter.Loop; // store the current loop
 theCharacter.FaceCharacter(player, eNoBlock); // sets the character's loop towards the player
 bool facing = (theCharacter.Loop == loop); // whether theCharacter was already facing the this Character
 if (!facing) theCharacter.Loop = loop; // restore the previous loop if changed
 if (turnBeforeWalk) SetGameOption(OPT_TURNBEFOREWALK, 1); // restore turn before walking if disabled
 return facing; // return whether the player was facing the other character already
}

function repeatedly_execute() {
 if (player.DistanceFromCharacter(cChar1) <= 30) { // the player is within 30 units (scaled pixels) from the enemy's position
   if (cChar1.IsFacingCharacter(player)) cChar1.FollowCharacter(player, 1, 10); // or whatever values you want here
 }
}
Title: Re: can you have some fighting in your game?
Post by: shaungaryevans on Sat 13/03/2010 19:06:39
Thanks monkey_05_06,

right, so i know how to make the enemy follows the player and i have worked out how to maker the enemy hit the player so life goes from them. My next question is, how can i do it so if the enemy is going to hit the player, the player can put a shed up to stop this?
Title: Re: can you have some fighting in your game?
Post by: aedwards00 on Sat 13/03/2010 19:39:38
I'm really sorry for this, I know making fun of spelling/grammar is low, but put up a shed lol :P
Title: Re: can you have some fighting in your game?
Post by: monkey0506 on Sat 13/03/2010 19:58:01
Well it would really all depend how you want to perform the blocking (with the shed/shack/barn/storage unit/other structure (possibly a shield :D)). For example in your code for the enemy attacking you could do:

// logic to determine damage here
if (!IsKeyPressed(eKeyShift)) { // shift key is not held down
  stats[player.ID].HP -= DAMAGE_AMOUNT; // replace with whatever code you are using to store HP and such
}
Title: Re: can you have some fighting in your game?
Post by: shaungaryevans on Sat 13/03/2010 19:58:38
lol, that would be funny, i meant shield