GDR Forum Index
Podcast Podcast
Dev Dev Logs
Search Search
RSS RSS
Register Register
Log in Log in
Reply to topic GDR Forum Index -> Game Developer's Refuge -> Development Log - A Lode Runner Story Page Previous  1, 2, 3, 4, 5, 6, 7, 8, 9  Next
View previous topic :: View next topic  
Author Message
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Fri Aug 29, 2014 6:08 pm    Post subject: Reply with quote

Dennis wrote:
mikedoty wrote:
Don't act like you don't know what I'm saying!
Die deutschen Texte sehen aus, als kaemen sie von einem automatischen Uebersetzungsprogramm. ;) (... had to write ae instead of &aauml; and Ue instead of Ü as the board software does not seem to allow those characters when typed in directly)


Ich verbringe mehrmonatigen Reisen durch Europa, Christkindlmarkt mehrere Sprachen auf dem Weg zu lernen. Ich versuche, meine neu gewonnenen Kenntnisse in meine Videospiel zum Wohle der ganzen Menschheit zu setzen, und stattdessen ich bin auf tragische Weise beschuldigt, einen online-Übersetzer, um die Arbeit für mich zu tun! Das ist ja unerhört!

I've used the same homemade font renderer for a long time. I hard-coded a loop in the thing, looping through ASCII characters 33 -> 125 and creating an image for each of those characters. That wasn't going to work for these languages I'm adding, though. When I want to render a "new" letter (non-traditional ASCII english letter), I now create it on the fly. The first time the game renders "Adiós!" I do not have a copy ready for the accented o, so I create it right then. It is working well, so far.

When it's time to actually translate the data, I have to send my data to the google translator in multiple files; it apparently has some limits (not surprising) on how much data it will translate in one pass. Right now I have a collection of 8 files, most of them a little bit less than 200 lines. I made a regex error when extracting the dialogue data and missed out on all multi-paragraph data (embedded newline), so I'll probaboly end up with another file or two. I've also found a couple of other missing translations, little things like the achievements data and a few labels.

Pretty neat to see more or less the whole game running in a different language. I don't know how many people will use it, but I think making things more accessible can only be a good thing. It's an interesting programming / data exercise, too!
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
PoV
Moderator

Joined: 21 Aug 2005
Posts: 10708
Location: Canadia
PostPosted: Fri Aug 29, 2014 6:32 pm    Post subject: Reply with quote

Wiggles my Ziggles Mc Diggles the 3rd.
_________________
Mike Kasprzak
'eh whatever. I used to make AAA and Indie games | Ludum Dare | Blog | Tweetar
View user's profile Send private message
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Mon Sep 01, 2014 8:20 am    Post subject: Reply with quote

PoV wrote:
Wiggles my Ziggles Mc Diggles the 3rd.


Did you wiggle your game Smiles into other languages as you released it on various platforms? I'd be interested to hear stories about how other people implemented it, from a programming standpoint and also the machine -vs- human (paid) translation...
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
PoV
Moderator

Joined: 21 Aug 2005
Posts: 10708
Location: Canadia
PostPosted: Mon Sep 01, 2014 9:55 am    Post subject: Reply with quote

I hired someone to do an Italian translation for me. Gave them a spreadsheet of words/prompts and intents, and I got back some Italian. I think I pad a few hundred dollars for it. That said, I only ever used it in a very obscure port of the game to win some $$$. I actually outright broke the game to use it, but in a branch, so the mainline wasn't affected.

I have done proper localizations. One of the easier ways I've seen for doing it is to wrap all of your hard coded text strings with a short function, _t("Player 1, Go!") sort of thing. Behind the scenes, _t does a text lookup of that string "Player 1, Go!" in a table/hashmap and returns the localized string. For multiple langauges, have a table per language. In the case of two strings that are the same in english, but different translated, place a number in the string (the hardcoded strings are now keys). Having your lookup function return an obvious "%%%STRING MISSING%%%" or similar string can be helpful. Be sure to add the missing glyphs to your font, vowels with umlats and such.

That's how to handle left-to-right European languages at least. Some European languages use a dot instead of a comma in numbers (11.000.000 vs 11,000,000). There are some english'isms that only we do (I forget, but I think it might be 1st, 2nd, 3rd. Nobody else ads st, nd, rd). Russian and Greek just need additional alphabets. Japanese and Chinese have way too many glyphs, thousands of them. Would be better to render a true-type font on demand, rather than bake out pages of glyph textures. Korean may have a much lower number (I forget). I think everything I've mentioned works left to right (but some are naturally read up to down). There are a few languages that work right to left, but I don't think the software markets are too big there.
_________________
Mike Kasprzak
'eh whatever. I used to make AAA and Indie games | Ludum Dare | Blog | Tweetar


Edited by PoV on Mon Sep 01, 2014 10:13 am; edited 2 times
View user's profile Send private message
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Mon Sep 01, 2014 10:11 am    Post subject: Reply with quote

Very interesting! The hash/table method is exactly the way I'm doing it. I didn't consider the subtler niceties e.g. 1.000 -vs- 1,000, but in my case I'm willing to cede some inaccuracies. Or a lot of them, given I'm machine translating. ;)
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
PoV
Moderator

Joined: 21 Aug 2005
Posts: 10708
Location: Canadia
PostPosted: Mon Sep 01, 2014 10:14 am    Post subject: Reply with quote

Humans are better than machines. Machines don't understand intent. They are good at approximating meaning, but what is said wont be natural. "Start Game" may machine translate as "Begin Entertainment". Not wrong, but not the intent.

In a pinch Google Translate works (I've shipped games with Google Filler). But you want real native speakers to help you with your grammar.
_________________
Mike Kasprzak
'eh whatever. I used to make AAA and Indie games | Ludum Dare | Blog | Tweetar
View user's profile Send private message
PoV
Moderator

Joined: 21 Aug 2005
Posts: 10708
Location: Canadia
PostPosted: Mon Sep 01, 2014 10:17 am    Post subject: Reply with quote

Quick google search, here's a list of game terms translated. Prefer this to the machine.

https://docs.google.com/spreadsheet/lv?key=0Al1cNCkGdEJfdF8xX0dsaHl6ZVpzMDF2OW9JaWVWMVE
_________________
Mike Kasprzak
'eh whatever. I used to make AAA and Indie games | Ludum Dare | Blog | Tweetar
View user's profile Send private message
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Tue Sep 02, 2014 4:51 pm    Post subject: Reply with quote

Time to spend (probably a lot of...) time proofreading my dialogue files, and anything else that needs it.

Here's a script I put together to compile all of the core dialogue string data. I have a "raw" dialogue format I use for putting conversations together, and I also have a "compiled" xml version of the same data that I use in the game itself. However, both files have a fair amount of structural data, in addition to all of the string data I need to proofread. Too much noise; I want only the minimum data necessary on my screen for this endeavor.

This isn't especially interesting, per se, but I thought I'd share it as an example of how I approach this kind of workflow (?) problem. In the end, I have a new html document (very primitive) for each level, each one holding the strings relevant to it. I could stand to add a little more data (perhaps a conversation identifier, etc.), but this narrows it down sufficiently for my needs. I just noticed the "word" recenty in one of these strings. I'll go back to the raw structure file, do a quick search for that string, and fix the typo. When I finish proofreading each file, I'll move it into a "done" folder. If I were to make alterations to a core dialogue file (or add a new one), I would have to make sure to keep track of that, lest I see that level's previous file in the "done" folder and mistakenly skip over the changes, potentially missing a newer typo. Obviously, this is not a perfect system.

Code:
import os
import sys

import re

import pygame

from code.tools.controlcenter import ControlCenter

from code.game.universe import Universe

from code.render.glfunctions import GLTextRenderer

from code.constants.common import MODE_GAME


pygame.init()


renderer = GLTextRenderer(
    "data/fonts/jupiterc.ttf", (0, 0, 0), (255, 255, 255)
)

control_center = ControlCenter(0, 0, 640, 480, debug = True)

universe = Universe("story1", MODE_GAME, control_center)

control_center.get_save_controller().load_from_folder(
    "user/sessions/universes/story1/autosave1", control_center, universe
)


# Callback
def handle_result(result, f):

    # Replace variables
    result = universe.translate_session_variable_references(result, control_center)

    # Define make-believe color classes
    color_classes = {
        "special": (155, 25, 25),
        "dim": (175, 175, 175),
        "evil": (25, 225, 25)
    }


    # Word wrap with an insanely high maximum width (one line in the end)
    lines = renderer.wordwrap_text(result, 0, 0, (0, 0, 0), sys.maxint, "left", None)

    # Render as html
    f.write(
        "<div>" +
        renderer.render_as_html(lines[0]["text"], 0, 0, colors_by_offset = lines[0]["colors-by-offset"], color_classes = color_classes) +
        "</div>\n\n"
    )


# Loop compiled dialogue files
for name in [ o for o in os.listdir("universes/story1/maps/dialogue") if o.endswith(".xml") ]:

    # Read file data
    f = open( os.path.join("universes", "story1", "maps", "dialogue", name), "r" )
    data = f.read()
    f.close()

    # Prepare output file
    f = open( os.path.join("dev", "proofreading", name.replace("xml", "html")), "w" )

    # Hard-code basic style rules
    f.write("""
<style type = 'text/css'>
    div {
        width: 50%;
        background-color: #ddd;
        border: 2px #222 solid;
        margin: 1.0em;
        padding: 1.0em;
    }
</style>\n\n""")


    # Regex to find all comments
    results = re.findall(
        "<comment>(.*?)</comment>",
        data,
        re.DOTALL
    )

    # Loop results
    for result in results:

        handle_result(result, f)

    # Regex to find all response phrases
    results = re.findall(
        "<phrase>(.*?)</phrase>",
        data,
        re.DOTALL
    )

    # Loop results
    for result in results:

        handle_result(result, f)


    # Done with file handle
    f.close()

_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Wed Sep 03, 2014 4:53 pm    Post subject: Reply with quote

I finished proofreading through all of the dialogue files. I made corrections to 30 lines in the game. Now I am working on proofreading the quest journal strings; I have 40 or 50 KB of text to scroll through there.

Next up: making sure all of the levers in the game have the correct default position. I can't believe I saved such an incredibly fun task for the end of development, I'm so lucky! :)
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Fri Sep 05, 2014 6:12 pm    Post subject: Reply with quote

Proofreading done. I fixed pathing issues with one NPC who liked to walk off the level and die for no reason, ruining that quest opportunity. Some other minor bugs found themselves out on the street, too.

I created and implemented custom levels / animations for the 2 new menu options, language and display settings (i.e. fullscreen). I estimate that I'm done with the main menu with that task crossed off.

All of the levers should point in a logical initial direction now. This will prevent player confusion, as the first lever pull will always move a platform in a new direction.

I have a little bit of remaining management work relating to my localization efforts, such as placing story-specific dialogue data in that level set's directory, but keeping the UI translations in a more global directory. This will allow me to include translation data in any DLC content (in the level folder for that level set).

After that I must run some real world tests on the cooperative levels to make sure they are possible, and are not too hard to beat.

These are the last items I have on my todo list for this game, I might finally finish it soon! :)
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
IMakeGames
Contributor

Joined: 13 Apr 2011
Posts: 499
Location: Austria
PostPosted: Sat Sep 06, 2014 1:07 am    Post subject: Reply with quote

Looking forward to playing the final game! :)
_________________
My current project: Hook'd
View user's profile Send private message Visit poster's website
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Wed Sep 24, 2014 5:39 pm    Post subject: Reply with quote

Progress is in 1st gear right now, slow. I think I'm on the last step of finishing translation efforts, though. This step involves finding all of the tiny hard-coded strings and moving them to an external file that I'll reference when I'm building translation data. Instead of doing something like create_popup("New Gamepad Enabled"), I will do create_popup( get_string("new-gamepad") ). I'm going to try to finish this soon, although I've been neglecting it for a few days already. Also, I am expecting to miss a string here and there, so I apologize in advance to those who will notice. :)
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
IMakeGames
Contributor

Joined: 13 Apr 2011
Posts: 499
Location: Austria
PostPosted: Thu Sep 25, 2014 1:40 am    Post subject: Reply with quote

mikedoty wrote:
Progress is in 1st gear right now, slow. I think I'm on the last step of finishing translation efforts, though. This step involves finding all of the tiny hard-coded strings and moving them to an external file that I'll reference when I'm building translation data. Instead of doing something like create_popup("New Gamepad Enabled"), I will do create_popup( get_string("new-gamepad") ). I'm going to try to finish this soon, although I've been neglecting it for a few days already. Also, I am expecting to miss a string here and there, so I apologize in advance to those who will notice. :)

That's something I completely missed to do with my previous games and then didn't bother to because it would have been so time consuming to implement it afterwards. For Nubs' Adventure, I did it from the start. It is tedious sometimes, but it's definitely less work. I commend your perseverance to add it. :)
_________________
My current project: Hook'd
View user's profile Send private message Visit poster's website
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Mon Oct 20, 2014 4:42 pm    Post subject: Reply with quote

Let's consider the following example of a dialog box's template file:

Code:
<list x = '@x' y = '@y'>
  <item action = 'view-quest-details' quest-name = '@quest-name'>
    <label>Active Quest:  @quest-title</label>
  </item>
</list>


In this example, we will send the following parameters to the template:

Code:
{
  "@x": 120,
  "@y": 60,
  "@quest-name": "find-shoes",
  "@quest-title": "Find a Pair of Shoes"
}


When I originally coded this stuff, I performed all of these replacements simultaneously. After replacing the parameters, I would take the xml string and pass it to a widget creation function. This worked perfectly, giving me a simple dialog with the text "Active Quest: Find a Pair of Shoes" that would execute the "view-quest-details" action when selected.

When I decided to add support for multiple languages, though, this way stopped working so nicely. See, I store all of the translations according to the parameterized version of the string. e.g. "Active Quest: @param" which gets stored as "Mision Presente: @param" or something like that. If I try to replace all of the template's parameters at once, then the string translation fails, as no entry exists for "Active Quest: Find a Pair of Shoes." I have to translate the raw parameterized data first, then replace @quest-title with the real text second.

Other variables must be translated before I create the widget, such as @x and @y. If I try to create a dialog with non-integer coordinates (@x instead of 120), then the widget creator will balk and crash. Not what I want...

I first planned to go through and separate the string replaces into 2 parts, one before and one after. That sounded like a lot of work, though, even after I took a little time to generate a page that listed the before variables and the after variables for every template in the game, both in separate lists. Then I realized I could just take that generator and, instead of producing a file to guide me, I would inject them at the top of all of the templates. This parameter translates before creating the widget, this one translates after. That saved me a lot of time, I'm guessing. (I still had to step through a handful of files to make it run off of a generic template object instead of a raw xml string, but it was supposedly fun.)

After all of that, I wanted to do a better job of automating my translation generation process. The website I use lets me upload files, but the file can't exceed some length, or whatever. I really don't know what the limit is, and it's not like I'm going to ask them. :) I started out doing this manually, just uploading all strings, analyzing the output, and then making another request for the untranslated remainder. This spanned several files, and it wasn't really exciiting, and it probably made the process more error prone.

Now I have a script that does this in a simple loop, combining the final output and rendering to a single file all on its own. I also added some error checking, whereby I try to make sure the translation actually did something. In some cases (ha ha, by cases I am meaning upper case, what a clever play on words), the translation would fail. If I tried to translate "The Collector" then it would for whatever reason ignore me. If I translated "The collector" though, it would agree to do my bidding. After I do the main translation, I run a script to find these lost souls, then it automatically casts a lower case spell on the majority of the string. I translate this second file, merge the contents together, and I have the final product. It's pretty easy, so I won't be so inclined to turn my chair away from the computer when it's time to do translation stuff.

I'm almost done with translation work for real this time. I need to keep checking through the program to find places where I've overlooked the translation support.

tl;dr - I automated translation process, and I fixed how translations work in the game so that everything translates successfully now, even accounting for placeholder variables such as quest titles.
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Thu Nov 06, 2014 6:00 pm    Post subject: Reply with quote

I don't make idle threats! :)

Achievements Menu


NPC


In other news, I tested all of the cooperative levels recently (just on my own using 2 instances of the game). They all work properly (no impossible gold pieces, etc.). I still want to test them "for real" so I can observe the difficulty (too many bad guys? too few?) and, just for fun too. :)

OKay. Time to hack in some more fun dialogue related to people who decide they're too good to customize their controls!
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Sun Nov 30, 2014 4:33 pm    Post subject: Reply with quote

I corrected a few different bugs related to the cooperative mode. One of the bugs caused a flood of "respawn" messages to travel from server to client(s) for a particular type of entity (respawn point, funnily enough). This unintended flood of data did not have an overtly obvious impact on the game (insomuch as it did not cause a crash and the game largely proceeded as expected), but it proved very much responsible to a noticeable amount of lag (in the 1.0-2.0s range) when playing locally. After using a slightly older codebase to confirm that the game did in fact work without that problem originally, I added some input/output logging to the sockets to diagnose the problem. When I saw dozens of this one type of message traveling outbound every second, I didn't really need to spend much time analyzing.

I believe I have replaced all hard-coded string values with id-associated lookup calls. Instead of "Gamepad Found" I have get_label("gamepad-found"). This ties in with the translation work, of course. I have also concluded all intended work on dialogue / narrative creation, including the excessive but strangely satisfying inclusion of dialogue tied specifically to whether or not the user customized their controls. :)

Now that I have corrected most of the known nagging issues in the cooperative code, I will begin looking to run some over-the-net tests to make sure everything holds up as expected. If that goes well, the game will be largely ready for release, though I will surely hem and haw for a little while to try to make sure I'm comfortable letting it go. :)
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Thu Jan 01, 2015 3:09 pm    Post subject: Reply with quote

When I wrote all of the dialogue for this game, I essentially cheated the "will this amount of text fit on the screen" problem. If I had a lot of text (by pure estimate), I separated it into separate "sayings" and then programmed the first one to lead automatically into the second. In my defense I also created a simple script that loaded each line into a copy of the game, created a dialogue screen for each line, and finally reported back on any dialogues that ran out of room (or dangerously approached that limit), but overall I used a pretty simplistic approach. It worked!

Now that I am supporting multiple languages for this game, though, I can't so immediately confirm that every text will fit on the screen. Sure, I could spend some time updating the "does everything fit" script I previously created to loop through all of the various languages, but I didn't really want to do that.

Instead, I added a "smart" checking mechanism within the game itself that will separate excessively long texts into multiple pages on the fly. Thus, if the German translation for an English text that originally fit easily onto one page ultimately requires an additional page after translation, the game will remove the excess text and present the player with 2 pages to read. I think I did a good job on this one.

I've made some minor cosmetic adjustments to the main menu, mostly adding top/bottom separator lines above the active selection to better highlight your cursor position. It looked a little strange at first because I've been using it for so long without that change, but I have adjusted. It's cool.

Recently, too, I smoothed over some of the rough edges in network play. I noticed that a client attempting to connect to an out-of-date remote session would hang in a black screen for quite some time before finally timing out. Regrettably I had forgotten to set the client socket to non-blocking mode during development, never noticing because a blocking connection didn't stand out when the target address existed. I also updated the server player's logic to reject new incoming connections after a game fills up. Players trying to join a full game will receive a simple rejection message from the server and then return to the "find game" screen to try again.

I added a feature that lets me specify different text strings for different languages when creating templates for the various menus in the game. Some of the text labels (all of them within the game's pause menu) took up nearly all of the available space, and some of the translations took up additional space, forcing the container to expand awkwardly (i.e. asymmetric pause menu). Unlike the dialogue scenario, I cannot readily use a second page for a pause menu item. Instead, I provide an alternate translation base for non-English languages. In these cases I provide a shorter, more direct string that will more assuredly fit within the bounds. (The translation service will most likely return a more coherent translation for these more direct strings, a bonus.)

If all goes according to plan, I will make a limited release of this game in January.
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Fri Jan 09, 2015 4:33 pm    Post subject: Reply with quote

I finished creating the readme file for my game. I made it as an html file, so it has nice formatting and a few little pictures to serve as illustrations. I also went through a lot of files (a lot of files...) and removed a lot of debug statements. print this, print that. If I'd been more intelligent and less lazy, I would have from the very beginning created a wrapper function (such as what I am using now) that takes a category and a variable list of parameters, e.g. myprint("scripting", "Loaded script successfully!"). But I DIDN'T.

I've fixed a number of other small issues, such as recreating my graphical assets after a switch to fullscreen (windows OS loses gl context) and making sure the "respawn in last town" actually spawns you somewhere (instead of crashing) if you die before reaching the first town. This should not happen, people! All sorts of scripts for all kinds of tasks. I'm on track to release soon. Probably. :)
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
Sirocco
Moderator

Joined: 19 Aug 2005
Posts: 9380
Location: Not Finland
PostPosted: Fri Jan 09, 2015 8:45 pm    Post subject: Reply with quote

A while back I #defined a variable for logging in my programs. I could classify log statements as being important or mundane, and at compile time determine which would show up. If the statement's importance level was below the threshold, it got ignored.
_________________
NoOP / Reyn Time -- The $ is screwing everyone these days. (0xDB)
View user's profile Send private message Visit poster's website
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Thu Jan 15, 2015 4:56 pm    Post subject: Reply with quote

I tried to talk myself out of adding this, but I don't think that would be fair to the player. Got to make sure no one accidentally loses autosave progress.

Are You Sure?


I decided to stagger the 2 widgets because they don't have the same height. The one on the left will take a little more space, and it wiil only get longer after translating to other languages. The one on the right would look strange to me if it had a lot of empty space (i.e. if I made the 2 sides equal height). It'll work.

The game can switch to different fonts on the fly now. I had to add in a "backup" font that supports cyrillic languages (I quickly noticed my default font didn't render anything in Russian).
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Sat Jan 17, 2015 6:03 pm    Post subject: Reply with quote

I finally ran the first test with 3 players this evening. It was fun, but I need to correct some things that didn't work right. I think I also need to create a separate set of cooperative levels that introduces the teamwork concepts more gently, with fewer bad guys (or none at all, perhaps). I also somehow introduced a crash error into one of the windows dll includes (I compile my C code into includes).

The game also lists credits on the main menu when you start the game!
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
0xDB
Developer

Joined: 26 Dec 2005
Posts: 1640
Location: Your consciousness.
PostPosted: Sun Jan 18, 2015 7:13 am    Post subject: Reply with quote

mikedoty wrote:
I finally ran the first test with 3 players this evening. It was fun, but I need to correct some things that didn't work right. I think I also need to create a separate set of cooperative levels that introduces the teamwork concepts more gently, with fewer bad guys (or none at all, perhaps). I also somehow introduced a crash error into one of the windows dll includes (I compile my C code into includes).

The game also lists credits on the main menu when you start the game!
Team mode sounds like fun but hard to imagine without any bad guys to oppose the players. Or maybe there could be some Team vs. Team mode where people play against each other competing for collecting more stuff than the other team or finishing some obstacle race faster where they have to cooperate within their team to get past the obstacles and/or could do things to sabotage the other team(s). Or maybe that could be saved for another game project.
_________________
0xDB
View user's profile Send private message Visit poster's website
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Sun Jan 18, 2015 9:29 am    Post subject: Reply with quote

Quote:
Or maybe there could be some Team vs. Team mode where people play against each other competing for collecting more stuff than the other team or finishing some obstacle race faster where they have to cooperate within their team to get past the obstacles and/or could do things to sabotage the other team(s).


I've had similar thoughts. Lode Runner doesn't lend itself to "blow each other up" gameplay, but time trial activities -- indirect competition, more or less -- would work better. This will just have a "work together to solve levels" cooperative mode, though, at least for now.
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Sun Jan 25, 2015 12:50 pm    Post subject: Reply with quote

I reduced the bytes requires to carry an enemy's AI state from about 500 bytes to about 50 bytes. Previously I sent the same xml node that I would write to a save game file, with all of the values set as attributes (x = '50' y = '100' etc.). Now I get a list of all of the attribute keys, sort it alphabetically, concatenate the raw values into a comma separated string, and place the result as a text value inside the node. I think I could have gotten away with the original approach (previous playtests didn't reveal any obvious problem), but I saw it as the most blatant case of "sending more than I really need to" and compressed it.

I'm hopeful that I've corrected a synchronization bug where the host player would randomly teleport between 2 locations on the client player machines. This bug only occurred during sessions with more than 2 players, as the host player was incorrectly substituting its own player id into the position messages the host received from client players before forwarding them to the other client players. Perhaps I should start videorecording my programming sessions, I wonder what I was thinking on that one.

Windows operates a little bit differently when creating sockets. I have to handle expected exceptions differently (these exceptions do not necessarily indicate a problem with the process of creating a socket).

I added a simple ping response time tracking to the server object before the last netplay testing session. I don't think I'll do anything with the information, as I added it more out of curiosity.

I revisited a select number of menu screens (such as the introduction to a puzzle room level) and added in alternate layouts for alternate languages. In English these screens will appear in a single column, but in some other languages I will present them in a staggered 2-column layout to make sure the increased text length (after translation) does not create screen overflow problems. I still want to add in a few additional language options to the game. I've been limiting this task to one language per day as I am using free translation services and I don't want to abuse them. (Not that they would let me, and not that I have learned that the hard way before... ;)

Before the next test session I will probably create some more cooperative levels, with fewer bad guys and simpler layouts like I mentioned last time. I will set it so that if you collect almost all of the gold in a short period of time (thus proving or strongly suggesting that your team is playing very well), I will execute a script that spawns 17 bad guys on the level to crush you and teach you to take your time. This is secretly the reason why I needed to add compression to the enemy AI messages, so that I can fit 17 of them into one send. :)

Unfortunately I do not expect to make my estimated January release at this point, but I see a release next month as perfectly viable. I need to clean up these last remaining netplay quirks, and I want to add a few more language options. I don't see anything else standing in the way.
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
mikedoty
Developer

Joined: 18 Mar 2006
Posts: 1788

PostPosted: Sat Jan 31, 2015 6:22 pm    Post subject: Reply with quote

Good news! The latest round of multiplayer testing went very well. I have corrected the remaining synchronization issue (see: paragraph 2 of previous post), and we played through the new level set called "Coop 101," consisting of 10 levels that teach players all of the core concepts of cooperative play. Also the game now properly handles a couple of windows-specific socket responses instead of erroneously aborting the connection attempt from the client side.

I am planning on adding 5 more language translations at this point. So far the game has about 10.

The game now gives players an input key dedicated to digging "forward." Until now the game offered one key for digging left and another key for digging right, but no generic "dig forward" key. This generic dig option will take a burden off of new players as they adjust to the gameplay. The less you have to think about the controls, the more easily you can understand what you need to do. I never really thought about the addition until very recently, however!

I expect to take care of the remaining issues without any trouble. A quiet first release of this game on the next weekend or 2 is possible, but I do expect to sit somewhat nervously on the final build for a little while, trying to cover all of my tracks.
_________________
The end of the game, yes, is pretty much getting the weapon and killing off the population.
mashup games . com | Finally! - A Lode Runner Story
View user's profile Send private message Visit poster's website AIM Address
Reply to topic GDR Forum Index -> Game Developer's Refuge -> Development Log - A Lode Runner Story Page Previous  1, 2, 3, 4, 5, 6, 7, 8, 9  Next

Use this link to get a Sign-On Bonus when you get started!

All trademarks and copyrights on this page are owned by their respective owners. All comments owned by their respective posters.
phpBB code © 2001, 2005 phpBB Group. Other message board code © Kevin Reems.