DonkeyFace

Active Member
Dec 24, 2017
881
3,049
View attachment 664180 View attachment 664181 View attachment 664182

News 2020-05-20

Where have you been Roman, we haven't heard from you for a few days! What's with the silence? Well, I've been battling depression with SCIENCE! or something. Maybe it was technology. I don't know.

Anyway. Let's talk candidly about where we're at and the challenges of making a game.

To make a game like Doctor Amana requires three very different jobs with three very different skill sets.

1. Writer - You have to build a story and tie it together and make it worth reading. I do this in Scrivener because it has excellent tools for tracking notes, characters, and assembling different parts of your story in different sequences to test the "flow" of the read.

2. Artwork - You have make pretty visuals to enhance the story and bring to life all the characters and scenarios you worked so hard to develop in the writing process. I use Daz at the moment because the models are ready made, it's quick to implement, and it's become a bit of a standard.

3. Coding - You have to turn all that into a playable product. In a game like mine, this means coding the art, the story, and tracking hundreds of variables to mark the difference choices a player makes and ensures that the story unfolds in predefined sequence.

Each one of these can be a full time task and as a lone developer trying to tackle all of these alone for a game as ambitious as Doctor Amana has been daunting. When all this started I was just a writer, and slowly I've been spread out to handle all three of these tasks simultaneously.

One of my biggest reoccurring challenges is evolving script. I write in Scrivener, I export to Renpy, As I make the art, sometimes the script changes or the dialogue morphs a bit while because the ideas continue to flow. Then before I know it, my Scrivener files and my actual game are out of sync. The next time I sit to write, I have to jump back and forth between renpy and scrivener to make sure things work and make sense.

But in renpy, my script has now been poisoned with lines and lines of code that interrupt the flow of the read (which is why I don't write exclusively in renpy). This turns the task of writing the next scene into a challenge as I jump back and forth between three or and four files to make sure things make sense and flow together. Often those files don't agree with each other and I write hoping it'll make sense on the back end.

I have over the last year sought help with art and coding from other parties with mixed success, but never to the degree of personal preference I have for the project. It's hard working with artists remotely because the communication is so limited and you can't give real time feedback during development, making the process of outsourcing almost as time consuming and laborious as doing it yourself.

I finally reached a point where I think I have to throw in the towel and say, "I'm going to be doing this alone for a long, long time." And at first, this realization was a bit dejecting. But I'm not a defeatist and with a bourbon in my hand, I sat down and focused on the real problem .

"How can a single developer create a quality game with a complex narrative by himself, and maintain a regular update schedule that doesn't span months at a time?"

At this point I want to add that professionally, my background is in business analytics and data science. I've made a better than average living for years selling process improvements and last week I decided I needed to start hardcore applying that experience to this project.

I realized the solution to my problem is the same solution I've sold to many companies over the years: Computer Automation.
But where to implement it? Obviously I can't automate the writing because it requires too much creative input. The same goes for the artwork. But then I thought about the coding.

Coding the Doctor Amana game requires many, many lines of code. For example, when there is a choice to make in the game, you typically have an image, the choice, a few lines of following dialogue, another image, and some code that records your choice.

So at times, 1 Choice + 1 Line of Dialogue + 2 Images = 18 Lines of Image Definitions + 5 Lines of Script

One choice plus a line of dialogue and two images can often take up to 20 lines of code all said and done.

Could I trim this by making a simpler game? Of course I could. I could trim it down to four lines easy, but in doing so would lose some of that dynamism that your choices have and reduce the game to a more simple, linear narrative. But I don't want to do that. I like the complexity introduced in my choice system and I couldn't dream of giving it up.

So if I wanted to reduce my workload, I needed to apply some automation to my coding. And if I went about it smart and did it right, I could cut out a complete third of my workload. I've automated tasks for years, but I've never automated coding and I didn't know how much of a challenge that would be.

But as I looked over the code I began to see all the places where method calls arise and in the way my definitions are set up and the patterns were very clear. I already had patterns I used to reference my images and name my files. Much of the information I'd need to automate the coding was already embedded in the short hand I used for file names.

Well it turns out that all you need to automate the coding process is a strong understanding of string manipulation, which I already had. Once I realized that, all that was left was to develop a bit of a shorthand for more variable things like choices that could be isolated in the script and turned into meaningful code. Seemed simple enough.

Alright, well, I had an idea for a potential solution, all that was left was to sit down and build it, and then pray it worked. Guess what, it fucking did.

In only 150 lines of code I now have a renpy generator that will take my raw .txt output from Scrivener and convert it to a usable renpy file that I can plug straight into the game.

It takes the Windows 1252 encoding from Scrivener, converts it to UTF8, fixes indentations, adds the python code for the menu choices, formats the menu choices and adds the python code for the scene variables.

But what saves the most time is that it takes a simple notation, and generates a sequence of image names following my existing convention and places them in the code. It then takes these references and in a separate file writes all my layeredimage code, complete with paths and variants for different game modes that it generates using the file name of the renpy script file.

Image definition files can consist of 300+ lines of code that I have type manually or copy and paste and make changes to the individual lines. And each scene needs one of these files. Manually typing, and copy and pasting can and have sometimes lead to errors in the code that I later have to go back and fix.

This file is now automatically generated using a file name, and a list of images. And the list of images it needs is also generated automatically. It's a massive time saver not just in time spent coding, but in time spent debugging images.
Basically, it turns the first image (a single txt file), into the second and third images (1 Renpy Script File and 1 Renpy Image Definitions File) in the blink of an eye. The only one I had to touch was the .txt file. The rest was created automatically on export.

What's it all mean?

It means that 95% of the coding job is handled automatically. I don't have to do it anymore! And when I make changes to certain implementations, I just tweak my code generator and in seconds the entire script is updated with the new implementation.

No more jumping between files. As I make art, if the script changes, I can just change it in Scrivener, export, convert and in a fraction of a second it's done. My core script is now always up to date and editing of the story can be done exclusively in Scrivener. The problem with files being out of sync between Scrivener and the game is eliminated and the story is no longer a fragmented mess.

Best of all, when I sit to work on the game, my time is split between writing an art. No more coding. The way I like it!
No doubt there will be some tweaking and adjustment required to fine tune the operation. But already I'm seeing time saved in the encoding of images into the game. And not having to sit and do the tedious code work is a real morale booster.

I know this post got a little windy, but I wanted to paint a complete picture for you. Not just so that you'd understand my silence these last couple of weeks, but so that you'd understand just what a victory this is for the project. Now, onwards!

I'll have some more art and news coming soon. I figure that's probably about enough for one day.

Salute mates! And thank you for your support!
Hey Roman, congrats on your achievement here.
I think reading this post gave my brain a fucking aneurysm, and an even greater appreciation for what you developers do and go through. I often think about taking a crack at developing my own game, but after reading posts like these.... Not a bloody chance in hell is that ever going to happen!! I'll bitch slap the fuck out of myself if a ridiculous thought such as that pops in my stupid head again. You Sir, have spared me time, energy, and the last vestige of sanity that I still hold. And I love you for it!
 

holajay

Newbie
Mar 18, 2019
19
23
I'm hoping the Cassie update features some actual sexual content if you've been feeding her the lust dialogue options. Amanda is a shyer girl so only getting to third base with her made sense (although it was disappointing), but I feel like Cassie is ready to go.
 

goobdoob

Conversation Conqueror
Modder
Respected User
Dec 17, 2017
7,426
9,686
I'm hoping the Cassie update features some actual sexual content if you've been feeding her the lust dialogue options. Amanda is a shyer girl so only getting to third base with her made sense (although it was disappointing), but I feel like Cassie is ready to go.
"Third base" isn't actual sexual content?


I would classify (cassie-fy? :p ) touching of the gentals as "actual sexual content". If you mean fucking, say fucking.
 

Jeevant

Failed to make an unlimited money mod for my life
Moderator
Modder
Compressor
May 1, 2020
2,126
32,814
Yeah, the dev got arrested for attempting to seduce his dau....err I mean neighbor girl. Sadly, that kind of conduct is illegal. So, off this goes into the bin of games that had to be cancelled.
how do you know that? i am sorry i am not aware of it
 
  • Like
Reactions: RomanHume

jamdan

Forum Fanatic
Sep 28, 2018
4,294
23,000
how do you know that? i am sorry i am not aware of it
Well, you see, I was the dau...err I mean neighbor girl. It all started when we got a tip from a concerned landlady that some perv was trying to seduce young girls in the neighborhood. So we, as responsible and moral citizens, decided to do something about it. The only solution was that one of us had to dress as an innocent, cute and defenseless girl so our perv will come out of hiding....but we had a problem. All of us are men, manly hairy men to be exact. How will we, as manly hairy men, convince someone that we are a cute, innocent and defenseless girl? The only solution was to learn the art of being a cute innocent girl. We shaved our bodies, we put our hair in pigtails and we put on the cutest makeup you've ever saw. We learned about bra's, how to stuff a bra, how to seductively take a bra off and even how to wear matching panties and bra's. And I, as the top of the class, was the chosen one.

So, there I was. Just innocently licking an ice-cream cone....and there he was, peeking around the corner like some creeper in every roommate/landlady/neighbor game on this site. He creeped closer...and closer. Then he asked me "Hey girl, so since I'm your fath... err neighbor, you wanna help me out with some stuff". I replied "Hehehe sure" and off we went......We were just sitting there in his living room, I was nearly done with my ice-cream but some of it had melted from the....heat. He offered, like a true perv, to help me out. I said "Okay!" and he proceeded to stick his tongue out and move his face closer to me....then the trap was sprung! I grabbed his tongue with my manly man hands of justice, dragged him to the cop car that was strategically positioned behind the living room window and finally I took off my bra, it wasn't how he imagined it though, it was a recording device that had recorded our entire interaction. He knew his plan was foiled, he knew he done fucked up, and then, the cops took him away. What a day. What a great day for justice!
 

goobdoob

Conversation Conqueror
Modder
Respected User
Dec 17, 2017
7,426
9,686
Well, you see, I was the dau...err I mean neighbor girl. It all started when we got a tip from a concerned landlady that some perv was trying to seduce young girls in the neighborhood. So we, as responsible and moral citizens, decided to do something about it. The only solution was that one of us had to dress as an innocent, cute and defenseless girl so our perv will come out of hiding....but we had a problem. All of us are men, manly hairy men to be exact. How will we, as manly hairy men, convince someone that we are a cute, innocent and defenseless girl? The only solution was to learn the art of being a cute innocent girl. We shaved our bodies, we put our hair in pigtails and we put on the cutest makeup you've ever saw. We learned about bra's, how to stuff a bra, how to seductively take a bra off and even how to wear matching panties and bra's. And I, as the top of the class, was the chosen one.

So, there I was. Just innocently licking an ice-cream cone....and there he was, peeking around the corner like some creeper in every roommate/landlady/neighbor game on this site. He creeped closer...and closer. Then he asked me "Hey girl, so since I'm your fath... err neighbor, you wanna help me out with some stuff". I replied "Hehehe sure" and off we went......We were just sitting there in his living room, I was nearly done with my ice-cream but some of it had melted from the....heat. He offered, like a true perv, to help me out. I said "Okay!" and he proceeded to stick his tongue out and move his face closer to me....then the trap was sprung! I grabbed his tongue with my manly man hands of justice, dragged him to the cop car that was strategically positioned behind the living room window and finally I took off my bra, it wasn't how he imagined it though, it was a recording device that had recorded our entire interaction. He knew his plan was foiled, he knew he done fucked up, and then, the cops took him away. What a day. What a great day for justice!
How'd you end up pregnant?
 
  • Haha
Reactions: RomanHume

PinkGoddess

Well-Known Member
Apr 3, 2020
1,311
1,838
Unofficial Android Port for v1.1.5 Compressed :

Download

ALLOW STORAGE ACCESS
My Android Ports now have a 2nd Persistent save location. So, even if you uninstall the game, the saves will remain Intact.
You don't have permission to view the spoiler content. Log in or register now.

If it says unknown developer or something like that just press install anyway.

Give Me Your Feedback on the Discord Server. As it's easier to reach me there, than here.
Discord:
Ty for the port ! Can someone put this link in the op pls? For make more easy the search for players like me that want android port haha
 
  • Like
Reactions: RomanHume

fried

Almost
Moderator
Donor
Nov 11, 2017
2,311
6,084
At this point I want to add that professionally, my background is in business analytics and data science. I've made a better than average living for years selling process improvements and last week I decided I needed to start hardcore applying that experience to this project.

I realized the solution to my problem is the same solution I've sold to many companies over the years: Computer Automation.
But where to implement it? Obviously I can't automate the writing because it requires too much creative input. The same goes for the artwork. But then I thought about the coding.
Ha, I generally recognized your "type" awhile back - it's funny how us business folk have personalities which often reflect the type of work in which we specialize. Oh, and your areas of concentration are highly respectable, btw - not making a comment putting you down (quite the opposite).

BTW, when you describe generating the list of image file names and placing those into the script and image definition files . . . are those placeholders for the final image files based on cues from the script, essentially? That would be very cool, essentially offering an easy way to know where you are intending to fill in the blanks for any given scene, I'd imagine: write the script, run your code generator and then actually generate the image files to match the script's intentions (and your new generated code's filenames). Then just spruce up details or make customizations on-the-fly.
 
Last edited:
  • Like
Reactions: RomanHume

RomanHume

Sommelier of Pussy & Purveyor of Porn
Game Developer
Jan 5, 2018
2,390
13,342
lingerie start amana 02 silent.png

2020-05-28 News

It's been a few days since my last news post and it's been a hell of a busy week since. Figure it's time to let you know what's been going on.

First, I'll summarize my last news post: I'm writing code that will write my code so that I don't have to code.

That's pretty much done. But in doing that, I spent a lot of time looking at the code in it's current state and realized just how much experience I've acquired in the last year of making this game.

I started examining some of the problems I've been having with broken saves, evolving classes and objects, the structure of the story, and in general just how my code interacts with itself. This really put me into a long term mind set and got me thinking about what I could do to make things more stable going forward.

A number of solutions quickly made themselves apparent. Solutions that as a rookie renpy programmer were not immediately obvious. But having worked through so many quirks and problems in the last year, I started imagining ways to avoid those going forward.

Now the rest of this post may get a bit technical, but I want to try my best to convey not just how much work is going into this, but how it's going to benefit you in the long run.

I want to be in full creative mode. I want to sit down, write stories, make art, dump it into a file and forget about it.

As we go through these, remember my end goal is to NEVER CODE AGAIN! (not now, and not in any of the 100 future games I want to make).

Problem 1: Broken Saves

This is something that has irked me from day one and I realize that a big part of that problem was how I kept changing the code around trying to find a good 'fit'. Add to that the complexity I introduced by having different classes and objects all recording different stats and info and before you know it, I've got variables and instances all over the place keeping track of different things. If I change how one class works, it impacts a cascade of others and I have to go through and start scrubbing code to make all the corrections.

Even then you miss some, saves break or errors pop up and the whole thing becomes a shit storm. Essentially you wind up with different saves each based on a different version of the code and everything hates each other and won't work.

Solution 1: Centralization and Static Methods

It's still handy having different classes handle different functions. But instead of having to initialize an instance of those classes and let them store all this individual data all over the place, why not just give them a job to perform, and then hand off the results to a central record keeper that will keep all the variables safely locked in a single place? And while I'm at it, I should design it so that they don't have to be instanced to do it.

This way, if the class needs to evolve or change, there is no instance of it in the save file. The game won't know or care that it changed as long as the output of the class methods remain the same. If the output is the same, there is no code to scrub for and update, and the train continues to run smoothly.

Of course, there is still data that needs to be retained between plays. So I created The_Scribe. Now ALL of the variables that change during the course of play are now being saved in a single instance of the scribe who records and tracks all the stuff that changes during the course of a play through. All the variables in one place. If a function or statement needs to know something, it turns to the scribe because it knows all! Nothing in the game can change without it knowing, and it remembers! (Ok, that got a little ominous but I was feeling it.)

As a bonus, if for some reason I need to improve the scribe in the future or add features to it, I can create an updated version that takes the old version as an initialization parameter and all of your data will flow into the new object during the loading process and the game will continue to function without error.

By following a few simple rules, there should never be another broken save.

Problem 2: Some Classes and Screens need Data that requires periodic maintenance

A perfect example is the Character Selection Screen to start new chapters. In order for that screen to do it's job, it needs to be told what chapters are currently in the game, and whether or not they are currently accessible in the story.

This means whenever I add a scene to the game, I need to go into the code, add the new scene to the available list of scenes. Then tell it what conditions are required before it can be played, like whether or not the preceding chapter had already been completed. And finally I have to debug it and make sure it works.

The same goes for the objects that calls on music, sound effects, images, etc. It's not a massive burden, but it's work. And any time I have to touch the code there is a chance something is typed incorrectly, not properly indented, or a dozen other small things that can break the code and require debugging.

I don't want to do it anymore.

Solution 2: Find it your damned self!

Objects that now rely on the existence of files can track them down on their own. Using the example of a new chapter in the game. The Class responsible for managing the story flow will use it's static method to scrub the directories and find all of the scene files in the game. It opens each file and reads the first line and uses the information to make a temporary dictionary of scenes and their requirements (like completing chapter 1 before you can play chapter 2).

With this temporary dictionary in hand, it asks the scribe (our central recorder), which scenes have been completed and what other conditions have been met. It uses the info to filter out any scenes that are complete and not currently available.

It takes what's left and throws it over to the character selection screen to be displayed by the player and then immediately forgets about everything it did so that the next time you are at the character selection screen it can start the process over and make sure you only have the most up to date information.

It also means that after I write a scene, all I have to do is drop it in the file and the game will find it on it's own. I don't have to update any code. I don't have to input any parameters. Everything is self contained and automated. LIBERATION!!!

The same goes for when I add music, sound effects, or new characters. There are classes that handle each of these and when the game needs the information, they fire up, search for their respective files and hand off the info to whatever process called it without ever saving a single thing to the save file and without me having to add anything to the code.



Problem 3: Missing Files and Errors

So with all this automation, there is a certain degree of failure in that if a file isn't found or is there one minute and suddenly gone the next, that a crash will occur. I could of course write error handlers that would check for the existence of this or that prior to running a section of code, but that's a lot of work.

When I have three or four game variants available that rely on different images, and an image is missing, the most thorough thing I can do is test the existence of each image before trying to load it.

It's a shit ton of work and up till now I haven't done it because "fuck it, I'll fix it if it's broke".

Solution 3: Make the Code that Writes the Code Write that Code Too!

Well now that I'm getting away from coding altogether, and I'm making code that will handle the coding, I'll just make that code handle the error handling as well.

A simple example is with the alternate images. Some characters have outfit changes for certain scenes depending on whether or not they are currently blue or red. Sometimes, I incorrectly name an image or something gets moved. Whatever, the point is, the game finds the error and crashes.

Now I can add a few lines of code to each image that will test it's existence first and if not found fall back to a default and keep on moving. That doesn't mean it won't be odd when suddenly a character's outfit changes and then swaps back. But at least the game didn't crash! And I don't know about you, but I'd take a distracting hiccup over show stopping vomit any day of the week.

Plus I can always go back and fix it after the fact, but at least your play through didn't crash!

That's just one example but there are several places I've added error handling that should increase stability going forward.





Anyway, I think I'll stop there for now. There's much more I've been working on and adding to the code (Including modifications that should make an Official Android Build possible in the next month or so) but I'll share that later. Just know that when it's done, all the weak spots should be shored up and all future development should be a cake walk.

Right now, I estimate another three or four days of coding and by this time next week I plan to be in 100% Creative Mode. No more coding and no more broken saves.

Nothing but story, art and bright horizons! I'm excited as fuck!

Till next time, thank you for your support and I salute you!
 

RomanHume

Sommelier of Pussy & Purveyor of Porn
Game Developer
Jan 5, 2018
2,390
13,342
Also I know it's been awhile since I've posted up replies here. I'm going to take some time this evening and start correcting that. Just be patient and I promise I'll get back to answer questions and comments.

Thanks for your patience. Cheers!
 
4.40 star(s) 78 Votes