The Cutting Room Floor now has a Patreon page. Thanks for all your support!

If you've blocked our ad, please consider unblocking it.
We promise it isn't annoying. No flash, no sound, ever.

Ads by Project Wonderful! Your ad here, right now: $0

Tetris (iOS)

From The Cutting Room Floor
Jump to: navigation, search

Title Screen

Tetris

Developer: EA Mobile
Publisher: Electronic Arts
Platform: iOS
Released internationally: July 10, 2008


SourceIcon.png This game has uncompiled source code.
DevTextIcon.png This game has hidden development-related text.


It's the classic Tetris on your phone! What more could you need?

Excel Spreadsheet

Download.png Download Tetris (iOS) Spreadsheet
File: tetrisiosspreadsheet.rar (77 KB) (info)

An Excel spreadsheet containing all of the game's text, along with some notes for the translator. The game never uses any text from this file.

Unused Text

[default]

; GENERAL 
DummyProperty1 = 1
DummyProperty2 = 2
DummyProperty3 = 3



; KEYBOARD 
;-------------------------------------------------------------------------------
; The Blast virtual key names can be found in header file "Key.h"
;-------------------------------------------------------------------------------

;-------------------------------------------------------------------------------
; OS key code to Blast virtual keys.
;-------------------------------------------------------------------------------
; Maps OS key codes to Blast virtual keys for extra keys not normalized by the OS.
; Some devices provides extra-keys that do not map to any OS virtual key code. For
; example, J2ME only defines few numpad virtual keys. Some J2ME devices has full
; QWERTY keyboards and the letters do not have any OS virtual key mapping. In
; such case, Blast has to provide the correct mapping.
;
; Multiple key codes can map to the same VK. For example if the device sends
; differents key code if the modifier keys are pressed or if the keycode sent
; for the pressed state is different than the keycode sent for the release state.
;
; Format must be: keyCodeValue = virtualKeyName
;
; [devices: HTC544]
; 8234 = kLetterA ; Key code sent when key 'A' is pressed.
; 4328 = kLetterA ; Key code sent when key 'A, is released.
; 3242 = kLetterA ; Key code sent when keys 'Shift' and 'A' are pressed.
;
;-------------------------------------------------------------------------------

;-------------------------------------------------------------------------------
; Blast virtual keys meta data for text edition and game help text.
;-------------------------------------------------------------------------------
; It is possible to embeds meta data associated with a virtual key. The meta
; data is used for text edition if the OS does not provide proper support. The
; following fields are recongnized.
;
; char:   The list of character associated with the key.
; shift:  The list of character associated with the key when the shift key is pressed.
; alt:    The list of character associated with the key when the alt key is pressed.
; ctrl:   The list of character associated with the key when the ctrl key is pressed.
; fn;     The list of character associated with the key when the fn key is pressed.
;
; If a value is not defined, the field can be empty, tail values can be ommited. In the
; list, if the key represents a number, it must be first, then letters and finally
; symbols.
;
; Encode any non-ASCII characters using the 16-bits char C++ notation. (\x3AF2)
;
; Format must be: virtualKeyName = char,shift,alt,ctrl,fn
;
; The Blast virtual key names can be found in file "Key.cpp"
;
; [platforms: Win32]
; kDigit2  = 2,",\x010F
; kLetterA = a,A
;
; [devices:VX7000, VX8000, VX8100]
; kNumPad0 = 0
; kNumpad2 = 2abc,2ABC
;
; [devices:BB8100]
; kLetterQ = qw,QW,!
; kLetterE = 1er,1ER
; kLetterT = 2ty,2TY
; kLetterU = 3ui,3UI
; kLetterO = op,OP,.
;-------------------------------------------------------------------------------

EAMCore.ini is almost entirely comprised of commented out text.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                       WARNING !!!                                                                         ;
;                                                                                                                                           ;
; If you modify the local version of this file (located in TetrisApp\dev\data\Assets\GameDesignerConstants) and submit it on P4,            ;
; please inform Macaron so that he can upload the latest revision of the file on the server.                                                ;
;                                                                                                                                           ;
; Otherwise, since the game always downloads and uses the version of GameDesignerConstants.ini located on the server at game launch,        ;
; it won't use the local GameDesignerConstants.ini file where local modifications are, which will be VERY misleading if someone wants to do ;
; some tests by modifying this file...                                                                                                      ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

This warning for developers is found in GameDesignerConstants.ini.

; Put comment here to describe more exactly where is the planet identified by this ID: EX First Galaxy, Second Planet
; Put comment here to describe more exactly where is the planet identified by this ID: EX First Galaxy, Second Planet
; Put comment here to describe more exactly where is the planet identified by this ID: EX First Galaxy, Second Planet
; The 2 following fields are additive, meaning that if you enter "1" in the hour field and "120" in the minutes field, the total cooldown time will be 1h + 2h = 3 hours

In the same file, there are also a few developer comments.

Perl Script

A Perl script, stored in lang_plist_maker_script_.pl. It was likely used to split the Excel spreadsheet (see above) into multiple language files.

#!/usr/bin/perl -w

#Requires Spreadsheed::ParseExcel       http://search.cpan.org/~kwitknr/Spreadsheet-ParseExcel-0.2603/ParseExcel.pm     INSTALL LAST
#Requires Crypt::RC4                    http://www.perl.org/CPAN/authors/id/S/SI/SIFUKURT/Crypt-RC4-2.02.tar.gz
#Requires Digest::Perl::MD5             http://www.perl.org/CPAN/authors/id/D/DE/DELTA/Digest-Perl-MD5-1.8.tar.gz
#Requires IO::Scalar                    http://search.cpan.org/~dskoll/IO-stringy-2.110/lib/IO/Scalar.pm
#Requires OLE::Storage_Lite             http://search.cpan.org/~jmcnamara/OLE-Storage_Lite-0.19/lib/OLE/Storage_Lite.pm

use strict;
use Switch;
use Spreadsheet::ParseExcel;

my $parser   = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse('EBISU_Strings_with_ID.xls');

if ( !defined $workbook ) {
    die $parser->error(), ".\n";
}

print "FILE  :", $workbook->{File} , "\n";
print "COUNT :", $workbook->{SheetCount} , "\n";
print "AUTHOR:", $workbook->{Author} , "\n";

open(my $arrFileHandle, ">:utf8", "EBISU_StringExport_Array.h") or die "EBISU_StringExport_Array.h $!";
open(my $enumFileHandle, ">:utf8", "EBISU_StringExport_Defines.h") or die "EBISU_StringExport_Defines.h $!";

# Print headers for Array file.
my $time = localtime(time);
print $arrFileHandle "// This file was auto-generated on: ", $time;
print $arrFileHandle "\n\n#ifndef __EBISU_STRINGEXPORT_ARRAY_H__\n";
print $arrFileHandle "#define __EBISU_STRINGEXPORT_ARRAY_H__\n";
print $arrFileHandle "NSString * const cKeyArray[] = {\n";

# Print header for Defines file
print $enumFileHandle "// This file was auto-generated on: ", $time;
print $enumFileHandle "\n\n#ifndef __EBISU_STRINGEXPORT_DEFINES_H__\n";
print $enumFileHandle "#define __EBISU_STRINGEXPORT_DEFINES_H__\n";
print $enumFileHandle "typedef enum {\n";


my @languages = ();
my @fileHandles = ();

my $worksheet = $workbook->{Worksheet}[0];
my $worksheetName = $worksheet->get_name();
   
print "--------- SHEET:", $worksheet->{Name}, "\n";

#grab the language names out of this worksheet, and initialize the plists
my ( $col_min, $col_max ) = $worksheet->col_range();
my ( $row_min, $row_max ) = $worksheet->row_range();

my $itt = 0;

for my $col ( $col_min .. $col_max ) {
    my $cell = $worksheet->get_cell( $row_min, $col );
   
   if( !defined($cell))
    {
    	print "Undefined cell at Row: ", $row_min, " Col: ", $col, "\n";	
    }
    
    my $val = $cell->value();
    if( $val && $val ne '' && $val ne 'String ID' && $val ne 'English Status' && $val ne 'Comments' && $val ne 'Max Length') {
        print "Initializing   = ", $val, "\n";

        $languages[$itt] = $val;

        my $fileName = "$val.plist";

		print "Opening file, ", $fileName;
		
        open($fileHandles[$itt], ">:utf8", $fileName) or die "$fileName: $!";
        
        my $handle = $fileHandles[$itt];
        print $handle "<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE plist PUBLIC '-//Apple Computer//DTD PLIST 1.0//EN' 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'><plist version='1.0'><dict>";

        $itt++;

    }
}

print "\n";


print "Parsing worksheet:   ", $worksheetName, "\n";

my $didUpdateArrayAndEnumFiles = 0;

for my $col ( $col_min .. $col_max ) {

    my $testCell = $worksheet->get_cell( $row_min, $col );
    my $colTitle = $testCell->value();
    if( $colTitle && $colTitle ne '' && $colTitle ne 'String ID' && $colTitle ne 'English Status' && $colTitle ne 'Comments' && $colTitle ne 'Max Length') {

        my $index = 0;
        print "Column Title: ", $colTitle, "\n";

        while($languages[$index] ne $colTitle) {
            #print "Language: ", $languages[$index], " ", $index, "\n";
            $index++;
        }


        my $fileHandle = $fileHandles[$index];

        for my $row ( ($row_min + 1) .. $row_max ) {

            my $keyCell = $worksheet->get_cell( $row, $col_min );  #keys must be in the leftmost column
            next unless $keyCell;
 
            my $valueCell = $worksheet->get_cell( $row, $col );
            next unless $valueCell;

            my $key = $keyCell->value();
            my $value = $valueCell->value();

            
            $value =~ s/</@/g;
            $value =~ s/>/@/g;

            if($key ne '') {
                print $fileHandle "<key>$key</key><string>$value</string>\n";

                
                if($didUpdateArrayAndEnumFiles == 0) {
                    #print to array and enum files
                    print $arrFileHandle "    [$key]          = @\"$key\",\n";
                    print $enumFileHandle "    $key,\n";
                }
                
            }
        }
        
        $didUpdateArrayAndEnumFiles = 1;
    }
}   

print $arrFileHandle "};";
print $arrFileHandle "\n#endif\n";

print $enumFileHandle "} eStringKey;";
print $enumFileHandle "\n#endif\n";

for my $handle ( @fileHandles ) {

    print $handle "</dict></plist>";
    close $handle;

}