Adventure Game Studio

AGS Support => Advanced Technical Forum => Topic started by: Lazarus on Wed 08/03/2006 10:05:28

Title: status line setup
Post by: Lazarus on Wed 08/03/2006 10:05:28
I'm in the process of making a new template and I'm having problems with defining between the use and give inventory items, in that I can get one or the other to work but not both.
here's what I have so far:
function SetActionText(){Ã, 
Ã,  string text;
Ã,  if (mouse.Mode==eModeWalkto) StrCopy(text, "Walk to ");
Ã,  else if (mouse.Mode==eModeLookat) StrCopy(text, "Look at ");
Ã,  else if (mouse.Mode==eModePickup) StrCopy(text, "Pick up ");
Ã,  else if (mouse.Mode==eModeInteract) StrCopy(text, "Use ");
Ã,  else if (mouse.Mode==eModeTalkto) StrCopy(text, "Talk to ");
Ã, 
Ã,  else if (mouse.Mode==eModePull) StrCopy(text, "Pull ");
Ã,  else if (mouse.Mode==eModePush) StrCopy(text, "Push ");
Ã,  else if (mouse.Mode==eModeOpen) StrCopy(text, "Open ");
Ã,  else if (mouse.Mode==eModeClose) StrCopy(text, "Close ");
Ã, 
Ã,  else if (mouse.Mode==eModeGive) {
Ã,  Ã, mouse.Mode = eModeUseInv;
Ã,  Ã,  string invname;
Ã,  Ã,  StrCopy(text, "Give ");
Ã,  Ã,  player.ActiveInventory.GetName(invname);
Ã,  Ã,  StrCat(text, invname);
Ã,  Ã,  StrCat(text, " to ");
Ã,  }
//Ã,  else if (mouse.Mode==eModeUseInv){// If using an inventory item on something
Ã,  else if (mouse.Mode==eModeInteract){
Ã,  Ã, mouse.Mode = eModeUseInv;
Ã,  Ã,  string invname;
Ã,  Ã,  StrCopy(text, "Use ");
Ã,  Ã,  player.ActiveInventory.GetName(invname);
Ã,  Ã,  StrCat(text, invname);
Ã,  Ã,  StrCat(text, " with ");
Ã,  }

Ã,  Ã,  StrCat(text, "@OVERHOTSPOT@");

Ã,  Ã,  gActionStatus.SetText(text);
}


Any help would be grateful

Also while I think about it I can't seem to get these

Ã,  else if (mouse.Mode==eModePull) StrCopy(text, "Pull ");
Ã,  else if (mouse.Mode==eModePush) StrCopy(text, "Push ");
Ã,  else if (mouse.Mode==eModeOpen) StrCopy(text, "Open ");
Ã,  else if (mouse.Mode==eModeClose) StrCopy(text, "Close ");


working quite right in that they don't reset the statusline back to walk to command when used.

Title: Re: status line setup
Post by: Gilbert on Wed 08/03/2006 11:25:06
I'm too tired to explain but this may give you ideas (not tested):

function SetActionText(){Ã,  
Ã,  string text;
Ã,  if (mouse.Mode==eModeWalkto) StrCopy(text, "Walk to ");
Ã,  else if (mouse.Mode==eModeLookat) StrCopy(text, "Look at ");
Ã,  else if (mouse.Mode==eModePickup) StrCopy(text, "Pick up ");
Ã,  else if (mouse.Mode==eModeInteract) {
    StrCopy(text, "Use ");
    if (player.ActiveInventory!=null) {
   Ã,  Ã, mouse.Mode = eModeUseInv;
  Ã,  Ã,  string invname;
  Ã,  Ã,  player.ActiveInventory.GetName(invname);
  Ã,  Ã,  StrCat(text, invname);
  Ã,  Ã,  StrCat(text, " with ");
    }
  } else if (mouse.Mode==eModeTalkto) StrCopy(text, "Talk to ");Ã, 
Ã,  else if (mouse.Mode==eModePull) StrCopy(text, "Pull ");
Ã,  else if (mouse.Mode==eModePush) StrCopy(text, "Push ");
Ã,  else if (mouse.Mode==eModeOpen) StrCopy(text, "Open ");
Ã,  else if (mouse.Mode==eModeClose) StrCopy(text, "Close ");
Ã,  else if (mouse.Mode==eModeGive) {
Ã,  Ã, mouse.Mode = eModeUseInv;
Ã,  Ã,  string invname;
Ã,  Ã,  StrCopy(text, "Give ");
Ã,  Ã,  player.ActiveInventory.GetName(invname);
Ã,  Ã,  StrCat(text, invname);
Ã,  Ã,  StrCat(text, " to ");
Ã,  }
//Ã,  else if (mouse.Mode==eModeUseInv){// If using an inventory item on something
/*Ã,  else if (mouse.Mode==eModeInteract){
Ã,  Ã, mouse.Mode = eModeUseInv;
Ã,  Ã,  string invname;
Ã,  Ã,  StrCopy(text, "Use ");
Ã,  Ã,  player.ActiveInventory.GetName(invname);
Ã,  Ã,  StrCat(text, invname);
Ã,  Ã,  StrCat(text, " with ");
Ã,  }
*/
Ã,  Ã,  StrCat(text, "@OVERHOTSPOT@");
      
Ã,  Ã,  gActionStatus.SetText(text);
}

Title: Re: status line setup
Post by: Lazarus on Fri 10/03/2006 09:05:41
Okay I tried your suggestion and it doesn't quite work,
when I click "use" then on inventory item the status line shows the "use" then disappears leaving inventory item showing eg; "voodoo doll" , it also doesn't displayÃ,  "with" either.

And for some reason it doesn't clear the command as I can keep clicking on an object as if I was using an inventory item.

And I can't get the other mouse modes to change back after use for:
Ã,  else if (mouse.Mode==eModePull) StrCopy(text, "Pull ");
Ã,  else if (mouse.Mode==eModePush) StrCopy(text, "Push ");
Ã,  else if (mouse.Mode==eModeOpen) StrCopy(text, "Open ");
Ã,  else if (mouse.Mode==eModeClose) StrCopy(text, "Close ");

when the other commands work okay eg:
else if (mouse.Mode==eModeLookat) StrCopy(text, "Look at ");
else if (mouse.Mode==eModePickup) StrCopy(text, "Pick up ");
else if (mouse.Mode==eModeInteract) StrCopy(text, "Use ");
else if (mouse.Mode==eModeTalkto) StrCopy(text, "Talk to ");
Title: Re: status line setup (Unsolved)
Post by: Lazarus on Mon 13/03/2006 12:13:41
I had another idea with these cursors, am I supposed to define them?
All I have done is create new cursors

mouse.Mode=eModePush - cursor 10
mouse.Mode=eModePull - cursor 11
mouse.Mode=eModeOpen - cursor 12
mouse.Mode=eModeClose - cursor 13
mouse.Mode=eModeGive - cursor 14

Title: Re: status line setup (Unsolved)
Post by: Pumaman on Tue 14/03/2006 16:47:55
You probably need to replace this:

  else if (mouse.Mode==eModeInteract) {

with this:

  else if (mouse.Mode==eModeUseInv) {

so that it does the "Use XXX with YYY" thing in Use Inventory mode, not Interact mode.
Title: Re: status line setup (Unsolved)
Post by: Lazarus on Wed 15/03/2006 10:37:49
I have tried your suggestion and added a new command for eMode.mouse == Interact which works ok.

The problem I have now is getting the Give command to work properly, I first had a Null pointer reference so I have changed this so it is similar to the mouse.Mode==eModeUseInv function which seemed to solve that problem.

The problem I have is that the Give function doesn't display "Give (inventory item) to" it displays the normal "Use (inventory item) with".

Also when using the Give mode it seems to remember the last inventory item used, it doesn't seem to clear if you can understand What I mean.

Here's what I have so far:
function SetActionText(){
Ã,  Ã,  string text;Ã, 
Ã,  if (mouse.Mode==eModeWalkto) StrCopy(text, "Walk to ");
Ã,  else if (mouse.Mode==eModeLookat) StrCopy(text, "Look at ");
Ã,  else if (mouse.Mode==eModePickup) StrCopy(text, "Pick up ");
Ã,  else if (mouse.Mode==eModeInteract) StrCopy(text, "Use ");// added

Ã,  else if (mouse.Mode==eModeUseInv) {
Ã,  Ã,  Ã,  StrCopy(text, "Use ");
Ã,  Ã,  if (player.ActiveInventory!=null) {
Ã,  Ã,  Ã,  mouse.Mode = eModeUseInv;
Ã,  Ã,  Ã,  string invname;
Ã,  Ã,  Ã,  player.ActiveInventory.GetName(invname);
Ã,  Ã,  Ã,  Ã, StrCat(text, invname);
Ã,  Ã,  Ã,  StrCat(text, " with ");
Ã,  Ã,  Ã, }
Ã,  Ã, }
Ã,  else if (mouse.Mode==eModeTalkto) StrCopy(text, "Talk to ");
Ã,  else if (mouse.Mode==eModePull) StrCopy(text, "Pull ");
Ã,  else if (mouse.Mode==eModePush) StrCopy(text, "Push ");
Ã,  else if (mouse.Mode==eModeOpen) StrCopy(text, "Open ");
Ã,  else if (mouse.Mode==eModeClose) StrCopy(text, "Close ");

Ã,  else if (mouse.Mode==eModeGive) {
Ã,  Ã,  StrCopy(text, "Give ");
Ã,  Ã,  if (player.ActiveInventory!=null) {
Ã,  Ã,  Ã,  mouse.Mode = eModeUseInv;
Ã,  Ã,  Ã,  string invname;Ã,  Ã, 
Ã,  Ã,  Ã,  player.ActiveInventory.GetName(invname);// was getting Null pointer error here
Ã,  Ã,  Ã,  StrCat(text, invname);
Ã,  Ã,  Ã,  StrCat(text, " to ");
Ã,  Ã,  Ã, }
Ã,  Ã, }

Ã,  Ã,  StrCat(text, "@OVERHOTSPOT@");
Ã,  Ã,  gActionStatus.SetText(text);
}


Thanks again
Title: Re: status line setup (Unsolved)
Post by: Ashen on Wed 15/03/2006 10:59:12
QuoteThe problem I have is that the Give function doesn't display "Give (inventory item) to" it displays the normal "Use (inventory item) with".

Depending on where/when you call SetActionText() (and I'd guess it's in rep_ex), that's probably because you're changing the mode to eModeUseInv:

  else if (mouse.Mode==eModeGive) {
    StrCopy(text, "Give ");
    if (player.ActiveInventory!=null) {
      mouse.Mode = eModeUseInv;
      string invname;   
      player.ActiveInventory.GetName(invname);// was getting Null pointer error here
      StrCat(text, invname);
      StrCat(text, " to ");
     }
   }

Removing that line might solve it. If not, it might also be down to how you're handling inventory clicks - using eModeGive on an item might be changing the mode (I think it automatically changes to eModeUseInv when a new ActiveInventory item is set?).

QuoteAlso when using the Give mode it seems to remember the last inventory item used, it doesn't seem to clear if you can understand What I mean.
Possibly the ActiveInventory item hasn't been deselected? Try adding player.ActiveInventory = null; when you set the cursor mode (for eModeGive, and possibly eModeUseInv).
Title: Re: status line setup (Unsolved)
Post by: Lazarus on Wed 15/03/2006 11:55:10
Yes it is in the repeatedly exec

and no that didn't work when I removed the line "mouse.Mode = eModeUseInv;"

Adding "player.ActiveInventory = null;" command seems to work ok now.

With regards to mouse inventory clicks I have:
else if (button == eMouseLeftInv) {
Ã,  Ã,  player.ActiveInventory = inventory[game.inv_activated];
Ã,  Ã,  }
else if (button == eMouseRightInv) {
Ã,  Ã,  inventory[game.inv_activated].RunInteraction(eModeLookat);
Ã,  Ã,  }
Title: Re: status line setup (Unsolved)
Post by: Ashen on Wed 15/03/2006 12:03:17
Then I think it's what I said - setting the ActiveInventory will change the mode to eModeUseInv. Perhaps adding a check of the mode before setting the active inv, then changing it back if needed, would work? E.g.:

else if (button == eMouseLeftInv) {
    int temp;
    if (mouse.Mode == eModeGive) temp = 1;
    player.ActiveInventory = inventory[game.inv_activated];
    if (temp == 1) mouse.Mode = eModeGive;
    }


If needed, you could also use this to filter the other modes so that, for example, "Push (InvItem)" won't change the cursor mode.
Title: Re: status line setup
Post by: Lazarus on Thu 16/03/2006 09:27:28
That sort of works, but when selecting an inventory item and then using it on nothing the give mode doesn't change back to the walk mode or if I right clicked on an object say to look at something.

Also on another note is there a way of setting up the unhandled events for if mouse modes were used for example:
string locname;
string invname;
GetLocationName(mouse.x,mouse.y,locname);
Ã,  Ã, 

if (mouse.Mode==eModeInteract) {
Ã,  Ã, Display("I can't use that");
Ã,  Ã, }
else if ((mouse.Mode==eModeUseInv)&&(type==3)) {
Ã,  Ã, Display("I can't use the %s with the %s.", invname, locname);
Ã,  Ã, }
else if ((mouse.Mode==eModeGive)&&(type==3)) {
Ã,  Ã, Display("I rather keep it.");
Ã,  Ã, }

else if ((mouse.Mode==eModeLookat)&&(type==0)) {
Ã,  Ã, Display("Nothing special with it.");
Ã,  Ã, }
else if (mouse.Mode==eModePickup) {
Ã,  Ã, Display("I'm picking that up.");
Ã,  Ã, }
else if (mouse.Mode==eModeTalkto) {
Ã,  Ã, Display("Speaking with %s is a waste of time.", locname);
Ã,  Ã, }
else if (mouse.Mode==eModePull) {
Ã,  Ã, Display("Pulling that is a waste of time.");
Ã,  Ã, }
else if (mouse.Mode==eModePush) {
Ã,  Ã, Display("Pushing hat is a waste of time.");
Ã,  Ã, }
else if (mouse.Mode==eModeOpen) {
Ã,  Ã, Display("I can't open it.");
Ã,  Ã, }
else if (mouse.Mode==eModeClose) {
Ã,  Ã, Display("I can't close it.");
Ã,  Ã, }


as I wanted different reactions between using an inventory item and giving an inventory item.