the cutting room mirror

Ice Age Village (iOS, Android)

Being one of the first free-to-plays from Gameloft, Ice Age Village is a city-builder starring the cast of, what else, the Ice Age series.

"Isn't there anyone who cares about Sid the Sloth?"

To do:
Currently figuring out the proprietary texture format and slowly looking through related textures for anything fishy but we'll need the encryption key to view unused parameters.

  • More debug strings possibly.
  • Blackberry version has WAY more debug strings and possibly functions stripped from other releases.

Development Text#

GS Error (Connection failed)
AndroidOrientationChanged
Lobby Error (
)
Room Error (
User Error (User Already logged In)
User Error (
Default Error (
Placeholder name
Placeholder description
[PLACEHOLDER]We will now attempt to retrieve
available save files from cloud servers.
[NOT LOCALISED]%s has left you a surprise in your inventory!
[NOT LOCALISED]%s has left you a surprise in your village!
[NOT LOCALISED]Congratulations, you got %s
[NOT LOCALISED]Placing this gift will give your friend %s and you will get %s!
[NOT LOCALISED]There isn't enough space at the moment in this village to place this gift.
[NOT LOCALISED]You collected %s gift ! You got %s

A portion of development text entries are mostly present in the executable. However, most entries were removed across many builds of the game.

Playtest Player IDs#

1700329137__________
100001228334594_____
100001205931560_____
100001209620736_____
100001258344333_____
100001273943586_____
100001473189757_____
100001500039571_____
100001525839080_____
100001484379290_____
100001473039973_____
756073720___________

Error handler strings#

Only constant texts allowed in referenced locale string arguments
ERROR VisualTiledBackground:getVisualTileAtCameraCenter : Camera is somehow outside of the map!
No type declared in getClass!!!
Pointer NULL WTFBBQ!
Can't find quest: 

Debug/Cheat Menu/Console strings#

Cheat Menu
Level Up
Skip Tutorial
Unlock Full Store
Game Speed %dX
In-Game Menu
Reset Game
Please restart the AUT for the change to take effect.
Time has changed by %c hours.
Invalid input recieved:
Reset Seshat profile
REGION Device: 
REGION: 
Fake invite: 
MainSkipTut
MainLevelUp
DEBUG CONSOLE
MainUnlockFull
Game Speed x%d
Quest Cheat
Next Loading Screen Hint: %d
Quest Cheat x%d
Get Coins
and Acorns

+ 24 hours
Snow Pile x%d
Scrat x%d
+ 1 Hour
Debug
Enable Interstitials
Disable Interstitials
No
Home Tree

Home Tree:
%i / %i

Max Level
Home Tree

Skip
Level %i

JP: Animal
JP: Acorns
JP: Coins
Jackpot Off
Set 13th Birthday
Enter DLC ZIP Folder (Ex: 40507)
Enter Max DLC Pack To Download (Ex: 5)
FOLDER
PACK
ALL
unlockDlcQA
Bad or no command argument
You are at a higher level then %i
Setting level to 
Total EXP for level: 
Current Level: 
Current Exp:
Increased Exp by:

Debug ON
AVG_FPS: %.1f
STATUS: %s
ENVIRONMENT: %s
%s
Scenery flag = %d 0,0 = %d both = %d
COLLISION_PLAYER, 
COLLISION_ANIMAL, 
COLLISION_OBJECT, 
COLLISION_TEMPORAL, 
Current VIP Level prizecount = 
%d %s
No Mystery Box Prizes for current VIP Level
Prize Index exceeded the number of prizes for current VIP Level
Need to increase VIP level to access the mystery box
Getting Mystery Box Prize at Index 
invalid args
Increased holiday tokens owned by 
Error: No Active Holiday
Increased STC tokens owned by 
Increased tokens owned by 
Increased hearts owned by 
Increased acorns owned by 
Increased coins owned by 
ToogleCorruptCloudSave Trigger to: ON

Usage: GLC <GLCcommand> [OptionalParams]
Available commands:
ToogleCorruptCloudSave  - Toogle between On or Off for sumitting a corrupted Cloud Save
Quest command executed
Found quest: 
quest 
 activated
LiveOps
Tournament Unit Test Started
Not Enough Args
Invlaid Args
Too many people to fill leaderboard with, max is 200
Filling Leaderboard for Event Id %d
Tournament Event with ID %d Not Found
Creating Tournaments for Event Id %d
Unit Test Started
COIN
MainLiveOpsHeartIceAnimals_Title
Setting live ops path to new file: 
+
days
hours
minutes
Setting Main Score to 
Setting Extra Event Score to 
Holiday Unit Test Started
Holiday Unit 2 Test Started
Usage: CRM <CRMcommand> [OptionalParams]
Available commands:
Refresh - force a fully refresh cicly
Reset   - invalidate all configs and then force refresh
Debug   - show/hide debug window
info        - refresh CRM debug info
Date        - get expiration Date
InternetLost - simulates an internet disconnection
hestia Expiry Date: 
offItems Expiry Date: 
not implemented yet
Not a cheat version

This is probably a string to separate debug and retail versions and suggest debug features are removed in them.

Debug Console?#

To do:
Enable if possible.

The executable of the game mentions a debug console.

General#

Command

Description

Switch

ADDHOUR

Adds hours to game time?

ALMOSTLEVELUP

Almost levels up your village one level?

None

TOLEVEL

Sets your village level? Duplicate of TOLEVEL? Won't let you go over your current.

DISCLAIMER

Displays a disclaimer?

None

SPECIALDISCLAIMER

?

None

HIDEUI

Hides the GUI?

None

CHEATZOOM

?

None

UNCHEATZOOM

?

None

DISABLERANDOMLIMIT

?

None

TEXT

Displays text from a given Text ID.

SETAGE

Sets your age for COPPA?

SETREGION

Sets your region?

RESETREGION

Resets your region?

None

SHOWREGION

Draws a display for the region of the player.

None

MONEY

Probably allows currency to be added to the profile. money_type values to choose are coin, acorn, heart, token, stctoken, holiday and vipacorn

<string - money_type> <int - amount>

help

Sounds like it prints the list of debug commands.

None

REGION

?

None

QUEST

Allows you to load a given quest.

Live Ops#

These all start with LiveOps.

Switch /+ Command

Description

help

?

[int] days

?

[int] hours

?

[int] minutes

?

ResetTime

?

UnitTest

?

SetSource [string - filename.xml]

?

ClearSave

?

CreateTournaments [int - UniqueId]

?

TournamentUnitTest

?

FillLeaderboard [int - UniqueId] [int - Number of people] [int - Base Score] [int - Score Interval]

?

HolidayUnitTest

Only valentine, easter, worldcup, back2school, halloween, xmas, flower can be chosen.

AwardPrize [int - prizeType]

?

ResetScore [int - prizeType]

?

SetScore [int - amount] main

?

SetScore [int - amount] second

?

Developer Text#

    <!--  
        ***** Tag model. *****
        Attribute id = "device_model". 
                You can get this attribute value by
                checking the log tag "ALPHA_CORRECTION"
                in the debugger.
                
        Also you can check it on the Gameloft DDMS Device info tab.
        The values are shown like:
                ro.product.manufacturer=samsung
                ro.product.model=GT-I9300
        
        Put them together separated by '_' on the 'id' attribute. 
            <model id="samsung_GT-I9300">
            </model>
            
        ***** Tag firmware (optional) ****
        Some specific firmware versions may need alpha correction.
        
        You can get the firmware version by checking the log tag
        "ALPHA_CORRECTION" in the debugger.
        
        Also you can check it on the Gameloft DDMS Device info tab.
        The values are shown like:
            ro.build.version.release=4.2.2
            
            <firmware>2.3.6</firmware>
     -->

<!--    [MANDATORY]   

EventType -
            event_increase_collection(only one available for update 11) 
            event_extra_resource(available for update 12) 
            event_stc_bonus(available for update 12)
            event_holiday(available for update 13)
            event_stc_extra_resource(available for update 13)
            event_quest_rewards(available for update 14)
            event_pile_bonus(available for update 14)
            event_community(available for update 15)
            
UniqueID - Must be unique for EACH event
        current UniqueID in use - 70. //Please change accordingly

StartDate -
EndDate -
            Format "year-MM-dd HH:mm:ss"
Target - 
    (For event_increase_collection)
        COINS,
        XP,
        REDUCEPRODUCTIONTIME 
        
    (For event_extra_resource)
        HEART,
        ACORN,
        HOLIDAY
        
Modifier - How much more?
        2 = 2%,
        3 = 3%,
        4 = 4%
HolidayType -
    (For event_extra_resource)
            For the diferrent Holidays
        NONE
        XMAS
        VALENTINE
        HALLOWEEN
        
IncludeClutters - 
    (For event_extra_resource)
            Make the extra resource appear on map piles (snow piles and leaves piles)
        1 - (NOTE: On)
        0 - (NOTE: Off)
        
ActivatePercent -
    (For event_extra_resource)
            % to spawn the resource.

AmountToGift - 
    (For event_extra_resource)
            Amount to Give of the extra resource.
            
ElementTemplateAffected - amount of element templates to apply the event 
    Example:  
            29  (NOTE: If a number is given please list the elements that apply.)
            34  (NOTE: If a number is given please list the elements that apply.)
Categories that we support:         
            ALL
            ICE
            DINO
            FUN
            ANIMAL
If the target is XP only suport (NOTE: Fun building give no exp)
            ICE
            DINO
            ANIMAL

-->

<!-- 
movieID list:
0 - Ice Age: Continental Drift Exclusive Movie Clip!
1 - Ice Age Trailer
2 - Ice Age Policy Trailer
3 - Alpenliebe
4 - McDonalds
5 - Life of Pi: Theatrical Trailer
6 - Ice Age Village – Behind the scenes trailer
7 - EPIC Battle for Moonhaven Trailer
8 - Ice Age Adventures - Launch Trailer
-->

Changes with Text#

String ID

Base

Final

Note

Ad_Minigame_WatchAd

Watch a video to play for free!
Watch an ad video to play for free!

Changed to "ad video". Same for Ad_Minigame_Timer except with the time.

MessageIAP_Popup_GetItNow

GET IT NOW!
NOT ENOUGH CURRENCY.

From an IAP beg to a typical message.

!MessageIAP_Popup_NeedAmount_Coins

You need %s\\[22] to get it now!
YOU NEED %s\\[22] MORE! YOU CAN PICK SOME UP AT THE SHOP.

Way more descriptive on the shop location.

!MessageIAP_Popup_NeedAmount_Acorns

You need %s\\[29] to get it now!
YOU NEED %s\\[29] MORE! YOU CAN PICK SOME UP AT THE SHOP.

Way more descriptive on the shop location.

MessageFindBabyVideo

Oh no! It looks like your baby ran away! Would you like to watch a video to get it back?
Oh no! It looks like your baby ran away! Would you like to watch an advertising video to get it back?

Changed to "advertising video".

MessageWatch_Video

Watch Video
Watch an ad

Changed to "an ad".

Ad_Video_GetFreeAcorns

Get \\[226]!
Watch an ad \\[226]!

More descriptive on watching an advert.

Ad_Quest_DoubleRewards

Double your rewards!
Watch an ad

More descriptive on watching an advert.

Ad_ADVISOR_NO_MORE_VIDEOS

Sorry, no more videos available to watch for now. Please come back later.
Sorry, no more ad videos are available to watch for now. Please come back later.

Another change to "ad videos".

Ad_Minigame_FreeAcorn

Watch a Video to Earn Rewards
Watch an ad video to earn rewards.

For whatever reason, some words were uncapitalized.

Ad_Free_Acorns_IAP

GET FREE \\[147]!
Watch an ad \\[147]!

More descriptive on watching an advert.

Development Leftovers#

A few leftovers are present.

Compilation Logs#

hdata:

Start of log

----
Table of Contents
----
----Calculate Size of TOC--------
--- Num of Packs: 1
--- Size = NB of packs * (Version(4 bytes) +
                            Type(4 bytes) +
                            Major(4 bytes) +
                            Minor(4 bytes) +
                            Build(4 bytes) +
                            Model(4 bytes) +
                            Availability (4 bytes) +
                            Description (64 bytes) +
                            StartAddress(8 bytes) +
                            EndAddress(8 bytes))


Size (4 Bytes) (size of TOC): 112

----
--- Start of TOC

----

----
TOC Listing for pack D:\IAVillage\trunk_clean\data\001
TOC Listing for pack 001
TOC Listing for pack 1

BYTES 4 - 7 :Pack 1 Version = 1

BYTES 8 - 11 :Pack 1 Type = 3

BYTES 12 - 15 :Pack 1 Major = 9

BYTES 16 - 19 :Pack 1 Minor = 9

BYTES 20 - 23 :Pack 1 Build = 9

BYTES 24 - 27 :Pack 1 Model = 2

BYTES 28 - 31 :Pack 1 Availability = 0

BYTES 32 - 95 :Pack 1 Description =  InitialGameContent
--- Type 3: CORE Resource Packs

BYTEs 96 - 103: Start address of Pack: 112
--- Num CORE Packs: 4 (4 bytes)
--- 3
--- Adding info for CORE Resource Pack 3
--- 4
--- Adding info for CORE Resource Pack 4
--- 5
--- Adding info for CORE Resource Pack 5
--- 6
--- Adding info for CORE Resource Pack 6
--- 3
--- Adding data for resource pack 3
--- 4
--- Adding data for resource pack 4
--- 5
--- Adding data for resource pack 5
--- 6
--- Adding data for resource pack 6

BYTES 104 - 111: End addressssss of Pack: 7456999

----
 DONE READING FILES--------------

----
 APPENDING  FILES--------------

ldata:

Start of log

----
Table of Contents
----
----Calculate Size of TOC--------
--- Num of Packs: 1
--- Size = NB of packs * (Version(4 bytes) +
                            Type(4 bytes) +
                            Major(4 bytes) +
                            Minor(4 bytes) +
                            Build(4 bytes) +
                            Model(4 bytes) +
                            Availability (4 bytes) +
                            Description (64 bytes) +
                            StartAddress(8 bytes) +
                            EndAddress(8 bytes))


Size (4 Bytes) (size of TOC): 112

----
--- Start of TOC

----

----
TOC Listing for pack D:\IAVillage\trunk_clean\data\001
TOC Listing for pack 001
TOC Listing for pack 1

BYTES 4 - 7 :Pack 1 Version = 1

BYTES 8 - 11 :Pack 1 Type = 3

BYTES 12 - 15 :Pack 1 Major = 9

BYTES 16 - 19 :Pack 1 Minor = 9

BYTES 20 - 23 :Pack 1 Build = 9

BYTES 24 - 27 :Pack 1 Model = 2

BYTES 28 - 31 :Pack 1 Availability = 0

BYTES 32 - 95 :Pack 1 Description =  InitialGameContent
--- Type 3: CORE Resource Packs

BYTEs 96 - 103: Start address of Pack: 112
--- Num CORE Packs: 4 (4 bytes)
--- 3
--- Adding info for CORE Resource Pack 3
--- 4
--- Adding info for CORE Resource Pack 4
--- 5
--- Adding info for CORE Resource Pack 5
--- 6
--- Adding info for CORE Resource Pack 6
--- 3
--- Adding data for resource pack 3
--- 4
--- Adding data for resource pack 4
--- 5
--- Adding data for resource pack 5
--- 6
--- Adding data for resource pack 6

BYTES 104 - 111: End addressssss of Pack: 4195204

----
 DONE READING FILES--------------

----
 APPENDING  FILES--------------

IADLC.zip.log is present in the Windows Phone version.

XCode Entitlement#

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>keychain-access-groups</key>
    <array>
        <string>A4QBZ46HAP.com.gameloft.SingleSignonGames</string>
    </array>
</dict>
</plist>

Media Player Note#

Contents:

MP_wrapper.mm, MP_wrapper.h - Objective-C wrapper for MediaPlayer framework.
MP_externdecl.h - extern "C" statements, to be included wherever you need them. Only for C++.
cMediaPlayer.cpp, cMediaPlayer.h - C++ wrapper for functions in MP_wrapper. Tested only on iPhone.
cMediaPlayer_defines.h - defines used in both wrappers

----

Things to do to compile the files:

- add them to your project
- you might want to #undef WIN32 in Objective-C files.
- in MP_wrapper.mm, class cMP_Picker, method Display: the statement [[GLoftApp sharedInstance] GetWindow] must return a UIWindow. You must modify it to match the variable names in your project.

----


How to use cMediaPlayer to play all songs in iPod:

cMediaPlayer::Initialize();
cMediaPlayer mp = NEW cMediaPlayer(MP_TYPE_APP, MP_QY_SONGS);
mp->Prepare();
mp->Play();
....
mp->Stop();
delete mp;
cMediaPlayer::Shutdown();


----

How to add filters:

cMediaPlayer::Initialize();
cMediaPlayer mp = NEW cMediaPlayer(MP_TYPE_APP, MP_QY_SONGS);
HFilter f1 = mp->AddFilter(MP_FILTER_ARTIST, "Metallica", MP_FILTERCOMP_EQUALS);
HFilter f2 = mp->AddFilter(MP_FILTER_TITLE, "sO WHat", MP_FILTERCOMP_CONTAINS);
mp->Prepare();
mp->Play();
....
mp->Stop();
mp->RemoveFilter(f1);
mp->RemoveFilter(f2);
mp->Play(); 
....
mp->Stop();
delete mp;
cMediaPlayer::Shutdown();

You can add as many filters as you want (theoretically). 
You are responsible for managing filters.


----


How to select an existing playlist:

cMediaPlayer::Initialize();
cMediaPlayer mp = NEW cMediaPlayer(MP_TYPE_APP, MP_QY_PLAYLISTS);
int nb = mp->GetNumberOfGroups();
char name[MAX_NAME_LENGTH];
for(int i = 0; i < nb; i++)
    mp->GetGroupName(i, name);      //will copy in name the playlist name
....
mp->Prepare(i); // 0 <= i < nb;
...
mp->Play();
....
mp->Stop();
delete mp;
cMediaPlayer::Shutdown();



mp = NEW cMediaPlayer(MP_TYPE_APP, MP_QY_PLAYLISTS);    //creates a player which sorts items by playlist
If you create a player which sorts items by song title (MP_QY_SONGS), GetGroupName() will get the song name.

Use SetCustomPlaylist(int *indices, int len) to set a playlist containing the songs at indices.

----


How to display a media picker to let the user create a playlist:

cMediaPlayer mp = NEW cMediaPlayer(MP_TYPE_APP, MP_QY_SONGS);
mp->ShowPlaylistDialog();


if(media->IsPlaylistSelected())     //assuming you call this in your main loop
{
    mp->SetSelectedPlaylist();
}
....
mp->Play();
...


----

Other things you might want to change:
- #define MAX_NAME_LENGTH 256
- #define MAX_MP_OBJECTS 32
- the type on music player (MP_TYPE_xxx) or query (MP_QY_xxx)

cMediaPlayer.readme for an internal media player is present in v1.0.0 on iOS due to it didn't use external assets and Gameloft forgot to fully clean them.

Internal Project Name#

The internal project name of the game is Ice Age, despite Gameloft already releasing an Ice Age title before, which is Ice Age: Scrat-Ventures. Guess they forgot about it. Go figure.