Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - jamesreg

#1
Would anyone accept a commision to add features to this existing module or create a new tile engine with additional features?
#2
Downloaded a fresh copy of AGS 3.5.0.24 from the main page tried to create a game on first save and start I ended up with a message that said something along the lines as the game engine appears to not have shut down properly.
I even started a blank game and did not do anything but try to run the demo game and same thing happens.




Code: ags
Error: The operation was canceled by the user
Version: AGS 3.5.0.24

System.Exception: The operation was canceled by the user ---> System.ComponentModel.Win32Exception: The operation was canceled by the user
   at AGS.Editor.Tasks.RunEXEFile(String exeName, String parameter, Boolean raiseEventOnExit)
   at AGS.Editor.Tasks.TestGame(Boolean withDebugger)
   at AGS.Editor.InteractiveTasks.TestGame(Boolean withDebugger)
   --- End of inner exception stack trace ---
   at AGS.Editor.InteractiveTasks.TestGame(Boolean withDebugger)
   at AGS.Editor.Components.BuildCommandsComponent.TestGame(Boolean withDebugger)
   at AGS.Editor.Components.BuildCommandsComponent.CommandClick(String controlID)
   at AGS.Editor.ToolBarManager.ToolbarEventHandler(Object sender, EventArgs e)
   at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
   at System.Windows.Forms.ToolStripButton.OnClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
   at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ToolStrip.WndProc(Message& m)
   at AGS.Editor.ToolStripExtended.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
#3
Quote from: Snarky on Thu 14/03/2019 09:51:23
Just FYI, the way many games get around the room limit is to reuse the same room, just with different "decoration" depending on what room it's meant to represent. If several rooms have the same general layout (walkable area), you can vary the appearance and interaction using objects that you set to different sprites (and respond to based on logic that takes the "virtual room number" into account).

Yes I am doing that trick as well as multiple rooms on one background. For Example I have one deck that is a Cargo Deck. There are 6 Cargo bays on that deck, A Cargo Transporter room, as well as two rooms associated with the Tractor beam plus the hallways. in total 12 rooms in game. But I have it all on one background with 6 "rooms" on one background and 6 of one of the rooms is the same cargo bay. I simply turn on off objects and characters and set bools so it looks like I entered 6 separate cargo bays yet it is only one background used for all 6 rooms. Ill do similar when I get to ship quarters and such.  All these tricks are allowing me to only use 24 rooms for what will appear to be 100s of rooms ultimatly.
#4
Way to early to even speculate right now.

7 years ago I attempted the project which has been a dream of mine for a long time.
But things did not work with the team I had back then life issues got in the way before we got to far.

I spent the last 7 years off and on designing the concept and refining it much deeper on paper and notebooks.

Finally sit down and officially picked it back up a couple months ago and this time the attempt is going much much better.

I am using a 3D model of the Enterprise to render out my rooms and decks backgrounds which are being used as concept and filler art and allowing me to full script the exploration of the ship right now. This is gone amazingly well and I almost have a full Star ship that can be explored with fully working Turbolift, Transporters, Intercom system, library computer,  and just about everything else on the ship. The ship can be fully explored even the turbolift shafts and jeffeies tubes are present to explore. I am also filling the decks with crewmen that appear to have schedules and move around on the ship. All concentration right now is being put into making the most Interactive ship to explore as I can.

Khris designed an 3D mock up engine within AGS that is a mock up of Wing Commander. I asked Crimson Wizard to assist converting it for use with this game even though the base game will be traditional point and click adventure game format when exploring the ship and planets and away team missions and such the space part of the game exploring space sectors and space combat and all this will be done in 3D. 

So it is going to be awhile the first demo I plan to release is a Ship exploration mode which will allow you to explore the entire ship it will be done as Captain Kirk's first day aboard and as an Inspection of the ship/Tutorial kinda thing. But just the exploration of the ship alone will be larger then most full games are so it should be an enjoyable Demo and pump people up for more.

I am looking for other Artist I only have one right now and the project is a bit much for one person so anyone who wants to participate we are doing it in Pixel art.
The artist will have 3d renders of the backgrounds and basically just need to recreate in pixel art.

Im not planning on announcing anything official until I have got more done but the progress is positive and even though it is a large project it is moving at a fairly fast rate of progress daily right now.
#5
Because I am trying to avoid the limit of 300 save able rooms.

I am making a Star Trek game which one of the parts of the game is recreating the entire Enterprise which is 24 decks and hundreds of room locations and hallways etc.
So for that part I am laying out the decks as one actual room with with large background with multiple rooms on that deck on it. then all the coding for an entire deck can be done in just one room script and reduce the number of actual rooms to a min. This is a large project just doing the ship and Ill also have missions and planets to goto which ill be doing simular thing with for those locations.
#6
That works will have to do an if/else thing depending on where I am entering from to handle more then one viewport. But setting the viewport from the room load thing worked.
#7
I am having an issue with setviewport command.

I have a background which is larger then my regular room background.
However I do not want the room to scroll. I have it set up so basically there are multiple rooms on one background.
Base game is 480x270.   the background I have is 1440x540 which consist of 6 480x270 rooms on that background.

The issue I am having is if I use setviewport to change another room on that background while still in the same game room It sets the viewport correctly.
However if I do a cChar.changeroom command and setviewport during that change. It does not set the viewport correctly it sets it halfway between the background.
what do I have to do to make sure it sets it at exactly where I want it?

setviewport(960,0);
Is what I am tryng to get it to set to if I am already in that room it works like a charm but If I do same command while changing rooms it does not work and offsets the background.

it seems as if i start the character in that room it acts fine and switches viewports fine but if i change character from one room to that room it tries to be a scrolling room
#8
I am trying to figure out how to when using the intetact Icon on the player chatacter or any other non player chatacter to get it to open a gui menu above his head.
#9
I started to experiment with the draw commands to see if I could do it

Code: ags
if (mouse.IsButtonDown(eMouseLeft)) {

DrawingSurface *surface = Room.GetDrawingSurfaceForBackground();
surface.DrawingColor = 14;
surface.DrawImage(GetViewportX()+236,GetViewportY()+175 , 563, 0, 9, 99);
surface.Release();


I came up with this which I think I need to be using the draw from sprite option instead but I figured out how to get it to draw my laser sprite in the viewport and come shooting up from where I want it to.

So what is the best way to do this to say if it does no collide with the character and disapear off in the distance.
Draw the sprite going to the target cursor, erase it draw a smaller height one erase it and so on?

Will I be able to add collision checks with these drawings?
#10


I got this moving some now but I think it is my numbers which are off or maybe im still doing it totally wrong

Code: ags
 bGreenDot.X = viewportX/75 + (bGreenDot.Width) /5;
  bGreenDot.X = viewportX/80 - (bGreenDot.Width) /5;


it moves side to side just fine (except it wraps a couple grids to early on the map)
It does not move the blip up or down at all.

But I am running into my enemy at about the right location good news.

Disregard the above

Code: ags
BEnemy1.X = cEnemy1.x/50  + (BEnemy1.Width) / 5;
  BEnemy1.Y = cEnemy1.y/50  + (BEnemy1.Width) / 5;
  
  bGreenDot.X = viewportX/50 + (bGreenDot.Width) /5;
  bGreenDot.Y = viewportY/50 - (bGreenDot.Width) /5;
 


found my typos and changed the numbers to the size of the gui and it works except for beight roughly half or a full radar blip apart from the enemy when I go looking for him is this due to the fact the enemy is a character and the player is a viewport and I need to compensate for that?
Im slowly starting to understand
#11
I did this in another room that was the default 480x270 game size not scrolling in order to test it out
It is setting a laser beam object in middle of room bottom part of screen  and then moving it though the middle of room on mouse left click.
this works except I need to figure out how to do the part you were helping me with on the finding that middle and keeping it there when the room is scrolling room.

Code: ags
 
    if (mouse.IsButtonDown(eMouseLeft) && phaser1_onscreen==false){
       object[0].Visible=true; //laser beam
       object[0].Move(220 , 0, 5, eNoBlock, eAnywhere); //laser beam
       SetTimer(3, 50);  //timer to give laser beam enough time to move off screen
       phaser1_onscreen=true;  //Book to say the laser is on screen

}

else if (mouse.IsButtonDown(eMouseLeft) && phaser1_onscreen==true) {
 
}

if (IsTimerExpired(3)) {
    object[0].Visible=false; //Hide the laser Laser Beam
    object[0].SetPosition(220, 267); // Reset Laser Beam Location at Bottom
    phaser1_onscreen=false; //reset bool that laser beam is no longer moving on screen
  
}


This works fine in a non scrolling room now I have to figure out how to edit it to working in the scrolling room with the
instructions you gave me for finding the viewport location.

And I understand what your code means and is supposed to do I am still to dumb to write it out as I still get confused on the whole room vs viewport locations and such.

Code: ags
center x coordinate is GetViewportX() + Screen.ViewportWidth / 2


But will the code work for what I am looking for.  The way I have it set up if i can get it to hide at the center bottom of the gui overlay I have will work for me to be able to add in all my random, damage, repairs and such and test out a lot of my other stuff and take a big step forward.

#12
I was using hot spots because we are not all master coders so I figured if I made hotspots I could mouse over them and then tell the button to move that way. 90 percent of what I want to do later can be done in the panels or basic interactions but this part of game you have to know how to code to do it.


Original code now I need the two bGreendot lines in the format you gave me.

Code: ags
BEnemy1.X = cEnemy1.x/75  + (BEnemy1.Width) / 5;
  BEnemy1.Y = cEnemy1.y/80  + (BEnemy1.Width) / 5;
  
  bGreenDot.X = mouse.x/75 + (bGreenDot.Width) / 5;
  bGreenDot.Y =  mouse.y/80 + (bGreenDot.Width) / 5;


ok so you told me
Code: ags
roomX = screenX + GetViewportX();
  screenY = roomY - GetViewportY();



Now ill try to see if I can figure out how to write that out.
I understand what the formula means and what it is meant to do.
I just have to play with it till I get it right now.


EDIT
I am till having trouble understanding how I need to code the player radar part. I understand what your code says and is supposed to do but I am still confused on the whole room vs view port coordinates things but making progress the scrolling i done, almost have weapons working and almost have radar if I can get to that point I can combine a lot of other things I already done and be on my own for awhile Im just still confused how to write this out and want to understand how to better understand the room vs viewport thing.
#13
I have a scrolling room with the mouse locked to the middle of the screen.

I need to have a projectile (Laser Beam) shoot out from the bottom middle of the viewport screen and head toward the target cursor in the middle of the room.

I know the draw command is the best way to do this but I would never be able to figure it out on my own.

So I know another option people use to move projectiles around on the screen is to set an invisible object or character on the screen and then make it visible and move it when needed this is going to have to be the option I take with my level of coding skills.

If this was not a scrolling room I would be able to do this with ease but beings it is a scrolling room how do I get the hidden object to always stay at bottom middle of screen as I am scrolling and being ready to shoot out when needed. Ill be shooting it with the left mouse click.

I also will be needing if it does not collide with another object or character for it to appear as if it is scalling down or getting smaller till it disapears then reset to bottom of room again.

#14
Code: ags
 BEnemy1.X = cEnemy1.x/50  + (BEnemy1.Width) / 5;
  BEnemy1.Y = cEnemy1.y/50  + (BEnemy1.Width) / 5;
  
  bGreenDot.X = viewportX/50 + (bGreenDot.Width) /5;
  bGreenDot.Y = viewportY/50 - (bGreenDot.Width) /5;


Got it to working im still about one radar blip over from the enemy when I go looking for him but other then that it works perfect any ideas why.



#15
I am making a Star Trek fan game which will be mostly 90 percent Adventure game format for Landing Party missions.
But with about 10 percent Space combat stuff which will be similar to wing commander or the old star trek judgement rights game.
but also with a bit of strategy/sim stuff built in where you have to maintain your ship and crew as well.

The part that I am unable to do by myself is the space combat part.

It will mainly take place in a scrollable wrap around space background room.
You will view everything as if you are looking thought the view screen of the Enterprise.

Right now I have it set up where you can scroll and loop around the background and mouse is set to middle of screen as a target cursor.

What I need help with is the following:

1) Coding for the weapons fire (left for Phasers) (Right for Torpedoes)
I need them to look like they are fading off in the distance and show some fake distance look if they do not hit the enemy.
I can do the damage, collision stuff myself just do not know how to do the fire part.

2) Some help with Enemy AI and their movements and looking like they also have some distance at times as well.

I am willing to commission someone to help me do this not just asking for freebies or credit you as a level designer etc or both.
#16
Code: ags
BEnemy1.X = cEnemy1.x/75  + (BEnemy1.Width) / 5;
  BEnemy1.Y = cEnemy1.y/80  + (BEnemy1.Width) / 5;
  
  bGreenDot.X = mouse.x/75 + (bGreenDot.Width) / 5;
  bGreenDot.Y =  mouse.y/80 + (bGreenDot.Width) / 5;

I fixed the errors of having the wrong button listed in script but it still will not show my movements the code for the enemy movement works perfectly. I thought if I used the same code for where my mouse was at it would do the same thing but it does not. Could it have anything to do with me having the mouse in the center of the screen and constantly having it stay there?

Also the /75 and the /80 and /5 I really do not know if those numbers are what I need I just put numbers in there until my enemy radar showed the correct location.

It is showing me in the right location but when i move the radar button just shakes a bit but does not move like the enemy blip does
#17
Beginners' Technical Questions / Radar Quesion
Sun 10/02/2019 14:48:02
I have a radar gui on screen with two buttons

BEnemy1 is the npc enemy character moving around randomly on screen
BGreenDot is a button that is meant to be my location.

I have the mouse set to center of screen as a target cursor in a scrolling room
The radar shows BEnemy1 moving around as he is supposed to

But I am having problems with it not showing my position.

Note: The button tries to move but just is jumpy in the same location does not switch like it is supposed to

Here is my code for the radar

Code: ags
BEnemy1.X = cEnemy1.x/75  + (BEnemy1.Width) / 5;
  BEnemy1.Y = cEnemy1.y/80  + (BEnemy1.Width) / 5;
  
  bGreenDot.X = mouse.x/75 + (BEnemy1.Width) /5;
  bGreenDot.X=  mouse.y/75 + (BEnemy1.Width) /5;


And in case anyone wants to know or it will help here is my entire room code incase something else is messing it up like my setting the mouse to center of screen or something.

Code: ags
// room script file

//Functions
bool modeWasFlipped;
  function Nav_Mode () 
{
 
  Bridge_Battle=true;
  mouse.Visible=false;
 gTargetCursor.Visible=true;
  gTargetCursor.Centre();
  //cEgo.Transparency=100;
  cEgo.Transparency=0;
  mouse.Mode=eModeInteract;
  gGui1.Visible=true;
  
}
  
function Cursor_Mode ()
{
 
  Bridge_Battle=false;
  Mouse.Mode=eModePointer;
  mouse.Visible=true;
  gTargetCursor.Visible=false;
  cEgo.Transparency=100;
}

int centerX, centerY,  wrapWidth=1, wrapHeight=1, viewportX, viewportY;
//BEFORE ROOM LOAD SCRIPTS
function room_Load()
{
  
 BattleMode=true;
 mouse.Mode=eModeInteract;
  Nav_Mode();
  
  // Just calculate some useful values:
  
  centerX = System.ViewportWidth/2;
  centerY = System.ViewportHeight/2;
   wrapWidth = Room.Width - System.ViewportWidth;
   wrapHeight = Room.Height - System.ViewportHeight;
 }
 
// Moved all the stuff to do with the battle into its own function, to keep things tidy
void updateBattle()
{
  // TODO: Update ships and stuff
  mouse.Update(); // This makes sure we get the most up-to-date mouse coordinates
  // Calculate viewport scrolling
  int moveX = mouse.x - centerX;
  int moveY = mouse.y - centerY;
 
  // Move viewport, wrapping around
  viewportX = (viewportX + moveX + wrapWidth) % wrapWidth;
  viewportY = (viewportY + moveY + wrapWidth) % wrapWidth;
  SetViewport(viewportX, viewportY);
  mouse.SetPosition(centerX, centerY);
}


//scripts that repeatedly fire
function room_RepExec() {
  if (cEnemy1.Room == 2) {
   if (cEnemy1.Moving == false) {
     cEnemy1.Walk(Random(Room.Width), Random(Room.Height));
  }
}

 ///RADAR Enemy 1
  BEnemy1.X = cEnemy1.x/75  + (BEnemy1.Width) / 5;
  BEnemy1.Y = cEnemy1.y/80  + (BEnemy1.Width) / 5;
  
  bGreenDot.X = mouse.x/75 + (BEnemy1.Width) /5;
  bGreenDot.X=  mouse.y/75 + (BEnemy1.Width) /5;
 
 //lOCK Mouse to follow mouse
 cEgo.x = mouse.x;
 cEgo.y = mouse.y;
 

  
  
    

  // Testing script to exit game 
 
  
 //Hot ket to find enemy
if (IsKeyPressed(eKeyT)){
    SetViewport(cEgo.x, cEgo.y);
  }
 
  if (IsKeyPressed(eKeyEscape)) {
    QuitGame(0);
  }
  //End of Testing Script  
 
  if(IsKeyPressed(eKeyZ))
  {
    // We only switch mode if we haven't already done so during this keypress
    if(modeWasFlipped == false) // another way to write this is just: if(!modeWasFlipped)
    {
      if(Bridge_Battle == true)  // or just: if(Bridge_Battle)
        Cursor_Mode();
      else
        Nav_Mode();
 
      modeWasFlipped = true; // We've switched mode, so set the flag
    }
  } // End: IsKeyPressed(eKeyZ)
  else // the key is released, so we reset the flag
    modeWasFlipped = false;
 
  if(Bridge_Battle == true) // Same: if(Bridge_Battle)
    updateBattle();
}


#18
QuoteI take it what you're trying to achieve is some kind of space combat sim, sort of like Wing Commander, only from the viewpoint of the gunport of a "stationary" ship (so that you can't actually fly around dogfighting)?

Yes Pretty much like Wing Commander and very much like Star Trek 25th Anniversary and Judgment rites set up where you see stuff though the view screen. you never see your ship just the enemy ships in the screen.

Quote"Have some intelligent movement going on" â€" What do you mean by this? What sort of movement and behavior do you want from them?
As you've currently coded it, they fly in a straight line from Point A to Point B, then immediately "bounce" and head in some other straight line to Point C. Is that the sort of movement you want, or do you want to try to get something that seems more physically realistic?
You don't have any notion of "distance" to the ships, they're all moving along a flat invisible surface in space (or, I guess technically around the surface of an invisible sphere with you in the center, assuming that's what the wraparound effect is mean to simulate). Is that OK, or do you want ships to come closer and move further away from you?

1) More Physical Realistic
2) A distance system where they will appear closer and further away at times.
3) The wrap around was meant to keep you from hitting the edges and stopping. But I do not like how the characters disapear when you are close to one. id like for them to be able to wrap to or confine them far enough away from the borders you never notice anything odd with them appearing disappearing strangely.

QuoteAnd another observation that raises further questions: Since your visible screen is only a small part of the whole room, ships will often be outside of the visible region. Should they still behave the same way when out of view? Should they be able to attack even when you can't see them, for example? Should new ships only spawn in the visible part of the room, or anywhere? Do you need some kind of indicator letting you know where they are?

Yes I am working right now on a radar system that will show My location and enemy ships locations as a little dot on a grid. I used hot spots to separate areas of the background off then move the dot to the location on the radar grid if they were in that hot spot area. However I thought I could do the same thing with my location using if mouse is over hot spot beings my mouse is always center screen figured it would work but it does not for some reason.

As far as rather they can attact or react if still in my viewport but off the part thats out of the viewscreen in the middle that is fine as your know you close to them because of radar and its not an issue.

QuoteNo nowhere near comfortable enough coding it that way or good enough at math to do it that way. Besides faking it out even though less perfect will go with the retro look of the rest of the game like other games from that era did.

QuoteDecision 2: Implement any kind of "AI"
Enemy intelligence in games is usually pretty simple. The most common way is to give each enemy a few different "states" to switch between. In each state they follow some particular simple rule of what to do, and then they switch to another state when some condition is fulfilled. For example, ships could have states like "circling", "dodging", "distracting", "attacking" and "fleeing". Here, "circling" would be some variation of the "random movement" you already have implemented. "Dodging" would tell it to change direction more often, maybe speed up. "Distracting" would head towards the region of your viewport, close to but not directly under the targeting aim. "Attacking" would carry out an attack (if you have several, just pick one at random), and "Fleeing" would, well, flee (maybe engaging cloaking if available).

Then you have a rule that says, for example: If you're in the "circling" state and the player shoots somewhere closer than 10 pixels from you, switch to the "dodging" state. And another rule that says: If you've been in the circling state for more than 40 seconds, switch to the "attack" state. And another that says: If the player attacks another ship and its health/shield level is less than 33%, and you're less than 300 pixels away, go to the "distract" state. And so on. You add rules for transitioning from each state to each of the other states that make sense. (Usually you have at least a transition back to the "default" state, "circling", from every other state.)

The collection of states and rules for transitioning between them is called a state machine, and is very common for this kind of task. You can achieve surprisingly complex, "intelligent" behaviors with just a few states, some very basic behaviors in each state, and smart rules for transitioning between them.

This sounds more like or exactly like the things I wanted it to be able to do. I wanted an AI thing like that and then the ability to script or call up certain things on command if I wanted to as well.

My hopes it to use that one battle room we created earlier this week and use it for multiple battles and script it to know which battle im in and which ships etc to put there and what their moves are and such.

I'll let you review my answers and then you can advice further on what I need to do or be looking into to achieve this stuff.


#19
Ignore this post made a mistake
#20
Ok,

I know there are several post on Roaming Characters in a room and there are several different ways it can be done.

Let me explain my overall goals for this so someone can help me figure out the best way of going about it and where to get started.

About the Room:

1) Main Game room size is 480x270
2) Scrolling Background size is 3000x3000
3) The room is already set up to use a target gui in the center of screen and hidden mouse also always in center.
4) The room Scrolls and loops around the edges to the opposite side of the screen as it scrolls.

Needed Goals:

1) Need to be able to have characters which will be enemy ships traveling around on the screen at random Sometimes there will be more then one.

2) Need to have enemy ship characters be able to loop around the screen just like it does when scrolling and appear on the opposite side of the screen.

Right now this is my goals to get done but in case it is needed to know future plans in order to decide the best way to go with this ill also later be wanting to do the following.

1) When the view port comes in range of the character have it use its view to turn direction toward the screen and attack and fly back off
2) Have when it is damaged beyond a certain point to flee off again or at times cloak itself
3) Have some intelligent movement going on or be able to call up special moves or turns from different angles.
4) At Random cloak and uncloak later and attack (can ags gradually reduce/increase transparency or should I look into the tween mod for this?

This second part is more complex stuff right now I am seeking to figure out mainly the roaming around and loopable stuff but I know sometimes if we do not explain all we want to do then we find out something else we plan will not work with the way we went with code to get something else to work so I wanted to explain all I was hoping to achieve with this.

So what is the best way to look into doing this.

Right now I am trying this and it allows the Ship to move around randomly when it comes to a room border it turns around and heads another direction this will work if I have to do it this way as it does look fine but would be better if I get it to wrap the scrolling screen.

Code: ags
if (cRomulanShip.Room == player.Room) {
   if (cRomulanShip.Moving == false) {
     cRomulanShip.Walk(Random(Room.Width), Random(Room.Height));


So I am halfway there on my first couple things
SMF spam blocked by CleanTalk