<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>a fool&#039;s deeds</title>
	<atom:link href="http://www.jestarjokin.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jestarjokin.net/blog</link>
	<description>the journal of a tinker</description>
	<lastBuildDate>Sun, 22 Jan 2012 04:35:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Web Publishing &#8211; Converting a Static Website to Dynamic, Part 1 &#8211; Setting up a Development Environment</title>
		<link>http://www.jestarjokin.net/blog/2012/01/web-publishing-converting-a-static-website-to-dynamic-part-1-setting-up-a-development-environment/</link>
		<comments>http://www.jestarjokin.net/blog/2012/01/web-publishing-converting-a-static-website-to-dynamic-part-1-setting-up-a-development-environment/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 04:34:33 +0000</pubDate>
		<dc:creator>jestar_jokin</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[dynamic publishing]]></category>

		<guid isPermaLink="false">http://www.jestarjokin.net/blog/?p=118</guid>
		<description><![CDATA[Currently, my website is nothing more than a static HTML page. Every time I update an application or want to add a new one, I have to manually edit the HTML source, re-arranging things, making sure it&#8217;s all got the right formatting and so on. This is inefficient, time consuming, and prone to error. As [...]]]></description>
			<content:encoded><![CDATA[<p>Currently, my website is nothing more than a static HTML page. Every time I update an application or want to add a new one, I have to manually edit the HTML source, re-arranging things, making sure it&#8217;s all got the right formatting and so on. This is inefficient, time consuming, and prone to error. As part of publishing new code, I also make a blog post with the release notes. I&#8217;d like to streamline my publishing process, so I only fill out the information I need once, without having to write any HTML, and it automatically updates the main web site as well as the blog.</p>
<p>The first task in implementing this new publishing process is to convert the existing static page into a dynamic page, e.g. one that reads data from an external source, in this case a database. I will attempt to chronicle my adventures. I&#8217;m learning things as I go, and I may find better ways of doing things, so later posts may reverse decisions made in earlier posts.</p>
<p>In this post, I will detail setting up a development environment.</p>
<h2><span id="more-118"></span>The Requirements</h2>
<p>The requirements for the new dynamic web page are as follows:</p>
<ul>
<li>Displays a list of all applications</li>
<li>Displays various information on each application &#8211; name, description, current version, date released, license, links to artifacts (source/binary packages), etc</li>
<li>Must maintain a history of old versions of each application</li>
<li>Can display &#8220;other&#8221; artifacts for each application</li>
<li>The same release notes should be used for both the main page and the blog news posts.</li>
</ul>
<h2>The Technologies</h2>
<p>I would like to write my new front page with a basic page template, using inline tags to apply logic. My first instinct was to write something in Python, using a templating engine like <a href="http://jinja.pocoo.org/">Jinja2</a> (or even just Python&#8217;s built-in <a href="http://docs.python.org/library/string.html#template-strings">string.Template</a> capabilities), but my web host does not have particularly good support for Python or adding extra site packages. The killer blow was the lack of built-in support for MySQL, my host&#8217;s default database system.</p>
<p>So, I decided to go with the usual PHP &amp; MySQL combo, since this seems to be fully supported by my web host. I&#8217;m a newbie with both technologies, so I&#8217;m sure I&#8217;ll stumble over myself a few times.</p>
<p>In order to store richly formatted text in the database, for eventual presentation on an HTML page, I have decided to go with the <a href="http://daringfireball.net/projects/markdown/">Markdown</a> markup language, reasons being:</p>
<ul>
<li>Concise syntax, so easier to read and write</li>
<li>Can include normal HTML if required</li>
<li>Processors available in many programming langauges (PHP and Python, specifically)</li>
</ul>
<h2>The Development Environment</h2>
<p>Deploying my &#8220;work in progress&#8221; PHP code to my live server (www.jestarjokin.net) is a terrible idea, especially when I&#8217;m bumbling around trying to learn PHP. I need a development environment. I primarily use Windows as my operating system, and I don&#8217;t want to clutter things up installing PHP and MySQL just for a single project. A virtual machine sounds like the best approach &#8211; you can install whatever you want, set it up as a web server, muck around with configurations etc to your hearts content, and when you&#8217;re not using it you just turn it off and continue with your everyday computering.</p>
<p>There&#8217;s a few Virtual Machine host applications out there, I&#8217;m going with <a href="https://www.virtualbox.org/">VirtualBox </a>because it&#8217;s free (for now).</p>
<p>I stumbled across a full Ubuntu virtual machine image, <a href="http://bitnami.org/stack/lampstack">Bitnami LAMPStack</a>. This contains an installation of Ubuntu Linux, with Apache, MySQL, and PHP already installed. Too easy! (They also provide an OpenSUSE image, if that&#8217;s more your fancy.)</p>
<p>&#8230; Unfortunately, it doesn&#8217;t quite work how I expected out of the box, so there&#8217;s some tweaking required. I want to treat the VM the same as a remote host, so we need to open up some settings for remote connections.</p>
<h3>Import Virtual Machine into VirtualBox</h3>
<p>While the LAMPStack image contains an OVF file, which is a virtual machine configuration file that should be readable by VirtualBox, I received odd error messages. This isn&#8217;t a big deal, you just need to manually create your own virtual machine and import the LAMPStack hard drive image.</p>
<p>First, download and install VirtualBox. Then download and extract the Bitnami LAMPStack virtual machine images somewhere. I believe the hard drive images are configured to expand to 17 GB as required, but from a fresh download they should be 1 GB big (or less).</p>
<ul>
<li>Open VirtualBox</li>
<li>Click &#8220;New&#8221;</li>
<li>Name = &#8220;LAMPStack (BitNami)&#8221;</li>
<li>OS = Linux / Ubuntu</li>
<li>Next, choose how much memory to give the VM. Allocate at least 512 MB, I&#8217;m going with 1024 MB.</li>
<li>Next, &#8220;use existing hard drive&#8221;, and point to the &#8220;VMDK&#8221; file in the Bitnami VM images. In my case, this was &#8220;bitnami-lampstack-5.3.8-2-ubuntu-10.10.vmdk&#8221;.</li>
<li>Once done importing, select the new VM and click on &#8220;Settings&#8221;</li>
<li>System-&gt;Processor, tick &#8220;Enable PAE/NX&#8221;</li>
<li>Storage, click the &#8220;Add Hard Disk&#8221; icon on the IDE Controller, choose the existing VMDK image (same as before)</li>
<li>Storage, delete the SATA Controller entry for that VMDK image</li>
<li>(Optional) Network, choose &#8220;Bridged Adapter&#8221;. This depends on your network configuration and how you want to be able to access the virtual machine. I found going with NAT assigned an IP address on the wrong network (e.g. 10.0.0.1 instead of 192.168.1.1).</li>
</ul>
<h3>Start Virtual Machine &amp; Login</h3>
<p>Start up the virtual machine. It will list some information, such as the VM&#8217;s IP address. For my examples, I will be using IP address 192.168.1.2 to refer to the VM.</p>
<p>You will also be prompted to log in. The default login is:</p>
<ul>
<li>
<pre>bitnami / bitnami</pre>
</li>
</ul>
<p>You&#8217;ll be prompted to change the password for the bitnami account.</p>
<h3>Enable SSH/SFTP Access for File Transfers</h3>
<p>We need a way to copy files onto the VM. The easiest option seems to be SFTP. You&#8217;ll need an SFTP client, I use <a href="http://winscp.net" target="_blank">WinSCP</a> but <a href="http://filezilla-project.org/" target="_blank">Filezilla</a> also works.</p>
<p>We need to change a configuration file on the server to enable SSH connections. Luckily, BitNami have already provided a configuration file, we just need to replace the existing file. In the VM, run these commands (without the &#8220;$&#8221;):</p>
<blockquote>
<pre>$ sudo mv /etc/init/ssh.conf.back /etc/init/ssh.conf
$ sudo start ssh</pre>
</blockquote>
<p>Using WinSCP, you can connect to your VM from its IP address (e.g. 192.168.1.2), using the &#8220;bitnami&#8221; user login.</p>
<p>Web pages are served from this directory, which is primarily where we want to put files:</p>
<blockquote>
<pre>/opt/bitnami/apache2/htdocs</pre>
</blockquote>
<h3>Enable MySQL Remote Access</h3>
<p>I want to manipulate the database from my real computer, not the VM, so we need to enable remote access to MySQL. There&#8217;s a bit of jiggery-pokery required to enable remote access to the MySQL database.</p>
<p>Note that if you add any MySQL users, you should grant access both from the &#8220;any host&#8221; wildcard (&#8220;%&#8221;), and from the various local host designations (&#8220;localhost&#8221;, &#8220;127.0.0.1&#8243;), otherwise you may have issues logging in to MySQL on the VM (which will affect your application).</p>
<h4>Root access</h4>
<p>By default there is only one MySQL user set up, with this login:</p>
<ul>
<li>
<pre>root / bitnami</pre>
</li>
</ul>
<h4>Grant root access from any host</h4>
<blockquote>
<pre>$ /opt/bitnami/mysql/bin/mysql -u root -p -e "grant all privileges on *.* to 'root'@'%' identified by 'your_root_password'";</pre>
</blockquote>
<p>The &#8220;&#8216;root&#8217;@'%&#8217;&#8221; part says that the user &#8220;root&#8221;, from any host, should be able to to anything on the server.</p>
<p>NOTE: this is probably very bad practice. You should only grant as much access as you want to non-root users. However, this is convenient for our development environment, as it allows us to fully manipulate the database from our main computer. Don&#8217;t do this sort of thing on your real server!</p>
<h4>Disable bind address</h4>
<p>Open up &#8220;/installdir/msyql/my.cnf&#8221; in vi. Comment out this line by adding a &#8220;#&#8221; to the start:</p>
<blockquote>
<pre>bind-address = 127.0.0.1</pre>
</blockquote>
<p>(Some vi hints: use &#8220;:w&#8221; to save and &#8220;:q&#8221; to quit. You may need to press the Insert key before you can enter the hash symbol.)</p>
<h4>Poke a hole in the firewall</h4>
<p>Run this command to open up port 3306 (the default MySQL port):</p>
<blockquote>
<pre>$ sudo ufw allow 3306</pre>
</blockquote>
<h3>Enable phpMyAdmin Remote Access</h3>
<p>phpMyAdmin is a useful web interface to administer MySQL. By default, it is restricted to &#8220;localhost&#8221; access, so we need to change this.</p>
<p>Using vi, edit the configuration file at &#8220;/opt/bitnami/apps/phpmyadmin/conf/phpmyadmin.conf&#8221;. Change the line highlighted in red (by default, it will say &#8220;Allow from 127.0.0.1&#8243;).</p>
<blockquote>
<pre>  Alias /phpmyadmin "/opt/bitnami/apps/phpmyadmin/htdocs"

  &lt;Directory "/opt/bitnami/apps/phpmyadmin/htdocs"&gt;
  AuthType Basic
  AuthName phpMyAdmin
  AuthUserFile "/opt/bitnami/apache2/users"
  Require valid-user
  Order allow,deny</pre>
<pre><span style="color: #ff0000;">  Allow from all</span></pre>
<pre>  Satisfy all
  ErrorDocument 403 "For security reasons, this URL is only accesible
  using localhost (127.0.0.1) as the hostname"
  &lt;/Directory&gt;</pre>
</blockquote>
<p>You can then access the phpMyAdmin page from this URL (changing the IP address to your VM&#8217;s):</p>
<blockquote><p>http://192.168.1.108/phpmyadmin/</p></blockquote>
<p>Log in using the MySQL &#8220;root&#8221; username &amp; password.</p>
<h3>Done</h3>
<p>Finally, your development environment is ready to use! It&#8217;s a good idea to restart the VM after making the above changes, but afterwards you can just let it sleep/hibernate when you&#8217;re not using it, and it&#8217;ll be ready to rock next time.</p>
<h2>Next Time</h2>
<p>In the next part, I hope to go through a proposed database structure, followed by a naive implementation of the page in PHP.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jestarjokin.net/blog/2012/01/web-publishing-converting-a-static-website-to-dynamic-part-1-setting-up-a-development-environment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scummbler v2 r15</title>
		<link>http://www.jestarjokin.net/blog/2011/07/scummbler-v2-r15/</link>
		<comments>http://www.jestarjokin.net/blog/2011/07/scummbler-v2-r15/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 13:07:10 +0000</pubDate>
		<dc:creator>jestar_jokin</dc:creator>
				<category><![CDATA[SCUMM]]></category>

		<guid isPermaLink="false">http://www.jestarjokin.net/blog/?p=106</guid>
		<description><![CDATA[New version of Scummbler (v2 r15). Changes: Fix &#8220;drawObject&#8221; in V3-4 (was missing 3rd argument and outputting the wrong opcode). Fix &#8220;getState&#8221; instruction&#8217;s syntax (was originally defined as &#8220;if (getState(Local[0] == 0))&#8221;, should have been &#8220;if (getState(Local[0]) == 0)&#8221;). &#8220;debug?&#8221; instruction renamed to &#8220;debug&#8221;. &#8220;PutCodeInString&#8221; &#8211; add support for a missing 2nd argument (as output [...]]]></description>
			<content:encoded><![CDATA[<p>New version of Scummbler (v2 r15). Changes:</p>
<ul>
<li>Fix &#8220;drawObject&#8221; in V3-4 (was missing 3rd argument and outputting the wrong opcode).</li>
<li>Fix &#8220;getState&#8221; instruction&#8217;s syntax (was originally defined as &#8220;if (getState(Local[0] == 0))&#8221;, should have been &#8220;if (getState(Local[0]) == 0)&#8221;).</li>
<li>&#8220;debug?&#8221; instruction renamed to &#8220;debug&#8221;.</li>
<li>&#8220;PutCodeInString&#8221; &#8211; add support for a missing 2nd argument (as output by descumm).</li>
<li>Restructure code path structure, separate out some tests.</li>
<li>Added some tests based on my attempt to parse MI1 global scripts.</li>
<li>Change license to MIT license.</li>
<li>Update build scripts.</li>
<li>Update to the manual &#8211; change info for &#8220;getState&#8221;, add support e-mail to contact list.</li>
</ul>
<p><strong>Binary</strong>:<br />
<a href="http://www.jestarjokin.net/sw/scummbler_bin_20110712.zip">http://www.jestarjokin.net/sw/scummbler_bin_20110712.zip<br />
</a> <strong>Source</strong>:<br />
<a href="../../sw/scummbler_src_20100803.zip" target="_blank"></a><a href="http://www.jestarjokin.net/sw/scummbler_src_20110712.zip">http://www.jestarjokin.net/sw/scummbler_src_20110712.zip</a></p>
<p>&nbsp;</p>
<p>I&#8217;ve discovered there are some bugs in descumm&#8217;s output (introduced by yours truly). I discovered these after trying to parse all the global scripts from Monkey Island 1 VGA floppy.</p>
<h3>Script 82 and 83 &#8211; missing 2nd argument for PutCodeInString</h3>
<pre>[0000] (27) PutCodeInString(24, );</pre>
<p>When the string is empty, descumm outputs nothing for the second argument. It should output this:</p>
<pre>[0000] (27) PutCodeInString(24, "");</pre>
<p>Scummbler now supports either scenario.</p>
<p>&nbsp;</p>
<h3>Script 135 &#8211; unknown string function</h3>
<p>Global script 135 contains this line:</p>
<pre>[049C] (FA) VerbOps(Var[100],[SetXY(0,Var[228]),Text("How to deal with  frustration, disappointment, " + unknown8(8224) + " and irritating  cynicism."),On(),Key(Var[229]);]);</pre>
<p>The &#8220;unknown8&#8243; instruction is incorrect, and can&#8217;t be parsed by Scummbler. You must manually change the text like so:</p>
<pre>[049C] (FA) VerbOps(Var[100],[SetXY(0,Var[228]),Text("How to deal with  frustration, disappointment,\xFE\x08  and irritating  cynicism."),On(),Key(Var[229]);]);</pre>
<p>Also, there shouldn&#8217;t be a semi-colon after the &#8220;Key()&#8221; instruction, but Scummbler handles this anyway.</p>
<p>&nbsp;</p>
<h3>Script 152 &#8211; not joining string functions</h3>
<pre>[00BF] (14) print(255,[Color(Local[8]),Center(),Text(getString(VAR_HEAPSPACE)keepText())]);</pre>
<p>This line should read:</p>
<pre>[00BF] (14) print(255,[Color(Local[8]),Center(),Text(getString(VAR_HEAPSPACE) + keepText())]);</pre>
<p>Again, you&#8217;ll have to manually alter the script.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jestarjokin.net/blog/2011/07/scummbler-v2-r15/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MusicSort &#8211; a small script for renaming and sorting music folders</title>
		<link>http://www.jestarjokin.net/blog/2011/06/musicsort-a-small-script-for-renaming-and-sorting-music-folders/</link>
		<comments>http://www.jestarjokin.net/blog/2011/06/musicsort-a-small-script-for-renaming-and-sorting-music-folders/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 11:43:09 +0000</pubDate>
		<dc:creator>jestar_jokin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jestarjokin.net/blog/?p=104</guid>
		<description><![CDATA[I have a reasonable collection of music in a variety of compressed formats. I like to arrange my music in a tree structure on the filesystem, sorted by genre. I also like to name the album directories in a particular format. I had acquired a backlog of albums to rename &#38; sort, so, one day [...]]]></description>
			<content:encoded><![CDATA[<p>I have a reasonable collection of music in a variety of compressed formats. I like to arrange my music in a tree structure on the filesystem, sorted by genre. I also like to name the album directories in a particular format. I had acquired a backlog of albums to rename &amp; sort, so, one day when I was procrastinating, I wrote a music sorting script.</p>
<p><strong>Win32 Binaries</strong></p>
<p><a href="http://www.jestarjokin.net/sw/musicsort_bin_20110619.zip">http://www.jestarjokin.net/sw/musicsort_bin_20110619.zip</a></p>
<p><strong>Python Source</strong></p>
<p><a href="http://www.jestarjokin.net/sw/musicsort_src_20110619.zip">http://www.jestarjokin.net/sw/musicsort_src_20110619.zip</a></p>
<p>This script (and the binaries) is license under the MIT License.</p>
<p>An explanation follows.</p>
<p><span id="more-104"></span>My current tree structure looks something like this:</p>
<ul>
<li>Music
<ul>
<li>Albums
<ul>
<li>Genre1</li>
<li>Genre2</li>
<li>Genre3</li>
</ul>
</li>
<li>Misc
<ul>
<li>Genre1</li>
<li>Genre2</li>
<li>Genre3</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>My naming conventions for the album directories is like this:<br />
Artist &#8211; Year &#8211; Album [Aux] (Music Type &amp; Bitrate)</p>
<p>e.g.</p>
<p style="padding-left: 30px;">Slum Village &#8211; 2010 &#8211; Villa Manifesto (MP3 192)</p>
<p>The &#8220;Aux&#8221; label is optional, and can store information like whether the album comes from vinyl, or the label/pressing info, or the CD number in a multi-disc set.</p>
<p>While most tagging software can handle the tag-based information okay, it doesn&#8217;t satisfy my requirements for the Music Type &amp; Bitrate. My logic is like this:<br />
Music Type will roughly be the file extension, &#8220;MP3&#8243; or &#8220;OGG&#8221; or &#8220;MP4&#8243; or *shudder* &#8220;WMA&#8221;. (MP4 gets a little complicated, because there are a few different file formats/extensions, for what is basically the same compression technology, e.g. AAC/MP4/M4A)</p>
<p>Bitrate goes like this:</p>
<ul>
<li>If all files have the same bitrate, assume it&#8217;s a single constant bitrate (CBR).
<ul>
<li>e.g. (MP3 192)</li>
</ul>
</li>
<li> If there is a mixture of different bitrates, and they&#8217;re all divisble by 8000, assume it&#8217;s a mixture of CBR. Bitrate value should note that it&#8217;s mixed and provide the minimum and maxmium bitrates.
<ul>
<li>e.g. (MP3 mixed, 128-320)</li>
</ul>
</li>
<li>If all files have a mixture of different bitrates, and no bitraters are perfectly divisible by 8000, assume a variable bitrate (VBR). Also output the average bitrate across all files.</li>
</ul>
<p>The script has been programmed so that if any value is missing (i.e. artist, year, or album), it will prompt the user to enter a new value for the missing value.</p>
<p>If there are multiple encountered values for any value (such as year), it will ask the user to choose one of the found values, or to enter their own value. The exception is the &#8220;artist&#8221; field &#8211; multiple values will instead default to a value of &#8220;VA&#8221; (for Various Artists).</p>
<p>Once the script has generated an output folder name, the user is prompted to confirm if it&#8217;s okay, or to enter &#8220;override&#8221; values for any of the information fields.</p>
<p>Because &#8220;auxilliary&#8221; information is not necessarily available from the tags, this info can be specified at runtime, seperately from other &#8220;override&#8221; values.</p>
<p>If the user enters any override values, the script will again prompt the user to confirm the output folder name. This will loop as long as the user keeps entering override values or auxilliary information. If the user does not enter &#8220;Y&#8221; or &#8220;Yes&#8221; in the confirmation prompt, the script will not attempt to move the folder/music files.</p>
<p>The script can be run across a single input folder, or across all sub-folders in the input folder. If the latter, you can skip processing folders by declining the prompt to confirm the output folder name.</p>
<p>If looking in a folder with no files and only one sub-folder, the script will automatically try to process that sub-folder.</p>
<p>Once the user confirms the output folder name, the script will prompt the user to choose a destination directory. The list of destinations is determined by all sub-folders in a previously defined destination root directory (specified in an external configuration file). For my purposes, I have a root &#8220;Album&#8221; directory, with a list of sub-folders named by genre. I also ignore any directories beginning with an underscore character, e.g. &#8220;_to_sort&#8221;. This lets me have an &#8220;incoming&#8221; directory of albums that require sorting.</p>
<p>The destination directory, and any other information that should not change at runtime, is specified in a seperate configuration file.</p>
<p>This was my first attempt at working with Unicode strings properly. I&#8217;m using a Windows (NTFS) system, which stores filenames as Unicode, and the album data could contain Unicode strings. The script will convert any input from the command line, such as initial arguments or any override values, to Unicode, based on the current system encoding.</p>
<p>Future work:</p>
<ul>
<li>Support analysis of files without any tags, trying to guess values based on the filename.</li>
<li>Support for lossless compression (should be pretty simple really, just need to add the right calls to Mutagen).</li>
<li>Make all MP4 files use the same music type (rather than AAC/MP4/M4A).</li>
<li>Correct &#8220;bitrate&#8221; naming of albums that use a mixture of VBR and CBR.</li>
<li>Support for cancelling the script &#8211; currently the only way to cancel is to press CTRL-C, which quits the whole thing.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.jestarjokin.net/blog/2011/06/musicsort-a-small-script-for-renaming-and-sorting-music-folders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New mailing list for support issues, feature requests, and general chat</title>
		<link>http://www.jestarjokin.net/blog/2011/06/new-mailing-list-for-support-issues-feature-requests-and-general-chat/</link>
		<comments>http://www.jestarjokin.net/blog/2011/06/new-mailing-list-for-support-issues-feature-requests-and-general-chat/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 07:35:07 +0000</pubDate>
		<dc:creator>jestar_jokin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jestarjokin.net/blog/?p=101</guid>
		<description><![CDATA[I&#8217;ve decided to set up a dedicated mailing list, which can be used for any support issues for my tools, or feature requests, or just general game hacking discussions. Mostly because I need to show evidence of an &#8220;active community&#8221; in order to qualify for a free license for PyCharm, and it doesn&#8217;t look like [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve decided to set up a dedicated mailing list, which can be used for any support issues for my tools, or feature requests, or just general game hacking discussions. Mostly because I need to show evidence of an &#8220;active community&#8221; in order to qualify for a free license for <a href="http://www.jetbrains.com/pycharm/">PyCharm</a>, and it doesn&#8217;t look like private e-mails will suffice. Feel free to use the mailing list to contact me; I reserve the right to forward to the mailing list any mail e-mailed directly to me, if I feel it is worth sharing with others.</p>
<p>The mailing list address:</p>
<p><a href="mailto:support@lists.jestarjokin.net">support@lists.jestarjokin.net</a></p>
<p>You can set up subscriptions and other info here:</p>
<p><a href="http://lists.jestarjokin.net/listinfo.cgi/support-jestarjokin.net" target="_blank">http://lists.jestarjokin.net/listinfo.cgi/support-jestarjokin.net</a></p>
<p>The archives will be located here:</p>
<p><a href="http://lists.jestarjokin.net/private.cgi/support-jestarjokin.net" target="_blank">http://lists.jestarjokin.net/private.cgi/support-jestarjokin.net</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jestarjokin.net/blog/2011/06/new-mailing-list-for-support-issues-feature-requests-and-general-chat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Robin Hood &#8211; The Rules, Roughly</title>
		<link>http://www.jestarjokin.net/blog/2011/05/robin-hood-the-rules-roughly/</link>
		<comments>http://www.jestarjokin.net/blog/2011/05/robin-hood-the-rules-roughly/#comments</comments>
		<pubDate>Tue, 24 May 2011 10:53:57 +0000</pubDate>
		<dc:creator>jestar_jokin</dc:creator>
				<category><![CDATA[Old game hacking]]></category>

		<guid isPermaLink="false">http://www.jestarjokin.net/blog/?p=62</guid>
		<description><![CDATA[After nearly two years since I poked around in Robin Hood&#8217;s guts (I&#8217;m referring to the game, of course), I got the urge to investigate further, and now have a rough idea of how the data in the rules files is stored. I will be discussing the format based on the &#8220;ERULES.PRG&#8221; file, which contains [...]]]></description>
			<content:encoded><![CDATA[<p>After nearly two years since <a title="Robin Hood – Reversing a Microcosm" href="http://www.jestarjokin.net/blog/2009/07/robin-hood/">I poked around in Robin Hood&#8217;s guts</a> (I&#8217;m referring to the game, of course), I got the urge to investigate further, and now have a rough idea of how the data in the rules files is stored.</p>
<p>I will be discussing the format based on the &#8220;ERULES.PRG&#8221; file, which contains English text. The other rules files should be in exactly the same format, only the string values should be different. All bytes are in little-endian format (unless otherwise stated).</p>
<p>I&#8217;ll state up here at the start of this post, if anyone wants to join forces in exploring the intricacies of the game, feel free to send me an e-mail: <a href="mailto:jestarjokin@jestarjokin.net">jestarjokin@jestarjokin.net</a></p>
<p>View after the break, IF YOU DAAAAARE&#8230;!</p>
<p><span id="more-62"></span></p>
<h1>ERULES.PRG</h1>
<p>The rules file is split into 10 sections (based on the number of functions called to read in the data). The file begins with a small 2-byte header (containing a value of 0&#215;0000); the 10 sections follow.</p>
<table border="1">
<tbody>
<tr>
<td><strong>Section</strong></td>
<td><strong>Start</strong></td>
<td><strong>End</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>Header</td>
<td>0&#215;00000000</td>
<td>0&#215;00000002</td>
<td>0&#215;00000002</td>
</tr>
<tr>
<td>Section 1</td>
<td>0&#215;00000002</td>
<td>0&#215;00000666</td>
<td>0&#215;00000664</td>
</tr>
<tr>
<td>Section 2</td>
<td>0&#215;00000666</td>
<td>0x000012E6</td>
<td>0x00000C80</td>
</tr>
<tr>
<td>Section 3</td>
<td>0x000012E6</td>
<td>0x0000628E</td>
<td>0x00004FA8</td>
</tr>
<tr>
<td>Section 4</td>
<td>0x0000628E</td>
<td>0&#215;00006502</td>
<td>0&#215;00000274</td>
</tr>
<tr>
<td>Section 5</td>
<td>0&#215;00006502</td>
<td>0&#215;00007260</td>
<td>0x00000D5E</td>
</tr>
<tr>
<td>Section 6</td>
<td>0&#215;00007260</td>
<td>0x000110E6</td>
<td>0x00009E86</td>
</tr>
<tr>
<td>Section 7</td>
<td>0x000110E6</td>
<td>0&#215;00011122</td>
<td>0x0000003C</td>
</tr>
<tr>
<td>Section 8</td>
<td>0&#215;00011122</td>
<td>0x000113BE</td>
<td>0x0000029C</td>
</tr>
<tr>
<td>Section 9</td>
<td>0x000113BE</td>
<td>0x000114E8</td>
<td>0x0000012A</td>
</tr>
<tr>
<td>Section 10</td>
<td>0x000114E8</td>
<td>0&#215;00011562</td>
<td>0x0000007A</td>
</tr>
</tbody>
</table>
<h2>Section 1</h2>
<p>Section 1 is pretty simple. The number of entries is given as 2 bytes, that number of bytes then follows.</p>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 1</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>num_entries</td>
<td>2</td>
</tr>
<tr>
<td>entry+</td>
<td>1 * num_entries</td>
</tr>
</tbody>
</table>
<h2>Section 2</h2>
<p>Section 2 starts with 2 bytes for the number of entries.</p>
<p>Each entry is made up of a number of components, starting with s2WordA, which is 2 bytes. If this value is not 0xFFFF, it is multiplied by 8 and added with 4 when read. This occurs again for s2WordB, another 2 bytes. s2WordC is read as 2 bytes, s2WordD is another 2 bytes.</p>
<p>After this, there are 10 individual bytes. Then follows two arrays, each 32 bytes long.</p>
<p>In total, one entry will be 82 bytes long. Robin Hood contains 39 entries.</p>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 2</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>num_entries</td>
<td>2</td>
</tr>
<tr>
<td>entries</td>
<td>82 * num_entries</td>
</tr>
</tbody>
</table>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 2 Entry</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>s2WordA</td>
<td>2</td>
</tr>
<tr>
<td>s2WordB</td>
<td>2</td>
</tr>
<tr>
<td>s2WordC</td>
<td>2</td>
</tr>
<tr>
<td>s2WordD</td>
<td>2</td>
</tr>
<tr>
<td>s2ByteA</td>
<td>1</td>
</tr>
<tr>
<td>s2ByteB</td>
<td>1</td>
</tr>
<tr>
<td>s2ByteC</td>
<td>1</td>
</tr>
<tr>
<td>s2ByteD</td>
<td>1</td>
</tr>
<tr>
<td>s2ByteE</td>
<td>1</td>
</tr>
<tr>
<td>s2ByteF</td>
<td>1</td>
</tr>
<tr>
<td>s2ByteG</td>
<td>1</td>
</tr>
<tr>
<td>s2ByteH</td>
<td>1</td>
</tr>
<tr>
<td>s2ByteI</td>
<td>1</td>
</tr>
<tr>
<td>s2ByteJ</td>
<td>1</td>
</tr>
<tr>
<td>s2ArrayA</td>
<td>32</td>
</tr>
<tr>
<td>s2ArrayB</td>
<td>32</td>
</tr>
</tbody>
</table>
<h2>Section 3</h2>
<p>Section 3 contains string data! It begins with the number of entries, and the total size of the string data (in sub-section 2). Following are two sub-sections.</p>
<p>The first sub-section contains 2-byte values; these values represent the start of each string, given as an offset from the beginning of the string data chunk (in sub-section 2). For example, if the first string in sub-section 2 is &#8220;Wh\xCEps!\x00&#8243;, this is 7 characters long (the &#8220;\x&#8221; values are my way of denoting raw ASCII values). Therefore, the first entry in sub-section 1 is 0&#215;00, and the second entry is 0&#215;07.</p>
<p>The second sub-section contains all of the string values. The string values are all null-terminated. They are also compressed in an unusual manner; characters with an ASCII value over 127 (possibly higher) are treated specially, and converted based on a lookup table hardcoded into the executable. For example, the value 0xC8 is translate to &#8220;oo&#8221; (double O). This compresses the string &#8220;Whoops!&#8221; down to &#8220;Wh.ps!&#8221;, with &#8220;.&#8221; representing the value of 0xC8. Other common letter combinations are compressed, such as &#8220;me&#8221;, &#8220;or&#8221;, &#8220;I am&#8221;, etc.</p>
<p>Strings are also interesting in that they can contain multiple variations of one line of dialogue. These are represented by nesting one or more entries at the start of the string, enclosed by square brackets. e.g.</p>
<p>&#8220;[[Hello my sweet.]Hello darling.]Good morrow, my love.&#8221;</p>
<p>It seems the game will randomly (or perhaps linearly) choose which variation to display.</p>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 3</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>num_entries</td>
<td>2</td>
</tr>
<tr>
<td>string_data_size</td>
<td>2</td>
</tr>
<tr>
<td>sub-section 1</td>
<td>2 * num_entries</td>
</tr>
<tr>
<td>sub-section 2</td>
<td>string_data_size</td>
</tr>
</tbody>
</table>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 3 Sub-Section 1</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>string_offset</td>
<td>2 * num_entries</td>
</tr>
</tbody>
</table>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 3 Sub-Section 2</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>string_data</td>
<td>variable size * num_entries (totalling string_data_size)</td>
</tr>
</tbody>
</table>
<h2>Section 4</h2>
<p>Section 4 starts with 2 bytes for the number of entries, followed by that many entries. Each entry is a word (16-bit).</p>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 4</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>num_entries</td>
<td>2</td>
</tr>
<tr>
<td>entry+</td>
<td>2 * num_entries</td>
</tr>
</tbody>
</table>
<h2>Section 5</h2>
<p>Section 5 starts with 2 bytes for the number of entries, followed by that many entries. Each entry is a word (16-bit). This seems to be the same format as Section 4.</p>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 5</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>num_entries</td>
<td>2</td>
</tr>
<tr>
<td>entry+</td>
<td>2 * num_entries</td>
</tr>
</tbody>
</table>
<h2>Section 6</h2>
<p>Section 6 starts with 2 bytes for the number of entries, followed by that many entries. Each entry is a word (16-bit). It is then followed by another 2 bytes for the second lot of entries. Each of these second entries is only one byte long.</p>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 6</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>num_entries_one</td>
<td>2</td>
</tr>
<tr>
<td>entry_one+</td>
<td>2 * num_entries_one</td>
</tr>
<tr>
<td>num_entries_two</td>
<td>2</td>
</tr>
<tr>
<td>entry_two+</td>
<td>1 * num_entries_two</td>
</tr>
</tbody>
</table>
<h2>Section 6</h2>
<p>Section 6 starts with 2 bytes for the number of entries, followed by that many entries. Each entry is a word (16-bit). It is then followed by another 2 bytes for the second lot of entries. Each of these second entries is only one byte long.</p>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 6</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>num_entries_one</td>
<td>2</td>
</tr>
<tr>
<td>entry_one+</td>
<td>2 * num_entries_one</td>
</tr>
<tr>
<td>num_entries_two</td>
<td>2</td>
</tr>
<tr>
<td>entry_two+</td>
<td>1 * num_entries_two</td>
</tr>
</tbody>
</table>
<h2>Section 7</h2>
<p>Section 7 is hardcoded as being 60 (0x3C) bytes long. Each value in this section seems to be a single byte.</p>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 7</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>s7ByteA</td>
<td>1 * 60</td>
</tr>
</tbody>
</table>
<h2>Section 8</h2>
<p>Section 8 starts with 1 byte for the number of entries. The number of entries can be 0. There are two sub-sections here.</p>
<p>Section 8 Sub-Section 1 contains an array of bytes. Each byte represents the size of the data chunk in Sub-Section 2. This array is summed to get the total size of the data.</p>
<p>Section 8 Sub-Section 2 contains the variable-sized data. The size of this section is determined by the summed value generated when reading Sub-Section 1.</p>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 8</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>num_entries</td>
<td>1</td>
</tr>
</tbody>
</table>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 8 Sub-Section 1</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>size_of_data</td>
<td>1</td>
</tr>
</tbody>
</table>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 8 Sub-Section 2</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>data_chunk</td>
<td>num_entries * variable size</td>
</tr>
</tbody>
</table>
<h2>Section 9</h2>
<p>Section 9 starts with 2 bytes for the number of entries. Each entry consists of four lots of 16-bit words.</p>
<p>In Robin Hood, there are 37 entries.</p>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 9</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>num_entries</td>
<td>2</td>
</tr>
<tr>
<td>entry+</td>
<td>16 * num_entries</td>
</tr>
</tbody>
</table>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 9 Entries</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>s9WordA</td>
<td>2</td>
</tr>
<tr>
<td>s9WordB</td>
<td>2</td>
</tr>
<tr>
<td>s9WordC</td>
<td>2</td>
</tr>
<tr>
<td>s9WordD</td>
<td>2</td>
</tr>
</tbody>
</table>
<h2>Section 10</h2>
<p>Section 10 is an odd one. It contains with a 2-byte value, followed by an array of 20 bytes, then an array of 20 words, then another array of 20 words, then another array of 20 bytes.</p>
<p>The values of the last array are manipulated when each value is read in, like so:<br />
<code><br />
if val == 0x20:<br />
val = 0x39<br />
else if val == 0x06:<br />
val = 0x1C<br />
else:<br />
val = val - 0x41<br />
</code></p>
<table border="1">
<tbody>
<tr>
<th colspan="2">Section 10</th>
</tr>
<tr>
<td><strong>Data</strong></td>
<td><strong>Size</strong></td>
</tr>
<tr>
<td>s10WordA</td>
<td>2</td>
</tr>
<tr>
<td>s10ArrayA</td>
<td>1 * 20</td>
</tr>
<tr>
<td>s10ArrayB</td>
<td>2 * 20</td>
</tr>
<tr>
<td>s10ArrayC</td>
<td>2 * 20</td>
</tr>
<tr>
<td>s10ArrayD</td>
<td>1 * 20</td>
</tr>
</tbody>
</table>
<p>That was a massive wall of text, right? I&#8217;ve also added it to the [http://rewiki.regengedanken.de/wiki/.PRG|REWiki] site.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jestarjokin.net/blog/2011/05/robin-hood-the-rules-roughly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Clue! Profidisk &#8211; request for an German-&gt;English translator</title>
		<link>http://www.jestarjokin.net/blog/2011/05/the-clue-profidisk-request-for-an-german-english-translator/</link>
		<comments>http://www.jestarjokin.net/blog/2011/05/the-clue-profidisk-request-for-an-german-english-translator/#comments</comments>
		<pubDate>Tue, 24 May 2011 09:45:38 +0000</pubDate>
		<dc:creator>jestar_jokin</dc:creator>
				<category><![CDATA[Old game hacking]]></category>

		<guid isPermaLink="false">http://www.jestarjokin.net/blog/?p=84</guid>
		<description><![CDATA[I&#8217;ve heard whispers that The Clue! is being considered for inclusion in ScummVM. I&#8217;d love if it was. This got me looking into the source code for The Clue!, which was released to the public quite a few years ago. It looks like there was a &#8220;Profidisk&#8221; expansion released for the game, but only for [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve heard whispers that The Clue! is being considered for inclusion in ScummVM. I&#8217;d love if it was. This got me looking into the source code for The Clue!, which was released to the public quite a few years ago.</p>
<p>It looks like there was a &#8220;Profidisk&#8221; expansion released for the game, but only for the German version. This expansion adds a few more scenarios for burglarising. I&#8217;d like to play this expansion in the English version, but lack the Deutsch to translate it myself, so if anyone out there could help me, contact me at my e-mail (listed later).</p>
<p>Turns out the text requires very little to change; all text data is stored in external files, which are XOR encrypted using a key ox 0&#215;75. At this point I&#8217;m not sure if any graphics will require editing, for now I will concentrate on the text.</p>
<p>If anyone wants to help me out by translating the text, I&#8217;d be grateful. E-mail me at <a href="mailto:jestarjokin@jestarjokin.net">jestarjokin@jestarjokin.net</a>.</p>
<p>&nbsp;</p>
<p>Also, while the German game data was released to the public, the English version remains in limbo. Would it be worthwhile to translate the whole game into English again, to avoid any copyright issues?</p>
<p>It may also be worth editing the original English text anyway, since from memory it didn&#8217;t make much sense at times.</p>
<p>&nbsp;</p>
<p>If you want to unencrypt the files yourself, here&#8217;s a small Python script to do so. If you have Python installed, you can run it like &#8220;xor.py 0&#215;75 TEXT\*.txt&#8221;.</p>
<p><a href="http://www.jestarjokin.net/sw/xor.zip">xor.zip</a></p>
<p>&nbsp;</p>
<p>EDIT: 30/05/2011 &#8211; I&#8217;ve found my translator! Turns out Google Translate does a damn fine job. I&#8217;ll tweak the text a bit to match some of the existing English translations and maybe add some flavour&#8230; stay tuned.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jestarjokin.net/blog/2011/05/the-clue-profidisk-request-for-an-german-english-translator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ScummPacker v3 r1a</title>
		<link>http://www.jestarjokin.net/blog/2011/05/scummpacker-v3-r1a/</link>
		<comments>http://www.jestarjokin.net/blog/2011/05/scummpacker-v3-r1a/#comments</comments>
		<pubDate>Sat, 21 May 2011 08:48:46 +0000</pubDate>
		<dc:creator>jestar_jokin</dc:creator>
				<category><![CDATA[SCUMM]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jestarjokin.net/blog/?p=80</guid>
		<description><![CDATA[It seems there was a problem with the last build of ScummPacker. I&#8217;m not sure why, possibly because I did it on a different computer than usual. This release is just a new build which seems to be working. There are no code changes. Win32 Binaries http://www.jestarjokin.net/sw/scummpacker_bin_20110521.zip Python Source http://www.jestarjokin.net/sw/scummpacker_src_20110521.zip]]></description>
			<content:encoded><![CDATA[<p>It seems there was a problem with the last build of ScummPacker. I&#8217;m not sure why, possibly because I did it on a different computer than usual. This release is just a new build which seems to be working. There are no code changes.</p>
<p><strong>Win32 Binaries</strong><br />
<a href="http://www.jestarjokin.net/sw/scummpacker_bin_20110521.zip">http://www.jestarjokin.net/sw/scummpacker_bin_20110521.zip</a></p>
<p><strong>Python Source</strong><br />
<a href="http://www.jestarjokin.net/sw/scummpacker_src_20110521.zip">http://www.jestarjokin.net/sw/scummpacker_src_20110521.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jestarjokin.net/blog/2011/05/scummpacker-v3-r1a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ScummSpeaks v3 r4</title>
		<link>http://www.jestarjokin.net/blog/2011/05/scummspeaks-v3-r4/</link>
		<comments>http://www.jestarjokin.net/blog/2011/05/scummspeaks-v3-r4/#comments</comments>
		<pubDate>Sat, 14 May 2011 07:57:09 +0000</pubDate>
		<dc:creator>jestar_jokin</dc:creator>
				<category><![CDATA[SCUMM]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jestarjokin.net/blog/?p=76</guid>
		<description><![CDATA[A bug fix release for ScummSpeaks. Fix issue where importing sounds into a MONSTER speech map did not sort the sounds by ID (original offset), resulting in invalid game resources when exporting. Win32 Binaries http://www.jestarjokin.net/sw/scummspeaks_bin_20110512.zip Python Source http://www.jestarjokin.net/sw/scummspeaks_src_20110512.zip]]></description>
			<content:encoded><![CDATA[<p>A bug fix release for ScummSpeaks.</p>
<ul>
<li>Fix issue where importing sounds into a MONSTER speech map did not sort the sounds by ID (original offset), resulting in invalid game resources when exporting.</li>
</ul>
<p><strong>Win32 Binaries</strong><br />
<a href="http://www.jestarjokin.net/sw/scummspeaks_bin_20110512.zip">http://www.jestarjokin.net/sw/scummspeaks_bin_20110512.zip</a></p>
<p><strong>Python Source</strong><br />
<a href="http://www.jestarjokin.net/sw/scummspeaks_src_20110512.zip">http://www.jestarjokin.net/sw/scummspeaks_src_20110512.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jestarjokin.net/blog/2011/05/scummspeaks-v3-r4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ScummPacker v3 r1, and SCUMM Image Encoder v2 r1</title>
		<link>http://www.jestarjokin.net/blog/2011/04/scummpacker-v3-r1-and-scumm-image-encoder-v2-r1/</link>
		<comments>http://www.jestarjokin.net/blog/2011/04/scummpacker-v3-r1-and-scumm-image-encoder-v2-r1/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 11:33:14 +0000</pubDate>
		<dc:creator>jestar_jokin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.jestarjokin.net/blog/?p=70</guid>
		<description><![CDATA[ScummPacker v3 r1 Complete rewrite. Breaks all compatability with old versions. Supports SCUMM v4, v5, and v6 games, as well some v3 games. Outputs some information (such as headers) to XML format. No longer need to explicitly state the order of each block. All object data are contained within their own sub-folder. Local scripts are [...]]]></description>
			<content:encoded><![CDATA[<p><strong>ScummPacker v3 r1</strong></p>
<ul>
<li>Complete rewrite. Breaks all compatability with old versions.</li>
<li>Supports SCUMM v4, v5, and v6 games, as well some v3 games.</li>
<li>Outputs some information (such as headers) to XML format.</li>
<li>No longer need to explicitly state the order of each block.</li>
<li>All object data are contained within their own sub-folder.</li>
<li>Local scripts are contained within their own sub-folder.</li>
<li>License changed from &#8220;public domain&#8221; to the MIT/X11 license.</li>
</ul>
<p><strong>Win32 Binaries<a href="../../sw/scummspeaks_bin_20110330.zip"><br />
</a><a href="../../sw/scummpacker_bin_20110425.zip">http://www.jestarjokin.net/sw/scummpacker_bin_20110425.zip</a></strong><br />
<strong>Python Source<a href="../../sw/scummspeaks_src_20110330.zip"><br />
</a><a href="../../sw/scummpacker_src_20110425.zip">http://www.jestarjokin.net/sw/scummpacker_src_20110425.zip</a></strong></p>
<p><strong>SCUMM Image Encoder v2 r1</strong></p>
<ul>
<li>Updated to work with ScummPacker v3</li>
<li>New option to &#8220;freeze&#8221; the palette, preventing the original palette from being updated.</li>
<li>New option to specify the quantization (number of colours in the palette)</li>
<li>License changed from &#8220;public domain&#8221; to the MIT/X11 license.</li>
</ul>
<p><strong>Win32 Binaries<a href="../../sw/scummimg_bin_20110425.zip"></p>
<p>http://www.jestarjokin.net/sw/scummimg_bin_20110425.zip</a></strong></p>
<p><strong>Python Source<a href="../../sw/scummimg_src_20110425.zip"></p>
<p>http://www.jestarjokin.net/sw/scummimg_src_20110425.zip</a></strong></p>
<h2>And that&#8217;s it!</h2>
<p>I&#8217;m afraid I have no intention on performing any further work on my SCUMM tools. I will still perform maintenance work, and will consider feature requests, but I will be focusing on other projects.</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">
<ul>
<li><strong>v3 r1</strong></li>
<li>Complete rewrite. Breaks all compatability with old versions.</li>
<li>Supports SCUMM v4, v5, and v6 games, as well some v3 games.</li>
<li>Outputs some information (such as headers) to XML format.</li>
<li>No longer need to explicitly state the order of each block.</li>
<li>All object data are contained within their own sub-folder.</li>
<li>Local scripts are contained within their own sub-folder.</li>
<li>License changed from &#8220;public domain&#8221; to the MIT/X11 license.</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jestarjokin.net/blog/2011/04/scummpacker-v3-r1-and-scumm-image-encoder-v2-r1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ScummSpeaks v3 r3</title>
		<link>http://www.jestarjokin.net/blog/2011/03/scummspeaks-v3-r3/</link>
		<comments>http://www.jestarjokin.net/blog/2011/03/scummspeaks-v3-r3/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 09:36:37 +0000</pubDate>
		<dc:creator>jestar_jokin</dc:creator>
				<category><![CDATA[SCUMM]]></category>

		<guid isPermaLink="false">http://www.jestarjokin.net/blog/?p=66</guid>
		<description><![CDATA[A new bug fix for ScummSpeaks. Summary Fix problem trying to export sound resources, where the sound map contains sounds that are not mapped to any line of text (and will effectively be unused in the game). This might exhibit itself in an error box popping up with a message like &#8220;973996&#8243;. Win32 Binaries http://www.jestarjokin.net/sw/scummspeaks_bin_20110330.zip [...]]]></description>
			<content:encoded><![CDATA[<p>A new bug fix for ScummSpeaks.</p>
<h4>Summary</h4>
<ul>
<li>Fix problem trying to export sound resources, where the sound map contains sounds that are not mapped to any line of text (and will effectively be unused in the game). This might exhibit itself in an error box popping up with a message like &#8220;973996&#8243;.</li>
</ul>
<p><strong>Win32 Binaries</strong><br />
<a href="http://www.jestarjokin.net/sw/scummspeaks_bin_20110330.zip">http://www.jestarjokin.net/sw/scummspeaks_bin_20110330.zip</a><br />
<strong>Python Source</strong><br />
<a href="http://www.jestarjokin.net/sw/scummspeaks_src_20110330.zip">http://www.jestarjokin.net/sw/scummspeaks_src_20110330.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jestarjokin.net/blog/2011/03/scummspeaks-v3-r3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

