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 - EnterTheStory (aka tolworthy)

#101
I just got this email:
QuoteI was successful in playing Les Miserables on my droid by linking to my home comp. It was really cool and made for awesome sauce while waiting in the docs office
I asked him for more details of how he did it - has anyone else succeeded in playing AGS games on the droid? Any tips?
#102
Thanks. My goal is to streamline the process enough that I can produce a new story every two months. I figure that five stories a year over twenty years should let me do all my favorites and a lot more.

I'm really grateful for AGS being here - it makes the programming part of it a lot easier, and it's nice to be around people who 'get' that a story does not always need the latest technology to be good.
#103
Nice to see you too. I'd forgotten how welcoming this board is. The first image is an in-game shot BTW, but I've added another two just to make sure.
#104
I think my game is ready to sell (it's been through seven beta test versions), but both of my regular testers have suddenly got other commitments (school!). Is anyone willing to give it a run through from start to finish? In the next few days if possible? I'd be very grateful!

PM me for a link.

About the game: http://enterthestory.com/




The stories are point and click adventures closely based on the classics:
Les Miserables
Dante's Divine Comedy (including Dante's Inferno)
Genesis of the Gods (based on Hesiod's Theogony)

About the download:
This includes all three stories - they form a trilogy that introduces Peri, a character who appears in all future games. The third story (Genesis of..) still needs final testing. The first two have been tested and sold in the past, but I've added more interaction between the stories so if anyone is willing to go finish all three games that would be fantastic.

How long will it take?
It shouldn't take too long - there is an extensive help system, so if you keep hitting F1 you get easier and easier clues, and if you're really in a hurry there's an 'emergency help' system (press Ctrl+H then Ctrl+P) that will tell you exactly what to click on.

About previous threads:
A few month ago in response to another thread I started implementing antialiased fonts and more left clicking, but I've gone back to the previous method for various reasons that would take too long to explain but are explored in the blog. But I do listen to all suggestions and implement the vast majority of them.

Thanks in advance!

Image based on 'old bookcase' by 'mararie', Flickr, CC 2.0

Edit: I just read the rules more carefully and apparently I have to give an outline of the story. This might take a while, because the three stories in the game (so far) all connect to form one big story. And it's a little bit complex, as it forms the basis for all the future stories that will also connect together. This particular thread is mostly about Genesis of the Gods, but anyone who buys one gets all three, as they need to be seen in context.

I'll outline the first two stories in more detail, as they're more relevant to the project as a whole: the first one is typical of the kind of story you should expect after the initial trilogy, and the second illustrates my unusual approach (treating the stories as if they're real.)

OK, here goes. The game (so far) is a trilogy of stories, linked by a character called Peri. Peri plays one of the children for whom Jean Valjean stole a loaf of bread, then later she plays the role of Beatrice, and finally she's an angel sent to defend mankind against Ouranos. More detail:

Victor Hugo's Les Misérables is one of the world's great classics, a story of love and death and passion and sacrifice. It stars Jean Valjean, a man imprisoned for stealing a loaf of bread to feed his sister's starving children. In this game one of those children was Peri.

The story summary here is adapted from Wikipedia:
Les Misérables (translated variously from French as The Miserable Ones, The Wretched, The Poor Ones, The Wretched Poor, The Victims) is a novel by French author Victor Hugo and is widely considered one of the greatest novels of the 19th century. It follows the lives and interactions of several French characters over a twenty-year period in the early 19th century, starting in 1815, the year of Napoleon's final defeat at Waterloo.

The novel focuses on the struggles of ex-convict Jean Valjean and his experience of redemption. It examines the nature of law and grace, and expounds upon the history of France, architecture of Paris, politics, moral philosophy, antimonarchism, justice, religion, and the types and nature of romantic and familial love. The story is historical fiction because it contains factual, historic events, including the Paris Uprising of 1832 (often mistaken for the much earlier French Revolution).

Les Misérables contains many plots, but the main thread is the story of ex-convict, Jean Valjean (known by his prison number, 24601), who becomes a force for good in the world, but cannot escape his dark past. Hugo fills many pages with his thoughts on religion, politics, and society.

Major characters:

   * Jean Valjean (a.k.a. Monsieur Madeleine, a.k.a. Ultimus Fauchelevent, a.k.a. Monsieur Leblanc, a.k.a. Urbain Fabre, a.k.a. 24601 a.k.a. 9430) â€" Convicted for stealing a loaf of bread, he is paroled from prison nineteen years later. Rejected by society for being a former convict, Bishop Myriel turns his life around. He assumes a new identity to pursue an honest life, becoming a factory owner and a mayor. He adopts and raises Fantine's daughter Cosette, saves Marius from the barricade, and more.
   * Javert â€" An obsessive police inspector who continuously hunts, tracks down, and loses Valjean. He goes undercover behind the barricade, but is discovered and unmasked. Valjean has the chance to kill Javert, but lets him go. Later Javert allows Valjean to escape. For the first time, Javert is in a situation in which he knows that the lawful course is immoral.
   * Bishop Myriel, the bishop of Digne â€" A kindly old priest who is promoted to bishop by a chance encounter with Napoleon. He convinces Valjean to change his ways after Valjean steals some silver from him and saves Valjean from being arrested.
   * Fantine â€" A Parisian girl abandoned with a small child by her lover Félix Tholomyès. Fantine leaves her daughter Cosette in the care of the Thénardiers, innkeepers in a village called Montfermeil. Unfortunately, Mme. Thénardier spoils her own daughters and abuses Cosette. Fantine finds work at Monsieur Madeleine's factory, but is fired by a female supervisor who discovers that she is an unwed mother. The Thénardiers constantly demand money, and Fantine sells everything she has to save her child, eventually including her own body.
   * Cosette (a.k.a. Euphrasie, a.k.a. The Lark, a.k.a Ursule) - after Fantine dies, Valjean ransoms her from the Thénardiers and she becomes his adopted daughter. She later grows up to become very beautiful. She falls in love with Marius Pontmercy.
   * Marius Pontmercy â€" A second-generation aristocrat (not recognized as such because it was Napoleon who made Marius' father a noble) who fell out with his royalist grandfather after discovering the truth about his father.
   * Enjolras â€" A charming and intimidating man with angelic beauty, he is passionately devoted to democracy, equality and justice. Enjolras is a man of principle that believes in a cause â€" creating a republic, liberating the poor â€" without any doubts.
   * Éponine â€" The Thénardiers' elder daughter. As a child, she is pampered and spoiled by her parents, but ends up a street urchin when she reaches adolescence. She is blindly in love with Marius.
   * Gavroche â€" The unloved eldest son of the Thénardiers, he lives on th street and longs for adventure.
   * Monsieur Gillenormand â€" Marius' grandfather. A Monarchist, he sharply disagrees with his grandson and throws him out - but hates himself for doing it.
   * Mabeuf â€" An elderly churchwarden. He was friends with Colonel Pontmercy, and then befriends Marius after Colonel Pontmercy's death. He helps Marius realize the true identity and intentions of his father.  He feels his life has been a failure.

The story has been adapted into at least fifty movies and six different stage plays, including a successful musical. This is the first time the story has been presented as a game, and the first time that you, the reader, can enter and become part of it.

The Divine Comedy, written by Dante Alighieri between 1308 and his death in 1321, is widely considered the central epic poem of Italian literature, and is seen as one of the greatest works of world literature. The poem's imaginative and allegorical vision of the Christian afterlife is a culmination of the medieval world-view as it had developed in the Western Church. It is divided into three parts, the Inferno, Purgatorio, and Paradiso.

The poem tells of Dante's journey through the three realms of the dead, lasting from the night before Good Friday to the Wednesday after Easter in the spring of 1300. The Roman poet Virgil guides him through Hell and Purgatory; Beatrice, Dante's ideal woman, guides him through Heaven.

In Northern Italy's political struggle between Guelphs and Ghibellines. Florence's Guelphs split into factions around 1300, the White Guelphs, and the Black Guelphs. Dante was among the White Guelphs who were exiled in 1302. This exile, which lasted the rest of Dante's life, shows its influence in many parts of the Comedy, from prophecies of Dante's exile to Dante's views of politics to the eternal damnation of some of his opponents.

The story begins with Dante lost in a dark wood, assailed by beasts (a lion, a leopard, and a she-wolf) and unable to find his way home. Dante is at last rescued by Virgil, and the two of them realize that their only way home is through Hell. The Inferno follows the two through the ten circles of Hell, down to the center of the Earth. The second part, Purgatory, follows them through the seven terraces of that mountain, up to the garden of Eden. The third part, Paradise, follows them through the seven heavens, the stars, and ultimately the throne of God.

Enter The Story always follows the original story, chapter by chapter, but is more concerned with the ideas behind the story. And so, just as Dante reflected the cosmological beliefs that had evolved up to the year 1300, so the game keeps these but also brings them in harmony with a more modern understanding, and speculates even further. And just as Dante included many historical and contemporary figures, the game keeps these characters and also adds a few others from later centuries and our own day.

Enter The Story treats the poem as real history. Which means that some parts need to be reinterpreted in the light of modern understanding. Not changed - every story in Enter The Story is strictly faithful tot he original, event by event - but reinterpreted in the way that a believe in the Bible might interpret the sacred text in the light of modern discoveries. For example, Dante describes Hell in the form of a vast funnel shaped cave, thousands of miles around. Clearly the roof of such a cave would collapse, and besides, no such cavity has been found through sonar readings. No doubt Dante merely vast caves and only speculated on their size. Similarly, Dante travels to the center of the Earth, and later to the surface of the sun, without being consumed by heat. Clearly advanced technology is at work. On a more important note, Dante describes souls being tortured for eternity - a point that other games have accepted at face value - yet this contradicts Dante's belief in a merciful God. Also, Dante states that these beings are spirits - how can spirits feel physical pain? How  can decapitation (for example) be a problem to someone is already dead? How can noble pagans be condemned to purgatory, yet far less deserving popes end up in heaven? Clearly Dante is reporting these events from his Medieval perspective, and others may see them differently.

Genesis of The Gods is a loose translation of the word "theogony:" the game is based on Hesiod's poem. Hesiod's 'theogony' is a large-scale synthesis of a vast variety of local Greek traditions concerning the gods, organized as a narrative that tells how they came to be and how they established permanent control over the cosmos. It begins with the muses singing, then we take part in the creation of the universe, the rise of Ouranos, creation of the Titans, his battles with them, the creation of the gods, how the gods are all related, gods versus Titans, the creation of Mankind, Prometheus stealing fire from heaven, the final battle with Typhon, the end of the world, a lot of philosophy (strictly optional) all built around the structure of a  romance.

Together the three stories form an introduction to Enter The Story, a project to combine at least thirty (more likely eighty or so) classic stories into one huge game world.

Now the forum rules also say I should add "Screenshots, promotional material, designer diaries, demo downloads, music samples" etc. That could make this thread extremely long - it is not a short game! I'd rather take the chance of skipping all that. Please let me know if you think I should add that too.
#105
Thanks for the suggestions. What you say makes a lot of sense. However, I've decided however to cut the Gordian knot and remove antialiasing from my games. Non-essential features make the code more complex without improving the story, so I've decided to go back to basics and spend my time on story telling instead.
#106
Quote from: Crimson Wizard on Wed 09/12/2009 21:15:19Have you checked line 1016?

line 1016 is part of rep_ex:
Code: ags

if(GetGlobalInt(22) ==1)	// hotspotsa re shown?
{	old_overhot = overhot_text; // assume there is no change in hotspot
	if(!override_overhot) 						// can be overridden elsewhere in the game
	{	overhot_text = Game.GetLocationName(mouse.x, mouse.y); 
		if(checkLocationAlias(overhot_text)) overhot_text = locationAlias; // some hotspots are renamed during the game
		gTextgui.Visible =true; // the hotspot GUI
	}		
	if(old_overhot !=overhot_text) // don't bother if nothing has changed
	changeMouseOver(overhot_text, OverHot_Font, myOverHotColor);// *** line 1016 ***
		
	// position of overHot ------------------------------------
	int overhotmp = mouse.x + OverHot_XOff;
	if ((overhotmp + GetTextWidth(overhot_text, OverHot_Font)) > OverHot_BoundX2)
	overhotmp = OverHot_BoundX2 - GetTextWidth(overhot_text, OverHot_Font);
	if (overhotmp < OverHot_BoundX1) overhotmp = OverHot_BoundX1;
		gTextgui.X = overhotmp; // so the position of the overlay will be adjusted every game loop
	overhotmp = mouse.y + OverHot_YOff;
	if ((overhotmp + GetTextHeight(overhot_text, OverHot_Font, OverHot_Width)) > OverHot_BoundY2) overhotmp = OverHot_BoundY2 - GetTextHeight(overhot_text, OverHot_Font, OverHot_Width);
	if (overhotmp < OverHot_BoundY1) overhotmp = OverHot_BoundY1;
	gTextgui.Y = overhotmp;
}


Here is the original function in more detail:
Code: ags

function changeMouseOver(String text, int font, int color)
// me: DELETED from end of function:, int outlinecolor, int outlinefont, Alignment alignment) 
{ if(text == "")	{ gTextgui.BackgroundGraphic = 82;	return; }// no text, don't bother to do anything 
if(text ==mouseover_prevtext){gTextgui.BackgroundGraphic = mouseover_sprite.Graphic;return;}// same text as before?
SetBackgroundFrame(0); 														// for animating screens
RawSaveScreen();
RawClearScreen(63519);
int lineheight = GetTextHeight(text, font, 200); // 200 is any number bigger than the width (i.e. this does not wrap)
RawPrintOutlined(0,0, font,  text,  color);
mouseover_sprite = DynamicSprite.CreateFromBackground(0, 0, 0, GetTextWidth(text,font)+12, lineheight+4);// line 341
mouseover_prevtext = text;											
// set width and height (this once CRASHed with "SetGUISize: invalid dimensions" - hence checks)
int t =mouseover_sprite.Width; if(t <30) t =30; if(t >150) t =150;
if(gTextgui.X >(320 -t)) gTextgui.X = 320 -t;
gTextgui.Width = t;
t =mouseover_sprite.Height; if(t <8) t =8; if(t >50) t =50;
if(gTextgui.Y >(240 -t)) gTextgui.Y = 240 -t;
gTextgui.Height = t;
gTextgui.BackgroundGraphic = mouseover_sprite.Graphic;
RawRestoreScreen();
SetBackgroundFrame(-1); 													//for animating screens
}



Quote from: Crimson Wizard on Wed 09/12/2009 21:15:19How many script modules do you have by the way?

I Keep it to ten, so it's easy to Ctrl-N between them:
Ctrl-1: imported modules plus code that has to come first
Ctrl-2: most functions
Ctrl-3: cut-scenes
Ctrl-4: clue dialog
Ctrl-5: hotspot comments
Ctrl-6: conversations
Ctrl-7: story outline
Ctrl-8: the function that decides how to forward the story
Ctrl-9: commented-out notes (list of what's in every global variable, etc.)
Ctrl-G: anything that naturally goes with mouse click, rep_ex, GUIs, etc.
#107
Sorry to come back with this, I must be a very slow learner. A very similar but different crash now occurs:

Code: ags

â€"â€"â€"â€"â€"â€"â€"â€"â€"
Adventure Game Studio
â€"â€"â€"â€"â€"â€"â€"â€"â€"
An error has occured. Please contact the game author for support, as this
is likely to be a scripting error and not a bug in AGS.
(ACI version 2.72.920)

in imported modules (line 341)
from imported modules (line 1016)

Error: DeleteSprite: Attempted to free a static sprite that was not loaded by the script

â€"â€"â€"â€"â€"â€"â€"â€"â€"
OK
â€"â€"â€"â€"â€"â€"â€"â€"â€"

this is the line of code it refers to (line numbers added):

Code: ags
line 340: RawPrintOutlined(0,0, font,  text,  color);
line 341: mouseover_sprite = DynamicSprite.CreateFromBackground(0, 0, 0, GetTextWidth(text,font)+12, lineheight+4); // this is the evil line
line 342: mouseover_prevtext = text;


How is line 341 deleting any sprite? How is it "not loaded by the script "â€" mouseover_sprite is declared outside any function, it’s used many times, and is never deleted. In particular, why does it suddenly crash after working perfectly five or ten times? I’m stumped.

I did try this:
Code: ags
if(mouseover_sprite){mouseover_sprite.Delete();}
mouseover_sprite = DynamicSprite.CreateFromBackground(0, 0, 0, GetTextWidth(text,font)+12, lineheight+4);

But that crashed the first time the Delete line was reached (despite the sprite being declared at the start of the function), so I removed that line. Without that line the game at least plays for a few seconds.
#108
Thanks. I appreciate your help.

EDIT:
After tidying everything up, I discovered that my crash had nothing to do with DynamicSprites. Somehow my sprite bank had become corrupted, and it only showed up when certain characters tried to speak or idle. Oh well. It was good to learn more about pointers anyway.
#109
Thanks. I get that. It's the GUI background that I'm vague on:
Code: ags

gSelectedperson.BackgroundGraphic = selected_sprite.Graphic;

Is it true to say that the GUI (gSelectedperson) never had its own background image: (i.e. when selected_sprite is deleted, the GUI loses its image)
#110
Ah... the fog begins to clear... :)
One last question. The pointer was used for grabbing a part of the background that is now used as a sprite. Does the sprite disappear when the pointer is deleted? (I know I should just test this, but I'm trying to understand WHY it works.)
#111
Code: ags

if (selected_sprite)
{
   selected_sprite.Delete();
}


Thanks for the quick reply. I'm a little vague over what's actually happening there. selected_sprite is a pointer defined outside the function, so presumably "deleting" it only removes what it pointed to? So after deleting it I could call selected_sprite.PointToSomethingNew and the pointer would still be there ready to grab some more memory?
#112
Quote from: wonkyth on Tue 08/12/2009 22:53:32
You need to call selected_sprite.Delete().

But won't that make the GUI background disappear? And when I tried adding Delete I just got a null error next time I called that function. Sorry if I sound like an idiot!
#113
I have three GUIs on screen (in 2.72). Each GUI has a background image created using DynamicSprite.CreateFromBackground
E.g.
Code: ags

DynamicSprite* selected_sprite;		export selected_sprite;
function changeSelectedLabel(String text, int font, int color)
{ if(text == "")	{ gSelectedperson.BackgroundGraphic = 82;	return; }
	SetBackgroundFrame(0);
	RawSaveScreen();
	RawClearScreen(63519);
	RawPrintOutlined(0,0, font,  text,  color);// just prints text on the blank background
	selected_sprite = DynamicSprite.CreateFromBackground(0, 0, 0, GetTextWidth(text,font)+2, 12);
	gSelectedperson.Width = selected_sprite.Width;
	gSelectedperson.Height = selected_sprite.Height;
	gSelectedperson.BackgroundGraphic = selected_sprite.Graphic;
	gSelectedperson.X = 160 -(width/2);
	RawRestoreScreen();
	SetBackgroundFrame(-1);
}

I get a recurring crash, and I can make it happen when character.say is called. I think it's something to do with creating dynamic overlays and not releasing them. I don't want to call sprite.Delete because I need those sprites. As you can see, pointers are not by strong suit, so I'd be grateful for some guidance!

#114
Thanks. That's useful to know.
#115
Quote from: Gilbet V7000a on Thu 15/10/2009 15:21:01file systems of different O/S may also have different limits on the length of paths.
Ah, that would make sense. I imagine 256 characters is a common maximum, so having 185 left over sounds right. Thanks for the tip.

Quote from: Gilbet V7000a on Thu 15/10/2009 15:21:011. Use the value passed to the next game in RunAGSGame()
I don't think I could squeeze 80 game tags intoa  single int :)

Quote from: Gilbet V7000a on Thu 15/10/2009 15:21:012. When you call the new game, just write a file with some specific contents first

Yes, that would work, but I'm trying to avoid writing too many extra files (I have a great talent for creating bugs, so try to keep everything as simple as possible). I like the idea of including the contents of a file in its name - it just feels right. I think in practice I'll be unlikely to exceed 50 characters or so for most .tra files.
#116
Quote from: Gilbet V7000a on Thu 15/10/2009 14:20:29Any practical reasons do you have for having such a long file name?

I plan to have around 80 games that can link together using RunAGSGame. You can't change translation file mid game, so each .tra file contains the text for up to 80 games. But not all games are translated. If you go from a translated game to an untranslated one, CRASH! So each translation file name includes the names of all the games it can handle, and I check them before running RunAGSGame.

Example: "German_game1_game4_game31.tra" or "Dutch_game2_game31_game32_game75.tra" etc.
#117
I've noticed that translation file names can be 185 characters long (189 including ".tra"), but if you try 186 they won't be used. Any idea why this is?
#118
Quote from: AGA on Wed 09/09/2009 19:55:10All opposing sites to Adventure Gamers are failing. This is the way it should be.
Ummm... you do know that the AG Underground link in your sig comes up 404? None of us are immune. (cue creepy music....)
#119
It's tough being an adventure game fan! I remember for years thinking that Qandary was the most reliable site, and it was.. then they just closed it down one day.

Somebody should make an AGS game where you play an adventure gamer  and just try to survive.
#120
I just visited justAdventure.com and it looks like nothing's been updated in a few months. 'Search' is now just an unlinked word, and four emails I tried all bounced. This used to be a big deal site (1 million hits a month is the boast). Anyone know what happened?
SMF spam blocked by CleanTalk