modelling game economy with neo4j oredev

Post on 18-Jan-2017

780 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Modelling game economy with Neo4j

Hi, my name is Yan Cuiaka @theburningmonk

noSQL = MongoDB

stolefrom

lovesloves

enemy

enemy A Good Man Goes to War

appeared in

appeared in

appeared in

appeared in

Victory of the Daleks

appeared in

appeared in

companion

companion

enemy appeared in

appeared in

stolefrom

lovesloves

enemy

enemy A Good Man Goes to War

appeared in

appeared in

appeared in

appeared in

Victory of the Daleks

appeared in

appeared in

companion

companion

enemy appeared in

appeared in

planet

prop

species

species

species

character

character

character

episodeepisode

Leonhard Eulerinvented Graph Theory in 1736,

275 years before Edgar Codd formulated the relational model

Seven Bridges of Königsberg

Find a walk through the city that would cross each bridge once and only once.

Seven Bridges of Königsberg

Eliminate features to leave just the land masses and the bridges.

Seven Bridges of Königsberg

Land masses became vertices, and bridges became edges.

location

500+ Spots

locationepisodic

Season 1 London

Season 2 Nan Jing

locationepisodicmulti-player

herebemonstersgame.com

iPad

buddies

locationepisodicmulti-playerRPG

4000 Items

800 Recipes

1500+ Quests

100+ Monsters

gamebalancing

itemPricing

itemPricing

itemPricing

itemPricing

I’ll just change this one thing…

manual game balancing is SLOW

it is REPETITIVE

ERROR-PRONESUBJECTIVE

there must be a better way...

Hello, Neo4jThe rabbit hole sounds pretty good right about now!

BIG

FOO

Tca

tchi

ng

location baitattraction rate

catch rate

as a graph in Neo4j

Bigfoot

Alice Lake

exists_in

Alluring Goat

can_attract

Bigfoot Toenail Clippings

Musket-teer Trap

lootscan_catch

Omar Lake

exists_in

Bigfoot

Alice Lake

exists_in

Alluring Goat

can_attract

Bigfoot Toenail Clippings

Musket-teer Trap

lootscan_catch

Omar Lake

exists_in

Strength = 502Speed = 201Intelligence = 184

Strength = 420Speed = 210Technology = 240

Bigfoot

Alice Lake

exists_in

Alluring Goat

can_attract

Bigfoot Toenail Clippings

Musket-teer Trap

lootscan_catch

Omar Lake

exists_in

CatchRate = 0.774

Bigfoot

Alice Lake

exists_in

Alluring Goat

can_attract

Bigfoot Toenail Clippings

Musket-teer Trap

lootscan_catch

Omar Lake

exists_in

Buy Price = 20BNSell Price = 482 GoldSellable = true…

Bigfoot

Alice Lake

exists_in

Alluring Goat

can_attract

Bigfoot Toenail Clippings

Musket-teer Trap

lootscan_catch

Omar Lake

exists_inDropRate = 0.1

Bigfoot

Alice Lake

exists_in

Alluring Goat

can_attract

Bigfoot Toenail Clippings

Musket-teer Trap

lootscan_catch

Omar Lake

exists_in

BigfootAlice Lake

exists_in

Alluring Goatcan_attract

Bigfoot Toenail Clippings

Musket-teer Trap

loots

can_catch

Omar Lakeexists_

in

Yowie

Yetican_catch

can_catch

Apprentice’s Workshop

can_

mak

e

GoatHoney

Yeti Fur

requires

loots

mak

es

Alluring Goat Recipe

requires requires

Beeswax

loots

Bee Hiveharvests

McDonald’s Farm

sells

loots

Goat’s Milk

harvests

London

exists_in

Peryton Fawn Decoy Recipe

requires

Peryton Fawn Decoy

makes

BigfootAlice Lake

exists_in

Alluring Goatcan_attract

Bigfoot Toenail Clippings

Musket-teer Trap

loots

can_catch

Omar Lakeexists_

in

Yowie

Yetican_catch

can_catch

Apprentice’s Workshop

can_

mak

e

GoatHoney

Yeti Fur

requires

loots

mak

es

Alluring Goat Recipe

requires requires

Beeswax

loots

Bee Hiveharvests

McDonald’s Farm

sells

loots

Goat’s Milk

harvests

London

exists_in

Peryton Fawn Decoy Recipe

requires

Peryton Fawn Decoy

makes

BigfootAlice Lake

exists_in

Alluring Goatcan_attract

Bigfoot Toenail Clippings

Musket-teer Trap

loots

can_catch

Omar Lakeexists_

in

Yowie

Yetican_catch

can_catch

Apprentice’s Workshop

can_

mak

e

GoatHoney

Yeti Fur

requires

loots

mak

es

Alluring Goat Recipe

requires requires

Beeswax

loots

Bee Hiveharvests

McDonald’s Farm

sells

loots

Goat’s Milk

harvests

London

exists_in

Peryton Fawn Decoy Recipe

requires

Peryton Fawn Decoy

makes

BigfootAlice Lake

exists_in

Alluring Goatcan_attract

Bigfoot Toenail Clippings

Musket-teer Trap

loots

can_catch

Omar Lakeexists_

in

Yowie

Yetican_catch

can_catch

Apprentice’s Workshop

can_

mak

e

GoatHoney

Yeti Fur

requires

loots

mak

es

Alluring Goat Recipe

requires requires

Beeswax

loots

Bee Hiveharvests

McDonald’s Farm

sells

loots

Goat’s Milk

harvests

London

exists_in

Peryton Fawn Decoy Recipe

requires

Peryton Fawn Decoy

makes

gamebalancing(revisited)

impact analysis

What’s the impact of upping

the price of “White Bread”?

CRAFTS

RECIPE

ITEMITEM

IS_USED_IN

MATCH

(wb:BaseItem { Name:"White Bread"})

-[rel:CRAFTS | IS_USED_IN*1..]

->(i:BaseItem)

RETURN i, rel, wb

MATCH

(wb:BaseItem { Name:"White Bread"})

-[rel:CRAFTS | IS_USED_IN*1..]

->(i:BaseItem)

RETURN i, rel, wb

Node-[rel]->Node

CRAFTS

RECIPE ITEMITEM

IS_USED_IN

Node-[rel]->Node

MATCH

(wb:BaseItem { Name:"White Bread"})

-[rel:CRAFTS | IS_USED_IN*1..]

->(i:BaseItem)

RETURN i, rel, wb

MATCH

(wb:BaseItem { Name:"White Bread"}) -[rel:CRAFTS | IS_USED_IN*1..]

->(i:BaseItem)

RETURN i, rel, wb

MATCH

(wb:BaseItem { Name:"White Bread"})

-[rel:CRAFTS | IS_USED_IN*1..]

->(i:BaseItem)

RETURN i, rel, wb

MATCH

(wb:BaseItem { Name:"White Bread"})

-[rel:CRAFTS | IS_USED_IN*1..] ->(i:BaseItem)

RETURN i, rel, wb

MATCH

(wb:BaseItem { Name:"White Bread"})

-[rel:CRAFTS | IS_USED_IN*1..]

->(i:BaseItem)

RETURN i, rel, wb

RECIPE

White Bread

IS_USED_IN

ITEM

CRAFTS

MONSTERATTRACTS

RECIPE

IS_USED_IN

ITEMCRAFTS

ITEMLOOTS

RECIPEIS_USED_IN

ITEM

CRAFTS

IS_USED_IN

RECIPEIS_USED_IN

CRAFTS

RECIPE

White Bread

IS_USED_IN

ITEM

CRAFTS

MONSTERATTRACTS

RECIPE

IS_USED_IN

ITEMCRAFTS

ITEMLOOTS

RECIPEIS_USED_IN

ITEM

CRAFTS

IS_USED_IN

RECIPEIS_USED_IN

CRAFTS

MATCH

(wb:BaseItem { Name:"White Bread"})

-[rel:CRAFTS | IS_USED_IN*1..] ->(i:BaseItem)

RETURN i, rel, wb

RECIPE

White Bread

IS_USED_IN

ITEM

CRAFTS

MONSTERATTRACTS

RECIPE

IS_USED_IN

ITEMCRAFTS

ITEMLOOTS

RECIPEIS_USED_IN

ITEM

CRAFTS

IS_USED_IN

RECIPEIS_USED_IN

CRAFTS

RECIPE

White Bread

IS_USED_IN

ITEM

CRAFTS

MONSTERATTRACTS

RECIPE

IS_USED_IN

ITEMCRAFTS

ITEMLOOTS

RECIPEIS_USED_IN

ITEM

CRAFTS

IS_USED_IN

RECIPEIS_USED_IN

CRAFTS

RECIPE

White Bread

IS_USED_IN

ITEM

CRAFTS

MONSTERATTRACTS

RECIPE

IS_USED_IN

ITEMCRAFTS

ITEMLOOTS

RECIPEIS_USED_IN

ITEM

CRAFTS

IS_USED_IN

RECIPEIS_USED_IN

CRAFTS

RECIPE

White Bread

IS_USED_IN

ITEM

CRAFTS

MONSTERATTRACTS

RECIPE

IS_USED_IN

ITEMCRAFTS

ITEMLOOTS

RECIPEIS_USED_IN

ITEM

CRAFTS

IS_USED_IN

RECIPEIS_USED_IN

CRAFTS

scarcity analysis

How scarce is “Durian”

compared to “Dragonfruit”?

EXISTS_IN

FRUIT TREE

SPOTFRUIT

FORAGES

MATCH

(fruit)<-[:FORAGES]-(tree)

-[:EXISTS_IN]->(spot)

WHERE

fruit.Name=‘Durian’ OR

fruit.Name=‘Dragonfruit’

RETURN fruit, tree, spot

MATCH

(fruit)<-[:FORAGES]-(tree)

-[:EXISTS_IN]->(spot)

WHERE

fruit.Name=‘Durian’ OR

fruit.Name=‘Dragonfruit’

RETURN fruit, tree, spot

Node<-[r1]-Node-[r2]->Node

EXISTS_IN

FRUIT TREE SPOTFRUIT

FORAGES

Node<-[r1]-Node-[r2]->Node

MATCH

(fruit)<-[:FORAGES]-(tree)

-[:EXISTS_IN]->(spot)

WHERE

fruit.Name=‘Durian’ OR

fruit.Name=‘Dragonfruit’

RETURN fruit, tree, spot

quest lines

AWARDS

QUEST

ITEMITEM

REQUIRES

UNLOCKS

What quests come after “Year of the Horse”?

MATCH

(q1:Quest { Name: “Year of the Horse” })

-[:UNLOCKS]

->(q2:Quest)

RETURN q1, q2

How do you model quest progression?

1. Price Items

2. Enrich Model

3. “Price” Quests

monster hierarchy

Catch me first.

No, catch ME first.

IS_USED_IN

CAN_ATTRACT

ITEMMONSTER

LOOTS

RECIPE

CRAFTSITEMMONSTER

MATCH

(monster1:Monster)-[:LOOTS]->(loot)

-[r:IS_USED_IN | CRAFTS*0..]->(bait)

-[:CAN_ATTRACT]->(monster2)

RETURN monster1, monster2

MATCH

(monster1:Monster)-[:LOOTS]->(loot)

-[r:IS_USED_IN | CRAFTS*0..]->(bait)

-[:CAN_ATTRACT]->(monster2)

RETURN monster1, monster2

Monster 1Monster 2

Quest 1 Quest 2Unlocks

Unlocks

Monster 1Monster 2

Quest 1 Quest 2Unlocks

Unlocks

Requires Requires

successful catch = loot + gold

∑(Bait Price * Attraction Rate)

Input = Output( ∑(Loot Price * Drop Rate) + Gold )

* Success Rate

IS_USED_IN

CAN_ATTRACT

ITEMMONSTER

LOOTS

RECIPE

CRAFTSITEMMONSTER

NEW monster

= More competitor for bait

= Lower attraction rate for

all monsters

getting data into NEO4J

version control Game Design data

allow multi-user editing

GitFlow- branching strategy for Git - used by all our developers

Publisher- Validate - Localize - Publish

Publisher

Flash iOS Server Neo4j

test data changes in isolation

preview changes on live

auto-tuning trapping stats

genetic algorithms(in F#)

graphdatabases.com

bit.ly/1cmf7h1

@theburningmonktheburningmonk.comgithub.com/theburningmonk

top related