From d9aabb8a42a2335b9faa9bfad2f5dc033e3f1323 Mon Sep 17 00:00:00 2001 From: alexandaday Date: Tue, 1 Sep 2015 15:29:47 +0000 Subject: [PATCH 1/3] Removed bag from start screen --- game/levels/start_screen/scripts/start.py | 1 + 1 file changed, 1 insertion(+) diff --git a/game/levels/start_screen/scripts/start.py b/game/levels/start_screen/scripts/start.py index 70f5d07de..bc7909de7 100644 --- a/game/levels/start_screen/scripts/start.py +++ b/game/levels/start_screen/scripts/start.py @@ -6,6 +6,7 @@ from script_state_container import ScriptStateContainer camera.focus() +engine.hide_bag() engine.clear_scripter() c1 = (210, 210, 210) c2 = (190, 190, 190) From 11b3a07b090fe1fdd78f2d168056aafb6b479ff5 Mon Sep 17 00:00:00 2001 From: alexandaday Date: Tue, 1 Sep 2015 16:52:12 +0000 Subject: [PATCH 2/3] Merging forks --- game/engine/engine.py | 20 ++ game/levels/world_1/intro/scripts/start.py | 4 +- .../level_1/player_house/scripts/start.py | 2 +- .../level_1/rossumberg/scripts/start.py | 290 +++++++++--------- game/objects/portal/portal.py | 4 +- src/python_embed/game_engine.cpp | 16 + src/python_embed/game_engine.hpp | 8 +- src/python_embed/wrapper_functions.cpp | 2 + 8 files changed, 195 insertions(+), 151 deletions(-) diff --git a/game/engine/engine.py b/game/engine/engine.py index 172f1f282..37ba9640f 100644 --- a/game/engine/engine.py +++ b/game/engine/engine.py @@ -483,6 +483,26 @@ def run_callback_list_sequence(self, callback_list_sequence, callback = lambda: return + def hide_bag(self, callback = lambda: None): + """ Hides the bag icon from the top right of the screen + + Parameters + ---------- + callback : func, optional + Places the callback onto the engine + """ + self.__cpp_engine.hide_bag(callback) + + def unhide_bag(self, callback = lambda: None): + """ Shows the bag icon from the top right of the screen + + Parameters + ---------- + callback : func, optional + Places the callback onto the engine + """ + self.__cpp_engine.unhide_bag(callback) + def disable_py_scripter(self, callback = lambda: None): """ Disables the PyScritpter diff --git a/game/levels/world_1/intro/scripts/start.py b/game/levels/world_1/intro/scripts/start.py index a35f6b7d6..185a385b6 100644 --- a/game/levels/world_1/intro/scripts/start.py +++ b/game/levels/world_1/intro/scripts/start.py @@ -1,11 +1,11 @@ -camera.focus() - import sys import json sys.path.insert(1, engine.get_config()['files']['script_running_location']) from script_state_container import ScriptStateContainer +camera.focus() +engine.hide_bag() config = engine.get_config() c1 = (210, 210, 210) diff --git a/game/levels/world_1/level_1/player_house/scripts/start.py b/game/levels/world_1/level_1/player_house/scripts/start.py index 26d4407d5..cc5448e40 100644 --- a/game/levels/world_1/level_1/player_house/scripts/start.py +++ b/game/levels/world_1/level_1/player_house/scripts/start.py @@ -27,4 +27,4 @@ def go_to_village(player_object): player_data.save_and_exit("/world_1/level_1/rossumberg") -exit_to_village.player_walked_on = go_to_village +exit_to_village.player_walked_on = lambda player_one: engine.change_map("world_1/level_1/rossumberg")#go_to_village diff --git a/game/levels/world_1/level_1/rossumberg/scripts/start.py b/game/levels/world_1/level_1/rossumberg/scripts/start.py index 3dcdc4b69..8ffd46100 100644 --- a/game/levels/world_1/level_1/rossumberg/scripts/start.py +++ b/game/levels/world_1/level_1/rossumberg/scripts/start.py @@ -1,145 +1,145 @@ -#commence save-data set-up -level_name = "level_1" -world_name = "world_1" -map_name = "rossumberg" - -engine.update_world_text("1") -engine.update_level_text("1") - -player_data.load(engine.get_player_name()) -player_data.set_map(world_name, level_name = level_name, map_name = map_name) #change the map and save that the map has changed -#end save-data set-up - -#defining the possible states of the level -heidi_state_speaking_about_prank = 0 -heidi_state_getting_prank_materials = 1 -heidi_state_got_prank_materials = 2 -#end state definitions - - -player_start_pos = (0, 0) -#setting the player's starting position -if player_data.get_previous_exit() == "/world_1/level_1/player_house": - player_start_pos = exit_to_house.get_position() - player_one.move_to(exit_to_house.get_position(), callback = player_one.move_south) -elif player_data.get_previous_exit() == "/world_1/level_1/road_one/top": - player_start_pos = exit_to_road_top.get_position() - player_one.move_to(exit_to_road_top.get_position(), callback = player_one.move_west) -elif player_data.get_previous_exit() == "/world_1/level_1/road_one/bottom": - player_start_pos = exit_to_road_bottom.get_position() - player_one.move_to(exit_to_road_bottom.get_position(), callback = player_one.move_west) -else: - player_one.move_to(exit_to_house.get_position(), callback = player_one.move_south) -# end settin the default starting position - -#setting up the level's exits -def go_to_house(player_object): - player_data.save_and_exit("/world_1/level_1/player_house") - -def go_to_road_top(player_object): - player_data.save_and_exit("/world_1/level_1/road_one", info = "top") - -def go_to_road_bottom(player_object): - player_data.save_and_exit("/world_1/level_1/road_one", info = "bottom") - -exit_to_house.player_walked_on = go_to_house -exit_to_road_top.player_walked_on = go_to_road_top -exit_to_road_bottom.player_walked_on = go_to_road_bottom - -# end setting up the level's exits - -def heidi_player_action(player_object): - player_one.set_busy(True) - engine.show_dialogue("Remember " + engine.get_player_name() + ", the merchant is East.", callback = lambda: player_one.set_busy(False)) - -heidi.player_action = heidi_player_action - -route_sign.set_message("Rossumberg, a peaceful town. \n(east) merchant (east) bog") - -""" LEVEL EVENTS """ - -""" Only have heidi speak to player about the prank if they haven't heard about it yet! """ -heidi_state = player_data.get_level_state("heidi_state") -if heidi_state == heidi_state_speaking_about_prank: - """ Heidi introducing herself and walking over to the player """ - heidi_introduction_sequence = [ - lambda callback: heidi.move_to(exit_to_road_top.get_position(), callback = callback), - lambda callback: player_one.set_busy(True, callback = callback), - lambda callback: player_one.face_south(callback = callback), - lambda callback: heidi.face_west(callback = callback), - lambda callback: engine.show_dialogue(engine.get_dialogue(player_data.get_full_map_name(), "heidi_shout_player_name", {"player_name": engine.get_player_name()}), callback = callback), - lambda callback: heidi.move_west(callback = callback), - lambda callback: heidi.move_west(callback = callback), - lambda callback: heidi.move_west(callback = callback), - lambda callback: heidi.move_west(callback = callback), - lambda callback: heidi.move_west(callback = callback), - lambda callback: heidi.move_north(callback = callback), - lambda callback: heidi.move_west(callback = callback), - lambda callback: player_one.face_east(callback = callback), - ] - - """ Run the introdoction dialogue, and end it with asking the player about wether they know about the "big day today", (the prank), and if they say yes, asking what they think it is.""" - engine.run_callback_list_sequence( - heidi_introduction_sequence, - lambda: engine.show_dialogue_with_options( - engine.get_dialogue(player_data.get_full_map_name(), "heidi_today_is_big_day"), - { - engine.get_dialogue("shared", "yes"): lambda: engine.show_dialogue_with_options( - engine.get_dialogue(player_data.get_full_map_name(), "heidi_question_player_about_day"), - { - "Ummmmm..." : lambda: engine.run_callback_list_sequence(heidi_explain_prank_sequence, callback = save_heidi_spoken_about_prank), - "Ahhhhhhh...": lambda: engine.run_callback_list_sequence(heidi_explain_prank_sequence, callback = save_heidi_spoken_about_prank) - } - ), - engine.get_dialogue("shared", "no") : lambda: engine.run_callback_list_sequence(heidi_explain_prank_sequence, callback = save_heidi_spoken_about_prank) - } - ) - ) - - def save_heidi_spoken_about_prank(): - player_data.set_level_state("heidi_state", heidi_state_getting_prank_materials) - player_data.save() - - """ Heidi explains to the player that today is the day of the big prank, and that they need to head to the merchant for materials """ - heidi_explain_prank_sequence = [ - lambda callback: engine.show_dialogue("You forgot you goon!", callback = callback), - lambda callback: engine.show_dialogue("Today's the day of our big prank, remember?", callback = callback), - lambda callback: engine.show_dialogue("Hehehehehehehehe...", callback = callback), - lambda callback: heidi.wait(0.5, callback = callback), - lambda callback: heidi.face_south(callback = callback), - lambda callback: heidi.wait(0.5, callback = callback), - lambda callback: engine.show_dialogue("Hahahahahahahahahahaha!", callback = callback), - lambda callback: heidi.start_animating(callback = callback), - lambda callback: engine.show_dialogue("MWAHAHAHAHAHAHAHAHAHAHAHAHA!!!", callback = callback), - lambda callback: heidi.wait(0.5, callback = callback), - lambda callback: heidi.stop_animating(callback = callback), - lambda callback: heidi.wait(0.5, callback = callback), - lambda callback: heidi.face_west(callback = callback), - lambda callback: heidi.wait(0.5, callback = callback), - lambda callback: engine.show_dialogue("Oops, sorry, got a bit carried away there. We need to go and collect the materials I ordered from the merchant east of here.", callback = callback), - lambda callback: engine.show_dialogue("Then finally, we need dirty water from the bog... hehehehehe...", callback = callback), - lambda callback: player_one.set_busy(False, callback = callback), - lambda callback: heidi.follow(player_one, callback = callback) - ] -elif heidi_state == heidi_state_getting_prank_materials: - heidi.set_solidity(False) - heidi.wait(0.3, callback = lambda: heidi.move_to(player_start_pos, callback = lambda: heidi.follow(player_one))) - -""" end of everything too with heidi asking about the prank """ - -player_one.focus() - -engine.play_music("calm") -engine.set_ui_colours((200,255,200),(215,255,215)) #TODO: save these colours in the config. - -villager1.set_dialogue_list(["Oh " + engine.get_player_name() + ", not up to mischief again are you?"]) -villager2.set_dialogue_list(["These PyRunners that they make nowadays are great.", "If only I could write my own scripts instead of just running the ones they give me..."]) -villager3.set_dialogue_list(["I like turtles."]) -villager4.set_dialogue_list(["Ok."]) - -villager1.rand_explore() -villager2.rand_explore() -villager3.rand_explore() -villager4.rand_explore() - -#engine.disable_py_scripter() +##commence save-data set-up +#level_name = "level_1" +#world_name = "world_1" +#map_name = "rossumberg" +# +#engine.update_world_text("1") +#engine.update_level_text("1") +# +#player_data.load(engine.get_player_name()) +#player_data.set_map(world_name, level_name = level_name, map_name = map_name) #change the map and save that the map has changed +##end save-data set-up +# +##defining the possible states of the level +#heidi_state_speaking_about_prank = 0 +#heidi_state_getting_prank_materials = 1 +#heidi_state_got_prank_materials = 2 +##end state definitions +# +# +#player_start_pos = (0, 0) +##setting the player's starting position +#if player_data.get_previous_exit() == "/world_1/level_1/player_house": +# player_start_pos = exit_to_house.get_position() +# player_one.move_to(exit_to_house.get_position(), callback = player_one.move_south) +#elif player_data.get_previous_exit() == "/world_1/level_1/road_one/top": +# player_start_pos = exit_to_road_top.get_position() +# player_one.move_to(exit_to_road_top.get_position(), callback = player_one.move_west) +#elif player_data.get_previous_exit() == "/world_1/level_1/road_one/bottom": +# player_start_pos = exit_to_road_bottom.get_position() +# player_one.move_to(exit_to_road_bottom.get_position(), callback = player_one.move_west) +#else: +# player_one.move_to(exit_to_house.get_position(), callback = player_one.move_south) +## end settin the default starting position +# +##setting up the level's exits +#def go_to_house(player_object): +# player_data.save_and_exit("/world_1/level_1/player_house") +# +#def go_to_road_top(player_object): +# player_data.save_and_exit("/world_1/level_1/road_one", info = "top") +# +#def go_to_road_bottom(player_object): +# player_data.save_and_exit("/world_1/level_1/road_one", info = "bottom") +# +#exit_to_house.player_walked_on = go_to_house +#exit_to_road_top.player_walked_on = go_to_road_top +#exit_to_road_bottom.player_walked_on = go_to_road_bottom +# +## end setting up the level's exits +# +#def heidi_player_action(player_object): +# player_one.set_busy(True) +# engine.show_dialogue("Remember " + engine.get_player_name() + ", the merchant is East.", callback = lambda: player_one.set_busy(False)) +# +#heidi.player_action = heidi_player_action +# +#route_sign.set_message("Rossumberg, a peaceful town. \n(east) merchant (east) bog") +# +#""" LEVEL EVENTS """ +# +#""" Only have heidi speak to player about the prank if they haven't heard about it yet! """ +#heidi_state = player_data.get_level_state("heidi_state") +#if heidi_state == heidi_state_speaking_about_prank: +# """ Heidi introducing herself and walking over to the player """ +# heidi_introduction_sequence = [ +# lambda callback: heidi.move_to(exit_to_road_top.get_position(), callback = callback), +# lambda callback: player_one.set_busy(True, callback = callback), +# lambda callback: player_one.face_south(callback = callback), +# lambda callback: heidi.face_west(callback = callback), +# lambda callback: engine.show_dialogue(engine.get_dialogue(player_data.get_full_map_name(), "heidi_shout_player_name", {"player_name": engine.get_player_name()}), callback = callback), +# lambda callback: heidi.move_west(callback = callback), +# lambda callback: heidi.move_west(callback = callback), +# lambda callback: heidi.move_west(callback = callback), +# lambda callback: heidi.move_west(callback = callback), +# lambda callback: heidi.move_west(callback = callback), +# lambda callback: heidi.move_north(callback = callback), +# lambda callback: heidi.move_west(callback = callback), +# lambda callback: player_one.face_east(callback = callback), +# ] +# +# """ Run the introdoction dialogue, and end it with asking the player about wether they know about the "big day today", (the prank), and if they say yes, asking what they think it is.""" +# engine.run_callback_list_sequence( +# heidi_introduction_sequence, +# lambda: engine.show_dialogue_with_options( +# engine.get_dialogue(player_data.get_full_map_name(), "heidi_today_is_big_day"), +# { +# engine.get_dialogue("shared", "yes"): lambda: engine.show_dialogue_with_options( +# engine.get_dialogue(player_data.get_full_map_name(), "heidi_question_player_about_day"), +# { +# "Ummmmm..." : lambda: engine.run_callback_list_sequence(heidi_explain_prank_sequence, callback = save_heidi_spoken_about_prank), +# "Ahhhhhhh...": lambda: engine.run_callback_list_sequence(heidi_explain_prank_sequence, callback = save_heidi_spoken_about_prank) +# } +# ), +# engine.get_dialogue("shared", "no") : lambda: engine.run_callback_list_sequence(heidi_explain_prank_sequence, callback = save_heidi_spoken_about_prank) +# } +# ) +# ) +# +# def save_heidi_spoken_about_prank(): +# player_data.set_level_state("heidi_state", heidi_state_getting_prank_materials) +# player_data.save() +# +# """ Heidi explains to the player that today is the day of the big prank, and that they need to head to the merchant for materials """ +# heidi_explain_prank_sequence = [ +# lambda callback: engine.show_dialogue("You forgot you goon!", callback = callback), +# lambda callback: engine.show_dialogue("Today's the day of our big prank, remember?", callback = callback), +# lambda callback: engine.show_dialogue("Hehehehehehehehe...", callback = callback), +# lambda callback: heidi.wait(0.5, callback = callback), +# lambda callback: heidi.face_south(callback = callback), +# lambda callback: heidi.wait(0.5, callback = callback), +# lambda callback: engine.show_dialogue("Hahahahahahahahahahaha!", callback = callback), +# lambda callback: heidi.start_animating(callback = callback), +# lambda callback: engine.show_dialogue("MWAHAHAHAHAHAHAHAHAHAHAHAHA!!!", callback = callback), +# lambda callback: heidi.wait(0.5, callback = callback), +# lambda callback: heidi.stop_animating(callback = callback), +# lambda callback: heidi.wait(0.5, callback = callback), +# lambda callback: heidi.face_west(callback = callback), +# lambda callback: heidi.wait(0.5, callback = callback), +# lambda callback: engine.show_dialogue("Oops, sorry, got a bit carried away there. We need to go and collect the materials I ordered from the merchant east of here.", callback = callback), +# lambda callback: engine.show_dialogue("Then finally, we need dirty water from the bog... hehehehehe...", callback = callback), +# lambda callback: player_one.set_busy(False, callback = callback), +# lambda callback: heidi.follow(player_one, callback = callback) +# ] +#elif heidi_state == heidi_state_getting_prank_materials: +# heidi.set_solidity(False) +# heidi.wait(0.3, callback = lambda: heidi.move_to(player_start_pos, callback = lambda: heidi.follow(player_one))) +# +#""" end of everything too with heidi asking about the prank """ +# +#player_one.focus() +# +#engine.play_music("calm") +#engine.set_ui_colours((200,255,200),(215,255,215)) #TODO: save these colours in the config. +# +#villager1.set_dialogue_list(["Oh " + engine.get_player_name() + ", not up to mischief again are you?"]) +#villager2.set_dialogue_list(["These PyRunners that they make nowadays are great.", "If only I could write my own scripts instead of just running the ones they give me..."]) +#villager3.set_dialogue_list(["I like turtles."]) +#villager4.set_dialogue_list(["Ok."]) +# +#villager1.rand_explore() +#villager2.rand_explore() +#villager3.rand_explore() +#villager4.rand_explore() +# +##engine.disable_py_scripter() diff --git a/game/objects/portal/portal.py b/game/objects/portal/portal.py index 08bdf23d9..e9ef6ccce 100644 --- a/game/objects/portal/portal.py +++ b/game/objects/portal/portal.py @@ -2,7 +2,7 @@ import os """ In Python comments, -could define some standard which the C++ code can use to determine things about it handles +could define some standard which the C++ code can use to determine things about it handles the python code """ @@ -39,6 +39,6 @@ def set_target(self, target): self.__target = target def player_walked_on(self, player_object): - self.get_engine().print_terminal("I've just been walked on by: " + player_object.get_character_name()) + #self.get_engine().print_terminal("Portal has just been walked on by: " + player_object.get_character_name()) position = self.__target player_object.move_to(position) diff --git a/src/python_embed/game_engine.cpp b/src/python_embed/game_engine.cpp index 74171a95a..c754d78dc 100644 --- a/src/python_embed/game_engine.cpp +++ b/src/python_embed/game_engine.cpp @@ -167,6 +167,22 @@ void GameEngine::play_music(std::string song_name, PyObject* callback) { }); } +void GameEngine::hide_bag(PyObject* callback) { + gui_main->hide_bag(); + boost::python::object boost_callback(boost::python::handle<>(boost::python::borrowed(callback))); + EventManager::get_instance()->add_event([boost_callback] { + boost_callback(); + }); +} + + +void GameEngine::unhide_bag(PyObject* callback) { + gui_main->hide_bag(); + boost::python::object boost_callback(boost::python::handle<>(boost::python::borrowed(callback))); + EventManager::get_instance()->add_event([boost_callback] { + boost_callback(); + }); +} void GameEngine::show_py_scripter(PyObject* callback){ boost::python::object boost_callback(boost::python::handle<>(boost::python::borrowed(callback))); diff --git a/src/python_embed/game_engine.hpp b/src/python_embed/game_engine.hpp index e86ed10d4..ae0c9b7d8 100644 --- a/src/python_embed/game_engine.hpp +++ b/src/python_embed/game_engine.hpp @@ -16,7 +16,7 @@ class GUIMain; class GameEngine { private: - GUIMain * gui_main; + GUIMain *gui_main; unsigned int button_id; Challenge *challenge; @@ -116,6 +116,12 @@ class GameEngine { /// std::string get_config(); + /// + /// Showing and hiding the bag icon + /// + void hide_bag(PyObject* callback); + void unhide_bag(PyObject* callback); + /// /// Change the settings of the PyScripter /// diff --git a/src/python_embed/wrapper_functions.cpp b/src/python_embed/wrapper_functions.cpp index 605332bc0..220475afe 100644 --- a/src/python_embed/wrapper_functions.cpp +++ b/src/python_embed/wrapper_functions.cpp @@ -64,6 +64,8 @@ BOOST_PYTHON_MODULE(wrapper_functions) { .def("play_music", &GameEngine::play_music) .def("register_input_callback", &GameEngine::register_input_callback) .def("flush_input_callback_list", &GameEngine::flush_input_callback_list) + .def("hide_bag", &GameEngine::hide_bag) + .def("unhide_bag", &GameEngine::unhide_bag) .def("show_py_scripter", &GameEngine::show_py_scripter) .def("hide_py_scripter", &GameEngine::hide_py_scripter) .def("enable_py_scripter",&GameEngine::enable_py_scripter) From 34ea9e982ef85a4448a05bb8c2c5ff492c1e1045 Mon Sep 17 00:00:00 2001 From: alexandaday Date: Wed, 2 Sep 2015 08:46:16 +0000 Subject: [PATCH 3/3] Level plan --- docs/design/Demo plan.txt | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 docs/design/Demo plan.txt diff --git a/docs/design/Demo plan.txt b/docs/design/Demo plan.txt new file mode 100644 index 000000000..8f7142bb1 --- /dev/null +++ b/docs/design/Demo plan.txt @@ -0,0 +1,56 @@ +Demo Plan + +Game Quest Goal: + Work with Myla to save people with scripts + Crocodiles have been reaking havoc in player's village, bring peace + (Myla on a quest to find snake in the jungle) + +Introduce programming concepts gradually in the level, and reinforce them + +Level 1 (Movement with arrow keys and talking to things) + -Pick up PyScripter + +Level 2 (Running scripts) + - Solving puzzles with crododiles by yelling + - Similar to current Level 4 + +Level 3 (Movement scripts) + - Learn how to move with the scripter + - Script NPCs to move to stop blocking the path by fixing their scripts + +Level 4 (Movement and yell scripts) + - Write simple movement and yell scripts for the NPCs + - Similar puzzle to previous level + +Level 5 (Printing) + - Simple dungdeon/jungle with multiple paths + - Can read message from sign with PyScripter and print to terminal + - (or can read with enter, but need to use decipher function) + +Level 6 (Vines) + - Cutting down vines + - Using print to display how cuts your knife has left + +Level 7 + - NPC puzzle with movement/crocodiles/vines + +Level 8 (Loops) + - Simple introduction to loops (given to you) + - ie moving long distances + +Level 9 (Fixing loops) + - Fix NPC loop scripts to solve puzzle + +World 2 + +Level 1 + - NPC puzzle invovling writing your own scripts + +Level 2 + - Introduce conditionals + +Demo later level + +Maze level + +