├── code
├── __init__.py
├── agents
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── dynamite.py
│ ├── beekeeper.py
│ ├── priest.py
│ ├── agent.py
│ ├── chemist.py
│ ├── boy.py
│ ├── girl.py
│ ├── humanAgent.py
│ └── bee.py
├── common
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── common.py
│ └── eventlistenerbase.py
├── __init__.pyc
└── utils.py
├── .gitignore
├── .directory
├── .GAME.swp
├── music
└── hang.ogg
├── sounds
├── bee.ogg
├── doh.ogg
├── win.ogg
├── boom.ogg
├── coins.ogg
├── kick.ogg
├── scream.ogg
├── squeak.ogg
├── waves.ogg
├── footstep.ogg
└── explosion.ogg
├── fonts
├── rpgfont.png
└── FreeSans.ttf
├── gui
├── images
│ ├── .directory
│ ├── hb
│ │ ├── .directory
│ │ ├── bg.gif
│ │ ├── fg.gif
│ │ └── frame.png
│ ├── boy.png
│ ├── coins.png
│ ├── flask.png
│ ├── hud_boy.png
│ └── hud_girl.png
└── xml
│ ├── help.xml
│ ├── youLoose.xml
│ ├── scores.xml
│ ├── rootpanel.xml
│ ├── instancemenu.xml
│ ├── life.xml
│ ├── youWin.xml
│ ├── items.xml
│ └── player.xml
├── misc
├── black_cell.png
├── mask_cell.png
├── mask_cell2.png
├── mask_diamond_126_96.png
├── diamond_160x96_template_v01.blend
├── current_rendersetup
│ ├── rendering_setup.blend
│ └── non-animated_object_rendersetup.blend
├── rotation+location_test
│ ├── facing000
│ │ ├── 045r.png
│ │ ├── 135r.png
│ │ ├── 225r.png
│ │ └── 315r.png
│ ├── facing045
│ │ ├── 045r.png
│ │ ├── 135r.png
│ │ ├── 225r.png
│ │ └── 315r.png
│ ├── facing090
│ │ ├── 045r.png
│ │ ├── 135r.png
│ │ ├── 225r.png
│ │ └── 315r.png
│ ├── facing135
│ │ ├── 045r.png
│ │ ├── 135r.png
│ │ ├── 225r.png
│ │ └── 315r.png
│ ├── facing180
│ │ ├── 045r.png
│ │ ├── 135r.png
│ │ ├── 225r.png
│ │ └── 315r.png
│ ├── facing225
│ │ ├── 045r.png
│ │ ├── 135r.png
│ │ ├── 225r.png
│ │ └── 315r.png
│ ├── facing270
│ │ ├── 045r.png
│ │ ├── 135r.png
│ │ ├── 225r.png
│ │ └── 315r.png
│ ├── facing315
│ │ ├── 045r.png
│ │ ├── 135r.png
│ │ ├── 225r.png
│ │ └── 315r.png
│ └── source
│ │ └── deckchair-blue.blend
└── infotext.txt
├── objects
├── askhim.png
├── ground1.png
├── ground2.png
├── items1.png
├── items2.png
├── nature.png
├── buildings.png
├── agents
│ ├── bee
│ │ ├── dead.png
│ │ ├── fall.png
│ │ ├── fly.png
│ │ ├── attack.png
│ │ ├── stand.png
│ │ ├── angry_fly.png
│ │ ├── get_hit.png
│ │ ├── angry_stand.png
│ │ ├── fast_attack.png
│ │ └── object.xml
│ ├── boy
│ │ ├── kick.png
│ │ ├── run.png
│ │ ├── talk.png
│ │ ├── walk.png
│ │ ├── cheer.png
│ │ ├── stand.png
│ │ ├── kick_bottle.png
│ │ ├── kick_bottle.xcf
│ │ ├── run_bottle.png
│ │ ├── run_bottle.xcf
│ │ ├── stand_bottle.png
│ │ ├── stand_bottle.xcf
│ │ └── object.xml
│ ├── girl
│ │ ├── run.png
│ │ ├── stand.png
│ │ ├── talk.png
│ │ ├── walk.png
│ │ └── object.xml
│ ├── chemist
│ │ ├── read.png
│ │ ├── stand.png
│ │ ├── talk.png
│ │ ├── walk.png
│ │ ├── repair.png
│ │ ├── experiment.png
│ │ └── object.xml
│ ├── merchant
│ │ ├── pray.png
│ │ ├── run.png
│ │ ├── talk.png
│ │ ├── stand.png
│ │ └── object.xml
│ ├── beekeeper
│ │ ├── stand.png
│ │ ├── talk.png
│ │ ├── walk.png
│ │ └── object.xml
│ ├── hippie_priest
│ │ ├── fall.png
│ │ ├── read.png
│ │ ├── run.png
│ │ ├── talk.png
│ │ ├── walk.png
│ │ ├── attack.png
│ │ ├── stand.png
│ │ ├── get_hit.png
│ │ ├── cast_spell.png
│ │ └── object.xml
│ ├── tourist_male1
│ │ ├── talk.png
│ │ ├── walk.png
│ │ ├── stand.png
│ │ ├── bend_down.png
│ │ └── object.xml
│ ├── tourist_male2
│ │ ├── run.png
│ │ ├── talk.png
│ │ ├── walk.png
│ │ ├── stand.png
│ │ └── object.xml
│ ├── tourist_female1
│ │ ├── talk.png
│ │ ├── walk.png
│ │ ├── stand.png
│ │ └── object.xml
│ └── tourist_female2
│ │ ├── talk.png
│ │ ├── walk.png
│ │ ├── stand.png
│ │ └── object.xml
├── crates
│ ├── empty_lid
│ │ ├── 045.png
│ │ ├── 090.png
│ │ ├── 135.png
│ │ ├── open.png
│ │ └── object.xml
│ └── dynamites_lid
│ │ ├── 045.png
│ │ ├── 090.png
│ │ ├── 135.png
│ │ ├── open.png
│ │ ├── opened.png
│ │ ├── explode.png
│ │ ├── explode.xcf
│ │ ├── exploded.png
│ │ └── object.xml
├── buildings.xml
├── ground1.xml
├── ground2.xml
├── items2.xml
└── nature.xml
├── game_changes.txt
├── notes
├── .project
├── .settings
└── org.eclipse.core.resources.prefs
├── .pydevproject
├── tools
├── refactor.sh
├── map_summary.sh
└── actors_summary.sh
├── settings-dist.xml
├── LICENSE
├── GAME
└── run.py
/code/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/code/agents/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/code/common/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.pyc
2 | *~
3 |
--------------------------------------------------------------------------------
/.directory:
--------------------------------------------------------------------------------
1 | [Dolphin]
2 | Timestamp=2013,11,10,16,57,10
3 |
--------------------------------------------------------------------------------
/.GAME.swp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/.GAME.swp
--------------------------------------------------------------------------------
/music/hang.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/music/hang.ogg
--------------------------------------------------------------------------------
/sounds/bee.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/sounds/bee.ogg
--------------------------------------------------------------------------------
/sounds/doh.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/sounds/doh.ogg
--------------------------------------------------------------------------------
/sounds/win.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/sounds/win.ogg
--------------------------------------------------------------------------------
/code/__init__.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/code/__init__.pyc
--------------------------------------------------------------------------------
/fonts/rpgfont.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/fonts/rpgfont.png
--------------------------------------------------------------------------------
/gui/images/.directory:
--------------------------------------------------------------------------------
1 | [Dolphin]
2 | PreviewsShown=true
3 | Timestamp=2014,1,7,19,12,46
4 |
--------------------------------------------------------------------------------
/gui/images/hb/.directory:
--------------------------------------------------------------------------------
1 | [Dolphin]
2 | PreviewsShown=true
3 | Timestamp=2014,1,13,15,0,34
4 |
--------------------------------------------------------------------------------
/sounds/boom.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/sounds/boom.ogg
--------------------------------------------------------------------------------
/sounds/coins.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/sounds/coins.ogg
--------------------------------------------------------------------------------
/sounds/kick.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/sounds/kick.ogg
--------------------------------------------------------------------------------
/sounds/scream.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/sounds/scream.ogg
--------------------------------------------------------------------------------
/sounds/squeak.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/sounds/squeak.ogg
--------------------------------------------------------------------------------
/sounds/waves.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/sounds/waves.ogg
--------------------------------------------------------------------------------
/fonts/FreeSans.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/fonts/FreeSans.ttf
--------------------------------------------------------------------------------
/gui/images/boy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/gui/images/boy.png
--------------------------------------------------------------------------------
/misc/black_cell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/black_cell.png
--------------------------------------------------------------------------------
/misc/mask_cell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/mask_cell.png
--------------------------------------------------------------------------------
/misc/mask_cell2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/mask_cell2.png
--------------------------------------------------------------------------------
/objects/askhim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/askhim.png
--------------------------------------------------------------------------------
/objects/ground1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/ground1.png
--------------------------------------------------------------------------------
/objects/ground2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/ground2.png
--------------------------------------------------------------------------------
/objects/items1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/items1.png
--------------------------------------------------------------------------------
/objects/items2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/items2.png
--------------------------------------------------------------------------------
/objects/nature.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/nature.png
--------------------------------------------------------------------------------
/sounds/footstep.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/sounds/footstep.ogg
--------------------------------------------------------------------------------
/gui/images/coins.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/gui/images/coins.png
--------------------------------------------------------------------------------
/gui/images/flask.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/gui/images/flask.png
--------------------------------------------------------------------------------
/gui/images/hb/bg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/gui/images/hb/bg.gif
--------------------------------------------------------------------------------
/gui/images/hb/fg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/gui/images/hb/fg.gif
--------------------------------------------------------------------------------
/gui/images/hud_boy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/gui/images/hud_boy.png
--------------------------------------------------------------------------------
/objects/buildings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/buildings.png
--------------------------------------------------------------------------------
/sounds/explosion.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/sounds/explosion.ogg
--------------------------------------------------------------------------------
/code/agents/__init__.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/code/agents/__init__.pyc
--------------------------------------------------------------------------------
/code/common/__init__.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/code/common/__init__.pyc
--------------------------------------------------------------------------------
/gui/images/hb/frame.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/gui/images/hb/frame.png
--------------------------------------------------------------------------------
/gui/images/hud_girl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/gui/images/hud_girl.png
--------------------------------------------------------------------------------
/objects/agents/bee/dead.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/bee/dead.png
--------------------------------------------------------------------------------
/objects/agents/bee/fall.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/bee/fall.png
--------------------------------------------------------------------------------
/objects/agents/bee/fly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/bee/fly.png
--------------------------------------------------------------------------------
/objects/agents/boy/kick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/boy/kick.png
--------------------------------------------------------------------------------
/objects/agents/boy/run.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/boy/run.png
--------------------------------------------------------------------------------
/objects/agents/boy/talk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/boy/talk.png
--------------------------------------------------------------------------------
/objects/agents/boy/walk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/boy/walk.png
--------------------------------------------------------------------------------
/objects/agents/girl/run.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/girl/run.png
--------------------------------------------------------------------------------
/misc/mask_diamond_126_96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/mask_diamond_126_96.png
--------------------------------------------------------------------------------
/objects/agents/bee/attack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/bee/attack.png
--------------------------------------------------------------------------------
/objects/agents/bee/stand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/bee/stand.png
--------------------------------------------------------------------------------
/objects/agents/boy/cheer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/boy/cheer.png
--------------------------------------------------------------------------------
/objects/agents/boy/stand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/boy/stand.png
--------------------------------------------------------------------------------
/objects/agents/girl/stand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/girl/stand.png
--------------------------------------------------------------------------------
/objects/agents/girl/talk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/girl/talk.png
--------------------------------------------------------------------------------
/objects/agents/girl/walk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/girl/walk.png
--------------------------------------------------------------------------------
/objects/agents/bee/angry_fly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/bee/angry_fly.png
--------------------------------------------------------------------------------
/objects/agents/bee/get_hit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/bee/get_hit.png
--------------------------------------------------------------------------------
/objects/agents/chemist/read.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/chemist/read.png
--------------------------------------------------------------------------------
/objects/agents/chemist/stand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/chemist/stand.png
--------------------------------------------------------------------------------
/objects/agents/chemist/talk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/chemist/talk.png
--------------------------------------------------------------------------------
/objects/agents/chemist/walk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/chemist/walk.png
--------------------------------------------------------------------------------
/objects/agents/merchant/pray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/merchant/pray.png
--------------------------------------------------------------------------------
/objects/agents/merchant/run.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/merchant/run.png
--------------------------------------------------------------------------------
/objects/agents/merchant/talk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/merchant/talk.png
--------------------------------------------------------------------------------
/objects/crates/empty_lid/045.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/crates/empty_lid/045.png
--------------------------------------------------------------------------------
/objects/crates/empty_lid/090.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/crates/empty_lid/090.png
--------------------------------------------------------------------------------
/objects/crates/empty_lid/135.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/crates/empty_lid/135.png
--------------------------------------------------------------------------------
/objects/agents/bee/angry_stand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/bee/angry_stand.png
--------------------------------------------------------------------------------
/objects/agents/bee/fast_attack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/bee/fast_attack.png
--------------------------------------------------------------------------------
/objects/agents/beekeeper/stand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/beekeeper/stand.png
--------------------------------------------------------------------------------
/objects/agents/beekeeper/talk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/beekeeper/talk.png
--------------------------------------------------------------------------------
/objects/agents/beekeeper/walk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/beekeeper/walk.png
--------------------------------------------------------------------------------
/objects/agents/boy/kick_bottle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/boy/kick_bottle.png
--------------------------------------------------------------------------------
/objects/agents/boy/kick_bottle.xcf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/boy/kick_bottle.xcf
--------------------------------------------------------------------------------
/objects/agents/boy/run_bottle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/boy/run_bottle.png
--------------------------------------------------------------------------------
/objects/agents/boy/run_bottle.xcf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/boy/run_bottle.xcf
--------------------------------------------------------------------------------
/objects/agents/chemist/repair.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/chemist/repair.png
--------------------------------------------------------------------------------
/objects/agents/merchant/stand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/merchant/stand.png
--------------------------------------------------------------------------------
/objects/crates/empty_lid/open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/crates/empty_lid/open.png
--------------------------------------------------------------------------------
/game_changes.txt:
--------------------------------------------------------------------------------
1 | GAME CHANGES:
2 | * Switch boy/girl button (with both cameras)
3 | * Moving boy/girl via keyboard (arrows keys)
4 |
--------------------------------------------------------------------------------
/objects/agents/boy/stand_bottle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/boy/stand_bottle.png
--------------------------------------------------------------------------------
/objects/agents/boy/stand_bottle.xcf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/boy/stand_bottle.xcf
--------------------------------------------------------------------------------
/objects/agents/chemist/experiment.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/chemist/experiment.png
--------------------------------------------------------------------------------
/objects/agents/hippie_priest/fall.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/hippie_priest/fall.png
--------------------------------------------------------------------------------
/objects/agents/hippie_priest/read.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/hippie_priest/read.png
--------------------------------------------------------------------------------
/objects/agents/hippie_priest/run.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/hippie_priest/run.png
--------------------------------------------------------------------------------
/objects/agents/hippie_priest/talk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/hippie_priest/talk.png
--------------------------------------------------------------------------------
/objects/agents/hippie_priest/walk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/hippie_priest/walk.png
--------------------------------------------------------------------------------
/objects/agents/tourist_male1/talk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_male1/talk.png
--------------------------------------------------------------------------------
/objects/agents/tourist_male1/walk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_male1/walk.png
--------------------------------------------------------------------------------
/objects/agents/tourist_male2/run.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_male2/run.png
--------------------------------------------------------------------------------
/objects/agents/tourist_male2/talk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_male2/talk.png
--------------------------------------------------------------------------------
/objects/agents/tourist_male2/walk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_male2/walk.png
--------------------------------------------------------------------------------
/objects/crates/dynamites_lid/045.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/crates/dynamites_lid/045.png
--------------------------------------------------------------------------------
/objects/crates/dynamites_lid/090.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/crates/dynamites_lid/090.png
--------------------------------------------------------------------------------
/objects/crates/dynamites_lid/135.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/crates/dynamites_lid/135.png
--------------------------------------------------------------------------------
/objects/crates/dynamites_lid/open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/crates/dynamites_lid/open.png
--------------------------------------------------------------------------------
/gui/xml/help.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/misc/diamond_160x96_template_v01.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/diamond_160x96_template_v01.blend
--------------------------------------------------------------------------------
/objects/agents/hippie_priest/attack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/hippie_priest/attack.png
--------------------------------------------------------------------------------
/objects/agents/hippie_priest/stand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/hippie_priest/stand.png
--------------------------------------------------------------------------------
/objects/agents/tourist_female1/talk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_female1/talk.png
--------------------------------------------------------------------------------
/objects/agents/tourist_female1/walk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_female1/walk.png
--------------------------------------------------------------------------------
/objects/agents/tourist_female2/talk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_female2/talk.png
--------------------------------------------------------------------------------
/objects/agents/tourist_female2/walk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_female2/walk.png
--------------------------------------------------------------------------------
/objects/agents/tourist_male1/stand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_male1/stand.png
--------------------------------------------------------------------------------
/objects/agents/tourist_male2/stand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_male2/stand.png
--------------------------------------------------------------------------------
/objects/crates/dynamites_lid/opened.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/crates/dynamites_lid/opened.png
--------------------------------------------------------------------------------
/objects/agents/hippie_priest/get_hit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/hippie_priest/get_hit.png
--------------------------------------------------------------------------------
/objects/agents/tourist_female1/stand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_female1/stand.png
--------------------------------------------------------------------------------
/objects/agents/tourist_female2/stand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_female2/stand.png
--------------------------------------------------------------------------------
/objects/agents/tourist_male1/bend_down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/tourist_male1/bend_down.png
--------------------------------------------------------------------------------
/objects/crates/dynamites_lid/explode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/crates/dynamites_lid/explode.png
--------------------------------------------------------------------------------
/objects/crates/dynamites_lid/explode.xcf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/crates/dynamites_lid/explode.xcf
--------------------------------------------------------------------------------
/objects/crates/dynamites_lid/exploded.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/crates/dynamites_lid/exploded.png
--------------------------------------------------------------------------------
/gui/xml/youLoose.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/objects/agents/hippie_priest/cast_spell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/objects/agents/hippie_priest/cast_spell.png
--------------------------------------------------------------------------------
/misc/current_rendersetup/rendering_setup.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/current_rendersetup/rendering_setup.blend
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing000/045r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing000/045r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing000/135r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing000/135r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing000/225r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing000/225r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing000/315r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing000/315r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing045/045r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing045/045r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing045/135r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing045/135r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing045/225r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing045/225r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing045/315r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing045/315r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing090/045r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing090/045r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing090/135r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing090/135r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing090/225r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing090/225r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing090/315r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing090/315r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing135/045r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing135/045r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing135/135r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing135/135r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing135/225r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing135/225r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing135/315r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing135/315r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing180/045r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing180/045r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing180/135r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing180/135r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing180/225r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing180/225r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing180/315r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing180/315r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing225/045r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing225/045r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing225/135r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing225/135r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing225/225r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing225/225r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing225/315r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing225/315r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing270/045r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing270/045r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing270/135r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing270/135r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing270/225r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing270/225r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing270/315r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing270/315r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing315/045r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing315/045r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing315/135r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing315/135r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing315/225r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing315/225r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/facing315/315r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/facing315/315r.png
--------------------------------------------------------------------------------
/misc/rotation+location_test/source/deckchair-blue.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/rotation+location_test/source/deckchair-blue.blend
--------------------------------------------------------------------------------
/misc/current_rendersetup/non-animated_object_rendersetup.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fede1024/py-fifengine/master/misc/current_rendersetup/non-animated_object_rendersetup.blend
--------------------------------------------------------------------------------
/gui/xml/scores.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/notes:
--------------------------------------------------------------------------------
1 | self.character_gui.getNamedChildren()['childname']
2 |
3 | Instance.getObject().getId() == 'beekeeper'
4 |
5 | Modifiche:
6 | aggiunto tasto ragazza + cambio camera e azioni, mappato su x
7 | modificata il talk: il main si gira verso l'altro e l'altro parla
--------------------------------------------------------------------------------
/gui/xml/rootpanel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/gui/xml/instancemenu.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/gui/xml/life.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
11 |
--------------------------------------------------------------------------------
/gui/xml/youWin.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | softdev
4 |
5 |
6 |
7 |
8 |
9 | org.python.pydev.PyDevBuilder
10 |
11 |
12 |
13 |
14 |
15 | org.python.pydev.pythonNature
16 |
17 |
18 |
--------------------------------------------------------------------------------
/misc/infotext.txt:
--------------------------------------------------------------------------------
1 | Keybindings:
2 | --------------
3 | - ESC = Quit techdemo
4 |
5 | - C = Toggles coordinates on / off
6 | - F = Enable/Disable fog of war
7 | - O = Rotate main camera
8 | - P = Make screenshot
9 | - R = Reload map (useful for map editing)
10 | - S = Second camera on / off
11 | - T = Toggles grid on / off
12 |
13 | - CTRL + MouseWheelUp = Zoom in
14 | - CTRL + MouseWheelDown = Zoom out
15 | - CTRL + 0, CTRL + Num0 = Reset zoom
16 |
--------------------------------------------------------------------------------
/gui/xml/items.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
11 |
14 |
--------------------------------------------------------------------------------
/.settings/org.eclipse.core.resources.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | encoding//code/agents/agent.py=utf-8
3 | encoding//code/agents/beekeeper.py=utf-8
4 | encoding//code/agents/boy.py=utf-8
5 | encoding//code/agents/chemist.py=utf-8
6 | encoding//code/agents/girl.py=utf-8
7 | encoding//code/agents/humanAgent.py=utf-8
8 | encoding//code/agents/priest.py=utf-8
9 | encoding//code/common/common.py=utf-8
10 | encoding//code/common/eventlistenerbase.py=utf-8
11 | encoding//code/world.py=utf-8
12 |
--------------------------------------------------------------------------------
/gui/xml/player.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
--------------------------------------------------------------------------------
/.pydevproject:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | /${PROJECT_DIR_NAME}
5 |
6 | python 2.7
7 | Default
8 |
9 | /home/federico/tmp/sdproject/engine/python
10 |
11 |
12 |
--------------------------------------------------------------------------------
/tools/refactor.sh:
--------------------------------------------------------------------------------
1 | # This script is a simple refactoring tool to rename the directory
2 | # that contains the application source code.
3 | # The script is invoked passing two parameters: the current name of
4 | # the directory and the new name.
5 | # E.g., ./tools/refactor.sh code sources
6 |
7 | # After the previous execution the "code" directory needs to be renamed
8 | # as "sources". Obviously, several "from" statements in the python source
9 | # files need to be adjusted as well to reflect the change.
10 | # To test if everything is ok, execute the previous command and then try
11 | # to run the game. If it works without raining exceptions, it is ok.
12 |
13 | OLDNAME=$1
14 | NEWNAME=$2
15 |
16 | echo "Renaming $1 to $2"
17 |
18 | # Put here your code
19 |
20 |
--------------------------------------------------------------------------------
/code/utils.py:
--------------------------------------------------------------------------------
1 | from fife.fife import Location
2 |
3 | def moveObject(instance, x=None, y=None, z=None):
4 | location = Location(instance.getLocation())
5 | coords = location.getMapCoordinates()
6 | if x:
7 | coords.x = x
8 | if y:
9 | coords.y = y
10 | if z:
11 | coords.y = z
12 | location.setMapCoordinates(coords)
13 | instance.setLocation(location)
14 |
15 | def moveObjectRelative(instance, x=None, y=None, z=None):
16 | location = Location(instance.getLocation())
17 | coords = location.getMapCoordinates()
18 | if x:
19 | coords.x += x
20 | if y:
21 | coords.y += y
22 | if z:
23 | coords.y += z
24 | location.setMapCoordinates(coords)
25 | instance.setLocation(location)
26 |
27 | def makeDisappear(instance):
28 | moveObject(instance, x=100, y=100)
--------------------------------------------------------------------------------
/tools/map_summary.sh:
--------------------------------------------------------------------------------
1 | # This scripts prints a summary of the objects in the map
2 | # (the map is stored in xml format under /map/shrine.xml)
3 | # The tool is invoked with the map file as parameter
4 |
5 | # By running this tool, the output should be:
6 | # 2449 sands 2
7 | # 2268 water 1
8 | # 361 beach 6
9 | # 306 sign 2
10 | # 267 trees 5
11 | # 193 bushes 5
12 | # 38 rocks 3
13 | # 31 roots 2
14 | # 30 quays 2
15 | # 24 mussels 9
16 | # 23 beebox 1
17 | # 15 empty_lid 1
18 | # 10 bee 1
19 | # 9 starfishes 2
20 | # 3 priest_hut 1
21 | # 2 skull_pole 1
22 | # 2 shrine 1
23 | # 1 hippie_priest 1
24 | # 1 girl 1
25 | # 1 dynamites_lid_broken 1
26 | # 1 chemist 1
27 | # 1 boy 1
28 | # 1 beekeeper 1
29 | # 1 beach_bar 1
30 | #
31 | # Where the first column is the number of elements. The second is the
32 | # object type, and the third is the number of objects subtypes.
33 | # E.g., bushes:05 --> bushes is the name and 05 is the subtype
34 |
35 | MAPFILE=$1
36 |
37 | # Put here your code
38 |
39 |
--------------------------------------------------------------------------------
/objects/crates/empty_lid/object.xml:
--------------------------------------------------------------------------------
1 |
2 |
24 |
--------------------------------------------------------------------------------
/tools/actors_summary.sh:
--------------------------------------------------------------------------------
1 | # This tool should print each actor followed by its actions
2 | # Actors are located under objects/agent and are described by .xml files
3 | # Running this script should print the following output:
4 | # bee: attack, fall, fly, get_hit, stand,
5 | # tourist_male2: run, stand, talk, walk,
6 | # tourist_female1: stand, talk, walk,
7 | # chemist: experiment, read, repair, stand, talk, walk,
8 | # tourist_male1: bend_down, stand, talk, walk,
9 | # girl: run, stand, talk, walk,
10 | # boy: cheer, kick, run, stand, talk, walk,
11 | # beekeeper: stand, talk, walk,
12 | # merchant: pray, run, stand, talk,
13 | # hippie_priest: attack, cast_spell, fall, get_hit, read, run, stand, talk, walk,
14 | # tourist_female2: stand, talk, walk,
15 | #
16 | # The actor id has to be followed by : and each action needs to be separated by
17 | # commas (the comma at the end of the line is not important)
18 | #
19 | # The tool is invoked with the root directory of the agents as first
20 | # parameter. E.g., ./tools/actors_summary.sh objects/agents
21 |
22 | # Put here your code
23 |
24 |
25 |
--------------------------------------------------------------------------------
/code/common/common.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # ####################################################################
4 | # Copyright (C) 2005-2013 by the FIFE team
5 | # http://www.fifengine.net
6 | # This file is part of FIFE.
7 | #
8 | # FIFE is free software; you can redistribute it and/or
9 | # modify it under the terms of the GNU Lesser General Public
10 | # License as published by the Free Software Foundation; either
11 | # version 2.1 of the License, or (at your option) any later version.
12 | #
13 | # This library is distributed in the hope that it will be useful,
14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 | # Lesser General Public License for more details.
17 | #
18 | # You should have received a copy of the GNU Lesser General Public
19 | # License along with this library; if not, write to the
20 | # Free Software Foundation, Inc.,
21 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 | # ####################################################################
23 |
24 | class ProgrammingError(Exception):
25 | pass
26 |
27 | class InitializationError(Exception):
28 | pass
29 |
--------------------------------------------------------------------------------
/objects/agents/tourist_female2/object.xml:
--------------------------------------------------------------------------------
1 |
2 |
39 |
--------------------------------------------------------------------------------
/objects/agents/beekeeper/object.xml:
--------------------------------------------------------------------------------
1 |
2 |
40 |
--------------------------------------------------------------------------------
/objects/agents/tourist_female1/object.xml:
--------------------------------------------------------------------------------
1 |
2 |
40 |
--------------------------------------------------------------------------------
/objects/buildings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
21 |
--------------------------------------------------------------------------------
/objects/agents/girl/object.xml:
--------------------------------------------------------------------------------
1 |
2 |
52 |
--------------------------------------------------------------------------------
/objects/agents/merchant/object.xml:
--------------------------------------------------------------------------------
1 |
2 |
52 |
--------------------------------------------------------------------------------
/objects/agents/tourist_male2/object.xml:
--------------------------------------------------------------------------------
1 |
2 |
52 |
--------------------------------------------------------------------------------
/objects/agents/tourist_male1/object.xml:
--------------------------------------------------------------------------------
1 |
2 |
52 |
--------------------------------------------------------------------------------
/code/agents/dynamite.py:
--------------------------------------------------------------------------------
1 | from agent import Agent
2 |
3 | # Define constants
4 | _STATE_NONE, _STATE_CLOSED, _STATE_OPENED, _STATE_EXPLODED = xrange(4)
5 |
6 | class Dynamite(Agent):
7 |
8 | def __init__(self, settings, model, agentName, layer, soundmanager, uniqInMap=True, bees=[], girl=None):
9 | super(Dynamite, self).__init__(settings, model, agentName, layer, soundmanager, uniqInMap)
10 | self.state = _STATE_CLOSED
11 | self.boy = self.layer.getInstance('PC')
12 | self.sounds = {}
13 | self.sounds['boom'] = self.soundmanager.createSoundEmitter('sounds/boom.ogg', True)
14 | self.sounds['squeak'] = self.soundmanager.createSoundEmitter('sounds/squeak.ogg', True)
15 | self.bees = bees
16 | self.girl = girl
17 | self.exploded = False
18 |
19 | def onInstanceActionFinished(self, instance, action):
20 | super(Dynamite, self).onInstanceActionFinished(instance, action)
21 | if self.state == _STATE_OPENED:
22 | self.agent.actOnce('opened')
23 | elif self.state == _STATE_EXPLODED:
24 | self.agent.actOnce('exploded')
25 | if self.exploded == False:
26 | self.exploded = True
27 | for bee in self.bees:
28 | distance = self.agent.getLocation().getLayerDistanceTo(bee.agent.getLocation())
29 | if distance < 3 and not bee.isDead():
30 | bee.fall()
31 | if self.agent.getLocation().getLayerDistanceTo(self.girl.agent.getLocation()) < 3:
32 | self.girl.getHit(self)
33 |
34 | def onInstanceActionCancelled(self, instance, action):
35 | pass
36 |
37 | def start(self):
38 | pass
39 |
40 | def isClosed(self):
41 | return self.state == _STATE_CLOSED
42 |
43 | # Execute before default doReaction of Agent
44 | def doReaction(self, name, actionAgent, reactionInstance):
45 | if name =="open":
46 | if self.state == _STATE_CLOSED:
47 | self.agent.actOnce('open')
48 | self.sounds['squeak'].play()
49 | self.state = _STATE_OPENED
50 | elif name =="kick":
51 | if self.state == _STATE_OPENED:
52 | self.agent.actOnce('explode')
53 | self.sounds['boom'].play()
54 | self.state = _STATE_EXPLODED
55 | else:
56 | super(Dynamite, self).doReaction(name, actionAgent, reactionInstance)
57 |
--------------------------------------------------------------------------------
/objects/crates/dynamites_lid/object.xml:
--------------------------------------------------------------------------------
1 |
2 |
60 |
--------------------------------------------------------------------------------
/code/common/eventlistenerbase.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # ####################################################################
4 | # Copyright (C) 2005-2013 by the FIFE team
5 | # http://www.fifengine.net
6 | # This file is part of FIFE.
7 | #
8 | # FIFE is free software; you can redistribute it and/or
9 | # modify it under the terms of the GNU Lesser General Public
10 | # License as published by the Free Software Foundation; either
11 | # version 2.1 of the License, or (at your option) any later version.
12 | #
13 | # This library is distributed in the hope that it will be useful,
14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 | # Lesser General Public License for more details.
17 | #
18 | # You should have received a copy of the GNU Lesser General Public
19 | # License along with this library; if not, write to the
20 | # Free Software Foundation, Inc.,
21 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 | # ####################################################################
23 |
24 | from fife import fife
25 | #from fife.extensions import pychan
26 | from fife.extensions.pychan.internal import get_manager
27 |
28 | class EventListenerBase(fife.IKeyListener, fife.ICommandListener, fife.IMouseListener, fife.ConsoleExecuter):
29 | def __init__(self, engine, regKeys=False, regCmd=False, regMouse=False, regConsole=False, regWidget=False):
30 | self.eventmanager = engine.getEventManager()
31 |
32 | fife.IKeyListener.__init__(self)
33 | if regKeys:
34 | self.eventmanager.addKeyListener(self)
35 | fife.ICommandListener.__init__(self)
36 | if regCmd:
37 | self.eventmanager.addCommandListener(self)
38 | fife.IMouseListener.__init__(self)
39 | if regMouse:
40 | self.eventmanager.addMouseListener(self)
41 | fife.ConsoleExecuter.__init__(self)
42 | if regConsole:
43 | get_manager().getConsole().setConsoleExecuter(self)
44 |
45 |
46 | def mousePressed(self, evt):
47 | pass
48 | def mouseReleased(self, evt):
49 | pass
50 | def mouseEntered(self, evt):
51 | pass
52 | def mouseExited(self, evt):
53 | pass
54 | def mouseClicked(self, evt):
55 | pass
56 | def mouseWheelMovedUp(self, evt):
57 | #print "Mounse weel up"
58 | pass
59 | def mouseWheelMovedDown(self, evt):
60 | #print "Mounse weel down"
61 | pass
62 | def mouseMoved(self, evt):
63 | #print "Mouse moved " + str(evt)
64 | pass
65 | def mouseDragged(self, evt):
66 | pass
67 | def keyPressed(self, evt):
68 | pass
69 | def keyReleased(self, evt):
70 | pass
71 | def onCommand(self, command):
72 | pass
73 | def onToolsClick(self):
74 | print "No tools set up yet"
75 | def onConsoleCommand(self, command):
76 | pass
77 | def onWidgetAction(self, evt):
78 | pass
79 |
--------------------------------------------------------------------------------
/objects/agents/chemist/object.xml:
--------------------------------------------------------------------------------
1 |
2 |
76 |
--------------------------------------------------------------------------------
/settings-dist.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | False
5 | True
6 | OpenGL
7 | 1024x768
8 | 0
9 | 5.0
10 | True
11 | False
12 | FIFE - Rio de hola - SoftDev Edition
13 | gui/icons/boy.png
14 | fonts/FreeSans.ttf
15 | abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,!?-+/():;%&`'*#=[]\"
16 | 16
17 | controller
18 | False
19 | True
20 | False
21 | False
22 | False
23 | 1
24 | 0
25 |
26 |
27 |
28 | maps/shrine.xml
29 |
30 | TechdemoMapTileLayer
31 |
32 |
33 | I wonder when the guys will get this world ready for me ; Bring it on baby, I'm ready for action! ; humm di dum....
34 | I'm the hero! ; I want to kick someone! ; Just bee yourself, LOL
35 | Why I am running? Haven't you heard that the bees are coming?! ; Heeelp!!! The bees are going to get us!
36 | Honey! ; Gnam! ; Uuhh!!!
37 | A girl! ; Yeyyy! ; Hi!
38 |
39 | Hi! Be carefull, bees don't like girls! ; Bees loves honey, maybe you can attract them, use this flask! ; The girl is ill, go to the beekeper, he can help. ; You can kill bees, use dynamite boxes.
40 | Did you see those giant bees? ; The chemist did something strange with them. ; The girl is ill? Maybe the chemist can help you. ; Bring him money. ; Here there is some, use the girl to collect coins. ; Ah, the chemist likes honey too!
41 | Do you want me to cure the girl? ; Maybe, first bring me some money! ; Don't forget the honey flask, i love honey. ; You can put things here.
42 |
43 | 0
44 | TechdemoMapTileLayer
45 | 0.5
46 |
47 |
48 |
--------------------------------------------------------------------------------
/code/agents/beekeeper.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # ####################################################################
4 | # Copyright (C) 2005-2013 by the FIFE team
5 | # http://www.fifengine.net
6 | # This file is part of FIFE.
7 | #
8 | # FIFE is free software; you can redistribute it and/or
9 | # modify it under the terms of the GNU Lesser General Public
10 | # License as published by the Free Software Foundation; either
11 | # version 2.1 of the License, or (at your option) any later version.
12 | #
13 | # This library is distributed in the hope that it will be useful,
14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 | # Lesser General Public License for more details.
17 | #
18 | # You should have received a copy of the GNU Lesser General Public
19 | # License along with this library; if not, write to the
20 | # Free Software Foundation, Inc.,
21 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 | # ####################################################################
23 |
24 | from agent import Agent
25 | from fife.extensions.fife_settings import Setting
26 | import random
27 |
28 | TDS = Setting(app_name="rio_de_hola")
29 |
30 | _STATE_NONE, _STATE_IDLE, _STATE_WALK, _STATE_TALK = range(4)
31 |
32 | class Beekeeper(Agent):
33 |
34 | def __init__(self, settings, model, agentName, layer, soundmanager, uniqInMap=True, world = None, looseCallback=None, updateLifeCallback=None):
35 | super(Beekeeper, self).__init__(settings, model, agentName, layer, soundmanager, uniqInMap)
36 | self.kickSound = self.soundmanager.createSoundEmitter('sounds/kick.ogg')
37 | self.world = world
38 | self.reaction = None
39 | self.textCount = 0
40 |
41 | def onInstanceActionFinished(self, instance, action):
42 | #print "Action finished: " + str(action.getId())
43 | if self.state == _STATE_WALK:
44 | if self.reaction:
45 | self.agent.actOnce(self.reaction)
46 | self.reaction = None
47 | self.state = _STATE_IDLE
48 | else:
49 | self.idle()
50 |
51 | super(Beekeeper, self).onInstanceActionFinished(instance, action)
52 |
53 | def onInstanceActionCancelled(self, instance, action):
54 | pass
55 |
56 | def idle(self):
57 | self.state = _STATE_IDLE
58 | self.agent.actOnce('stand')
59 |
60 | def start(self):
61 | self.idle()
62 |
63 | def walk(self, location):
64 | self.state = _STATE_WALK
65 | self.agent.move('walk', location, 6 * self.settings.get("rio", "TestAgentSpeed"))
66 |
67 | def talk(self):
68 | self.state = _STATE_TALK
69 | self.agent.actOnce('talk')
70 |
71 | # Execute before default doReaction of Agent
72 | def doReaction(self, name, actionAgent, reactionInstance):
73 | if name=="talk":
74 | texts = TDS.get("rio", "beekeeperTexts")
75 | reactionInstance.say(texts[self.textCount], 3000)
76 | self.textCount = (self.textCount+1)%len(texts)
77 | #self.agent.move('run', actionAgent.agent.getLocationRef(), 4 * self.settings.get("rio", "TestAgentSpeed")) # Beekeper cannot run
78 | self.walk(actionAgent.agent.getLocationRef())
79 | self.reaction = "talk"
80 | else:
81 | super(Beekeeper, self).doReaction(name, actionAgent, reactionInstance)
82 |
--------------------------------------------------------------------------------
/code/agents/priest.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # ####################################################################
4 | # Copyright (C) 2005-2013 by the FIFE team
5 | # http://www.fifengine.net
6 | # This file is part of FIFE.
7 | #
8 | # FIFE is free software; you can redistribute it and/or
9 | # modify it under the terms of the GNU Lesser General Public
10 | # License as published by the Free Software Foundation; either
11 | # version 2.1 of the License, or (at your option) any later version.
12 | #
13 | # This library is distributed in the hope that it will be useful,
14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 | # Lesser General Public License for more details.
17 | #
18 | # You should have received a copy of the GNU Lesser General Public
19 | # License along with this library; if not, write to the
20 | # Free Software Foundation, Inc.,
21 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 | # ####################################################################
23 |
24 | from agent import Agent
25 | import random
26 | from fife.extensions.fife_settings import Setting
27 |
28 | TDS = Setting(app_name="rio_de_hola")
29 | _STATE_NONE, _STATE_IDLE, _STATE_WALK = xrange(3)
30 |
31 | class Priest(Agent):
32 |
33 | def __init__(self, settings, model, agentName, layer, soundmanager, uniqInMap=True, world = None, looseCallback=None, updateLifeCallback=None):
34 | super(Priest, self).__init__(settings, model, agentName, layer, soundmanager, uniqInMap)
35 | self.kickSound = self.soundmanager.createSoundEmitter('sounds/kick.ogg')
36 | self.world = world
37 | self.reaction = None
38 | self.textCount = 0
39 |
40 | def onInstanceActionFinished(self, instance, action):
41 | #print "Action finished: " + str(action.getId())
42 | if self.state == _STATE_WALK:
43 | if self.reaction:
44 | self.agent.actOnce(self.reaction)
45 | if self.reaction == "attack":
46 | self.kickSound.play()
47 | self.reaction = None
48 | self.state = _STATE_IDLE
49 | else:
50 | self.idle()
51 |
52 | super(Priest, self).onInstanceActionFinished(instance, action)
53 |
54 | def onInstanceActionCancelled(self, instance, action):
55 | pass
56 |
57 | # Execute before default doAction of Agent
58 | def doAction(self, name, reactionInstance, reactionAgent, callback, location=None):
59 | super(Priest, self).doAction(name, reactionInstance, reactionAgent, callback)
60 |
61 | # Execute before default doReaction of Agent
62 | def doReaction(self, name, actionAgent, reactionInstance):
63 | if name=="talk":
64 | priestTexts = TDS.get("rio", "priestTexts")
65 | reactionInstance.say(priestTexts[self.textCount], 3000)
66 | self.textCount = (self.textCount+1)%len(priestTexts)
67 | self.walk(actionAgent.agent.getLocationRef())
68 | self.reaction = "talk"
69 | elif name=="kick":
70 | self.walk(actionAgent.agent.getLocationRef())
71 | reactionInstance.say("AOH!!!", 3000)
72 | self.reaction = "attack"
73 | else:
74 | super(Priest, self).doReaction(name, actionAgent, reactionInstance)
75 |
76 | def walk(self, location):
77 | self.state = _STATE_WALK
78 | self.agent.move('walk', location, 6 * self.settings.get("rio", "TestAgentSpeed"))
79 |
80 | def start(self):
81 | self.idle()
82 |
83 | def idle(self):
84 | self.state = _STATE_IDLE
85 | self.agent.actOnce('stand')
86 |
--------------------------------------------------------------------------------
/code/agents/agent.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # ####################################################################
4 | # Copyright (C) 2005-2013 by the FIFE team
5 | # http://www.fifengine.net
6 | # This file is part of FIFE.
7 | #
8 | # FIFE is free software; you can redistribute it and/or
9 | # modify it under the terms of the GNU Lesser General Public
10 | # License as published by the Free Software Foundation; either
11 | # version 2.1 of the License, or (at your option) any later version.
12 | #
13 | # This library is distributed in the hope that it will be useful,
14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 | # Lesser General Public License for more details.
17 | #
18 | # You should have received a copy of the GNU Lesser General Public
19 | # License along with this library; if not, write to the
20 | # Free Software Foundation, Inc.,
21 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 | # ####################################################################
23 |
24 | from fife import fife
25 | from code.common.common import ProgrammingError
26 | from fife.extensions.fife_settings import Setting
27 | import random
28 |
29 | TDS = Setting(app_name="rio_de_hola")
30 |
31 | # uniqInMap => there is a specific action litener for that agent
32 |
33 | class Agent(fife.InstanceActionListener):
34 | def __init__(self, settings, model, agentName, layer, soundmanager, uniqInMap=True):
35 | fife.InstanceActionListener.__init__(self)
36 | self.settings = settings
37 | self.model = model
38 | self.agentName = agentName
39 | self.layer = layer
40 | self.callbacks = []
41 | self.soundmanager = soundmanager
42 | if uniqInMap:
43 | self.agent = layer.getInstance(agentName)
44 | self.agent.addActionListener(self)
45 |
46 | def onInstanceActionFinished(self, instance, action):
47 | if self.callbacks:
48 | callback = self.callbacks[0] # Call the callback
49 | if callback:
50 | callback()
51 | self.callbacks = self.callbacks[1:] # Remove it from the list
52 |
53 | def onInstanceActionCancelled(self, instance, action):
54 | raise ProgrammingError('No OnActionFinished defined for Agent')
55 |
56 | def onInstanceActionFrame(self, instance, action, frame):
57 | raise ProgrammingError('No OnActionFrame defined for Agent')
58 |
59 | def start(self):
60 | raise ProgrammingError('No start defined for Agent')
61 |
62 | def getActionsList(self, target_instance, target_agent, distance):
63 | return []
64 |
65 | def doAction(self, name, reactionInstance, reactionAgent, callback, location=None):
66 | self.callbacks.append(callback)
67 | print "No action '%s' defined for %s to %s (agent %s)."%(name, self.agentName, \
68 | None if not reactionInstance else reactionInstance.getObject().getId(), \
69 | None if not reactionAgent else reactionAgent.agentName)
70 |
71 | # the "reactionAgent" is yourself of course
72 | def doReaction(self, name, actionAgent, reactionInstance):
73 | if name in ("inspect", "move"):
74 | pass
75 | else:
76 | print "No defined reaction for action '%s' for %s to %s."%(name, self.agentName, actionAgent.agentName)
77 |
78 | # Not unique in map agents
79 | def create_anonymous_agents(settings, model, objectName, layer, agentClass, soundmanager):
80 | agents = []
81 | instances = [a for a in layer.getInstances() if a.getObject().getId() == objectName]
82 | i = 0
83 | for a in instances:
84 | agentName = '%s:i:%d' % (objectName, i)
85 | i += 1
86 | agent = agentClass(settings, model, agentName, layer, soundmanager, False)
87 | agent.agent = a
88 | a.addActionListener(agent)
89 | agents.append(agent)
90 | return agents
91 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | == Audio ==
2 | === Free Sound Project ===
3 | Author :
4 | jobro (http://freesound.iua.upf.edu/usersViewSingle.php?id=35187)
5 | carrigsound (http://freesound.iua.upf.edu/usersViewSingle.php?id=280535)
6 | digifishmusic (http://freesound.iua.upf.edu/usersViewSingle.php?id=29541)
7 |
8 | Website :
9 | http://freesound.iua.upf.edu/
10 |
11 | License :
12 | Creative Commons Sampling Plus 1.0 License.
13 | http://creativecommons.org/licenses/sampling+/1.0/
14 |
15 | Affected files:
16 | sounds/explosion.ogg (http://freesound.iua.upf.edu/samplesViewSingle.php?id=35462)
17 | sounds/footstep.ogg (http://freesound.iua.upf.edu/samplesViewSingle.php?id=32645)
18 | sounds/waves.ogg (http://freesound.iua.upf.edu/usersViewSingle.php?id=29541)
19 |
20 | === torrent71 ===
21 | Author:
22 | Greg M Johnson (http://www.gregmjohnson.com)
23 |
24 | Website:
25 | http://www.gregmjohnson.com/
26 |
27 | License:
28 | Creative Commons Attribution-No derivative works 3.0 Unported
29 | http://creativecommons.org/licenses/by-nd/3.0/
30 |
31 | Affected files:
32 | music/*.ogg
33 |
34 | == Fonts ==
35 | === Ubuntu ===
36 | Author:
37 | Samir Karmacharya (sanir@email.com)
38 |
39 | Download:
40 | http://www.ubuntu.com/
41 |
42 | License:
43 | Public domain
44 | http://packages.debian.org/changelogs/pool/main/t/ttf-indic-fonts/ttf-indic-fonts_0.4.7.4/ttf-devanagari-fonts.copyright
45 |
46 | Affected files:
47 | fonts/samanata.ttf
48 |
49 | === Worldforge ===
50 | Author:
51 | Alistair Riddoch (alriddoch@googlemail.com)
52 |
53 | Website:
54 | http://guichan.sourceforge.net/oldsite/images/rpgfont.png
55 |
56 | License:
57 | GPL 2.0
58 | http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
59 |
60 | Affected files:
61 | fonts/rpgfont.png
62 |
63 | == Graphics ==
64 | === Dauerflucher ===
65 | Author:
66 | Dauerflucher (dauerflucher@gmail.com)
67 |
68 | Website:
69 | http://www.openanno.org
70 |
71 | License:
72 | Creative Commons Attribution-Sharealike 3.0 Unported
73 | http://creativecommons.org/licenses/by-sa/3.0/
74 |
75 | Affected files:
76 | objects/items/beebox/*.png
77 | objects/items/coins/*.png
78 | objects/items/flask/*.png
79 | objects/items/matchbox/*.png
80 | objects/items/shrine/*.png
81 | objects/items/signs/*.png
82 | objects/items/beebox/source/*.blend
83 | objects/items/coins/source/*.blend
84 | objects/items/flask/source/*.blend
85 | objects/items/matchbox/source/*.blend
86 | objects/items/shrine/source/*.blend
87 | objects/items/signs/source/*.blend
88 |
89 | === Kaelis Ebonrai ===
90 |
91 | Author:
92 | Blake "Kaelis Ebonrai" Heatly (knux.econa@gmail.com)
93 |
94 | Website:
95 | http://ebonrai.com/
96 |
97 | License:
98 | GNU GPL 3.0 or Later.
99 | http://www.gnu.org/licenses/gpl-3.0.txt
100 |
101 | Affected files:
102 | objects/items/sanctuary/skull_pole/*.png
103 | objects/items/sanctuary/skull_pole/source/*.7z
104 | objects/items/resort/balls/*/*.png
105 | objects/items/resort/balls/*/source/*.blend
106 | objects/items/resort/deck_chairs/*/*.png
107 | objects/items/resort/deck_chairs/*/source/*.blend
108 | objects/items/resort/life_belts/*/.png
109 | objects/items/resort/life_belts/*/source/*.blend
110 |
111 | === Reiner's tilesets ===
112 | Author:
113 | Reiner Prokein (http://www.reinerstileset.de/)
114 |
115 | Website:
116 | http://reinerstileset.4players.de/
117 |
118 | License:
119 | Custom license
120 | http://reinerstileset.4players.de/readmeE.html#b
121 |
122 | Affected files:
123 | objects/agents/*.png
124 | objects/ground/*.png
125 | objects/items/*.png
126 | objects/nature/*.png
127 |
128 | === Supertux ===
129 | Author:
130 | Supertux team (http://supertux.lethargik.org)
131 |
132 | Website:
133 | http://supertux.lethargik.org/svn/supertux/trunk/media/images/tiles/background/cloud.xcf
134 |
135 | License:
136 | Dual license GPL 3.0 & Creative Commons 3.0 CC-BY_SA
137 | http://www.gnu.org/licenses/gpl-3.0.txt
138 | http://creativecommons.org/licenses/by-sa/3.0/
139 |
140 | Affected files:
141 | objects/clouds/*.png
142 |
143 | === Wulax ===
144 | Author:
145 | Wulax (j.sjolund@gmail.com)
146 |
147 | Website:
148 | none
149 |
150 | License:
151 | Creative Commons Attribution-Sharealike 3.0 Unported
152 | http://creativecommons.org/licenses/by-sa/3.0/
153 |
154 | Affected files:
155 | objects/buildings/beach_bar/*.png
156 |
--------------------------------------------------------------------------------
/code/agents/chemist.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # ####################################################################
4 | # Copyright (C) 2005-2013 by the FIFE team
5 | # http://www.fifengine.net
6 | # This file is part of FIFE.
7 | #
8 | # FIFE is free software; you can redistribute it and/or
9 | # modify it under the terms of the GNU Lesser General Public
10 | # License as published by the Free Software Foundation; either
11 | # version 2.1 of the License, or (at your option) any later version.
12 | #
13 | # This library is distributed in the hope that it will be useful,
14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 | # Lesser General Public License for more details.
17 | #
18 | # You should have received a copy of the GNU Lesser General Public
19 | # License along with this library; if not, write to the
20 | # Free Software Foundation, Inc.,
21 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 | # ####################################################################
23 |
24 | from agent import Agent
25 | import random
26 | from fife.extensions.fife_settings import Setting
27 |
28 | TDS = Setting(app_name="rio_de_hola")
29 | _STATE_NONE, _STATE_IDLE, _STATE_WALK = xrange(3)
30 |
31 | class Chemist(Agent):
32 |
33 | def __init__(self, settings, model, agentName, layer, soundmanager, uniqInMap=True, world = None, winCallback=None, updateLifeCallback=None):
34 | super(Chemist, self).__init__(settings, model, agentName, layer, soundmanager, uniqInMap)
35 | self.kickSound = self.soundmanager.createSoundEmitter('sounds/kick.ogg')
36 | self.world = world
37 | self.reaction = None
38 | self.winCallback = winCallback
39 | self.textCount = 0
40 |
41 | def onInstanceActionFinished(self, instance, action):
42 | #print "Action finished: " + str(action.getId())
43 | if self.state == _STATE_WALK:
44 | if self.reaction:
45 | self.agent.actOnce(self.reaction)
46 | if self.reaction == "attack":
47 | self.kickSound.play()
48 | self.reaction = None
49 | self.state = _STATE_IDLE
50 | else:
51 | self.idle()
52 |
53 | super(Chemist, self).onInstanceActionFinished(instance, action)
54 |
55 | def onInstanceActionCancelled(self, instance, action):
56 | pass
57 |
58 | # Execute before default doAction of Agent
59 | def doAction(self, name, reactionInstance, reactionAgent, callback, location=None):
60 | super(Chemist, self).doAction(name, reactionInstance, reactionAgent, callback)
61 |
62 | # Execute before default doReaction of Agent
63 | def doReaction(self, name, actionAgent, reactionInstance):
64 | if name=="talk":
65 | texts = TDS.get("rio", "chemistTexts")
66 | reactionInstance.say(texts[self.textCount], 3000)
67 | self.textCount = (self.textCount+1)%len(texts)
68 | self.walk(actionAgent.agent.getLocationRef())
69 | self.reaction = "talk"
70 | else:
71 | super(Chemist, self).doReaction(name, actionAgent, reactionInstance)
72 |
73 | def walk(self, location):
74 | self.state = _STATE_WALK
75 | self.agent.move('walk', location, 6 * self.settings.get("rio", "TestAgentSpeed"))
76 |
77 | def start(self):
78 | self.idle()
79 |
80 | def idle(self):
81 | self.state = _STATE_IDLE
82 | self.agent.actOnce('stand')
83 |
84 | def update(self, agentPosition):
85 | chemistInstance = self.agent
86 | chemist = chemistInstance.getLocation()
87 | agentDistance = chemist.getLayerDistanceTo(agentPosition)
88 | if agentDistance > 3.5:
89 | return
90 | flask = self.layer.getInstance('flask0').getLocation()
91 | coins = 0
92 | for i in xrange(3):
93 | coin = self.layer.getInstance('coins'+str(i)).getLocation()
94 | d = chemist.getLayerDistanceTo(coin)
95 | if d < 3.5:
96 | coins = coins+1
97 | fd = chemist.getLayerDistanceTo(flask)
98 | if fd < 3.5:
99 | if coins < 3:
100 | chemistInstance.say("Thanks! Bring more coins.", 3000)
101 | else:
102 | self.winCallback()
103 | else:
104 | if coins < 3:
105 | chemistInstance.say("Thanks! Bring more coins and the honey.", 3000)
106 | else:
107 | chemistInstance.say("Thanks! Bring me the honey.", 3000)
108 |
--------------------------------------------------------------------------------
/code/agents/boy.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # ####################################################################
4 | # Copyright (C) 2005-2013 by the FIFE team
5 | # http://www.fifengine.net
6 | # This file is part of FIFE.
7 | #
8 | # FIFE is free software; you can redistribute it and/or
9 | # modify it under the terms of the GNU Lesser General Public
10 | # License as published by the Free Software Foundation; either
11 | # version 2.1 of the License, or (at your option) any later version.
12 | #
13 | # This library is distributed in the hope that it will be useful,
14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 | # Lesser General Public License for more details.
17 | #
18 | # You should have received a copy of the GNU Lesser General Public
19 | # License along with this library; if not, write to the
20 | # Free Software Foundation, Inc.,
21 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 | # ####################################################################
23 |
24 | from humanAgent import HumanAgent
25 | from fife.extensions.fife_settings import Setting
26 | from code.utils import makeDisappear, moveObject
27 | import random
28 |
29 | TDS = Setting(app_name="rio_de_hola")
30 |
31 | # Define constants
32 | _STATE_KICK, _STATE_RUN = xrange(2)
33 |
34 | class Boy(HumanAgent):
35 |
36 | def __init__(self, settings, model, agentName, layer, soundmanager, uniqInMap=True, world = None):
37 | super(Boy, self).__init__(settings, model, agentName, layer, soundmanager, uniqInMap)
38 | self.kickSound = self.soundmanager.createSoundEmitter('sounds/kick.ogg')
39 | self.bottle = False
40 | self.lay = False
41 | self.world = world
42 | self.speed = 6
43 |
44 | def onInstanceActionFinished(self, instance, action):
45 | #print "Action finished: " + str(action.getId())
46 | if self.lay:
47 | location = self.agent.getLocation()
48 | coords = location.getMapCoordinates()
49 | moveObject(self.bottle, coords.x, coords.y)
50 | self.world.chemist.update(self.agent.getLocation())
51 | self.bottle = None
52 | #self.world.hideItems([0])
53 | self.moveStep('u')
54 | self.lay = False
55 | return
56 |
57 | if action.getId() != 'stand':
58 | self.idlecounter = 1
59 | else:
60 | self.idlecounter += 1
61 | if self.idlecounter % 7 == 0:
62 | heroTexts = self.settings.get("rio", "boyIdleTexts")
63 | txtindex = random.randint(0, len(heroTexts) - 1)
64 | instance.say(heroTexts[txtindex], 2500)
65 | # print "Boy action finished", instance.getObject().getId()
66 | super(Boy, self).onInstanceActionFinished(instance, action)
67 |
68 | def kick(self, target):
69 | self.state = _STATE_KICK
70 | if self.bottle:
71 | self.agent.actOnce('kick_bottle', target)
72 | else:
73 | self.agent.actOnce('kick', target)
74 | self.kickSound.play()
75 |
76 | def getActionsList(self, target_instance, target_agent, distance):
77 | actions = []
78 | if self.bottle and not target_instance:
79 | actions.append('lay')
80 | if target_instance and distance < 1.5:
81 | if target_instance.getObject().getId() == "flask_map":
82 | actions.append('pick');
83 | if target_agent: # If the target is an agent
84 | actions.append('kick');
85 | inherited_actions = super(Boy, self).getActionsList(target_instance, target_agent, distance)
86 | return inherited_actions + actions
87 |
88 | # Execute before default doAction of Agent
89 | def doAction(self, name, reactionInstance, reactionAgent, callback, location=None):
90 | if name == "kick":
91 | self.kick(reactionInstance.getLocation())
92 | self.callbacks.append(callback)
93 | elif name == "pick":
94 | self.bottle = reactionInstance
95 | #self.world.showItems([0])
96 | self.run(self.bottle.getLocation())
97 | makeDisappear(self.bottle)
98 | self.idle()
99 | elif name == "lay":
100 | self.run(location)
101 | self.lay = True
102 | else:
103 | super(Boy, self).doAction(name, reactionInstance, reactionAgent, callback)
104 |
105 | # Execute before default doReaction of Agent
106 | def doReaction(self, name, actionAgent, reactionInstance):
107 | if name=="talk":
108 | texts = TDS.get("rio", "boyTexts")
109 | reactionInstance.say(random.choice(texts), 5000)
110 | self.run(actionAgent.agent.getLocation())
111 | else:
112 | super(Boy, self).doReaction(name, actionAgent, reactionInstance)
--------------------------------------------------------------------------------
/objects/agents/boy/object.xml:
--------------------------------------------------------------------------------
1 |
2 |
112 |
--------------------------------------------------------------------------------
/objects/agents/hippie_priest/object.xml:
--------------------------------------------------------------------------------
1 |
2 |
112 |
--------------------------------------------------------------------------------
/objects/agents/bee/object.xml:
--------------------------------------------------------------------------------
1 |
2 |
112 |
--------------------------------------------------------------------------------
/GAME:
--------------------------------------------------------------------------------
1 | STORYLINE
2 | -------------------------------------------------------------------------------
3 |
4 | The girl is ill because the chemist did some experiments with the bees. To cure
5 | the girl, she needs to bring 3 coins to the chemist and the boy needs to bring
6 | the honey flask. The honey flask can be used to attract the bees near the
7 | dynamite boxes and kill them. The beekeper and the priest can give you
8 | suggestions.
9 |
10 | Only the girl can be killed by the bees (but also with dynamite explosions).
11 |
12 |
13 | CHANGES LIST
14 | -------------------------------------------------------------------------------
15 |
16 | - All mandatory parts (boy/girl switch mapped on key X).
17 |
18 | - Added sound effects and music
19 | You can turn music off and on, and it get stored in preferencies for the next time.
20 |
21 | - Boy
22 | The boy can open dynamite boxes and explode them. Can also catch the honey
23 | flask to attract the bees. The boy can lay the honey wherever he wants, can
24 | move the bees and the girl by kicking them. He can be controlled by the keyboard.
25 |
26 | - Girl
27 | She can just open dynamite boxes to help the boy and take the coins. She has a
28 | life bar associated and life decrease when she is attacked by a bee or get hit
29 | by bombs or by the boy. She can be controlled by the keyboard.
30 |
31 | - Bees
32 | They fly randomly, but they keep track of their starting position and don't move
33 | too far from the initial point. They are attracted by the honey flask (or by the
34 | boy if he is holding the honey flask) and by the girl (the girl has more
35 | priority). They can attack the girl and they die if get hit by a bomb.
36 |
37 | - Chemist
38 | He talks and react when objects are given to him (by laying them down close to
39 | him). The player wins by giving coins and honey to the chemist.
40 |
41 | - Beekeper
42 | He just talks and gives suggestions.
43 |
44 | - Priest
45 | He also talks and kick you back if you kick him.
46 |
47 | - Dynamite
48 | Can be opened and explode with a kick killing all the bees nearby and wounding
49 | the girl (if she is close).
50 |
51 | - Coins
52 | They can be collected and layed down by the giry. There are 3 coins in the map.
53 |
54 | - Items bar
55 | There is a bar on the left (transparent) that contains all collected objects.
56 | New collected objects are added with through an animation.
57 |
58 | - Healt bar
59 | In the top right corner (automatically adjusted based on window size) there is
60 | the girl health bar. When it get to zero (all red) the girl is died and the
61 | player loose.
62 |
63 | - Win and lose windows
64 | They inform the user that he won/loose the game. In the win window tha user can
65 | insert his name that get stored online.
66 |
67 | - Boy/girl keyboard control
68 | Is possible to move the boy and the girl with the arrows.
69 |
70 | HOW THINGS WORK
71 | -------------------------------------------------------------------------------
72 |
73 | Action/reaction model:
74 | Instead of putting everithing in the world.py function, each agent has it's own
75 | code. Each agent has the doAction and doReaction functions, HumanAgents (Boy and
76 | Girl) also have getActionList function.
77 |
78 | Agent
79 | / \
80 | / \
81 | HumanAgent \
82 | / \ |--Bee `\
83 | Boy Girl |--Dynamyte |__ Those 4 inherit directly from Agent
84 | |--Chemist |
85 | |--Priest ./
86 |
87 | getActionList returns a list of actions available for that agent to a specific
88 | instance (eg. getActionList for boy to bee = ['kick' 'talk' 'inspect' ...]). Those
89 | options get shown in the instanceMenu. When clicked, the function
90 | doAction('actionName', ..., callback) is called for the actor that performed the
91 | action. It takes also a callback function that will be performed on the action
92 | target. Usually that callback function is the doReaction of the target. The
93 | callback is performed when the first action is completed.
94 |
95 | Example: exploding a dynamite with a kick
96 |
97 | User is controlling the boy and click into a dynamite box:
98 | boy.getActions(dynInstance) -> ['kick', ...] -> show instance menu.
99 | User click on 'kick':
100 | def callback():
101 | dynAgent.doReaction('kick', ...)
102 | boy.doAction('talk', dynInstance, ... , callback)
103 |
104 | When the action is finished the callback is executed, and the dynamite
105 | explodes. In this way is easyer to add more functionalities to agents and to
106 | execute code when the action is finished.
107 |
108 | Girl and boy classes inherits from HumanAgent, and they share some code, for
109 | example to talk, to inspect and to be driven by the keyboard.
110 |
111 | ONLINE RECORD STORAGE
112 | -------------------------------------------------------------------------------
113 |
114 | There is a very simple online web service hosted on heroku (code in the server
115 | folder) that connects to a mongodb server. Basically, the server will store all
116 | the json objects pushed with a POST request, and will return them back with a
117 | GET request.
118 |
119 | The score is saved at the end of the game, and can be seen with the "scores"
120 | button.
121 |
--------------------------------------------------------------------------------
/code/agents/girl.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # ####################################################################
4 | # Copyright (C) 2005-2013 by the FIFE team
5 | # http://www.fifengine.net
6 | # This file is part of FIFE.
7 | #
8 | # FIFE is free software; you can redistribute it and/or
9 | # modify it under the terms of the GNU Lesser General Public
10 | # License as published by the Free Software Foundation; either
11 | # version 2.1 of the License, or (at your option) any later version.
12 | #
13 | # This library is distributed in the hope that it will be useful,
14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 | # Lesser General Public License for more details.
17 | #
18 | # You should have received a copy of the GNU Lesser General Public
19 | # License along with this library; if not, write to the
20 | # Free Software Foundation, Inc.,
21 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 | # ####################################################################
23 |
24 | from humanAgent import HumanAgent
25 | import random
26 | from fife.extensions.fife_settings import Setting
27 | from fife.fife import Location
28 | from code.utils import makeDisappear, moveObject
29 |
30 | TDS = Setting(app_name="rio_de_hola")
31 |
32 | class Girl(HumanAgent):
33 |
34 | def __init__(self, settings, model, agentName, layer, soundmanager, uniqInMap=True, world = None, looseCallback=None, updateLifeCallback=None):
35 | super(Girl, self).__init__(settings, model, agentName, layer, soundmanager, uniqInMap)
36 | self.screamSound = self.soundmanager.createSoundEmitter('sounds/scream.ogg')
37 | self.coinsSound = self.soundmanager.createSoundEmitter('sounds/coins.ogg')
38 | self.dead = False
39 | self.coins = []
40 | self.world = world
41 | self.lay = False
42 | self.looseCallback = looseCallback
43 | self.updateLifeCallback = updateLifeCallback
44 | self.life = 100
45 |
46 | def onInstanceActionFinished(self, instance, action):
47 | #print "Action finished: " + str(action.getId())
48 | if self.lay:
49 | location = self.agent.getLocation()
50 | coords = location.getMapCoordinates()
51 | moveObject(self.coins[0], coords.x, coords.y)
52 | self.coinsSound.play()
53 | self.world.chemist.update(self.agent.getLocation())
54 | #self.world.hideItems([len(self.coins)])
55 | self.coins = self.coins[1:]
56 | self.moveStep('u')
57 | self.lay = False
58 | return
59 |
60 | super(Girl, self).onInstanceActionFinished(instance, action)
61 |
62 | def getActionsList(self, target_instance, target_agent, distance):
63 | actions = []
64 | if self.coins and not target_instance:
65 | actions.append('lay')
66 | if target_instance and distance < 1.5:
67 | if target_instance.getObject().getId() == "coins_map":
68 | actions.append('pick');
69 | inherited_actions = super(Girl, self).getActionsList(target_instance, target_agent, distance)
70 | return inherited_actions + actions
71 |
72 | # Execute before default doAction of Agent
73 | def doAction(self, name, reactionInstance, reactionAgent, callback, location=None):
74 | if name == "pick":
75 | coin = reactionInstance
76 | self.coins.append(coin)
77 | #self.world.showItems([n for n in xrange(1, len(self.coins)+1)])
78 | self.run(coin.getLocation())
79 | makeDisappear(coin)
80 | self.coinsSound.play()
81 | self.idle()
82 | elif name == "lay":
83 | self.run(location)
84 | self.lay = True
85 | else:
86 | super(Girl, self).doAction(name, reactionInstance, reactionAgent, callback)
87 |
88 | # Execute before default doReaction of Agent
89 | def doReaction(self, name, actionAgent, reactionInstance):
90 | if name=="talk":
91 | girlTexts = TDS.get("rio", "girlTexts")
92 | reactionInstance.say(random.choice(girlTexts), 5000)
93 | self.run(actionAgent.agent.getLocationRef())
94 | elif name=="kick" or name=='hit':
95 | if name=='kick':
96 | self.agent.say("Hey!!!", 3500)
97 | else:
98 | self.agent.say("Damn!!!", 3500)
99 | self.updateLife()
100 | self.screamSound.play()
101 | location = self.agent.getLocationRef()
102 | my_coords = location.getMapCoordinates()
103 | his_coords = actionAgent.agent.getLocationRef().getMapCoordinates()
104 | dx = my_coords.x - his_coords.x
105 | dy = my_coords.y - his_coords.y
106 | nl = Location(location)
107 | my_coords.x += dx
108 | my_coords.y += dy
109 | nl.setMapCoordinates(my_coords)
110 | self.run(nl)
111 | else:
112 | super(Girl, self).doReaction(name, actionAgent, reactionInstance)
113 |
114 | def getHit(self, instance):
115 | if self.dead:
116 | return
117 | self.doReaction('hit', instance, self.agent)
118 |
119 | def updateLife(self):
120 | self.life -= 10
121 | self.updateLifeCallback(self.life)
122 | if self.life <= 0:
123 | self.die()
124 |
125 | def die(self):
126 | if not self.dead:
127 | self.footSound.stop()
128 | #self.screamSound.play()
129 | self.dead = True
130 | self.looseCallback()
131 | self.idle()
132 |
--------------------------------------------------------------------------------
/objects/ground1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
40 |
41 |
47 |
53 |
59 |
65 |
71 |
77 |
78 |
81 |
82 |
85 |
88 |
91 |
94 |
97 |
98 |
101 |
102 |
105 |
108 |
109 |
112 |
113 |
116 |
--------------------------------------------------------------------------------
/code/agents/humanAgent.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # ####################################################################
4 | # Copyright (C) 2005-2013 by the FIFE team
5 | # http://www.fifengine.net
6 | # This file is part of FIFE.
7 | #
8 | # FIFE is free software; you can redistribute it and/or
9 | # modify it under the terms of the GNU Lesser General Public
10 | # License as published by the Free Software Foundation; either
11 | # version 2.1 of the License, or (at your option) any later version.
12 | #
13 | # This library is distributed in the hope that it will be useful,
14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 | # Lesser General Public License for more details.
17 | #
18 | # You should have received a copy of the GNU Lesser General Public
19 | # License along with this library; if not, write to the
20 | # Free Software Foundation, Inc.,
21 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 | # ####################################################################
23 |
24 | from agent import Agent
25 | from fife import fife
26 | from fife.fife import Location
27 |
28 | # Define constants
29 | _STATE_NONE, _STATE_IDLE, _STATE_RUN, _STATE_KICK, _STATE_TALK = xrange(5)
30 |
31 | class HumanAgent(Agent):
32 | """ This class specify a general agent that can be controlled by the user """
33 | def __init__(self, settings, model, agentName, layer, soundmanager, uniqInMap=True):
34 | super(HumanAgent, self).__init__(settings, model, agentName, layer, soundmanager, uniqInMap)
35 | self.state = _STATE_NONE
36 | self.idlecounter = 1
37 | self.bottle = False
38 | self.footSound = self.soundmanager.createSoundEmitter('sounds/footstep.ogg')
39 | self.footSound.looping = True
40 | self.speed = 5
41 |
42 | def onInstanceActionFinished(self, instance, action):
43 | self.idle()
44 | # print "Human action finished", instance.getObject().getId()
45 | super(HumanAgent, self).onInstanceActionFinished(instance, action)
46 |
47 | def onInstanceActionCancelled(self, instance, action):
48 | pass
49 |
50 | def start(self):
51 | self.idle()
52 |
53 | def idle(self):
54 | self.state = _STATE_IDLE
55 | if self.bottle:
56 | self.agent.actOnce('stand_bottle')
57 | else:
58 | self.agent.actOnce('stand')
59 | self.footSound.stop()
60 |
61 | def run(self, location):
62 | if self.state != _STATE_RUN:
63 | self.footSound.play()
64 | self.state = _STATE_RUN
65 | if self.bottle:
66 | self.agent.move('run_bottle', location, self.speed * self.settings.get("rio", "TestAgentSpeed"))
67 | else:
68 | self.agent.move('run', location, self.speed * self.settings.get("rio", "TestAgentSpeed"))
69 |
70 | def talk(self, target):
71 | self.state = _STATE_TALK
72 | self.idlecounter = 1
73 | self.agent.actOnce('talk', target)
74 |
75 | def keyPressed(self, keyval):
76 | if keyval in (fife.Key.LEFT, fife.Key.RIGHT, fife.Key.UP, fife.Key.DOWN):
77 | self.moveStep({fife.Key.LEFT:'l', fife.Key.RIGHT:'r', fife.Key.UP:'u', fife.Key.DOWN:'d'}[keyval])
78 |
79 | def moveStep(self, direction):
80 | location = self.agent.getLocationRef()
81 | coords = location.getMapCoordinates()
82 | rot = self.agent.getRotation()
83 |
84 | if direction == 'l':
85 | rot = (rot+45)%360
86 | self.idle()
87 | self.agent.setRotation(rot)
88 | elif direction == 'r':
89 | rot = (rot-45)%360
90 | self.idle()
91 | self.agent.setRotation(rot)
92 | elif direction == 'd':
93 | rot = (rot+180)%360
94 | self.idle()
95 | self.agent.setRotation(rot)
96 | elif direction == 'u':
97 | if(0 <= rot < 23 or rot >= 338):
98 | coords.x += +0.5
99 | elif (23 <= rot < 68):
100 | coords.x += +0.5
101 | coords.y += -0.5
102 | elif (68 <= rot < 113):
103 | coords.y += -0.5
104 | elif (113 <= rot < 158):
105 | coords.x += -0.5
106 | coords.y += -0.5
107 | elif (158 <= rot < 203):
108 | coords.x += -0.5
109 | elif (203 <= rot < 248):
110 | coords.x += -0.5
111 | coords.y += +0.5
112 | elif (248 <= rot < 293):
113 | coords.y += +0.5
114 | elif (293 <= rot < 338):
115 | coords.x += +0.5
116 | coords.y += +0.5
117 | nl = Location(location)
118 | nl.setMapCoordinates(coords)
119 | self.run(nl)
120 |
121 | def getActionsList(self, target_instance, target_agent, distance):
122 | actions = []
123 | if target_instance:
124 | actions.append('inspect')
125 | if distance > 1.5:
126 | actions.append('move')
127 | else:
128 | if target_agent: # If the target is an agent
129 | if target_agent.agent.getObject().getId() != "dynamites_lid":
130 | actions.append('talk');
131 | elif target_agent.isClosed():
132 | actions.append('open');
133 | inherited_actions = super(HumanAgent, self).getActionsList(target_instance, target_agent, distance)
134 | return inherited_actions + actions
135 |
136 | # Execute before default doAction of Agent
137 | def doAction(self, name, reactionInstance, reactionAgent, callback, location=None):
138 | if name=="inspect":
139 | saytext = []
140 | saytext.append('%s' % reactionInstance.getObject().getId())
141 | location = reactionInstance.getLocationRef()
142 | coords = location.getMapCoordinates()
143 | saytext.append('(%d, %d)' %(coords.x, coords.y))
144 | self.agent.say('\n'.join(saytext), 3500)
145 | elif name in ("move", "talk", "open"):
146 | print reactionInstance, reactionInstance.getLocationRef()
147 | self.run(reactionInstance.getLocationRef())
148 | self.callbacks.append(callback)
149 | else:
150 | super(HumanAgent, self).doAction(name, reactionInstance, reactionAgent, callback)
151 |
--------------------------------------------------------------------------------
/code/agents/bee.py:
--------------------------------------------------------------------------------
1 | from agent import Agent
2 | from fife.extensions.fife_settings import Setting
3 | from fife.fife import Location
4 | from code.utils import moveObjectRelative
5 | import random, math
6 | import exceptions
7 |
8 | TDS = Setting(app_name="rio_de_hola")
9 |
10 | # Define constants
11 | _STATE_NONE, _STATE_IDLE, _STATE_FLY, _STATE_FOLLOW, _STATE_DEAD, _STATE_ATTACK = xrange(6)
12 |
13 | class Bee(Agent):
14 |
15 | def __init__(self, settings, model, agentName, layer, soundmanager, uniqInMap=True, girl=None):
16 | super(Bee, self).__init__(settings, model, agentName, layer, soundmanager, uniqInMap)
17 | self.state = _STATE_IDLE
18 | self.idlecounter = 1
19 | location = self.agent.getLocation()
20 | self.initial_coords = location.getMapCoordinates()
21 | self.followed = None
22 | #self.boy = self.layer.getInstance('PC')
23 | self.girl = girl
24 | self.beeHoneyTexts = TDS.get("rio", "beeHoneyTexts")
25 | self.beeGirlTexts = TDS.get("rio", "beeGirlTexts")
26 |
27 | def onInstanceActionFinished(self, instance, action):
28 | if self.state == _STATE_DEAD:
29 | self.agent.actOnce('dead')
30 | return
31 |
32 | if self.followed:
33 | self.idlecounter = 1
34 | #self.idle()
35 | self.follow(self.followed)
36 | else:
37 | if self.idlecounter % 3 == 0:
38 | self.randomMove()
39 | self.idlecounter = 1
40 | else:
41 | self.idle()
42 |
43 | if action.getId() not in ('stand'):
44 | self.idlecounter = 1
45 | else:
46 | self.idlecounter += 1
47 |
48 | super(Bee, self).onInstanceActionFinished(instance, action)
49 |
50 | def onInstanceActionCancelled(self, instance, action):
51 | #print "CANC"
52 | pass
53 |
54 | def start(self):
55 | self.idle()
56 |
57 | def idle(self):
58 | self.state = _STATE_IDLE
59 | self.agent.actOnce('stand')
60 |
61 | def fly(self, location):
62 | self.state = _STATE_FLY
63 | self.idlecounter = 1
64 | try:
65 | self.agent.move('fly', location, 6 * self.settings.get("rio", "TestAgentSpeed"))
66 | except exceptions.RuntimeError, e:
67 | print "That appens somethimes, when you move an object in the exactly same moments that another agent (a bee in this case)\
68 | moves to that object. With a try/catch it doesn't crashes the whole game. Error: ", e
69 | pass
70 |
71 | def followAction(self, instance):
72 | self.state = _STATE_FLY
73 | self.idlecounter = 1
74 | try:
75 | self.agent.follow('fly', instance, 6 * self.settings.get("rio", "TestAgentSpeed"))
76 | except exceptions.RuntimeError, e:
77 | print "That appens somethimes, when you move an object in the exactly same moments that another agent (a bee in this case)\
78 | moves to that object. With a try/catch it doesn't crashes the whole game. Error: ", e
79 | pass
80 |
81 | def attack(self):
82 | self.state = _STATE_ATTACK
83 | self.idlecounter = 1
84 | self.agent.actOnce('fast_attack')
85 |
86 | def fall(self):
87 | self.state = _STATE_DEAD
88 | self.agent.actOnce('fall')
89 | moveObjectRelative(self.agent, z=-0.01)
90 |
91 | # Execute before default doReaction of Agent
92 | def doReaction(self, name, actionAgent, reactionInstance):
93 | if self.isDead():
94 | pass
95 | elif name=="talk":
96 | reactionInstance.say("BZZZZZZZ", 5000)
97 | self.fly(actionAgent.agent.getLocation())
98 | elif name=="kick":
99 | location = self.agent.getLocation()
100 | my_coords = location.getMapCoordinates()
101 | his_coords = actionAgent.agent.getLocation().getMapCoordinates()
102 | dx = my_coords.x - his_coords.x
103 | dy = my_coords.y - his_coords.y
104 | dist = math.sqrt(dx*dx + dy*dy)
105 | if (dist < 1):
106 | self.agent.say("BZZ!!!", 3500)
107 | self.soundmanager.createSoundEmitter('sounds/bee.ogg', True, tuple).play()
108 | nl = Location(location)
109 | my_coords.x += dx*2
110 | my_coords.y += dy*2
111 | nl.setMapCoordinates(my_coords)
112 | self.fly(nl)
113 | else:
114 | self.agent.say("You missed me :P", 3500)
115 | else:
116 | super(Bee, self).doReaction(name, actionAgent, reactionInstance)
117 |
118 | def randomMove(self):
119 | location = self.agent.getLocation()
120 | coords = location.getMapCoordinates()
121 | dx = coords.x - self.initial_coords.x
122 | dy = coords.y - self.initial_coords.y
123 | dist = math.sqrt(dx*dx + dy*dy)
124 | if (dist < 4):
125 | coords.x += random.uniform(-2, 2)
126 | coords.y += random.uniform(-2, 2)
127 | else:
128 | coords.x -= (dx/dist) * random.uniform(0, 2)
129 | coords.y -= (dy/dist) * random.uniform(0, 2)
130 | nl = Location(location)
131 | nl.setMapCoordinates(coords)
132 | self.fly(nl)
133 |
134 | def follow(self, instance):
135 | if instance:
136 | target_distance = self.agent.getLocation().getLayerDistanceTo(instance.getLocation())
137 | if target_distance > 1.5:
138 | if self.state != _STATE_FOLLOW:
139 | if instance == self.girl.agent:
140 | self.agent.say(random.choice(self.beeGirlTexts), 1000)
141 | else:
142 | self.agent.say(random.choice(self.beeHoneyTexts), 1000)
143 | if self.state != _STATE_FOLLOW:
144 | self.followAction(instance)
145 | #self.fly(instance.getLocation())
146 | #print instance, instance.getLocation(), instance.getLocation().getMapCoordinates()
147 | self.state = _STATE_FOLLOW
148 | else:
149 | self.idle()
150 | #self.agent.follow('angry_fly', instance, 3 * self.settings.get("rio", "TestAgentSpeed"))
151 | else:
152 | if instance == self.girl.agent and not self.girl.dead:
153 | self.attack()
154 | #self.girl.die()
155 | self.girl.getHit(self)
156 | else:
157 | #rot = self.agent.getRotation()
158 | #rot = (rot+20)%360
159 | #self.agent.setRotation(rot)
160 | self.idle()
161 |
162 | def isIdle(self):
163 | return self.state == _STATE_IDLE
164 |
165 | def isDead(self):
166 | return self.state == _STATE_DEAD
167 |
168 | def isAttacking(self):
169 | return self.state == _STATE_ATTACK
--------------------------------------------------------------------------------
/objects/ground2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
55 |
61 |
67 |
73 |
79 |
85 |
91 |
97 |
103 |
109 |
115 |
116 |
--------------------------------------------------------------------------------
/objects/items2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
59 |
69 |
79 |
89 |
99 |
--------------------------------------------------------------------------------
/run.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | # -*- coding: utf-8 -*-
4 |
5 | # ####################################################################
6 | # Copyright (C) 2005-2013 by the FIFE team
7 | # http://www.fifengine.net
8 | # This file is part of FIFE.
9 | #
10 | # FIFE is free software; you can redistribute it and/or
11 | # modify it under the terms of the GNU Lesser General Public
12 | # License as published by the Free Software Foundation; either
13 | # version 2.1 of the License, or (at your option) any later version.
14 | #
15 | # This library is distributed in the hope that it will be useful,
16 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 | # Lesser General Public License for more details.
19 | #
20 | # You should have received a copy of the GNU Lesser General Public
21 | # License along with this library; if not, write to the
22 | # Free Software Foundation, Inc.,
23 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 | # ####################################################################
25 | # This is the rio de hola client for FIFE.
26 |
27 | from __future__ import division
28 | from threading import Thread
29 | import sys, os, json, urllib, urllib2
30 | import getpass
31 |
32 | fife_path = os.path.join('..','..','engine','python')
33 |
34 | if getpass.getuser() =="federico":
35 | fife_path = os.path.join('/home','federico','tmp','sdproject','engine','python')
36 |
37 | print "Importing fife from: "
38 | print fife_path
39 | if os.path.isdir(fife_path) and fife_path not in sys.path:
40 | sys.path.insert(0,fife_path)
41 |
42 | from fife import fife
43 | print "Using the FIFE python module found here: ", os.path.dirname(fife.__file__)
44 |
45 | from fife.extensions import *
46 | from code import world
47 | from code.common import eventlistenerbase
48 | from fife.extensions import pychan
49 | from fife.extensions.pychan.pychanbasicapplication import PychanApplicationBase
50 | from fife.extensions.pychan.fife_pychansettings import FifePychanSettings
51 | from fife.extensions.fife_utils import getUserDataDirectory
52 |
53 | import datetime
54 |
55 | TDS = FifePychanSettings(app_name="rio_de_hola")
56 |
57 | class ApplicationListener(eventlistenerbase.EventListenerBase):
58 | def __init__(self, engine, world):
59 | super(ApplicationListener, self).__init__(engine,regKeys=True,regCmd=True, regMouse=False, regConsole=False, regWidget=True)
60 | # super(ApplicationListener, self).__init__(engine,regKeys=True,regCmd=True, regMouse=True, regConsole=False, regWidget=True)
61 | self.engine = engine
62 | self.world = world
63 | self.world.gui = self
64 | engine.getEventManager().setNonConsumableKeys([fife.Key.ESCAPE,])
65 |
66 | self.startTime = datetime.datetime.now()
67 |
68 | self.quit = False
69 | self.window = None
70 | self.youLooseWindow = None
71 | self.youWinWindow = None
72 |
73 | self.rootpanel = pychan.loadXML('gui/xml/rootpanel.xml')
74 | self.rootpanel.mapEvents({
75 | 'quitButton' : self.onQuitButtonPress,
76 | 'aboutButton' : self.onAboutButtonPress,
77 | 'optionsButton' : TDS.showSettingsDialog,
78 | 'scoresButton' : self.onScoresButtonPress,
79 | 'soundButton' : self.onSoundButtonPress
80 | })
81 | button = self.rootpanel.getNamedChildren()['soundButton'][0]
82 | if int(TDS.get("FIFE", "PlaySounds")):
83 | button.text = unicode("Music: ON", "utf-8")
84 | else:
85 | button.text = unicode("Music: OFF", "utf-8")
86 | self.rootpanel.show()
87 |
88 | self.character_gui = pychan.loadXML('gui/xml/player.xml')
89 | self.character_gui.mapEvents({
90 | 'boy' : self.onBoyButtonPress,
91 | 'girl' : self.onGirlButtonPress
92 | })
93 | self.boyButton = self.character_gui.getNamedChildren()['boy'][0]
94 | self.girlButton = self.character_gui.getNamedChildren()['girl'][0]
95 | self.character_gui.show()
96 | self.girlButton.hide()
97 |
98 | self.itemsContainer = pychan.loadXML('gui/xml/items.xml')
99 | self.itemsImages = []
100 | self.itemsImages.append(self.itemsContainer.getNamedChildren()['flask'][0])
101 | self.itemsImages.append(self.itemsContainer.getNamedChildren()['coins1'][0])
102 | self.itemsImages.append(self.itemsContainer.getNamedChildren()['coins2'][0])
103 | self.itemsImages.append(self.itemsContainer.getNamedChildren()['coins3'][0])
104 | #self.itemsImages.append(self.itemsContainer.getNamedChildren()['coins3'][0])
105 | self.itemsContainer.show()
106 | #for x in self.itemsImages:
107 | # x.hide()
108 |
109 | # Adjust healthBar position based on resolution
110 | self.healthBar = pychan.loadXML('gui/xml/life.xml')
111 | self.healthImage = self.healthBar.getNamedChildren()['fg'][0]
112 | self.healthBar.show()
113 | size = TDS.get("FIFE", "ScreenResolution")
114 | self.healthBar.x = int(size.split('x')[0]) - 266 - 5
115 |
116 | # wakes up heroku server
117 | req_time = datetime.datetime.now()
118 | def callback(r):
119 | resp_time = datetime.datetime.now()
120 | print "Server up in %s seconds\n"%(str(resp_time-req_time)[5:11])
121 | asyncDownloadScore(callback)
122 |
123 | def girlLifeUpdate(self, life):
124 | length = 199/100*life
125 | self.healthImage.width = int(length)
126 |
127 | def keyPressed(self, evt):
128 | if self.world.girl.dead:
129 | return
130 | keyval = evt.getKey().getValue()
131 | keystr = evt.getKey().getAsString().lower()
132 | if keyval == fife.Key.ESCAPE:
133 | self.quit = True
134 | evt.consume()
135 | elif keystr == 'p':
136 | self.engine.getRenderBackend().captureScreen('screenshot.png')
137 | evt.consume()
138 | elif keystr == 'x':
139 | if self.world.mainAgent.agent.getObject().getId() == 'girl':
140 | self.onGirlButtonPress()
141 | elif self.world.mainAgent.agent.getObject().getId() == 'boy':
142 | self.onBoyButtonPress()
143 | evt.consume()
144 |
145 | def onCommand(self, command):
146 | if command.getCommandType() == fife.CMD_QUIT_GAME:
147 | self.quit = True
148 | command.consume()
149 |
150 | def showItems(self, items):
151 | for n in items:
152 | self.itemsImages[n].show()
153 |
154 | def hideItems(self, items):
155 | for n in items:
156 | self.itemsImages[n].hide()
157 |
158 | def youLoose(self):
159 | if not self.youLooseWindow:
160 | self.youLooseWindow = pychan.loadXML('gui/xml/youLoose.xml')
161 | def restartWorld():
162 | self.world.restart()
163 | self.startTime = datetime.datetime.now()
164 | self.girlLifeUpdate(100)
165 | self.youLooseWindow.hide()
166 | self.youLooseWindow.mapEvents({ 'closeButton' : restartWorld })
167 | self.youLooseWindow.distributeData({ 'looseText' : "The girl got killed. You loose. Try again!" })
168 | self.youLooseWindow.show()
169 |
170 | def youWin(self):
171 | #music = self.world.soundmanager.createSoundEmitter('sounds/win.ogg')
172 | #music.play()
173 | self.youWinWindow = pychan.loadXML('gui/xml/youWin.xml')
174 | self.world.girl.dead = True # stop the game
175 | field = self.youWinWindow.getNamedChildren()['playerField'][0]
176 |
177 | def restartWorld(response):
178 | self.world.restart()
179 | self.girlLifeUpdate(100)
180 | self.youWinWindow.hide()
181 |
182 | def buttonPress():
183 | self.youWinWindow.distributeData({ 'winText' : "Storing data... please wait" })
184 | asyncSaveScore(restartWorld, {'name':field.getData(), 'time': str(end - self.startTime.replace(microsecond=0))})
185 |
186 | end = datetime.datetime.now().replace(microsecond=0)
187 | field.setData(getpass.getuser())
188 | self.youWinWindow.mapEvents({ 'closeButton' : buttonPress})
189 | self.youWinWindow.distributeData({ 'timeText' : "Elapsed time: " + str(end - self.startTime.replace(microsecond=0))})
190 | self.youWinWindow.show()
191 |
192 | def onQuitButtonPress(self):
193 | cmd = fife.Command()
194 | cmd.setSource(None)
195 | cmd.setCommandType(fife.CMD_QUIT_GAME)
196 | self.engine.getEventManager().dispatchCommand(cmd)
197 |
198 | def onAboutButtonPress(self):
199 | #self.youWin() # TODO FIXME XXX remove
200 | if not self.window:
201 | self.window = pychan.loadXML('gui/xml/help.xml')
202 | self.window.mapEvents({ 'closeButton' : self.window.hide })
203 | self.window.distributeData({ 'helpText' : open("misc/infotext.txt").read() })
204 | self.window.show()
205 |
206 | def onScoresButtonPress(self):
207 | if self.window:
208 | self.window.show()
209 | return
210 |
211 | def callback(response):
212 | out = "From http://fede-softdev.herokuapp.com/\n\n"
213 | for record in response:
214 | out += "%s won in %s in date %s\n"%(record['name'], record['time'][2:], record['date'])
215 | self.window.distributeData({ 'scoresText' : out })
216 | self.window.getNamedChildren()['scoresText'][0].adaptLayout()
217 |
218 | def refresh():
219 | self.window.distributeData({ 'scoresText' : "Loading..."})
220 | asyncDownloadScore(callback)
221 |
222 | self.window = pychan.loadXML('gui/xml/scores.xml')
223 | self.window.mapEvents({ 'refreshButton' : refresh})
224 | self.window.mapEvents({ 'closeButton' : self.window.hide })
225 | #self.window.distributeData({ 'helpText' : open("misc/infotext.txt").read() })
226 | self.window.distributeData({ 'scoresText' : "Loading..."})
227 | asyncDownloadScore(callback)
228 | self.window.show()
229 |
230 | def onSoundButtonPress(self):
231 | button = self.rootpanel.getNamedChildren()['soundButton'][0]
232 | if (self.world.soundActive == True):
233 | self.world.music.stop()
234 | self.world.soundActive = False
235 | button.text = unicode("Music: OFF", "utf-8")
236 | TDS.set("FIFE", "PlaySounds", False)
237 | TDS.saveSettings()
238 | else:
239 | self.world.music.play()
240 | self.world.soundActive = True
241 | button.text = unicode("Music: ON", "utf-8")
242 | TDS.set("FIFE", "PlaySounds", True)
243 | TDS.saveSettings()
244 |
245 | def onBoyButtonPress(self):
246 | self.girlButton.show()
247 | self.boyButton.hide()
248 | self.world.switchMainAgentTo('girl')
249 |
250 | def onGirlButtonPress(self):
251 | self.boyButton.show()
252 | self.girlButton.hide()
253 | self.world.switchMainAgentTo('boy')
254 |
255 |
256 |
257 | class IslandDemo(PychanApplicationBase):
258 | def __init__(self):
259 | super(IslandDemo,self).__init__(TDS)
260 | self.world = world.World(self.engine)
261 | self.listener = ApplicationListener(self.engine, self.world)
262 | self.world.load(str(TDS.get("rio", "MapFile"))) # Create world and agents
263 |
264 | def createListener(self):
265 | pass # already created in constructor
266 |
267 | def _pump(self):
268 | if self.listener.quit:
269 | self.breakRequested = True
270 |
271 | # get the correct directory to save the map file to
272 | mapSaveDir = getUserDataDirectory("fife", "rio_de_hola") + "/maps"
273 |
274 | # create the directory structure if it does not exist
275 | if not os.path.isdir(mapSaveDir):
276 | os.makedirs(mapSaveDir)
277 |
278 | # save map file to directory
279 | self.world.save(mapSaveDir + "/savefile.xml")
280 | else:
281 | self.world.pump()
282 |
283 | def asyncDownloadScore(callback):
284 | def downloadScore():
285 | url = 'http://fede-softdev.herokuapp.com'
286 | urlconn = urllib.urlopen(url)
287 | urlcontents = json.loads(urlconn.read())
288 | callback(urlcontents)
289 | thread = Thread(target = downloadScore, args = ())
290 | thread.start()
291 | #thread.join()
292 |
293 | def asyncSaveScore(callback, data):
294 | def saveScore():
295 | url = 'http://fede-softdev.herokuapp.com'
296 | #url = 'http://localhost:5000'
297 | req = urllib2.Request(url, json.dumps(data), {'Content-Type': 'application/json'})
298 | f = urllib2.urlopen(req)
299 | response = f.read()
300 | f.close()
301 | callback(response)
302 | thread = Thread(target = saveScore, args = ())
303 | thread.start()
304 | #thread.join()
305 |
306 | def main():
307 | app = IslandDemo()
308 | app.run()
309 |
310 | if __name__ == '__main__':
311 | main()
312 |
--------------------------------------------------------------------------------
/objects/nature.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
105 |
106 |
109 |
112 |
115 |
118 |
121 |
124 |
127 |
130 |
133 |
136 |
139 |
142 |
145 |
150 |
155 |
160 |
163 |
167 |
172 |
177 |
180 |
183 |
184 |
187 |
188 |
191 |
194 |
197 |
200 |
203 |
206 |
209 |
212 |
215 |
218 |
221 |
224 |
227 |
230 |
233 |
236 |
239 |
242 |
243 |
246 |
247 |
250 |
253 |
256 |
259 |
262 |
265 |
268 |
271 |
274 |
277 |
280 |
283 |
286 |
287 |
290 |
291 |
295 |
298 |
301 |
302 |
305 |
306 |
309 |
312 |
315 |
318 |
321 |
322 |
325 |
326 |
330 |
331 |
335 |
336 |
339 |
340 |
343 |
346 |
349 |
354 |
359 |
364 |
369 |
374 |
378 |
379 |
--------------------------------------------------------------------------------