Presentation is loading. Please wait.

Presentation is loading. Please wait.

Data Driven Development The Technology Behind Live-Ops.

Similar presentations

Presentation on theme: "Data Driven Development The Technology Behind Live-Ops."— Presentation transcript:

1 Data Driven Development The Technology Behind Live-Ops

2 About Me Daniel Menard Co-founder and CEO


4 First Spin Out


6 Products Power Based Short Burst + Long Tail Qualitative Reviews Services Stamina Based Survival + Build Up Quantitative React to Players Products and Services

7 Commit Graphs Game Launch

8 Commit Graphs Game Launch

9 Code Quality Analytics Ongoing Production Effects on Tech

10 Now a major concern Must be able to add and remove features easily Maintenance dwarfs production Code Quality

11 Key metrics and balancing Log everything Free solutions available Prioritize analysis capabilities Analytics

12 Real-Time Data Time Lagged Data No Data Wrong Data Analytics

13 Only require designers to add content Good tools Configuration data Changes informed by analytics Regular Patches Regular QA Submit to App Stores Ongoing Production

14 Deliver GatherAnalyse Adjust Tightening the Loop 7 day review 1-30 days

15 Decouple data from logic code Create a data model for your game Game becomes it’s own “runtime” for your data Configuration files Data Driven Development

16 Data can be made accessible to all Better code Flat class hierarchy Objects become containers for data Why should you care

17 Designer Data Levels Balance Settings Item Definitions Player Data Progression Inventory Achievements High Scores Runtime Data Health Score Combo Counter Class Separation

18 Anti-Pattern: Configuration Classes Classes which extend and only override defaults Configuration should be moved to data class and injected Create new classes only when consuming different data

19 Data Model Shop Item -Key -Name -Price -Icon -Requirements -Costs -Trigger -Effects Shop Group -Key -Name -Items Requirement -Text -LUA Function Effect -Text -LUA Function Trigger -Key Cost -Text -LUA Function -Mutator 1 * 1 * * * * * *

20 Spectrum Virtual Machine Scripted Bindings Domain Specific Language Configuration Files Entirely Hardcoded

21 Over-Engineering Be pragmatic Balance customizability with schedule Don’t reinvent the wheel, use scripting languages

22 Pick one and stick with it LUA, Javascript, Python, many available Make sure you can interop easily Use it as a configuration language too JSON, Lua Pickle Scripting Language

23 Tolua++ Code generation from headers Create regular C++ class Make accessible to LUA LUA Binding

24 enemiesData = CCDictionary:create() -- BOOMER data = BoomerData:create("Boomer1") data:setWeaknessDamageType(DamageType_All) data:setEnemyType(EnemyType_Boomer) data:setImpactType(ImpactType_Explosion) data:setCanBeThrown(true) data:setIndependent(true) data:setSoundPrefix("Boomer") data:addAnimationFile("boomer_animations") data:addAnimationFile("boomer_explode") enemiesData:setObject(data, data:getKey():getCString()) Example

25 function parseNeighbourhood(neighbourhoodDefinition) local neighbourhood = NeighbourhoodData:create(neighbourhoodDefinition.key); neighbourhood:setCollectionMapPosition(neighbourhoodDefinition.collectionMapPosition); neighbourhood:setCollectionTimeMs(neighbourhoodDefinition.collectionTimeMs); neighbourhood:setImagePath(neighbourhoodDefinition.imagePath); neighbourhood:setMapPosition(neighbourhoodDefinition.mapPosition); neighbourhood:setSoundKey(neighbourhoodDefinition.soundKey); neighbourhood:setZOrder(neighbourhoodDefinition.zOrder); if neighbourhoodDefinition.coinReward ~= nil then neighbourhood:setCoinReward(neighbourhoodDefinition.coinReward); end if neighbourhoodDefinition.toothReward ~= nil then neighbourhood:setToothReward(neighbourhoodDefinition.toothReward); end return neighbourhood; end local levels = CCArray:create(); local neighbourhoodDefinitions = loadFileSafe("Scripts/Data/neighbourhoods.lua", {ccc3=ccc3, ccp=ccp}); for key, neighbourhoodDefinition in pairs(neighbourhoodDefinitions) do levels:addObject(parseNeighbourhood(neighbourhoodDefinition)); end Example

26 return { key="Neighbourhood1", collectionMapPosition=ccp(741, 1120), collectionTimeMs=(60 * 60 * 1000), imagePath="Images/UI/Map/map_redlight01.png", mapPosition=ccp(191, 795), soundKey="Env_RedLight", toothReward=1, zOrder=4 }, … } Example

27 Player Data Player data depends on designer data Designer data is expected to change Isolate them from each other Database-style keys

28 Necessary because Apple delivery is slow 1-3 weeks spent in review Android is much better Necessary to keep binary small 50-100MB over-the-air limits Universal apps Downloader

29 Restrictions on downloading executable code No DLLs Scripts a gray zone Bandwidth costs No longer covered by the store Considerations

30 Ability to segment content by Platform Device capabilities Test group Security Data Consistency Requirements

31 Simple HTTP Client JSON Manifest File Package files Cryptographic Signatures Our implementation

32 { "manifest_version": 1, "name": "Big Action Mega Fight", "version": "2", "url": "{...}" "files": [ { "name": "", "url": "", "signature": "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvb…" } ] } Manifest File

33 SHA-1 Hash, signed with private key Public key in game memory Ensures data consistency Ensures data is yours Signatures

34 A/B Testing 1 2A2B 3 50%

35 Always maintain a control group Can test multiple options (not just 2) Need a lot of time to determine winner Some groups will never merge back A/B Testing

36 Have a way to update someone’s save file Format may change Designer data may change Do not risk data loss Unit Testing QA Save File Transformation

37 driven-game-development driven-game-development References

38 Thank You! @dblstallion

Download ppt "Data Driven Development The Technology Behind Live-Ops."

Similar presentations

Ads by Google