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

Topics - Monsieur OUXX

#41
I'm in the situation where I know AGS for Windows inside and out (let me believe that, please) but have zero knowledge of AGS Linux and AGS MacOS. I'm talking about the engine, not the Editor.
However I understand that:
- AGS Linux can be taken for granted, whereas...
- ...AGS MacOS is still an elusive creature (it sorta works but requires some work).

Independently, I know that some people try to make AGS games run on Mac through emulation. (Right?)

Therefore, my thinking is as follows (I apologize in advance if it's completely idiotic and/or naive) :

Provided I don't have a MacOS version of the AGS engine, then as a game "publisher", can I make the life of my MacOS audience easier if I let them run the Linux version of my game on their Mac, rather than the Windows version?

In this fantasy scenario, I imagine that it's somewhat easier for the average MacOS end-user to run an emulated Linux version of an AGS game (due to the proximity of the systems) than an emulated Windows version. The reason for my belief is that I imagine that if they want to emulate AGS Windows they'd have to run the equivalent of Wine for Mac(which is probably complicated for the average Joe), whereas if they want to emulate AGS Linux I'd just need to provide them a few simple instructions or even ready-made files -- maybe some sort of Linux-to-Mac-converted package or whatnot.

Does any of that make sense?

#42
OK bear with me here. I'm looking to imitate what's done in C++ with ptr_unique, except in AGS. More generally I want to control every time a certain type of variable gets assigned, i.e. potentially copied.

I'll start with the "forbid copy" case and work on the other cases later. The idea is that you have a variable of some type (it doesn't matter, it can be a custom type) and the developer just cannot copy it. He/she has to work with the original instance and copying it is illegal.

As a naive solution, I could do a #define ASSIGN MyCustomFunctionThatCreatesACopyOfThePointer. Then the syntax would be clunky, but work :
Code: ags

VariableType copy = ASSIGN(originalVariable);


However what bothers me is that I could still do an "=" by mistake if I'm distracted.
Code: ags

VariableType copy = originalVariable; //I want this to be forbidden


So, the riddle :
- Can you think of any sort of mechanism (Think out of the box!) that would force a copy, or an assignment to go through an exceptional function somehow? Let me worry about the implementation. I'm looking for a clever concept to ignite it. Aren't there some obscure types in AGS that you cannot assign? Views or whatnot.
#43
Hello,

I've got this : https://github.com/adventuregamestudio/ags/releases/tag/v.3.5.0.24
On that page I can download ready-to-use stuff like : AGS-3.5.0.24-android-libs.zip, ags_3.5.0.24_linux.tar.gz

If I understand properly, everything else is for debug (in particular : AGS-3.5.0.24-debug.apk, AGS-3.5.0.24-pdb.zip)

My questions :
a) Does ags_3.5.0.24_linux.tar.gz contain the executables of the engine, and, if yes, are these the same as in the "Linux" subfolder of the AGS engine, and if yes, do I just need to copy that alongside the .ags file to make it work? (no need to detail the procedure, I just need a theoretical "yes"). Do I need to provide the compiled libraries too (allegro, etc.)
b) Similarly, does AGS-3.5.0.24-android-libs.zip contain the executables of the engine? If not, do I also need AGS-3.5.0.24-debug.apk? (which would surprise me as it sounds like a debug package). Talk to me like a 5-years-old, as my understanding of phones goes as far as APK GOOD, APK BE LIKE EXE or YOU SCREWED ANYWAYS BECAUSE YOU NO HAVE CERTIFICATE.

#44
Beginners' Technical Questions / Greek font?
Sun 05/04/2020 22:08:35
Anyone knows if there's a pixel font in Greek?
We would use both for dialogs and the GUI, so it would need to be about the same size as the default AGS in-game font.
We'd use automated outline, so no sweat on that side of business.
#45
Warning: This is advanced.
This is purely a question about programming in AGS language, to push its boundaries as far as possible. I'm exploring ways of implementing pseudo-callbacks in AGS script. For example, to be able to easily trigger stuff (in arbitrary locations of my scripts) whenever a Tween ends. But that's just one use case among thousands. And if I find a way I'd even go as far as implementing reflexivity.


Here's the scenario:

- In most modern programing languages, you can declare the classes in any order and then call the methods of any class from the methods of any other class
- Not in AGS, though. It works pretty much like C:
      You define a class "A" (actually a struct), that has a method "foo",
      then a struct "B", that has a method "bar",
      then inside B.bar() you may call A.foo(),
      but you cannot call B.bar() from inside A.foo(). Because the script file for A hasn't encountered B yet during compiling.
      => You need to think of the order of your dependencies properly.


However I do want to try to find a way of calling B.bar() from inside A.foo().
I see two ways of achieving this :

Idea #1 : you manage to implement an events pump as a hack for making dependencies loop

This one would only allow asynchronous calls (callbacks) because you can't predict when the event will be taken off the pile.
First you need to create an object to pile up so-called events, very low in the dependencies chain. So that every class can call it and say "I want to call a function please".
Then those events remain stored there until someone else decides to unpile them and start calling the requested functions.
I see two entities that could start reading the events from the pile :
- Either I have a dormant piece of code in late_repeatedly_execute_always that does it and calls all my callbacks at the very end of the game loop.
OR
- (Not sure if this one is technically possible) use AGS' built-in events to trigger a custom event. I'm just not sure when AGS would then read it, in the frame's lifecycle (in never use on_event because I suck). Then in on_event I would do the same thing as in the previous variant: read what function needs to be called, get the data (parameters and stuff) from the pile,  and call all the callbacks in an infinite loop until there are none left to call.

Idea #2 : Both are actually the same class, and the code is stored externally to AGS.

This is very hard. I'm not so much interested in that as  I am in idea #1. But this would allow an immediate, synchronous call.

Think Javascript. In a nutshell, their methods are not "real", they're just strings that you store in a dictionary when you initialize the game. Both A and B are actually some struct "Class" that has only one static method "Class.Call(structName, methodName, parameters)". Then, with more custom scripting, you let AGS run the relevant bit of code (the classe's method) from that, with nothing but a fancy giant "if (functionName=="foo") { ... }".

But then there's still the issue that the contents of the function (its instructions) have to be stored in an actual function, that's part of an actual module, and the dependencies order comes back (unless you want to write every functio of every class in the same struct, which is suicidal). So you'd need every so-called function to be accessible from anywhere. Basically, if the "events" hack described before is not enoug, then the only solution, I think, would be to write an AGS interpreter in AGS script and store the functions in external text files that would be read at runtime (there is already a primitive interpreter as part of module AGSConsole, or Ultravariables , that's a start).


=

So, what do you smart people think? Maybe focus on the on_event scenario for a start.
#46
I'm wondering what would be the best way to achieve this :
- The AGS game is 640x400 (or more, whatever). To keep it simple, we stick to a resolution that is a multiple of 320x200.
- You want it to look like a 320x200 game.

How would you do that?

The easy answer :
- import every background scaled 2x
- import every sprite scaled 2x
- etc. Everything 2x!
- Align sprites on a 320x200 grid instead of the game's real resolution. (in other words: if your game is 640x400 then don't use odd numbers coordinates)


The challenges :

- Character scaling : instead of having a walkable area that lets the character go "from 80% to 100%", you'll set it to "160% to 200%". Simple. But then the scaling won't be "nearest neighbour in 320x200"; When the sprite walks around at 160%, you will see that the sprite is actually at a higher resolution than 320x200 (if you're familiar with scaling issues you'll know what I mean).
- character positioning : the character can stop at "half" pixels.

Allowed cheats :
- it doesn't matter of the room's scrolling stops at "half pixels"
- it doesn't matter if tweens make use of half pixels

So in the end it's actually two questions :
1) Am I missing a challenge? Something that will be extremely time consuming?
2) Do you have ideas on how to make it look "more authentic" in general?

#47
AGS 3.4.1 Patch 1

Short version : How to run an embedded AGS game, when the parent and the child don't necessarily have the same languages (apart from English) ?


Imagine this :

  • You have an AGS game that you compile into a .EXE game.
  • That game has two translations : "English" and "German". They appear as .TRA files alongside the .EXE file.
  • You have another game that you compile into a .AGS file, and that you then place into the folder of the .EXE file
  • That second game has two translations: "English" and "ITA". You put ITA.TRA in the same folder as all other files (.EXE, .AGS, .TRA) and you don't care about English.TRA (As there's also a file named English.TRA that belongs to the first game). The game's default language is English anyway.

Your goal :

  • You run the setup program of the first game and select language "German", then "Save and run".
  • You prepare the call to the child game by doing Game.ChangeTranslation("English") -- so that the child game starts with a translation that is shared by both
  • You do RunGame("secondgame.ags")
  • Inside of the child game you do Game.ChangeTranslation("ITA")

On the paper I thought this would work.

But when I try, this happens :

  • Game.ChangeTranslation("English") works (returns true)
  • RunGame("secondgame.ags") works
  • But then I have an error message telling me that seconggame doesn't support "German". I don't understand why it complains as I forced it to start with "English"?


What am I doing wrong? Is there a better practice?

I'm trying to keep manual maintenance to a minimum, that's why I don't merge the translation files of the first and second game (apart from English).
#48
There's this paradigm I keep bumping into, and I don't know if I'm doing it right.

Imagine this :
- you have a room
- in the room, there's an object that the player can pick up
- the object is part of the room, so it casts a shadow

The problem is :
- the shadow is part of the object sprite (because it needs to disappear at the same time as the object when you pick up the object) => it means that the "clickable area" of the object will include the shadow.

For small objects it's not noticeable. But for large objects it's awkward (like, you have a shovel standing against the room's wall and it says "shovel" when you hover over it with the mouse, but the 40 pixels to the right of the shovel (representing its shadow cast on the wall) also say "shovel" for no apparent reason).

How I usually resolve it :
- for small objects I let it slip
- for objects with a big shadow I create a second object just for the shadow, that's meant to blend into the background (it's not clickable). To do so I set its baseline to 0. Then when the player picks the "real" object, I disable that shadow objet at the same time.

Is there a better way?
#50
(AGS 3.4.1 Patch 4)

I've tried two icons in the game directory, named USER.ico (links below)
32x32 icon : https://www.dropbox.com/s/tyvn86ywe2g8bs6/USER.ico.old?dl=0
128x128 icon : https://www.dropbox.com/s/447oc7lat9cmlrt/USER.ico?dl=0

the overall building process succeeds but the "icon" step fails with an error message.

At first I thought this was a permission issue, but it fails even with "run as admin".
I've also tried the tool "resource hacker" to replace the icon directly in the EXE but it's not great, it doesn't replace the tiny icon seen in Windows Explorer.

#51
Has anyone an explanation for this :

- I created a game in 3.4.1 using the Tumbleweed template (with heavily modified source code!) -- I'm just mentioning it in case someone suspects something.
- I created an inventoty item : iItem
- In the Editor I bound a function to each of the events, simply by clicking on each event and letting the editor create it
- I put a dummy instruction (int i=0;) and a breakpoint in each of those functions.
- I run the game and I try each of the 9 verbs of the template : Look at, open, close, push, pull, talk, use, give, pick up. there's also an implicit 10th action when you use another inventory item onto that item.

What I observe :
- Pick up => triggers "Other click" event function as expected
- Give : switches to "Give to" mode but doesn't trigger anything. That I can live with
- Look at => triggers  "Talk to" event function as expected
- Talk to => triggers  "Talk to" event function as expected
- Use => triggers  "Interact" event function as expected

But I also observe these:
- Open/Close => Triggers no event function
- Pull/Push => Triggers no event function


I saw that they do get triggered in the native Tumbleweed module.

But before I can understand how my modifications (most likely culprit) messed this up, I need to understand how it's possible to "block" an item event function? How can some events trigger nothing when there's explicitly an "other events" function for the item?
#52
Add a module to your game and paste this script into it.
Your game created in 3.4.x should compile in 3.5.x without complaining about the new Viewports system. Please note that you'll have to "replace all" System.ViewportHeight and System.ViewportWidth with System.ViewportHeight() and System.ViewportWidth().

Please note that I did that in exactly 5 minutes and it seemed to work with Tumbleweed (calin leafshade wink wink) but I didn't test thoroughly.
Also, if someone already posted that before then please ignore and assume that their version is better.



Code for the module's header:
Code: ags

import int ViewportHeight(static System);
import int ViewportWidth(static System);
import int ScreenHeight(static System);
import int ScreenWidth(static System);
import int GetViewportX();
import int GetViewportY();
import void SetViewport(int x,  int y);
import void ReleaseViewport();




Code for the module's body:
Code: ags

int ViewportHeight(static System)
{
  return Game.Camera.Height;
}

int ViewportWidth(static System)
{
  return Game.Camera.Width;
}


int ScreenHeight(static System)
{
  return Game.Camera.Height;
}

int ScreenWidth(static System)
{
  return Game.Camera.Width;
}

int GetViewportX()
{
  return Game.Camera.X;
}

int GetViewportY()
{
  return Game.Camera.Y;
}

void SetViewport(int x,  int y)
{
  Game.Camera.SetAt(x,  y);
}

void ReleaseViewport()
{
  Game.Camera.AutoTracking = true;
}



#53
Please note that this is about inventory, not room objects. Room objects have "ANY click" event, whereas inventory items have "OTHER click" event.

I went digging into some old scripting I had in a game I started many versions of AGS ago. I saw that I conveniently always ever used the "other click on inventory item" instead of separate, individual  events  such as "look at inventory item", "interact inventory item", etc. I was then checking the current mouse action INSIDE of the event function, to produce the appropriate response.
I used this technique throughout my entire game, to have less event functions cluttering my global script.

And now, I'm only just noticing that this is broken. The "other click" event is NOT firing when using "look at", "use", etc. on my inventory items. I specifically have to use the "look at inventory item" event for it to respond to "look at", for example.

I know my question sounds like the question of a confused person, but that's exactly what it is. I'm confused: Was the inventory item event "other click" always like that or has it been changed? How the heck did I manage to have my game work so far ? (I have a dozen inventory items, all using only the "other click" event)
#54
Now that 3.5 is out (amazing work by the way) I'd like to push the idea of maybe considering making AGS more source-control friendly. At the moment it's always stressful to have several people use an AGS project at the same time. We haven't had a catastrophic failure yet, but we had a few conflicts or sprite IDs mixups, that sort of things. Leaving some files out of git is a hazard. Also not everyone knows how to use git, and less clever systems (like dropbox) are not too good at resolving conflicts.

Several things could be done :

  • getting closer to an "assets" system (as in Unity and Godot) where the files used are the actual files (script files, images) instead of a few annoying binary, pre-compiled files (.crm files, sprite cache, etc.). --> This would make tracking much easier (time stamps, etc.)
  • The main project file (game.ags) could be more concurrent-access-friendly
  • The IDs generation could be more concurrent-access-friendly
I'll explain below what I mean each time.

Of course, as always, the tricky part would be to still make it easy to move the project folder around without "losing" some files. For that, the so-called "assets" should be in a subfolder inside of the project folder. We would keep the import system and absolutely not replace it with a system of dynamic links.
Another tricky part would be to prevent the player from tempering manually with the assets.

But I think that very simple things could be done to kickstart this : For example, the sprite cache could be written in the Debug folder instead of the project's root folder, just like the .EXE file, since it's part of the output. The cache file would be replaced with Cache folder where all the files remain individual files. And to prevent the user from tempreing with them they could have cryptic names (such as "img0001.123" where 123 is the ID of the sprite?

Similarly, the project file (game.ags) could be split into several files (gui.xml, characters.xml...), all placed into a "Game.ags" folder in the project root.

Finally, I humbly suggest that the IDs should be recycled less . I think that when a sprite is deleted, its ID shouldn't be made immediately available again. Instead, the IDs should continuously increase, and only when they reach the maximum value should the unused IDs be recycled. This would be an imperfect-yet-cheap way of avoiding mixups with IDs. Because I use source control and shared folders (like Dropbox) it happened to me that some conflict let AGS believe that some views were still using some deleted sprites. It didn't corrupt the game (lucky me but it was showing views with bogus sprites that had been imported over the deleted sprites.
#55
I'm trying to implement a "downhill" situation without the Downhill module.
What it means :
- The player walks DOWNWARDS (increasing Y coordinate)
- BUT In also want to show him walking with his BACK turned to the camera (as if his Y coordinate was decreasing).

The following code snippet fails to achieve that. The character keeps facing the camera the whole time What am I doing wrong?

Code: ags

    player.StopMoving();
    StartCutscene(eSkipESCOrRightButton);   
    int characterWalkView = 91; int loopWalkNorth = 3; int loopWalkSouth = 0;
    player.LockView(characterWalkView , eKeepMoving); Wait(1);
    player.FaceDirection(eDirectionUp);
    player.Animate(loopWalkNorth, 2, eRepeat, eNoBlock, eForwards);

    player.Walk(player.x,  payer.y+50, eBlock, eAnywhere); //walk downhill
    
    player.UnlockView(eKeepMoving);
    EndCutscene();


Note: I've tried replacing .Walk with .Move but it doesn't work either : It seems like the movement speed is now very high (the player almost teleports). Also we can see his back but I'm not even sure it's animated (but that might be because it's super fast)
#56
Hi everyone! This is more for sharing than for receiving criticism.
Selmiak found this excellent video that could probably boost the productivity and results of some of you out there :

Making animated PIXEL ART with Blender 2.8 in 12 Minutes
[imgzoom]https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fi1.ytimg.com%2Fvi%2FcLnyKRfBFsQ%2Fmqdefault.jpg&f=1[/imgzoom]


https://www.youtube.com/watch?v=cLnyKRfBFsQ
#57
I'm looking for an AGS engine plugin that would let me use any third-party language, do do stuff that I can't do with AGS.
There use to be quite a few : Lua, Python, C#...
However it seems that all of them are now lost, broken or not compatible with the latest AGS.

Does anyone have a suggestion?
#58
(This is meant to be a funny thread in reference to a funny fictional feature of the late AGS 2.x)

So at the moment I'm really, really studying the underlying construction principles of point-n-click games. I mean I'm going beyond writing roadmaps with the number of rooms, the connections between rooms, the number of objects and that sort of standard planning.

I've extracted some very abstract core principles that end up being pretty much a bunch of lists. These are lists of entities types : types of puzzles, types of areas in a game with several locations, types of obstacles, etc.

I've reached the point where I'm thinking "If I had too much time on my hands I could create an adventure game generator". Of course I'm saying that as a joke, as the task would be HUGE, programming wise. But it's the first time that I'm thinking it could be done with a sufficient level of quality (the player wouldn't notice). With the help of those lists and metrics, the game could be randomized and generated by a computer, and still be fun -- just the same way a computer can already build a (good) randomized dungeon and looting system in an action-RPG, or just the same way some games have simple randomized quests, as in the old "desktop adventures" series from the 90's or many games today.

Imagine the face of the wannabe point-n'-click creator if he could actually create a full-length point-n-click game by just clicking a button! Then of course he/she would still need to apply a "skin" to it (well-written dialogs and nice graphics), but the underlying game would be there, would be entertaining, and would be solid (well-balanced in difficulty, clues-dropping, no dead ends, and all that).

Also from a more serious perspective, if I was making adventure games for a living I would seriously consider implementing that tool, for quality control of full-length adventure games. The tool could in turn produce the actual roadmaps (meant for developers and artists) like the ones that are normally hand-made by the project manager or the game designer. That would probably save one to two months of planning and design at the beginning of every new game.
#59
Here is some non-trivial information about this attempt:
- Godot recently got a big boost (both in features and popularity and visibility) which made it move from "promising" to "the main 100% free rival to Unity".
- Escoria is a library/framework written in Godot script that implements in Godot all the tedious things expected in an adventure game (save/restore games + actions verbs + high level scripting language ("Esc" language) to script dialogs and custscenes).

The mild weakness of this is that Escoria had a flamboyant start but then became immediately obsolete when Godot moved up to Godot 3.0 and then 3.1. It broke some things.
The guys behind Escoria made it (mostly) work with Godot 3.0. There's a branch for that in their github, conveniently named "Escoria 3.0". It's good enough for any adventure game, really. Escoria also has a branch for Godot 3.1 and 3.1.1. But they're not actively developing those ones.

I've been trying to run the demo game of Escoria 3.0 in Godot 3.0.x (3.0.6) and I got a crash after a few clicks  :( But maybe it's just me who doesn't know enough yet. I'll keep you updated on that.

If anyone has a suggestion for another set of tools to develop a point n click game in Godot, then they're welcome to reply here.

#60
I've come to the conclusion that it's very hard to coordinate a project consisting of a team of several people when everything is made over the Internet.
I'd like to try the experience of making a game with someone that I can meet physically on a regular basis.

So... Anyone from Örebro, Sweden?
SMF spam blocked by CleanTalk